diff --git a/src/index.ts b/src/index.ts index 5a99654..f4c5cad 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,35 +1,50 @@ -import {Connection, PublicKey} from "@solana/web3.js"; +import {ConfirmedSignatureInfo, Connection, PublicKey} from "@solana/web3.js"; const connection = new Connection(process.env.RPC!); //note: only supports last 1000 txns async function calculatePumpFunProfit(walletAddress: PublicKey, myToken: PublicKey) { let solNetProfit = 0; - const sigs = await connection.getSignaturesForAddress(myToken, {limit: 1000}); + const sigs: ConfirmedSignatureInfo[] = []; + let lastTxn: string | undefined = undefined; + do { + const newSigs = await connection.getSignaturesForAddress(myToken, {limit: 1000, before: lastTxn}); + if(!newSigs.length) break; + sigs.push( + ...newSigs + ); + lastTxn = newSigs[newSigs.length - 1]?.signature; + } while(true); + + const parseTasks: Promise[] = []; for(const sig of sigs) { if(sig.err) continue; - const txn = await connection.getParsedTransaction(sig.signature, {maxSupportedTransactionVersion: 0}); - if(!txn || !txn.meta) continue; + parseTasks.push(connection.getParsedTransaction(sig.signature, {maxSupportedTransactionVersion: 0}) + .then(txn => { + if(!txn || !txn.meta) return; - //check if there was a change in myToken - const postTokenBalances = txn.meta.postTokenBalances; - const preTokenBalances = txn.meta.preTokenBalances; - if(!postTokenBalances?.length && !preTokenBalances?.length) continue; - const postMyToken = postTokenBalances?.find(tb => tb.mint == myToken.toString() && - tb.owner == walletAddress.toString()); - const preMyToken = preTokenBalances?.find(tb => tb.mint == myToken.toString() && - tb.owner == walletAddress.toString()); - if(!postMyToken && !preMyToken) continue; + //check if there was a change in myToken + const postTokenBalances = txn.meta.postTokenBalances; + const preTokenBalances = txn.meta.preTokenBalances; + if(!postTokenBalances?.length && !preTokenBalances?.length) return; + const postMyToken = postTokenBalances?.find(tb => tb.mint == myToken.toString() && + tb.owner == walletAddress.toString()); + const preMyToken = preTokenBalances?.find(tb => tb.mint == myToken.toString() && + tb.owner == walletAddress.toString()); + if(!postMyToken && !preMyToken) return; - //calculate sol change - if(!txn.meta.preBalances.length || !txn.meta.postBalances.length) continue; - let solChange = txn.meta.postBalances[0] - txn.meta.preBalances[0]; //in lamports - console.log("new transaction with sol change:", solChange); - solNetProfit += solChange; + //calculate sol change + if(!txn.meta.preBalances.length || !txn.meta.postBalances.length) return; + let solChange = txn.meta.postBalances[0] - txn.meta.preBalances[0]; //in lamports + console.log("new transaction with sol change:", solChange); + solNetProfit += solChange; + })); } + await Promise.all(parseTasks); + console.log(solNetProfit); } -calculatePumpFunProfit(new PublicKey("BUmWvaEF46YHAGmn3ePQLPEvt19sm6k6JRnKHHTiE4Ag"), new PublicKey("3sSrCimwDE246Lb2HXoogLmAd9jPx6K2ArA4joQZgFL1")); \ No newline at end of file +calculatePumpFunProfit(new PublicKey("8NqLtG4BnGyQJrfu91bWK215SJ1qadfhSdygeyX6VjsM"), new PublicKey("BXAtPnRuZjPKe9Gsv9Wsgh54yqWTVT6gR7w7tSYYThnW")); \ No newline at end of file