1
1
use anchor_lang:: prelude:: * ;
2
2
use light_sdk:: {
3
- compressible:: { CompressibleConfig , CompressionTiming } ,
3
+ compressible:: { CompressibleConfig , CompressionInfo , HasCompressionInfo } ,
4
4
cpi:: CpiAccounts ,
5
5
instruction:: { account_meta:: CompressedAccountMeta , PackedAddressTreeInfo , ValidityProof } ,
6
6
light_hasher:: { DataHasher , Hasher } ,
@@ -42,8 +42,9 @@ pub mod anchor_compressible_user {
42
42
user_record. owner = ctx. accounts . user . key ( ) ;
43
43
user_record. name = name;
44
44
user_record. score = 0 ;
45
- user_record. last_written_slot = Clock :: get ( ) ?. slot ;
46
- user_record. compression_delay = config. compression_delay as u64 ;
45
+ // Initialize compression info with current slot
46
+ user_record. compression_info = CompressionInfo :: new ( )
47
+ . map_err ( |_| anchor_lang:: error:: ErrorCode :: AccountDidNotDeserialize ) ?;
47
48
48
49
// Verify rent recipient matches config
49
50
if ctx. accounts . rent_recipient . key ( ) != config. rent_recipient {
@@ -88,7 +89,9 @@ pub mod anchor_compressible_user {
88
89
user_record. owner = ctx. accounts . user . key ( ) ;
89
90
user_record. name = name;
90
91
user_record. score = 0 ;
91
- user_record. compression_delay = COMPRESSION_DELAY ;
92
+ // Initialize compression info with current slot
93
+ user_record. compression_info = CompressionInfo :: new ( )
94
+ . map_err ( |_| anchor_lang:: error:: ErrorCode :: AccountDidNotDeserialize ) ?;
92
95
93
96
let cpi_accounts = CpiAccounts :: new (
94
97
& ctx. accounts . user ,
@@ -243,7 +246,7 @@ pub mod anchor_compressible_user {
243
246
cpi_accounts,
244
247
& crate :: ID ,
245
248
& ctx. accounts . rent_recipient ,
246
- COMPRESSION_DELAY , // Use the hardcoded value for legacy function
249
+ & COMPRESSION_DELAY as u32 , // Use the hardcoded value for legacy function
247
250
)
248
251
. map_err ( |e| anchor_lang:: prelude:: ProgramError :: from ( e) ) ?;
249
252
Ok ( ( ) )
@@ -278,7 +281,7 @@ pub mod anchor_compressible_user {
278
281
cpi_accounts,
279
282
& crate :: ID ,
280
283
& ctx. accounts . rent_recipient ,
281
- config. compression_delay as u64 ,
284
+ & config. compression_delay ,
282
285
)
283
286
. map_err ( |e| anchor_lang:: prelude:: ProgramError :: from ( e) ) ?;
284
287
Ok ( ( ) )
@@ -292,7 +295,7 @@ pub struct CreateRecordWithConfig<'info> {
292
295
#[ account(
293
296
init,
294
297
payer = user,
295
- space = 8 + 32 + 4 + 32 + 8 + 8 + 8 , // discriminator + owner + string len + name + score + last_written_slot + compression_delay
298
+ space = 8 + 32 + 4 + 32 + 8 + 9 , // discriminator + owner + string len + name + score + compression_info
296
299
seeds = [ b"user_record" , user. key( ) . as_ref( ) ] ,
297
300
bump,
298
301
) ]
@@ -311,7 +314,7 @@ pub struct CreateRecord<'info> {
311
314
#[ account(
312
315
init,
313
316
payer = user,
314
- space = 8 + 32 + 4 + 32 + 8 , // discriminator + owner + string len + name + score
317
+ space = 8 + 32 + 4 + 32 + 8 + 9 , // discriminator + owner + string len + name + score + compression_info
315
318
seeds = [ b"user_record" , user. key( ) . as_ref( ) ] ,
316
319
bump,
317
320
) ]
@@ -407,25 +410,18 @@ impl LightDiscriminator for CompressedAccountVariant {
407
410
const LIGHT_DISCRIMINATOR_SLICE : & ' static [ u8 ] = & Self :: LIGHT_DISCRIMINATOR ;
408
411
}
409
412
410
- impl CompressionTiming for CompressedAccountVariant {
411
- fn last_written_slot ( & self ) -> u64 {
412
- match self {
413
- Self :: UserRecord ( data) => data. last_written_slot ( ) ,
414
- Self :: GameSession ( data) => data. last_written_slot ( ) ,
415
- }
416
- }
417
-
418
- fn compression_delay ( & self ) -> u64 {
413
+ impl HasCompressionInfo for CompressedAccountVariant {
414
+ fn compression_info ( & self ) -> & CompressionInfo {
419
415
match self {
420
- Self :: UserRecord ( data) => data. compression_delay ( ) ,
421
- Self :: GameSession ( data) => data. compression_delay ( ) ,
416
+ Self :: UserRecord ( data) => data. compression_info ( ) ,
417
+ Self :: GameSession ( data) => data. compression_info ( ) ,
422
418
}
423
419
}
424
420
425
- fn set_last_written_slot ( & mut self , slot : u64 ) {
421
+ fn compression_info_mut ( & mut self ) -> & mut CompressionInfo {
426
422
match self {
427
- Self :: UserRecord ( data) => data. set_last_written_slot ( slot ) ,
428
- Self :: GameSession ( data) => data. set_last_written_slot ( slot ) ,
423
+ Self :: UserRecord ( data) => data. compression_info_mut ( ) ,
424
+ Self :: GameSession ( data) => data. compression_info_mut ( ) ,
429
425
}
430
426
}
431
427
}
@@ -440,53 +436,45 @@ pub struct CompressedAccountData {
440
436
#[ derive( Default , Debug , LightHasher , LightDiscriminator ) ]
441
437
#[ account]
442
438
pub struct UserRecord {
439
+ #[ skip]
440
+ pub compression_info : CompressionInfo ,
443
441
#[ hash]
444
442
pub owner : Pubkey ,
445
443
pub name : String ,
446
444
pub score : u64 ,
447
- pub last_written_slot : u64 ,
448
- pub compression_delay : u64 ,
449
445
}
450
446
451
- impl CompressionTiming for UserRecord {
452
- fn last_written_slot ( & self ) -> u64 {
453
- self . last_written_slot
454
- }
455
-
456
- fn compression_delay ( & self ) -> u64 {
457
- self . compression_delay
447
+ impl HasCompressionInfo for UserRecord {
448
+ fn compression_info ( & self ) -> & CompressionInfo {
449
+ & self . compression_info
458
450
}
459
451
460
- fn set_last_written_slot ( & mut self , slot : u64 ) {
461
- self . last_written_slot = slot ;
452
+ fn compression_info_mut ( & mut self ) -> & mut CompressionInfo {
453
+ & mut self . compression_info
462
454
}
463
455
}
464
456
465
457
#[ derive( Default , Debug , LightHasher , LightDiscriminator ) ]
466
458
#[ account]
467
459
pub struct GameSession {
460
+ #[ skip]
461
+ pub compression_info : CompressionInfo ,
468
462
pub session_id : u64 ,
469
463
#[ hash]
470
464
pub player : Pubkey ,
471
465
pub game_type : String ,
472
466
pub start_time : u64 ,
473
467
pub end_time : Option < u64 > ,
474
468
pub score : u64 ,
475
- pub last_written_slot : u64 ,
476
- pub compression_delay : u64 ,
477
469
}
478
470
479
- impl CompressionTiming for GameSession {
480
- fn last_written_slot ( & self ) -> u64 {
481
- self . last_written_slot
482
- }
483
-
484
- fn compression_delay ( & self ) -> u64 {
485
- self . compression_delay
471
+ impl HasCompressionInfo for GameSession {
472
+ fn compression_info ( & self ) -> & CompressionInfo {
473
+ & self . compression_info
486
474
}
487
475
488
- fn set_last_written_slot ( & mut self , slot : u64 ) {
489
- self . last_written_slot = slot ;
476
+ fn compression_info_mut ( & mut self ) -> & mut CompressionInfo {
477
+ & mut self . compression_info
490
478
}
491
479
}
492
480
0 commit comments