如何在Rootstock上聚合多个智能合约函数调用?



我有多个ERC20令牌,部署在Rootstock上,我想通过我的DApp实时跟踪他们的余额和零花钱。在ethers.js,I可以通过交替调用函数来跟踪它们的余额balanceOf(address)allowance(owner, spender)。然而,在两个令牌之间,这相当于大约4个JSON-RPC请求每~30秒。

我更愿意减少我的应用程序发出的JSON-RPC请求的频率,通过聚合这些特定的请求

是否可以将组合多个智能合约数据查询变成一个单一的JSON-RPC请求通过ethers.js或任何其他库?

您可以看看@0xsequence/multicall。它包括:

  • 具有multiCall()功能的MultiCallUtils智能合约,用于进行聚合调用
  • JS前端库,包含一个围绕ethers.js提供程序的Multicall包装器。

智能合约部署:

  • MultiCallUtils部署在Rootstock测试网上:0xb39d1Dea1bF91Aef02484F677925904b9d6936B4
  • 我不确定它是否部署在Rootstock主网上,无论如何,你可以自己部署它。

聚合智能合约调用:

  1. 安装npm包:
npm i @0xsequence/multicall
  1. 导入库到您的项目:
const { providers } = require('@0xsequence/multicall');
  1. 创建Rootstock测试网配置:
const multicallConfig = {
// RSK Testnet
31: {
// maximum number of calls to batch into a single JSON-RPC call
batchSize: 50,
// defines the time each call is held on buffer waiting for subsequent calls before aggregation, ms
timeWindow: 50,
// MultiCallUtils smart contract
contract: '0xb39d1Dea1bF91Aef02484F677925904b9d6936B4',
},
};
  1. 用Multicall提供程序包装你的ethers.js当前提供程序:
const multicallProvider = new providers.MulticallProvider(ethersProvider, multicallConfig[31]);
  1. 将您的令牌智能合约连接到Multicall提供商,而不是以太坊.js提供商,以便能够进行聚合调用:
const token1 = new ethers.Contract(
token1Address,
token1ABI,
multicallProvider,
);
const token2 = ...
  1. 现在您已经准备好创建一个聚合调用:
function makeAggregatedCall() {
const aggregatedCall = [
multicallProvider.getBalance(address),
token1.balanceOf(address),
token1.allowance(owner, spender),
token2.balanceOf(address),
token2.allowance(owner, spender),
];
[
rbtcBalance,
balance1,
allowance1,
balance2,
allowance2,
] = await Promise.all(aggregatedCall);
}

库将尝试在一次对MultiCallUtils智能合约multiCall()函数的调用中发送所有这些函数调用。但是,如果聚合呼叫失败,作为退路,它的组成函数调用将通过ethers.js提供程序单独调用。

  1. 为了订阅每个新生成的区块,将makeAggregatedCall函数附加到以太提供程序block事件侦听器:
ethersProvider.on('block', makeAggregatedCall);

您可以使用ethereum-multicall项目,其中包括:

  • 连接到
  • 的前端库
  • Multicall3智能合约

智能合约部署:

这个项目的优点是Rootstock主网和Rootstock测试网都有Multicall3部署:

  • 主网0xcA11bde05977b3631167028862bE2a173976CA11
  • 测试网0xcA11bde05977b3631167028862bE2a173976CA11

…和0xca11...ca11虚荣地址的额外积分;)

聚合智能合约调用:

  1. 安装npm包:
npm i ethereum-multicall
  1. 导入库到您的项目:
const { Multicall } = require('ethereum-multicall');
  1. 创建multiall实例并连接到ethers.js提供商
const multicall = new Multicall({
ethersProvider: ethersProvider,
tryAggregate: true,
});
  1. 创建聚合呼叫:
const aggregatedCall = [
{
reference: 'token1',
contractAddress: token1Address,
abi: token1ABI,
calls: [
{
methodName: 'balanceOf',
methodParameters: [walletAddress],
},
{
methodName: 'allowance',
methodParameters: [ownerAddress, spenderAddress],
},
],
},
{
reference: 'token2',
contractAddress: token2Address,
abi: token2ABI,
calls: [
{
methodName: 'balanceOf',
methodParameters: [walletAddress],
},
{
methodName: 'allowance',
methodParameters: [ownerAddress, spenderAddress],
},
],
},
];
const { results } = await multicall.call(aggregatedCall);
  1. results对象中提取所需数据

相关内容

  • 没有找到相关文章

最新更新