Added parsers for UpdateRootBankLog, CachePerpMarketsLog, OpenOrdersBalanceLog, MngoAccrualLog
This commit is contained in:
parent
2de3415975
commit
2d94d75a10
|
@ -4,6 +4,7 @@ import {
|
||||||
I80F48,
|
I80F48,
|
||||||
IDL,
|
IDL,
|
||||||
IDS,
|
IDS,
|
||||||
|
PerpEventLayout,
|
||||||
PerpMarketConfig,
|
PerpMarketConfig,
|
||||||
} from "@blockworks-foundation/mango-client";
|
} from "@blockworks-foundation/mango-client";
|
||||||
import { Coder } from "@project-serum/anchor";
|
import { Coder } from "@project-serum/anchor";
|
||||||
|
@ -107,10 +108,7 @@ export function anchorParser(parsedTransactions, result, signature, blockTime, s
|
||||||
blockDatetime
|
blockDatetime
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
} else if (
|
} else if (eventName === "DepositLog" || eventName === "WithdrawLog") {
|
||||||
eventName === "DepositLog" ||
|
|
||||||
eventName === "WithdrawLog"
|
|
||||||
) {
|
|
||||||
parsedTransactions.deposits_withdraws.push(
|
parsedTransactions.deposits_withdraws.push(
|
||||||
parseDepositWithDraw(
|
parseDepositWithDraw(
|
||||||
eventNum,
|
eventNum,
|
||||||
|
@ -229,7 +227,7 @@ export function anchorParser(parsedTransactions, result, signature, blockTime, s
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
} else if (eventName === "UpdateFundingLog") {
|
} else if (eventName === "UpdateFundingLog") {
|
||||||
parsedTransactions.updating_funding.push(
|
parsedTransactions.funding.push(
|
||||||
parseUpdateFunding(
|
parseUpdateFunding(
|
||||||
eventNum,
|
eventNum,
|
||||||
eventData,
|
eventData,
|
||||||
|
@ -239,13 +237,213 @@ export function anchorParser(parsedTransactions, result, signature, blockTime, s
|
||||||
blockDatetime
|
blockDatetime
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
} else if (eventName === "UpdateRootBankLog") {
|
||||||
|
parsedTransactions.cache_indexes.push(
|
||||||
|
parseUpdateRootBank(
|
||||||
|
eventNum,
|
||||||
|
eventData,
|
||||||
|
signature,
|
||||||
|
blockTime,
|
||||||
|
slot,
|
||||||
|
blockDatetime
|
||||||
|
)
|
||||||
|
)
|
||||||
|
} else if (eventName === "CachePerpMarketsLog") {
|
||||||
|
parsedTransactions.funding.push(
|
||||||
|
...parseCachePerpMarkets(
|
||||||
|
eventNum,
|
||||||
|
eventData,
|
||||||
|
signature,
|
||||||
|
blockTime,
|
||||||
|
slot,
|
||||||
|
blockDatetime
|
||||||
|
)
|
||||||
|
)
|
||||||
|
} else if (eventName === "OpenOrdersBalanceLog") {
|
||||||
|
parsedTransactions.open_orders_balances.push(
|
||||||
|
parseOpenOrdersBalance(
|
||||||
|
eventNum,
|
||||||
|
eventData,
|
||||||
|
signature,
|
||||||
|
blockTime,
|
||||||
|
slot,
|
||||||
|
blockDatetime
|
||||||
|
)
|
||||||
|
)
|
||||||
|
} else if (eventName === "MngoAccrualLog") {
|
||||||
|
parsedTransactions.mango_accrual.push(
|
||||||
|
parseMngoAccrual(
|
||||||
|
eventNum,
|
||||||
|
eventData,
|
||||||
|
signature,
|
||||||
|
blockTime,
|
||||||
|
slot,
|
||||||
|
blockDatetime
|
||||||
|
)
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
throw new Error("Unknown anchor event: " + eventName);
|
||||||
}
|
}
|
||||||
// else {
|
|
||||||
// throw new Error("Unknown anchor event: " + eventName);
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function parseMngoAccrual(
|
||||||
|
instructionNum,
|
||||||
|
eventData,
|
||||||
|
signature,
|
||||||
|
blockTime,
|
||||||
|
slot,
|
||||||
|
blockDatetime
|
||||||
|
) {
|
||||||
|
|
||||||
|
const config = new Config(IDS);
|
||||||
|
|
||||||
|
const groupConfig = config.groups.find((g) =>
|
||||||
|
g.publicKey.equals(eventData.mangoGroup)
|
||||||
|
) as GroupConfig;
|
||||||
|
|
||||||
|
let perpMarketConfig = groupConfig.perpMarkets.find(
|
||||||
|
(p) => p.marketIndex === eventData.marketIndex.toNumber()
|
||||||
|
) as PerpMarketConfig;
|
||||||
|
|
||||||
|
let mangoAccrual = new I80F48(eventData.mngoAccrual).toNumber()
|
||||||
|
|
||||||
|
return {
|
||||||
|
margin_account: eventData.mangoAccount.toString(),
|
||||||
|
perp_market: perpMarketConfig.name,
|
||||||
|
base_symbol: perpMarketConfig.baseSymbol,
|
||||||
|
mango_accrual: mangoAccrual,
|
||||||
|
|
||||||
|
instruction_num: instructionNum,
|
||||||
|
mango_group: eventData.mangoGroup.toString(),
|
||||||
|
block_datetime: blockDatetime,
|
||||||
|
slot: slot,
|
||||||
|
signature: signature,
|
||||||
|
blocktime: blockTime,
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
function parseOpenOrdersBalance(
|
||||||
|
instructionNum,
|
||||||
|
eventData,
|
||||||
|
signature,
|
||||||
|
blockTime,
|
||||||
|
slot,
|
||||||
|
blockDatetime
|
||||||
|
) {
|
||||||
|
|
||||||
|
let mangoGroup = eventData.mangoGroup.toString()
|
||||||
|
let tokens = ids["groups"].find((e) => e["publicKey"] === mangoGroup)[
|
||||||
|
"tokens"
|
||||||
|
];
|
||||||
|
|
||||||
|
let tokenIndex = eventData.marketIndex.toNumber()
|
||||||
|
let tokenPk = tokenIndexesMap[mangoGroup][tokenIndex];
|
||||||
|
let token = tokens.find((e) => e["mintKey"] === tokenPk);
|
||||||
|
let symbol = token.symbol;
|
||||||
|
|
||||||
|
let baseFree = new I80F48(eventData.baseFree).toNumber()
|
||||||
|
let baseTotal = new I80F48(eventData.baseTotal).toNumber()
|
||||||
|
let quoteFree = new I80F48(eventData.quoteFree).toNumber()
|
||||||
|
let quoteTotal = new I80F48(eventData.quoteTotal).toNumber()
|
||||||
|
let referrerRebatesAccrued = new I80F48(eventData.referrerRebatesAccrued).toNumber()
|
||||||
|
let marginAccount = eventData.mangoAccount.toString()
|
||||||
|
|
||||||
|
return {
|
||||||
|
margin_account: marginAccount,
|
||||||
|
symbol: symbol,
|
||||||
|
baseFree: baseFree,
|
||||||
|
baseTotal: baseTotal,
|
||||||
|
quoteFree: quoteFree,
|
||||||
|
quoteTotal: quoteTotal,
|
||||||
|
referrerRebatesAccrued: referrerRebatesAccrued,
|
||||||
|
instruction_num: instructionNum,
|
||||||
|
|
||||||
|
mango_group: mangoGroup,
|
||||||
|
block_datetime: blockDatetime,
|
||||||
|
slot: slot,
|
||||||
|
signature: signature,
|
||||||
|
blocktime: blockTime,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function parseUpdateRootBank(
|
||||||
|
instructionNum,
|
||||||
|
eventData,
|
||||||
|
signature,
|
||||||
|
blockTime,
|
||||||
|
slot,
|
||||||
|
blockDatetime
|
||||||
|
) {
|
||||||
|
|
||||||
|
let mangoGroupPk = eventData.mangoGroup.toString();
|
||||||
|
|
||||||
|
let tokens = ids["groups"].find((e) => e["publicKey"] === mangoGroupPk)[
|
||||||
|
"tokens"
|
||||||
|
];
|
||||||
|
|
||||||
|
let tokenIndex = eventData.tokenIndex.toNumber();
|
||||||
|
let depositIndex = new I80F48(eventData.depositIndex).toNumber()
|
||||||
|
let borrowIndex = new I80F48(eventData.borrowIndex).toNumber()
|
||||||
|
|
||||||
|
let tokenPk = tokenIndexesMap[mangoGroupPk][tokenIndex];
|
||||||
|
let token = tokens.find((e) => e["mintKey"] === tokenPk);
|
||||||
|
let symbol = token.symbol;
|
||||||
|
|
||||||
|
return {
|
||||||
|
symbol: symbol,
|
||||||
|
deposit_index: depositIndex,
|
||||||
|
borrow_index: borrowIndex,
|
||||||
|
instruction_num: instructionNum,
|
||||||
|
mango_group: mangoGroupPk,
|
||||||
|
block_datetime: blockDatetime,
|
||||||
|
slot: slot,
|
||||||
|
signature: signature,
|
||||||
|
blocktime: blockTime,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function parseCachePerpMarkets(
|
||||||
|
instructionNum,
|
||||||
|
eventData,
|
||||||
|
signature,
|
||||||
|
blockTime,
|
||||||
|
slot,
|
||||||
|
blockDatetime
|
||||||
|
) {
|
||||||
|
|
||||||
|
const config = new Config(IDS);
|
||||||
|
|
||||||
|
const groupConfig = config.groups.find((g) =>
|
||||||
|
g.publicKey.equals(eventData.mangoGroup)
|
||||||
|
) as GroupConfig;
|
||||||
|
|
||||||
|
let out: any = []
|
||||||
|
for (let i=0; i<eventData.marketIndexes.length; i++) {
|
||||||
|
let marketIndex = eventData.marketIndexes[i].toNumber()
|
||||||
|
let perpMarketConfig = groupConfig.perpMarkets.find(
|
||||||
|
(p) => p.marketIndex === marketIndex
|
||||||
|
) as PerpMarketConfig;
|
||||||
|
|
||||||
|
out.push(
|
||||||
|
{
|
||||||
|
symbol: perpMarketConfig.baseSymbol,
|
||||||
|
long_funding: new I80F48(eventData.longFundings[i]).toNumber(),
|
||||||
|
short_funding: new I80F48(eventData.shortFundings[i]).toNumber(),
|
||||||
|
instruction_num: instructionNum,
|
||||||
|
mango_group: eventData.mangoGroup.toString(),
|
||||||
|
block_datetime: blockDatetime,
|
||||||
|
slot: slot,
|
||||||
|
signature: signature,
|
||||||
|
blocktime: blockTime,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
return out
|
||||||
|
}
|
||||||
|
|
||||||
function parseFillLog(
|
function parseFillLog(
|
||||||
instructionNum,
|
instructionNum,
|
||||||
eventData,
|
eventData,
|
||||||
|
@ -262,8 +460,6 @@ function parseFillLog(
|
||||||
let marketIndex = eventData.marketIndex.toNumber();
|
let marketIndex = eventData.marketIndex.toNumber();
|
||||||
let perpMarket = perpMarkets.find((e) => e["marketIndex"] === marketIndex);
|
let perpMarket = perpMarkets.find((e) => e["marketIndex"] === marketIndex);
|
||||||
|
|
||||||
// console.log("parseFillLog data: ", eventData)
|
|
||||||
|
|
||||||
const fill = {
|
const fill = {
|
||||||
event_num: instructionNum,
|
event_num: instructionNum,
|
||||||
maker: eventData.maker.toString(),
|
maker: eventData.maker.toString(),
|
||||||
|
@ -288,7 +484,6 @@ function parseFillLog(
|
||||||
};
|
};
|
||||||
|
|
||||||
// TODO: verify i80f48 conversions
|
// TODO: verify i80f48 conversions
|
||||||
// console.log("parsed fill: ", fill)
|
|
||||||
|
|
||||||
return fill;
|
return fill;
|
||||||
}
|
}
|
||||||
|
|
|
@ -110,7 +110,7 @@ async function processMangoTransactions(
|
||||||
let res;
|
let res;
|
||||||
try {
|
try {
|
||||||
res = await client.query(
|
res = await client.query(
|
||||||
'select transaction, slot, signature from ' +
|
'select transaction, signature from ' +
|
||||||
schema +
|
schema +
|
||||||
".transactions where process_state = 'ready for parsing' and program_pk = $1 limit $2",
|
".transactions where process_state = 'ready for parsing' and program_pk = $1 limit $2",
|
||||||
[address, limit],
|
[address, limit],
|
||||||
|
|
|
@ -518,9 +518,9 @@ function extractSettleFees(
|
||||||
maker_fee: eventDetails['maker_fee'],
|
maker_fee: eventDetails['maker_fee'],
|
||||||
maker_order_id: eventDetails['maker_order_id'],
|
maker_order_id: eventDetails['maker_order_id'],
|
||||||
|
|
||||||
// TODO: Ask Daffy about the source of these multipliers
|
// Storing both price and quantity in UI terms to be consistent with db
|
||||||
price: eventDetails['price'] / 10,
|
price: eventDetails['price'] / perpMarket.quoteLotSize,
|
||||||
quantity: eventDetails['quantity'] / 10000,
|
quantity: eventDetails['quantity'] * perpMarket.baseLotSize / Math.pow(10, perpMarket.quoteDecimals),
|
||||||
|
|
||||||
seq_num: eventDetails['seq_num'],
|
seq_num: eventDetails['seq_num'],
|
||||||
taker: eventDetails['taker'],
|
taker: eventDetails['taker'],
|
||||||
|
|
|
@ -37,8 +37,9 @@ export function parseTransactions(transactionsResult, mangoProgramId) {
|
||||||
net_balances: [],
|
net_balances: [],
|
||||||
redeem_mngo: [],
|
redeem_mngo: [],
|
||||||
funding: [],
|
funding: [],
|
||||||
// @clarkeni: new log added OpenOrdersBalanceLog
|
|
||||||
// @clarkeni: new log added MngoAccrual
|
open_orders_balances: [],
|
||||||
|
mango_accrual: [],
|
||||||
// Mango: PlacePerpOrder
|
// Mango: PlacePerpOrder
|
||||||
// Mango: CancelPerpOrderByClientI
|
// Mango: CancelPerpOrderByClientI
|
||||||
// Mango: CancelPerpOrder
|
// Mango: CancelPerpOrder
|
||||||
|
|
|
@ -25,7 +25,7 @@ async function processMangoTransactions(rawTransactionsPool, schema, limit) {
|
||||||
'3bzj3KkA3FSZHJuCmRgHhSgqeaEzD32sCHkYdRLcZm1vcuB4ra5NbU5EZqBhW6QjeKRV9QRWC4SHxK2hS54s79Zx', // settle_pnl
|
'3bzj3KkA3FSZHJuCmRgHhSgqeaEzD32sCHkYdRLcZm1vcuB4ra5NbU5EZqBhW6QjeKRV9QRWC4SHxK2hS54s79Zx', // settle_pnl
|
||||||
'5TmhvKQJmjUD9dZgCszBF8gNKUohpxwjrYu1RngZVh1hEToGMtjPtXJF89QLHXzANMWWQRfMomsgCg8353CpYgBb', // settle_fees
|
'5TmhvKQJmjUD9dZgCszBF8gNKUohpxwjrYu1RngZVh1hEToGMtjPtXJF89QLHXzANMWWQRfMomsgCg8353CpYgBb', // settle_fees
|
||||||
'mxK5eEiEUeCcQtHwmUKziyYUZJ3NXdjmZigAR6npWgcpQoJtqvikt5A7osD4y6oiLZJhzYFvqAqDznFjHm77K8V', // settle_fees called but nothing settled
|
'mxK5eEiEUeCcQtHwmUKziyYUZJ3NXdjmZigAR6npWgcpQoJtqvikt5A7osD4y6oiLZJhzYFvqAqDznFjHm77K8V', // settle_fees called but nothing settled
|
||||||
'4qV6PTD1nGj5qq89FQK8QKwN231pGgtayD7uX4B6y83b19gcVXB5ByLCvApSJjCRrboiCg7RVT2p2e1CtP3zuXDb', // force_settle_quote_positions
|
// '4qV6PTD1nGj5qq89FQK8QKwN231pGgtayD7uX4B6y83b19gcVXB5ByLCvApSJjCRrboiCg7RVT2p2e1CtP3zuXDb', // force_settle_quote_positions
|
||||||
'5qDPBrFjCcaZthjRCqisHRw1mFEkHFHRFWi5jbKCmpAgpAXNdEkSv8L472D12VB5AukYaGsWhAy5bcvvUGJ1Sgtv', // FillEvent
|
'5qDPBrFjCcaZthjRCqisHRw1mFEkHFHRFWi5jbKCmpAgpAXNdEkSv8L472D12VB5AukYaGsWhAy5bcvvUGJ1Sgtv', // FillEvent
|
||||||
'3YXaEG95w5eG7jBBjz8hW9auXVAv9z2MH8yw51tL8nqSqmKgXtrD1hgE7LCqK2hpFwcrpjeWtBeVqGsbCHLh3kSe', // redeem mango
|
'3YXaEG95w5eG7jBBjz8hW9auXVAv9z2MH8yw51tL8nqSqmKgXtrD1hgE7LCqK2hpFwcrpjeWtBeVqGsbCHLh3kSe', // redeem mango
|
||||||
'2HNnZmThkFUsG1pw9bNaJoeeGUZJun3hkcpwBJt3ZU9FKe3CY17wrJgk1BZ8txm13RJ512ThbZVZxaqsxNFn4xVs', // checked_add_net details
|
'2HNnZmThkFUsG1pw9bNaJoeeGUZJun3hkcpwBJt3ZU9FKe3CY17wrJgk1BZ8txm13RJ512ThbZVZxaqsxNFn4xVs', // checked_add_net details
|
||||||
|
|
Loading…
Reference in New Issue