@@ -56,17 +56,6 @@ impl<'a> ZCpiContextAccount<'a> {
56
56
&& self . output_data . is_empty ( )
57
57
}
58
58
59
- pub fn clear ( & mut self ) {
60
- self . new_addresses . clear ( ) ;
61
- self . readonly_addresses . clear ( ) ;
62
- self . readonly_accounts . clear ( ) ;
63
- self . in_accounts . clear ( ) ;
64
- self . out_accounts . clear ( ) ;
65
- * self . output_data_len = 0 . into ( ) ;
66
- self . output_data . clear ( ) ;
67
- self . remaining_data . fill ( 0 ) ;
68
- }
69
-
70
59
pub fn store_data <
71
60
' b ,
72
61
T : light_compressed_account:: instruction_data:: traits:: InstructionData < ' b > ,
@@ -185,6 +174,18 @@ impl Discriminator for ZCpiContextAccount<'_> {
185
174
186
175
pub fn deserialize_cpi_context_account < ' a > (
187
176
account_info : & AccountInfo ,
177
+ ) -> std:: result:: Result < ZCpiContextAccount < ' a > , ZeroCopyError > {
178
+ deserialize_cpi_context_account_inner :: < false > ( account_info)
179
+ }
180
+
181
+ pub fn deserialize_cpi_context_account_cleared < ' a > (
182
+ account_info : & AccountInfo ,
183
+ ) -> std:: result:: Result < ZCpiContextAccount < ' a > , ZeroCopyError > {
184
+ deserialize_cpi_context_account_inner :: < true > ( account_info)
185
+ }
186
+
187
+ fn deserialize_cpi_context_account_inner < ' a , const CLEARED : bool > (
188
+ account_info : & AccountInfo ,
188
189
) -> std:: result:: Result < ZCpiContextAccount < ' a > , ZeroCopyError > {
189
190
check_owner ( & ID , account_info) . map_err ( |_| ZeroCopyError :: IterFromOutOfBounds ) ?;
190
191
let mut account_data = account_info
@@ -202,21 +203,34 @@ pub fn deserialize_cpi_context_account<'a>(
202
203
let ( associated_merkle_tree, data) =
203
204
Ref :: < & ' a mut [ u8 ] , light_compressed_account:: pubkey:: Pubkey > :: from_prefix ( data) ?;
204
205
205
- let ( new_addresses, data) =
206
+ let ( mut new_addresses, data) =
206
207
ZeroCopyVecU8 :: < ' a , CpiContextNewAddressParamsAssignedPacked > :: from_bytes_at ( data) ?;
207
- let ( readonly_addresses, data) =
208
+ let ( mut readonly_addresses, data) =
208
209
ZeroCopyVecU8 :: < ' a , ZPackedReadOnlyAddress > :: from_bytes_at ( data) ?;
209
- let ( readonly_accounts, data) =
210
+ let ( mut readonly_accounts, data) =
210
211
ZeroCopyVecU8 :: < ' a , ZPackedReadOnlyCompressedAccount > :: from_bytes_at ( data) ?;
211
- let ( in_accounts, data) = ZeroCopyVecU8 :: < ' a , CpiContextInAccount > :: from_bytes_at ( data) ?;
212
- let ( out_accounts, data) = ZeroCopyVecU8 :: < ' a , CpiContextOutAccount > :: from_bytes_at ( data) ?;
213
- let ( output_data_len, mut data) = Ref :: < & ' a mut [ u8 ] , U16 > :: from_prefix ( data) ?;
214
- let mut output_data = Vec :: with_capacity ( output_data_len. get ( ) as usize ) ;
215
- for _ in 0 ..output_data_len. get ( ) {
216
- let ( output_data_slice, inner_data) = ZeroCopySliceMut :: < U16 , u8 > :: from_bytes_at ( data) ?;
217
- output_data. push ( output_data_slice) ;
218
- data = inner_data;
219
- }
212
+ let ( mut in_accounts, data) = ZeroCopyVecU8 :: < ' a , CpiContextInAccount > :: from_bytes_at ( data) ?;
213
+ let ( mut out_accounts, data) = ZeroCopyVecU8 :: < ' a , CpiContextOutAccount > :: from_bytes_at ( data) ?;
214
+ let ( mut output_data_len, mut data) = Ref :: < & ' a mut [ u8 ] , U16 > :: from_prefix ( data) ?;
215
+ let output_data = if CLEARED {
216
+ new_addresses. clear ( ) ;
217
+ readonly_addresses. clear ( ) ;
218
+ readonly_accounts. clear ( ) ;
219
+ in_accounts. clear ( ) ;
220
+ out_accounts. clear ( ) ;
221
+ output_data_len. set ( 0 ) ;
222
+ // 65 CU
223
+ data. fill ( 0 ) ;
224
+ Vec :: new ( )
225
+ } else {
226
+ let mut output_data = Vec :: with_capacity ( output_data_len. get ( ) as usize ) ;
227
+ for _ in 0 ..output_data_len. get ( ) {
228
+ let ( output_data_slice, inner_data) = ZeroCopySliceMut :: < U16 , u8 > :: from_bytes_at ( data) ?;
229
+ output_data. push ( output_data_slice) ;
230
+ data = inner_data;
231
+ }
232
+ output_data
233
+ } ;
220
234
221
235
Ok ( ZCpiContextAccount {
222
236
fee_payer,
0 commit comments