Merge pull request #4 from blockworks-foundation/ts/anchorevents

Ts/anchorevents
This commit is contained in:
Nicholas Clarke 2021-11-06 23:09:52 -07:00 committed by GitHub
commit 0d93e12851
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 63 additions and 17 deletions

View File

@ -23,6 +23,7 @@ var tokenIndexesMap = {
5: 'SRMuApVNdxXokk5GT7XD5cUUgXMBCoAz2LHeuAoKWRt', 5: 'SRMuApVNdxXokk5GT7XD5cUUgXMBCoAz2LHeuAoKWRt',
6: '4k3Dyjzvzp8eMZWUXbBCjEvwSkkk59S5iCNLY3QrkX6R', 6: '4k3Dyjzvzp8eMZWUXbBCjEvwSkkk59S5iCNLY3QrkX6R',
7: '8HGyAAB1yoM1ttS7pXjHMa3dukTFGQggnFFH3hJZgzQh', 7: '8HGyAAB1yoM1ttS7pXjHMa3dukTFGQggnFFH3hJZgzQh',
8: 'AGFEad2et2ZJif9jaGpdMixQqvW5i81aBdvKe7PHNfz3',
15: 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v', 15: 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v',
}, },
'4yJ2Vx3kZnmHTNCrHzdoj5nCwriF2kVhfKNvqC6gU8tr': { '4yJ2Vx3kZnmHTNCrHzdoj5nCwriF2kVhfKNvqC6gU8tr': {
@ -47,6 +48,8 @@ var tokenIndexesMap = {
5: '3NBReDRTLKMQEKiLD5tGcx4kXbTf88b7f2xLS9UuGjym', 5: '3NBReDRTLKMQEKiLD5tGcx4kXbTf88b7f2xLS9UuGjym',
6: 'AnLf8tVYCM816gmBjiy8n53eXKKEDydT5piYjjQDPgTB', 6: 'AnLf8tVYCM816gmBjiy8n53eXKKEDydT5piYjjQDPgTB',
7: '9xYBiDWYsh2fHzpsz3aaCnNHCKWBNtfEDLtU6kS4aFD9', 7: '9xYBiDWYsh2fHzpsz3aaCnNHCKWBNtfEDLtU6kS4aFD9',
8: '8JPJJkmDScpcNmBRKGZuPuG2GYAveQgP3t5gFuMymwvF',
9: '3pyn4svBbxJ9Wnn3RVeafyLWfzie6yC5eTig2S62v9SC'
}, },
'4yJ2Vx3kZnmHTNCrHzdoj5nCwriF2kVhfKNvqC6gU8tr': { '4yJ2Vx3kZnmHTNCrHzdoj5nCwriF2kVhfKNvqC6gU8tr': {
0: '49cnp1ejyvQi3CJw3kKXNCDGnNbWDuZd3UG3Y2zGvQkX', 0: '49cnp1ejyvQi3CJw3kKXNCDGnNbWDuZd3UG3Y2zGvQkX',
@ -62,13 +65,45 @@ var tokenIndexesMap = {
// mango group -> perp name -> lot sizes // mango group -> perp name -> lot sizes
var perpLotSizes = { var perpLotSizes = {
'98pjRuQjK3qA6gXts96PqZT4Ze5QmnCmt3QYjhbUSPue': { '98pjRuQjK3qA6gXts96PqZT4Ze5QmnCmt3QYjhbUSPue': {
'MNGO-PERP': {
'pk': '4nfmQP3KmUqEJ6qJLsS3offKgE96YUB4Rp7UQvm2Fbi9',
'baseLotSize': 1000000,
'quoteLotSize': 100
},
'BTC-PERP': { 'BTC-PERP': {
'pk': 'DtEcjPLyD4YtTBB4q8xwFZ9q49W89xZCZtJyrGebi5t8',
'baseLotSize': 100, 'baseLotSize': 100,
'quoteLotSize': 10 'quoteLotSize': 10
}, },
'ETH-PERP': {
'pk': 'DVXWg6mfwFvHQbGyaHke4h3LE9pSkgbooDSDgA4JBC8d',
'baseLotSize': 1000,
'quoteLotSize': 100
},
'SOL-PERP': { 'SOL-PERP': {
'pk': '2TgaaVoHgnSeEtXvWTx13zQeTf4hYWAMEiMQdcG6EwHi',
'baseLotSize': 10000000, 'baseLotSize': 10000000,
'quoteLotSize': 100 '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 blockDatetime
); );
parsedTransactions.perp_bankruptcy.push(perpBankruptcyRow); parsedTransactions.perp_bankruptcy.push(perpBankruptcyRow);
parsedTransactions.updating_funding.push(updateFundingRow); parsedTransactions.funding.push(updateFundingRow);
} else if (eventName === "SettlePnlLog") { } else if (eventName === "SettlePnlLog") {
parsedTransactions.settle_pnl.push( parsedTransactions.settle_pnl.push(
...parseSettlePnl( ...parseSettlePnl(
@ -266,16 +301,18 @@ export function anchorParser(parsedTransactions, result, signature, blockTime, s
) )
) )
} else if (eventName === "CachePerpMarketsLog") { } else if (eventName === "CachePerpMarketsLog") {
parsedTransactions.funding.push( // pass - logging from CachePerpMarkets is redundant - can just log from updateFunding
...parseCachePerpMarkets(
eventNum, // parsedTransactions.funding.push(
eventData, // ...parseCachePerpMarkets(
signature, // eventNum,
blockTime, // eventData,
slot, // signature,
blockDatetime // blockTime,
) // slot,
) // blockDatetime
// )
// )
} else if (eventName === "OpenOrdersBalanceLog") { } else if (eventName === "OpenOrdersBalanceLog") {
parsedTransactions.open_orders_balances.push( parsedTransactions.open_orders_balances.push(
parseOpenOrdersBalance( parseOpenOrdersBalance(
@ -1147,9 +1184,16 @@ function parseFillLog(
) { ) {
let mangoGroupPk = eventData.mangoGroup.toString(); 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)[ let tokens = ids["groups"].find((e) => e["publicKey"] === mangoGroupPk)[
"tokens" "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)[ let oracles = ids["groups"].find((e) => e["publicKey"] === mangoGroupPk)[
"oracles" "oracles"
]; ];
@ -1169,8 +1213,7 @@ function parseFillLog(
let oracle = oracles.find((e) => e["publicKey"] === oraclePk); let oracle = oracles.find((e) => e["publicKey"] === oraclePk);
let symbol = oracle.symbol; let symbol = oracle.symbol;
let token = tokens.find((e) => e.symbol === symbol); let baseDecimals = symbolDecimalsMap[symbol]
let baseDecimals = token.decimals;
let rawPrice = oraclePrices[i]; let rawPrice = oraclePrices[i];
let price = rawPrice let price = rawPrice
@ -1213,7 +1256,7 @@ function parseFillLog(
return { return {
symbol: perpMarketConfig.baseSymbol, symbol: perpMarketConfig.baseSymbol,
long_funding: new I80F48(eventData.longFunding).toNumber(), long_funding: new I80F48(eventData.longFunding).toNumber(),
short_funding: new I80F48(eventData.longFunding).toNumber(), short_funding: new I80F48(eventData.shortFunding).toNumber(),
instruction_num: instructionNum, instruction_num: instructionNum,
mango_group: eventData.mangoGroup.toString(), mango_group: eventData.mangoGroup.toString(),
block_datetime: blockDatetime, block_datetime: blockDatetime,

View File

@ -63,8 +63,11 @@ export function parseTransactions(transactionsResult, mangoProgramId) {
// only look at cases where instruction is for mango program id // only look at cases where instruction is for mango program id
// Skip attempting to parse serum instructions, etc // 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;
let instructions = result.transaction.message.instructions.filter( let innerInstructions = result.meta.innerInstructions.map(e => e.instructions).flat();
instructions.push(...innerInstructions)
instructions = instructions.filter(
(ix) => (ix) =>
ix.programId === mangoProgramId && ix.programId === mangoProgramId &&
!( !(