您可以在单个交易中执行多个合约调用,无论是对同一合约还是对不同合约。这可以提高效率并降低总体交易成本。
使用 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);
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
方法后才会执行。