使用 MultiContractCallHandler
,您可以在单个事务中执行多个合约调用。为此,首先准备您要捆绑的所有合约调用:
let contract_methods = MyContract::new(contract_id, wallet.clone()).methods();
let call_handler_1 = contract_methods.initialize_counter(42);
let call_handler_2 = contract_methods.get_array([42; 2]);
您还可以为每个合约调用设置调用参数、变量输出或外部合约,只要您不使用 call()
或 simulate()
执行它。
接下来,将准备好的调用提供给您的 MultiContractCallHandler
,并可选择配置事务策略:
let mut multi_call_handler = MultiContractCallHandler::new(wallet.clone());
multi_call_handler
.add_call(call_handler_1)
.add_call(call_handler_2);
注意: 在单独的合约调用上配置的任何事务策略都会被忽略,而是使用提供给
MultiContractCallHandler
的参数。
此外,如果由于任何原因需要将提交与值检索分开,可以按如下方式执行:
let submitted_tx = multi_call_handler.submit().await?;
let (counter, array): (u64, [u64; 2]) = submitted_tx.response().await?.value;
要获取捆绑调用的输出值,您需要在将 call()
或 simulate()
的结果保存到变量时提供显式类型注释:
let (counter, array): (u64, [u64; 2]) = multi_call_handler.call().await?.value;
您还可以通过将类型注释移到调用的方法上与 FuelCallResponse
进行交互:
let response = multi_call_handler.call::<(u64, [u64; 2])>().await?;
注意:
MultiContractCallHandler
仅支持返回堆类型的一个合约调用。由于堆类型的处理方式,此合约调用需要位于最后位置,即最后使用add_call
添加。这是一个暂时的限制,我们希望尽快解除。与此同时,如果有多个处理堆类型的调用,请将它们拆分成多个常规单个调用。