1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
// #![cfg(feature = "test-sbf")]
// use borsh::BorshDeserialize;
// use nifty_asset::{
// extensions::{Blob, Proxy},
// state::{Asset, Tag, Standard, State},
// ZeroCopy,
// };
// use sigil_program::state::{MintMetadata, TokenAccount, TokenSeeds};
// use sigil_client::{
// instructions::{AddTokenBuilder, CreateTokenAccountBuilder},
// ID as SigilID,
// };
// use solana_program_test::tokio;
// use solana_sdk::{
// signature::{Keypair, Signer},
// system_program,
// transaction::Transaction,
// };
// use stevia::collections::u8_avl_tree::U8Node;
// pub mod helpers;
// use helpers::program_context;
// use crate::helpers::{create_mint, CreateMintParams, DirtyClone, TestMint};
// #[tokio::test]
// async fn transfer_tokens() {
// let mut context = program_context().await;
// let payer_signer = context.payer.dirty_clone();
// let payer = payer_signer.pubkey();
// let namespace_signer = Keypair::new();
// let namespace = namespace_signer.pubkey();
// let user_signer = Keypair::new();
// let user = user_signer.pubkey();
// let TestMint {
// mint: usdc_mint,
// metadata: _,
// } = create_mint(
// &mut context,
// CreateMintParams {
// payer_signer: &payer_signer,
// namespace_signer: &namespace_signer,
// ticker: String::from("USDC"),
// namespace,
// max_supply: 1_000_000_000,
// decimals: 6,
// },
// )
// .await
// .unwrap();
// let TestMint {
// mint: bonk_mint,
// metadata: _,
// } = create_mint(
// &mut context,
// CreateMintParams {
// payer_signer: &payer_signer,
// namespace_signer: &namespace_signer,
// ticker: String::from("BONK"),
// namespace,
// max_supply: 1_000_000_000,
// decimals: 6,
// },
// )
// .await
// .unwrap();
// // Find user's token account for the namespace.
// let address = TokenAccount::find_pda(TokenSeeds { user, namespace }).0;
// // Create the token account.
// let ix = CreateTokenAccountBuilder::new()
// .token_account(address)
// .user(user)
// .namespace(namespace)
// .payer(payer)
// .capacity(0)
// .instruction();
// let tx = Transaction::new_signed_with_payer(
// &[ix],
// Some(&payer),
// &[&payer_signer],
// context.last_blockhash,
// );
// context.banks_client.process_transaction(tx).await.unwrap();
// // The account exists...
// let account = context.banks_client.get_account(address).await.unwrap();
// assert!(account.is_some());
// //...and has the base length
// let account = account.unwrap();
// assert_eq!(account.data.len(), TokenAccount::BASE_LEN);
// //...and the expected data.
// let token_account = TokenAccount::from_bytes(&account.data);
// assert_eq!(token_account.header.namespace, namespace);
// // Add a token account for USDC mint to the user's token account.
// let ix = AddTokenBuilder::new()
// .payer(Some(payer))
// .user(user)
// .mint(usdc_mint)
// .token_account(address)
// .system_program(Some(system_program::ID))
// .instruction();
// let tx = Transaction::new_signed_with_payer(
// &[ix],
// Some(&payer),
// &[&payer_signer],
// context.last_blockhash,
// );
// context.banks_client.process_transaction(tx).await.unwrap();
// let account = context.banks_client.get_account(address).await.unwrap();
// assert!(account.is_some());
// // the account now has additional data the size of one U8Node.
// let account = account.unwrap();
// assert_eq!(
// account.data.len(),
// TokenAccount::BASE_LEN + std::mem::size_of::<U8Node<u32, u32>>()
// );
// // Add a second token to the token account.
// let ix = AddTokenBuilder::new()
// .payer(Some(payer))
// .user(user)
// .mint(bonk_mint)
// .token_account(address)
// .system_program(Some(system_program::ID))
// .instruction();
// let tx = Transaction::new_signed_with_payer(
// &[ix],
// Some(&payer),
// &[&payer_signer],
// context.last_blockhash,
// );
// context.banks_client.process_transaction(tx).await.unwrap();
// let account = context.banks_client.get_account(address).await.unwrap();
// assert!(account.is_some());
// // the account now has additional data the size of two U8Node.
// let account = account.unwrap();
// assert_eq!(
// account.data.len(),
// TokenAccount::BASE_LEN + std::mem::size_of::<U8Node<u32, u32>>() * 2
// );
// }