diff --git a/orcawhirpool.go b/orcawhirpool.go index 5ba7f56..9712c47 100644 --- a/orcawhirpool.go +++ b/orcawhirpool.go @@ -281,7 +281,7 @@ func orcaWhirPoolLiquidityParser(tx *Tx, instruction Instruction, innerInstructi return nil, increaseOffset(offset), InstructionIgnoredError } if baseAmount.Equal(decimal.Zero) || quoteAmount.Equal(decimal.Zero) { - instructionName += "_on_side" + instructionName += "_one_side" } if (baseTokenBalance == nil && !baseAmount.Equal(decimal.Zero)) || (quoteTokenBalance == nil && !quoteAmount.Equal(decimal.Zero)) { return nil, offset, fmt.Errorf("token balance is nil but amount is not zero") @@ -388,7 +388,7 @@ func orcaWhirPoolLiquidityV2Parser(tx *Tx, instruction Instruction, innerInstruc return nil, offset, InstructionIgnoredError } if baseAmount.Equal(decimal.Zero) || quoteAmount.Equal(decimal.Zero) { - instructionName += "_on_side" + instructionName += "_one_side" } if (baseTokenBalance == nil && !baseAmount.Equal(decimal.Zero)) || (quoteTokenBalance == nil && !quoteAmount.Equal(decimal.Zero)) { return nil, offset, fmt.Errorf("token balance is nil but amount is not zero") @@ -493,7 +493,7 @@ func orcaWhirPoolCollectFeeParser(tx *Tx, instruction Instruction, innerInstruct return nil, offset, InstructionIgnoredError } if baseAmount.Equal(decimal.Zero) || quoteAmount.Equal(decimal.Zero) { - instructionName += "_on_side" + instructionName += "_one_side" } if (baseTokenBalance == nil && !baseAmount.Equal(decimal.Zero)) || (quoteTokenBalance == nil && !quoteAmount.Equal(decimal.Zero)) { return nil, offset, fmt.Errorf("token balance is nil but amount is not zero") @@ -595,7 +595,7 @@ func orcaWhirPoolCollectFeeV2Parser(tx *Tx, instruction Instruction, innerInstru return nil, offset, InstructionIgnoredError } if baseAmount.Equal(decimal.Zero) || quoteAmount.Equal(decimal.Zero) { - instructionName += "_on_side" + instructionName += "_one_side" } if (baseTokenBalance == nil && !baseAmount.Equal(decimal.Zero)) || (quoteTokenBalance == nil && !quoteAmount.Equal(decimal.Zero)) { return nil, offset, fmt.Errorf("token balance is nil but amount is not zero") @@ -697,7 +697,7 @@ func orcaWhirPoolCollectProtocolFeeV2Parser(tx *Tx, instruction Instruction, inn return nil, offset, InstructionIgnoredError } if baseAmount.Equal(decimal.Zero) || quoteAmount.Equal(decimal.Zero) { - instructionName += "_on_side" + instructionName += "_one_side" } if (baseTokenBalance == nil && !baseAmount.Equal(decimal.Zero)) || (quoteTokenBalance == nil && !quoteAmount.Equal(decimal.Zero)) { return nil, offset, fmt.Errorf("token balance is nil but amount is not zero") @@ -811,23 +811,23 @@ func orcaWhirPoolSwapParser(tx *Tx, instruction Instruction, innerInstructions I } swap := Swap{ - Program: SolProgramOrcaWhirPool, - Event: event, - Pool: pool, - BaseMint: baseTokenBalance.MintAccount, - QuoteMint: quoteTokenBalance.MintAccount, - BaseTokenProgram: baseTokenBalance.ProgramIDAccount, - QuoteTokenProgram: quoteTokenBalance.ProgramIDAccount, - BaseMintDecimals: uint8(baseTokenBalance.UITokenAmount.Decimals), - QuoteMintDecimals: uint8(quoteTokenBalance.UITokenAmount.Decimals), - BaseAmount: baseAmount, - QuoteAmount: quoteAmount, - BaseReserve: baseReserve, - QuoteReserve: quoteReserve, - UserBaseBalance: userBase, - UserQuoteBalance: userQuote, - User: user, - EntryContract: entryContract, + Program: SolProgramOrcaWhirPool, + Event: event, + Pool: pool, + BaseMint: baseTokenBalance.MintAccount, + QuoteMint: quoteTokenBalance.MintAccount, + BaseTokenProgram: baseTokenBalance.ProgramIDAccount, + QuoteTokenProgram: quoteTokenBalance.ProgramIDAccount, + BaseMintDecimals: uint8(baseTokenBalance.UITokenAmount.Decimals), + QuoteMintDecimals: uint8(quoteTokenBalance.UITokenAmount.Decimals), + BaseAmount: baseAmount, + QuoteAmount: quoteAmount, + BaseReserve: baseReserve, + QuoteReserve: quoteReserve, + UserBaseBalance: userBase, + UserQuoteBalance: userQuote, + User: user, + EntryContract: entryContract, } swap.SetSwapAmountInfo(swapMode, decimal.NewFromUint64(amount), decimal.NewFromUint64(otherAmountThreshold)) @@ -922,23 +922,23 @@ func orcaWhirPoolSwapV2Parser(tx *Tx, instruction Instruction, innerInstructions offset[1] += uint(skipOffset + 1) swap := Swap{ - Program: SolProgramOrcaWhirPool, - Event: event, - Pool: pool, - BaseMint: baseTokenBalance.MintAccount, - QuoteMint: quoteTokenBalance.MintAccount, - BaseTokenProgram: baseTokenBalance.ProgramIDAccount, - QuoteTokenProgram: quoteTokenBalance.ProgramIDAccount, - BaseMintDecimals: uint8(baseTokenBalance.UITokenAmount.Decimals), - QuoteMintDecimals: uint8(quoteTokenBalance.UITokenAmount.Decimals), - BaseAmount: baseAmount, - QuoteAmount: quoteAmount, - BaseReserve: baseReserve, - QuoteReserve: quoteReserve, - UserBaseBalance: userBase, - UserQuoteBalance: userQuote, - User: user, - EntryContract: entryContract, + Program: SolProgramOrcaWhirPool, + Event: event, + Pool: pool, + BaseMint: baseTokenBalance.MintAccount, + QuoteMint: quoteTokenBalance.MintAccount, + BaseTokenProgram: baseTokenBalance.ProgramIDAccount, + QuoteTokenProgram: quoteTokenBalance.ProgramIDAccount, + BaseMintDecimals: uint8(baseTokenBalance.UITokenAmount.Decimals), + QuoteMintDecimals: uint8(quoteTokenBalance.UITokenAmount.Decimals), + BaseAmount: baseAmount, + QuoteAmount: quoteAmount, + BaseReserve: baseReserve, + QuoteReserve: quoteReserve, + UserBaseBalance: userBase, + UserQuoteBalance: userQuote, + User: user, + EntryContract: entryContract, } swap.SetSwapAmountInfo(swapMode, decimal.NewFromUint64(amount), decimal.NewFromUint64(otherAmountThreshold)) diff --git a/tx_binary.go b/tx_binary.go index 1c64c35..c1a9933 100644 --- a/tx_binary.go +++ b/tx_binary.go @@ -728,7 +728,7 @@ func newSwapBinary(swap Swap, index int, addressIndex *txBinaryAddressIndex) (Sw out := SwapBinary{ Program: swap.Program, - Event: swap.Event, + Event: txBinaryCanonicalEvent(swap.Event), TxIndex: int32(swap.TxIndex), InstrIdx: swap.InstrIdx, InnerIdx: swap.InnerIdx, @@ -918,6 +918,17 @@ func txBinaryPlatformsFromTx(platforms map[string]platformInfo) ([]PlatformBinar return out, nil } +func txBinaryCanonicalEvent(event string) string { + switch event { + case "add_liquidity_on_side": + return TxEventAddLiquidityOneSide + case "remove_liquidity_on_side": + return TxEventRemoveLiquidityOneSide + default: + return event + } +} + func txBinaryMevAgentsFromTx(mevAgents map[string]mevInfo) ([]MevAgentBinary, error) { if len(mevAgents) == 0 { return nil, nil diff --git a/tx_binary_test.go b/tx_binary_test.go index a588e07..7d04c97 100644 --- a/tx_binary_test.go +++ b/tx_binary_test.go @@ -354,6 +354,62 @@ func TestTxBinaryPreservesFractionalReserves(t *testing.T) { } } +func TestTxBinaryCanonicalizesOnSideEventAlias(t *testing.T) { + tx := &Tx{ + Signer: mustPubKey("So11111111111111111111111111111111111111112"), + Block: 1, + BlockIndex: 1, + CuFee: decimal.NewFromInt(1), + CUPrice: decimal.RequireFromString("0.000001"), + BeforeSolBalance: decimal.RequireFromString("1.000000000"), + AfterSOLBalance: decimal.RequireFromString("0.900000000"), + ComputeUnitsConsumed: 1, + CuLimit: 1, + Swaps: []Swap{ + { + Program: SolProgramOrcaWhirPool, + Event: "remove_liquidity_on_side", + Pool: mustPubKey("11111111111111111111111111111111"), + BaseMint: mustPubKey("3wyAj7RtG72wM1Wv9DkYfL7RAx9X3Jx1sC6E6mN4jWeL"), + QuoteMint: solana.WrappedSol, + BaseTokenProgram: solana.TokenProgramID, + QuoteTokenProgram: solana.TokenProgramID, + Creator: mustPubKey("BPFLoader1111111111111111111111111111111111"), + BaseMintDecimals: 6, + QuoteMintDecimals: 9, + User: mustPubKey("SysvarRent111111111111111111111111111111111"), + BaseAmount: decimal.NewFromInt(10), + QuoteAmount: decimal.Zero, + SwapMode: SwapModeExactIn, + FixedAmount: decimal.NewFromInt(10), + FixedAmountSide: SwapAmountSideBase, + FixedMint: mustPubKey("3wyAj7RtG72wM1Wv9DkYfL7RAx9X3Jx1sC6E6mN4jWeL"), + LimitAmountType: SwapLimitTypeMinOut, + LimitAmount: decimal.Zero, + LimitAmountSide: SwapAmountSideQuote, + ActualLimitAmount: decimal.Zero, + ActualLimitAmountSide: SwapAmountSideQuote, + BaseReserve: decimal.RequireFromString("123.4"), + QuoteReserve: decimal.RequireFromString("456.7"), + AfterSOLBalance: decimal.RequireFromString("0.800000000"), + }, + }, + } + + encoded, err := EncodeTxBinary(tx) + if err != nil { + t.Fatalf("EncodeTxBinary() error = %v", err) + } + + decoded, err := DecodeTxBinary(encoded) + if err != nil { + t.Fatalf("DecodeTxBinary() error = %v", err) + } + if got := decoded.Swaps[0].Event; got != TxEventRemoveLiquidityOneSide { + t.Fatalf("Event = %q, want %q", got, TxEventRemoveLiquidityOneSide) + } +} + func TestTxsBinaryRoundTripWithSharedAddressTable(t *testing.T) { tx1 := Tx{ Signer: mustPubKey("So11111111111111111111111111111111111111112"),