使用 Web3.js 获取从特定地址收到的代币总量
Get total amount of tokens received from a specific address using Web3.js
在一个场景中,WalletA 定期从 AddressC 接收 TokenB。
AddressC 只发送 TokenB,没有别的。
在 etherscan 或 bscscan 中,很容易看到 WalletA 中收到了多少 TokenB,并且那里有“from”字段,因此您可以做一些数学运算以获得总数。
如何使用 web3 完成此操作?我在 web3 文档中找不到任何相关的 api 调用。
我可以通过 web3.js 获得 WalletA 中 TokenB 的总余额,但我需要 only 从 AddressC.
发送的代币数量
谢谢。
根据 ERC-20 标准,每次令牌传输都会发出一个 Transfer()
事件日志,其中包含发送方地址、接收方地址和令牌数量。
您可以使用web3js
通用方法web3.eth.getPastLogs()获取过去的事件日志,对输入进行编码,对输出进行解码。
或者您可以提供合约的 ABI JSON(在这种情况下仅使用 Transfer()
事件定义就足够了)并使用 web3js
方法 web3.eth.Contract.getPastEvents() ,它根据提供的 ABI JSON.
为您编码输入和解码输出
const Web3 = require('web3');
const web3 = new Web3('<provider_url>');
const walletA = '0x3cd751e6b0078be393132286c442345e5dc49699'; // sender
const tokenB = '0xdAC17F958D2ee523a2206206994597C13D831ec7'; // token contract address
const addressC = '0xd5895011F887A842289E47F3b5491954aC7ce0DF'; // receiver
// just the Transfer() event definition is sufficient in this case
const abiJson = [{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"}];
const contract = new web3.eth.Contract(abiJson, tokenB);
const fromBlock = 10000000;
const toBlock = 13453500;
const blockCountIteration = 5000;
const run = async () => {
let totalTokensTranferred = 0;
for (let i = fromBlock; i <= (toBlock - blockCountIteration); i += blockCountIteration) {
//console.log("Requesting from block", i, "to block ", i + blockCountIteration - 1);
const pastEvents = await contract.getPastEvents('Transfer', {
'filter': {
'from': walletA,
'to': addressC,
},
'fromBlock': i,
'toBlock': i + blockCountIteration - 1,
});
}
for (let pastEvent of pastEvents) {
totalTokensTranferred += parseInt(pastEvent.returnValues.value);
}
console.log(totalTokensTranferred);
}
run();
在一个场景中,WalletA 定期从 AddressC 接收 TokenB。 AddressC 只发送 TokenB,没有别的。
在 etherscan 或 bscscan 中,很容易看到 WalletA 中收到了多少 TokenB,并且那里有“from”字段,因此您可以做一些数学运算以获得总数。
如何使用 web3 完成此操作?我在 web3 文档中找不到任何相关的 api 调用。 我可以通过 web3.js 获得 WalletA 中 TokenB 的总余额,但我需要 only 从 AddressC.
发送的代币数量谢谢。
根据 ERC-20 标准,每次令牌传输都会发出一个 Transfer()
事件日志,其中包含发送方地址、接收方地址和令牌数量。
您可以使用web3js
通用方法web3.eth.getPastLogs()获取过去的事件日志,对输入进行编码,对输出进行解码。
或者您可以提供合约的 ABI JSON(在这种情况下仅使用 Transfer()
事件定义就足够了)并使用 web3js
方法 web3.eth.Contract.getPastEvents() ,它根据提供的 ABI JSON.
const Web3 = require('web3');
const web3 = new Web3('<provider_url>');
const walletA = '0x3cd751e6b0078be393132286c442345e5dc49699'; // sender
const tokenB = '0xdAC17F958D2ee523a2206206994597C13D831ec7'; // token contract address
const addressC = '0xd5895011F887A842289E47F3b5491954aC7ce0DF'; // receiver
// just the Transfer() event definition is sufficient in this case
const abiJson = [{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"}];
const contract = new web3.eth.Contract(abiJson, tokenB);
const fromBlock = 10000000;
const toBlock = 13453500;
const blockCountIteration = 5000;
const run = async () => {
let totalTokensTranferred = 0;
for (let i = fromBlock; i <= (toBlock - blockCountIteration); i += blockCountIteration) {
//console.log("Requesting from block", i, "to block ", i + blockCountIteration - 1);
const pastEvents = await contract.getPastEvents('Transfer', {
'filter': {
'from': walletA,
'to': addressC,
},
'fromBlock': i,
'toBlock': i + blockCountIteration - 1,
});
}
for (let pastEvent of pastEvents) {
totalTokensTranferred += parseInt(pastEvent.returnValues.value);
}
console.log(totalTokensTranferred);
}
run();