diff --git a/src/anchorParsers.ts b/src/anchorParsers.ts index c53b93f..7127a5c 100644 --- a/src/anchorParsers.ts +++ b/src/anchorParsers.ts @@ -23,6 +23,7 @@ var tokenIndexesMap = { 5: 'SRMuApVNdxXokk5GT7XD5cUUgXMBCoAz2LHeuAoKWRt', 6: '4k3Dyjzvzp8eMZWUXbBCjEvwSkkk59S5iCNLY3QrkX6R', 7: '8HGyAAB1yoM1ttS7pXjHMa3dukTFGQggnFFH3hJZgzQh', + 8: 'AGFEad2et2ZJif9jaGpdMixQqvW5i81aBdvKe7PHNfz3', 15: 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v', }, '4yJ2Vx3kZnmHTNCrHzdoj5nCwriF2kVhfKNvqC6gU8tr': { @@ -47,6 +48,8 @@ var tokenIndexesMap = { 5: '3NBReDRTLKMQEKiLD5tGcx4kXbTf88b7f2xLS9UuGjym', 6: 'AnLf8tVYCM816gmBjiy8n53eXKKEDydT5piYjjQDPgTB', 7: '9xYBiDWYsh2fHzpsz3aaCnNHCKWBNtfEDLtU6kS4aFD9', + 8: '8JPJJkmDScpcNmBRKGZuPuG2GYAveQgP3t5gFuMymwvF', + 9: '3pyn4svBbxJ9Wnn3RVeafyLWfzie6yC5eTig2S62v9SC' }, '4yJ2Vx3kZnmHTNCrHzdoj5nCwriF2kVhfKNvqC6gU8tr': { 0: '49cnp1ejyvQi3CJw3kKXNCDGnNbWDuZd3UG3Y2zGvQkX', @@ -62,13 +65,45 @@ var tokenIndexesMap = { // mango group -> perp name -> lot sizes var perpLotSizes = { '98pjRuQjK3qA6gXts96PqZT4Ze5QmnCmt3QYjhbUSPue': { + 'MNGO-PERP': { + 'pk': '4nfmQP3KmUqEJ6qJLsS3offKgE96YUB4Rp7UQvm2Fbi9', + 'baseLotSize': 1000000, + 'quoteLotSize': 100 + }, 'BTC-PERP': { + 'pk': 'DtEcjPLyD4YtTBB4q8xwFZ9q49W89xZCZtJyrGebi5t8', 'baseLotSize': 100, 'quoteLotSize': 10 }, + 'ETH-PERP': { + 'pk': 'DVXWg6mfwFvHQbGyaHke4h3LE9pSkgbooDSDgA4JBC8d', + 'baseLotSize': 1000, + 'quoteLotSize': 100 + }, 'SOL-PERP': { + 'pk': '2TgaaVoHgnSeEtXvWTx13zQeTf4hYWAMEiMQdcG6EwHi', 'baseLotSize': 10000000, 'quoteLotSize': 100 + }, + 'SRM-PERP': { + 'pk': '4GkJj2znAr2pE2PBbak66E12zjCs2jkmeafiJwDVM9Au', + 'baseLotSize': 100000, + 'quoteLotSize': 100 + }, + 'RAY-PERP': { + 'pk': '6WGoQr5mJAEpYCdX6qjju2vEnJuD7e8ZeYes7X7Shi7E', + 'baseLotSize': 100000, + 'quoteLotSize': 100 + }, + 'FTT-PERP': { + 'pk': 'AhgEayEGNw46ALHuC5ASsKyfsJzAm5JY8DWqpGMQhcGC', + 'baseLotSize': 100000, + 'quoteLotSize': 100 + }, + 'ADA-PERP': { + 'pk': 'Bh9UENAncoTEwE7NDim8CdeM1GPvw6xAT4Sih2rKVmWB', + 'baseLotSize': 1000000, + 'quoteLotSize': 100 } } } @@ -220,7 +255,7 @@ export function anchorParser(parsedTransactions, result, signature, blockTime, s blockDatetime ); parsedTransactions.perp_bankruptcy.push(perpBankruptcyRow); - parsedTransactions.updating_funding.push(updateFundingRow); + parsedTransactions.funding.push(updateFundingRow); } else if (eventName === "SettlePnlLog") { parsedTransactions.settle_pnl.push( ...parseSettlePnl( @@ -266,16 +301,18 @@ export function anchorParser(parsedTransactions, result, signature, blockTime, s ) ) } else if (eventName === "CachePerpMarketsLog") { - parsedTransactions.funding.push( - ...parseCachePerpMarkets( - eventNum, - eventData, - signature, - blockTime, - slot, - blockDatetime - ) - ) + // pass - logging from CachePerpMarkets is redundant - can just log from updateFunding + + // parsedTransactions.funding.push( + // ...parseCachePerpMarkets( + // eventNum, + // eventData, + // signature, + // blockTime, + // slot, + // blockDatetime + // ) + // ) } else if (eventName === "OpenOrdersBalanceLog") { parsedTransactions.open_orders_balances.push( parseOpenOrdersBalance( @@ -1147,9 +1184,16 @@ function parseFillLog( ) { let mangoGroupPk = eventData.mangoGroup.toString(); + // Some symbols may only exist in tokens or perpMarkets but not both (such as ADA) let tokens = ids["groups"].find((e) => e["publicKey"] === mangoGroupPk)[ "tokens" ]; + let perpMarkets = ids["groups"].find((e) => e["publicKey"] === mangoGroupPk)[ + "perpMarkets" + ] + let symbolDecimalsMap = Object.fromEntries(tokens.map(e => [e.symbol, e.decimals]).concat(perpMarkets.map(e => [e.baseSymbol, e.baseDecimals]))) + + let oracles = ids["groups"].find((e) => e["publicKey"] === mangoGroupPk)[ "oracles" ]; @@ -1169,8 +1213,7 @@ function parseFillLog( let oracle = oracles.find((e) => e["publicKey"] === oraclePk); let symbol = oracle.symbol; - let token = tokens.find((e) => e.symbol === symbol); - let baseDecimals = token.decimals; + let baseDecimals = symbolDecimalsMap[symbol] let rawPrice = oraclePrices[i]; let price = rawPrice @@ -1209,11 +1252,11 @@ function parseFillLog( const perpMarketConfig = groupConfig.perpMarkets.find( (p) => p.marketIndex === eventData.marketIndex.toNumber() ) as PerpMarketConfig; - + return { symbol: perpMarketConfig.baseSymbol, long_funding: new I80F48(eventData.longFunding).toNumber(), - short_funding: new I80F48(eventData.longFunding).toNumber(), + short_funding: new I80F48(eventData.shortFunding).toNumber(), instruction_num: instructionNum, mango_group: eventData.mangoGroup.toString(), block_datetime: blockDatetime, diff --git a/src/parseTransactions.ts b/src/parseTransactions.ts index 71ebda9..53fa7b9 100644 --- a/src/parseTransactions.ts +++ b/src/parseTransactions.ts @@ -63,8 +63,11 @@ export function parseTransactions(transactionsResult, mangoProgramId) { // only look at cases where instruction is for mango program id // Skip attempting to parse serum instructions, etc - // @clarkeni - what if someone calls mango program via CPI? Do the instruction list contain inner instructions - let instructions = result.transaction.message.instructions.filter( + let instructions = result.transaction.message.instructions; + let innerInstructions = result.meta.innerInstructions.map(e => e.instructions).flat(); + instructions.push(...innerInstructions) + + instructions = instructions.filter( (ix) => ix.programId === mangoProgramId && !(