162 lines
5.3 KiB
Go
162 lines
5.3 KiB
Go
package shreder
|
|
|
|
import (
|
|
"encoding/hex"
|
|
"testing"
|
|
|
|
"github.com/gagliardetto/solana-go"
|
|
)
|
|
|
|
func TestDecodeRouteV2Arg(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
hexData string
|
|
}{
|
|
{
|
|
name: "Jupiter V6 RouteV2Arg Test 0",
|
|
hexData: "bb64facc31c4af14809fd500000000002222e8db1800000064000a000000020000005601fe102700016310270102",
|
|
},
|
|
{
|
|
name: "Jupiter V6 RouteV2Arg Test 1",
|
|
hexData: "bb64facc31c4af144ff91634b90000004e6c4d05000000002c013200000003000000520000000000000000102700014f102701024310270203",
|
|
},
|
|
{
|
|
name: "Jupiter V6 RouteV2Arg Test 2",
|
|
hexData: "bb64facc31c4af14ba2eafa02c1d0000777a9b2200000000f4010a0000000100000052000000000000000010270001",
|
|
},
|
|
{
|
|
name: "Jupiter V6 RouteV2Arg Test 3",
|
|
hexData: "bb64facc31c4af144a3521186b07000030508d0e00000000c201320000000300000052000000000000000010270001740110270102590010270203",
|
|
},
|
|
{
|
|
name: "Jupiter V6 RouteV2Arg Test 4",
|
|
hexData: "bb64facc31c4af14092d05050000000013701f198c0100008102380100000300000059011027000168001027010251000000000000000010270203",
|
|
},
|
|
{
|
|
name: "Jupiter V6 RouteV2Arg Test 5",
|
|
hexData: "bb64facc31c4af1480969800000000006f44ad39bd0000001202320000000200000068001027000151000000000000000010270102",
|
|
},
|
|
}
|
|
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 := decodeJupiterV6RouteV2Arg(instrData[8:])
|
|
if err != nil {
|
|
t.Fatalf("failed to decode jupiter arguments: %v", err)
|
|
return
|
|
}
|
|
t.Logf("decoded args: %+v", args)
|
|
})
|
|
}
|
|
|
|
}
|
|
|
|
func TestDecodeRouteArg(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
hexData string
|
|
}{
|
|
{
|
|
name: "Jupiter V6 RouteArg Test 0",
|
|
hexData: "e517cb977ae3ad2a030000004f6400014f64010251000000000000000064020340420f00000000005c1c81900e000000640000",
|
|
},
|
|
{
|
|
name: "Jupiter V6 RouteArg Test 1",
|
|
hexData: "e517cb977ae3ad2a03000000646400017ab0b6c3d206f46577050000000c0000526401025f00640203bb628e2902000000338c430100000000320000",
|
|
},
|
|
{
|
|
name: "Jupiter V6 RouteArg Test 2",
|
|
hexData: "e517cb977ae3ad2a04000000642300024b00000000410002761acfb15ea9fdcd0501200204769358e96343759bf8014402046196591e1e020000f5bf6fe101000000d00700",
|
|
},
|
|
}
|
|
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 := decodeJupiterV6RouteArg(instrData[8:])
|
|
if err != nil {
|
|
t.Fatalf("failed to decode jupiter arguments: %v", err)
|
|
return
|
|
}
|
|
t.Logf("decoded args: %+v", args)
|
|
})
|
|
}
|
|
|
|
}
|
|
|
|
func TestParseJupiterV6RouteDoesNotMisclassifyMeteoraDlmmAsPump(t *testing.T) {
|
|
instrData, err := hex.DecodeString("e517cb977ae3ad2a0100000026640001b9fe480300000000187dbe35000000002c0100")
|
|
if err != nil {
|
|
t.Fatalf("failed to decode instruction data: %v", err)
|
|
}
|
|
|
|
accountStrs := []string{
|
|
"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
|
|
"7Ubi7vPnj5E2WdMtpA21mQoZmpY2TnrDqWpHJg2j2k7z",
|
|
"F7GdscGrjA8YwmiRaJNnbFAtmU6pmncwJX2Q6TNEVtWJ",
|
|
"4tBgpAzd4QRCSKDkmSaRVqWpnKmRJjT5djjhaspNxUWR",
|
|
"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4",
|
|
"CreiuhfwdWCN5mJbMJtA9bBpYQrQF2tCBuZwSPWfpump",
|
|
"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4",
|
|
"D8cy77BBepLMngZx6ZukaTff5hCt1HrWyKk3Hnd9oitf",
|
|
"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4",
|
|
"LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo",
|
|
"6bh2zL833toG7TnbBn2HEi6vLBbMTEwREk6YPZYQThDK",
|
|
"7Arfi1EzAiSMdbbwsEwUzndDGQzw1bHrVHir2cZmYi96",
|
|
"8SQXJSUGrwRuh1fRtta2pGTXSKztboatnDjV9hdi7Kon",
|
|
"G6SuCjTPhddLpUd7uUh5NJCpEhfg5oeN5vKxYmvnDX6i",
|
|
"F7GdscGrjA8YwmiRaJNnbFAtmU6pmncwJX2Q6TNEVtWJ",
|
|
"4tBgpAzd4QRCSKDkmSaRVqWpnKmRJjT5djjhaspNxUWR",
|
|
"CreiuhfwdWCN5mJbMJtA9bBpYQrQF2tCBuZwSPWfpump",
|
|
"Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB",
|
|
"9CuRuTiaNQjKyX73iPGY2n3qUZmP2Fyk4RvXKaHEksqj",
|
|
"LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo",
|
|
"7Ubi7vPnj5E2WdMtpA21mQoZmpY2TnrDqWpHJg2j2k7z",
|
|
"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
|
|
"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
|
|
"D1ZN9Wj1fRSUQfCjhvnu1hqDMT7hzjzBBpi12nVniYD6",
|
|
"LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo",
|
|
"BAxxa7cjHvqbSGpowcpinGxNKN66B9vwsMhSNzUWuS69",
|
|
"99nHJNiPJBBupPfK7jdEsvx9KoHxSbeqSAfyn2qgboFA",
|
|
"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4",
|
|
}
|
|
|
|
accounts := make([]solana.PublicKey, 0, len(accountStrs))
|
|
accountIndexes := make([]uint8, 0, len(accountStrs))
|
|
for i, account := range accountStrs {
|
|
accounts = append(accounts, solana.MustPublicKeyFromBase58(account))
|
|
accountIndexes = append(accountIndexes, uint8(i))
|
|
}
|
|
|
|
tx := VersionedTransaction{
|
|
Signatures: []solana.Signature{
|
|
solana.MustSignatureFromBase58("3AJSh1Dv4MHQL8UKLiVRkbAX2D45VRtNro68am9Dd66kh89khuFQGtsf8x1yx6m3pGSXU8vagb7Q4YfGXsfMzgEy"),
|
|
},
|
|
StaticAccountKeys: accounts,
|
|
Instructions: []Instructions{
|
|
{
|
|
ProgramIDIndex: 4,
|
|
Accounts: accountIndexes,
|
|
Data: instrData,
|
|
},
|
|
},
|
|
}
|
|
|
|
signals, err := parseJupiterV6Instruction(tx, 0)
|
|
if err != nil {
|
|
t.Fatalf("parseJupiterV6Instruction returned error: %v", err)
|
|
}
|
|
if len(signals) != 0 {
|
|
t.Fatalf("expected no signal for Meteora DLMM route, got %+v", signals)
|
|
}
|
|
}
|