我正在开发一个项目,需要查找关联帐户 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 网络时,我遇到同样的错误。
获取特定区块的代币余额所需的历史状态仅在存档节点可用。