使用MetaMask和Rabby钱包检索以太坊(或Arbitrum)中24小时历史代币余额

问题描述 投票:0回答:1

我正在开发一个项目,需要查找关联帐户 24 小时前特定代币(不一定是 ETH)的余额。我有 24 小时前来自 BE 的区块号码。这是我正在使用的代码片段:

export const getTokenBalanceByBlock = async (
  account: string,
  blockNumber: number,
  contractAddress: string,
  tokenPriceInETH: number,
): Promise<number> => {
  const tokenAbi: AbiItem[] = [
    {
      constant: true,
      inputs: [{ name: '_owner', type: 'address' }],
      name: 'balanceOf',
      outputs: [{ name: 'balance', type: 'uint256' }],
      type: 'function',
    },
  ]

  try {
    const web3 = new Web3(_window.ethereum)
    if (contractAddress) {
      const tokenContract = new web3.eth.Contract(tokenAbi, contractAddress)
      const tokenBalanceWei = await tokenContract.methods.balanceOf(account).call({}, blockNumber)
      console.log({ tokenBalanceWei })
      const tokenBalance = divideOnWei(tokenBalanceWei)
      return tokenPriceInETH ? tokenBalance * tokenPriceInETH : tokenBalance
    } else {
      const ethBalanceWei = await web3.eth.getBalance(account, blockNumber)
      const ethBalance = divideOnWei(ethBalanceWei)
      return ethBalance
    }
  } catch (error) {
    console.log(error)   
  }
}

当用户通过 MetaMask 连接时,此方法效果很好。但是,我在使用 Rabby 钱包以及用户切换到 Arbitrum 网络时遇到了问题。使用 Raby 钱包: { “代码”:-32000, “message”:“缺少 trie 节点 907b6....fd2(路径)状态 0x907...8fd2 不可用,未找到” } 或者当切换到 Arbitrum 网络时,我遇到同样的错误。

  1. 是否有更高效或更可靠的方法来检索特定账户的24小时历史代币余额?
  2. 如何解决使用 Rabby 钱包以及切换到 Arbitrum 网络时遇到的错误?
ethereum blockchain web3js metamask
1个回答
0
投票

获取特定区块的代币余额所需的历史状态仅在存档节点可用。

  • 从软件即服务提供商处获取存档节点或自行运行(需要 10TB 以上磁盘)
  • 在此节点上为您的应用程序创建一个 JSON-RPC 端点
  • 使用自己的节点查询历史余额
© www.soinside.com 2019 - 2024. All rights reserved.