Skip to main content

rialo_s_inline_spl/
token.rs

1// Copyright (c) Subzero Labs, Inc.
2// SPDX-License-Identifier: Apache-2.0
3// This file is either (a) original to Subzero Labs, Inc. or (b) derived from the Anza codebase and modified by Subzero Labs, Inc.
4
5/// Partial SPL Token declarations inlined to avoid an external dependency on the spl-token crate
6use rialo_s_pubkey::{Pubkey, PUBKEY_BYTES};
7
8rialo_s_pubkey::declare_id!("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA");
9
10pub mod program_v3_4_0 {
11    rialo_s_pubkey::declare_id!("NToK4t5AQzxPNpUA84DkxgfXaVDbDQQjpHKCqsbY46B");
12}
13
14/*
15    spl_token::state::Account {
16        mint: Pubkey,
17        owner: Pubkey,
18        amount: u64,
19        delegate: COption<Pubkey>,
20        state: AccountState,
21        is_native: COption<u64>,
22        delegated_amount: u64,
23        close_authority: COption<Pubkey>,
24    }
25*/
26pub const SPL_TOKEN_ACCOUNT_MINT_OFFSET: usize = 0;
27pub const SPL_TOKEN_ACCOUNT_OWNER_OFFSET: usize = 32;
28pub const SPL_TOKEN_ACCOUNT_LENGTH: usize = 165;
29
30pub trait GenericTokenAccount {
31    fn valid_account_data(account_data: &[u8]) -> bool;
32
33    // Call after account length has already been verified
34    fn unpack_account_owner_unchecked(account_data: &[u8]) -> &Pubkey {
35        Self::unpack_pubkey_unchecked(account_data, SPL_TOKEN_ACCOUNT_OWNER_OFFSET)
36    }
37
38    // Call after account length has already been verified
39    fn unpack_account_mint_unchecked(account_data: &[u8]) -> &Pubkey {
40        Self::unpack_pubkey_unchecked(account_data, SPL_TOKEN_ACCOUNT_MINT_OFFSET)
41    }
42
43    // Call after account length has already been verified
44    fn unpack_pubkey_unchecked(account_data: &[u8], offset: usize) -> &Pubkey {
45        bytemuck::from_bytes(&account_data[offset..offset.wrapping_add(PUBKEY_BYTES)])
46    }
47
48    fn unpack_account_owner(account_data: &[u8]) -> Option<&Pubkey> {
49        if Self::valid_account_data(account_data) {
50            Some(Self::unpack_account_owner_unchecked(account_data))
51        } else {
52            None
53        }
54    }
55
56    fn unpack_account_mint(account_data: &[u8]) -> Option<&Pubkey> {
57        if Self::valid_account_data(account_data) {
58            Some(Self::unpack_account_mint_unchecked(account_data))
59        } else {
60            None
61        }
62    }
63}
64
65pub struct Account;
66impl Account {
67    pub fn get_packed_len() -> usize {
68        SPL_TOKEN_ACCOUNT_LENGTH
69    }
70}
71
72impl GenericTokenAccount for Account {
73    fn valid_account_data(account_data: &[u8]) -> bool {
74        account_data.len() == SPL_TOKEN_ACCOUNT_LENGTH
75    }
76}
77
78pub mod native_mint {
79    rialo_s_pubkey::declare_id!("So11111111111111111111111111111111111111112");
80
81    /*
82        Mint {
83            mint_authority: COption::None,
84            supply: 0,
85            decimals: 9,
86            is_initialized: true,
87            freeze_authority: COption::None,
88        }
89    */
90    pub const ACCOUNT_DATA: [u8; 82] = [
91        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
92        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
93        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
94    ];
95}