From 79859bc079e618a87a5319f47f2099c31dfc3429 Mon Sep 17 00:00:00 2001 From: sfng Date: Sun, 15 Feb 2026 20:41:47 +0800 Subject: [PATCH] update dflow new action --- pkg/shreder/program_dflow.go | 20 +++++++++- pkg/shreder/program_dflow_test.go | 61 +++++++++++++++++++++++++++++++ 2 files changed, 80 insertions(+), 1 deletion(-) create mode 100644 pkg/shreder/program_dflow_test.go diff --git a/pkg/shreder/program_dflow.go b/pkg/shreder/program_dflow.go index 962aef0..a3832ca 100644 --- a/pkg/shreder/program_dflow.go +++ b/pkg/shreder/program_dflow.go @@ -72,6 +72,11 @@ const ( ActOpenPredictionsOrder ActScorchSwap ActIncludeAccount + + ActDFLOWStabbleWeightedSwap + ActVertigoSwap + ActSetMinimumLegOutputs + ActSetMinimumLegPrices ) // DynamicRouteV1CandidateAction tags @@ -104,7 +109,7 @@ type dflowSwapParams struct { // bytes to skip for Action variants; only PumpFun* actions are decoded. func skipDflowAction(dec *bin.Decoder, tag uint8) (*pumpFunAction, error) { switch tag { - case ActWhirlpoolsSwap, ActClearpoolsSwap, ActWhirlpoolsSwapV2: + case ActWhirlpoolsSwap, ActClearpoolsSwap, ActWhirlpoolsSwapV2, ActDFLOWStabbleWeightedSwap, ActVertigoSwap: // amount u64 + bool + orchestrator_flags u8 return nil, dec.SkipBytes(8 + 1 + 1) case ActRaydiumAmmSwap, ActLifinityV2Swap, ActObricV2Swap, @@ -181,6 +186,19 @@ func skipDflowAction(dec *bin.Decoder, tag uint8) (*pumpFunAction, error) { return nil, dec.SkipBytes(8 + 16 + 1) case ActIncludeAccount: return nil, nil + case ActSetMinimumLegOutputs: + ln, err := dec.ReadUint32(binary.LittleEndian) + if err != nil { + return nil, err + } + return nil, dec.SkipBytes(uint(8 * ln)) + case ActSetMinimumLegPrices: + // Vec<(u64, u8)>; read length and skip the pairs + ln, err := dec.ReadUint32(binary.LittleEndian) + if err != nil { + return nil, err + } + return nil, dec.SkipBytes(uint(uint64(ln) * (8 + 1))) default: return nil, fmt.Errorf("unsupported action tag %d", tag) } diff --git a/pkg/shreder/program_dflow_test.go b/pkg/shreder/program_dflow_test.go new file mode 100644 index 0000000..3fa74d6 --- /dev/null +++ b/pkg/shreder/program_dflow_test.go @@ -0,0 +1,61 @@ +package shreder + +import ( + "encoding/hex" + "testing" +) + +func TestDFlowDecodedSwapParams(t *testing.T) { + tests := []struct { + name string + hexData string + }{ + { + name: "DFlow swap Test 0", + hexData: "f8c69e91e17587c806000000256cb411cd4dcea8c073833936254cc3a7a6f1bc3e1106af1fceaed1bf6d75184d8149476a66d1f0d4c23c177e81d73b8b11297c7f7d8a8d6e339939647915d8096cfcdd170000000093000000300300000000000000000000000000000000000000a84325c4000000002d0decfc36e0bc09000001197bcde00df80000000180130edffead0800000081711ebdc4000000002c013200", + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + instrData, err := hex.DecodeString(tt.hexData) + if err != nil { + t.Fatalf("failed to decode hex string: %v", err) + return + } + //t.Logf("raw bytes: %x", instrData[8:]) + args, err := decodeSwapParams(instrData[8:]) + if err != nil { + t.Fatalf("failed to decode dflow arguments: %v", err) + return + } + t.Logf("decoded args: %+v", args) + }) + } +} + +func TestDFlowV2DecodedSwapParams(t *testing.T) { + tests := []struct { + name string + hexData string + }{ + { + name: "DFlow swap 2 Test 0", + hexData: "414b3f4ceb5b5b880300000025427ee16eed91684faaad4a3f161acd31d92bbc3d1ba0e2ebdb4678448fd5a7aeade9c8b38e8755e811f3373a0056cd5647e4cc3510135f98e97cb03c046ade049d08de17000000007800000023f50a0000000000002e1bfe04000000000001c3e13700000000003601000005", + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + instrData, err := hex.DecodeString(tt.hexData) + if err != nil { + t.Fatalf("failed to decode hex string: %v", err) + return + } + args, err := decodeSwap2Params(instrData[8:]) + if err != nil { + t.Fatalf("failed to decode dflow arguments: %v", err) + return + } + t.Logf("decoded args: %+v", args) + }) + } +}