Multi Contract Calls

Icon Link多个合约调用

您可以在单个交易中执行多个合约调用,无论是对同一合约还是对不同合约。这可以提高效率并降低总体交易成本。

Icon Link同一合约多个调用

使用 multiCall 方法在单个交易中对同一合约调用多个函数:

 
const { value: results } = await counterContract
  .multiCall([
    counterContract.functions.get_count(),
    counterContract.functions.increment_count(2),
    counterContract.functions.increment_count(4),
  ])
  .call();
 
const initialValue = new BN(results[0]).toNumber();
const incrementedValue1 = new BN(results[1]).toNumber();
const incrementedValue2 = new BN(results[2]).toNumber();
 
expect(incrementedValue1).toEqual(initialValue + 2);
expect(incrementedValue2).toEqual(incrementedValue1 + 4);

Icon Link不同合约多个调用

multiCall 方法还允许您在单个交易中对不同的合约执行多个合约调用:

 
const chain = echoContract.multiCall([
  echoContract.functions.echo_u8(17),
  counterContract.functions.get_count(),
  counterContract.functions.increment_count(5),
]);
 
const { value: results } = await chain.call();
 
const echoedValue = results[0];
const initialCounterValue = new BN(results[1]).toNumber();
const counterIncrementedValue = new BN(results[2]).toNumber();
 
expect(echoedValue).toEqual(17);
expect(counterIncrementedValue).toEqual(initialCounterValue + 5);

您还可以为每个合约调用链接支持的合约调用方法,如 callParams

 
const { value: results } = await contextContract
  .multiCall([
    echoContract.functions.echo_u8(10),
    contextContract.functions.return_context_amount().callParams({
      forward: [100, baseAssetId],
    }),
  ])
  .call();
 
const echoedValue = results[0];
const fowardedValue = new BN(results[1]).toNumber();
 
expect(echoedValue).toEqual(10);
expect(fowardedValue).toEqual(100);

multiCall 中链接合约调用方法时,避免执行合约函数本身,例如 .call.get.simulate

multiCall 方法为所有合约调用创建一个范围,只有在调用 .call 方法后才会执行。