Skip to content

Instantly share code, notes, and snippets.

@Hero-Development
Last active February 2, 2023 19:54
Show Gist options
  • Save Hero-Development/e97c3074504d42959065cdf3597a8946 to your computer and use it in GitHub Desktop.
Save Hero-Development/e97c3074504d42959065cdf3597a8946 to your computer and use it in GitHub Desktop.
FindTokens.sol
"use strict";
const Web3 = require("web3");
(async () => {
const web3 = new Web3("https://mainnet.infura.io/v3/e7b52fa01b064e1eb3b6aa231e9ca335");
const contractAddress = "0x8661cD0C4A3fD3Dc6B31cD24B20368851749Df00";
const OwnershipTransferred = "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0";
const Transfer = "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef";
let subArgs = {
address: contractAddress,
fromBlock: 0,
toBlock: 'latest',
topics: [
OwnershipTransferred
]
};
const otLogs = await web3.eth.getPastLogs( subArgs );
const firstBlock = otLogs[0].blockNumber;
const lastBlock = await web3.eth.getBlockNumber();
subArgs = {
fromBlock: firstBlock,
toBlock: lastBlock,
// the collection
address: contractAddress,
topics: [
// Transfer
"0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef",
]
};
const allLogs = [];
let step = 10000;
subArgs.toBlock = Math.min(subArgs.fromBlock + step - 1, lastBlock);
while( subArgs.fromBlock <= subArgs.toBlock ){
while( true ){
try{
console.log( `Checking blocks: ${subArgs.fromBlock} - ${subArgs.toBlock}` );
const logs = await web3.eth.getPastLogs(subArgs);
console.info( `...success: ${logs.length} logs` );
step *= 2;
subArgs.fromBlock = Number(subArgs.toBlock) + 1;
subArgs.toBlock = Math.min(subArgs.fromBlock + step - 1, lastBlock);
if(logs.length){
console.info( `...first log: ${logs[0].blockNumber}, last log: ${logs[logs.length-1].blockNumber}` );
allLogs.push(...logs);
}
break;
}
catch( err ){
if( String(err).includes("query returned more than 10000 results") ){
step = Math.round( step / 2 );
subArgs.fromBlock = Number(subArgs.fromBlock);
subArgs.toBlock = Math.min(subArgs.fromBlock + step - 1, lastBlock);
console.warn( `...reduce query to ${step}` );
}
else{
console.log(err);
console.log(String(err));
console.log(Object.keys(err));
process.exit(0);
return;
}
}
}
}
console.log(`done... ${allLogs.length} total logs`);
allLogs.sort((left, right) => {
/*
if(left.blockNumber !== right.blockNumber)
return left.blockNumber - right.blockNumber;
if(left.transactionIndex !== right.transactionIndex)
return left.transactionIndex - right.transactionIndex;
if(left.logIndex !== right.logIndex)
return left.logIndex - right.logIndex;
*/
return left.blockNumber - right.blockNumber
|| left.transactionIndex - right.transactionIndex
|| left.logIndex - right.logIndex;
});
const walletTokens = new Map();
for(let log of allLogs){
let [ , from, to, tokenId ] = log.topics;
from = '0x'+ from.substring(26).toLowerCase();
to = '0x'+ to.substring(26).toLowerCase();
tokenId = Number(BigInt(tokenId).toString());
//if(to.includes('9e9d63ce4d956674b78b7324a60741a28939d029')){
// console.log(log);
//}
const fromSet = walletTokens.get(from);
if(fromSet){
if(fromSet.size === 1)
walletTokens.delete(from);
else
fromSet.delete(tokenId);
}
const toSet = walletTokens.get(to);
if(toSet)
toSet.add(tokenId);
else
walletTokens.set(to, new Set([tokenId]));
}
console.table(walletTokens);
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment