diff --git a/SLIPPAGE_MAPPING.md b/SLIPPAGE_MAPPING.md new file mode 100644 index 0000000..ad81ec2 --- /dev/null +++ b/SLIPPAGE_MAPPING.md @@ -0,0 +1,156 @@ +# Slippage Mapping + +This document describes how `SlippageBps` is derived for each supported swap protocol in this repository. + +## Unified Fields + +Each parsed `Swap` may include these normalized fields: + +- `SwapMode` +- `FixedAmount` +- `FixedAmountSide` +- `FixedMint` +- `LimitAmountType` +- `LimitAmount` +- `LimitAmountSide` +- `LimitMint` +- `ActualLimitAmount` +- `ActualLimitAmountSide` +- `SlippageBps` + +## Internal Enum Mapping + +These fields are stored internally as `uint8` enums and serialized as strings in JSON / debug output. + +### `SwapMode` + +| Raw Value | Name | Serialized Value | +| --- | --- | --- | +| `0` | `SwapModeUnknown` | `""` | +| `1` | `SwapModeExactIn` | `"exact_in"` | +| `2` | `SwapModeExactOut` | `"exact_out"` | + +### `SwapAmountSide` + +Used by: + +- `FixedAmountSide` +- `LimitAmountSide` +- `ActualLimitAmountSide` + +| Raw Value | Name | Serialized Value | +| --- | --- | --- | +| `0` | `SwapAmountSideUnknown` | `""` | +| `1` | `SwapAmountSideBase` | `"base"` | +| `2` | `SwapAmountSideQuote` | `"quote"` | + +### `SwapLimitType` + +Used by: + +- `LimitAmountType` + +| Raw Value | Name | Serialized Value | +| --- | --- | --- | +| `0` | `SwapLimitTypeUnknown` | `""` | +| `1` | `SwapLimitTypeMinOut` | `"min_out"` | +| `2` | `SwapLimitTypeMaxIn` | `"max_in"` | + +## Calculation Rules + +- `exact_in` + - `SlippageBps = (actual_out - min_out) / actual_out * 10000` +- `exact_out` + - `SlippageBps = (max_in - actual_in) / max_in * 10000` + +Interpretation: + +- Positive: execution is better than the user limit +- Zero: execution lands exactly on the user limit +- `10000`: user limit is effectively unbounded on the constrained side (for example `min_out = 0`) +- Negative: this usually indicates an incorrect parser-side mapping or inconsistent source data + +This definition makes `SlippageBps` a bounded "remaining headroom to the user's limit" metric for successful swaps: + +- `exact_in`: how much output headroom remained, measured against the realized output +- `exact_out`: how much input headroom remained, measured against the allowed max input + +## Protocol Mapping + +| Protocol | Method Semantics | `SwapMode` | `FixedAmount` | `LimitAmountType` | `LimitAmount` | `ActualLimitAmount` | +| --- | --- | --- | --- | --- | --- | --- | +| `Pump` | `buy` | `exact_out` | target token amount | `max_in` | max SOL in | actual SOL in | +| `Pump` | `buy_exact_sol_in` | `exact_in` | SOL in | `min_out` | min token out | actual token out | +| `Pump` | `sell` | `exact_in` | token in | `min_out` | min SOL out | actual SOL out | +| `PumpAMM` | `buy` | `exact_out` | target base out | `max_in` | max quote in | actual quote in | +| `PumpAMM` | `buy_exact_quote_in` | `exact_in` | quote in | `min_out` | min base out | actual base out | +| `PumpAMM` | `sell` | `exact_in` | base in | `min_out` | min quote out | actual quote out | +| `MeteoraDLMM` | `swap` / `swap2` / `swap_with_price_impact` | `exact_in` | `AmountIn` | `min_out` | instruction min out | event output | +| `MeteoraDLMM` | `swap_exact_out` / `swap_exact_out2` | `exact_out` | `OutAmount` | `max_in` | `MaxInAmount` | event input | +| `MeteoraPools` | `swap` | `exact_in` | `InAmount` | `min_out` | `MinimumOutAmount` | actual output side | +| `MeteoraBondingCurve` | `swap` / `swap2` | `exact_in` | `AmountIn` | `min_out` | `MinimumAmountOut` | actual output side | +| `MeteoraAmmV2` | `swap` / `swap2` exact-in or partial | `exact_in` | params input side | `min_out` | params output threshold | actual output side | +| `MeteoraAmmV2` | `swap` / `swap2` exact-out | `exact_out` | params target output | `max_in` | params max input | actual input side | +| `RaydiumLaunchLab` | `*_ExactIn` | `exact_in` | `Amount` | `min_out` | `OtherAmountThreshold` | actual output side | +| `RaydiumLaunchLab` | `*_ExactOut` | `exact_out` | `Amount` | `max_in` | `OtherAmountThreshold` | actual input side | +| `RaydiumCPMM` | `swap_base_input` | `exact_in` | `AmountIn` | `min_out` | `MinimumAmountOut` | actual output side | +| `RaydiumCPMM` | `swap_base_output` | `exact_out` | `AmountOut` | `max_in` | `MaxAmountIn` | actual input side | +| `RaydiumCLMM` | `swap` / `swap_v2` | `exact_in` or `exact_out` | `amount` | `min_out` or `max_in` | `other_amount_threshold` | opposite-side actual amount | +| `RaydiumV4` | `swap_base_in` / `swap_base_in_v2` | `exact_in` | `amount_in` | `min_out` | `minimum_amount_out` | actual output side | +| `RaydiumV4` | `swap_base_out` / `swap_base_out_v2` | `exact_out` | `amount_out` | `max_in` | `max_amount_in` | actual input side | +| `OrcaWhirlpool` | `swap` / `swap_v2` | `exact_in` or `exact_out` | `amount` | `min_out` or `max_in` | `other_amount_threshold` | opposite-side actual amount | +| `OrcaWhirlpool` | `two_hop_swap` / `two_hop_swap_v2` | route-level | route specified amount | `min_out` or `max_in` | route threshold | route final output or total input | + +## Notes + +- `Pump` quote side is normalized to `wSOL` in the slippage fields, even when legacy `Swap.QuoteMint` is not populated. +- `OrcaWhirlpool` two-hop instructions use route-level slippage. The normalized slippage fields are attached to the first returned swap entry. +- `MeteoraAmmV2` uses `SwapMode.ExactIn`, `SwapMode.PartialFill`, and `SwapMode.ExactOut`. `PartialFill` is treated like exact-in for slippage purposes because it still uses a minimum-output threshold. + +## DAMM v2 Verification + +The `MeteoraAmmV2` mapping has been checked against the program IDL for `cpamdpZCGKUy5JxQXB4dcpGPiikHawvSWAd6mEn1sGG`. + +- `swap` + - instruction arg type: `SwapParameters` + - fields: `amountIn`, `minimumAmountOut` + - semantics: exact-in +- `swap2`: + - instruction / event arg type: `SwapParameters2` + - `amount0`: "When it's exact in, partial fill, this will be amount_in. When it's exact out, this will be amount_out" + - `amount1`: "When it's exact in, partial fill, this will be minimum_amount_out. When it's exact out, this will be maximum_amount_in" + - `swapMode`: `ExactIn`, `PartialFill`, `ExactOut` + +The downloaded JSON IDL references `SwapMode` in the field docs but does not inline the enum body itself. In this repository, the raw `swapMode` values are interpreted consistently as: + +- `0 = ExactIn` +- `1 = PartialFill` +- `2 = ExactOut` + +That means the parser mapping is: + +- `swap2` + `ExactIn` / `PartialFill` + - `FixedAmount = amount0` + - `LimitAmount = amount1` + - `LimitAmountType = min_out` +- `swap2` + `ExactOut` + - `FixedAmount = amount0` + - `LimitAmount = amount1` + - `LimitAmountType = max_in` + +## Source Files + +- `Swap` normalized fields: `tx.go` +- Shared slippage mapping helpers: `swap_amounts.go` +- Protocol parsers: + - `pump.go` + - `pumpamm.go` + - `metaoradlmm.go` + - `metaorapool.go` + - `meteora_bonding_curve.go` + - `meteoradamm.go` + - `raydiumlaunchlab.go` + - `raydiumcpmm.go` + - `raydiumclmm.go` + - `raydiumv4.go` + - `orcawhirpool.go` diff --git a/cmd/rpc_parse/main.go b/cmd/rpc_parse/main.go index 842cab2..59814e4 100644 --- a/cmd/rpc_parse/main.go +++ b/cmd/rpc_parse/main.go @@ -92,6 +92,18 @@ func main() { fmt.Printf(" quote_mint: %s (decimals=%d)\n", swap.QuoteMint, swap.QuoteMintDecimals) fmt.Printf(" base_amount: %s\n", swap.BaseAmount.String()) fmt.Printf(" quote_amount: %s\n", swap.QuoteAmount.String()) + if swap.SwapMode != pump_parser.SwapModeUnknown { + fmt.Printf(" swap_mode: %s\n", swap.SwapMode.String()) + fmt.Printf(" fixed_amount: %s\n", swap.FixedAmount.String()) + fmt.Printf(" fixed_amount_side: %s\n", swap.FixedAmountSide.String()) + fmt.Printf(" fixed_mint: %s\n", swap.FixedMint) + fmt.Printf(" limit_amount_type: %s\n", swap.LimitAmountType.String()) + fmt.Printf(" limit_amount: %s\n", swap.LimitAmount.String()) + fmt.Printf(" limit_amount_side: %s\n", swap.LimitAmountSide.String()) + fmt.Printf(" limit_mint: %s\n", swap.LimitMint) + fmt.Printf(" actual_limit_amount: %s\n", swap.ActualLimitAmount.String()) + fmt.Printf(" slippage_bps: %s\n", swap.SlippageBps.String()) + } if !swap.FeeAmount.IsZero() || swap.FeeSide != "" { fmt.Printf(" fee_amount: %s\n", swap.FeeAmount.String()) fmt.Printf(" lp_fee_amount: %s\n", swap.LpFeeAmount.String()) diff --git a/metaoradlmm.go b/metaoradlmm.go index 24ea532..798403a 100644 --- a/metaoradlmm.go +++ b/metaoradlmm.go @@ -666,22 +666,33 @@ func metaoradlmmSwapParser(tx *Tx, instruction Instruction, innerInstructions In } discriminator := *(*[8]byte)(decode[:8]) + var swapMode SwapMode + var fixedAmount decimal.Decimal + var limitAmount decimal.Decimal switch discriminator { case meteoraDlmmSwapDiscriminator, meteoraDlmmSwap2Discriminator: var args meteoraDlmmSwapArgs if err := agbinary.NewBorshDecoder(decode[8:]).Decode(&args); err != nil { return nil, increaseOffset(offset), fmt.Errorf("meteora dlmm swap decode error: %v, offset, %d, %d", err, offset[0], offset[1]) } + swapMode = SwapModeExactIn + fixedAmount = decimal.NewFromUint64(args.AmountIn) + limitAmount = decimal.NewFromUint64(args.MinAmountOut) case meteoraDlmmSwapExactOutDiscriminator, meteoraDlmmSwapExactOut2Discriminator: var args meteoraDlmmSwapExactOutArgs if err := agbinary.NewBorshDecoder(decode[8:]).Decode(&args); err != nil { return nil, increaseOffset(offset), fmt.Errorf("meteora dlmm swap_exact_out decode error: %v, offset, %d, %d", err, offset[0], offset[1]) } + swapMode = SwapModeExactOut + fixedAmount = decimal.NewFromUint64(args.OutAmount) + limitAmount = decimal.NewFromUint64(args.MaxInAmount) case meteoraDlmmSwapWithPriceImpactDiscriminator, meteoraDlmmSwapWithPriceImpact2Discriminator: var args meteoraDlmmSwapWithPriceImpactArgs if err := agbinary.NewBorshDecoder(decode[8:]).Decode(&args); err != nil { return nil, increaseOffset(offset), fmt.Errorf("meteora dlmm swap_with_price_impact decode error: %v, offset, %d, %d", err, offset[0], offset[1]) } + swapMode = SwapModeExactIn + fixedAmount = decimal.NewFromUint64(args.AmountIn) default: return nil, increaseOffset(offset), InstructionIgnoredError } @@ -861,6 +872,7 @@ func metaoradlmmSwapParser(tx *Tx, instruction Instruction, innerInstructions In StartBinId: swapEvent.StartBinId, EndBinId: swapEvent.EndBinId, } + swap.SetSwapAmountInfo(swapMode, fixedAmount, limitAmount) return []Swap{swap}, offset, nil } diff --git a/metaorapool.go b/metaorapool.go index 21f7554..0675527 100644 --- a/metaorapool.go +++ b/metaorapool.go @@ -15,6 +15,11 @@ type metaoraPoolInitializePoolData struct { TokenBAmount uint64 `json:"tokenBAmount"` } +type metaoraPoolSwapArgs struct { + InAmount uint64 + MinimumOutAmount uint64 +} + var ( meteoraVaultProgram = solana.MustPublicKeyFromBase58("24Uqj9JCLxUeoC3hGfh5W3s9FM9uCHDS2SG3LYwBpyTi") meteoraVaultDepositDiscriminator = []byte{0xf2, 0x23, 0xc6, 0x89, 0x52, 0xe1, 0xf2, 0xb6} @@ -726,6 +731,10 @@ func metaoraPoolRemoveLiquidity(tx *Tx, instruction Instruction, innerInstructio } func metaoraPoolSwap(tx *Tx, instruction Instruction, innerInstructions InnerInstructions, offset [2]uint) ([]Swap, [2]uint, error) { + var args metaoraPoolSwapArgs + if err := agbinary.NewBorshDecoder(instruction.Data[8:]).Decode(&args); err != nil { + return nil, increaseOffset(offset), fmt.Errorf("failed to decode meteora pools swap args: %w", err) + } pool := tx.rawTx.accountList[instruction.Accounts[0]] payer := tx.rawTx.accountList[instruction.Accounts[12]] @@ -874,5 +883,10 @@ func metaoraPoolSwap(tx *Tx, instruction Instruction, innerInstructions InnerIns EntryContract: entryContract, }, } + swaps[0].SetSwapAmountInfo( + SwapModeExactIn, + decimal.NewFromUint64(args.InAmount), + decimal.NewFromUint64(args.MinimumOutAmount), + ) return swaps, offset, nil } diff --git a/meteora_bonding_curve.go b/meteora_bonding_curve.go index b773a9a..cc1223e 100644 --- a/meteora_bonding_curve.go +++ b/meteora_bonding_curve.go @@ -385,5 +385,12 @@ func metaBcSwapParser(tx *Tx, instruction Instruction, innerInstructions InnerIn EntryContract: entryContract, }, } + if swapEvent.Params != nil { + swaps[0].SetSwapAmountInfo( + SwapModeExactIn, + decimal.NewFromUint64(swapEvent.Params.AmountIn), + decimal.NewFromUint64(swapEvent.Params.MinimumAmountOut), + ) + } return swaps, offset, nil } diff --git a/meteoradamm.go b/meteoradamm.go index b3ad244..40445ee 100644 --- a/meteoradamm.go +++ b/meteoradamm.go @@ -188,6 +188,42 @@ type meteoraDammSwapEvent struct { ReserveBAmount uint64 } +func meteoraDammSwapAmountInfo(event string, params *struct { + Amount0 uint64 + Amount1 uint64 + SwapMode uint8 +}) (swapMode SwapMode, fixedAmount decimal.Decimal, limitAmount decimal.Decimal, ok bool) { + if params == nil { + return SwapModeUnknown, decimal.Zero, decimal.Zero, false + } + + // Meteora DAMM v2 IDL defines: + // - swap: SwapParameters{ amountIn, minimumAmountOut } + // - swap2: SwapParameters2{ amount0, amount1, swapMode } + // - ExactIn / PartialFill: amount0=amount_in, amount1=minimum_amount_out + // - ExactOut: amount0=amount_out, amount1=maximum_amount_in + // + // The emitted event is normalized as token A <-> token B: + // - `sell` means A -> B, so A is the input side and B is the output side + // - `buy` means B -> A, so B is the input side and A is the output side + switch params.SwapMode { + case 0, 1: // ExactIn / PartialFill + swapMode = SwapModeExactIn + if event == TxEventSell { + return swapMode, decimal.NewFromUint64(params.Amount0), decimal.NewFromUint64(params.Amount1), true + } + return swapMode, decimal.NewFromUint64(params.Amount1), decimal.NewFromUint64(params.Amount0), true + case 2: // ExactOut + swapMode = SwapModeExactOut + if event == TxEventSell { + return swapMode, decimal.NewFromUint64(params.Amount1), decimal.NewFromUint64(params.Amount0), true + } + return swapMode, decimal.NewFromUint64(params.Amount0), decimal.NewFromUint64(params.Amount1), true + default: + return SwapModeUnknown, decimal.Zero, decimal.Zero, false + } +} + func meteoraDammV2Swap(tx *Tx, instruction Instruction, innerInstructions InnerInstructions, offset [2]uint) ([]Swap, [2]uint, error) { if len(instruction.Accounts) < 9 { return nil, increaseOffset(offset), fmt.Errorf("invalid instruction accounts length") @@ -276,28 +312,30 @@ func meteoraDammV2Swap(tx *Tx, instruction Instruction, innerInstructions InnerI return nil, offset, fmt.Errorf("invalid trade direction") } - return []Swap{ - { - Program: SolProgramMeteoraAmmV2, - Event: event, - Pool: swapEvent.Pool, - BaseMint: baseMint, - QuoteMint: quoteMint, - BaseTokenProgram: baseTokenProgram, - QuoteTokenProgram: quoteTokenProgram, - Creator: solana.PublicKey{}, - BaseMintDecimals: baseMintDecimals, - QuoteMintDecimals: quoteMintDecimals, - User: payer, - BaseAmount: baseAmount, - QuoteAmount: quoteAmount, - BaseReserve: baseReserve, - QuoteReserve: quoteReserve, - UserBaseBalance: userBase, - UserQuoteBalance: userQuote, - EntryContract: entryContract, - }, - }, offset, nil + swap := Swap{ + Program: SolProgramMeteoraAmmV2, + Event: event, + Pool: swapEvent.Pool, + BaseMint: baseMint, + QuoteMint: quoteMint, + BaseTokenProgram: baseTokenProgram, + QuoteTokenProgram: quoteTokenProgram, + Creator: solana.PublicKey{}, + BaseMintDecimals: baseMintDecimals, + QuoteMintDecimals: quoteMintDecimals, + User: payer, + BaseAmount: baseAmount, + QuoteAmount: quoteAmount, + BaseReserve: baseReserve, + QuoteReserve: quoteReserve, + UserBaseBalance: userBase, + UserQuoteBalance: userQuote, + EntryContract: entryContract, + } + if swapMode, fixedAmount, limitAmount, ok := meteoraDammSwapAmountInfo(event, swapEvent.Params); ok { + swap.SetSwapAmountInfo(swapMode, fixedAmount, limitAmount) + } + return []Swap{swap}, offset, nil } diff --git a/orcawhirpool.go b/orcawhirpool.go index 9d1f2ff..5ba7f56 100644 --- a/orcawhirpool.go +++ b/orcawhirpool.go @@ -1,12 +1,33 @@ package pump_parser import ( + "encoding/binary" "fmt" "github.com/gagliardetto/solana-go" "github.com/shopspring/decimal" ) +func decodeOrcaWhirlpoolSwapArgs(data []byte) (amount uint64, otherAmountThreshold uint64, amountSpecifiedIsInput bool, err error) { + if len(data) < 42 { + return 0, 0, false, fmt.Errorf("orca whirlpool swap instruction data too short") + } + amount = binary.LittleEndian.Uint64(data[8:16]) + otherAmountThreshold = binary.LittleEndian.Uint64(data[16:24]) + amountSpecifiedIsInput = data[40] != 0 + return amount, otherAmountThreshold, amountSpecifiedIsInput, nil +} + +func decodeOrcaWhirlpoolTwoHopSwapArgs(data []byte) (amount uint64, otherAmountThreshold uint64, amountSpecifiedIsInput bool, err error) { + if len(data) < 27 { + return 0, 0, false, fmt.Errorf("orca whirlpool two-hop swap instruction data too short") + } + amount = binary.LittleEndian.Uint64(data[8:16]) + otherAmountThreshold = binary.LittleEndian.Uint64(data[16:24]) + amountSpecifiedIsInput = data[24] != 0 + return amount, otherAmountThreshold, amountSpecifiedIsInput, nil +} + func orcaWhirPoolParser(tx *Tx, instruction Instruction, innerInstructions InnerInstructions, offset [2]uint) ([]Swap, [2]uint, error) { if !tx.rawTx.accountList[instruction.ProgramIDIndex].Equals(orcaProgramID) { return nil, increaseOffset(offset), fmt.Errorf("orcawhirpoolprogram instruction not found, offset, %d, %d", offset[0], offset[1]) @@ -709,6 +730,14 @@ func orcaWhirPoolSwapParser(tx *Tx, instruction Instruction, innerInstructions I } var entryContract = tx.rawTx.accountList[tx.rawTx.Transaction.Message.Instructions[offset[0]].ProgramIDIndex] + amount, otherAmountThreshold, amountSpecifiedIsInput, err := decodeOrcaWhirlpoolSwapArgs(instruction.Data) + if err != nil { + return nil, increaseOffset(offset), err + } + swapMode := SwapModeExactOut + if amountSpecifiedIsInput { + swapMode = SwapModeExactIn + } user := tx.rawTx.accountList[instruction.Accounts[1]] pool := tx.rawTx.accountList[instruction.Accounts[2]] @@ -781,8 +810,7 @@ func orcaWhirPoolSwapParser(tx *Tx, instruction Instruction, innerInstructions I return nil, offset, fmt.Errorf("orca whirpool swap failed to find both base and quote token transfer in inner instructions") } - return []Swap{ - { + swap := Swap{ Program: SolProgramOrcaWhirPool, Event: event, Pool: pool, @@ -800,8 +828,10 @@ func orcaWhirPoolSwapParser(tx *Tx, instruction Instruction, innerInstructions I UserQuoteBalance: userQuote, User: user, EntryContract: entryContract, - }, - }, offset, nil + } + swap.SetSwapAmountInfo(swapMode, decimal.NewFromUint64(amount), decimal.NewFromUint64(otherAmountThreshold)) + + return []Swap{swap}, offset, nil } func orcaWhirPoolSwapV2Parser(tx *Tx, instruction Instruction, innerInstructions InnerInstructions, offset [2]uint) ([]Swap, [2]uint, error) { @@ -810,6 +840,14 @@ func orcaWhirPoolSwapV2Parser(tx *Tx, instruction Instruction, innerInstructions } var entryContract = tx.rawTx.accountList[tx.rawTx.Transaction.Message.Instructions[offset[0]].ProgramIDIndex] + amount, otherAmountThreshold, amountSpecifiedIsInput, err := decodeOrcaWhirlpoolSwapArgs(instruction.Data) + if err != nil { + return nil, increaseOffset(offset), err + } + swapMode := SwapModeExactOut + if amountSpecifiedIsInput { + swapMode = SwapModeExactIn + } user := tx.rawTx.accountList[instruction.Accounts[3]] pool := tx.rawTx.accountList[instruction.Accounts[4]] @@ -883,8 +921,7 @@ func orcaWhirPoolSwapV2Parser(tx *Tx, instruction Instruction, innerInstructions } offset[1] += uint(skipOffset + 1) - return []Swap{ - { + swap := Swap{ Program: SolProgramOrcaWhirPool, Event: event, Pool: pool, @@ -902,8 +939,10 @@ func orcaWhirPoolSwapV2Parser(tx *Tx, instruction Instruction, innerInstructions UserQuoteBalance: userQuote, User: user, EntryContract: entryContract, - }, - }, offset, nil + } + swap.SetSwapAmountInfo(swapMode, decimal.NewFromUint64(amount), decimal.NewFromUint64(otherAmountThreshold)) + + return []Swap{swap}, offset, nil } func orcaWhirPoolTwoHopSwapParser(tx *Tx, instruction Instruction, innerInstructions InnerInstructions, offset [2]uint) ([]Swap, [2]uint, error) { @@ -912,6 +951,14 @@ func orcaWhirPoolTwoHopSwapParser(tx *Tx, instruction Instruction, innerInstruct } var entryContract = tx.rawTx.accountList[tx.rawTx.Transaction.Message.Instructions[offset[0]].ProgramIDIndex] + amountSpecified, otherAmountThreshold, amountSpecifiedIsInput, err := decodeOrcaWhirlpoolTwoHopSwapArgs(instruction.Data) + if err != nil { + return nil, increaseOffset(offset), err + } + swapMode := SwapModeExactOut + if amountSpecifiedIsInput { + swapMode = SwapModeExactIn + } user := tx.rawTx.accountList[instruction.Accounts[1]] pool1 := tx.rawTx.accountList[instruction.Accounts[2]] @@ -1082,6 +1129,29 @@ func orcaWhirPoolTwoHopSwapParser(tx *Tx, instruction Instruction, innerInstruct EntryContract: entryContract, } } + fixedSide := fixedSwapAmountSide(swaps[0].Event, swapMode) + fixedMint := swapMintForSide(swaps[0].BaseMint, swaps[0].QuoteMint, fixedSide) + limitSide := oppositeSwapAmountSide(fixedSide) + limitMint := swapMintForSide(swaps[1].BaseMint, swaps[1].QuoteMint, limitSide) + actualLimitAmount := swapAmountForSide(swaps[1].BaseAmount, swaps[1].QuoteAmount, limitSide) + if swapMode == SwapModeExactOut { + fixedSide = fixedSwapAmountSide(swaps[1].Event, swapMode) + fixedMint = swapMintForSide(swaps[1].BaseMint, swaps[1].QuoteMint, fixedSide) + limitSide = oppositeSwapAmountSide(fixedSwapAmountSide(swaps[0].Event, swapMode)) + limitMint = swapMintForSide(swaps[0].BaseMint, swaps[0].QuoteMint, limitSide) + actualLimitAmount = swapAmountForSide(swaps[0].BaseAmount, swaps[0].QuoteAmount, limitSide) + } + swaps[0].SetSwapAmountInfoDetailed( + swapMode, + decimal.NewFromUint64(amountSpecified), + fixedSide, + fixedMint, + limitSwapAmountType(swapMode), + decimal.NewFromUint64(otherAmountThreshold), + limitSide, + limitMint, + actualLimitAmount, + ) return swaps, offset, nil } @@ -1091,6 +1161,14 @@ func orcaWhirPoolTwoHopSwapV2Parser(tx *Tx, instruction Instruction, innerInstru } var entryContract = tx.rawTx.accountList[tx.rawTx.Transaction.Message.Instructions[offset[0]].ProgramIDIndex] + amountSpecified, otherAmountThreshold, amountSpecifiedIsInput, err := decodeOrcaWhirlpoolTwoHopSwapArgs(instruction.Data) + if err != nil { + return nil, increaseOffset(offset), err + } + swapMode := SwapModeExactOut + if amountSpecifiedIsInput { + swapMode = SwapModeExactIn + } user := tx.rawTx.accountList[instruction.Accounts[14]] pool1 := tx.rawTx.accountList[instruction.Accounts[0]] @@ -1258,5 +1336,28 @@ func orcaWhirPoolTwoHopSwapV2Parser(tx *Tx, instruction Instruction, innerInstru EntryContract: entryContract, } } + fixedSide := fixedSwapAmountSide(swaps[0].Event, swapMode) + fixedMint := swapMintForSide(swaps[0].BaseMint, swaps[0].QuoteMint, fixedSide) + limitSide := oppositeSwapAmountSide(fixedSide) + limitMint := swapMintForSide(swaps[1].BaseMint, swaps[1].QuoteMint, limitSide) + actualLimitAmount := swapAmountForSide(swaps[1].BaseAmount, swaps[1].QuoteAmount, limitSide) + if swapMode == SwapModeExactOut { + fixedSide = fixedSwapAmountSide(swaps[1].Event, swapMode) + fixedMint = swapMintForSide(swaps[1].BaseMint, swaps[1].QuoteMint, fixedSide) + limitSide = oppositeSwapAmountSide(fixedSwapAmountSide(swaps[0].Event, swapMode)) + limitMint = swapMintForSide(swaps[0].BaseMint, swaps[0].QuoteMint, limitSide) + actualLimitAmount = swapAmountForSide(swaps[0].BaseAmount, swaps[0].QuoteAmount, limitSide) + } + swaps[0].SetSwapAmountInfoDetailed( + swapMode, + decimal.NewFromUint64(amountSpecified), + fixedSide, + fixedMint, + limitSwapAmountType(swapMode), + decimal.NewFromUint64(otherAmountThreshold), + limitSide, + limitMint, + actualLimitAmount, + ) return swaps, offset, nil } diff --git a/pump.go b/pump.go index ccf7501..81d687b 100644 --- a/pump.go +++ b/pump.go @@ -218,6 +218,31 @@ type PumpTradeArgs struct { Amount2 uint64 } +func pumpTradeAmountInfoFromArgs(args PumpTradeArgs) (swapMode SwapMode, fixedAmount decimal.Decimal, limitAmount decimal.Decimal, ok bool) { + switch { + case bytes.Equal(args.Discriminator[:], pumpBuyV2Discriminator[:]): + return SwapModeExactIn, decimal.NewFromUint64(args.Amount1), decimal.NewFromUint64(args.Amount2), true + case bytes.Equal(args.Discriminator[:], pumpBuyDiscriminator[:]): + return SwapModeExactOut, decimal.NewFromUint64(args.Amount1), decimal.NewFromUint64(args.Amount2), true + case bytes.Equal(args.Discriminator[:], pumpSellDiscriminator[:]): + return SwapModeExactIn, decimal.NewFromUint64(args.Amount1), decimal.NewFromUint64(args.Amount2), true + default: + return SwapModeUnknown, decimal.Zero, decimal.Zero, false + } +} + +func normalizePumpQuoteSideMint(s *Swap) { + if s.FixedAmountSide == SwapAmountSideQuote && s.FixedMint.IsZero() { + s.FixedMint = wSolMint + } + if s.LimitAmountSide == SwapAmountSideQuote && s.LimitMint.IsZero() { + s.LimitMint = wSolMint + } + if s.ActualLimitAmountSide == SwapAmountSideQuote && s.LimitMint.IsZero() { + s.LimitMint = wSolMint + } +} + func failedTxBuyOrSellParser(tx *Tx, instruction Instruction, innerInstructions InnerInstructions, offset [2]uint) ([]Swap, [2]uint, error) { if tx.Err == nil || tx.Err.UnKnown != "" { return nil, increaseOffset(offset), fmt.Errorf("tx pump failed but error is nil, offset, %d, %d", offset[0], offset[1]) @@ -315,6 +340,10 @@ func failedTxBuyOrSellParser(tx *Tx, instruction Instruction, innerInstructions EntryContract: entryContract, }, } + if swapMode, fixedAmount, limitAmount, ok := pumpTradeAmountInfoFromArgs(args); ok { + swaps[0].SetSwapAmountInfo(swapMode, fixedAmount, limitAmount) + normalizePumpQuoteSideMint(&swaps[0]) + } return swaps, offset, nil } @@ -466,6 +495,13 @@ func BuyOrSellParser(tx *Tx, instruction Instruction, innerInstructions InnerIns Cashback: isCashbackCoin, }, } + var args PumpTradeArgs + if err := agbinary.NewBorshDecoder(instruction.Data[:]).Decode(&args); err == nil { + if swapMode, fixedAmount, limitAmount, ok := pumpTradeAmountInfoFromArgs(args); ok { + swaps[0].SetSwapAmountInfo(swapMode, fixedAmount, limitAmount) + normalizePumpQuoteSideMint(&swaps[0]) + } + } if completed { swaps = append(swaps, Swap{ Program: SolProgramPump, diff --git a/pump_test.go b/pump_test.go index ff5ad80..04daf65 100644 --- a/pump_test.go +++ b/pump_test.go @@ -11,6 +11,31 @@ import ( "github.com/mr-tron/base58" ) +type legacyPumpTradeEvent struct { + Mint solana.PublicKey + SolAmount uint64 + TokenAmount uint64 + IsBuy bool + User solana.PublicKey + Timestamp int64 + VirtualSolReserves uint64 + VirtualTokenReserves uint64 + RealSolReserves uint64 + RealTokenReserves uint64 + FeeRecipient solana.PublicKey + FeeBasisPoints uint64 + Fee uint64 + Creator solana.PublicKey + CreatorFeeBasisPoints uint64 + CreatorFee uint64 + TrackVolume bool + TotalUnclaimedTokens uint64 + TotalClaimedTokens uint64 + CurrentSolVolume uint64 + LastUpdateTimestamp int64 + IxName string +} + func TestTradeEvent(t *testing.T) { hexData := "e445a52e51cb9a1dbddb7fd34ee661ee051d1834b36cc6f04cc5bd998d53ab2a566a0ca2415bcfad5f9ed6941a851d3f84ecb200000000006c267d17170000000190d2c525ef0ea205f4b4abfdb6eaaf37fcb5a1b1dec2e2689448eecab6ba93b6c922246900000000c314f11a0d000000be71bf9e22080200c368cd1e06000000bed9ac52910901004ac2f8d0dd5cbc97e3289c197cb5062a54f3d956b9ce6e5115f96567aa5cb3e65f000000000000002c6a010000000000c9e17c171227a50a5b62e3a4a3f8ff4fafe0bca9c332bdf7f32eedbc4229604d1e000000000000005f72000000000000010000000000000000000000000000000000000000000000000000000000000000100000006275795f65786163745f736f6c5f696e" d, err := hex.DecodeString(hexData) @@ -18,13 +43,21 @@ func TestTradeEvent(t *testing.T) { t.Errorf("Failed to decode base64 data: %v", err) } - var tradeEvent PumpTradeEvent + var tradeEvent legacyPumpTradeEvent err = agbinary.NewBorshDecoder(d[16:]).Decode(&tradeEvent) if err != nil { - t.Errorf("Failed to deserialize trade event: %v", err) + t.Fatalf("Failed to deserialize trade event: %v", err) + } + if tradeEvent.IxName != "buy_exact_sol_in" { + t.Fatalf("IxName = %q, want buy_exact_sol_in", tradeEvent.IxName) + } + if tradeEvent.SolAmount != 11725956 { + t.Fatalf("SolAmount = %d, want 11725956", tradeEvent.SolAmount) + } + if !tradeEvent.IsBuy { + t.Fatalf("IsBuy = false, want true") } - t.Logf("Trade Event: %+v", tradeEvent) xx, err := base58.Decode("3Bxs48EzTZB4tzRd") diff --git a/pumpamm.go b/pumpamm.go index 474a36d..a96fadf 100644 --- a/pumpamm.go +++ b/pumpamm.go @@ -261,6 +261,19 @@ type PumpSwapArgs struct { Amount2 uint64 } +func pumpAmmSwapAmountInfoFromArgs(args PumpSwapArgs) (swapMode SwapMode, fixedAmount decimal.Decimal, limitAmount decimal.Decimal, ok bool) { + switch { + case bytes.Equal(args.Discriminator[:], pumpAmmBuyV2Discriminator[:]): + return SwapModeExactIn, decimal.NewFromUint64(args.Amount1), decimal.NewFromUint64(args.Amount2), true + case bytes.Equal(args.Discriminator[:], pumpAmmBuyDiscriminator[:]): + return SwapModeExactOut, decimal.NewFromUint64(args.Amount1), decimal.NewFromUint64(args.Amount2), true + case bytes.Equal(args.Discriminator[:], pumpAmmSellDiscriminator[:]): + return SwapModeExactIn, decimal.NewFromUint64(args.Amount1), decimal.NewFromUint64(args.Amount2), true + default: + return SwapModeUnknown, decimal.Zero, decimal.Zero, false + } +} + func failedTxAmmBuyParser(tx *Tx, instruction Instruction, innerInstructions InnerInstructions, offset [2]uint) ([]Swap, [2]uint, error) { if tx.Err == nil || tx.Err.UnKnown != "" { return nil, increaseOffset(offset), fmt.Errorf("tx pump amm sell failed but error is nil, offset, %d, %d", offset[0], offset[1]) @@ -361,28 +374,30 @@ func failedTxAmmBuyParser(tx *Tx, instruction Instruction, innerInstructions Inn } baseReserve := getAccountBalanceAfterTx(result, instruction.Accounts[7]) quoteReserve := getAccountBalanceAfterTx(result, instruction.Accounts[8]) - return []Swap{ - { - Program: SolProgramPumpAMM, - Event: event, - Pool: tx.rawTx.accountList[instruction.Accounts[0]], - BaseMint: baseMint, - QuoteMint: quoteMint, - BaseTokenProgram: baseTokenProgram, - QuoteTokenProgram: quoteTokenProgram, - BaseMintDecimals: baseMintDecimals, - QuoteMintDecimals: quoteMintDecimals, - User: eventUser, - BaseAmount: decimal.NewFromUint64(tokenAmount), - QuoteAmount: decimal.NewFromUint64(quoteAmount), - BaseReserve: baseReserve, - QuoteReserve: quoteReserve, - Mayhem: isMayhemPump(result.accountList[instruction.Accounts[9]]), - UserBaseBalance: userBase, - UserQuoteBalance: userQuote, - EntryContract: entryContract, - }, - }, offset, nil + swap := Swap{ + Program: SolProgramPumpAMM, + Event: event, + Pool: tx.rawTx.accountList[instruction.Accounts[0]], + BaseMint: baseMint, + QuoteMint: quoteMint, + BaseTokenProgram: baseTokenProgram, + QuoteTokenProgram: quoteTokenProgram, + BaseMintDecimals: baseMintDecimals, + QuoteMintDecimals: quoteMintDecimals, + User: eventUser, + BaseAmount: decimal.NewFromUint64(tokenAmount), + QuoteAmount: decimal.NewFromUint64(quoteAmount), + BaseReserve: baseReserve, + QuoteReserve: quoteReserve, + Mayhem: isMayhemPump(result.accountList[instruction.Accounts[9]]), + UserBaseBalance: userBase, + UserQuoteBalance: userQuote, + EntryContract: entryContract, + } + if swapMode, fixedAmount, limitAmount, ok := pumpAmmSwapAmountInfoFromArgs(args); ok { + swap.SetSwapAmountInfo(swapMode, fixedAmount, limitAmount) + } + return []Swap{swap}, offset, nil } func failedTxAmmSellParser(tx *Tx, instruction Instruction, innerInstructions InnerInstructions, offset [2]uint) ([]Swap, [2]uint, error) { @@ -479,28 +494,30 @@ func failedTxAmmSellParser(tx *Tx, instruction Instruction, innerInstructions In } baseReserve := getAccountBalanceAfterTx(result, instruction.Accounts[7]) quoteReserve := getAccountBalanceAfterTx(result, instruction.Accounts[8]) - return []Swap{ - { - Program: SolProgramPumpAMM, - Event: event, - Pool: tx.rawTx.accountList[instruction.Accounts[0]], - BaseMint: baseMint, - QuoteMint: quoteMint, - BaseTokenProgram: baseTokenProgram, - QuoteTokenProgram: quoteTokenProgram, - BaseMintDecimals: baseMintDecimals, - QuoteMintDecimals: quoteMintDecimals, - User: eventUser, - BaseAmount: decimal.NewFromUint64(tokenAmount), - QuoteAmount: decimal.NewFromUint64(quoteAmount), - BaseReserve: baseReserve, - QuoteReserve: quoteReserve, - Mayhem: isMayhemPump(result.accountList[instruction.Accounts[9]]), - UserBaseBalance: userBase, - UserQuoteBalance: userQuote, - EntryContract: entryContract, - }, - }, offset, nil + swap := Swap{ + Program: SolProgramPumpAMM, + Event: event, + Pool: tx.rawTx.accountList[instruction.Accounts[0]], + BaseMint: baseMint, + QuoteMint: quoteMint, + BaseTokenProgram: baseTokenProgram, + QuoteTokenProgram: quoteTokenProgram, + BaseMintDecimals: baseMintDecimals, + QuoteMintDecimals: quoteMintDecimals, + User: eventUser, + BaseAmount: decimal.NewFromUint64(tokenAmount), + QuoteAmount: decimal.NewFromUint64(quoteAmount), + BaseReserve: baseReserve, + QuoteReserve: quoteReserve, + Mayhem: isMayhemPump(result.accountList[instruction.Accounts[9]]), + UserBaseBalance: userBase, + UserQuoteBalance: userQuote, + EntryContract: entryContract, + } + if swapMode, fixedAmount, limitAmount, ok := pumpAmmSwapAmountInfoFromArgs(args); ok { + swap.SetSwapAmountInfo(swapMode, fixedAmount, limitAmount) + } + return []Swap{swap}, offset, nil } func ammBuyParser(tx *Tx, instruction Instruction, innerInstructions InnerInstructions, offset [2]uint) ([]Swap, [2]uint, error) { @@ -599,30 +616,42 @@ func ammBuyParser(tx *Tx, instruction Instruction, innerInstructions InnerInstru userQuote = userQuote.Add(decimal.NewFromUint64(userBalance)) } isCashbackCoin := event.CashbackFeeBasisPoints > 0 || event.Cashback > 0 - return []Swap{ - { - Program: SolProgramPumpAMM, - Event: "buy", - Pool: event.Pool, - BaseMint: baseMint, - QuoteMint: quoteMint, - BaseTokenProgram: baseTokenProgram, - QuoteTokenProgram: quoteTokenProgram, - Creator: event.CoinCreator, - BaseMintDecimals: baseMintDecimals, - QuoteMintDecimals: quoteMintDecimals, - User: eventUser, - BaseAmount: decimal.NewFromUint64(event.BaseAmountOut), - QuoteAmount: decimal.NewFromUint64(event.UserQuoteAmountIn), - BaseReserve: decimal.NewFromUint64(event.PoolBaseTokenReserve - event.BaseAmountOut), - QuoteReserve: decimal.NewFromUint64(event.PoolQuoteTokenReserve + event.QuoteAmountIn), - Mayhem: isMayhemPump(result.accountList[instruction.Accounts[9]]), - Cashback: isCashbackCoin, - UserBaseBalance: userBase, - UserQuoteBalance: userQuote, - EntryContract: entryContract, - }, - }, offset, nil + swap := Swap{ + Program: SolProgramPumpAMM, + Event: "buy", + Pool: event.Pool, + BaseMint: baseMint, + QuoteMint: quoteMint, + BaseTokenProgram: baseTokenProgram, + QuoteTokenProgram: quoteTokenProgram, + Creator: event.CoinCreator, + BaseMintDecimals: baseMintDecimals, + QuoteMintDecimals: quoteMintDecimals, + User: eventUser, + BaseAmount: decimal.NewFromUint64(event.BaseAmountOut), + QuoteAmount: decimal.NewFromUint64(event.UserQuoteAmountIn), + BaseReserve: decimal.NewFromUint64(event.PoolBaseTokenReserve - event.BaseAmountOut), + QuoteReserve: decimal.NewFromUint64(event.PoolQuoteTokenReserve + event.QuoteAmountIn), + Mayhem: isMayhemPump(result.accountList[instruction.Accounts[9]]), + Cashback: isCashbackCoin, + UserBaseBalance: userBase, + UserQuoteBalance: userQuote, + EntryContract: entryContract, + } + if bytes.Equal(instruction.Data[:8], pumpAmmBuyV2Discriminator[:]) { + swap.SetSwapAmountInfo( + SwapModeExactIn, + decimal.NewFromUint64(event.UserQuoteAmountIn), + decimal.NewFromUint64(event.MinBaseAmountOut), + ) + } else { + swap.SetSwapAmountInfo( + SwapModeExactOut, + decimal.NewFromUint64(event.BaseAmountOut), + decimal.NewFromUint64(event.MaxQuoteAmountIn), + ) + } + return []Swap{swap}, offset, nil } func ammSellParser(tx *Tx, instruction Instruction, innerInstructions InnerInstructions, offset [2]uint) ([]Swap, [2]uint, error) { @@ -722,30 +751,34 @@ func ammSellParser(tx *Tx, instruction Instruction, innerInstructions InnerInstr userQuote = userQuote.Add(decimal.NewFromUint64(userBalance)) } isCashbackCoin := event.CashbackFeeBasisPoints > 0 || event.Cashback > 0 - return []Swap{ - { - Program: SolProgramPumpAMM, - Event: "sell", - Pool: event.Pool, - BaseMint: baseMint, - QuoteMint: quoteMint, - BaseTokenProgram: baseTokenProgram, - QuoteTokenProgram: quoteTokenProgram, - Creator: event.CoinCreator, - BaseMintDecimals: baseMintDecimals, - QuoteMintDecimals: quoteMintDecimals, - User: eventUser, - BaseAmount: decimal.NewFromUint64(event.BaseAmountIn), - QuoteAmount: decimal.NewFromUint64(event.UserQuoteAmountOut), - BaseReserve: decimal.NewFromUint64(event.PoolBaseTokenReserves + event.BaseAmountIn), - QuoteReserve: decimal.NewFromUint64(event.PoolQuoteTokenReserves - event.QuoteAmountOut), - Mayhem: isMayhemPump(result.accountList[instruction.Accounts[9]]), - Cashback: isCashbackCoin, - UserBaseBalance: userBase, - UserQuoteBalance: userQuote, - EntryContract: entryContract, - }, - }, offset, nil + swap := Swap{ + Program: SolProgramPumpAMM, + Event: "sell", + Pool: event.Pool, + BaseMint: baseMint, + QuoteMint: quoteMint, + BaseTokenProgram: baseTokenProgram, + QuoteTokenProgram: quoteTokenProgram, + Creator: event.CoinCreator, + BaseMintDecimals: baseMintDecimals, + QuoteMintDecimals: quoteMintDecimals, + User: eventUser, + BaseAmount: decimal.NewFromUint64(event.BaseAmountIn), + QuoteAmount: decimal.NewFromUint64(event.UserQuoteAmountOut), + BaseReserve: decimal.NewFromUint64(event.PoolBaseTokenReserves + event.BaseAmountIn), + QuoteReserve: decimal.NewFromUint64(event.PoolQuoteTokenReserves - event.QuoteAmountOut), + Mayhem: isMayhemPump(result.accountList[instruction.Accounts[9]]), + Cashback: isCashbackCoin, + UserBaseBalance: userBase, + UserQuoteBalance: userQuote, + EntryContract: entryContract, + } + swap.SetSwapAmountInfo( + SwapModeExactIn, + decimal.NewFromUint64(event.BaseAmountIn), + decimal.NewFromUint64(event.MinQuoteAmountOut), + ) + return []Swap{swap}, offset, nil } func depositParse(tx *Tx, instruction Instruction, innerInstructions InnerInstructions, offset [2]uint) ([]Swap, [2]uint, error) { diff --git a/raydiumclmm.go b/raydiumclmm.go index 43e2b03..b9c2ceb 100644 --- a/raydiumclmm.go +++ b/raydiumclmm.go @@ -1,12 +1,27 @@ package pump_parser import ( + "encoding/binary" "fmt" "github.com/gagliardetto/solana-go" "github.com/shopspring/decimal" ) +func decodeRaydiumClmmSwapArgs(data []byte) (amountSpecified uint64, otherAmountThreshold uint64, swapMode SwapMode, err error) { + if len(data) < 41 { + return 0, 0, SwapModeUnknown, fmt.Errorf("raydium clmm swap instruction data too short") + } + amountSpecified = binary.LittleEndian.Uint64(data[8:16]) + otherAmountThreshold = binary.LittleEndian.Uint64(data[16:24]) + isBaseInput := data[40] != 0 + swapMode = SwapModeExactOut + if isBaseInput { + swapMode = SwapModeExactIn + } + return amountSpecified, otherAmountThreshold, swapMode, nil +} + func raydiumClmmParser(tx *Tx, instruction Instruction, innerInstructions InnerInstructions, offset [2]uint) ([]Swap, [2]uint, error) { if !tx.rawTx.accountList[instruction.ProgramIDIndex].Equals(raydiumClmmProgramID) { return nil, increaseOffset(offset), fmt.Errorf("raydiumClmm instruction not found, offset, %d, %d", offset[0], offset[1]) @@ -278,6 +293,10 @@ func raydiumClmmSwapParser(tx *Tx, instruction Instruction, innerInstructions In userTokenOutAccount int ) var entryContract = tx.rawTx.accountList[tx.rawTx.Transaction.Message.Instructions[offset[0]].ProgramIDIndex] + amountSpecified, otherAmountThreshold, swapMode, err := decodeRaydiumClmmSwapArgs(instruction.Data) + if err != nil { + return nil, increaseOffset(offset), err + } if discriminator == raydiumClmmSwapDiscriminator { accountMin = 9 pool = tx.rawTx.accountList[instruction.Accounts[2]] @@ -350,26 +369,26 @@ func raydiumClmmSwapParser(tx *Tx, instruction Instruction, innerInstructions In offset[1] += 2 - return []Swap{ - { - Program: SolProgramRaydiumCLMM, - Event: "sell", - Pool: pool, - BaseMint: baseMint, - QuoteMint: quoteMint, - BaseTokenProgram: baseTokenProgram, - QuoteTokenProgram: quoteTokenProgram, - BaseMintDecimals: baseMintDecimals, - QuoteMintDecimals: quoteMintDecimals, - User: tx.rawTx.accountList[instruction.Accounts[0]], - BaseAmount: baseAmount, - QuoteAmount: quoteAmount, - BaseReserve: baseReserve, - QuoteReserve: quoteReserve, - UserBaseBalance: userBase, - UserQuoteBalance: userQuote, - EntryContract: entryContract, - }, - }, offset, nil + swap := Swap{ + Program: SolProgramRaydiumCLMM, + Event: "sell", + Pool: pool, + BaseMint: baseMint, + QuoteMint: quoteMint, + BaseTokenProgram: baseTokenProgram, + QuoteTokenProgram: quoteTokenProgram, + BaseMintDecimals: baseMintDecimals, + QuoteMintDecimals: quoteMintDecimals, + User: tx.rawTx.accountList[instruction.Accounts[0]], + BaseAmount: baseAmount, + QuoteAmount: quoteAmount, + BaseReserve: baseReserve, + QuoteReserve: quoteReserve, + UserBaseBalance: userBase, + UserQuoteBalance: userQuote, + EntryContract: entryContract, + } + swap.SetSwapAmountInfo(swapMode, decimal.NewFromUint64(amountSpecified), decimal.NewFromUint64(otherAmountThreshold)) + return []Swap{swap}, offset, nil } diff --git a/raydiumcpmm.go b/raydiumcpmm.go index 1eabce9..ceeecc4 100644 --- a/raydiumcpmm.go +++ b/raydiumcpmm.go @@ -4,9 +4,20 @@ import ( "bytes" "fmt" + agbinary "github.com/gagliardetto/binary" "github.com/shopspring/decimal" ) +type raydiumCPmmSwapBaseInputArgs struct { + AmountIn uint64 + MinimumAmountOut uint64 +} + +type raydiumCPmmSwapBaseOutputArgs struct { + MaxAmountIn uint64 + AmountOut uint64 +} + func raydiumCPmmParser(tx *Tx, instruction Instruction, innerInstructions InnerInstructions, offset [2]uint) ([]Swap, [2]uint, error) { if !tx.rawTx.accountList[instruction.ProgramIDIndex].Equals(raydiumCPmmProgramID) { return nil, increaseOffset(offset), fmt.Errorf("raydiumCPmm instruction not found, offset, %d, %d", offset[0], offset[1]) @@ -327,6 +338,30 @@ func raydiumCPmmSwapParser(tx *Tx, instruction Instruction, innerInstructions In } var entryContract = tx.rawTx.accountList[tx.rawTx.Transaction.Message.Instructions[offset[0]].ProgramIDIndex] + discriminator := *(*[8]byte)(instruction.Data[:8]) + var swapMode SwapMode + var fixedAmount decimal.Decimal + var limitAmount decimal.Decimal + switch discriminator { + case raydiumCPmmSwapBaseInputDiscriminator: + var args raydiumCPmmSwapBaseInputArgs + if err := agbinary.NewBorshDecoder(instruction.Data[8:]).Decode(&args); err != nil { + return nil, increaseOffset(offset), fmt.Errorf("failed to decode raydium cpmm swap_base_input args: %w", err) + } + swapMode = SwapModeExactIn + fixedAmount = decimal.NewFromUint64(args.AmountIn) + limitAmount = decimal.NewFromUint64(args.MinimumAmountOut) + case raydiumCPmmSwapBaseOutputDiscriminator: + var args raydiumCPmmSwapBaseOutputArgs + if err := agbinary.NewBorshDecoder(instruction.Data[8:]).Decode(&args); err != nil { + return nil, increaseOffset(offset), fmt.Errorf("failed to decode raydium cpmm swap_base_output args: %w", err) + } + swapMode = SwapModeExactOut + fixedAmount = decimal.NewFromUint64(args.AmountOut) + limitAmount = decimal.NewFromUint64(args.MaxAmountIn) + default: + return nil, increaseOffset(offset), InstructionIgnoredError + } market := tx.rawTx.accountList[instruction.Accounts[3]] // Get token accounts from instruction tokenIn := tx.rawTx.accountList[instruction.Accounts[4]] @@ -384,25 +419,26 @@ func raydiumCPmmSwapParser(tx *Tx, instruction Instruction, innerInstructions In return nil, increaseOffset(offset), fmt.Errorf("failed to find token transfer in inner instructions") } offset[1] += 2 - return []Swap{ - { - Program: SolProgramRaydiumCPMM, - Event: "sell", - Pool: market, - BaseMint: inputTokenMint, - QuoteMint: outputTokenMint, - BaseTokenProgram: baseTokenBalance.ProgramIDAccount, - QuoteTokenProgram: quoteTokenBalance.ProgramIDAccount, - BaseMintDecimals: uint8(baseTokenBalance.UITokenAmount.Decimals), - QuoteMintDecimals: uint8(quoteTokenBalance.UITokenAmount.Decimals), - BaseReserve: baseReserve, - QuoteReserve: quoteReserve, - BaseAmount: baseAmount, - QuoteAmount: quoteAmount, - User: user, - UserBaseBalance: userBase, - UserQuoteBalance: userQuote, - EntryContract: entryContract, - }, - }, offset, nil + swap := Swap{ + Program: SolProgramRaydiumCPMM, + Event: "sell", + Pool: market, + BaseMint: inputTokenMint, + QuoteMint: outputTokenMint, + BaseTokenProgram: baseTokenBalance.ProgramIDAccount, + QuoteTokenProgram: quoteTokenBalance.ProgramIDAccount, + BaseMintDecimals: uint8(baseTokenBalance.UITokenAmount.Decimals), + QuoteMintDecimals: uint8(quoteTokenBalance.UITokenAmount.Decimals), + BaseReserve: baseReserve, + QuoteReserve: quoteReserve, + BaseAmount: baseAmount, + QuoteAmount: quoteAmount, + User: user, + UserBaseBalance: userBase, + UserQuoteBalance: userQuote, + EntryContract: entryContract, + } + swap.SetSwapAmountInfo(swapMode, fixedAmount, limitAmount) + + return []Swap{swap}, offset, nil } diff --git a/raydiumlaunchlab.go b/raydiumlaunchlab.go index c071ca1..f0b1eab 100644 --- a/raydiumlaunchlab.go +++ b/raydiumlaunchlab.go @@ -367,6 +367,11 @@ type RaydiumLaunchLabSwapEvent struct { } +type raydiumLaunchLabSwapArgs struct { + Amount uint64 + OtherAmountThreshold uint64 +} + func raydiumLaunchLabSwapParser(tx *Tx, instruction Instruction, innerInstructions InnerInstructions, offset [2]uint) ([]Swap, [2]uint, error) { platformConfig := tx.rawTx.accountList[instruction.Accounts[3]] var programName string @@ -375,6 +380,26 @@ func raydiumLaunchLabSwapParser(tx *Tx, instruction Instruction, innerInstructio } else { programName = SolProgramRaydiumLaunchLab } + discriminator := *(*[8]byte)(instruction.Data[:8]) + var swapMode SwapMode + var fixedAmount decimal.Decimal + var limitAmount decimal.Decimal + var swapArgs raydiumLaunchLabSwapArgs + if err := agbinary.NewBorshDecoder(instruction.Data[8:]).Decode(&swapArgs); err != nil { + return nil, increaseOffset(offset), fmt.Errorf("failed to decode raydium launchlab swap args: %w", err) + } + switch discriminator { + case raydiumLaunchLabSellExactInDiscriminator, raydiumLaunchLabBuyExactInDiscriminator: + swapMode = SwapModeExactIn + fixedAmount = decimal.NewFromUint64(swapArgs.Amount) + limitAmount = decimal.NewFromUint64(swapArgs.OtherAmountThreshold) + case raydiumLaunchLabSellExactOutDiscriminator, raydiumLaunchLabBuyExactOutDiscriminator: + swapMode = SwapModeExactOut + fixedAmount = decimal.NewFromUint64(swapArgs.Amount) + limitAmount = decimal.NewFromUint64(swapArgs.OtherAmountThreshold) + default: + return nil, increaseOffset(offset), InstructionIgnoredError + } var entryContract solana.PublicKey = tx.rawTx.accountList[tx.rawTx.Transaction.Message.Instructions[offset[0]].ProgramIDIndex] user := tx.rawTx.accountList[instruction.Accounts[0]] pool := tx.rawTx.accountList[instruction.Accounts[4]] @@ -447,7 +472,7 @@ func raydiumLaunchLabSwapParser(tx *Tx, instruction Instruction, innerInstructio userBase := getAccountBalanceAfterTx(tx.rawTx, userBaseIdx) userQuote := getAccountBalanceAfterTx(tx.rawTx, userQuoteIdx) - return []Swap{{ + swap := Swap{ Program: programName, Event: event, Pool: pool, @@ -466,5 +491,8 @@ func raydiumLaunchLabSwapParser(tx *Tx, instruction Instruction, innerInstructio UserBaseBalance: userBase, UserQuoteBalance: userQuote, EntryContract: entryContract, - }}, offset, nil + } + swap.SetSwapAmountInfo(swapMode, fixedAmount, limitAmount) + + return []Swap{swap}, offset, nil } diff --git a/raydiumv4.go b/raydiumv4.go index 6040d48..cf565c5 100644 --- a/raydiumv4.go +++ b/raydiumv4.go @@ -1,11 +1,26 @@ package pump_parser import ( + "encoding/binary" "fmt" "github.com/shopspring/decimal" ) +func decodeRaydiumV4SwapArgs(data []byte) (amountSpecified uint64, otherAmountThreshold uint64, swapMode SwapMode, err error) { + if len(data) < 17 { + return 0, 0, SwapModeUnknown, fmt.Errorf("raydium v4 swap instruction data too short") + } + switch data[0] { + case raydiumV4SwapBaseInDiscriminator, raydiumV4SwapBaseInV2Discriminator: + return binary.LittleEndian.Uint64(data[1:9]), binary.LittleEndian.Uint64(data[9:17]), SwapModeExactIn, nil + case raydiumV4SwapBaseOutDiscriminator, raydiumV4SwapBaseOutV2Discriminator: + return binary.LittleEndian.Uint64(data[9:17]), binary.LittleEndian.Uint64(data[1:9]), SwapModeExactOut, nil + default: + return 0, 0, SwapModeUnknown, InstructionIgnoredError + } +} + func raydiumV4Parser(tx *Tx, instruction Instruction, innerInstructions InnerInstructions, offset [2]uint) ([]Swap, [2]uint, error) { if !tx.rawTx.accountList[instruction.ProgramIDIndex].Equals(raydiumV4Program) { return nil, increaseOffset(offset), fmt.Errorf("raydiumv4 instruction not found, offset, %d, %d", offset[0], offset[1]) @@ -314,6 +329,10 @@ func raydiumv4SwapParser(tx *Tx, instruction Instruction, innerInstructions Inne vaultQuoteIdx = instruction.Accounts[6] } var entryContract = tx.rawTx.accountList[tx.rawTx.Transaction.Message.Instructions[offset[0]].ProgramIDIndex] + amountSpecified, otherAmountThreshold, swapMode, err := decodeRaydiumV4SwapArgs(instruction.Data) + if err != nil { + return nil, increaseOffset(offset), err + } ammAccount := tx.rawTx.accountList[instruction.Accounts[1]] @@ -376,28 +395,28 @@ func raydiumv4SwapParser(tx *Tx, instruction Instruction, innerInstructions Inne baseReserve, _ := decimal.NewFromString(baseTokenbalance.UITokenAmount.Amount) quoteReserve, _ := decimal.NewFromString(quoteTokenbalance.UITokenAmount.Amount) - return []Swap{ - { - Program: SolProgramRaydiumV4, - Event: event, - Pool: ammAccount, - BaseMint: baseTokenbalance.MintAccount, - QuoteMint: quoteTokenbalance.MintAccount, - BaseTokenProgram: baseTokenbalance.ProgramIDAccount, - QuoteTokenProgram: quoteTokenbalance.ProgramIDAccount, - BaseMintDecimals: uint8(baseTokenbalance.UITokenAmount.Decimals), - QuoteMintDecimals: uint8(quoteTokenbalance.UITokenAmount.Decimals), - User: user, - BaseAmount: baseAmount, - QuoteAmount: quoteAmount, - BaseReserve: baseReserve, - QuoteReserve: quoteReserve, - Mayhem: false, - UserBaseBalance: userBase, - UserQuoteBalance: userQuote, - EntryContract: entryContract, - }, - }, offset, nil + swap := Swap{ + Program: SolProgramRaydiumV4, + Event: event, + Pool: ammAccount, + BaseMint: baseTokenbalance.MintAccount, + QuoteMint: quoteTokenbalance.MintAccount, + BaseTokenProgram: baseTokenbalance.ProgramIDAccount, + QuoteTokenProgram: quoteTokenbalance.ProgramIDAccount, + BaseMintDecimals: uint8(baseTokenbalance.UITokenAmount.Decimals), + QuoteMintDecimals: uint8(quoteTokenbalance.UITokenAmount.Decimals), + User: user, + BaseAmount: baseAmount, + QuoteAmount: quoteAmount, + BaseReserve: baseReserve, + QuoteReserve: quoteReserve, + Mayhem: false, + UserBaseBalance: userBase, + UserQuoteBalance: userQuote, + EntryContract: entryContract, + } + swap.SetSwapAmountInfo(swapMode, decimal.NewFromUint64(amountSpecified), decimal.NewFromUint64(otherAmountThreshold)) + return []Swap{swap}, offset, nil } func raydiumv4SwapV2Parser(tx *Tx, instruction Instruction, innerInstructions InnerInstructions, offset [2]uint) ([]Swap, [2]uint, error) { @@ -406,6 +425,10 @@ func raydiumv4SwapV2Parser(tx *Tx, instruction Instruction, innerInstructions In return nil, increaseOffset(offset), fmt.Errorf("invalid number of accounts for raydiumv4 swapv2 instruction, offset %d, %d", offset[0], offset[1]) } var entryContract = tx.rawTx.accountList[tx.rawTx.Transaction.Message.Instructions[offset[0]].ProgramIDIndex] + amountSpecified, otherAmountThreshold, swapMode, err := decodeRaydiumV4SwapArgs(instruction.Data) + if err != nil { + return nil, increaseOffset(offset), err + } // Raydium's documented V2 layout uses the first 8 accounts. Routed CPI calls // may append extra readonly accounts (for example the Raydium program id) at @@ -475,26 +498,26 @@ func raydiumv4SwapV2Parser(tx *Tx, instruction Instruction, innerInstructions In baseReserve, _ := decimal.NewFromString(baseTokenbalance.UITokenAmount.Amount) quoteReserve, _ := decimal.NewFromString(quoteTokenbalance.UITokenAmount.Amount) - return []Swap{ - { - Program: SolProgramRaydiumV4, - Event: event, - Pool: ammAccount, - BaseMint: baseTokenbalance.MintAccount, - QuoteMint: quoteTokenbalance.MintAccount, - BaseTokenProgram: baseTokenbalance.ProgramIDAccount, - QuoteTokenProgram: quoteTokenbalance.ProgramIDAccount, - BaseMintDecimals: uint8(baseTokenbalance.UITokenAmount.Decimals), - QuoteMintDecimals: uint8(quoteTokenbalance.UITokenAmount.Decimals), - User: user, - BaseAmount: baseAmount, - QuoteAmount: quoteAmount, - BaseReserve: baseReserve, - QuoteReserve: quoteReserve, - Mayhem: false, - UserBaseBalance: userBase, - UserQuoteBalance: userQuote, - EntryContract: entryContract, - }, - }, offset, nil + swap := Swap{ + Program: SolProgramRaydiumV4, + Event: event, + Pool: ammAccount, + BaseMint: baseTokenbalance.MintAccount, + QuoteMint: quoteTokenbalance.MintAccount, + BaseTokenProgram: baseTokenbalance.ProgramIDAccount, + QuoteTokenProgram: quoteTokenbalance.ProgramIDAccount, + BaseMintDecimals: uint8(baseTokenbalance.UITokenAmount.Decimals), + QuoteMintDecimals: uint8(quoteTokenbalance.UITokenAmount.Decimals), + User: user, + BaseAmount: baseAmount, + QuoteAmount: quoteAmount, + BaseReserve: baseReserve, + QuoteReserve: quoteReserve, + Mayhem: false, + UserBaseBalance: userBase, + UserQuoteBalance: userQuote, + EntryContract: entryContract, + } + swap.SetSwapAmountInfo(swapMode, decimal.NewFromUint64(amountSpecified), decimal.NewFromUint64(otherAmountThreshold)) + return []Swap{swap}, offset, nil } diff --git a/raydiumv4_test.go b/raydiumv4_test.go index e8e24fc..44cd763 100644 --- a/raydiumv4_test.go +++ b/raydiumv4_test.go @@ -15,6 +15,14 @@ func transferInstructionData(amount uint64) solana.Base58 { return solana.Base58(data) } +func raydiumV4SwapInstructionData(discriminator byte, amountSpecified, otherAmountThreshold uint64) solana.Base58 { + data := make([]byte, 17) + data[0] = discriminator + binary.LittleEndian.PutUint64(data[1:9], amountSpecified) + binary.LittleEndian.PutUint64(data[9:17], otherAmountThreshold) + return solana.Base58(data) +} + func TestRaydiumV4SwapV2ParserAllowsTrailingReadonlyAccounts(t *testing.T) { t.Parallel() @@ -33,7 +41,7 @@ func TestRaydiumV4SwapV2ParserAllowsTrailingReadonlyAccounts(t *testing.T) { swapInstruction := Instruction{ Accounts: []int{0, 1, 2, 3, 4, 5, 6, 7, 8}, ProgramIDIndex: 8, - Data: solana.Base58([]byte{raydiumV4SwapBaseInV2Discriminator}), + Data: raydiumV4SwapInstructionData(raydiumV4SwapBaseInV2Discriminator, 55, 42), } innerInstructions := InnerInstructions{ Index: 0, diff --git a/swap_amounts.go b/swap_amounts.go new file mode 100644 index 0000000..dca3cf3 --- /dev/null +++ b/swap_amounts.go @@ -0,0 +1,213 @@ +package pump_parser + +import ( + "encoding/json" + + "github.com/gagliardetto/solana-go" + "github.com/shopspring/decimal" +) + +var maxSlippageBps = decimal.NewFromInt(10000) + +type SwapMode uint8 +type SwapAmountSide uint8 +type SwapLimitType uint8 + +const ( + SwapModeUnknown SwapMode = iota + SwapModeExactIn + SwapModeExactOut +) + +const ( + SwapAmountSideUnknown SwapAmountSide = iota + SwapAmountSideBase + SwapAmountSideQuote +) + +const ( + SwapLimitTypeUnknown SwapLimitType = iota + SwapLimitTypeMinOut + SwapLimitTypeMaxIn +) + +func (m SwapMode) String() string { + switch m { + case SwapModeExactIn: + return "exact_in" + case SwapModeExactOut: + return "exact_out" + default: + return "" + } +} + +func (m SwapMode) MarshalJSON() ([]byte, error) { + return json.Marshal(m.String()) +} + +func (s SwapAmountSide) String() string { + switch s { + case SwapAmountSideBase: + return "base" + case SwapAmountSideQuote: + return "quote" + default: + return "" + } +} + +func (s SwapAmountSide) MarshalJSON() ([]byte, error) { + return json.Marshal(s.String()) +} + +func (t SwapLimitType) String() string { + switch t { + case SwapLimitTypeMinOut: + return "min_out" + case SwapLimitTypeMaxIn: + return "max_in" + default: + return "" + } +} + +func (t SwapLimitType) MarshalJSON() ([]byte, error) { + return json.Marshal(t.String()) +} + +func swapAmountForSide(baseAmount, quoteAmount decimal.Decimal, side SwapAmountSide) decimal.Decimal { + switch side { + case SwapAmountSideBase: + return baseAmount + case SwapAmountSideQuote: + return quoteAmount + default: + return decimal.Zero + } +} + +func swapMintForSide(baseMint, quoteMint solana.PublicKey, side SwapAmountSide) solana.PublicKey { + switch side { + case SwapAmountSideBase: + return baseMint + case SwapAmountSideQuote: + return quoteMint + default: + return solana.PublicKey{} + } +} + +func oppositeSwapAmountSide(side SwapAmountSide) SwapAmountSide { + switch side { + case SwapAmountSideBase: + return SwapAmountSideQuote + case SwapAmountSideQuote: + return SwapAmountSideBase + default: + return SwapAmountSideUnknown + } +} + +func fixedSwapAmountSide(event string, swapMode SwapMode) SwapAmountSide { + switch swapMode { + case SwapModeExactIn: + switch event { + case TxEventBuy: + return SwapAmountSideQuote + case TxEventSell: + return SwapAmountSideBase + } + case SwapModeExactOut: + switch event { + case TxEventBuy: + return SwapAmountSideBase + case TxEventSell: + return SwapAmountSideQuote + } + } + return SwapAmountSideUnknown +} + +func limitSwapAmountType(swapMode SwapMode) SwapLimitType { + switch swapMode { + case SwapModeExactIn: + return SwapLimitTypeMinOut + case SwapModeExactOut: + return SwapLimitTypeMaxIn + default: + return SwapLimitTypeUnknown + } +} + +func calculateLimitSlippageBps(limitType SwapLimitType, limitAmount, actualAmount decimal.Decimal) decimal.Decimal { + switch limitType { + case SwapLimitTypeMinOut: + if !actualAmount.IsPositive() { + if !limitAmount.IsPositive() { + return maxSlippageBps + } + return maxSlippageBps.Neg() + } + if !limitAmount.IsPositive() { + return maxSlippageBps + } + return actualAmount.Sub(limitAmount).Mul(maxSlippageBps).Div(actualAmount) + case SwapLimitTypeMaxIn: + if !limitAmount.IsPositive() { + if !actualAmount.IsPositive() { + return maxSlippageBps + } + return maxSlippageBps.Neg() + } + return limitAmount.Sub(actualAmount).Mul(maxSlippageBps).Div(limitAmount) + default: + return decimal.Zero + } +} + +func (s *Swap) SetSwapAmountInfoDetailed( + swapMode SwapMode, + fixedAmount decimal.Decimal, + fixedSide SwapAmountSide, + fixedMint solana.PublicKey, + limitType SwapLimitType, + limitAmount decimal.Decimal, + limitSide SwapAmountSide, + limitMint solana.PublicKey, + actualLimitAmount decimal.Decimal, +) { + s.SwapMode = swapMode + s.FixedAmount = fixedAmount + s.FixedAmountSide = fixedSide + s.FixedMint = fixedMint + s.LimitAmountType = limitType + s.LimitAmount = limitAmount + s.LimitAmountSide = limitSide + s.LimitMint = limitMint + s.ActualLimitAmount = actualLimitAmount + s.ActualLimitAmountSide = limitSide + s.SlippageBps = calculateLimitSlippageBps(limitType, limitAmount, actualLimitAmount) +} + +func (s *Swap) SetSwapAmountInfo(swapMode SwapMode, fixedAmount, limitAmount decimal.Decimal) { + fixedSide := fixedSwapAmountSide(s.Event, swapMode) + if fixedSide == SwapAmountSideUnknown { + return + } + + limitType := limitSwapAmountType(swapMode) + limitSide := oppositeSwapAmountSide(fixedSide) + actualLimitAmount := swapAmountForSide(s.BaseAmount, s.QuoteAmount, limitSide) + s.SetSwapAmountInfoDetailed( + swapMode, + fixedAmount, + fixedSide, + swapMintForSide(s.BaseMint, s.QuoteMint, fixedSide), + limitType, + limitAmount, + limitSide, + swapMintForSide(s.BaseMint, s.QuoteMint, limitSide), + actualLimitAmount, + ) +} diff --git a/swap_amounts_oracle_test.go b/swap_amounts_oracle_test.go new file mode 100644 index 0000000..65d62a7 --- /dev/null +++ b/swap_amounts_oracle_test.go @@ -0,0 +1,387 @@ +package pump_parser + +import ( + "encoding/json" + "os" + "path/filepath" + "testing" + + "github.com/gagliardetto/solana-go" + "github.com/gagliardetto/solana-go/rpc" + "github.com/shopspring/decimal" +) + +type swapOracleCase struct { + name string + txHash string + index int + + program string + event string + + swapMode SwapMode + fixedAmount string + fixedAmountSide SwapAmountSide + fixedMint string + limitAmountType SwapLimitType + limitAmount string + limitAmountSide SwapAmountSide + limitMint string + actualLimitAmount string + actualLimitAmountSide SwapAmountSide + slippageBps string +} + +func TestSwapAmountOracleSamples(t *testing.T) { + EnableAllParsers() + + cases := []swapOracleCase{ + { + name: "pump buy exact out", + txHash: "5ybEYcXYhFNfCNAu1o7ovM1Rw5285PBzAwsj4ezwmPRLkYtXX91GhcvAgTVZvdCVV6upsGH8DwYeseNswPhEfVbg", + index: 0, + program: "Pump", + event: TxEventBuy, + swapMode: SwapModeExactOut, + fixedAmount: "1459556161603", + fixedAmountSide: SwapAmountSideBase, + fixedMint: "CEwaxx5j1K61JMYXavcxihVQW4NxC6c4NQ27veFpYUYA", + limitAmountType: SwapLimitTypeMaxIn, + limitAmount: "100000001", + limitAmountSide: SwapAmountSideQuote, + limitMint: "So11111111111111111111111111111111111111112", + actualLimitAmount: "98765431", + actualLimitAmountSide: SwapAmountSideQuote, + slippageBps: "123.4569987654300123", + }, + { + name: "raydium v4 exact out", + txHash: "3Q1BhUvqm889oJfCn96AZAJqyHi1uxdeoKQknCc9xQcajhZS5APfwzkHuNTkPJEhyGknj7VyLpkNoMmNPK3No6hC", + index: 0, + program: "RaydiumV4", + event: TxEventSell, + swapMode: SwapModeExactOut, + fixedAmount: "432588", + fixedAmountSide: SwapAmountSideQuote, + fixedMint: "2qEHjDLDLbuBgRYvsxhc5D6uDWAivNFZGan56P1tpump", + limitAmountType: SwapLimitTypeMaxIn, + limitAmount: "18446744073709551615", + limitAmountSide: SwapAmountSideBase, + limitMint: "So11111111111111111111111111111111111111112", + actualLimitAmount: "279099", + actualLimitAmountSide: SwapAmountSideBase, + slippageBps: "9999.9999999998487001", + }, + { + name: "pump amm exact in", + txHash: "3Q1BhUvqm889oJfCn96AZAJqyHi1uxdeoKQknCc9xQcajhZS5APfwzkHuNTkPJEhyGknj7VyLpkNoMmNPK3No6hC", + index: 1, + program: "PumpAMM", + event: TxEventSell, + swapMode: SwapModeExactIn, + fixedAmount: "432588", + fixedAmountSide: SwapAmountSideBase, + fixedMint: "2qEHjDLDLbuBgRYvsxhc5D6uDWAivNFZGan56P1tpump", + limitAmountType: SwapLimitTypeMinOut, + limitAmount: "0", + limitAmountSide: SwapAmountSideQuote, + limitMint: "So11111111111111111111111111111111111111112", + actualLimitAmount: "284317", + actualLimitAmountSide: SwapAmountSideQuote, + slippageBps: "10000", + }, + { + name: "meteora dlmm exact in", + txHash: "5uw9Uwe9KDLCzUNf1sRr7EjKqE2Xs8qUHaoC1CRFhkE3TMpo5TimwApW65pd6pmB7Cp92XXMaZ9jQav6aXRZGtoS", + index: 0, + program: "MeteoraDLMM", + event: TxEventBuy, + swapMode: SwapModeExactIn, + fixedAmount: "17684137", + fixedAmountSide: SwapAmountSideQuote, + fixedMint: "So11111111111111111111111111111111111111112", + limitAmountType: SwapLimitTypeMinOut, + limitAmount: "0", + limitAmountSide: SwapAmountSideBase, + limitMint: "METAewgxyPbgwsseH8T16a39CQ5VyVxZi9zXiDPY18m", + actualLimitAmount: "50437818", + actualLimitAmountSide: SwapAmountSideBase, + slippageBps: "10000", + }, + { + name: "orca whirlpool exact in", + txHash: "5uw9Uwe9KDLCzUNf1sRr7EjKqE2Xs8qUHaoC1CRFhkE3TMpo5TimwApW65pd6pmB7Cp92XXMaZ9jQav6aXRZGtoS", + index: 1, + program: "OrcaWhirPool", + event: TxEventSell, + swapMode: SwapModeExactIn, + fixedAmount: "50437818", + fixedAmountSide: SwapAmountSideBase, + fixedMint: "METAewgxyPbgwsseH8T16a39CQ5VyVxZi9zXiDPY18m", + limitAmountType: SwapLimitTypeMinOut, + limitAmount: "0", + limitAmountSide: SwapAmountSideQuote, + limitMint: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", + actualLimitAmount: "1438802", + actualLimitAmountSide: SwapAmountSideQuote, + slippageBps: "10000", + }, + { + name: "raydium v4 exact in", + txHash: "5uw9Uwe9KDLCzUNf1sRr7EjKqE2Xs8qUHaoC1CRFhkE3TMpo5TimwApW65pd6pmB7Cp92XXMaZ9jQav6aXRZGtoS", + index: 2, + program: "RaydiumV4", + event: TxEventBuy, + swapMode: SwapModeExactIn, + fixedAmount: "1438802", + fixedAmountSide: SwapAmountSideQuote, + fixedMint: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", + limitAmountType: SwapLimitTypeMinOut, + limitAmount: "0", + limitAmountSide: SwapAmountSideBase, + limitMint: "So11111111111111111111111111111111111111112", + actualLimitAmount: "19059759", + actualLimitAmountSide: SwapAmountSideBase, + slippageBps: "10000", + }, + { + name: "raydium clmm exact in", + txHash: "3XoRKna49qCAuF75ctmaYupNmYWuFm5AU73ULQjxNUxz9qJzuKqMRqq5Z88L6DooWTF44UxnxMXwqLn5t9NsoCoZ", + index: 2, + program: "RaydiumCLMM", + event: TxEventSell, + swapMode: SwapModeExactIn, + fixedAmount: "1569519567845", + fixedAmountSide: SwapAmountSideBase, + fixedMint: "CiKu4eHsVrc1eueVQeHn7qhXTcVu95gSQmBpX4utjL9z", + limitAmountType: SwapLimitTypeMinOut, + limitAmount: "0", + limitAmountSide: SwapAmountSideQuote, + limitMint: "6sQgvhAYtYFrahcjB1hKfB3ZC5YDVdfYvAqK1GKe93c9", + actualLimitAmount: "366578", + actualLimitAmountSide: SwapAmountSideQuote, + slippageBps: "10000", + }, + { + name: "raydium cpmm exact in", + txHash: "288FAsrj7h6hTKywtVaqCqHAbNZ6x3Xuich9kQMGVarVUnUjkqTabxQE9JHyranGY9eqUivZbBTzC5dH1BEuJ6pa", + index: 2, + program: "RaydiumCPMM", + event: TxEventSell, + swapMode: SwapModeExactIn, + fixedAmount: "1260040377905", + fixedAmountSide: SwapAmountSideBase, + fixedMint: "3f7wfg9yHLtGKvy75MmqsVT1ueTFoqyySQbusrX1YAQ4", + limitAmountType: SwapLimitTypeMinOut, + limitAmount: "0", + limitAmountSide: SwapAmountSideQuote, + limitMint: "oreoU2P8bN6jkk3jbaiVxYnG1dCXcYxwhwyK9jSybcp", + actualLimitAmount: "802507591", + actualLimitAmountSide: SwapAmountSideQuote, + slippageBps: "10000", + }, + { + name: "raydium launchlab exact in", + txHash: "1r3gfEse3WAy5H6h4jMSNq1K5KZNCrMdAtCnpBSE1xkHQEt3EJ2J6Lk6ihQshrfsrS5FbqP5WuUSZG6zPCJB5TE", + index: 0, + program: "RaydiumLaunchLab", + event: TxEventBuy, + swapMode: SwapModeExactIn, + fixedAmount: "10000000", + fixedAmountSide: SwapAmountSideQuote, + fixedMint: "So11111111111111111111111111111111111111112", + limitAmountType: SwapLimitTypeMinOut, + limitAmount: "5976144139694", + limitAmountSide: SwapAmountSideBase, + limitMint: "Attr2sqaXr76XqaDxdtnQ4QAEsaFdgTGr599F7ytgray", + actualLimitAmount: "6129378604814", + actualLimitAmountSide: SwapAmountSideBase, + slippageBps: "249.9999999994289796", + }, + { + name: "meteora pools exact in", + txHash: "5jQk6mbhtExpUFskRy2AfKWbLgXDv2USiGkq9tQWauGVKduGdTqscgxyDCPgBryr4kz5hDT5CE9TpVTKDoPhkBmt", + index: 0, + program: "MeteoraPools", + event: TxEventBuy, + swapMode: SwapModeExactIn, + fixedAmount: "75404052467", + fixedAmountSide: SwapAmountSideQuote, + fixedMint: "STrikemJEk2tFVYpg7SMo9nGPrnJ56fHnS1K7PV2fPw", + limitAmountType: SwapLimitTypeMinOut, + limitAmount: "30605141", + limitAmountSide: SwapAmountSideBase, + limitMint: "So11111111111111111111111111111111111111112", + actualLimitAmount: "31556751", + actualLimitAmountSide: SwapAmountSideBase, + slippageBps: "301.5551252408715967", + }, + { + name: "meteora bonding curve exact in", + txHash: "5Qsq1ueenSs4KgVRgwXmBVFvMR3Asq9MmXwmqQimxDdWLdiJy6dVfmYqa2YCvkNH1Gx7aCzJqg4t9gN9ECfxH2JS", + index: 0, + program: "MeteoraBondingCurve", + event: TxEventSell, + swapMode: SwapModeExactIn, + fixedAmount: "11022737683", + fixedAmountSide: SwapAmountSideBase, + fixedMint: "8FosqFryatEMV4ZeFR1gLmSmxBLcQ2NCibpZxFRPPF34", + limitAmountType: SwapLimitTypeMinOut, + limitAmount: "49672101", + limitAmountSide: SwapAmountSideQuote, + limitMint: "So11111111111111111111111111111111111111112", + actualLimitAmount: "49672101", + actualLimitAmountSide: SwapAmountSideQuote, + slippageBps: "0", + }, + { + name: "meteora damm v2 exact in", + txHash: "43EouSYkeVmLBZSKW1KptiQcAVvB6KX49wjztjgzkQ9iU38A6fF68k77bNy9Wn6fwjykqYsPorUKj8m6SFY7naf1", + index: 0, + program: "MeteoraAmmV2", + event: TxEventSell, + swapMode: SwapModeExactIn, + fixedAmount: "11846", + fixedAmountSide: SwapAmountSideBase, + fixedMint: "So11111111111111111111111111111111111111112", + limitAmountType: SwapLimitTypeMinOut, + limitAmount: "30893426", + limitAmountSide: SwapAmountSideQuote, + limitMint: "CdDoeyd67nuzmMCF8Dd3RzbxiTRk41Xd922Veu9kGvDE", + actualLimitAmount: "33325162", + actualLimitAmountSide: SwapAmountSideQuote, + slippageBps: "729.6996785792069068", + }, + { + name: "meteora damm v2 exact out", + txHash: "BD7GZaXaJc2hzSNPe6Q5yeej7rZLQFMpdx4rZwPhGTyHP43iMAR7LxymRSPGXnefAxSqi5sMsEPS1cjyQjup3Eu", + index: 0, + program: "MeteoraAmmV2", + event: TxEventBuy, + swapMode: SwapModeExactOut, + fixedAmount: "512761043", + fixedAmountSide: SwapAmountSideBase, + fixedMint: "DPfZc59DLrKyVTJDoKB8CBFgCndsjUzxy6fdbxk4Zms9", + limitAmountType: SwapLimitTypeMaxIn, + limitAmount: "71386496", + limitAmountSide: SwapAmountSideQuote, + limitMint: "So11111111111111111111111111111111111111112", + actualLimitAmount: "70020377", + actualLimitAmountSide: SwapAmountSideQuote, + slippageBps: "191.3693872857970225", + }, + } + + for _, tc := range cases { + tc := tc + t.Run(tc.name, func(t *testing.T) { + tx := mustParseRPCFixtureTx(t, tc.txHash) + if tc.index >= len(tx.Swaps) { + t.Fatalf("swap index %d out of range, len=%d", tc.index, len(tx.Swaps)) + } + + swap := tx.Swaps[tc.index] + if swap.Program != tc.program { + t.Fatalf("program = %q, want %q", swap.Program, tc.program) + } + if swap.Event != tc.event { + t.Fatalf("event = %q, want %q", swap.Event, tc.event) + } + if swap.SwapMode != tc.swapMode { + t.Fatalf("swap mode = %s, want %s", swap.SwapMode.String(), tc.swapMode.String()) + } + + assertDecimalString(t, "fixed_amount", swap.FixedAmount, tc.fixedAmount) + if swap.FixedAmountSide != tc.fixedAmountSide { + t.Fatalf("fixed amount side = %s, want %s", swap.FixedAmountSide.String(), tc.fixedAmountSide.String()) + } + assertPublicKey(t, "fixed_mint", swap.FixedMint, tc.fixedMint) + + if swap.LimitAmountType != tc.limitAmountType { + t.Fatalf("limit amount type = %s, want %s", swap.LimitAmountType.String(), tc.limitAmountType.String()) + } + assertDecimalString(t, "limit_amount", swap.LimitAmount, tc.limitAmount) + if swap.LimitAmountSide != tc.limitAmountSide { + t.Fatalf("limit amount side = %s, want %s", swap.LimitAmountSide.String(), tc.limitAmountSide.String()) + } + assertPublicKey(t, "limit_mint", swap.LimitMint, tc.limitMint) + + assertDecimalString(t, "actual_limit_amount", swap.ActualLimitAmount, tc.actualLimitAmount) + if swap.ActualLimitAmountSide != tc.actualLimitAmountSide { + t.Fatalf("actual limit amount side = %s, want %s", swap.ActualLimitAmountSide.String(), tc.actualLimitAmountSide.String()) + } + assertDecimalString(t, "slippage_bps", swap.SlippageBps, tc.slippageBps) + }) + } +} + +func mustParseRPCFixtureTx(t *testing.T, txHash string) *Tx { + t.Helper() + + fixturePath := filepath.Join("testdata", "rpc", txHash+".json") + raw, err := os.ReadFile(fixturePath) + if err != nil { + t.Fatalf("read fixture %s: %v", fixturePath, err) + } + + var response struct { + Result *rpc.GetTransactionResult `json:"result"` + } + if err := json.Unmarshal(raw, &response); err != nil { + t.Fatalf("unmarshal fixture %s: %v", fixturePath, err) + } + if response.Result == nil || response.Result.Transaction == nil || response.Result.Meta == nil { + t.Fatalf("fixture %s is missing transaction data", fixturePath) + } + + rawBinary := response.Result.Transaction.GetBinary() + if len(rawBinary) == 0 { + t.Fatalf("fixture %s has empty transaction bytes", fixturePath) + } + + txWithMeta := rpc.TransactionWithMeta{ + Slot: response.Result.Slot, + BlockTime: response.Result.BlockTime, + Transaction: rpc.DataBytesOrJSONFromBytes(rawBinary), + Meta: response.Result.Meta, + Version: response.Result.Version, + } + + var blockTime *uint64 + if response.Result.BlockTime != nil { + bt := uint64(*response.Result.BlockTime) + blockTime = &bt + } + + rawTx, err := FromRpcTransactionWithMeta(txWithMeta, blockTime, response.Result.Slot, 0) + if err != nil { + t.Fatalf("convert fixture %s: %v", fixturePath, err) + } + + tx, err := ParseRawTx(rawTx) + if err != nil { + t.Fatalf("parse fixture %s: %v", fixturePath, err) + } + return tx +} + +func assertDecimalString(t *testing.T, field string, got decimal.Decimal, want string) { + t.Helper() + + wantDecimal, err := decimal.NewFromString(want) + if err != nil { + t.Fatalf("invalid expected decimal for %s: %v", field, err) + } + if !got.Equal(wantDecimal) { + t.Fatalf("%s = %s, want %s", field, got.String(), want) + } +} + +func assertPublicKey(t *testing.T, field string, got solana.PublicKey, want string) { + t.Helper() + + wantKey := solana.MustPublicKeyFromBase58(want) + if !got.Equals(wantKey) { + t.Fatalf("%s = %s, want %s", field, got, wantKey) + } +} diff --git a/swap_amounts_test.go b/swap_amounts_test.go new file mode 100644 index 0000000..1a5382c --- /dev/null +++ b/swap_amounts_test.go @@ -0,0 +1,150 @@ +package pump_parser + +import ( + "testing" + + "github.com/gagliardetto/solana-go" + "github.com/shopspring/decimal" +) + +func TestSetSwapAmountInfoExactInBuy(t *testing.T) { + swap := Swap{ + Event: TxEventBuy, + BaseMint: solana.MustPublicKeyFromBase58("11111111111111111111111111111111"), + QuoteMint: solana.MustPublicKeyFromBase58("So11111111111111111111111111111111111111112"), + BaseAmount: decimal.NewFromInt(120), + QuoteAmount: decimal.NewFromInt(100), + } + + swap.SetSwapAmountInfo(SwapModeExactIn, decimal.NewFromInt(100), decimal.NewFromInt(110)) + + if swap.FixedAmountSide != SwapAmountSideQuote { + t.Fatalf("fixed side = %s, want quote", swap.FixedAmountSide.String()) + } + if swap.LimitAmountType != SwapLimitTypeMinOut { + t.Fatalf("limit type = %s, want min_out", swap.LimitAmountType.String()) + } + if swap.LimitAmountSide != SwapAmountSideBase { + t.Fatalf("limit side = %s, want base", swap.LimitAmountSide.String()) + } + if !swap.ActualLimitAmount.Equal(decimal.NewFromInt(120)) { + t.Fatalf("actual limit amount = %s, want 120", swap.ActualLimitAmount) + } + if got := swap.SlippageBps.StringFixed(4); got != "833.3333" { + t.Fatalf("slippage bps = %s, want 833.3333", got) + } +} + +func TestSetSwapAmountInfoExactOutSell(t *testing.T) { + swap := Swap{ + Event: TxEventSell, + BaseMint: solana.MustPublicKeyFromBase58("11111111111111111111111111111111"), + QuoteMint: solana.MustPublicKeyFromBase58("So11111111111111111111111111111111111111112"), + BaseAmount: decimal.NewFromInt(95), + QuoteAmount: decimal.NewFromInt(100), + } + + swap.SetSwapAmountInfo(SwapModeExactOut, decimal.NewFromInt(100), decimal.NewFromInt(105)) + + if swap.FixedAmountSide != SwapAmountSideQuote { + t.Fatalf("fixed side = %s, want quote", swap.FixedAmountSide.String()) + } + if swap.LimitAmountType != SwapLimitTypeMaxIn { + t.Fatalf("limit type = %s, want max_in", swap.LimitAmountType.String()) + } + if swap.LimitAmountSide != SwapAmountSideBase { + t.Fatalf("limit side = %s, want base", swap.LimitAmountSide.String()) + } + if !swap.ActualLimitAmount.Equal(decimal.NewFromInt(95)) { + t.Fatalf("actual limit amount = %s, want 95", swap.ActualLimitAmount) + } + if got := swap.SlippageBps.StringFixed(4); got != "952.3810" { + t.Fatalf("slippage bps = %s, want 952.3810", got) + } +} + +func TestSetSwapAmountInfoExactInZeroLimitUsesMaxSlippage(t *testing.T) { + swap := Swap{ + Event: TxEventSell, + BaseMint: solana.MustPublicKeyFromBase58("11111111111111111111111111111111"), + QuoteMint: solana.MustPublicKeyFromBase58("So11111111111111111111111111111111111111112"), + BaseAmount: decimal.NewFromInt(50), + QuoteAmount: decimal.NewFromInt(25), + } + + swap.SetSwapAmountInfo(SwapModeExactIn, decimal.NewFromInt(50), decimal.Zero) + + if got := swap.SlippageBps.String(); got != "10000" { + t.Fatalf("slippage bps = %s, want 10000", got) + } +} + +func TestMeteoraDammSwapAmountInfo(t *testing.T) { + tests := []struct { + name string + event string + params *struct { + Amount0 uint64 + Amount1 uint64 + SwapMode uint8 + } + wantMode SwapMode + wantFixed int64 + wantLimit int64 + }{ + { + name: "sell exact in uses amount0 as input and amount1 as min out", + event: TxEventSell, + params: &struct { + Amount0 uint64 + Amount1 uint64 + SwapMode uint8 + }{Amount0: 100, Amount1: 95, SwapMode: 0}, + wantMode: SwapModeExactIn, + wantFixed: 100, + wantLimit: 95, + }, + { + name: "sell partial fill follows exact in semantics", + event: TxEventSell, + params: &struct { + Amount0 uint64 + Amount1 uint64 + SwapMode uint8 + }{Amount0: 101, Amount1: 96, SwapMode: 1}, + wantMode: SwapModeExactIn, + wantFixed: 101, + wantLimit: 96, + }, + { + name: "buy exact out uses amount0 as target output and amount1 as max input", + event: TxEventBuy, + params: &struct { + Amount0 uint64 + Amount1 uint64 + SwapMode uint8 + }{Amount0: 120, Amount1: 130, SwapMode: 2}, + wantMode: SwapModeExactOut, + wantFixed: 120, + wantLimit: 130, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + gotMode, gotFixed, gotLimit, ok := meteoraDammSwapAmountInfo(tt.event, tt.params) + if !ok { + t.Fatal("ok = false, want true") + } + if gotMode != tt.wantMode { + t.Fatalf("mode = %s, want %s", gotMode.String(), tt.wantMode.String()) + } + if !gotFixed.Equal(decimal.NewFromInt(tt.wantFixed)) { + t.Fatalf("fixed = %s, want %d", gotFixed, tt.wantFixed) + } + if !gotLimit.Equal(decimal.NewFromInt(tt.wantLimit)) { + t.Fatalf("limit = %s, want %d", gotLimit, tt.wantLimit) + } + }) + } +} diff --git a/testdata/rpc/1r3gfEse3WAy5H6h4jMSNq1K5KZNCrMdAtCnpBSE1xkHQEt3EJ2J6Lk6ihQshrfsrS5FbqP5WuUSZG6zPCJB5TE.json b/testdata/rpc/1r3gfEse3WAy5H6h4jMSNq1K5KZNCrMdAtCnpBSE1xkHQEt3EJ2J6Lk6ihQshrfsrS5FbqP5WuUSZG6zPCJB5TE.json new file mode 100644 index 0000000..950bb85 --- /dev/null +++ b/testdata/rpc/1r3gfEse3WAy5H6h4jMSNq1K5KZNCrMdAtCnpBSE1xkHQEt3EJ2J6Lk6ihQshrfsrS5FbqP5WuUSZG6zPCJB5TE.json @@ -0,0 +1 @@ +{"jsonrpc":"2.0","id":1,"result":{"slot":413537108,"transaction":["AQC6ryj1SGydrx6q7silXNwlIJqMnATDdPPSR0Bsqi1buY1W211iEc7u5O23MnBl8DZoH8Suqr/j51bAi9EKLwGAAQAIEKRfHzWWuAXzU/gwY/S/gSTLF4ccxQ0brsjaf1xFjHEz4YZbD2Bomr/q93HgE0SLCvt3fiLAQqcP66L4d/W3an2nWzlorGTOOLsxsHslJbhpy/CGGsHykrZqjTzBRmlS8LZelb5sIxqHFd7M14F6vmuCyWfTgHFSDGruSSJS1CCoL7jzDFBPBJrrgjqNwiQ0cIfaoZLFQ9AfdxPBKwZvBA35zY0VnL0CFcwa1eO7xeAiQPV+Gqksi6hoZYoC3ZhhJ8ciytA4YrBSdR6hb5OIo8JhTzRJwcx7tRC5b6YFNsg7uACAIZSDbNM/zKp3L3ydPdMGMtYjvBooNMzch67WojoDBkZv5SEXMv/srbpyw5vnvIzlu8X3EmssQ5s6QAAAAIyXJY9OJInxuz0QKRSODYMLWhOZ2v8QhASOe9jb6fhZkwRs5KqEgFtNqO1DVq/XEPQ7RzoShLbR51vSVYdzFV4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbd9uHXZaGT2cvhRs7reawctIXtX1s3kTqM9YV+/wCpBQQ7lU3KJuHvkbUsT4+Jr4pvWsjGIVbxcc8PIaxRySIvXdLCJ5JL53Z/9r1eidJ6hcBTq7ZuiGcR5rrvxYW4SxIHuZs13eKOS57e6X5J12OXtaSgyT+v0nTHhqAGjt1v96sTg+NPnG58/xVycjtS0PrKLIHjyc9wxBMY1nkbpcgHCAAJA6CGAQAAAAAACAAFAsAnCQAJBgABAAoLDAEBCwIAAnwDAAAApF8fNZa4BfNT+DBj9L+BJMsXhxzFDRuuyNp/XEWMcTMgAAAAAAAAAEdKcFhVWWRXNkVUcWVvTGgzcnNqbU1jcUVtaDlRQlJTcLS3AAAAAAClAAAAAAAAAAbd9uHXZaGT2cvhRs7reawctIXtX1s3kTqM9YV+/wCpDAQCEAARAQENEgASEw4DAQIEBQoQDAwPDQsGByD66g171ZwT7ICWmAAAAAAArtXybW8FAAAAAAAAAAAAAAwDAgAAAQkBjsYA8pzFnlrYt+4SwjzHO3pbiRRiRs3w8L+AY63zEnUABEAFQUI=","base64"],"meta":{"err":null,"status":{"Ok":null},"fee":65000,"preBalances":[102585783,2039280,0,3876720,2039280,260338685,198908409695,8639312,1,3387961056,1461600,1,5598483284,37580031,7461120,0,1482665471528,1009200,0,3473651],"postBalances":[92520783,2039280,0,3876720,2039280,270258685,198908484695,8644312,1,3387961056,1461600,1,5598483284,37580031,7461120,0,1482665471528,1009200,0,3473651],"innerInstructions":[{"index":5,"instructions":[{"programIdIndex":13,"accounts":[15],"data":"EwDfpErTWwQhCAycT1hw3kwLr33ZTthZYxHYjHoG8JtwmQ2mXhxfTcp6B2wcknz7HT9VbNzWEriR19oa7Ny9KCkLnxbAnt9KZE85t72RL7CJGvXETh9skcrmhxQJtFNqtQQz2YVR9S782Ji9UEhsJtkjXHMFpR2KRzwqQFVVosHfHmPvjGGmwd6SZiuMJzGvw6TQvs4DWKn829nTpZbv","stackHeight":2},{"programIdIndex":12,"accounts":[2,16,5,0],"data":"hjt27wSFrm67A","stackHeight":2},{"programIdIndex":12,"accounts":[4,10,1,18],"data":"gHShbRyLqtLC5","stackHeight":2},{"programIdIndex":12,"accounts":[5,16,6,18],"data":"jG9AwHqf7C2EU","stackHeight":2},{"programIdIndex":12,"accounts":[5,16,7,18],"data":"hqQZfL5QfjSfS","stackHeight":2}]}],"logMessages":["Program ComputeBudget111111111111111111111111111111 invoke [1]","Program ComputeBudget111111111111111111111111111111 success","Program ComputeBudget111111111111111111111111111111 invoke [1]","Program ComputeBudget111111111111111111111111111111 success","Program ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL invoke [1]","Program log: CreateIdempotent","Program ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL consumed 5838 of 599700 compute units","Program ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL success","Program 11111111111111111111111111111111 invoke [1]","Program 11111111111111111111111111111111 success","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [1]","Program log: Instruction: InitializeAccount","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 3443 of 593712 compute units","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA success","Program LanMV9sAd7wArD4vJFi2qDdfnVhFxYSUg6eADduJ3uj invoke [1]","Program log: Instruction: BuyExactIn","Program LanMV9sAd7wArD4vJFi2qDdfnVhFxYSUg6eADduJ3uj invoke [2]","Program LanMV9sAd7wArD4vJFi2qDdfnVhFxYSUg6eADduJ3uj consumed 2159 of 564098 compute units","Program LanMV9sAd7wArD4vJFi2qDdfnVhFxYSUg6eADduJ3uj success","Program data: vdt/007mYe62XpW+bCMahxXezNeBer5rgsln04BxUgxq7kkiUtQgqACAm/3dBhYAGAaEvwqEIABts35TAwAAACjxs9lBiAAAl5ArDgAAAAA2KCP11I0AAO+Mwg4AAAAAgJaYAAAAAAAON28bkwUAAKhhAAAAAAAA+CQBAAAAAACIEwAAAAAAAAAAAAAAAAAAAAAB","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [2]","Program log: Instruction: TransferChecked","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 6238 of 559061 compute units","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA success","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [2]","Program log: Instruction: TransferChecked","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 6147 of 550418 compute units","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA success","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [2]","Program log: Instruction: TransferChecked","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 6238 of 536166 compute units","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA success","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [2]","Program log: Instruction: TransferChecked","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 6238 of 527522 compute units","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA success","Program LanMV9sAd7wArD4vJFi2qDdfnVhFxYSUg6eADduJ3uj consumed 71551 of 590269 compute units","Program LanMV9sAd7wArD4vJFi2qDdfnVhFxYSUg6eADduJ3uj success","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [1]","Program log: Instruction: CloseAccount","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 2915 of 518718 compute units","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA success"],"preTokenBalances":[{"accountIndex":1,"mint":"Attr2sqaXr76XqaDxdtnQ4QAEsaFdgTGr599F7ytgray","uiTokenAmount":{"uiAmount":93730490.67423,"decimals":6,"amount":"93730490674230","uiAmountString":"93730490.67423"},"owner":"C4dzM6n9V9ZuDVP2DRL3SktnEnJNj1M3tNFCJcsN3Yjt","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":4,"mint":"Attr2sqaXr76XqaDxdtnQ4QAEsaFdgTGr599F7ytgray","uiTokenAmount":{"uiAmount":9850183593.299671,"decimals":6,"amount":"9850183593299672","uiAmountString":"9850183593.299672"},"owner":"WLHv2UAZm6z4KyaaELi5pjdbJh6RESMva1Rnn8pJVVh","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":5,"mint":"So11111111111111111111111111111111111111112","uiTokenAmount":{"uiAmount":0.258299405,"decimals":9,"amount":"258299405","uiAmountString":"0.258299405"},"owner":"WLHv2UAZm6z4KyaaELi5pjdbJh6RESMva1Rnn8pJVVh","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":6,"mint":"So11111111111111111111111111111111111111112","uiTokenAmount":{"uiAmount":198.906370169,"decimals":9,"amount":"198906370169","uiAmountString":"198.906370169"},"owner":"56XVRVAsgWv6ADaxzoNnbL38LMoWKM5WiSAhrAWUbd2p","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":7,"mint":"So11111111111111111111111111111111111111112","uiTokenAmount":{"uiAmount":0.006600032,"decimals":9,"amount":"6600032","uiAmountString":"0.006600032"},"owner":"9sHpTfmVpCfP2zexRNK6j38NBchMv1RWpdXPK5NEcZan","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"}],"postTokenBalances":[{"accountIndex":1,"mint":"Attr2sqaXr76XqaDxdtnQ4QAEsaFdgTGr599F7ytgray","uiTokenAmount":{"uiAmount":99859869.279044,"decimals":6,"amount":"99859869279044","uiAmountString":"99859869.279044"},"owner":"C4dzM6n9V9ZuDVP2DRL3SktnEnJNj1M3tNFCJcsN3Yjt","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":4,"mint":"Attr2sqaXr76XqaDxdtnQ4QAEsaFdgTGr599F7ytgray","uiTokenAmount":{"uiAmount":9844054214.694859,"decimals":6,"amount":"9844054214694858","uiAmountString":"9844054214.694858"},"owner":"WLHv2UAZm6z4KyaaELi5pjdbJh6RESMva1Rnn8pJVVh","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":5,"mint":"So11111111111111111111111111111111111111112","uiTokenAmount":{"uiAmount":0.268219405,"decimals":9,"amount":"268219405","uiAmountString":"0.268219405"},"owner":"WLHv2UAZm6z4KyaaELi5pjdbJh6RESMva1Rnn8pJVVh","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":6,"mint":"So11111111111111111111111111111111111111112","uiTokenAmount":{"uiAmount":198.906445169,"decimals":9,"amount":"198906445169","uiAmountString":"198.906445169"},"owner":"56XVRVAsgWv6ADaxzoNnbL38LMoWKM5WiSAhrAWUbd2p","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":7,"mint":"So11111111111111111111111111111111111111112","uiTokenAmount":{"uiAmount":0.006605032,"decimals":9,"amount":"6605032","uiAmountString":"0.006605032"},"owner":"9sHpTfmVpCfP2zexRNK6j38NBchMv1RWpdXPK5NEcZan","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"}],"rewards":[],"loadedAddresses":{"writable":[],"readonly":["So11111111111111111111111111111111111111112","SysvarRent111111111111111111111111111111111","WLHv2UAZm6z4KyaaELi5pjdbJh6RESMva1Rnn8pJVVh","6s1xP3hpbAfFoNtUNF8mfHsjr2Bd97JxFJRWLbL6aHuX"]},"computeUnitsConsumed":84197,"costUnits":88048},"version":0,"blockTime":1776317144}} \ No newline at end of file diff --git a/testdata/rpc/288FAsrj7h6hTKywtVaqCqHAbNZ6x3Xuich9kQMGVarVUnUjkqTabxQE9JHyranGY9eqUivZbBTzC5dH1BEuJ6pa.json b/testdata/rpc/288FAsrj7h6hTKywtVaqCqHAbNZ6x3Xuich9kQMGVarVUnUjkqTabxQE9JHyranGY9eqUivZbBTzC5dH1BEuJ6pa.json new file mode 100644 index 0000000..dd4a26a --- /dev/null +++ b/testdata/rpc/288FAsrj7h6hTKywtVaqCqHAbNZ6x3Xuich9kQMGVarVUnUjkqTabxQE9JHyranGY9eqUivZbBTzC5dH1BEuJ6pa.json @@ -0,0 +1 @@ +{"jsonrpc":"2.0","id":1,"result":{"slot":413518444,"transaction":["ATgpRz9xBCn7LUuBvHdUvka+xAOd7Jr2WNHN0WSAQ0xOsUskzetXgI1GlJXs/+WbRlWCwA1WqDntmN0/5PcMGAOAAQAECDMnv5UluXe/pie6ZEoRXnTH+OYzquKwSPKd3lQJMZSgLe/WpAKn/YcQFr9V+ttyz7cVU20BwGgUkV/zmu7ZXuZU5hwFuHrtuYAx8IYqUeab2yG8Dl6im4I5RIkCj3I+fLFODeVen7qGOW6/1UjP+MkgEerHt1uqmy2caob1oXFBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBkZv5SEXMv/srbpyw5vnvIzlu8X3EmssQ5s6QAAAAJb/m/r6+VcrOj4MMwcy6w08p5Uq1Tv31mxqotT1sJP1syE/uov5yH+pHkeBlijDg+AL6n6Yx6A+A7oQac/D9vP43kTUEH7hhEI1hKtpBqzMlYxNO5MONLvUR5+iF3ZplgUFAAUC3KgCAAUABQQ0S/wABQAJA3EcAAAAAAAABjQXHwASFw4YDREPEBMhHxUkFhQYAgAlACcHGwIBGhkfHyMgHCYIHQsJARcgHgodAB8fIh0MFMghAAAAOEUAAAAAAA0AAAAEABUBBAIAAwwCAAAASwkAAAAAAAAFvhEWUFXGIiFfT2Fvc3XGsLgOBGPUHwSN7svlt2hrzOsFy8nSztQG0R4E0wPNwOd0RzIzCV9nMcY7tZ9yjqtz3Ky3nX1pLD/dqjr0nSsHDQIPDhAICQDke+YxiaLxsDnHcaE6+X01PuDe4wt0BEyJXX3/vdXHjgP69vkBMxoQ3Z2/L2HtmzPIDko6vw8sqAyTJMkrX91dJ8u7W70+AqipBA4GFwg2pSikOzvp0mYRrji7ajeaO/qkte5tAumwsQ4Na868RwSXmJSaAA==","base64"],"meta":{"err":null,"status":{"Ok":null},"fee":6270,"preBalances":[1043224830,2039280,2039280,948600,1,1,1141440,2584522,2007182734,392450796703,23385600,2039287,71437440,2039303,172698660431,0,70407360,1920960,5439884,2662723,2039280,6124800,2039280,14760004527,2039280,2039280,2039280,5324400,29252880,34988462,1482665471528,5598483284,583528695,8205554,5987434,1461600,34551940731,5668616957,50333567,1274329121937],"postBalances":[1043216181,2039280,2039280,950979,1,1,1141440,2584522,2007182734,392446239519,23385600,2039287,71437440,2039303,172703196751,0,70407360,1920960,5439884,2662723,2039280,6124800,2039280,14760025391,2039280,2039280,2039280,5324400,29252880,34988462,1482665471528,5598483284,583528695,8205554,5987434,1461600,34551940731,5668616957,50333567,1274329121937],"innerInstructions":[{"index":3,"instructions":[{"programIdIndex":33,"accounts":[31,0,18,23,14,24,13,17,15,16,19,33],"data":"KKu2BJyMZr9zXu1LP21UU9nrxttsEvu9GVMfRyvf6KdEuMo7kWj6Qt15gyM","stackHeight":2},{"programIdIndex":31,"accounts":[23,14,0],"data":"3DVhGxZjRFVH","stackHeight":3},{"programIdIndex":31,"accounts":[13,24,18],"data":"3gNZBtS4nMW7","stackHeight":3},{"programIdIndex":37,"accounts":[31,21,36,22,20,24,2,0,37],"data":"A4fLQazY2hCRhcdDtFZoFQb","stackHeight":2},{"programIdIndex":31,"accounts":[24,20,0],"data":"3gNZBtS4nMW7","stackHeight":3},{"programIdIndex":31,"accounts":[22,2,36],"data":"3MiC9kRs2dDq","stackHeight":3},{"programIdIndex":38,"accounts":[0,39,7,27,2,1,26,25,31,31,35,32,28],"data":"E73fXHPWvSR6e5cu3zQJ9nt7PJSWqVS23","stackHeight":2},{"programIdIndex":31,"accounts":[2,35,26,0],"data":"gjNXrwdNcPrLQ","stackHeight":3},{"programIdIndex":31,"accounts":[25,32,1,39],"data":"h1apAc2JEQgHg","stackHeight":3},{"programIdIndex":29,"accounts":[8,29,11,9,1,23,32,30,10,29,0,31,31,34,29,12],"data":"PgQWtn8oziwybHN1QynKhQM4hPV9EweoZ","stackHeight":2},{"programIdIndex":31,"accounts":[1,32,11,0],"data":"h1apAc2JEQgHg","stackHeight":3},{"programIdIndex":31,"accounts":[9,30,23,8],"data":"hjqnrmNXPn7u2","stackHeight":3},{"programIdIndex":29,"accounts":[34],"data":"yCGxBopjnVNQkNP5usq1Pnrk5vYp8wLPzwCLqQmDY2eYrtYE1PEJvxprvD53LuNoT1hz9xfqzdsf9gXSjadP8ipfsSfu9bbj68u4mbBcjNbW3GZ7xDp95RcrGJAPm76h515awnE54fNH1EzJvYQhipVCacJGTN6DZnnG4oogivy8ErkWamuWAExLtvdnY5qYmKhb3d","stackHeight":3}]}],"logMessages":["Program ComputeBudget111111111111111111111111111111 invoke [1]","Program ComputeBudget111111111111111111111111111111 success","Program ComputeBudget111111111111111111111111111111 invoke [1]","Program ComputeBudget111111111111111111111111111111 success","Program ComputeBudget111111111111111111111111111111 invoke [1]","Program ComputeBudget111111111111111111111111111111 success","Program BASDaPs2cdVTsvgPRfESDLZgek8tKRTfqbR2ksdgptsn invoke [1]","Program whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc invoke [2]","Program log: Instruction: Swap","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [3]","Program log: Instruction: Transfer","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 4736 of 134109 compute units","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA success","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [3]","Program log: Instruction: Transfer","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 4645 of 127359 compute units","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA success","Program data: 4cpJr5MroJbOM6hJw6X9p4m/l1DaTq0Ed/7X0lBKeShP7RPc8Y6V+QHssksmkLvNSgAAAAAAAAAA5PrMm/lVzUoAAAAAAAAAAAA4RQAAAAAAoOgFAAAAAAAAAAAAAAAAAAAAAAAAAAAAJgMAAAAAAAB4AAAAAAAAAA==","Program whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc consumed 48900 of 168970 compute units","Program whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc success","Program 675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8 invoke [2]","Program log: ray_log: A6DoBQAAAAAAAAAAAAAAAAABAAAAAAAAAGfpBQAAAAAATt6Q/zxHBwD7yGglAAAAADFWQmAlAQAA","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [3]","Program log: Instruction: Transfer","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 4645 of 104519 compute units","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA success","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [3]","Program log: Instruction: Transfer","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 4645 of 97458 compute units","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA success","Program 675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8 consumed 25627 of 117845 compute units","Program 675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8 success","Program CPMMoo8L3F4NbTegBCKVNunggL7H1ZpdTHKxQB5qKP1C invoke [2]","Program log: Instruction: SwapBaseInput","Program data: QMbN6CYIceJTEmpIjg5naqRTHrd9SSYUCZTmtoXcjmDJJQccudGHFNIcqzuLGQEA/RG3NC4AAAAxVkJgJQEAAEdL1S8AAAAAAAAAAAAAAAAAAAAAAAAAAAEne0tnJbBoH4gdVaTksmOfSulTCXqpz2zps6gfpga6VQwA2864zqpzWJRaR1vKnwAq0LLm2LBjyCWoWBZDufV10bnCuwAAAAAAAAAAAAAAAAE=","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [3]","Program log: Instruction: TransferChecked","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 6147 of 71008 compute units","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA success","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [3]","Program log: Instruction: TransferChecked","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 6173 of 62454 compute units","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA success","Program CPMMoo8L3F4NbTegBCKVNunggL7H1ZpdTHKxQB5qKP1C consumed 34853 of 89787 compute units","Program CPMMoo8L3F4NbTegBCKVNunggL7H1ZpdTHKxQB5qKP1C success","Program LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo invoke [2]","Program log: Instruction: Swap","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [3]","Program log: Instruction: TransferChecked","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 6173 of 32460 compute units","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA success","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [3]","Program log: Instruction: TransferChecked","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 6238 of 23814 compute units","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA success","Program LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo invoke [3]","Program LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo consumed 2221 of 14669 compute units","Program LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo success","Program LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo consumed 40794 of 52322 compute units","Program LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo success","Program BASDaPs2cdVTsvgPRfESDLZgek8tKRTfqbR2ksdgptsn consumed 162386 of 173850 compute units","Program BASDaPs2cdVTsvgPRfESDLZgek8tKRTfqbR2ksdgptsn success","Program 11111111111111111111111111111111 invoke [1]","Program 11111111111111111111111111111111 success"],"preTokenBalances":[{"accountIndex":1,"mint":"oreoU2P8bN6jkk3jbaiVxYnG1dCXcYxwhwyK9jSybcp","uiTokenAmount":{"uiAmount":null,"decimals":11,"amount":"0","uiAmountString":"0"},"owner":"4SgwtApqXAXmkNSGGBzAvndVjXjnGkk8xS44DHm2as4s","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":2,"mint":"3f7wfg9yHLtGKvy75MmqsVT1ueTFoqyySQbusrX1YAQ4","uiTokenAmount":{"uiAmount":null,"decimals":9,"amount":"0","uiAmountString":"0"},"owner":"4SgwtApqXAXmkNSGGBzAvndVjXjnGkk8xS44DHm2as4s","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":9,"mint":"So11111111111111111111111111111111111111112","uiTokenAmount":{"uiAmount":392.448757414,"decimals":9,"amount":"392448757414","uiAmountString":"392.448757414"},"owner":"3Mt1bpU3fnSXyPEm66HKKXyQTpLWrwYziPLqwTqK4ZT7","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":11,"mint":"oreoU2P8bN6jkk3jbaiVxYnG1dCXcYxwhwyK9jSybcp","uiTokenAmount":{"uiAmount":756.78669012519,"decimals":11,"amount":"75678669012519","uiAmountString":"756.78669012519"},"owner":"3Mt1bpU3fnSXyPEm66HKKXyQTpLWrwYziPLqwTqK4ZT7","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":13,"mint":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","uiTokenAmount":{"uiAmount":4339.070939,"decimals":6,"amount":"4339070939","uiAmountString":"4339.070939"},"owner":"Esvfxt3jMDdtTZqLF1fqRhDjzM8Bpr7fZxJMrK69PB7e","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":14,"mint":"So11111111111111111111111111111111111111112","uiTokenAmount":{"uiAmount":172.696617088,"decimals":9,"amount":"172696617088","uiAmountString":"172.696617088"},"owner":"Esvfxt3jMDdtTZqLF1fqRhDjzM8Bpr7fZxJMrK69PB7e","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":20,"mint":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","uiTokenAmount":{"uiAmount":627.624187,"decimals":6,"amount":"627624187","uiAmountString":"627.624187"},"owner":"5Q544fKrFoe6tsEbD7S8EmxGTJYAKtTVhAW5Q5pge4j1","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":22,"mint":"3f7wfg9yHLtGKvy75MmqsVT1ueTFoqyySQbusrX1YAQ4","uiTokenAmount":{"uiAmount":2048652.148268622,"decimals":9,"amount":"2048652148268622","uiAmountString":"2048652.148268622"},"owner":"5Q544fKrFoe6tsEbD7S8EmxGTJYAKtTVhAW5Q5pge4j1","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":23,"mint":"So11111111111111111111111111111111111111112","uiTokenAmount":{"uiAmount":14.757955247,"decimals":9,"amount":"14757955247","uiAmountString":"14.757955247"},"owner":"4SgwtApqXAXmkNSGGBzAvndVjXjnGkk8xS44DHm2as4s","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":24,"mint":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","uiTokenAmount":{"uiAmount":0.000199,"decimals":6,"amount":"199","uiAmountString":"0.000199"},"owner":"4SgwtApqXAXmkNSGGBzAvndVjXjnGkk8xS44DHm2as4s","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":25,"mint":"oreoU2P8bN6jkk3jbaiVxYnG1dCXcYxwhwyK9jSybcp","uiTokenAmount":{"uiAmount":2.00303038394,"decimals":11,"amount":"200303038394","uiAmountString":"2.00303038394"},"owner":"GpMZbSM2GgvTKHJirzeGfMFoaZ8UR2X7F4v8vHTvxFbL","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":26,"mint":"3f7wfg9yHLtGKvy75MmqsVT1ueTFoqyySQbusrX1YAQ4","uiTokenAmount":{"uiAmount":314104.63772876,"decimals":9,"amount":"314104637728760","uiAmountString":"314104.63772876"},"owner":"GpMZbSM2GgvTKHJirzeGfMFoaZ8UR2X7F4v8vHTvxFbL","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"}],"postTokenBalances":[{"accountIndex":1,"mint":"oreoU2P8bN6jkk3jbaiVxYnG1dCXcYxwhwyK9jSybcp","uiTokenAmount":{"uiAmount":null,"decimals":11,"amount":"0","uiAmountString":"0"},"owner":"4SgwtApqXAXmkNSGGBzAvndVjXjnGkk8xS44DHm2as4s","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":2,"mint":"3f7wfg9yHLtGKvy75MmqsVT1ueTFoqyySQbusrX1YAQ4","uiTokenAmount":{"uiAmount":null,"decimals":9,"amount":"0","uiAmountString":"0"},"owner":"4SgwtApqXAXmkNSGGBzAvndVjXjnGkk8xS44DHm2as4s","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":9,"mint":"So11111111111111111111111111111111111111112","uiTokenAmount":{"uiAmount":392.44420023,"decimals":9,"amount":"392444200230","uiAmountString":"392.44420023"},"owner":"3Mt1bpU3fnSXyPEm66HKKXyQTpLWrwYziPLqwTqK4ZT7","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":11,"mint":"oreoU2P8bN6jkk3jbaiVxYnG1dCXcYxwhwyK9jSybcp","uiTokenAmount":{"uiAmount":756.7947152011,"decimals":11,"amount":"75679471520110","uiAmountString":"756.7947152011"},"owner":"3Mt1bpU3fnSXyPEm66HKKXyQTpLWrwYziPLqwTqK4ZT7","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":13,"mint":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","uiTokenAmount":{"uiAmount":4338.683707,"decimals":6,"amount":"4338683707","uiAmountString":"4338.683707"},"owner":"Esvfxt3jMDdtTZqLF1fqRhDjzM8Bpr7fZxJMrK69PB7e","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":14,"mint":"So11111111111111111111111111111111111111112","uiTokenAmount":{"uiAmount":172.701153408,"decimals":9,"amount":"172701153408","uiAmountString":"172.701153408"},"owner":"Esvfxt3jMDdtTZqLF1fqRhDjzM8Bpr7fZxJMrK69PB7e","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":20,"mint":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","uiTokenAmount":{"uiAmount":628.011419,"decimals":6,"amount":"628011419","uiAmountString":"628.011419"},"owner":"5Q544fKrFoe6tsEbD7S8EmxGTJYAKtTVhAW5Q5pge4j1","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":22,"mint":"3f7wfg9yHLtGKvy75MmqsVT1ueTFoqyySQbusrX1YAQ4","uiTokenAmount":{"uiAmount":2047392.107890717,"decimals":9,"amount":"2047392107890717","uiAmountString":"2047392.107890717"},"owner":"5Q544fKrFoe6tsEbD7S8EmxGTJYAKtTVhAW5Q5pge4j1","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":23,"mint":"So11111111111111111111111111111111111111112","uiTokenAmount":{"uiAmount":14.757976111,"decimals":9,"amount":"14757976111","uiAmountString":"14.757976111"},"owner":"4SgwtApqXAXmkNSGGBzAvndVjXjnGkk8xS44DHm2as4s","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":24,"mint":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","uiTokenAmount":{"uiAmount":0.000199,"decimals":6,"amount":"199","uiAmountString":"0.000199"},"owner":"4SgwtApqXAXmkNSGGBzAvndVjXjnGkk8xS44DHm2as4s","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":25,"mint":"oreoU2P8bN6jkk3jbaiVxYnG1dCXcYxwhwyK9jSybcp","uiTokenAmount":{"uiAmount":1.99500530803,"decimals":11,"amount":"199500530803","uiAmountString":"1.99500530803"},"owner":"GpMZbSM2GgvTKHJirzeGfMFoaZ8UR2X7F4v8vHTvxFbL","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":26,"mint":"3f7wfg9yHLtGKvy75MmqsVT1ueTFoqyySQbusrX1YAQ4","uiTokenAmount":{"uiAmount":315364.678106665,"decimals":9,"amount":"315364678106665","uiAmountString":"315364.678106665"},"owner":"GpMZbSM2GgvTKHJirzeGfMFoaZ8UR2X7F4v8vHTvxFbL","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"}],"rewards":[],"loadedAddresses":{"writable":["3Mt1bpU3fnSXyPEm66HKKXyQTpLWrwYziPLqwTqK4ZT7","3YvbK9t1cmak2oH1YEU1omTFkbKaU5zWdFRZJ1zNB7Qx","6aoVtQE7A9QyzrBjcve1eUn8d8E2RhfUjGnH4ccEjBFQ","AtLNcodSmo2wh8vSBzZFrYH63P3GAUXo1yJJXs2wmRwM","FzWXc2jMiWZMrvugykMaWAvC9rjaiS6yw5pUPAqX468U","iMH9YW3kAgk4kkB74ZHPHESHAQQWPeGWn6Rmty3WJnq","5fEq5SYpSpnDUDn8dmXUmZeHVaXpL14UirnGajF9QMor","6RTqfeqqyA2oQa8viBAW8a3oFNHbVnro4V2fVuY5sjhR","7mGARAXTVakvQ2jdRRGDtVj7dixcGut3oMFuu3Z9ePr5","Dxwue6KnycHxVyU7DdQRPYtdYztFZiGBvKxBWP2BpwYz","Esvfxt3jMDdtTZqLF1fqRhDjzM8Bpr7fZxJMrK69PB7e","GLQdMoJ6RJzWSBLiguhKVqt5K7B6EBSk6xiRBxiLRpbz","6UxhCL7iTh22CStTTEYURyEzVGAM9f9FEdf73giEf4nK","7tkEbPtfcFuUgrekDCaZrz7ZiegAXfvDEamWoaK9jC9a","GKKxFzUPJKDMUkDbVDNjvfBuZixQib5ssF9xTPijQfta","6D4uFhE8E8yJ3Qj37KsKYG2X97yHHEV7o8PsrkF3VmVE","8DP3D2qZAwo3ZMYjb8ej27RXVffDCjgAhTgicRMHsihf","53YYLHMpykAcUu2Epzm45QX5UohzBbh3KeY6peYdci8C","65VnWBGbzpNiY41PX4hPUyRHYsTH82gpQQnva3meNZtY","6bH8GnqEQHZ1nTnE7sj2LsgVwapqQTucTwpPVG6hYuCF","9KjFsXy4d99ojVjLNpMFLrjy5z9cGhMc7bVyCcsiMnqP"],"readonly":["LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo","So11111111111111111111111111111111111111112","TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","oreoU2P8bN6jkk3jbaiVxYnG1dCXcYxwhwyK9jSybcp","whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc","D1ZN9Wj1fRSUQfCjhvnu1hqDMT7hzjzBBpi12nVniYD6","3f7wfg9yHLtGKvy75MmqsVT1ueTFoqyySQbusrX1YAQ4","5Q544fKrFoe6tsEbD7S8EmxGTJYAKtTVhAW5Q5pge4j1","675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8","CPMMoo8L3F4NbTegBCKVNunggL7H1ZpdTHKxQB5qKP1C","GpMZbSM2GgvTKHJirzeGfMFoaZ8UR2X7F4v8vHTvxFbL"]},"computeUnitsConsumed":162986,"costUnits":175010},"version":0,"blockTime":1776309769}} \ No newline at end of file diff --git a/testdata/rpc/3Q1BhUvqm889oJfCn96AZAJqyHi1uxdeoKQknCc9xQcajhZS5APfwzkHuNTkPJEhyGknj7VyLpkNoMmNPK3No6hC.json b/testdata/rpc/3Q1BhUvqm889oJfCn96AZAJqyHi1uxdeoKQknCc9xQcajhZS5APfwzkHuNTkPJEhyGknj7VyLpkNoMmNPK3No6hC.json new file mode 100644 index 0000000..e579dc3 --- /dev/null +++ b/testdata/rpc/3Q1BhUvqm889oJfCn96AZAJqyHi1uxdeoKQknCc9xQcajhZS5APfwzkHuNTkPJEhyGknj7VyLpkNoMmNPK3No6hC.json @@ -0,0 +1 @@ +{"jsonrpc":"2.0","id":1,"result":{"slot":413537296,"transaction":["AXfe/jC24hE/x5njmpSdq1kXmpVu82hafiGgonRaCJ1zUMubLBC5BAkPtN+Iz21WHoaIrKX4Nd/2TFDT6grw0A+AAQAGEv+wRA19wpLRawH/HkbcW591aJXZhXAZZMUr9jCHdPlzAl3/A2L2mWrKxbJw9EJIEhDdZ8W0KLG2kQbaUsPzxZwdtGJcd4PQYy8E9S87oktcVbVPkHlnOc3QSYgz5sxf3i8F8isptlOrJvWZNRdHRCwREWXRxcmAWTwcHYFJj0v9ivjAavcn5Y1TaA5or5lS1G4elEN1HwZ31kGaqf25vAmMfsV0HmMXD2BQJ5yBB4+xXxDZACbibpxzqJhZ4NhJlbnwRqOiz07iErT6kv2dAPpPsLP8/TYeQK5TkflgNepjx0JdPBRVqeV7y7bWBUd012HG6ewj6tdLMEocid4nOX/Lrza88M6YsexWK+LK5JN2TIhZLXqF/xMXogcCijjG7cyurSUVyny8H+QLdoGS3vfkga1ek6hy98Kio60HgHhy1Dj6T2VAClX3HHi55gp/shVcq+rY0Hex72kdn4bXzCncJ/Kkx4Yf6LdnJkD+GrnzpQm+6GFlgXUMGnhWcbBILwMGRm/lIRcy/+ytunLDm+e8jOW7xfcSayxDmzpAAAAAGzaXTMq+K9s3x62jwzNFEm+XPaC1QwDBrga4gMJKrP8qh193CTalGKG3702jjv5ezXZ6rqBMT0t3atKbyBg+9W1lkEO6pSoYG1hEI56NVC0f3tzWgc5+cdB1KdrJbiat1q3vll7OlUK6nSdA83QFoDrFoyS8vyt2KV6bhwB6vFH/g4OBi6j6KMPNO21ek/n6uPCXm8NyFazFskaHe6jDycq0LYmu2gyNgOx/uoMjSPvc3qu2v1geS8V1pFu+R8RkAwwABQKAqQMADAAJA2QAAAAAAAAADh8AFQ0SCxQWGwMBAhoXBRwEChEGHR8IDx4TGRgJEAcXAwAY/gE7B9qJo4Hu2pvSeNdRmhPfaPMOCJgawKpDCIxrQD8iqQKapAxIRAOOpqWKiY+TopA=","base64"],"meta":{"err":null,"status":{"Ok":null},"fee":5024,"preBalances":[129866415,17803026024189,2046284,22239800,2039280,2978901,1222140810844,2039280,2062281,2039280,17572929,2039280,1,159052311414,1141441,2000000,0,3676640903981,77567771321,1844400,1,1482665471528,5598483284,1168673625,4863717,22239416,34551940731,5668616957,8986091,3387961056,28668917,4641090],"postBalances":[129861391,17803026303288,2046284,22239800,2039280,2978901,1222140810987,2039280,2062281,2039280,17288469,2039280,1,159052311414,1141441,2000000,0,3676640903981,77567776539,1844400,1,1482665471528,5598483284,1168673625,4863717,22239416,34551940731,5668616957,8986091,3387961056,28668917,4641090],"innerInstructions":[{"index":2,"instructions":[{"programIdIndex":27,"accounts":[22,3,26,1,2,18,11,0],"data":"Ap1u6JUKaeQkoXhqCqTAAum","stackHeight":2},{"programIdIndex":22,"accounts":[18,1,0],"data":"3PNSPDYYkKVR","stackHeight":3},{"programIdIndex":22,"accounts":[2,11,26],"data":"3ogRA35NJCgf","stackHeight":3},{"programIdIndex":23,"accounts":[5,0,28,13,21,11,18,4,10,17,6,22,22,20,29,31,23,8,15,25,24,16],"data":"5jRcjdixRUDfLK4ZGGVWaD57He5CiXTpK","stackHeight":2},{"programIdIndex":24,"accounts":[25,23],"data":"2BfZXS1GQrCLYeWCWCUKUSWFtXjcH8zime6Mrp9xCpuAgw","stackHeight":3},{"programIdIndex":22,"accounts":[11,13,4,0],"data":"ihzhGD6uo9YkD","stackHeight":3},{"programIdIndex":22,"accounts":[10,21,18,5],"data":"i76yjNkbaknVN","stackHeight":3},{"programIdIndex":22,"accounts":[10,21,6,5],"data":"hvX7ywkcVFY1W","stackHeight":3},{"programIdIndex":23,"accounts":[31],"data":"5mPVTm9CVtwmkGePADgpYuovQ2r6M8oiq7NJqNkgbw7tnBt18Ns48JbhCaQCgTzXrFTBdyLwpkHZcuCKaYW27ZmGBnKKC5DZEGyEiUM6ok6zsRb5sKDhZCxfQUSvFVe2dj2R86iDgfM3SfAmDNrAHVzLu2aZd4up9jfMC9JSaEfyJwUMfpvNbBLkDNV6BGkZPDjwY1NQqdg2mBzoiYTYXBXk97d2DfnGuxp4KqgPoegzfUfz9qDRu5nNW9rBtYv1p1zSJ2ExipGJWAbYSnnBgPKKSso1dF5Aow4yfHAr4DSY5tijpoKuobF4j3FpT4hETxEQT7Tcj52SymwAEZDkR4Luv3vkuDWKbM6wtZp9dmR7dSGQ9vAYyDuPbnyZUxJ9w9CajpPhLjqMmohZKACbCQ4LoGP8SYpQhS97xxXKKU7ApJjzdHhHQEqS9cQUtXjD8bgnybm6cZkpNkPAZb3sN54Ai16E5M534ijvGseHX8Twdj3kivVCnN8k758uvJniJJXqdxF1Eud11","stackHeight":3}]}],"logMessages":["Program ComputeBudget111111111111111111111111111111 invoke [1]","Program ComputeBudget111111111111111111111111111111 success","Program ComputeBudget111111111111111111111111111111 invoke [1]","Program ComputeBudget111111111111111111111111111111 success","Program 3s1rAymURnacreXreMy718GfqW6kygQsLNka1xDyW8pC invoke [1]","Program 675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8 invoke [2]","Program log: ray_log: BP//////////zJkGAAAAAAACAAAAAAAAAMkkRw8SAAAAFZbrFjEQAACpLKrFKBkAADtCBAAAAAAA","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [3]","Program log: Instruction: Transfer","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 4736 of 189202 compute units","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA success","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [3]","Program log: Instruction: Transfer","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 4645 of 182051 compute units","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA success","Program 675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8 consumed 25855 of 202690 compute units","Program 675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8 success","Program pAMMBay6oceH9fJKBRHGP5D4bD4sWpmSwMn52FMfXEA invoke [2]","Program log: Instruction: Sell","Program pfeeUxB6jkeY1Hxd7CsFCAjcbHA9rWtchMGdZ6VojVZ invoke [3]","Program log: Instruction: GetFees","Program pfeeUxB6jkeY1Hxd7CsFCAjcbHA9rWtchMGdZ6VojVZ consumed 4291 of 134678 compute units","Program return: pfeeUxB6jkeY1Hxd7CsFCAjcbHA9rWtchMGdZ6VojVZ GQAAAAAAAAAFAAAAAAAAAAAAAAAAAAAA","Program pfeeUxB6jkeY1Hxd7CsFCAjcbHA9rWtchMGdZ6VojVZ success","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [3]","Program log: Instruction: TransferChecked","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 6147 of 126678 compute units","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA success","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [3]","Program log: Instruction: TransferChecked","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 6238 of 117710 compute units","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA success","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [3]","Program log: Instruction: TransferChecked","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 6238 of 108636 compute units","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA success","Program data: Pi83CqUD3Colc+BpAAAAAMyZBgAAAAAAAAAAAAAAAADNmQYAAAAAAI7iQg8SAAAA2PJgAQAAAABRBu0AAAAAAPVZBAAAAAAAGQAAAAAAAADJAgAAAAAAAAUAAAAAAAAAjwAAAAAAAAAsVwQAAAAAAJ1WBAAAAAAAjH7FdB5jFw9gUCecgQePsV8Q2QAm4m6cc6iYWeDYSZX/sEQNfcKS0WsB/x5G3FufdWiV2YVwGWTFK/Ywh3T5c9wn8qTHhh/ot2cmQP4aufOlCb7oYWWBdQwaeFZxsEgvJbgTE8gzoHFI7x1xcfj5S/OpbdI8nljjHwWiCbaAyXz/g4OBi6j6KMPNO21ek/n6uPCXm8NyFazFskaHe6jDybnwRqOiz07iErT6kv2dAPpPsLP8/TYeQK5TkflgNepjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==","Program pAMMBay6oceH9fJKBRHGP5D4bD4sWpmSwMn52FMfXEA invoke [3]","Program pAMMBay6oceH9fJKBRHGP5D4bD4sWpmSwMn52FMfXEA consumed 2048 of 95768 compute units","Program pAMMBay6oceH9fJKBRHGP5D4bD4sWpmSwMn52FMfXEA success","Program pAMMBay6oceH9fJKBRHGP5D4bD4sWpmSwMn52FMfXEA consumed 80019 of 172430 compute units","Program pAMMBay6oceH9fJKBRHGP5D4bD4sWpmSwMn52FMfXEA success","Program 3s1rAymURnacreXreMy718GfqW6kygQsLNka1xDyW8pC consumed 149252 of 239700 compute units","Program return: 3s1rAymURnacreXreMy718GfqW6kygQsLNka1xDyW8pC Bw==","Program 3s1rAymURnacreXreMy718GfqW6kygQsLNka1xDyW8pC success"],"preTokenBalances":[{"accountIndex":1,"mint":"So11111111111111111111111111111111111111112","uiTokenAmount":{"uiAmount":17803.023980053,"decimals":9,"amount":"17803023980053","uiAmountString":"17803.023980053"},"owner":"5Q544fKrFoe6tsEbD7S8EmxGTJYAKtTVhAW5Q5pge4j1","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":2,"mint":"2qEHjDLDLbuBgRYvsxhc5D6uDWAivNFZGan56P1tpump","uiTokenAmount":{"uiAmount":27662905.650345,"decimals":6,"amount":"27662905650345","uiAmountString":"27662905.650345"},"owner":"5Q544fKrFoe6tsEbD7S8EmxGTJYAKtTVhAW5Q5pge4j1","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":4,"mint":"2qEHjDLDLbuBgRYvsxhc5D6uDWAivNFZGan56P1tpump","uiTokenAmount":{"uiAmount":23.13084,"decimals":6,"amount":"23130840","uiAmountString":"23.13084"},"owner":"ATSCJYQrc6dv5qkLz8c1gxZkGEu2mS1BWYa1kJCkygPE","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":6,"mint":"So11111111111111111111111111111111111111112","uiTokenAmount":{"uiAmount":1222.138771564,"decimals":9,"amount":"1222138771564","uiAmountString":"1222.138771564"},"owner":"JCRGumoE9Qi5BBgULTgdgTLjSgkCMSbF62ZZfGs84JeU","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":7,"mint":"So11111111111111111111111111111111111111112","uiTokenAmount":{"uiAmount":null,"decimals":9,"amount":"0","uiAmountString":"0"},"owner":"JD6rVaerbyz6wjQ433nrw6bFTgFrp46MiYmi8EtUAfsG","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":8,"mint":"So11111111111111111111111111111111111111112","uiTokenAmount":{"uiAmount":null,"decimals":9,"amount":"0","uiAmountString":"0"},"owner":"8N3GDaZ2iwN65oxVatKTLPNooAVUJTbfiVJ1ahyqwjSk","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":9,"mint":"So11111111111111111111111111111111111111112","uiTokenAmount":{"uiAmount":null,"decimals":9,"amount":"0","uiAmountString":"0"},"owner":"ABxxW9XXAZQ3fVByRY3C3Hb2ZZDRKGi7MoCw82zLb9b6","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":10,"mint":"So11111111111111111111111111111111111111112","uiTokenAmount":{"uiAmount":0.015533649,"decimals":9,"amount":"15533649","uiAmountString":"0.015533649"},"owner":"ATSCJYQrc6dv5qkLz8c1gxZkGEu2mS1BWYa1kJCkygPE","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":11,"mint":"2qEHjDLDLbuBgRYvsxhc5D6uDWAivNFZGan56P1tpump","uiTokenAmount":{"uiAmount":0.000001,"decimals":6,"amount":"1","uiAmountString":"0.000001"},"owner":"JD6rVaerbyz6wjQ433nrw6bFTgFrp46MiYmi8EtUAfsG","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":18,"mint":"So11111111111111111111111111111111111111112","uiTokenAmount":{"uiAmount":77.565732041,"decimals":9,"amount":"77565732041","uiAmountString":"77.565732041"},"owner":"JD6rVaerbyz6wjQ433nrw6bFTgFrp46MiYmi8EtUAfsG","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"}],"postTokenBalances":[{"accountIndex":1,"mint":"So11111111111111111111111111111111111111112","uiTokenAmount":{"uiAmount":17803.024259152,"decimals":9,"amount":"17803024259152","uiAmountString":"17803.024259152"},"owner":"5Q544fKrFoe6tsEbD7S8EmxGTJYAKtTVhAW5Q5pge4j1","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":2,"mint":"2qEHjDLDLbuBgRYvsxhc5D6uDWAivNFZGan56P1tpump","uiTokenAmount":{"uiAmount":27662905.217757,"decimals":6,"amount":"27662905217757","uiAmountString":"27662905.217757"},"owner":"5Q544fKrFoe6tsEbD7S8EmxGTJYAKtTVhAW5Q5pge4j1","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":4,"mint":"2qEHjDLDLbuBgRYvsxhc5D6uDWAivNFZGan56P1tpump","uiTokenAmount":{"uiAmount":23.563428,"decimals":6,"amount":"23563428","uiAmountString":"23.563428"},"owner":"ATSCJYQrc6dv5qkLz8c1gxZkGEu2mS1BWYa1kJCkygPE","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":6,"mint":"So11111111111111111111111111111111111111112","uiTokenAmount":{"uiAmount":1222.138771707,"decimals":9,"amount":"1222138771707","uiAmountString":"1222.138771707"},"owner":"JCRGumoE9Qi5BBgULTgdgTLjSgkCMSbF62ZZfGs84JeU","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":7,"mint":"So11111111111111111111111111111111111111112","uiTokenAmount":{"uiAmount":null,"decimals":9,"amount":"0","uiAmountString":"0"},"owner":"JD6rVaerbyz6wjQ433nrw6bFTgFrp46MiYmi8EtUAfsG","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":8,"mint":"So11111111111111111111111111111111111111112","uiTokenAmount":{"uiAmount":null,"decimals":9,"amount":"0","uiAmountString":"0"},"owner":"8N3GDaZ2iwN65oxVatKTLPNooAVUJTbfiVJ1ahyqwjSk","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":9,"mint":"So11111111111111111111111111111111111111112","uiTokenAmount":{"uiAmount":null,"decimals":9,"amount":"0","uiAmountString":"0"},"owner":"ABxxW9XXAZQ3fVByRY3C3Hb2ZZDRKGi7MoCw82zLb9b6","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":10,"mint":"So11111111111111111111111111111111111111112","uiTokenAmount":{"uiAmount":0.015249189,"decimals":9,"amount":"15249189","uiAmountString":"0.015249189"},"owner":"ATSCJYQrc6dv5qkLz8c1gxZkGEu2mS1BWYa1kJCkygPE","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":11,"mint":"2qEHjDLDLbuBgRYvsxhc5D6uDWAivNFZGan56P1tpump","uiTokenAmount":{"uiAmount":0.000001,"decimals":6,"amount":"1","uiAmountString":"0.000001"},"owner":"JD6rVaerbyz6wjQ433nrw6bFTgFrp46MiYmi8EtUAfsG","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":18,"mint":"So11111111111111111111111111111111111111112","uiTokenAmount":{"uiAmount":77.565737259,"decimals":9,"amount":"77565737259","uiAmountString":"77.565737259"},"owner":"JD6rVaerbyz6wjQ433nrw6bFTgFrp46MiYmi8EtUAfsG","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"}],"rewards":[],"loadedAddresses":{"writable":["3YEt7YgiWxg9rRMHBTYku6fvx3DiGEQyfxUdsot9Cq63","ABxxW9XXAZQ3fVByRY3C3Hb2ZZDRKGi7MoCw82zLb9b6"],"readonly":["11111111111111111111111111111111","So11111111111111111111111111111111111111112","TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","pAMMBay6oceH9fJKBRHGP5D4bD4sWpmSwMn52FMfXEA","pfeeUxB6jkeY1Hxd7CsFCAjcbHA9rWtchMGdZ6VojVZ","5PHirr8joyTMp9JMm6nW7hNDVyEYdkzDqazxPD7RaTjx","5Q544fKrFoe6tsEbD7S8EmxGTJYAKtTVhAW5Q5pge4j1","675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8","ADyA8hdefvWN2dbGGWFotbzWxrAvLW83WG6QCVXvJKqw","ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL","C2aFPdENg4A2HQsmrd5rTw5TaYBX5Ku887cWjbFKtZpw","GS4CU59F31iL7aR2Q8zVS8DRrcRnXX1yjQ66TqNVQnaR"]},"returnData":{"programId":"3s1rAymURnacreXreMy718GfqW6kygQsLNka1xDyW8pC","data":["Bw==","base64"]},"computeUnitsConsumed":149552,"costUnits":158396},"version":0,"blockTime":1776317221}} \ No newline at end of file diff --git a/testdata/rpc/3XoRKna49qCAuF75ctmaYupNmYWuFm5AU73ULQjxNUxz9qJzuKqMRqq5Z88L6DooWTF44UxnxMXwqLn5t9NsoCoZ.json b/testdata/rpc/3XoRKna49qCAuF75ctmaYupNmYWuFm5AU73ULQjxNUxz9qJzuKqMRqq5Z88L6DooWTF44UxnxMXwqLn5t9NsoCoZ.json new file mode 100644 index 0000000..c0af46d --- /dev/null +++ b/testdata/rpc/3XoRKna49qCAuF75ctmaYupNmYWuFm5AU73ULQjxNUxz9qJzuKqMRqq5Z88L6DooWTF44UxnxMXwqLn5t9NsoCoZ.json @@ -0,0 +1 @@ +{"jsonrpc":"2.0","id":1,"result":{"slot":413519180,"transaction":["AX6YVEMvyogy0U65XpDwHX3zcebk81i/Gz4nL9KtqKw0aE4fqgyB1fkUDA5lp06s9g8e+M0OBei+D7otNMeCLQiAAQAFCvitqaNv+h+N3PwVc3nc0gvS4NF0NHFXG32X+JrUvVRSKXDQG66QrLoFzP8XsZ/uaYqnHS3KOHHTmjGwnJSnhs8vCen+izyOHi0JdeeA82xoLDaEARyei2yv49IzguhkrLFODeVen7qGOW6/1UjP+MkgEerHt1uqmy2caob1oXFB/CVtucLurdZ8i6funecEzReESayCmG+RFS7jwFS6XHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMGRm/lIRcy/+ytunLDm+e8jOW7xfcSayxDmzpAAAAAVzRCdjS1WC7dNV0+dE4l3/ks+7HmAmgruPU0m44G586MlyWPTiSJ8bs9ECkUjg2DC1oTmdr/EIQEjnvY2+n4WZb/m/r6+VcrOj4MMwcy6w08p5Uq1Tv31mxqotT1sJP1fMZips+twV6hTEjoj3+Tprhw1IpgXbs6kx/dG2YRBE4GBgAFAlDeAwAGAAUEg15qAAYACQMqFgAAAAAAAAgGAAQABwUgAQEJMhIPHw0QEhEdHg4fACAgIx8CIAohCwwRAQAiACcZAQQaGBUgFCYkACcbBBIWFxMgHCUkFK8jAAD+ThEAAAAAABUBAAAIAQgBBQIAAwwCAAAAiQoAAAAAAAAEdW7a2eJS2h89rC1u/oYmScMq20BFW5pzy8u9+uMQ7pcD4eTlAgKPvak7ecFZF3obHKx4S3bY6oOW5j7Xwr0D5YyOopwRCRoEjZGMZgVqAQcAkBoQ3Z2/L2HtmzPIDko6vw8sqAyTJMkrX91dJ8u7W70+AjItAQdA34MNLZIlobEinqyYovdoQgRwAN29Y8uBzM4xxORNcgpHPT9JS0RFRkxNA0g+Qg==","base64"],"meta":{"err":null,"status":{"Ok":null},"fee":6439,"preBalances":[2067637566,2039280,71437440,949747,0,1,1,1461600,3387961056,1141440,6124800,2039280,2039280,378609465447,23385700,47690475,2039386,2039280,20546358118,32092560,72161280,32092560,2039280,239904359,2039280,11637120,2039280,11637120,72161280,1482665471528,496634637030,34988462,5598483284,34551940731,5668616957,5987434,1854540726,13641600,13641600,1754201],"postBalances":[2065589150,2039280,71437440,952444,2039280,1,1,1461600,3387961056,1141440,6124800,2039280,2039280,378610599781,23385700,47690475,2039386,2039280,20546381097,32092560,72161280,32092560,2039280,238747046,2039280,11637120,2039280,11637120,72161280,1482665471528,496634637030,34988462,5598483284,34551940731,5668616957,5987434,1854540726,13641600,13641600,1754201],"innerInstructions":[{"index":3,"instructions":[{"programIdIndex":32,"accounts":[7],"data":"84eT","stackHeight":2},{"programIdIndex":5,"accounts":[0,4],"data":"11119os1e9qSs2u7TsThXqkBSRVFxhmYaFKFZ1waB2X7armDmvK3p5GmLdUxYdg3h7QSrL","stackHeight":2},{"programIdIndex":32,"accounts":[4],"data":"P","stackHeight":2},{"programIdIndex":32,"accounts":[4,7],"data":"6dsSNNVLCgXJi3MGaN7npkUU5x2NaWrKqHuRineWtnRkV","stackHeight":2}]},{"index":4,"instructions":[{"programIdIndex":31,"accounts":[15,31,13,16,18,17,29,30,14,31,0,32,32,35,31,2],"data":"PgQWtn8ozixNC1P6Q3vdzR84Dbj3YiNkw","stackHeight":2},{"programIdIndex":32,"accounts":[18,29,13,0],"data":"jLh87uVNvkCs2","stackHeight":3},{"programIdIndex":32,"accounts":[16,30,17,15],"data":"ghzsb4tgqKvmj","stackHeight":3},{"programIdIndex":31,"accounts":[35],"data":"yCGxBopjnVNQkNP5usq1PpJENynYyAXwJoCGZQARHTPnfdC3E42Day2Hu4HpR1HRfsqpdcG13xU5j41p48dndVv7obCGHJy3DZVq4tdB6r96vRXxWKx19TPGhNK5GwN5QrC4yHhfuA2SXr5noz885bs6jGLnKbqD4g54s8p8DCCK4AHBLxoFvEZyfnNusoy78AWg3R","stackHeight":3},{"programIdIndex":34,"accounts":[32,10,33,11,12,17,1,0,34],"data":"9pewZz8wkQRuem2GHABYYmM","stackHeight":2},{"programIdIndex":32,"accounts":[17,12,0],"data":"3MQ9NTx4rsHZ","stackHeight":3},{"programIdIndex":32,"accounts":[11,1,33],"data":"3smHgC6cKunX","stackHeight":3},{"programIdIndex":36,"accounts":[0,39,25,1,4,26,24,21,32,20,38],"data":"wZRp7wZ3czteueUfx9BP14Gos1E2nEjfqT1ztNzpxgqjCDN7HPmjFaCG","stackHeight":2},{"programIdIndex":32,"accounts":[1,26,0],"data":"3smHgC6cKunX","stackHeight":3},{"programIdIndex":32,"accounts":[24,4,25],"data":"3v2zK78MJz1u","stackHeight":3},{"programIdIndex":36,"accounts":[0,39,27,4,18,22,23,19,32,28,37],"data":"wZRp7wZ3cztiwYqHnmU2mYcnPdeN1mqrKXiDZDtcZLxFgsxVYBDxWy8L","stackHeight":2},{"programIdIndex":32,"accounts":[4,22,0],"data":"3v2zK78MJz1u","stackHeight":3},{"programIdIndex":32,"accounts":[23,18,27],"data":"3mrGpZxU7frF","stackHeight":3}]}],"logMessages":["Program ComputeBudget111111111111111111111111111111 invoke [1]","Program ComputeBudget111111111111111111111111111111 success","Program ComputeBudget111111111111111111111111111111 invoke [1]","Program ComputeBudget111111111111111111111111111111 success","Program ComputeBudget111111111111111111111111111111 invoke [1]","Program ComputeBudget111111111111111111111111111111 success","Program ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL invoke [1]","Program log: CreateIdempotent","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [2]","Program log: Instruction: GetAccountDataSize","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 1595 of 247719 compute units","Program return: TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA pQAAAAAAAAA=","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA success","Program 11111111111111111111111111111111 invoke [2]","Program 11111111111111111111111111111111 success","Program log: Initialize the associated token account","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [2]","Program log: Instruction: InitializeImmutableOwner","Program log: Please upgrade to SPL Token 2022 for immutable owner support","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 1405 of 241214 compute units","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA success","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [2]","Program log: Instruction: InitializeAccount3","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 4214 of 237385 compute units","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA success","Program ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL consumed 20182 of 253070 compute units","Program ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL success","Program BASDaPs2cdVTsvgPRfESDLZgek8tKRTfqbR2ksdgptsn invoke [1]","Program LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo invoke [2]","Program log: Instruction: Swap","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [3]","Program log: Instruction: TransferChecked","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 6238 of 205605 compute units","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA success","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [3]","Program log: Instruction: TransferChecked","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 6200 of 196894 compute units","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA success","Program LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo invoke [3]","Program LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo consumed 2221 of 187787 compute units","Program LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo success","Program LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo consumed 44450 of 229096 compute units","Program LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo success","Program 675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8 invoke [2]","Program log: ray_log: Ay96AQAAAAAAAAAAAAAAAAABAAAAAAAAANh6AQAAAAAAPhZRgaJPNwAwdxc5AAAAAOUDqG5tAQAA","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [3]","Program log: Instruction: Transfer","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 4645 of 169095 compute units","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA success","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [3]","Program log: Instruction: Transfer","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 4645 of 162034 compute units","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA success","Program 675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8 consumed 25627 of 182421 compute units","Program 675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8 success","Program CAMMCzo5YL8w4VFF8KVHrK22GGUsp5VTaW7grrKgrWqK invoke [2]","Program log: Instruction: Swap","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [3]","Program log: Instruction: Transfer","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 4645 of 103276 compute units","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA success","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [3]","Program log: Instruction: Transfer","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 4645 of 96416 compute units","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA success","Program data: QMbN6CYIceLD0DFD2qFyNDgxbuwPV8btl/xj2viQfVmUQT0X1EivoPitqaNv+h+N3PwVc3nc0gvS4NF0NHFXG32X+JrUvVRS/CVtucLurdZ8i6funecEzReESayCmG+RFS7jwFS6XHQpcNAbrpCsugXM/xexn+5piqcdLco4cdOaMbCclKeGz/KXBQAAAAAAAAAAAAAAAADlA6hubQEAAAAAAAAAAAAAAO005G6jES0SGwgAAAAAAADWKt0rCwAAAAAAAAAAAAAAulQCAA==","Program CAMMCzo5YL8w4VFF8KVHrK22GGUsp5VTaW7grrKgrWqK consumed 66663 of 154410 compute units","Program CAMMCzo5YL8w4VFF8KVHrK22GGUsp5VTaW7grrKgrWqK success","Program CAMMCzo5YL8w4VFF8KVHrK22GGUsp5VTaW7grrKgrWqK invoke [2]","Program log: Instruction: Swap","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [3]","Program log: Instruction: Transfer","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 4645 of 38530 compute units","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA success","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [3]","Program log: Instruction: Transfer","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 4736 of 31670 compute units","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA success","Program data: QMbN6CYIceL4qQjIfFBz416D6ExUHiYaZRrGRU4mD5910vuyKaNh1fitqaNv+h+N3PwVc3nc0gvS4NF0NHFXG32X+JrUvVRS8ndbTJ6JGXYD9YgvQEwkTX34bUkZSqDpCCVrnt4ynSr8JW25wu6t1nyLp+6d5wTNF4RJrIKYb5EVLuPAVLpcdMGoEQAAAAAAAAAAAAAAAADylwUAAAAAAAAAAAAAAAAAAB2ytUjj97WPAAAAAAAAAAAns84HAAAAAAAAAAAAAAAA49L//w==","Program CAMMCzo5YL8w4VFF8KVHrK22GGUsp5VTaW7grrKgrWqK consumed 62451 of 85363 compute units","Program CAMMCzo5YL8w4VFF8KVHrK22GGUsp5VTaW7grrKgrWqK success","Program BASDaPs2cdVTsvgPRfESDLZgek8tKRTfqbR2ksdgptsn consumed 210040 of 232888 compute units","Program BASDaPs2cdVTsvgPRfESDLZgek8tKRTfqbR2ksdgptsn success","Program 11111111111111111111111111111111 invoke [1]","Program 11111111111111111111111111111111 success"],"preTokenBalances":[{"accountIndex":1,"mint":"CiKu4eHsVrc1eueVQeHn7qhXTcVu95gSQmBpX4utjL9z","uiTokenAmount":{"uiAmount":null,"decimals":8,"amount":"0","uiAmountString":"0"},"owner":"HjjhSHoQPg2smsB4GxbVGW2hT8nm7748azFsJ4q5VHKX","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":11,"mint":"CiKu4eHsVrc1eueVQeHn7qhXTcVu95gSQmBpX4utjL9z","uiTokenAmount":{"uiAmount":155686830.9195731,"decimals":8,"amount":"15568683091957310","uiAmountString":"155686830.9195731"},"owner":"5Q544fKrFoe6tsEbD7S8EmxGTJYAKtTVhAW5Q5pge4j1","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":12,"mint":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","uiTokenAmount":{"uiAmount":957.839152,"decimals":6,"amount":"957839152","uiAmountString":"957.839152"},"owner":"5Q544fKrFoe6tsEbD7S8EmxGTJYAKtTVhAW5Q5pge4j1","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":13,"mint":"So11111111111111111111111111111111111111112","uiTokenAmount":{"uiAmount":378.607226056,"decimals":9,"amount":"378607226056","uiAmountString":"378.607226056"},"owner":"FoSDw2L5DmTuQTFe55gWPDXf88euaxAEKFre74CnvQbX","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":16,"mint":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","uiTokenAmount":{"uiAmount":13591.90776,"decimals":6,"amount":"13591907760","uiAmountString":"13591.90776"},"owner":"FoSDw2L5DmTuQTFe55gWPDXf88euaxAEKFre74CnvQbX","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":17,"mint":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","uiTokenAmount":{"uiAmount":0.000169,"decimals":6,"amount":"169","uiAmountString":"0.000169"},"owner":"HjjhSHoQPg2smsB4GxbVGW2hT8nm7748azFsJ4q5VHKX","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":18,"mint":"So11111111111111111111111111111111111111112","uiTokenAmount":{"uiAmount":20.544318838,"decimals":9,"amount":"20544318838","uiAmountString":"20.544318838"},"owner":"HjjhSHoQPg2smsB4GxbVGW2hT8nm7748azFsJ4q5VHKX","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":22,"mint":"6sQgvhAYtYFrahcjB1hKfB3ZC5YDVdfYvAqK1GKe93c9","uiTokenAmount":{"uiAmount":7410.1554,"decimals":4,"amount":"74101554","uiAmountString":"7410.1554"},"owner":"Hjfc2LMKTZ82Dy741fyeVPLbCq4eRq6tgFFGkBseJZYQ","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":23,"mint":"So11111111111111111111111111111111111111112","uiTokenAmount":{"uiAmount":0.237865079,"decimals":9,"amount":"237865079","uiAmountString":"0.237865079"},"owner":"Hjfc2LMKTZ82Dy741fyeVPLbCq4eRq6tgFFGkBseJZYQ","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":24,"mint":"6sQgvhAYtYFrahcjB1hKfB3ZC5YDVdfYvAqK1GKe93c9","uiTokenAmount":{"uiAmount":2469.9181,"decimals":4,"amount":"24699181","uiAmountString":"2469.9181"},"owner":"EBNdPxZ9d2hzXfH3Fv16cQbBPFMLtrvk9KowCXMkrAxF","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":26,"mint":"CiKu4eHsVrc1eueVQeHn7qhXTcVu95gSQmBpX4utjL9z","uiTokenAmount":{"uiAmount":1040319.55938725,"decimals":8,"amount":"104031955938725","uiAmountString":"1040319.55938725"},"owner":"EBNdPxZ9d2hzXfH3Fv16cQbBPFMLtrvk9KowCXMkrAxF","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"}],"postTokenBalances":[{"accountIndex":1,"mint":"CiKu4eHsVrc1eueVQeHn7qhXTcVu95gSQmBpX4utjL9z","uiTokenAmount":{"uiAmount":null,"decimals":8,"amount":"0","uiAmountString":"0"},"owner":"HjjhSHoQPg2smsB4GxbVGW2hT8nm7748azFsJ4q5VHKX","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":4,"mint":"6sQgvhAYtYFrahcjB1hKfB3ZC5YDVdfYvAqK1GKe93c9","uiTokenAmount":{"uiAmount":null,"decimals":4,"amount":"0","uiAmountString":"0"},"owner":"HjjhSHoQPg2smsB4GxbVGW2hT8nm7748azFsJ4q5VHKX","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":11,"mint":"CiKu4eHsVrc1eueVQeHn7qhXTcVu95gSQmBpX4utjL9z","uiTokenAmount":{"uiAmount":155671135.72389463,"decimals":8,"amount":"15567113572389465","uiAmountString":"155671135.72389465"},"owner":"5Q544fKrFoe6tsEbD7S8EmxGTJYAKtTVhAW5Q5pge4j1","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":12,"mint":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","uiTokenAmount":{"uiAmount":957.935967,"decimals":6,"amount":"957935967","uiAmountString":"957.935967"},"owner":"5Q544fKrFoe6tsEbD7S8EmxGTJYAKtTVhAW5Q5pge4j1","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":13,"mint":"So11111111111111111111111111111111111111112","uiTokenAmount":{"uiAmount":378.60836039,"decimals":9,"amount":"378608360390","uiAmountString":"378.60836039"},"owner":"FoSDw2L5DmTuQTFe55gWPDXf88euaxAEKFre74CnvQbX","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":16,"mint":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","uiTokenAmount":{"uiAmount":13591.810945,"decimals":6,"amount":"13591810945","uiAmountString":"13591.810945"},"owner":"FoSDw2L5DmTuQTFe55gWPDXf88euaxAEKFre74CnvQbX","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":17,"mint":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","uiTokenAmount":{"uiAmount":0.000169,"decimals":6,"amount":"169","uiAmountString":"0.000169"},"owner":"HjjhSHoQPg2smsB4GxbVGW2hT8nm7748azFsJ4q5VHKX","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":18,"mint":"So11111111111111111111111111111111111111112","uiTokenAmount":{"uiAmount":20.544341817,"decimals":9,"amount":"20544341817","uiAmountString":"20.544341817"},"owner":"HjjhSHoQPg2smsB4GxbVGW2hT8nm7748azFsJ4q5VHKX","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":22,"mint":"6sQgvhAYtYFrahcjB1hKfB3ZC5YDVdfYvAqK1GKe93c9","uiTokenAmount":{"uiAmount":7446.8132,"decimals":4,"amount":"74468132","uiAmountString":"7446.8132"},"owner":"Hjfc2LMKTZ82Dy741fyeVPLbCq4eRq6tgFFGkBseJZYQ","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":23,"mint":"So11111111111111111111111111111111111111112","uiTokenAmount":{"uiAmount":0.236707766,"decimals":9,"amount":"236707766","uiAmountString":"0.236707766"},"owner":"Hjfc2LMKTZ82Dy741fyeVPLbCq4eRq6tgFFGkBseJZYQ","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":24,"mint":"6sQgvhAYtYFrahcjB1hKfB3ZC5YDVdfYvAqK1GKe93c9","uiTokenAmount":{"uiAmount":2433.2603,"decimals":4,"amount":"24332603","uiAmountString":"2433.2603"},"owner":"EBNdPxZ9d2hzXfH3Fv16cQbBPFMLtrvk9KowCXMkrAxF","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":26,"mint":"CiKu4eHsVrc1eueVQeHn7qhXTcVu95gSQmBpX4utjL9z","uiTokenAmount":{"uiAmount":1056014.7550657,"decimals":8,"amount":"105601475506570","uiAmountString":"1056014.7550657"},"owner":"EBNdPxZ9d2hzXfH3Fv16cQbBPFMLtrvk9KowCXMkrAxF","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"}],"rewards":[],"loadedAddresses":{"writable":["SU7vPveBjEuR5tgQwidRqqTxn1WwraHpydHHBpM2W96","Ar37g5ebxRMq1NJyswFw9JKwRzZ8CzVr9SEMFH5wy9P8","EGynHanKeLLUYeWFE6ULXE1QRD8YPTV7ehSnphWsLqq2","Cvf6b3eKjZbYMzwQyFsLeMjx9Hpo7itEJ6tvrnPRmGLn","FL2LiAWFivEjRoYMxVm4rw57shKadqJZFw7sjag5TPrq","FoSDw2L5DmTuQTFe55gWPDXf88euaxAEKFre74CnvQbX","GEarArxgKL19JxihPHmsSQdWajZWqyitsgf7oUht61Nb","CXo3qXgKfs12K47TsVojTxdztNUFW4bkuVCPPnWv3tgL","HKVDuQK3wVABsgFZQZMffd2fH1a4KduTBuMa2yXuZsRs","2mWctkusfyNJESiV8JSM3oSDZjSCTvogodZXmiQaBiox","4LmxMpDyTLXhiziaFjwiq9LjJZwEsj8ZnNVyv2hkEASf","5gGLakH7aCn8C4ximtLCRgK6a7JYRZgZjCu55S7x1KpZ","6j3nZoyjmEgk9Vr5FidgE6W4hpRyPkB5zsfmqcHQoGS7","Bgv1FqYRaVJqnHQ6KEk3QujRjgfGjZVxXNV7YCGtpD9B","DXNkN6S5R7sLYxiVJF7oHuS71aiE7HqUvvCMQZc6S4BV","EBNdPxZ9d2hzXfH3Fv16cQbBPFMLtrvk9KowCXMkrAxF","FqBTgLSaFfV7eHS3TNRnQBtvw4pUeLX4TtWwkMWWiCfM","Hjfc2LMKTZ82Dy741fyeVPLbCq4eRq6tgFFGkBseJZYQ","J1GXPBchN9VGzq4tjc6c14CRVMUyBxcsHEJAQaHELA4s"],"readonly":["So11111111111111111111111111111111111111112","EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo","TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","5Q544fKrFoe6tsEbD7S8EmxGTJYAKtTVhAW5Q5pge4j1","675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8","D1ZN9Wj1fRSUQfCjhvnu1hqDMT7hzjzBBpi12nVniYD6","CAMMCzo5YL8w4VFF8KVHrK22GGUsp5VTaW7grrKgrWqK","34XADsSbZP1fmUXEw8SJewo97VWXfivNu2fjuDC9DUXc","5e91CvWyYmyfKzC5tg1tGp2CKDYHsrjZ6G6iPAHKsc5N","A1BBtTYJd4i3xU8D6Tc2FzU6ZN4oXZWXKZnCxwbHXr8x"]},"computeUnitsConsumed":230822,"costUnits":240243},"version":0,"blockTime":1776310060}} \ No newline at end of file diff --git a/testdata/rpc/43EouSYkeVmLBZSKW1KptiQcAVvB6KX49wjztjgzkQ9iU38A6fF68k77bNy9Wn6fwjykqYsPorUKj8m6SFY7naf1.json b/testdata/rpc/43EouSYkeVmLBZSKW1KptiQcAVvB6KX49wjztjgzkQ9iU38A6fF68k77bNy9Wn6fwjykqYsPorUKj8m6SFY7naf1.json new file mode 100644 index 0000000..bf63611 --- /dev/null +++ b/testdata/rpc/43EouSYkeVmLBZSKW1KptiQcAVvB6KX49wjztjgzkQ9iU38A6fF68k77bNy9Wn6fwjykqYsPorUKj8m6SFY7naf1.json @@ -0,0 +1 @@ +{"jsonrpc":"2.0","id":1,"result":{"slot":413539053,"transaction":["AZf7JNu8rMvJyBfROpPZ4N1KZ73Ea/+jYC12oXf3ETw8kp+9f3tavt+ftqGPK7NcwG4TA4kc7L95KliRdoHAZwiAAQAKEBiTxF+Tzojexc6SGSc4e4jCt+17NvYaGPaKDgKJSnDNLpa3bHJr5kCJBkxaWEwFAFmYSq7+MrX16cEh5X4yvU7b4F8ZlgM2gVIW+bG5+B82OkhqwcYBQMMxz/kLJFmlWXu3ShUKLt61q1NaMAg6J364TtmzZYFwhyanaVhJDZR77SL3ei+zXWer9WIj/d3iSj0fYqCXZph+2CqajMutBWnOgLS1o5lgYGFd5jqtj6x4hpoVrK26NEU3tMyepm8G2QMGRm/lIRcy/+ytunLDm+e8jOW7xfcSayxDmzpAAAAAjJclj04kifG7PRApFI4NgwtaE5na/xCEBI572Nvp+FkGm4hX/quBhPtof2NGGMA12sQ53BrrO1WYoPAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABt324ddloZPZy+FGzut5rBy0he1fWzeROoz1hX7/AKmst/F7aDNNJbj0fq41aijeb5YGJNL2dJxLKrcuQKcFwQbd9uHudY/eGEJdvORszdq2GvxNg7kNJ/69+SjYoYv8CS0hNWV6FZwrh9S2anDbjpdSOJ/3aq8gbO0GOjj5Wu3yzNU1rKXxc2rIIt0Hc+TZL72KWbKUA1AClakBHHOp5Sp257NEZAoc/FlMi8rQoJEBHKx90Va/g6gz+yII63etGz0zGZXkTHsUd8a5SDy296974J/olBvLigLi1VuqfCIHBgAFAuCTBAAHBgABAAgJCgEBBwYAAgALCQwBAQkCAAEMAgAAAEYuAAAAAAAACgEBARENDg4DAQIEBQgLAAoMDQ8NGPjGnpHhdYfIRi4AAAAAAAByZdcBAAAAAAoDAQAAAQkA","base64"],"meta":{"err":null,"status":{"Ok":null},"fee":5000,"preBalances":[20000000,0,0,8630400,117057097618,2039280,1,3387961056,1482665471528,1,5598483284,3976720,58559541,11823511,107898591999,0],"postBalances":[17909074,0,2074080,8630400,117057109464,2039280,1,3387961056,1482665471528,1,5598483284,3976720,58559541,11823511,107898591999,0],"innerInstructions":[{"index":1,"instructions":[{"programIdIndex":10,"accounts":[8],"data":"84eT","stackHeight":2},{"programIdIndex":9,"accounts":[0,1],"data":"11119os1e9qSs2u7TsThXqkBSRVFxhmYaFKFZ1waB2X7armDmvK3p5GmLdUxYdg3h7QSrL","stackHeight":2},{"programIdIndex":10,"accounts":[1],"data":"P","stackHeight":2},{"programIdIndex":10,"accounts":[1,8],"data":"6Nne9EeWjbkcbrMcBaAqh1Gza1jW2eooxkpeyTomqrHJC","stackHeight":2}]},{"index":2,"instructions":[{"programIdIndex":12,"accounts":[11],"data":"84eT","stackHeight":2},{"programIdIndex":9,"accounts":[0,2],"data":"11119ExAoTptm6xKUTUcw2V69MKmyEdDmRins3j3bK43o9nHeiYUtSiaT9pc292PhNQvxj","stackHeight":2},{"programIdIndex":12,"accounts":[2],"data":"P","stackHeight":2},{"programIdIndex":12,"accounts":[2,11],"data":"6Nne9EeWjbkcbrMcBaAqh1Gza1jW2eooxkpeyTomqrHJC","stackHeight":2}]},{"index":5,"instructions":[{"programIdIndex":10,"accounts":[1,8,4,0],"data":"gzm1ELJPWE4Z6","stackHeight":2},{"programIdIndex":12,"accounts":[5,11,2,14],"data":"hTaP2ZJ9EfFJu","stackHeight":2},{"programIdIndex":13,"accounts":[15],"data":"EVM9wLnauu9H41GfKhTodp2q3CLwcao9n7tWFg9mL6fRbkjdJg4B2qh8SKWppsFDVX33Fg5xGGXTnR63Z2D6BBWKgSk5Btu97xr65WsTmbPYCQ4S5e1xxU3MHjADHBCbTJ63YucRmy17UgTn7e2sp7v1yyn7zVEsygBr2ijUHTHWqtD5KDQNWwWqYupFAUFV5CkZ2v4JVA3m1jyMGdhUcVpibCDQUXm3WPatcFoQbDVtvA5xEkXEYrQTzdVx2goVnnKJEfWZj1nX","stackHeight":2}]}],"logMessages":["Program ComputeBudget111111111111111111111111111111 invoke [1]","Program ComputeBudget111111111111111111111111111111 success","Program ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL invoke [1]","Program log: CreateIdempotent","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [2]","Program log: Instruction: GetAccountDataSize","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 1569 of 292999 compute units","Program return: TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA pQAAAAAAAAA=","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA success","Program 11111111111111111111111111111111 invoke [2]","Program 11111111111111111111111111111111 success","Program log: Initialize the associated token account","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [2]","Program log: Instruction: InitializeImmutableOwner","Program log: Please upgrade to SPL Token 2022 for immutable owner support","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 1405 of 286520 compute units","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA success","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [2]","Program log: Instruction: InitializeAccount3","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 3158 of 282691 compute units","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA success","Program ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL consumed 20600 of 299850 compute units","Program ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL success","Program ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL invoke [1]","Program log: CreateIdempotent","Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb invoke [2]","Program log: Instruction: GetAccountDataSize","Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb consumed 1444 of 269486 compute units","Program return: TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb qgAAAAAAAAA=","Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb success","Program 11111111111111111111111111111111 invoke [2]","Program 11111111111111111111111111111111 success","Program log: Initialize the associated token account","Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb invoke [2]","Program log: Instruction: InitializeImmutableOwner","Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb consumed 674 of 263220 compute units","Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb success","Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb invoke [2]","Program log: Instruction: InitializeAccount3","Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb consumed 2027 of 260211 compute units","Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb success","Program ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL consumed 21349 of 279250 compute units","Program ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL success","Program 11111111111111111111111111111111 invoke [1]","Program 11111111111111111111111111111111 success","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [1]","Program log: Instruction: SyncNative","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 3045 of 257751 compute units","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA success","Program cpamdpZCGKUy5JxQXB4dcpGPiikHawvSWAd6mEn1sGG invoke [1]","Program log: Instruction: Swap","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [2]","Program log: Instruction: TransferChecked","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 6238 of 244652 compute units","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA success","Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb invoke [2]","Program log: Instruction: TransferChecked","Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb consumed 2355 of 237195 compute units","Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb success","Program cpamdpZCGKUy5JxQXB4dcpGPiikHawvSWAd6mEn1sGG invoke [2]","Program cpamdpZCGKUy5JxQXB4dcpGPiikHawvSWAd6mEn1sGG consumed 109 of 231790 compute units","Program cpamdpZCGKUy5JxQXB4dcpGPiikHawvSWAd6mEn1sGG success","Program cpamdpZCGKUy5JxQXB4dcpGPiikHawvSWAd6mEn1sGG consumed 23050 of 254706 compute units","Program cpamdpZCGKUy5JxQXB4dcpGPiikHawvSWAd6mEn1sGG success","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [1]","Program log: Instruction: CloseAccount","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 2915 of 231656 compute units","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA success"],"preTokenBalances":[{"accountIndex":4,"mint":"So11111111111111111111111111111111111111112","uiTokenAmount":{"uiAmount":117.055058338,"decimals":9,"amount":"117055058338","uiAmountString":"117.055058338"},"owner":"HLnpSz9h2S4hiLQ43rnSD9XkcUThA7B8hQMKmDaiTLcC","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":5,"mint":"CdDoeyd67nuzmMCF8Dd3RzbxiTRk41Xd922Veu9kGvDE","uiTokenAmount":{"uiAmount":332640445.692181,"decimals":6,"amount":"332640445692181","uiAmountString":"332640445.692181"},"owner":"HLnpSz9h2S4hiLQ43rnSD9XkcUThA7B8hQMKmDaiTLcC","programId":"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb"}],"postTokenBalances":[{"accountIndex":2,"mint":"CdDoeyd67nuzmMCF8Dd3RzbxiTRk41Xd922Veu9kGvDE","uiTokenAmount":{"uiAmount":33.325162,"decimals":6,"amount":"33325162","uiAmountString":"33.325162"},"owner":"2ewUJSywJuLmasWfV1eMXJZBWqvDF4YG3uV7yE62Z8sE","programId":"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb"},{"accountIndex":4,"mint":"So11111111111111111111111111111111111111112","uiTokenAmount":{"uiAmount":117.055070184,"decimals":9,"amount":"117055070184","uiAmountString":"117.055070184"},"owner":"HLnpSz9h2S4hiLQ43rnSD9XkcUThA7B8hQMKmDaiTLcC","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":5,"mint":"CdDoeyd67nuzmMCF8Dd3RzbxiTRk41Xd922Veu9kGvDE","uiTokenAmount":{"uiAmount":332640412.367019,"decimals":6,"amount":"332640412367019","uiAmountString":"332640412.367019"},"owner":"HLnpSz9h2S4hiLQ43rnSD9XkcUThA7B8hQMKmDaiTLcC","programId":"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb"}],"rewards":[],"loadedAddresses":{"writable":[],"readonly":[]},"computeUnitsConsumed":71259,"costUnits":74718},"version":0,"blockTime":1776317918}} \ No newline at end of file diff --git a/testdata/rpc/5Qsq1ueenSs4KgVRgwXmBVFvMR3Asq9MmXwmqQimxDdWLdiJy6dVfmYqa2YCvkNH1Gx7aCzJqg4t9gN9ECfxH2JS.json b/testdata/rpc/5Qsq1ueenSs4KgVRgwXmBVFvMR3Asq9MmXwmqQimxDdWLdiJy6dVfmYqa2YCvkNH1Gx7aCzJqg4t9gN9ECfxH2JS.json new file mode 100644 index 0000000..c03457f --- /dev/null +++ b/testdata/rpc/5Qsq1ueenSs4KgVRgwXmBVFvMR3Asq9MmXwmqQimxDdWLdiJy6dVfmYqa2YCvkNH1Gx7aCzJqg4t9gN9ECfxH2JS.json @@ -0,0 +1 @@ +{"jsonrpc":"2.0","id":1,"result":{"slot":413539016,"transaction":["AtyodaCm3KTsjPym3dSMaoEEFVGweaUt0ACU6lPB+tpgBivcdZ5tVCqIXxRVnvZlT283sFYWuLl6ub+59UZ9OwdH8NxOHQ+n6b3dZuetaFEinpQYIjI2Yza++KbW9GYny3N4gvcu+esX26IQiLznGy/dpAeJOLujNrGiHl+gzqkCgAIBCRKTdiCVKq86A/cc34gQ3aMe81qvRNaxYcKdjVCxqGWw2gDsGGusYAr2DcH5eVxpVsezxcFqQs7vl4SRs1H7KITK7iLYVTNlqkAXZH+Vvu4pC6mwWSUAhJhax9wyc3UhNZc1QhdAebxe+LYZ34wx/BouD0SOVIPnK+cbCHgyqMULmwlgDKUk97G31syxw5c6oDMNGQPaYBzJtd7jxmK0ytFJ8MFnAWQZlaUW0eRNptHT5fYTR68L4Zw3eSHeml8PoyamTOHHnwYGKP1E+yd8s33m/qVNy3AaNGCaEpBz+qevrQBaqDKuwwwDce71dS6q4vZSusY96PKmm9J2IMj56NFpbsP23jbZu4l8DxHACQgSa3BZACYI5habmg+c+YBhNNUDBkZv5SEXMv/srbpyw5vnvIzlu8X3EmssQ5s6QAAAAIyXJY9OJInxuz0QKRSODYMLWhOZ2v8QhASOe9jb6fhZa8zxcbssRr/sFR45dy2q5ZoKlHK7iZCuTl3SVG6NHT8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbd9uHXZaGT2cvhRs7reawctIXtX1s3kTqM9YV+/wCpBpuIV/6rgYT7aH9jRhjANdrEOdwa6ztVmKDwAAAAAAHaY2gfcoa8yAZxniwrUKIBVyQ7/JZosRUgvFOEPtzbCJpd75l4gm61Aw66qOMPeQQBMpCqA3r8gHISfLXxxjBkbNbMgMewCyTCECA4Qz9Iqg/KjufoGQM8D+H7pyjf9QyxrDav5b3/gl6OPMqBp7VKLcSeHS1Ikhq9MtnBlEsFbQYJAAUCeF0CAAkACQOAGgYAAAAAAAoGAAIBCwwNAQEKBgADAQ4MDQAEDw8QBQIDBgcLDgENDQQRBBlBSz9M61tbiBOhAZECAAAAAAAAAAAAAAABDQMDCAEBCQA=","base64"],"meta":{"err":null,"status":{"Ok":null},"fee":72000,"preBalances":[2958243401,0,2039280,0,5571162548,3841920,2039280,5025746242,125383756978,1,3387961056,1461600,1,5598483284,1482665471528,4839400154,8184960,1000056],"postBalances":[2956132121,0,2039280,0,5571162548,3841920,2039280,4976074141,125435468359,1,3387961056,1461600,1,5598483284,1482665471528,4839400154,8184960,1000056],"innerInstructions":[{"index":3,"instructions":[{"programIdIndex":13,"accounts":[14],"data":"84eT","stackHeight":2},{"programIdIndex":12,"accounts":[0,3],"data":"11119os1e9qSs2u7TsThXqkBSRVFxhmYaFKFZ1waB2X7armDmvK3p5GmLdUxYdg3h7QSrL","stackHeight":2},{"programIdIndex":13,"accounts":[3],"data":"P","stackHeight":2},{"programIdIndex":13,"accounts":[3,14],"data":"6MCJUZjF2fFZcq46bkGBfpf6TJ4g7qobzJTb7BEcqFd7F","stackHeight":2}]},{"index":4,"instructions":[{"programIdIndex":13,"accounts":[2,11,6,1],"data":"gMSTNxtAYJ3Ks","stackHeight":2},{"programIdIndex":13,"accounts":[7,14,3,15],"data":"iDTHKcBoqdyN8","stackHeight":2},{"programIdIndex":4,"accounts":[17],"data":"2ioXo9nkAt26bphRv6PYrqYEtkj6bhba9DpWLd7D7LSfwYNCRsbPFGTUK3r2D7JJm3tSP1CwTkGT1NXopZUTGhnvkHDzqm14pjvPLJeue1Mo8aGv7XDnpjMc4PoUT1quc1iSrUaMCqteSmv2SJMB4CLTNrtomzfU7AzFkWo6NQtiun55KbhTsULAyGsdJCtyJ628c3mZgT2mTMzswam28LWqDwaQG6gV9mpuzeU3h","stackHeight":2},{"programIdIndex":4,"accounts":[17],"data":"44FY2SKwMbUFWgV1yoKm6d5ecMQ7QQogg9upxzPmjBpbuexKiPKDFvvcu9NP3jEGp372rfX28eHEcMPSLeqa1T7DnfSKp5bvhFogUHbdvFVuVvu9AVQ7SNgAQZdkpD425BEo9ZWwuTRQVk5iiQGL9U6tQerX8A1grJ1DGQGmDnXD2FANFxWVGh2eqLZ1dzkpVCHe9pvMLF43oeAk1qtPiRZgUxjfNSfrZg5hf6y7LjQmTjqEMJTKzm61veRHSUpqxudF5BPTATh","stackHeight":2}]}],"logMessages":["Program ComputeBudget111111111111111111111111111111 invoke [1]","Program ComputeBudget111111111111111111111111111111 success","Program ComputeBudget111111111111111111111111111111 invoke [1]","Program ComputeBudget111111111111111111111111111111 success","Program ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL invoke [1]","Program log: CreateIdempotent","Program ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL consumed 4436 of 154700 compute units","Program ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL success","Program ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL invoke [1]","Program log: Create","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [2]","Program log: Instruction: GetAccountDataSize","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 1569 of 143374 compute units","Program return: TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA pQAAAAAAAAA=","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA success","Program 11111111111111111111111111111111 invoke [2]","Program 11111111111111111111111111111111 success","Program log: Initialize the associated token account","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [2]","Program log: Instruction: InitializeImmutableOwner","Program log: Please upgrade to SPL Token 2022 for immutable owner support","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 1405 of 136895 compute units","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA success","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [2]","Program log: Instruction: InitializeAccount3","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 3158 of 133065 compute units","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA success","Program ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL consumed 20661 of 150264 compute units","Program ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL success","Program dbcij3LWUppWqq96dh6gJWwBifmcGfLSB5D4DuSMaqN invoke [1]","Program log: Instruction: Swap2","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [2]","Program log: Instruction: TransferChecked","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 6147 of 110114 compute units","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA success","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [2]","Program log: Instruction: TransferChecked","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 6238 of 101517 compute units","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA success","Program dbcij3LWUppWqq96dh6gJWwBifmcGfLSB5D4DuSMaqN invoke [2]","Program dbcij3LWUppWqq96dh6gJWwBifmcGfLSB5D4DuSMaqN consumed 3586 of 92173 compute units","Program dbcij3LWUppWqq96dh6gJWwBifmcGfLSB5D4DuSMaqN success","Program dbcij3LWUppWqq96dh6gJWwBifmcGfLSB5D4DuSMaqN invoke [2]","Program dbcij3LWUppWqq96dh6gJWwBifmcGfLSB5D4DuSMaqN consumed 3586 of 85337 compute units","Program dbcij3LWUppWqq96dh6gJWwBifmcGfLSB5D4DuSMaqN success","Program dbcij3LWUppWqq96dh6gJWwBifmcGfLSB5D4DuSMaqN consumed 48525 of 129603 compute units","Program dbcij3LWUppWqq96dh6gJWwBifmcGfLSB5D4DuSMaqN success","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [1]","Program log: Instruction: CloseAccount","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 3032 of 81078 compute units","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA success"],"preTokenBalances":[{"accountIndex":2,"mint":"8FosqFryatEMV4ZeFR1gLmSmxBLcQ2NCibpZxFRPPF34","uiTokenAmount":{"uiAmount":192646.444374,"decimals":6,"amount":"192646444374","uiAmountString":"192646.444374"},"owner":"14bodXiENQHnZa15f6zLLgf4oB6JS4LHbYRFgew1xUgH","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":6,"mint":"8FosqFryatEMV4ZeFR1gLmSmxBLcQ2NCibpZxFRPPF34","uiTokenAmount":{"uiAmount":998870092.869283,"decimals":6,"amount":"998870092869283","uiAmountString":"998870092.869283"},"owner":"FhVo3mqL8PW5pH5U2CN4XE33DokiyZnUwuGpH2hmHLuM","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":7,"mint":"So11111111111111111111111111111111111111112","uiTokenAmount":{"uiAmount":5.023706962,"decimals":9,"amount":"5023706962","uiAmountString":"5.023706962"},"owner":"FhVo3mqL8PW5pH5U2CN4XE33DokiyZnUwuGpH2hmHLuM","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"}],"postTokenBalances":[{"accountIndex":2,"mint":"8FosqFryatEMV4ZeFR1gLmSmxBLcQ2NCibpZxFRPPF34","uiTokenAmount":{"uiAmount":181623.706691,"decimals":6,"amount":"181623706691","uiAmountString":"181623.706691"},"owner":"14bodXiENQHnZa15f6zLLgf4oB6JS4LHbYRFgew1xUgH","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":6,"mint":"8FosqFryatEMV4ZeFR1gLmSmxBLcQ2NCibpZxFRPPF34","uiTokenAmount":{"uiAmount":998881115.606966,"decimals":6,"amount":"998881115606966","uiAmountString":"998881115.606966"},"owner":"FhVo3mqL8PW5pH5U2CN4XE33DokiyZnUwuGpH2hmHLuM","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":7,"mint":"So11111111111111111111111111111111111111112","uiTokenAmount":{"uiAmount":4.974034861,"decimals":9,"amount":"4974034861","uiAmountString":"4.974034861"},"owner":"FhVo3mqL8PW5pH5U2CN4XE33DokiyZnUwuGpH2hmHLuM","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"}],"rewards":[],"loadedAddresses":{"writable":[],"readonly":[]},"computeUnitsConsumed":76954,"costUnits":81436},"version":0,"blockTime":1776317904}} \ No newline at end of file diff --git a/testdata/rpc/5jQk6mbhtExpUFskRy2AfKWbLgXDv2USiGkq9tQWauGVKduGdTqscgxyDCPgBryr4kz5hDT5CE9TpVTKDoPhkBmt.json b/testdata/rpc/5jQk6mbhtExpUFskRy2AfKWbLgXDv2USiGkq9tQWauGVKduGdTqscgxyDCPgBryr4kz5hDT5CE9TpVTKDoPhkBmt.json new file mode 100644 index 0000000..f0db408 --- /dev/null +++ b/testdata/rpc/5jQk6mbhtExpUFskRy2AfKWbLgXDv2USiGkq9tQWauGVKduGdTqscgxyDCPgBryr4kz5hDT5CE9TpVTKDoPhkBmt.json @@ -0,0 +1 @@ +{"jsonrpc":"2.0","id":1,"result":{"slot":413539047,"transaction":["Aeyj5WP23wD4wclVFMuRJJIe7q8huGWWl6fpqth1r4dV8IcB/hlocPWzAEPAhO92ge0xEV+XDqxBfe19LUPMdAuAAQAHFbivcuNsgU4J7gmHxD8tLpMY6iEIWzCjd+IlNejSJVQeaonKHfwq2QKHeu27lPgxmQRdX0at7slfuCQcZPu3caJTIS71MSA2buam/k+sXrl1vGXaPD029oFUgDu6lp1o3JeJA0sd1mckX7kapE/85fBZlFuXnBTRrcmUbcvxMBpEvfZ6bVeUyE3lL1IbMb3LmgBZo4Xi8c0abTmLpY21ILLTdCF2uJxeFMlrdImYQh84EB4J5cWTMbFotiXNJxW7Jifl7TGBLGH8UwmZ2G5Aw4e0/oUvFuWtb4os5DbNsOqa9hfNRRCvcMdhkgSZ+P6X1bIxGmnhmhdoPKKqpIvsmn0LdWn/1g7yUxVskGOOMud5HgleMTiExP6FknvzajGaONhOEpDBmOeIug4RTwOCFGeWCNoo/NIKFjHvw5P7v2kqA0n3w8NG+5SofArQOV6ylFFMQmnwYFI0QyNVgWUyUY+eTjFk2b+63T9KCctuFYTD5CHsRcN4zK4GYTfLgYmdxSK4jdI3EivV3prQQZ3VurfUHwdnMa0qU4LLl1MGZCcOiPH/o6Lf5he9xONXMlGjIuP8roHlpFc5DmR1HACkZeKMlyWPTiSJ8bs9ECkUjg2DC1oTmdr/EIQEjnvY2+n4WQaF40cgAISFe/Zq2LhbLj7BPpnljFauyyNLuF6sIJyyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG3fbh12Whk9nL4UbO63msHLSF7V9bN5E6jPWFfv8AqQabiFf+q4GE+2h/Y0YYwDXaxDncGus7VZig8AAAAAABzPgC1MzMhNf7IbX3O0nYGhbFtMiO4yOU4ckdNYjMQIAPv+iEbWhcvcYsyn4Ex+j2jcwxOrMSd+LgESouwOBS5XyPys1g0BzHZsNnBz5WRRgRRVOi6K7D6t64Ld5LDtkDBQ4GAAEADxARAQEOBgACABIQEQEBEw8DAQIEBQYHCAkKCwwAFBEY+MaekeF1h8jzh26OEQAAAFX/0gEAAAAAEQMCAAABCRACAA0MAgAAABAnAAAAAAAAAA==","base64"],"meta":{"err":null,"status":{"Ok":null},"fee":5000,"preBalances":[89295313,2039280,0,7516800,9465604,581560815,2039280,57660673125396,1461600,3535605,2039284,2039280,2039280,2141935,3387961056,1461600,1,5598483284,1482665471528,1314441,1296443],"postBalances":[120837064,2039280,0,7516800,9465604,581560815,2039280,57660641568645,1461600,3535605,2039284,2039280,2039280,2151935,3387961056,1461600,1,5598483284,1482665471528,1314441,1296443],"innerInstructions":[{"index":1,"instructions":[{"programIdIndex":17,"accounts":[18],"data":"84eT","stackHeight":2},{"programIdIndex":16,"accounts":[0,2],"data":"11119os1e9qSs2u7TsThXqkBSRVFxhmYaFKFZ1waB2X7armDmvK3p5GmLdUxYdg3h7QSrL","stackHeight":2},{"programIdIndex":17,"accounts":[2],"data":"P","stackHeight":2},{"programIdIndex":17,"accounts":[2,18],"data":"6ZZdrcnSQohc51o3YGq1BvYqSGjQdUKXtq1n5j5DX6EEq","stackHeight":2}]},{"index":2,"instructions":[{"programIdIndex":17,"accounts":[1,12,0],"data":"3cb7R4gw8T8j","stackHeight":2},{"programIdIndex":20,"accounts":[4,6,8,1,10,0,17],"data":"P5KP9jVziudvcUMQ1wHBEWC8dtnGoADq9","stackHeight":2},{"programIdIndex":17,"accounts":[1,6,0],"data":"3X4YucwK5meo","stackHeight":3},{"programIdIndex":17,"accounts":[8,10,4],"data":"6ULdhsXpARcT","stackHeight":3},{"programIdIndex":20,"accounts":[5,7,9,2,11,10,17],"data":"HgzYw38kQ5n7WsJgHZCgzdBqTYU24B879","stackHeight":2},{"programIdIndex":17,"accounts":[7,2,5],"data":"3dTsr9twMQuV","stackHeight":3},{"programIdIndex":17,"accounts":[11,9,10],"data":"79zeNEV2A5fV","stackHeight":3}]}],"logMessages":["Program ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL invoke [1]","Program log: CreateIdempotent","Program ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL consumed 5838 of 803000 compute units","Program ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL success","Program ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL invoke [1]","Program log: CreateIdempotent","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [2]","Program log: Instruction: GetAccountDataSize","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 1569 of 790311 compute units","Program return: TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA pQAAAAAAAAA=","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA success","Program 11111111111111111111111111111111 invoke [2]","Program 11111111111111111111111111111111 success","Program log: Initialize the associated token account","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [2]","Program log: Instruction: InitializeImmutableOwner","Program log: Please upgrade to SPL Token 2022 for immutable owner support","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 1405 of 783832 compute units","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA success","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [2]","Program log: Instruction: InitializeAccount3","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 3158 of 780003 compute units","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA success","Program ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL consumed 20600 of 797162 compute units","Program ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL success","Program Eo7WjKq67rjJQSZxS6z3YkapzY3eMj6Xy8X5EQVn5UaB invoke [1]","Program log: Instruction: Swap","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [2]","Program log: Instruction: Transfer","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 4645 of 752377 compute units","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA success","Program 24Uqj9JCLxUeoC3hGfh5W3s9FM9uCHDS2SG3LYwBpyTi invoke [2]","Program log: Instruction: Deposit","Program data: H159WuM0PbppPi+MEQAAAGk+L4wRAAAA","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [3]","Program log: Instruction: Transfer","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 4645 of 733276 compute units","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA success","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [3]","Program log: Instruction: MintTo","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 4492 of 726254 compute units","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA success","Program 24Uqj9JCLxUeoC3hGfh5W3s9FM9uCHDS2SG3LYwBpyTi consumed 23437 of 742477 compute units","Program 24Uqj9JCLxUeoC3hGfh5W3s9FM9uCHDS2SG3LYwBpyTi success","Program 24Uqj9JCLxUeoC3hGfh5W3s9FM9uCHDS2SG3LYwBpyTi invoke [2]","Program log: Instruction: Withdraw","Program data: dPRh6GcfmDpWU64BAAAAAI+E4QEAAAAA","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [3]","Program log: Instruction: Transfer","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 4736 of 697180 compute units","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA success","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [3]","Program log: Instruction: Burn","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 4715 of 690133 compute units","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA success","Program 24Uqj9JCLxUeoC3hGfh5W3s9FM9uCHDS2SG3LYwBpyTi consumed 24207 of 706919 compute units","Program 24Uqj9JCLxUeoC3hGfh5W3s9FM9uCHDS2SG3LYwBpyTi success","Program data: UWzjvs3QCsTrhG6OEQAAAI+E4QEAAAAAKSb9CAAAAACKST8CAAAAAAAAAAAAAAAA","Program Eo7WjKq67rjJQSZxS6z3YkapzY3eMj6Xy8X5EQVn5UaB consumed 103480 of 776562 compute units","Program Eo7WjKq67rjJQSZxS6z3YkapzY3eMj6Xy8X5EQVn5UaB success","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [1]","Program log: Instruction: CloseAccount","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 2915 of 673082 compute units","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA success","Program 11111111111111111111111111111111 invoke [1]","Program 11111111111111111111111111111111 success"],"preTokenBalances":[{"accountIndex":1,"mint":"STrikemJEk2tFVYpg7SMo9nGPrnJ56fHnS1K7PV2fPw","uiTokenAmount":{"uiAmount":2330056.620288,"decimals":6,"amount":"2330056620288","uiAmountString":"2330056.620288"},"owner":"DRwBgaucWrLEkJx2BforSaQ3mqpp4aGC86cEEVXho5os","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":6,"mint":"STrikemJEk2tFVYpg7SMo9nGPrnJ56fHnS1K7PV2fPw","uiTokenAmount":{"uiAmount":816026213.829956,"decimals":6,"amount":"816026213829956","uiAmountString":"816026213.829956"},"owner":"DnY3QX36kTRKqzba8Ah9VKarCSNGGbt6eDTzbst8eBfP","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":7,"mint":"So11111111111111111111111111111111111111112","uiTokenAmount":{"uiAmount":57660.666102454,"decimals":9,"amount":"57660666102454","uiAmountString":"57660.666102454"},"owner":"FERjPVNEa7Udq8CEv68h6tPL46Tq7ieE49HrE2wea3XT","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":10,"mint":"mjKvZGSovVH1UCdQTnsyEMrcrDtnhTvSDpyr4fCwhZy","uiTokenAmount":{"uiAmount":816026213.829956,"decimals":6,"amount":"816026213829956","uiAmountString":"816026213.829956"},"owner":"DqeA3EU4DNuTsMVL5QBEibhC6LEQWUgDdESiTNbS8ia","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":11,"mint":"FZN7QZ8ZUUAxMPfxYEYkH3cXUASzH8EqA6B4tyCL8f1j","uiTokenAmount":{"uiAmount":305.994490644,"decimals":9,"amount":"305994490644","uiAmountString":"305.994490644"},"owner":"DqeA3EU4DNuTsMVL5QBEibhC6LEQWUgDdESiTNbS8ia","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":12,"mint":"STrikemJEk2tFVYpg7SMo9nGPrnJ56fHnS1K7PV2fPw","uiTokenAmount":{"uiAmount":135314.832852,"decimals":6,"amount":"135314832852","uiAmountString":"135314.832852"},"owner":"DqeA3EU4DNuTsMVL5QBEibhC6LEQWUgDdESiTNbS8ia","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"}],"postTokenBalances":[{"accountIndex":1,"mint":"STrikemJEk2tFVYpg7SMo9nGPrnJ56fHnS1K7PV2fPw","uiTokenAmount":{"uiAmount":2254652.567821,"decimals":6,"amount":"2254652567821","uiAmountString":"2254652.567821"},"owner":"DRwBgaucWrLEkJx2BforSaQ3mqpp4aGC86cEEVXho5os","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":6,"mint":"STrikemJEk2tFVYpg7SMo9nGPrnJ56fHnS1K7PV2fPw","uiTokenAmount":{"uiAmount":816101580.180397,"decimals":6,"amount":"816101580180397","uiAmountString":"816101580.180397"},"owner":"DnY3QX36kTRKqzba8Ah9VKarCSNGGbt6eDTzbst8eBfP","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":7,"mint":"So11111111111111111111111111111111111111112","uiTokenAmount":{"uiAmount":57660.634545703,"decimals":9,"amount":"57660634545703","uiAmountString":"57660.634545703"},"owner":"FERjPVNEa7Udq8CEv68h6tPL46Tq7ieE49HrE2wea3XT","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":10,"mint":"mjKvZGSovVH1UCdQTnsyEMrcrDtnhTvSDpyr4fCwhZy","uiTokenAmount":{"uiAmount":816101580.180397,"decimals":6,"amount":"816101580180397","uiAmountString":"816101580.180397"},"owner":"DqeA3EU4DNuTsMVL5QBEibhC6LEQWUgDdESiTNbS8ia","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":11,"mint":"FZN7QZ8ZUUAxMPfxYEYkH3cXUASzH8EqA6B4tyCL8f1j","uiTokenAmount":{"uiAmount":305.96628883,"decimals":9,"amount":"305966288830","uiAmountString":"305.96628883"},"owner":"DqeA3EU4DNuTsMVL5QBEibhC6LEQWUgDdESiTNbS8ia","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":12,"mint":"STrikemJEk2tFVYpg7SMo9nGPrnJ56fHnS1K7PV2fPw","uiTokenAmount":{"uiAmount":135352.534878,"decimals":6,"amount":"135352534878","uiAmountString":"135352.534878"},"owner":"DqeA3EU4DNuTsMVL5QBEibhC6LEQWUgDdESiTNbS8ia","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"}],"rewards":[],"loadedAddresses":{"writable":[],"readonly":[]},"computeUnitsConsumed":132983,"costUnits":138920},"version":0,"blockTime":1776317916}} \ No newline at end of file diff --git a/testdata/rpc/5uw9Uwe9KDLCzUNf1sRr7EjKqE2Xs8qUHaoC1CRFhkE3TMpo5TimwApW65pd6pmB7Cp92XXMaZ9jQav6aXRZGtoS.json b/testdata/rpc/5uw9Uwe9KDLCzUNf1sRr7EjKqE2Xs8qUHaoC1CRFhkE3TMpo5TimwApW65pd6pmB7Cp92XXMaZ9jQav6aXRZGtoS.json new file mode 100644 index 0000000..344e217 --- /dev/null +++ b/testdata/rpc/5uw9Uwe9KDLCzUNf1sRr7EjKqE2Xs8qUHaoC1CRFhkE3TMpo5TimwApW65pd6pmB7Cp92XXMaZ9jQav6aXRZGtoS.json @@ -0,0 +1 @@ +{"jsonrpc":"2.0","id":1,"result":{"slot":413517831,"transaction":["AfW3RBfa4BuVfEDFAGcN+w2I2eQMjp5B/QTtuZ9x46a0La4Y30Xen67f+v0PTl59hXqsRMnZLRGHoWKvnWNHswmAAQADCTMnv5UluXe/pie6ZEoRXnTH+OYzquKwSPKd3lQJMZSgDkLDIuFdiNAq0FJgcfvN8WtbVLEeUkhvluexKJzc9q4OhbJN2uXeBpgC7jdY3tYH+mpnviiPylgWn8lL7N/tTxPFpENPP/hsR4KXqJ2Szx9ROCUCplkYq0FB5w6oz0L7jrpL6AbPfbwZkcry1Vrpmq+2OkFDqE7Do23FS1kRnC/qxjOy+ufMpNM87LZchwLS2pfeBrVro2LbwCZgnRC+9QMGRm/lIRcy/+ytunLDm+e8jOW7xfcSayxDmzpAAAAAjJclj04kifG7PRApFI4NgwtaE5na/xCEBI572Nvp+FmW/5v6+vlXKzo+DDMHMusNPKeVKtU799ZsaqLU9bCT9dcgFZra7g/XTbG/5akMnkO+hQWEW1D+qtwWXfjjyr/jBQYABQLK3QIABgAFBLPL7wAGAAkDjIgsAAAAAAAHBgADAB4WGQEBCCYMExcSFQwDHhgUFwAZGR0XBBkADgMRDQ8FAgEQGhkKGwkLDQwAHBIgcQgAqdYNAQAAAAAUAQ0AAAAEozfEWyYhLbAq+KvY2KWTfi2o2zFAsOdBE77K9XORaJ0D4OHjCAJPAwAPS0xWGhDdnb8vYe2bM8gOSjq/DyyoDJMkyStf3V0ny7tbvT4CqKkAkxb4YSZ3Gr/Kk3BhDzCHLpY6TyuvdF/5ZdOgRDPAC7oECgsQFAEb8iE/zOlWb+PfCjL2Dk3Q2fGBoMdQDzWK7QDysDHN41sEYF5iYQA=","base64"],"meta":{"err":null,"status":{"Ok":null},"fee":553248,"preBalances":[1046343889,0,70407360,0,71437440,70407360,1,3387961056,1141440,584597890,6124800,2039280,14757464757,2039280,5435772,2039281,0,2039283,2039280,7182724,23385600,1196535499,1,34988462,1482665471528,5598483284,8205554,34551940731,5668616957,5987434,1481384348],"postBalances":[1043751361,0,70407360,2039280,71437440,70407360,1,3387961056,1141440,565538131,6124800,2039280,14758840379,2039280,5435772,2039281,0,2039283,2039280,7182724,23385600,1214219636,1,34988462,1482665471528,5598483284,8205554,34551940731,5668616957,5987434,1481384348],"innerInstructions":[{"index":3,"instructions":[{"programIdIndex":25,"accounts":[30],"data":"84eT","stackHeight":2},{"programIdIndex":22,"accounts":[0,3],"data":"11119os1e9qSs2u7TsThXqkBSRVFxhmYaFKFZ1waB2X7armDmvK3p5GmLdUxYdg3h7QSrL","stackHeight":2},{"programIdIndex":25,"accounts":[3],"data":"P","stackHeight":2},{"programIdIndex":25,"accounts":[3,30],"data":"6QaPcpNMdp1oc1rXnMMBWQm4tERKbgW1qfMDuhsSqt1Vq","stackHeight":2}]},{"index":4,"instructions":[{"programIdIndex":23,"accounts":[19,23,18,21,12,3,30,24,20,23,0,25,25,29,23,4],"data":"PgQWtn8ozixBm2wwHaXneGHJNY6R8Ewd9","stackHeight":2},{"programIdIndex":25,"accounts":[12,24,21,0],"data":"iGLE5f7RPeKXE","stackHeight":3},{"programIdIndex":25,"accounts":[18,30,3,19],"data":"iUinD28ZkrY5j","stackHeight":3},{"programIdIndex":23,"accounts":[29],"data":"yCGxBopjnVNQkNP5usq1Poaj8pHft1SNkEzLacz6oRcqEcQSbLsx13mJoL3q3cvfbHduDPvwAsfVaGpzfe1qXqkkQvWavtySXhKL6cQBEJUgcsHW5nRnQuooXiEyDkTrtz3W8yJDah9kWyLfVxrycyivywr6Q32PumFc43tLFHSxwDc3r3AAGbciJZn2cpYfy1bUyu","stackHeight":3},{"programIdIndex":26,"accounts":[25,0,14,3,17,13,15,5,2,1,16,26],"data":"KKu2BJyMZrAK8d66nUq5AruNa8xj7359TTdqLhcRNziGkKKnSART4XRvJFh","stackHeight":2},{"programIdIndex":25,"accounts":[3,17,0],"data":"3kfyzhpnksRZ","stackHeight":3},{"programIdIndex":25,"accounts":[15,13,14],"data":"3TLKEY2jTnvT","stackHeight":3},{"programIdIndex":28,"accounts":[25,10,27,9,11,13,12,0,28],"data":"9u32hSP8oJggPyt74YyWd8s","stackHeight":2},{"programIdIndex":25,"accounts":[13,11,0],"data":"3TLKEY2jTnvT","stackHeight":3},{"programIdIndex":25,"accounts":[9,12,27],"data":"3MTZU9WXJQf1","stackHeight":3}]}],"logMessages":["Program ComputeBudget111111111111111111111111111111 invoke [1]","Program ComputeBudget111111111111111111111111111111 success","Program ComputeBudget111111111111111111111111111111 invoke [1]","Program ComputeBudget111111111111111111111111111111 success","Program ComputeBudget111111111111111111111111111111 invoke [1]","Program ComputeBudget111111111111111111111111111111 success","Program ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL invoke [1]","Program log: CreateIdempotent","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [2]","Program log: Instruction: GetAccountDataSize","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 1595 of 180549 compute units","Program return: TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA pQAAAAAAAAA=","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA success","Program 11111111111111111111111111111111 invoke [2]","Program 11111111111111111111111111111111 success","Program log: Initialize the associated token account","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [2]","Program log: Instruction: InitializeImmutableOwner","Program log: Please upgrade to SPL Token 2022 for immutable owner support","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 1405 of 174044 compute units","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA success","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [2]","Program log: Instruction: InitializeAccount3","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 4214 of 170215 compute units","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA success","Program ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL consumed 21682 of 187400 compute units","Program ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL success","Program BASDaPs2cdVTsvgPRfESDLZgek8tKRTfqbR2ksdgptsn invoke [1]","Program LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo invoke [2]","Program log: Instruction: Swap","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [3]","Program log: Instruction: TransferChecked","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 6238 of 103140 compute units","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA success","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [3]","Program log: Instruction: TransferChecked","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 6173 of 94432 compute units","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA success","Program LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo invoke [3]","Program LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo consumed 2221 of 85351 compute units","Program LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo success","Program LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo consumed 79990 of 162200 compute units","Program LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo success","Program whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc invoke [2]","Program log: Instruction: Swap","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [3]","Program log: Instruction: Transfer","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 4645 of 50087 compute units","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA success","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [3]","Program log: Instruction: Transfer","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 4645 of 43428 compute units","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA success","Program data: 4cpJr5MroJZbC2XdBVKWO//+73vD32unZcmkU1WvEJl+tlWM6TZo7AHZNaK1r6A/KwAAAAAAAAAAyllQJsCaPysAAAAAAAAAALqeAQMAAAAAUvQVAAAAAAAAAAAAAAAAAAAAAAAAAAAAtVUAAAAAAADODAAAAAAAAA==","Program whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc consumed 42363 of 78502 compute units","Program whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc success","Program 675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8 invoke [2]","Program log: ray_log: A1L0FQAAAAAAAAAAAAAAAAABAAAAAAAAABn1FQAAAAAAkiO5IgAAAABgdIcCAAAAAC/UIgEAAAAA","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [3]","Program log: Instruction: Transfer","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 4645 of 20574 compute units","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA success","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [3]","Program log: Instruction: Transfer","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 4736 of 13513 compute units","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA success","Program 675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8 consumed 25732 of 33914 compute units","Program 675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8 success","Program BASDaPs2cdVTsvgPRfESDLZgek8tKRTfqbR2ksdgptsn consumed 157600 of 165718 compute units","Program BASDaPs2cdVTsvgPRfESDLZgek8tKRTfqbR2ksdgptsn success"],"preTokenBalances":[{"accountIndex":9,"mint":"So11111111111111111111111111111111111111112","uiTokenAmount":{"uiAmount":0.58255861,"decimals":9,"amount":"582558610","uiAmountString":"0.58255861"},"owner":"5Q544fKrFoe6tsEbD7S8EmxGTJYAKtTVhAW5Q5pge4j1","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":11,"mint":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","uiTokenAmount":{"uiAmount":42.431584,"decimals":6,"amount":"42431584","uiAmountString":"42.431584"},"owner":"5Q544fKrFoe6tsEbD7S8EmxGTJYAKtTVhAW5Q5pge4j1","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":12,"mint":"So11111111111111111111111111111111111111112","uiTokenAmount":{"uiAmount":14.755415477,"decimals":9,"amount":"14755415477","uiAmountString":"14.755415477"},"owner":"4SgwtApqXAXmkNSGGBzAvndVjXjnGkk8xS44DHm2as4s","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":13,"mint":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","uiTokenAmount":{"uiAmount":0.000199,"decimals":6,"amount":"199","uiAmountString":"0.000199"},"owner":"4SgwtApqXAXmkNSGGBzAvndVjXjnGkk8xS44DHm2as4s","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":15,"mint":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","uiTokenAmount":{"uiAmount":111664.873447,"decimals":6,"amount":"111664873447","uiAmountString":"111664.873447"},"owner":"78QBVQz3EnpuzmY42LRcCkn7gSyuFEMmQn1m5bY1yHgw","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":17,"mint":"METAewgxyPbgwsseH8T16a39CQ5VyVxZi9zXiDPY18m","uiTokenAmount":{"uiAmount":14645811.291981,"decimals":6,"amount":"14645811291981","uiAmountString":"14645811.291981"},"owner":"78QBVQz3EnpuzmY42LRcCkn7gSyuFEMmQn1m5bY1yHgw","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":18,"mint":"METAewgxyPbgwsseH8T16a39CQ5VyVxZi9zXiDPY18m","uiTokenAmount":{"uiAmount":124204.34211,"decimals":6,"amount":"124204342110","uiAmountString":"124204.34211"},"owner":"9cjGtAx9UASMWFemCBqTxwPN6gzv26KNntJbmiEpTKjU","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":21,"mint":"So11111111111111111111111111111111111111112","uiTokenAmount":{"uiAmount":1.194496219,"decimals":9,"amount":"1194496219","uiAmountString":"1.194496219"},"owner":"9cjGtAx9UASMWFemCBqTxwPN6gzv26KNntJbmiEpTKjU","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"}],"postTokenBalances":[{"accountIndex":3,"mint":"METAewgxyPbgwsseH8T16a39CQ5VyVxZi9zXiDPY18m","uiTokenAmount":{"uiAmount":null,"decimals":6,"amount":"0","uiAmountString":"0"},"owner":"4SgwtApqXAXmkNSGGBzAvndVjXjnGkk8xS44DHm2as4s","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":9,"mint":"So11111111111111111111111111111111111111112","uiTokenAmount":{"uiAmount":0.563498851,"decimals":9,"amount":"563498851","uiAmountString":"0.563498851"},"owner":"5Q544fKrFoe6tsEbD7S8EmxGTJYAKtTVhAW5Q5pge4j1","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":11,"mint":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","uiTokenAmount":{"uiAmount":43.870386,"decimals":6,"amount":"43870386","uiAmountString":"43.870386"},"owner":"5Q544fKrFoe6tsEbD7S8EmxGTJYAKtTVhAW5Q5pge4j1","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":12,"mint":"So11111111111111111111111111111111111111112","uiTokenAmount":{"uiAmount":14.756791099,"decimals":9,"amount":"14756791099","uiAmountString":"14.756791099"},"owner":"4SgwtApqXAXmkNSGGBzAvndVjXjnGkk8xS44DHm2as4s","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":13,"mint":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","uiTokenAmount":{"uiAmount":0.000199,"decimals":6,"amount":"199","uiAmountString":"0.000199"},"owner":"4SgwtApqXAXmkNSGGBzAvndVjXjnGkk8xS44DHm2as4s","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":15,"mint":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","uiTokenAmount":{"uiAmount":111663.434645,"decimals":6,"amount":"111663434645","uiAmountString":"111663.434645"},"owner":"78QBVQz3EnpuzmY42LRcCkn7gSyuFEMmQn1m5bY1yHgw","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":17,"mint":"METAewgxyPbgwsseH8T16a39CQ5VyVxZi9zXiDPY18m","uiTokenAmount":{"uiAmount":14645861.729799,"decimals":6,"amount":"14645861729799","uiAmountString":"14645861.729799"},"owner":"78QBVQz3EnpuzmY42LRcCkn7gSyuFEMmQn1m5bY1yHgw","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":18,"mint":"METAewgxyPbgwsseH8T16a39CQ5VyVxZi9zXiDPY18m","uiTokenAmount":{"uiAmount":124153.904292,"decimals":6,"amount":"124153904292","uiAmountString":"124153.904292"},"owner":"9cjGtAx9UASMWFemCBqTxwPN6gzv26KNntJbmiEpTKjU","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":21,"mint":"So11111111111111111111111111111111111111112","uiTokenAmount":{"uiAmount":1.212180356,"decimals":9,"amount":"1212180356","uiAmountString":"1.212180356"},"owner":"9cjGtAx9UASMWFemCBqTxwPN6gzv26KNntJbmiEpTKjU","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"}],"rewards":[],"loadedAddresses":{"writable":["2eAWV8pjL5xXBWSM7dRxfoBeHuVM6ngdud8EqCSZn4rV","7s2pco2iYjNPKeN7QYaHD8ZSRb8jZgypspwg7DNkZhZJ","BKtCXv95bNmi1QWuHNSAnL5wLdoPvaErg6qzDyiwSP3J","6D4uFhE8E8yJ3Qj37KsKYG2X97yHHEV7o8PsrkF3VmVE","8DP3D2qZAwo3ZMYjb8ej27RXVffDCjgAhTgicRMHsihf","78QBVQz3EnpuzmY42LRcCkn7gSyuFEMmQn1m5bY1yHgw","7Ly7VieuFAMx2kt7aueQQgeqPRSAAnnQDJnayvKHkxCN","CKZzrLVkXxAEVKhPQYBTWbLNRj2EUmMzD3rZrUHobngE","FJbLHycqqAdYsigU3Y2DYoeJ4FnnZuDfA8HjYioNWp3A","4KD13U9sxF3Qjf2ev4noT1TkpYpf1Ppmza7pEvqwFm6m","9cjGtAx9UASMWFemCBqTxwPN6gzv26KNntJbmiEpTKjU","BnPkVv42Dx881MyFXFJWMEbtyXJQAhcdfVtvcGVfJXDp","GdDqNfUsQiyMCtEiXWrjbXxk1Kh3VbBd4ymMdKiSo8bw"],"readonly":["11111111111111111111111111111111","LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo","So11111111111111111111111111111111111111112","TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc","5Q544fKrFoe6tsEbD7S8EmxGTJYAKtTVhAW5Q5pge4j1","675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8","D1ZN9Wj1fRSUQfCjhvnu1hqDMT7hzjzBBpi12nVniYD6","METAewgxyPbgwsseH8T16a39CQ5VyVxZi9zXiDPY18m"]},"computeUnitsConsumed":179732,"costUnits":189785},"version":0,"blockTime":1776309528}} \ No newline at end of file diff --git a/testdata/rpc/5ybEYcXYhFNfCNAu1o7ovM1Rw5285PBzAwsj4ezwmPRLkYtXX91GhcvAgTVZvdCVV6upsGH8DwYeseNswPhEfVbg.json b/testdata/rpc/5ybEYcXYhFNfCNAu1o7ovM1Rw5285PBzAwsj4ezwmPRLkYtXX91GhcvAgTVZvdCVV6upsGH8DwYeseNswPhEfVbg.json new file mode 100644 index 0000000..67937eb --- /dev/null +++ b/testdata/rpc/5ybEYcXYhFNfCNAu1o7ovM1Rw5285PBzAwsj4ezwmPRLkYtXX91GhcvAgTVZvdCVV6upsGH8DwYeseNswPhEfVbg.json @@ -0,0 +1 @@ +{"jsonrpc":"2.0","id":1,"result":{"slot":413538697,"transaction":["Afjeh//agB+ItxEi1Og0GcCSRtP7UqbCX85c/j6kaa+x5tqRbioxP9F0sp4r9mQEqo7XIE3BjXHrZvkUJnPXLQsBAA4XpAgTp/U6q6SPB+pezQvOVsQuEtzV51E8VH7X2LW3bsIzSx9QXcN+HCxdkBfhv9YdiX1aJQc7kmxc1eeqAcct+mYH2j7zagjBFoiPK1SZ+7nnDS3EtW9KgiWUI3f6aCRrYIzMHfzpYbQ7d5wZFQWm4tO/RdWk20YYrXbILWF1RTWhXazjVx2ZIqAPLF52S3DIdt/tTbg8A+PL22llSAPX7rmqaZyF8beyltHcC1bJsQjYwlJ2TU8ZlJSEr4KRFug/yd8s08SrESoI4ivuhnSVCbyR++KKZTD0HElZR8hO7irSc7ryGjtRvrLNZgeUq6sKYoFkyuNfO9e1YUDuByNnBtm+SVolOsiccebpHdfVvC8H26h5quRKzwlV2YAcKAi5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6hl5p7g9UgMq89mNX5NwvGNWNRcHqdIn7NyPZeTxypgFW4PaTZlrPRNsVaL8XW6pRicuX9dL/O2VdK7b9bRiwbnv8rza0WMe/bJzA74dOfgD5IUd/FNN21xIGTbZ+6y9vmrSk8ZWNwKnJTD+3LAeZWEPtpIXjok8QxpOZ+BmUD4yXJY9OJInxuz0QKRSODYMLWhOZ2v8QhASOe9jb6fhZrPE26wH8HE6IPSPItYRKtZo39mrdV8XprDtT4FnTXGSnAtOrwrKBs5dj6IMWLOu9+zVuHm6VS/5HB8BB2IlRIwMGRm/lIRcy/+ytunLDm+e8jOW7xfcSayxDmzpAAAAA5Cvnfwsb0EYlgpM7NvpJfAc40HsY8f1rF/vXnsxAU2b6CRGlSGNBLWMfTgeHAylsA18NEzOg2ciDjXO3EP5uLQrxw0MhiMo6Y1E1oToYlRrOvTeAZXKa+xNDPV8mH366DDX/qQVajlaNqPe8B1YVJ0zxySykH0AAnFFqpBTCfHAG3fbh12Whk9nL4UbO63msHLSF7V9bN5E6jPWFfv8Aqa5cQvy6+1afvGIB+blyfJMyB5CqhCU622ixnXqt2ljlBhEBFAUC+S4CABEACQPKqQoAAAAAAA4GAAUAEAkWAQESEQoDEAEEBQAJFgcPCxMIDRUMGGYGPRIB2uvqAOH1BQAAAABit23h7QAAAAkCAAIMAgAAAEBCDwAAAAAACQIABgwCAAAAoIYBAAAAAAA=","base64"],"meta":{"err":null,"status":{"Ok":null},"fee":105000,"preBalances":[146284182,16624171969,4133832006424,15013184081150,2039280,0,848985814,1137582842,1865141,1,4087496142,8000496367,0,26425733,3387961056,168260857,1461600,1,51161440,17015138,0,4863717,5598483284],"postBalances":[43039902,16722937400,4133833006424,15013185019422,2039280,2039280,849085814,1137879139,1865141,1,4087496142,8000496367,0,26425733,3387961056,168260857,1461600,1,51161440,17015138,0,4863717,5598483284],"innerInstructions":[{"index":2,"instructions":[{"programIdIndex":22,"accounts":[16],"data":"84eT","stackHeight":2},{"programIdIndex":9,"accounts":[0,5],"data":"11119os1e9qSs2u7TsThXqkBSRVFxhmYaFKFZ1waB2X7armDmvK3p5GmLdUxYdg3h7QSrL","stackHeight":2},{"programIdIndex":22,"accounts":[5],"data":"P","stackHeight":2},{"programIdIndex":22,"accounts":[5,16],"data":"6YB1gFy9JvzP8tq23nSsQvKdipqBFbRBpVDFTbmE5cSZf","stackHeight":2}]},{"index":3,"instructions":[{"programIdIndex":11,"accounts":[10,3,16,1,4,5,0,9,22,7,15,11,19,8,13,21,12],"data":"AJTQ2h9DXrBmVH7Q4A5KsmfLQPXd3xsw5","stackHeight":2},{"programIdIndex":21,"accounts":[13,11],"data":"2BfZXS1GQrCLYkurCkS31YFhQ8GV323Jaj1uYg1mcaEzqd","stackHeight":3},{"programIdIndex":22,"accounts":[4,16,5,1],"data":"gxrLBHhfEHkDs","stackHeight":3},{"programIdIndex":9,"accounts":[0,7],"data":"3Bxs4JWLEqc5D6Sb","stackHeight":3},{"programIdIndex":9,"accounts":[0,1],"data":"3Bxs4LmXDzAzRimM","stackHeight":3},{"programIdIndex":9,"accounts":[0,3],"data":"3Bxs46GAvpF61yDR","stackHeight":3},{"programIdIndex":11,"accounts":[15],"data":"244PPAPdRKPZVJTywKYuxXuKcGVNhsrVWdTsdrC7q1CZ9qs9cAkS4GbYBwG3R3irsxGhoWji3ED2KWSS2wRCjHQGi3bcwqRWkmtzGGyr2YTJPPJeK19GU2gt4HF2zpDZURZPriBfqzABN1vzht8RcyWgKLRhJtvn9r1ZnsXkJCkVBSB2C1fgKP1GMsMozRtvnmhpgoJsCiwZ2NJSNRQaaa2fArt1Kan7a1i35VX7YcveG8PeqXQ6zSKkAu7CKHHTJpNueDaqTPE8Qcy8y9X79D21SprpnLjgUCHjnkssVPk99qPL735wSyxHuk5YZLEGApUzcrF1xw4xNgoQyJswK8RvNQFcMrHnSCihE7CMmhXZ1NbdGQeHQGCmpqYxwbCKjZLR4kevg1kjZ","stackHeight":3}]}],"logMessages":["Program ComputeBudget111111111111111111111111111111 invoke [1]","Program ComputeBudget111111111111111111111111111111 success","Program ComputeBudget111111111111111111111111111111 invoke [1]","Program ComputeBudget111111111111111111111111111111 success","Program ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL invoke [1]","Program log: CreateIdempotent","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [2]","Program log: Instruction: GetAccountDataSize","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 1569 of 135946 compute units","Program return: TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA pQAAAAAAAAA=","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA success","Program 11111111111111111111111111111111 invoke [2]","Program 11111111111111111111111111111111 success","Program log: Initialize the associated token account","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [2]","Program log: Instruction: InitializeImmutableOwner","Program log: Please upgrade to SPL Token 2022 for immutable owner support","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 1405 of 129467 compute units","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA success","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [2]","Program log: Instruction: InitializeAccount3","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 4188 of 125638 compute units","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA success","Program ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL consumed 21630 of 142797 compute units","Program ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL success","Program GMgnVFR8Jb39LoXsEVzb3DvBy3ywCmdmJquHUy1Lrkqb invoke [1]","Program log: Instruction: Buy","Program 6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P invoke [2]","Program log: Instruction: Buy","Program pfeeUxB6jkeY1Hxd7CsFCAjcbHA9rWtchMGdZ6VojVZ invoke [3]","Program log: Instruction: GetFees","Program pfeeUxB6jkeY1Hxd7CsFCAjcbHA9rWtchMGdZ6VojVZ consumed 3136 of 65940 compute units","Program return: pfeeUxB6jkeY1Hxd7CsFCAjcbHA9rWtchMGdZ6VojVZ AAAAAAAAAABfAAAAAAAAAB4AAAAAAAAA","Program pfeeUxB6jkeY1Hxd7CsFCAjcbHA9rWtchMGdZ6VojVZ success","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [3]","Program log: Instruction: TransferChecked","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 6147 of 59049 compute units","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA success","Program 11111111111111111111111111111111 invoke [3]","Program 11111111111111111111111111111111 success","Program 11111111111111111111111111111111 invoke [3]","Program 11111111111111111111111111111111 success","Program 11111111111111111111111111111111 invoke [3]","Program 11111111111111111111111111111111 success","Program data: vdt/007mYe6nAtOrwrKBs5dj6IMWLOu9+zVuHm6VS/5HB8BB2IlRI3cK4wUAAAAAQ5hT1FMBAAABpAgTp/U6q6SPB+pezQvOVsQuEtzV51E8VH7X2LW3bsJPdeBpAAAAAOjQyeAKAAAA5Jtdf6ByAgDoJKbkAwAAAOQDSzMPdAEAYIzMHfzpYbQ7d5wZFQWm4tO/RdWk20YYrXbILWF1RTVfAAAAAAAAACBRDgAAAAAAQmbExxXfAipKAUt4K6q+zqIm5HGv79P6Ul86eWOxcyQeAAAAAAAAAGmFBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAGJ1eQAAAAAAAAAAAAAAAAAAAAAA","Program 6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P invoke [3]","Program 6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P consumed 2060 of 29635 compute units","Program 6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P success","Program 6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P consumed 79166 of 105134 compute units","Program 6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P success","Program GMgnVFR8Jb39LoXsEVzb3DvBy3ywCmdmJquHUy1Lrkqb consumed 96968 of 121167 compute units","Program GMgnVFR8Jb39LoXsEVzb3DvBy3ywCmdmJquHUy1Lrkqb success","Program 11111111111111111111111111111111 invoke [1]","Program 11111111111111111111111111111111 success","Program 11111111111111111111111111111111 invoke [1]","Program 11111111111111111111111111111111 success"],"preTokenBalances":[{"accountIndex":4,"mint":"CEwaxx5j1K61JMYXavcxihVQW4NxC6c4NQ27veFpYUYA","uiTokenAmount":{"uiAmount":617443166.757927,"decimals":6,"amount":"617443166757927","uiAmountString":"617443166.757927"},"owner":"4TEEQaTMbsF5MkMuc2VtJzjvLumLFkZoowpjuFQv1sSR","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"}],"postTokenBalances":[{"accountIndex":4,"mint":"CEwaxx5j1K61JMYXavcxihVQW4NxC6c4NQ27veFpYUYA","uiTokenAmount":{"uiAmount":615983610.596324,"decimals":6,"amount":"615983610596324","uiAmountString":"615983610.596324"},"owner":"4TEEQaTMbsF5MkMuc2VtJzjvLumLFkZoowpjuFQv1sSR","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"accountIndex":5,"mint":"CEwaxx5j1K61JMYXavcxihVQW4NxC6c4NQ27veFpYUYA","uiTokenAmount":{"uiAmount":1459556.161603,"decimals":6,"amount":"1459556161603","uiAmountString":"1459556.161603"},"owner":"C3K1KmcWe97JdLvXhHg5SMCLKwbSBfv7nJ5c7BYGKJ8h","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"}],"rewards":[],"loadedAddresses":{"writable":[],"readonly":[]},"computeUnitsConsumed":119198,"costUnits":125457},"version":"legacy","blockTime":1776317775}} \ No newline at end of file diff --git a/testdata/rpc/BD7GZaXaJc2hzSNPe6Q5yeej7rZLQFMpdx4rZwPhGTyHP43iMAR7LxymRSPGXnefAxSqi5sMsEPS1cjyQjup3Eu.json b/testdata/rpc/BD7GZaXaJc2hzSNPe6Q5yeej7rZLQFMpdx4rZwPhGTyHP43iMAR7LxymRSPGXnefAxSqi5sMsEPS1cjyQjup3Eu.json new file mode 100644 index 0000000..6f3e213 --- /dev/null +++ b/testdata/rpc/BD7GZaXaJc2hzSNPe6Q5yeej7rZLQFMpdx4rZwPhGTyHP43iMAR7LxymRSPGXnefAxSqi5sMsEPS1cjyQjup3Eu.json @@ -0,0 +1 @@ +{"jsonrpc":"2.0","id":1,"result":{"slot":413539053,"transaction":["AQjNu8+5EeVuN4Cth/BK4G3EbAJ8Lk1LXdWQX+RPVciGAo8kQ1e/UDY1zTm2aUAsHZINuiPfSDCu6ZaT3wYrugaAAQAKEE5rkFUhW7Ovr7q0IOjPNC7hTOPXA23b2318BHCtQ6DPuNqABpg0UhWay1A/ZMCmlvYrvq1uBupj/mL5YafDHKdbqo0IZzzwIGWPieEk/m9osT6KxtlERRxu5IJIAlvkXVvj3CQnITEn9O3qKwMq0kthz/y1n/Zlt7sYots03z46Cb/UAti64PJVi3iDy0GFZm0fUnZ8fV397r53OgB3ngxzrigpRxdysq2LDQlEnlX+wyaDrdEscFAbEJuqwQTHiAMGRm/lIRcy/+ytunLDm+e8jOW7xfcSayxDmzpAAAAAjJclj04kifG7PRApFI4NgwtaE5na/xCEBI572Nvp+FkGm4hX/quBhPtof2NGGMA12sQ53BrrO1WYoPAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABt324ddloZPZy+FGzut5rBy0he1fWzeROoz1hX7/AKm4Gp+PHRPaChe6fUv6Z/UjiC6t8sYLsuk9jdBMwQ78XAbd9uHudY/eGEJdvORszdq2GvxNg7kNJ/69+SjYoYv8CS0hNWV6FZwrh9S2anDbjpdSOJ/3aq8gbO0GOjj5Wu3yzNU1rKXxc2rIIt0Hc+TZL72KWbKUA1AClakBHHOp5Sp257NEZAoc/FlMi8rQoJEBHKx90Va/g6gz+yII63etO46+jF68yH2VC5QYe3uS242z1z4wl5+BoX/DYmJpiXUHBgAJA/4BAAAAAAAABwYAAQAICQoBAQcGAAIACwkMAQEJAgABDAIAAACARUEEAAAAAAoBAQERDQ4OAwECBAULCAAMCg0PDRlBSz9M61tbiNMckB4AAAAAgEVBBAAAAAACCgMBAAABCQA=","base64"],"meta":{"err":null,"status":{"Ok":null},"fee":5514,"preBalances":[199409810,0,2074080,8630400,2039280,166150095079,1,3387961056,1482665471528,1,5598483284,3911520,58559541,11823511,107898591999,0],"postBalances":[129383919,0,2074080,8630400,2039280,166220115456,1,3387961056,1482665471528,1,5598483284,3911520,58559541,11823511,107898591999,0],"innerInstructions":[{"index":1,"instructions":[{"programIdIndex":10,"accounts":[8],"data":"84eT","stackHeight":2},{"programIdIndex":9,"accounts":[0,1],"data":"11119os1e9qSs2u7TsThXqkBSRVFxhmYaFKFZ1waB2X7armDmvK3p5GmLdUxYdg3h7QSrL","stackHeight":2},{"programIdIndex":10,"accounts":[1],"data":"P","stackHeight":2},{"programIdIndex":10,"accounts":[1,8],"data":"6SQpbu3fEKaLjKKWTmEALGZw1oUWAZnx1i49GFdVeWqti","stackHeight":2}]},{"index":5,"instructions":[{"programIdIndex":10,"accounts":[1,8,5,0],"data":"gRiheUyskooDz","stackHeight":2},{"programIdIndex":12,"accounts":[4,11,2,14],"data":"inocV6Z8EiQjo","stackHeight":2},{"programIdIndex":13,"accounts":[15],"data":"EVM9wLnauu9H41GfKhTodoyNusimszr3fPzkxz3SQixvH8s8ysJrTee8UNhwZGmzBdH8q6Dv7TVyyDZfMRLn4JLvKWLfVmLXt6nSHCn9JJoFPSNRngBReiMJ7SWrhV54ENiWeE79iqdfo4xhRSuj2i3ZY8NHC45ZFuCgwfEjuitha3x2YqRUiHaCkmSU5BefU1zbPPH4nPKTszjeNRM4EGXFEQNFRXzT296JHK5N22yxu9pFZV9jBPDktMqiqLC9s2QU8h97UadV","stackHeight":2}]}],"logMessages":["Program ComputeBudget111111111111111111111111111111 invoke [1]","Program ComputeBudget111111111111111111111111111111 success","Program ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL invoke [1]","Program log: CreateIdempotent","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [2]","Program log: Instruction: GetAccountDataSize","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 1569 of 997499 compute units","Program return: TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA pQAAAAAAAAA=","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA success","Program 11111111111111111111111111111111 invoke [2]","Program 11111111111111111111111111111111 success","Program log: Initialize the associated token account","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [2]","Program log: Instruction: InitializeImmutableOwner","Program log: Please upgrade to SPL Token 2022 for immutable owner support","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 1405 of 991020 compute units","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA success","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [2]","Program log: Instruction: InitializeAccount3","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 3158 of 987191 compute units","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA success","Program ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL consumed 22100 of 1005850 compute units","Program ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL success","Program ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL invoke [1]","Program log: CreateIdempotent","Program ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL consumed 4357 of 983750 compute units","Program ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL success","Program 11111111111111111111111111111111 invoke [1]","Program 11111111111111111111111111111111 success","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [1]","Program log: Instruction: SyncNative","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 3045 of 979243 compute units","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA success","Program cpamdpZCGKUy5JxQXB4dcpGPiikHawvSWAd6mEn1sGG invoke [1]","Program log: Instruction: Swap2","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [2]","Program log: Instruction: TransferChecked","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 6238 of 965076 compute units","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA success","Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb invoke [2]","Program log: Instruction: TransferChecked","Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb consumed 2355 of 957619 compute units","Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb success","Program cpamdpZCGKUy5JxQXB4dcpGPiikHawvSWAd6mEn1sGG invoke [2]","Program cpamdpZCGKUy5JxQXB4dcpGPiikHawvSWAd6mEn1sGG consumed 109 of 952214 compute units","Program cpamdpZCGKUy5JxQXB4dcpGPiikHawvSWAd6mEn1sGG success","Program cpamdpZCGKUy5JxQXB4dcpGPiikHawvSWAd6mEn1sGG consumed 24118 of 976198 compute units","Program cpamdpZCGKUy5JxQXB4dcpGPiikHawvSWAd6mEn1sGG success","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [1]","Program log: Instruction: CloseAccount","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 2915 of 952080 compute units","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA success"],"preTokenBalances":[{"accountIndex":2,"mint":"DPfZc59DLrKyVTJDoKB8CBFgCndsjUzxy6fdbxk4Zms9","uiTokenAmount":{"uiAmount":110326.983186,"decimals":6,"amount":"110326983186","uiAmountString":"110326.983186"},"owner":"6H7vxr8S2j4u3qQwg4xznbVdJavMA3gK18yQm3oqDhTk","programId":"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb"},{"accountIndex":4,"mint":"DPfZc59DLrKyVTJDoKB8CBFgCndsjUzxy6fdbxk4Zms9","uiTokenAmount":{"uiAmount":1409240.41557,"decimals":6,"amount":"1409240415570","uiAmountString":"1409240.41557"},"owner":"HLnpSz9h2S4hiLQ43rnSD9XkcUThA7B8hQMKmDaiTLcC","programId":"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb"},{"accountIndex":5,"mint":"So11111111111111111111111111111111111111112","uiTokenAmount":{"uiAmount":166.148055799,"decimals":9,"amount":"166148055799","uiAmountString":"166.148055799"},"owner":"HLnpSz9h2S4hiLQ43rnSD9XkcUThA7B8hQMKmDaiTLcC","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"}],"postTokenBalances":[{"accountIndex":2,"mint":"DPfZc59DLrKyVTJDoKB8CBFgCndsjUzxy6fdbxk4Zms9","uiTokenAmount":{"uiAmount":110839.744229,"decimals":6,"amount":"110839744229","uiAmountString":"110839.744229"},"owner":"6H7vxr8S2j4u3qQwg4xznbVdJavMA3gK18yQm3oqDhTk","programId":"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb"},{"accountIndex":4,"mint":"DPfZc59DLrKyVTJDoKB8CBFgCndsjUzxy6fdbxk4Zms9","uiTokenAmount":{"uiAmount":1408727.654527,"decimals":6,"amount":"1408727654527","uiAmountString":"1408727.654527"},"owner":"HLnpSz9h2S4hiLQ43rnSD9XkcUThA7B8hQMKmDaiTLcC","programId":"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb"},{"accountIndex":5,"mint":"So11111111111111111111111111111111111111112","uiTokenAmount":{"uiAmount":166.218076176,"decimals":9,"amount":"166218076176","uiAmountString":"166.218076176"},"owner":"HLnpSz9h2S4hiLQ43rnSD9XkcUThA7B8hQMKmDaiTLcC","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"}],"rewards":[],"loadedAddresses":{"writable":[],"readonly":[]},"computeUnitsConsumed":56835,"costUnits":60295},"version":0,"blockTime":1776317918}} \ No newline at end of file diff --git a/tx.go b/tx.go index 63f38fc..e12902c 100644 --- a/tx.go +++ b/tx.go @@ -31,6 +31,18 @@ type Swap struct { BaseAmount decimal.Decimal QuoteAmount decimal.Decimal + SwapMode SwapMode + FixedAmount decimal.Decimal + FixedAmountSide SwapAmountSide + FixedMint solana.PublicKey + LimitAmountType SwapLimitType + LimitAmount decimal.Decimal + LimitAmountSide SwapAmountSide + LimitMint solana.PublicKey + ActualLimitAmount decimal.Decimal + ActualLimitAmountSide SwapAmountSide + SlippageBps decimal.Decimal + BaseReserve decimal.Decimal QuoteReserve decimal.Decimal Mayhem bool