Skip to main content

defituna_core/utils/
jupiter.rs

1use solana_instruction::Instruction;
2use solana_pubkey::Pubkey;
3
4// Jupiter instruction discriminators
5pub 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}