1
1
#![ allow( unexpected_cfgs) ]
2
2
3
- use anchor_lang:: { prelude:: * , solana_program:: program:: invoke, Discriminator } ;
4
- use light_compressed_token_sdk:: instructions:: transfer:: instruction:: DecompressInputs ;
3
+ use anchor_lang:: prelude:: * ;
5
4
use light_compressed_token_sdk:: instructions:: Recipient ;
6
- use light_compressed_token_sdk:: {
7
- account :: CTokenAccount ,
8
- instructions :: {
9
- batch_compress :: { create_batch_compress_instruction , BatchCompressInputs } ,
10
- transfer :: {
11
- instruction :: { compress , decompress , transfer , CompressInputs , TransferInputs } ,
12
- TransferAccountInfos ,
13
- } ,
14
- } ,
15
- TokenAccountMeta , ValidityProof ,
16
- } ;
5
+ use light_compressed_token_sdk:: { TokenAccountMeta , ValidityProof } ;
6
+
7
+ mod process_compress_tokens ;
8
+ mod process_transfer_tokens ;
9
+ mod process_decompress_tokens ;
10
+ mod process_batch_compress_tokens ;
11
+
12
+ use process_compress_tokens :: process_compress_tokens ;
13
+ use process_transfer_tokens :: process_transfer_tokens ;
14
+ use process_decompress_tokens :: process_decompress_tokens ;
15
+ use process_batch_compress_tokens :: process_batch_compress_tokens ;
17
16
18
17
declare_id ! ( "5p1t1GAaKtK1FKCh5Hd2Gu8JCu3eREhJm4Q2qYfTEPYK" ) ;
19
18
20
19
#[ program]
21
20
pub mod sdk_token_test {
22
-
23
- use light_compressed_token_sdk:: account_infos:: BatchCompressAccountInfos ;
24
-
25
21
use super :: * ;
26
22
27
23
pub fn compress_tokens < ' info > (
28
24
ctx : Context < ' _ , ' _ , ' _ , ' info , Generic < ' info > > ,
29
25
output_tree_index : u8 ,
30
- recipient : Pubkey , // TODO: make recpient pda
31
- mint : Pubkey , // TODO: deserialize from token account.
26
+ recipient : Pubkey ,
27
+ mint : Pubkey ,
32
28
amount : u64 ,
33
29
) -> Result < ( ) > {
34
- let light_cpi_accounts = TransferAccountInfos :: new_compress (
35
- ctx. accounts . signer . as_ref ( ) ,
36
- ctx. accounts . signer . as_ref ( ) ,
37
- ctx. remaining_accounts ,
38
- ) ;
39
-
40
- let compress_inputs = CompressInputs {
41
- fee_payer : * ctx. accounts . signer . key ,
42
- authority : * ctx. accounts . signer . key ,
43
- mint,
44
- recipient,
45
- sender_token_account : * light_cpi_accounts. sender_token_account ( ) . unwrap ( ) . key ,
46
- amount,
47
- // can be hardcoded as 0, exposed for flexibility
48
- // and as marker that a tree has to be provided.
49
- output_tree_index,
50
- output_queue_pubkey : * light_cpi_accounts. tree_accounts ( ) . unwrap ( ) [ 0 ] . key ,
51
- token_pool_pda : * light_cpi_accounts. token_pool_pda ( ) . unwrap ( ) . key ,
52
- transfer_config : None ,
53
- spl_token_program : * light_cpi_accounts. spl_token_program ( ) . unwrap ( ) . key ,
54
- } ;
55
-
56
- let instruction = compress ( compress_inputs) . map_err ( ProgramError :: from) ?;
57
- msg ! ( "instruction {:?}" , instruction) ;
58
- let account_infos = light_cpi_accounts. to_account_infos ( ) ;
59
-
60
- invoke ( & instruction, account_infos. as_slice ( ) ) ?;
61
-
62
- Ok ( ( ) )
30
+ process_compress_tokens ( ctx, output_tree_index, recipient, mint, amount)
63
31
}
64
32
65
33
pub fn transfer_tokens < ' info > (
@@ -70,37 +38,7 @@ pub mod sdk_token_test {
70
38
mint : Pubkey ,
71
39
recipient : Pubkey ,
72
40
) -> Result < ( ) > {
73
- let light_cpi_accounts = TransferAccountInfos :: new (
74
- ctx. accounts . signer . as_ref ( ) ,
75
- ctx. accounts . signer . as_ref ( ) ,
76
- ctx. remaining_accounts ,
77
- ) ;
78
- let sender_account = CTokenAccount :: new (
79
- mint,
80
- ctx. accounts . signer . key ( ) ,
81
- token_metas,
82
- // We pack the accounts offchain.
83
- output_tree_index,
84
- ) ;
85
- let transfer_inputs = TransferInputs {
86
- fee_payer : ctx. accounts . signer . key ( ) ,
87
- // This way we can use CTokenAccount as anchor account type
88
- sender_account,
89
- validity_proof,
90
- recipient,
91
- // This is necessary for on and offchain compatibility.
92
- // This is not an optimal solution because we collect pubkeys into a vector.
93
- tree_pubkeys : light_cpi_accounts. tree_pubkeys ( ) . unwrap ( ) ,
94
- config : None ,
95
- amount : 10 ,
96
- } ;
97
- let instruction = transfer ( transfer_inputs) . unwrap ( ) ;
98
-
99
- let account_infos = light_cpi_accounts. to_account_infos ( ) ;
100
-
101
- invoke ( & instruction, account_infos. as_slice ( ) ) ?;
102
-
103
- Ok ( ( ) )
41
+ process_transfer_tokens ( ctx, validity_proof, token_metas, output_tree_index, mint, recipient)
104
42
}
105
43
106
44
pub fn decompress_tokens < ' info > (
@@ -110,38 +48,7 @@ pub mod sdk_token_test {
110
48
output_tree_index : u8 ,
111
49
mint : Pubkey ,
112
50
) -> Result < ( ) > {
113
- let sender_account = light_compressed_token_sdk:: account:: CTokenAccount :: new (
114
- mint,
115
- ctx. accounts . signer . key ( ) ,
116
- token_data,
117
- output_tree_index,
118
- ) ;
119
-
120
- let light_cpi_accounts = TransferAccountInfos :: new_decompress (
121
- ctx. accounts . signer . as_ref ( ) ,
122
- ctx. accounts . signer . as_ref ( ) ,
123
- ctx. remaining_accounts ,
124
- ) ;
125
-
126
- let inputs = DecompressInputs {
127
- fee_payer : * ctx. accounts . signer . key ,
128
- validity_proof,
129
- sender_account,
130
- amount : 10 ,
131
- tree_pubkeys : light_cpi_accounts. tree_pubkeys ( ) . unwrap ( ) ,
132
- token_pool_pda : * light_cpi_accounts. token_pool_pda ( ) . unwrap ( ) . key ,
133
- recipient_token_account : * light_cpi_accounts. decompression_recipient ( ) . unwrap ( ) . key ,
134
- // TODO: consider replacing with token program id
135
- spl_token_program : * light_cpi_accounts. spl_token_program ( ) . unwrap ( ) . key ,
136
- config : None ,
137
- } ;
138
-
139
- let instruction = decompress ( inputs) . unwrap ( ) ;
140
- let account_infos = light_cpi_accounts. to_account_infos ( ) ;
141
-
142
- invoke ( & instruction, account_infos. as_slice ( ) ) ?;
143
-
144
- Ok ( ( ) )
51
+ process_decompress_tokens ( ctx, validity_proof, token_data, output_tree_index, mint)
145
52
}
146
53
147
54
pub fn batch_compress_tokens < ' info > (
@@ -150,47 +57,7 @@ pub mod sdk_token_test {
150
57
token_pool_index : u8 ,
151
58
token_pool_bump : u8 ,
152
59
) -> Result < ( ) > {
153
- let light_cpi_accounts = BatchCompressAccountInfos :: new (
154
- ctx. accounts . signer . as_ref ( ) ,
155
- ctx. accounts . signer . as_ref ( ) ,
156
- ctx. remaining_accounts ,
157
- ) ;
158
-
159
- // Convert local Recipient to SDK Recipient
160
- let sdk_recipients: Vec <
161
- light_compressed_token_sdk:: instructions:: batch_compress:: Recipient ,
162
- > = recipients
163
- . into_iter ( )
164
- . map (
165
- |r| light_compressed_token_sdk:: instructions:: batch_compress:: Recipient {
166
- pubkey : r. pubkey ,
167
- amount : r. amount ,
168
- } ,
169
- )
170
- . collect ( ) ;
171
-
172
- let batch_compress_inputs = BatchCompressInputs {
173
- fee_payer : * ctx. accounts . signer . key ,
174
- authority : * ctx. accounts . signer . key ,
175
- token_pool_pda : * light_cpi_accounts. token_pool_pda ( ) . unwrap ( ) . key ,
176
- sender_token_account : * light_cpi_accounts. sender_token_account ( ) . unwrap ( ) . key ,
177
- token_program : * light_cpi_accounts. token_program ( ) . unwrap ( ) . key ,
178
- merkle_tree : * light_cpi_accounts. merkle_tree ( ) . unwrap ( ) . key ,
179
- recipients : sdk_recipients,
180
- lamports : None ,
181
- token_pool_index,
182
- token_pool_bump,
183
- sol_pool_pda : None ,
184
- } ;
185
-
186
- let instruction =
187
- create_batch_compress_instruction ( batch_compress_inputs) . map_err ( ProgramError :: from) ?;
188
- msg ! ( "batch compress instruction {:?}" , instruction) ;
189
- let account_infos = light_cpi_accounts. to_account_infos ( ) ;
190
-
191
- invoke ( & instruction, account_infos. as_slice ( ) ) ?;
192
-
193
- Ok ( ( ) )
60
+ process_batch_compress_tokens ( ctx, recipients, token_pool_index, token_pool_bump)
194
61
}
195
62
}
196
63
0 commit comments