mango-v4-ui/utils/transactionConfirmationData.ts

126 lines
3.7 KiB
TypeScript
Raw Normal View History

import { IDL } from '@blockworks-foundation/mango-v4'
2024-01-09 17:02:38 -08:00
import { BorshInstructionCoder } from '@project-serum/anchor'
2024-01-09 21:35:25 -08:00
import { Connection } from '@solana/web3.js'
2024-01-09 17:02:38 -08:00
import { MANGO_DATA_API_URL } from './constants'
2024-01-09 21:35:25 -08:00
import { TxCallbackOptions } from '@blockworks-foundation/mango-v4/dist/types/src/client'
2024-07-04 17:09:26 -07:00
import { awaitTransactionSignatureConfirmation } from '@blockworks-foundation/mangolana/lib/transactions'
2024-01-09 17:02:38 -08:00
const coder = new BorshInstructionCoder(IDL)
export function collectTxConfirmationData(
rpcEndpoint: string,
prioritizationFee: number,
2024-01-09 21:35:25 -08:00
txCallbackOptions: TxCallbackOptions,
2024-01-09 17:02:38 -08:00
) {
const start = new Date().getTime()
txConfirmationInner(
start,
rpcEndpoint,
prioritizationFee,
txCallbackOptions,
2024-07-04 17:09:26 -07:00
).catch(() => {
return txConfirmationInner(
start,
rpcEndpoint,
prioritizationFee,
txCallbackOptions,
2024-07-04 17:09:26 -07:00
)
})
2024-01-09 17:02:38 -08:00
}
async function txConfirmationInner(
startTime: number,
2024-01-09 17:02:38 -08:00
rpcEndpoint: string,
prioritization_fee: number,
2024-01-09 21:35:25 -08:00
txCallbackOptions: TxCallbackOptions,
2024-01-09 17:02:38 -08:00
) {
const connection = new Connection(rpcEndpoint, 'processed')
2024-01-09 21:35:25 -08:00
const { txid: signature, txSignatureBlockHash } = txCallbackOptions
2024-07-04 17:09:26 -07:00
try {
await awaitTransactionSignatureConfirmation({
txid: signature,
confirmLevel: 'processed',
connection: connection,
timeoutStrategy: {
block: txSignatureBlockHash,
},
})
// eslint-disable-next-line no-empty
} catch (e) {}
const elapsed = new Date().getTime() - startTime
2024-07-04 17:09:26 -07:00
try {
await awaitTransactionSignatureConfirmation({
txid: signature,
confirmLevel: 'confirmed',
connection: connection,
timeoutStrategy: {
block: txSignatureBlockHash,
},
})
// eslint-disable-next-line no-empty
} catch (e) {}
2024-01-09 17:02:38 -08:00
const confirmedTxn = await connection.getTransaction(signature, {
commitment: 'confirmed',
maxSupportedTransactionVersion: 0,
})
// search message ixs only (as opposed to inner)
// it's ok to do this since Mango does not CPI into itself and these metrics are for the frontend only
const messageInstructions =
2024-07-05 05:25:24 -07:00
confirmedTxn?.transaction.message.compiledInstructions ||
txCallbackOptions.instructions?.message.compiledInstructions
2024-01-09 17:02:38 -08:00
const instructionNames = []
if (messageInstructions) {
2024-07-04 17:09:26 -07:00
for (const ix of messageInstructions) {
2024-01-09 17:02:38 -08:00
const parsedInstruction = coder.decode(Buffer.from(ix.data))
if (parsedInstruction) {
instructionNames.push(parsedInstruction.name)
}
}
}
const confirmed = confirmedTxn !== null
const error =
confirmedTxn?.meta?.err !== null && confirmedTxn?.meta?.err !== undefined
2024-07-05 05:25:24 -07:00
const signBlockTime = await connection.getBlockTime(txSignatureBlockHash.slot)
let backupBlockTime = null
if (!confirmedTxn && signBlockTime) {
backupBlockTime = new Date(signBlockTime * 1000).toISOString()
}
2024-01-09 17:02:38 -08:00
const block_datetime = confirmedTxn?.blockTime
? new Date(confirmedTxn.blockTime * 1000).toISOString()
2024-07-05 05:25:24 -07:00
: backupBlockTime || new Date().toISOString()
2024-01-09 17:02:38 -08:00
const loaded_addresses =
(confirmedTxn?.meta?.loadedAddresses?.readonly.length ?? 0) +
(confirmedTxn?.meta?.loadedAddresses?.writable.length ?? 0)
const data = {
signature,
block_datetime,
confirmed,
error,
ui_confirmation_time_ms: elapsed,
2024-01-09 17:02:38 -08:00
fetch_blockhash_slot: txSignatureBlockHash.slot,
2024-07-05 05:25:24 -07:00
processed_slot: confirmedTxn?.slot || txSignatureBlockHash.slot,
2024-01-09 17:02:38 -08:00
instruction_names: instructionNames.join(','),
loaded_addresses,
prioritization_fee,
2024-07-05 05:25:24 -07:00
compute_units_consumed: confirmedTxn?.meta?.computeUnitsConsumed || 0,
fee_lamports: confirmedTxn?.meta?.fee || 0,
2024-01-09 17:02:38 -08:00
}
2024-07-04 17:09:26 -07:00
await fetch(`${MANGO_DATA_API_URL}/transaction-confirmation`, {
2024-01-09 17:02:38 -08:00
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(data),
})
}