@@ -68,7 +68,7 @@ pub fn process_update_escrow_pda(
68
68
}
69
69
70
70
pub fn deposit_additional_tokens < ' info > (
71
- cpi_accounts : & CpiAccounts < ' _ , ' info > ,
71
+ cpi_accounts : CpiAccounts < ' _ , ' info > ,
72
72
depositing_token_metas : Vec < TokenAccountMeta > ,
73
73
escrowed_token_meta : TokenAccountMeta ,
74
74
output_tree_index : u8 ,
@@ -80,15 +80,22 @@ pub fn deposit_additional_tokens<'info>(
80
80
address : [ u8 ; 32 ] ,
81
81
remaining_accounts : & [ AccountInfo < ' info > ] ,
82
82
authority : AccountInfo < ' info > ,
83
+ existing_amount : u64 ,
84
+ account_meta : CompressedAccountMeta ,
85
+ proof : ValidityProof ,
83
86
) -> Result < ( ) > {
84
- let tree_pubkeys = cpi_accounts. tree_pubkeys ( ) . unwrap ( ) ;
85
- msg ! ( "tree_pubkeys: {:?}" , tree_pubkeys) ;
86
- msg ! ( "output_tree_queue_index {:?}" , output_tree_queue_index) ;
87
- msg ! ( "output_tree_index {:?}" , output_tree_index) ;
88
87
// We want to keep only one escrow compressed token account
89
88
// But ctoken transfers can only have one signer -> we cannot from 2 signers at the same time
90
89
// 1. transfer depositing token to recipient pda -> escrow token account 2
91
- // 2. merge escrow token account 2 into escrow token account
90
+ // 2. update escrow pda balance
91
+ // 3. merge escrow token account 2 into escrow token account
92
+ // Note:
93
+ // - if the escrow pda only stores the amount and the owner we can omit the escrow pda.
94
+ // - the escrowed token accounts are owned by a pda derived from the owner
95
+ // that is sufficient to verify ownership.
96
+ // - no escrow pda will simplify the transaction, for no cpi context account is required
97
+
98
+ // 1.transfer depositing token to recipient pda -> escrow token account 2
92
99
let escrow_token_account_meta_2 = {
93
100
let sender_account = CTokenAccount :: new (
94
101
mint,
@@ -104,9 +111,9 @@ pub fn deposit_additional_tokens<'info>(
104
111
)
105
112
. unwrap ( ) ;
106
113
// SAFETY: state trees are height 32
107
- let leaf_index = output_queue. batch_metadata . next_index as u32 ;
114
+ let leaf_index = output_queue. batch_metadata . next_index as u32 + 1 ;
108
115
109
- let new_input = TokenAccountMeta {
116
+ let escrow_token_account_meta_2 = TokenAccountMeta {
110
117
amount,
111
118
delegate_index : None ,
112
119
lamports : None ,
@@ -126,7 +133,6 @@ pub fn deposit_additional_tokens<'info>(
126
133
. iter ( )
127
134
. map ( |x| x. pubkey ( ) )
128
135
. collect :: < Vec < Pubkey > > ( ) ;
129
- msg ! ( "tree_pubkeys {:?}" , tree_pubkeys) ;
130
136
let cpi_context_pubkey = * cpi_accounts. cpi_context ( ) . unwrap ( ) . key ;
131
137
let transfer_inputs = TransferInputs {
132
138
fee_payer : * cpi_accounts. fee_payer ( ) . key ,
@@ -166,41 +172,55 @@ pub fn deposit_additional_tokens<'info>(
166
172
& [ & seeds] ,
167
173
) ?;
168
174
sol_log_compute_units ( ) ;
169
- new_input
175
+ escrow_token_account_meta_2
170
176
} ;
177
+ let tree_account_infos = cpi_accounts. tree_accounts ( ) . unwrap ( ) [ 1 ..] . to_vec ( ) ;
178
+ let fee_payer = cpi_accounts. fee_payer ( ) . clone ( ) ;
179
+
180
+ // 2. Update escrow pda balance
181
+ // - settle tx 1 in the same instruction with the cpi context account
182
+ process_update_escrow_pda ( cpi_accounts, account_meta, proof, existing_amount, amount) ?;
171
183
184
+ // 3. Merge the newly escrowed tokens into the existing escrow account.
172
185
{
173
- msg ! ( "recipient {}" , recipient) ;
174
- msg ! ( "escrowed_token_meta {:?}" , escrowed_token_meta) ;
186
+ // We remove the cpi context account -> we decrement all packed account indices by 1.
187
+ let mut output_tree_queue_index = output_tree_queue_index;
188
+ output_tree_queue_index -= 1 ;
189
+ let mut escrowed_token_meta = escrowed_token_meta;
190
+ escrowed_token_meta
191
+ . packed_tree_info
192
+ . merkle_tree_pubkey_index -= 1 ;
193
+ escrowed_token_meta. packed_tree_info . queue_pubkey_index -= 1 ;
194
+ let mut escrow_token_account_meta_2 = escrow_token_account_meta_2;
195
+ escrow_token_account_meta_2
196
+ . packed_tree_info
197
+ . merkle_tree_pubkey_index -= 1 ;
198
+ escrow_token_account_meta_2
199
+ . packed_tree_info
200
+ . queue_pubkey_index -= 1 ;
175
201
let escrow_account = CTokenAccount :: new (
176
202
mint,
177
203
recipient,
178
204
vec ! [ escrowed_token_meta, escrow_token_account_meta_2] ,
179
205
output_tree_queue_index,
180
206
) ;
207
+
181
208
let total_escrowed_amount = escrow_account. amount ;
182
209
183
- let tree_account_infos = cpi_accounts. tree_accounts ( ) . unwrap ( ) ;
184
- let tree_account_infos = & tree_account_infos[ 1 ..] ;
185
210
let tree_pubkeys = tree_account_infos
186
211
. iter ( )
187
212
. map ( |x| x. pubkey ( ) )
188
213
. collect :: < Vec < Pubkey > > ( ) ;
189
- let cpi_context_pubkey = * cpi_accounts. cpi_context ( ) . unwrap ( ) . key ;
190
214
let transfer_inputs = TransferInputs {
191
- fee_payer : * cpi_accounts . fee_payer ( ) . key ,
215
+ fee_payer : * fee_payer. key ,
192
216
sender_account : escrow_account,
193
217
// No validity proof necessary we are just storing state in the cpi context.
194
218
validity_proof : None . into ( ) ,
195
219
recipient,
196
220
tree_pubkeys,
197
221
config : Some ( TransferConfig {
198
- cpi_context : Some ( CompressedCpiContext {
199
- set_context : true ,
200
- first_set_context : true ,
201
- cpi_context_account_index : 0 , // TODO: replace with Pubkey (maybe not because it is in tree pubkeys 1 in this case)
202
- } ) ,
203
- cpi_context_pubkey : Some ( cpi_context_pubkey) ,
222
+ cpi_context : None ,
223
+ cpi_context_pubkey : None ,
204
224
..Default :: default ( )
205
225
} ) ,
206
226
amount : total_escrowed_amount,
@@ -211,16 +231,8 @@ pub fn deposit_additional_tokens<'info>(
211
231
)
212
232
. unwrap ( ) ;
213
233
214
- let account_infos = [
215
- & [ cpi_accounts. fee_payer ( ) . clone ( ) , authority] [ ..] ,
216
- remaining_accounts,
217
- ]
218
- . concat ( ) ;
219
- sol_log_compute_units ( ) ;
234
+ let account_infos = [ & [ fee_payer, authority] [ ..] , remaining_accounts] . concat ( ) ;
220
235
221
- sol_log_compute_units ( ) ;
222
- msg ! ( "invoke" ) ;
223
- sol_log_compute_units ( ) ;
224
236
let seeds = [ & b"escrow" [ ..] , & address, & [ recipient_bump] ] ;
225
237
anchor_lang:: solana_program:: program:: invoke_signed (
226
238
& instruction,
0 commit comments