import { xdr, scValToNative } from '@stellar/stellar-sdk';
type VannaEvent =
| { type: 'AccountCreated'; smartAccount: string; time: number }
| { type: 'AccountDeleted'; smartAccount: string; time: number }
| { type: 'TraderDeposit'; smartAccount: string; symbol: string; amountWad: bigint }
| { type: 'TraderBorrow'; smartAccount: string; symbol: string; amountWad: bigint }
| { type: 'TraderRepay'; smartAccount: string; symbol: string; amountWad: bigint; time: number }
| { type: 'TraderLiquidated'; smartAccount: string; time: number }
| { type: 'LPDeposit'; lender: string; symbol: string; amountWad: bigint; time: number }
| { type: 'LPWithdraw'; lender: string; symbol: string; vtokenAmountWad: bigint; time: number }
| { type: 'Unknown'; raw: unknown }
function decodeScVal(base64: string): unknown {
const buf = Buffer.from(base64, 'base64');
return scValToNative(xdr.ScVal.fromXDR(buf));
}
function decodeEvent(event: MercuryEvent): VannaEvent {
const name = decodeScVal(event.topic1) as string;
const data = decodeScVal(event.data) as Record<string, unknown>;
switch (name) {
case 'AccountCreationEvent':
return { type: 'AccountCreated', smartAccount: data.smart_account as string, time: Number(data.creation_time) };
case 'AccountDeletionEvent':
return { type: 'AccountDeleted', smartAccount: data.smart_account as string, time: Number(data.deletion_time) };
case 'TraderDepositEvent':
return { type: 'TraderDeposit', smartAccount: data.smart_account as string, symbol: data.token_symbol as string, amountWad: data.amount as bigint };
case 'TraderBorrowEvent':
return { type: 'TraderBorrow', smartAccount: data.smart_account as string, symbol: data.token_symbol as string, amountWad: data.token_amount as bigint };
case 'TraderRepayEvent':
return { type: 'TraderRepay', smartAccount: data.smart_account as string, symbol: data.token_symbol as string, amountWad: data.token_amount as bigint, time: Number(data.timestamp) };
case 'TraderLiquidateEvent':
return { type: 'TraderLiquidated', smartAccount: data.smart_account as string, time: Number(data.timestamp) };
case 'deposit_event':
return { type: 'LPDeposit', lender: data.lender as string, symbol: data.asset_symbol as string, amountWad: data.amount as bigint, time: Number(data.timestamp) };
case 'withdraw_event':
return { type: 'LPWithdraw', lender: data.lender as string, symbol: data.asset_symbol as string, vtokenAmountWad: data.vtoken_amount as bigint, time: Number(data.timestamp) };
default:
return { type: 'Unknown', raw: { name, data } };
}
}