144 lines
7.6 KiB
TypeScript
144 lines
7.6 KiB
TypeScript
import { Pool } from 'pg';
|
|
import { parseTransactions } from '../parseTransactions';
|
|
import { getTransactions } from '../getTransactions'
|
|
import { Connection, PublicKey, ConfirmedSignatureInfo} from '@solana/web3.js';
|
|
|
|
const mangoProgramId =
|
|
process.env.MANGO_PROGRAM_ID || 'mv3ekLzLbnVPNxjSKvqBpU3ZeZXPQdEC3bp5MDEBG68';
|
|
|
|
async function processMangoTransactions(clusterConnection: Connection, requestWaitTime) {
|
|
|
|
// Below are examples of different types of transactions
|
|
let signatures = [
|
|
// '4cYaxHEMAycyjRBfD2Va1cnaNcKSCxsLaYF47EnpUH4aqCEsZR9c9BJMeMr9NiPR7grN6puBYqWL6FdeX3ZgHrjj', // Deposit
|
|
// '49ajp59Gtpr5Q4kD4y2rMZrQSgkFNrferoC5nUq6mAZsveFf3e12DXtCR1GMFSyhR6Aypd6tJG7SKveNwGHGBDYQ', // Withdraw
|
|
|
|
// '5E9Jqz3nPtTx5rHTHmWyvw5RGTodPp4jRBx158dpe24b4QtpyAEVcEPuwvL6cwQ5MAcKHDiukU45L5xJ8fLR9Y1J', // CachePrices and CacheRootBanks
|
|
// '2o3hH59r6Pggg8oTTEjtXyJ9xHmx2z1pPXG4SWoPeogW95sjQoxps5fu4LbaTWfTyMvK1epsvz1nLiZ9CTPAgyD1', // LiquidateTokenAndToken
|
|
// '1F47ZsgeLNpDsHCqnNRbG8hi6C2rEeyT8YME61g84HSTRHrheXX69Zya2Dz3fW14SC1y84cAbLVg7jDae38Vp3a', // LiquidateTokenAndPerp
|
|
// '4RBxzncCHW8XSHR1mFJrxtUMitYyYiSc9jvHQ4CPA8mqCukgw3dQNoYpgm5GRozyxMJP1j4ew9gNPkzCnrnkmaud', // LiquidatePerpMarket
|
|
|
|
// '56y2iUGUyQ8BcqLpL5N1QwR3QQF37NtaWRnd5XjQ25BNWKfNxvpnhwwqtD7B88dAvJEykTHNCLvUKdxY4jhQ2uhQ', //LiquidateTokenAndPerp example 2
|
|
// '4ErqDTV11imwDnoA6AAj3VMZC9FQvyq2GA4emfpiSxVBifAQE9EDwPnHxoTMxULHfyyCf8GBBzoczGSqYJMFEV5D', //LiquidateTokenAndPerp example 3
|
|
// '59DFSbsN1DbnqUiMsStS2xQn4tBncG8w3gg8aikBvQZKnWhf1yRt87EU4WMvXtnnVe18zWaRDFVfnVYp3ASgF7tV', // ResolveTokenBankruptcy
|
|
// '4Xx7gVesMQQZqprJYLu5gNEYRLA5GTXKURrkc8jG3CLKynRwhEM93MownyAMhxpdFTvfXQ9kkxkRcemZ8Fn5WHyk', // ResolvePerpBankruptcy
|
|
// '3bzj3KkA3FSZHJuCmRgHhSgqeaEzD32sCHkYdRLcZm1vcuB4ra5NbU5EZqBhW6QjeKRV9QRWC4SHxK2hS54s79Zx', // settle_pnl
|
|
// '5TmhvKQJmjUD9dZgCszBF8gNKUohpxwjrYu1RngZVh1hEToGMtjPtXJF89QLHXzANMWWQRfMomsgCg8353CpYgBb', // settle_fees
|
|
// 'mxK5eEiEUeCcQtHwmUKziyYUZJ3NXdjmZigAR6npWgcpQoJtqvikt5A7osD4y6oiLZJhzYFvqAqDznFjHm77K8V', // settle_fees called but nothing settled
|
|
// // '4qV6PTD1nGj5qq89FQK8QKwN231pGgtayD7uX4B6y83b19gcVXB5ByLCvApSJjCRrboiCg7RVT2p2e1CtP3zuXDb', // force_settle_quote_positions
|
|
// '5qDPBrFjCcaZthjRCqisHRw1mFEkHFHRFWi5jbKCmpAgpAXNdEkSv8L472D12VB5AukYaGsWhAy5bcvvUGJ1Sgtv', // FillEvent
|
|
// '3YXaEG95w5eG7jBBjz8hW9auXVAv9z2MH8yw51tL8nqSqmKgXtrD1hgE7LCqK2hpFwcrpjeWtBeVqGsbCHLh3kSe', // redeem mango
|
|
// '2HNnZmThkFUsG1pw9bNaJoeeGUZJun3hkcpwBJt3ZU9FKe3CY17wrJgk1BZ8txm13RJ512ThbZVZxaqsxNFn4xVs', // checked_add_net details
|
|
// '4ebib6h5kQHpcpK4A4UpH7ThJVEtui2X7vVvTfCW8iuJgjHMocH7nymN3zVrrbwZL9HQYJY1tHdnGjo7ZSgrL7M6', // error example
|
|
// '59DFSbsN1DbnqUiMsStS2xQn4tBncG8w3gg8aikBvQZKnWhf1yRt87EU4WMvXtnnVe18zWaRDFVfnVYp3ASgF7tV', //token socialized loss
|
|
// '4RCvRY8BWPB6FixyfufYKojUdnE91DiqmFE2b8e4FCyuWCdT1ipSzPBaWUgaajKucFr1jsveiMvTft5iiWbctCFk', // settle_pnl_multiple
|
|
// 'KDv62AKFqyrvULdUUeShdYK9zCeUDX8yb6kuUadoa6dJKrqjDvKU3JQj9t8e4H1FTEaEMsyLnYAT4HbTr8ikSGq', // multiple update funding
|
|
|
|
// // 3.1 transactions:
|
|
// "2nyoFpqeopBuFgjSXntSUbJUYtxxFXTEWrf2t1715Bm4jTrYKNDwBkZKBuDN6mWt1vDcCuyPq56RGKv9SxuLJWwe", // UpdateRootBank
|
|
// "3CPWZM49NXPmpB5GKkrJHLknfSN595Gkd3MxK3AdFvFJTFHsA9ShjAqyWjfSkxYpBAc3ju19maaECzb18ey3qwK4", // CachePrices and CacheRootBanks
|
|
// "bf5kGknwbfzoMyz8cFHQAoK6ajwfqeNdFeWgaSGcy19poQPBbxpeW5BiLQFLK4DUswEwUvg2TZEusyqazT4WS4Y", // UpdateFunding
|
|
// "4JuHNZy2GcFJYFCYoTrekyCa2eBSq8cECVUvQp32LbFshAVFaVrvypwoKNjpfZ2rK9N7AG5PHsqqhHSWuGU3rAFk", // MngoAccrualLog
|
|
// "5MuJyoTsTzMGhGKDvN21BaZrfjaw1SeRgfTxz67U7zm7aVokrMqqvMhHvRCANGbjhvAeNFT1Zmk7vZoGp32b4H7t", // OpenOrdersBalanceLog, TokenBalanceLog
|
|
// "Ztxy2398k8zDPh1VFiErvAQAnQdMuUok7Z772yCST9oZpagmqjggRuzU8ScrBEpcX4X4BknC7gxvfX128BGxkXg", // WithdrawLog
|
|
// "3KzZ5jYfwp6LyPUt5LFbbPLEEsYNYtdAA5hs2KAdZxqarFiVVUKJ7WFxYXf8xeFnbWwypEWpNRCeE1d3y4e5Sxrk", // FillLog
|
|
// "NGgdZu6YwNnFGoSMxc6ZgfUhSVy2rkB9BDY9yvYRLYZoteDSArWn5hDUGZuYCktC81jzGb6u9W6u7ab9mWutfQe", // SettlePnl
|
|
// "67axUM8Q6tvCCNa6Cq8JfR9pLCAf5wyqc7gy1eafEtA4kcYE9Gte1LT8b9ziEWhtLfaGim5t5ChYU5uaQLfteGTJ", // SettlePnl - Multiple
|
|
// "24hCHGXrf9nCnkioWf6HxtRqnQHGhhtTkARgA9tqkEmWb3uUzuE2oUU3so1JGNGZftCaBMjWek5rqAHRU3VAyQEJ", // Multiple net balances changes to the same (mangoAccount, token) pair
|
|
// "eu5yMAACP41tvHAMmhuRAqu9tW4ZJeVY37TqbJLYVaqavKNh1rQEH97QGq6j3Zm721dgjMs94qmLm9PiSPDcwfX", // force_settle_quote_positions
|
|
// "3twdGBA3Fz9Sbn4hS8AbHEcLomj8KyLVcB9P7ToiVP83cnHEHS7WFKgcsAa2TaDvYJ8emuhmBGWDybbtxVjgZXGt", // LiquidateTokenAndPerp
|
|
// "3nQBUy8naBUj7US3PiVkcUt75jV4bszuQEV2vYMgrbYJGTJAbseuQJ7HvCQBhpWZqUUWPCeT72px1ijWdd4zC5ZG", // netbalances
|
|
// "3Y3mK95f2Za1K3fwoXLzB2LrTPjyyojCGg26x9aiJGCHmshtDy1Q8WDpkcv7v9PcU7VsbU2mduktMhJcT3mZTRac", // update funding
|
|
// "3YL7DHcULvjPPKFiDMUvrKuDG8zRT89sWuy5UNn7y6f6fdHQpNFTFNgg1JPZXpvaAELBp4EUdCkzQtjP9HQGmK6f"
|
|
// "3zZsXZdiT3afhDmPVzG5caJvhx3BonzeGuwWL9BLKedvMBEJdJdhSG3s1b9VM5HtXwMtLNysC2x2QNyH2tL6JfxU"
|
|
// "2ghyYdskT3Pcx11CqbjNuXscrsj7A4hNWfJ9fHm7vjZFrd6fbrhJxtc7icron3mP5JQ8HaLLex1uscHR5YvNwpyM"
|
|
// "5aWmePQwvT2RGd4uUfTTKX76S5PHC9Lo5nTuPWWQcbyWDVR5SFDJDALK6GAeJyVbeF21M3tu1mVqHxBxo7Ut4ch9"
|
|
// "46dyFA53Q8ha5JEYin9vcaHrQJL2qbwD4rT5DWkwBnbfB35VNcKCx4VBA25nEHnYG46Q1aCKQecWinYJK6KfXwgB", // Log truncated
|
|
// "5UuX55VW7puEFeULrBkPn9oHgeZzRCmMeekw8To9pHscnC9LkwgcXKqYw6RnHYbEwd9Zn74AJUkSEbUmFxqK1J4K" // Log truncated
|
|
|
|
// "2WYkCZnzxkVcpFgVEBhUpnRYyBNZNHmx8oEpL59UL8KbL7jPftRvaDmjtG7uBfLnANWghsAuuSbQWP9JuYcPCXcg",
|
|
// "61kQNnDJkekFP5SyitE4UgmvHTnKKs8yuc5Kosro5xxXEvmMZaLd5kB9NdDLGPvYQRMfUriMDje4rNiXKbKk1KJw"
|
|
|
|
// "46Rf29aBtjeUUQYsLms2SdJ3nSCASdsFsGpgynZX4d9aMjTwYGk87FZEKM5CVGHK8M8tbpeSiX6xhg8V7FLLr9tY",
|
|
// "3tq9iqZuxHoV2xZ1NpqvQRWhd26tijetnZ3jdJGjBP2dWK41YAt79S9yQeX93ta1qEyCz2v6HQamSNan9HtN75i8",
|
|
|
|
// CancelAllPerpOrders
|
|
// '67hoPW6rHJHqgCgZ2HnUgHrdnTE7gpdcvsZCo6vZYpkuQyrcyNKzxj8XTGb8b2fXQHGPJME8Y38REWu1cwFELES6',
|
|
|
|
// CachePrices Luna
|
|
"3NgkJKbnEAjqFsfvGiTHTUwRPBWU2RZ6v79z8PtdaS5Z9XUdUQA5aKangcfKQfUgLLs6CzmvNHP2RCWQydRr8b5p"
|
|
|
|
|
|
];
|
|
|
|
let transactions = await getTransactions(signatures, clusterConnection, requestWaitTime);
|
|
|
|
let [processStates, parsedTransactions] = parseTransactions(
|
|
transactions,
|
|
mangoProgramId,
|
|
);
|
|
|
|
let errorProcessStates = processStates.filter(e => e.process_state === 'parsing error');
|
|
console.log(errorProcessStates.length + ' parsing errors')
|
|
|
|
// Set a breakpoint here to examine parsed transactions
|
|
console.log(parsedTransactions);
|
|
}
|
|
|
|
async function consumeTransactions() {
|
|
const clusterUrl =
|
|
process.env.CLUSTER_URL || 'https://api.mainnet-beta.solana.com';
|
|
let requestWaitTime = parseInt(process.env.REQUEST_WAIT_TIME!) || 500;
|
|
|
|
let clusterConnection = new Connection(clusterUrl, 'finalized');
|
|
|
|
await processMangoTransactions(
|
|
clusterConnection,
|
|
requestWaitTime
|
|
);
|
|
|
|
}
|
|
|
|
consumeTransactions();
|
|
|
|
|
|
async function getAllSignatures(addressPk: PublicKey, connection: Connection) {
|
|
let signatures;
|
|
const limit = 1000;
|
|
let before = null;
|
|
let options;
|
|
let allSignaturesInfo: ConfirmedSignatureInfo[] = [];
|
|
|
|
while (true) {
|
|
if (before === null) {
|
|
options = { limit: limit };
|
|
} else {
|
|
options = { limit: limit, before: before };
|
|
}
|
|
|
|
let signaturesInfo = await connection.getConfirmedSignaturesForAddress2(
|
|
addressPk,
|
|
options,
|
|
);
|
|
signatures = signaturesInfo.map((x) => x['signature']);
|
|
|
|
allSignaturesInfo = allSignaturesInfo.concat(signaturesInfo);
|
|
|
|
if (signaturesInfo.length !== limit) {
|
|
break
|
|
}
|
|
|
|
before = signatures[signatures.length - 1];
|
|
|
|
console.log(
|
|
new Date(
|
|
signaturesInfo[signaturesInfo.length - 1].blockTime! * 1000,
|
|
).toISOString(),
|
|
);
|
|
|
|
}
|
|
|
|
return allSignaturesInfo;
|
|
}
|
|
|