@@ -10,7 +10,9 @@ mod process_compress_tokens;
10
10
mod process_create_compressed_account;
11
11
mod process_decompress_tokens;
12
12
mod process_transfer_tokens;
13
+ mod process_update_depost;
13
14
15
+ use light_sdk:: { cpi:: CpiAccounts , instruction:: account_meta:: CompressedAccountMeta } ;
14
16
use process_batch_compress_tokens:: process_batch_compress_tokens;
15
17
use process_compress_tokens:: process_compress_tokens;
16
18
use process_create_compressed_account:: process_create_compressed_account;
@@ -26,10 +28,14 @@ pub const LIGHT_CPI_SIGNER: CpiSigner =
26
28
27
29
#[ program]
28
30
pub mod sdk_token_test {
29
- use light_sdk:: cpi:: CpiAccounts ;
31
+ use anchor_lang:: solana_program:: pubkey;
32
+ use light_sdk:: address:: v1:: derive_address;
30
33
use light_sdk_types:: CpiAccountsConfig ;
31
34
32
- use crate :: process_create_compressed_account:: deposit_tokens;
35
+ use crate :: {
36
+ process_create_compressed_account:: deposit_tokens,
37
+ process_update_depost:: { deposit_additional_tokens, process_update_escrow_pda} ,
38
+ } ;
33
39
34
40
use super :: * ;
35
41
@@ -88,8 +94,8 @@ pub mod sdk_token_test {
88
94
deposit_amount : u64 ,
89
95
token_metas : Vec < TokenAccountMeta > ,
90
96
mint : Pubkey ,
91
- recipient : Pubkey ,
92
97
system_accounts_start_offset : u8 ,
98
+ recipient_bump : u8 ,
93
99
) -> Result < ( ) > {
94
100
// It makes sense to parse accounts once.
95
101
let config = CpiAccountsConfig {
@@ -100,30 +106,124 @@ pub mod sdk_token_test {
100
106
sol_pool_pda : false ,
101
107
sol_compression_recipient : false ,
102
108
} ;
103
- let ( token_account_infos , system_account_infos) = ctx
109
+ let ( _ , system_account_infos) = ctx
104
110
. remaining_accounts
105
111
. split_at ( system_accounts_start_offset as usize ) ;
106
112
// Could add with pre account infos Option<u8>
107
- let light_cpi_accounts = CpiAccounts :: new_with_config (
113
+ let light_cpi_accounts = CpiAccounts :: try_new_with_config (
108
114
ctx. accounts . signer . as_ref ( ) ,
109
115
system_account_infos,
110
116
config,
117
+ )
118
+ . unwrap ( ) ;
119
+ let ( address, address_seed) = derive_address (
120
+ & [
121
+ b"escrow" ,
122
+ light_cpi_accounts. fee_payer ( ) . key . to_bytes ( ) . as_ref ( ) ,
123
+ ] ,
124
+ & address_tree_info
125
+ . get_tree_pubkey ( & light_cpi_accounts)
126
+ . map_err ( |_| ErrorCode :: AccountNotEnoughKeys ) ?,
127
+ & crate :: ID ,
111
128
) ;
129
+ msg ! ( "seeds: {:?}" , b"escrow" ) ;
130
+ msg ! ( "seeds: {:?}" , address) ;
131
+ msg ! ( "recipient_bump: {:?}" , recipient_bump) ;
132
+ let recipient = Pubkey :: create_program_address (
133
+ & [ b"escrow" , & address, & [ recipient_bump] ] ,
134
+ ctx. program_id ,
135
+ )
136
+ . unwrap ( ) ;
112
137
deposit_tokens (
113
138
& light_cpi_accounts,
114
139
token_metas,
115
140
output_tree_index,
116
141
mint,
117
142
recipient,
118
143
deposit_amount,
119
- token_account_infos ,
144
+ ctx . remaining_accounts ,
120
145
) ?;
146
+ let new_address_params = address_tree_info. into_new_address_params_packed ( address_seed) ;
147
+
121
148
process_create_compressed_account (
122
149
light_cpi_accounts,
123
150
proof,
124
- address_tree_info,
125
151
output_tree_index,
126
152
deposit_amount,
153
+ address,
154
+ new_address_params,
155
+ )
156
+ }
157
+
158
+ pub fn update_deposit < ' info > (
159
+ ctx : Context < ' _ , ' _ , ' _ , ' info , GenericWithAuthority < ' info > > ,
160
+ proof : LightValidityProof ,
161
+ output_tree_index : u8 ,
162
+ output_tree_queue_index : u8 ,
163
+ deposit_amount : u64 ,
164
+ depositing_token_metas : Vec < TokenAccountMeta > ,
165
+ mint : Pubkey ,
166
+ escrowed_token_meta : TokenAccountMeta ,
167
+ system_accounts_start_offset : u8 ,
168
+ account_meta : CompressedAccountMeta ,
169
+ existing_amount : u64 ,
170
+ recipient_bump : u8 ,
171
+ ) -> Result < ( ) > {
172
+ // It makes sense to parse accounts once.
173
+ let config = CpiAccountsConfig {
174
+ cpi_signer : crate :: LIGHT_CPI_SIGNER ,
175
+ // TODO: add sanity check that account is a cpi context account.
176
+ cpi_context : true ,
177
+ // TODO: add sanity check that account is a sol_pool_pda account.
178
+ sol_pool_pda : false ,
179
+ sol_compression_recipient : false ,
180
+ } ;
181
+ msg ! (
182
+ "crate::LIGHT_CPI_SIGNER, {:?}" ,
183
+ anchor_lang:: prelude:: Pubkey :: new_from_array( crate :: LIGHT_CPI_SIGNER . cpi_signer)
184
+ ) ;
185
+ msg ! (
186
+ "system_accounts_start_offset {}" ,
187
+ system_accounts_start_offset
188
+ ) ;
189
+ let ( token_account_infos, system_account_infos) = ctx
190
+ . remaining_accounts
191
+ . split_at ( system_accounts_start_offset as usize ) ;
192
+ msg ! ( "token_account_infos: {:?}" , token_account_infos) ;
193
+ msg ! ( "system_account_infos: {:?}" , system_account_infos) ;
194
+ // TODO: figure out why the offsets are wrong.
195
+ // Could add with pre account infos Option<u8>
196
+ let light_cpi_accounts = CpiAccounts :: try_new_with_config (
197
+ ctx. accounts . signer . as_ref ( ) ,
198
+ system_account_infos,
199
+ config,
200
+ )
201
+ . unwrap ( ) ;
202
+ msg ! (
203
+ "light_cpi_accounts {:?}" ,
204
+ light_cpi_accounts. authority( ) . unwrap( )
205
+ ) ;
206
+ let recipient = ctx. accounts . authority . key ( ) ;
207
+ deposit_additional_tokens (
208
+ & light_cpi_accounts,
209
+ depositing_token_metas,
210
+ escrowed_token_meta,
211
+ output_tree_index,
212
+ output_tree_queue_index,
213
+ mint,
214
+ recipient,
215
+ recipient_bump,
216
+ deposit_amount,
217
+ account_meta. address ,
218
+ ctx. remaining_accounts ,
219
+ ctx. accounts . authority . to_account_info ( ) ,
220
+ ) ?;
221
+ process_update_escrow_pda (
222
+ light_cpi_accounts,
223
+ account_meta,
224
+ proof,
225
+ existing_amount,
226
+ deposit_amount,
127
227
)
128
228
}
129
229
}
@@ -134,3 +234,11 @@ pub struct Generic<'info> {
134
234
#[ account( mut ) ]
135
235
pub signer : Signer < ' info > ,
136
236
}
237
+
238
+ #[ derive( Accounts ) ]
239
+ pub struct GenericWithAuthority < ' info > {
240
+ // fee payer and authority are the same
241
+ #[ account( mut ) ]
242
+ pub signer : Signer < ' info > ,
243
+ pub authority : AccountInfo < ' info > ,
244
+ }
0 commit comments