@@ -38,8 +38,7 @@ pub const SLOTS_UNTIL_COMPRESSION: u64 = 100;
38
38
/// * `Err(LightSdkError)` if there was an error
39
39
pub fn decompress_idempotent < ' info , A > (
40
40
pda_account : & AccountInfo < ' info > ,
41
- compressed_account_meta : Option < & CompressedAccountMeta > ,
42
- compressed_account_data : & A ,
41
+ mut compressed_account : LightAccount < ' _ , A > ,
43
42
proof : ValidityProof ,
44
43
cpi_accounts : CpiAccounts < ' _ , ' info > ,
45
44
owner_program : & Pubkey ,
63
62
return Ok ( ( ) ) ;
64
63
}
65
64
66
- // we zero out the compressed account.
67
- let mut compressed_account = LightAccount :: < ' _ , A > :: new_mut (
68
- owner_program,
69
- compressed_account_meta. ok_or ( LightSdkError :: ConstraintViolation ) ?,
70
- compressed_account_data. clone ( ) , // TODO: try avoid clone
71
- ) ?;
72
-
73
65
// Get compressed address
74
66
let compressed_address = compressed_account
75
67
. address ( )
@@ -124,23 +116,17 @@ where
124
116
& [ & signer_seeds_refs] ,
125
117
) ?;
126
118
127
- // Serialize the account data
128
- let mut data_bytes = vec ! [ ] ;
129
- compressed_account_data
130
- . serialize ( & mut data_bytes)
131
- . map_err ( |_| LightSdkError :: Borsh ) ?;
132
-
133
- // Initialize PDA with decompressed data
134
- let mut decompressed_pda: A = compressed_account. account ;
119
+ // Initialize PDA with decompressed data and update slot
120
+ let mut decompressed_pda = compressed_account. account . clone ( ) ;
135
121
decompressed_pda. set_last_written_slot ( current_slot) ;
136
-
137
122
// Write data to PDA
138
123
decompressed_pda
139
124
. serialize ( & mut & mut pda_account. try_borrow_mut_data ( ) ?[ 8 ..] )
140
125
. map_err ( |_| LightSdkError :: Borsh ) ?;
141
126
142
- // Zero the compressed account with CPI
127
+ // Zero the compressed account
143
128
compressed_account. account = A :: default ( ) ;
129
+
144
130
let cpi_inputs = CpiInputs :: new ( proof, vec ! [ compressed_account. to_account_info( ) ?] ) ;
145
131
cpi_inputs. invoke_light_system_program ( cpi_accounts) ?;
146
132
@@ -214,14 +200,19 @@ mod tests {
214
200
data : instruction_data. data ,
215
201
} ;
216
202
203
+ let mut compressed_account = LightAccount :: < ' _ , MyPdaAccount > :: new_mut (
204
+ & crate :: ID ,
205
+ & instruction_data. compressed_account_meta . unwrap ( ) ,
206
+ account_data,
207
+ ) ?;
208
+
217
209
// Custom seeds
218
210
let custom_seeds: Vec < & [ u8 ] > = vec ! [ b"decompressed_pda" ] ;
219
211
220
212
// Call decompress_idempotent - this should work whether PDA exists or not
221
213
decompress_idempotent :: < MyPdaAccount > (
222
214
pda_account,
223
- instruction_data. compressed_account_meta . as_ref ( ) ,
224
- & account_data,
215
+ compressed_account,
225
216
instruction_data. proof ,
226
217
cpi_accounts,
227
218
& crate :: ID ,
0 commit comments