19
19
state:: {
20
20
config,
21
21
config_read,
22
- price_info ,
23
- price_info_read ,
22
+ price_feed_bucket ,
23
+ price_feed_read_bucket ,
24
24
ConfigInfo ,
25
- PriceInfo ,
26
25
PythDataSource ,
27
26
} ,
28
27
} ,
44
43
QueryRequest ,
45
44
Response ,
46
45
StdResult ,
47
- Timestamp ,
48
46
WasmMsg ,
49
47
WasmQuery ,
50
48
} ,
@@ -93,12 +91,11 @@ pub fn migrate(_deps: DepsMut, _env: Env, _msg: MigrateMsg) -> StdResult<Respons
93
91
pub fn instantiate (
94
92
deps : DepsMut ,
95
93
_env : Env ,
96
- info : MessageInfo ,
94
+ _info : MessageInfo ,
97
95
msg : InstantiateMsg ,
98
96
) -> StdResult < Response > {
99
97
// Save general wormhole and pyth info
100
98
let state = ConfigInfo {
101
- owner : info. sender ,
102
99
wormhole_contract : deps. api . addr_validate ( msg. wormhole_contract . as_ref ( ) ) ?,
103
100
data_sources : msg. data_sources . iter ( ) . cloned ( ) . collect ( ) ,
104
101
chain_id : msg. chain_id ,
@@ -385,9 +382,7 @@ fn process_batch_attestation(
385
382
for price_attestation in batch_attestation. price_attestations . iter ( ) {
386
383
let price_feed = create_price_feed_from_price_attestation ( price_attestation) ;
387
384
388
- let attestation_time = Timestamp :: from_seconds ( price_attestation. attestation_time as u64 ) ;
389
-
390
- if update_price_feed_if_new ( deps, env, price_feed, attestation_time) ? {
385
+ if update_price_feed_if_new ( deps, env, price_feed) ? {
391
386
new_attestations_cnt += 1 ;
392
387
}
393
388
}
@@ -440,37 +435,28 @@ fn create_price_feed_from_price_attestation(price_attestation: &PriceAttestation
440
435
/// in the bucket won't be parsed.
441
436
fn update_price_feed_if_new (
442
437
deps : & mut DepsMut ,
443
- env : & Env ,
444
- price_feed : PriceFeed ,
445
- attestation_time : Timestamp ,
438
+ _env : & Env ,
439
+ new_price_feed : PriceFeed ,
446
440
) -> StdResult < bool > {
447
441
let mut is_new_price = true ;
448
- price_info ( deps. storage ) . update (
449
- price_feed . id . as_ref ( ) ,
450
- |maybe_price_info | -> StdResult < PriceInfo > {
451
- match maybe_price_info {
452
- Some ( price_info ) => {
442
+ price_feed_bucket ( deps. storage ) . update (
443
+ new_price_feed . id . as_ref ( ) ,
444
+ |maybe_price_feed | -> StdResult < PriceFeed > {
445
+ match maybe_price_feed {
446
+ Some ( price_feed ) => {
453
447
// This check ensures that a price won't be updated with the same or older
454
- // message. Attestation_time is guaranteed increasing in
448
+ // message. Publish_TIme is guaranteed increasing in
455
449
// solana
456
- if price_info. attestation_time < attestation_time {
457
- Ok ( PriceInfo {
458
- arrival_time : env. block . time ,
459
- arrival_block : env. block . height ,
460
- price_feed,
461
- attestation_time,
462
- } )
450
+ if price_feed. get_price_unchecked ( ) . publish_time
451
+ < new_price_feed. get_price_unchecked ( ) . publish_time
452
+ {
453
+ Ok ( new_price_feed)
463
454
} else {
464
455
is_new_price = false ;
465
- Ok ( price_info )
456
+ Ok ( price_feed )
466
457
}
467
458
}
468
- None => Ok ( PriceInfo {
469
- arrival_time : env. block . time ,
470
- arrival_block : env. block . height ,
471
- price_feed,
472
- attestation_time,
473
- } ) ,
459
+ None => Ok ( new_price_feed) ,
474
460
}
475
461
} ,
476
462
) ?;
@@ -488,10 +474,8 @@ pub fn query(deps: Deps, _env: Env, msg: QueryMsg) -> StdResult<Binary> {
488
474
489
475
/// Get the most recent value of the price feed indicated by `feed_id`.
490
476
pub fn query_price_feed ( deps : & Deps , feed_id : & [ u8 ] ) -> StdResult < PriceFeedResponse > {
491
- match price_info_read ( deps. storage ) . load ( feed_id) {
492
- Ok ( price_info) => Ok ( PriceFeedResponse {
493
- price_feed : price_info. price_feed ,
494
- } ) ,
477
+ match price_feed_read_bucket ( deps. storage ) . load ( feed_id) {
478
+ Ok ( price_feed) => Ok ( PriceFeedResponse { price_feed } ) ,
495
479
Err ( _) => Err ( PythContractError :: PriceFeedNotFound ) ?,
496
480
}
497
481
}
@@ -547,6 +531,7 @@ mod test {
547
531
SystemResult ,
548
532
Uint128 ,
549
533
} ,
534
+ pyth_sdk:: UnixTimestamp ,
550
535
pyth_sdk_cw:: PriceIdentifier ,
551
536
pyth_wormhole_attester_sdk:: PriceAttestation ,
552
537
std:: time:: Duration ,
@@ -656,7 +641,6 @@ mod test {
656
641
657
642
fn create_zero_config_info ( ) -> ConfigInfo {
658
643
ConfigInfo {
659
- owner : Addr :: unchecked ( String :: default ( ) ) ,
660
644
wormhole_contract : Addr :: unchecked ( String :: default ( ) ) ,
661
645
data_sources : HashSet :: default ( ) ,
662
646
governance_source : PythDataSource {
@@ -671,11 +655,12 @@ mod test {
671
655
}
672
656
}
673
657
674
- fn create_price_feed ( expo : i32 ) -> PriceFeed {
658
+ fn create_price_feed ( expo : i32 , publish_time : UnixTimestamp ) -> PriceFeed {
675
659
PriceFeed :: new (
676
660
PriceIdentifier :: new ( [ 0u8 ; 32 ] ) ,
677
661
Price {
678
662
expo,
663
+ publish_time,
679
664
..Default :: default ( )
680
665
} ,
681
666
Price {
@@ -695,21 +680,10 @@ mod test {
695
680
} ] )
696
681
}
697
682
698
- /// Updates the price feed with the given attestation time stamp and
683
+ /// Updates the price feed with the given publish time stamp and
699
684
/// returns the update status (true means updated, false means ignored)
700
- fn do_update_price_feed (
701
- deps : & mut DepsMut ,
702
- env : & Env ,
703
- price_feed : PriceFeed ,
704
- attestation_time_seconds : u64 ,
705
- ) -> bool {
706
- update_price_feed_if_new (
707
- deps,
708
- env,
709
- price_feed,
710
- Timestamp :: from_seconds ( attestation_time_seconds) ,
711
- )
712
- . unwrap ( )
685
+ fn do_update_price_feed ( deps : & mut DepsMut , env : & Env , price_feed : PriceFeed ) -> bool {
686
+ update_price_feed_if_new ( deps, env, price_feed) . unwrap ( )
713
687
}
714
688
715
689
fn apply_price_update (
@@ -854,10 +828,9 @@ mod test {
854
828
process_batch_attestation ( & mut deps. as_mut ( ) , & env, & attestations) . unwrap ( ) ;
855
829
856
830
857
- let stored_price_feed = price_info_read ( & deps. storage )
831
+ let stored_price_feed = price_feed_read_bucket ( & deps. storage )
858
832
. load ( & [ 0u8 ; 32 ] )
859
- . unwrap ( )
860
- . price_feed ;
833
+ . unwrap ( ) ;
861
834
let price = stored_price_feed. get_price_unchecked ( ) ;
862
835
let ema_price = stored_price_feed. get_ema_price_unchecked ( ) ;
863
836
@@ -907,10 +880,9 @@ mod test {
907
880
process_batch_attestation ( & mut deps. as_mut ( ) , & env, & attestations) . unwrap ( ) ;
908
881
909
882
910
- let stored_price_feed = price_info_read ( & deps. storage )
883
+ let stored_price_feed = price_feed_read_bucket ( & deps. storage )
911
884
. load ( & [ 0u8 ; 32 ] )
912
- . unwrap ( )
913
- . price_feed ;
885
+ . unwrap ( ) ;
914
886
let price = stored_price_feed. get_price_unchecked ( ) ;
915
887
let ema_price = stored_price_feed. get_ema_price_unchecked ( ) ;
916
888
@@ -1005,74 +977,69 @@ mod test {
1005
977
#[ test]
1006
978
fn test_update_price_feed_if_new_first_price_ok ( ) {
1007
979
let ( mut deps, env) = setup_test ( ) ;
1008
- let price_feed = create_price_feed ( 3 ) ;
980
+ let price_feed = create_price_feed ( 3 , 100 ) ;
1009
981
1010
- let changed = do_update_price_feed ( & mut deps. as_mut ( ) , & env, price_feed, 100 ) ;
982
+ let changed = do_update_price_feed ( & mut deps. as_mut ( ) , & env, price_feed) ;
1011
983
assert ! ( changed) ;
1012
984
1013
- let stored_price_feed = price_info ( & mut deps. storage )
985
+ let stored_price_feed = price_feed_bucket ( & mut deps. storage )
1014
986
. load ( price_feed. id . as_ref ( ) )
1015
- . unwrap ( )
1016
- . price_feed ;
987
+ . unwrap ( ) ;
1017
988
1018
989
assert_eq ! ( stored_price_feed, price_feed) ;
1019
990
}
1020
991
1021
992
#[ test]
1022
993
fn test_update_price_feed_if_new_ignore_duplicate_time ( ) {
1023
994
let ( mut deps, env) = setup_test ( ) ;
1024
- let time = 100 ;
1025
995
1026
- let first_price_feed = create_price_feed ( 3 ) ;
1027
- let changed = do_update_price_feed ( & mut deps. as_mut ( ) , & env, first_price_feed, time ) ;
996
+ let first_price_feed = create_price_feed ( 3 , 100 ) ;
997
+ let changed = do_update_price_feed ( & mut deps. as_mut ( ) , & env, first_price_feed) ;
1028
998
assert ! ( changed) ;
1029
999
1030
- let second_price_feed = create_price_feed ( 4 ) ;
1031
- let changed = do_update_price_feed ( & mut deps. as_mut ( ) , & env, second_price_feed, time ) ;
1000
+ let second_price_feed = create_price_feed ( 4 , 100 ) ;
1001
+ let changed = do_update_price_feed ( & mut deps. as_mut ( ) , & env, second_price_feed) ;
1032
1002
assert ! ( !changed) ;
1033
1003
1034
- let stored_price_feed = price_info ( & mut deps. storage )
1004
+ let stored_price_feed = price_feed_bucket ( & mut deps. storage )
1035
1005
. load ( first_price_feed. id . as_ref ( ) )
1036
- . unwrap ( )
1037
- . price_feed ;
1006
+ . unwrap ( ) ;
1038
1007
assert_eq ! ( stored_price_feed, first_price_feed) ;
1039
1008
}
1040
1009
1041
1010
#[ test]
1042
1011
fn test_update_price_feed_if_new_ignore_older ( ) {
1043
1012
let ( mut deps, env) = setup_test ( ) ;
1044
1013
1045
- let first_price_feed = create_price_feed ( 3 ) ;
1046
- let changed = do_update_price_feed ( & mut deps. as_mut ( ) , & env, first_price_feed, 100 ) ;
1014
+ let first_price_feed = create_price_feed ( 3 , 100 ) ;
1015
+ let changed = do_update_price_feed ( & mut deps. as_mut ( ) , & env, first_price_feed) ;
1047
1016
assert ! ( changed) ;
1048
1017
1049
- let second_price_feed = create_price_feed ( 4 ) ;
1050
- let changed = do_update_price_feed ( & mut deps. as_mut ( ) , & env, second_price_feed, 90 ) ;
1018
+ let second_price_feed = create_price_feed ( 4 , 90 ) ;
1019
+ let changed = do_update_price_feed ( & mut deps. as_mut ( ) , & env, second_price_feed) ;
1051
1020
assert ! ( !changed) ;
1052
1021
1053
- let stored_price_feed = price_info ( & mut deps. storage )
1022
+ let stored_price_feed = price_feed_bucket ( & mut deps. storage )
1054
1023
. load ( first_price_feed. id . as_ref ( ) )
1055
- . unwrap ( )
1056
- . price_feed ;
1024
+ . unwrap ( ) ;
1057
1025
assert_eq ! ( stored_price_feed, first_price_feed) ;
1058
1026
}
1059
1027
1060
1028
#[ test]
1061
1029
fn test_update_price_feed_if_new_accept_newer ( ) {
1062
1030
let ( mut deps, env) = setup_test ( ) ;
1063
1031
1064
- let first_price_feed = create_price_feed ( 3 ) ;
1065
- let changed = do_update_price_feed ( & mut deps. as_mut ( ) , & env, first_price_feed, 100 ) ;
1032
+ let first_price_feed = create_price_feed ( 3 , 100 ) ;
1033
+ let changed = do_update_price_feed ( & mut deps. as_mut ( ) , & env, first_price_feed) ;
1066
1034
assert ! ( changed) ;
1067
1035
1068
- let second_price_feed = create_price_feed ( 4 ) ;
1069
- let changed = do_update_price_feed ( & mut deps. as_mut ( ) , & env, second_price_feed, 110 ) ;
1036
+ let second_price_feed = create_price_feed ( 4 , 110 ) ;
1037
+ let changed = do_update_price_feed ( & mut deps. as_mut ( ) , & env, second_price_feed) ;
1070
1038
assert ! ( changed) ;
1071
1039
1072
- let stored_price_feed = price_info ( & mut deps. storage )
1040
+ let stored_price_feed = price_feed_bucket ( & mut deps. storage )
1073
1041
. load ( first_price_feed. id . as_ref ( ) )
1074
- . unwrap ( )
1075
- . price_feed ;
1042
+ . unwrap ( ) ;
1076
1043
assert_eq ! ( stored_price_feed, second_price_feed) ;
1077
1044
}
1078
1045
@@ -1082,24 +1049,20 @@ mod test {
1082
1049
1083
1050
let address = b"123" . as_ref ( ) ;
1084
1051
1085
- let dummy_price_info = PriceInfo {
1086
- price_feed : PriceFeed :: new (
1087
- PriceIdentifier :: new ( [ 0u8 ; 32 ] ) ,
1088
- Price {
1089
- price : 300 ,
1090
- conf : 301 ,
1091
- expo : 302 ,
1092
- publish_time : 303 ,
1093
- } ,
1094
- Price {
1095
- ..Default :: default ( )
1096
- } ,
1097
- ) ,
1098
- ..Default :: default ( )
1099
- } ;
1100
-
1101
- price_info ( & mut deps. storage )
1102
- . save ( address, & dummy_price_info)
1052
+ let dummy_price_feed = PriceFeed :: new (
1053
+ PriceIdentifier :: new ( [ 0u8 ; 32 ] ) ,
1054
+ Price {
1055
+ price : 300 ,
1056
+ conf : 301 ,
1057
+ expo : 302 ,
1058
+ publish_time : 303 ,
1059
+ } ,
1060
+ Price {
1061
+ ..Default :: default ( )
1062
+ } ,
1063
+ ) ;
1064
+ price_feed_bucket ( & mut deps. storage )
1065
+ . save ( address, & dummy_price_feed)
1103
1066
. unwrap ( ) ;
1104
1067
1105
1068
let price_feed = query_price_feed ( & deps. as_ref ( ) , address)
0 commit comments