Skip to main content

mollusk_svm_programs_token/
token.rs

1use {
2    mollusk_svm::Mollusk,
3    solana_account::Account,
4    solana_program_pack::Pack,
5    solana_pubkey::Pubkey,
6    solana_rent::Rent,
7    spl_token_interface::state::{Account as TokenAccount, Mint},
8};
9
10pub const ID: Pubkey = solana_pubkey::pubkey!("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA");
11
12pub const ELF: &[u8] = include_bytes!("elf/token.so");
13
14pub fn add_program(mollusk: &mut Mollusk) {
15    // Loader v2
16    mollusk.add_program_with_loader_and_elf(
17        &ID,
18        &mollusk_svm::program::loader_keys::LOADER_V2,
19        ELF,
20    );
21}
22
23pub fn account() -> Account {
24    // Loader v2
25    mollusk_svm::program::create_program_account_loader_v2(ELF)
26}
27
28/// Get the key and account for the SPL Token program.
29pub fn keyed_account() -> (Pubkey, Account) {
30    (ID, account())
31}
32
33/// Create a Mint Account
34pub fn create_account_for_mint(mint_data: Mint) -> Account {
35    let mut data = vec![0u8; Mint::LEN];
36    Mint::pack(mint_data, &mut data).unwrap();
37
38    Account {
39        lamports: Rent::default().minimum_balance(Mint::LEN),
40        data,
41        owner: ID,
42        executable: false,
43        rent_epoch: 0,
44    }
45}
46
47/// Create a Token Account
48pub fn create_account_for_token_account(token_account_data: TokenAccount) -> Account {
49    let mut data = vec![0u8; TokenAccount::LEN];
50    TokenAccount::pack(token_account_data, &mut data).unwrap();
51
52    Account {
53        lamports: Rent::default().minimum_balance(TokenAccount::LEN),
54        data,
55        owner: ID,
56        executable: false,
57        rent_epoch: 0,
58    }
59}