defituna_core/utils/
jupiter.rs1use solana_instruction::Instruction;
2use solana_pubkey::Pubkey;
3
4pub const JUPITER_CREATE_TOKEN_ACCOUNT_DISCRIMINATOR: [u8; 8] = [147, 241, 123, 100, 244, 132, 174, 118];
6pub const JUPITER_ROUTE_DISCRIMINATOR: [u8; 8] = [229, 23, 203, 151, 122, 227, 173, 42];
7pub const JUPITER_ROUTE_V2_DISCRIMINATOR: [u8; 8] = [187, 100, 250, 204, 49, 196, 175, 20];
8pub const JUPITER_ROUTE_WITH_TOKEN_LEDGER_DISCRIMINATOR: [u8; 8] = [150, 86, 71, 116, 167, 93, 14, 104];
9pub const JUPITER_EXACT_OUT_ROUTE_DISCRIMINATOR: [u8; 8] = [208, 51, 239, 151, 123, 43, 237, 92];
10pub const JUPITER_EXACT_OUT_ROUTE_V2_DISCRIMINATOR: [u8; 8] = [157, 138, 184, 82, 21, 244, 243, 36];
11pub const JUPITER_SHARED_ACCOUNTS_ROUTE_DISCRIMINATOR: [u8; 8] = [193, 32, 155, 51, 65, 214, 156, 129];
12pub const JUPITER_SHARED_ACCOUNTS_ROUTE_V2_DISCRIMINATOR: [u8; 8] = [209, 152, 83, 147, 124, 254, 216, 233];
13pub const JUPITER_SHARED_ACCOUNTS_ROUTE_WITH_TOKEN_LEDGER_DISCRIMINATOR: [u8; 8] = [230, 121, 143, 80, 119, 159, 106, 170];
14pub const JUPITER_SHARED_ACCOUNTS_EXACT_OUT_ROUTE_DISCRIMINATOR: [u8; 8] = [176, 209, 105, 168, 154, 125, 69, 62];
15pub const JUPITER_SHARED_ACCOUNTS_EXACT_OUT_ROUTE_V2_DISCRIMINATOR: [u8; 8] = [53, 96, 229, 202, 216, 187, 250, 24];
16
17pub fn is_jupiter_create_token_account_instruction(ix: &Instruction) -> bool {
18 if ix.data.len() < 8 {
19 return false;
20 }
21
22 ix.data[0..8] == JUPITER_CREATE_TOKEN_ACCOUNT_DISCRIMINATOR
23}
24
25pub fn get_user_source_token_account_address(ix: &Instruction) -> Option<Pubkey> {
26 if ix.data.len() < 8 {
27 return None;
28 }
29
30 let ix_discriminator = &ix.data[0..8];
31
32 if ix_discriminator == JUPITER_ROUTE_V2_DISCRIMINATOR || ix_discriminator == JUPITER_EXACT_OUT_ROUTE_V2_DISCRIMINATOR {
33 Some(ix.accounts[1].pubkey)
34 } else if ix_discriminator == JUPITER_ROUTE_DISCRIMINATOR
35 || ix_discriminator == JUPITER_EXACT_OUT_ROUTE_DISCRIMINATOR
36 || ix_discriminator == JUPITER_SHARED_ACCOUNTS_ROUTE_V2_DISCRIMINATOR
37 || ix_discriminator == JUPITER_SHARED_ACCOUNTS_EXACT_OUT_ROUTE_V2_DISCRIMINATOR
38 {
39 Some(ix.accounts[2].pubkey)
40 } else if ix_discriminator == JUPITER_SHARED_ACCOUNTS_ROUTE_DISCRIMINATOR
41 || ix_discriminator == JUPITER_SHARED_ACCOUNTS_EXACT_OUT_ROUTE_DISCRIMINATOR
42 {
43 Some(ix.accounts[3].pubkey)
44 } else {
45 None
46 }
47}
48
49pub fn get_user_destination_token_account_address(ix: &Instruction) -> Option<Pubkey> {
50 if ix.data.len() < 8 {
51 return None;
52 }
53
54 let ix_discriminator = &ix.data[0..8];
55
56 if ix_discriminator == JUPITER_ROUTE_V2_DISCRIMINATOR || ix_discriminator == JUPITER_EXACT_OUT_ROUTE_V2_DISCRIMINATOR {
57 Some(ix.accounts[2].pubkey)
58 } else if ix_discriminator == JUPITER_ROUTE_DISCRIMINATOR || ix_discriminator == JUPITER_EXACT_OUT_ROUTE_DISCRIMINATOR {
59 Some(ix.accounts[3].pubkey)
60 } else {
61 None
62 }
63}