@@ -63,13 +63,13 @@ where
63
63
Coins : Ord ,
64
64
Epoch : Default ,
65
65
{
66
- /// A listing of all the stakers , indexed by their address .
66
+ /// A listing of all the stake entries , indexed by their stake key .
67
67
by_key : BTreeMap < StakeKey < Address > , SyncStake < Address , Coins , Epoch , Power > > ,
68
- /// A listing of all the stakers , indexed by validator.
69
- by_validator : BTreeMap < Address , SyncStake < Address , Coins , Epoch , Power > > ,
70
- /// A listing of all the stakers , indexed by withdrawer.
71
- by_withdrawer : BTreeMap < Address , SyncStake < Address , Coins , Epoch , Power > > ,
72
- /// A listing of all the stakers , indexed by their coins and address.
68
+ /// A listing of all the stake entries , indexed by validator.
69
+ by_validator : BTreeMap < Address , Vec < SyncStake < Address , Coins , Epoch , Power > > > ,
70
+ /// A listing of all the stake entries , indexed by withdrawer.
71
+ by_withdrawer : BTreeMap < Address , Vec < SyncStake < Address , Coins , Epoch , Power > > > ,
72
+ /// A listing of all the stake entries , indexed by their coins and address.
73
73
///
74
74
/// Because this uses a compound key to prevent duplicates, if we want to know which addresses
75
75
/// have staked a particular amount, we just need to run a range lookup on the tree.
@@ -146,11 +146,12 @@ where
146
146
147
147
let validator_key = coins_and_addresses. clone ( ) . addresses . validator ;
148
148
self . by_validator . remove ( & validator_key) ;
149
- self . by_validator . insert ( validator_key, stake. clone ( ) ) ;
149
+ self . by_validator . insert ( validator_key, vec ! [ stake. clone( ) ] ) ;
150
150
151
151
let withdrawer_key = coins_and_addresses. addresses . withdrawer ;
152
152
self . by_withdrawer . remove ( & withdrawer_key) ;
153
- self . by_withdrawer . insert ( withdrawer_key, stake. clone ( ) ) ;
153
+ self . by_withdrawer
154
+ . insert ( withdrawer_key, vec ! [ stake. clone( ) ] ) ;
154
155
155
156
Ok ( stake. value . read ( ) ?. clone ( ) )
156
157
}
@@ -308,12 +309,12 @@ where
308
309
pub fn query_stakes < TIQSK > (
309
310
& mut self ,
310
311
query : TIQSK ,
311
- ) -> StakesResult < Coins , Address , Coins , Epoch >
312
+ ) -> StakesResult < Vec < Stake < Address , Coins , Epoch , Power > > , Address , Coins , Epoch >
312
313
where
313
314
TIQSK : TryInto < QueryStakesKey < Address > > ,
314
315
{
315
316
match query. try_into ( ) {
316
- Ok ( QueryStakesKey :: Key ( key) ) => self . query_by_key ( key) ,
317
+ Ok ( QueryStakesKey :: Key ( key) ) => self . query_by_key ( key) . map ( |stake| vec ! [ stake ] ) ,
317
318
Ok ( QueryStakesKey :: Validator ( validator) ) => self . query_by_validator ( validator) ,
318
319
Ok ( QueryStakesKey :: Withdrawer ( withdrawer) ) => self . query_by_withdrawer ( withdrawer) ,
319
320
Err ( _) => Err ( StakesError :: EmptyQuery ) ,
@@ -322,41 +323,47 @@ where
322
323
323
324
/// Query stakes by stake key.
324
325
#[ inline( always) ]
325
- fn query_by_key ( & self , key : StakeKey < Address > ) -> StakesResult < Coins , Address , Coins , Epoch > {
326
+ fn query_by_key (
327
+ & self ,
328
+ key : StakeKey < Address > ,
329
+ ) -> StakesResult < Stake < Address , Coins , Epoch , Power > , Address , Coins , Epoch > {
326
330
Ok ( self
327
331
. by_key
328
332
. get ( & key)
329
333
. ok_or ( StakesError :: EntryNotFound { key } ) ?
330
334
. value
331
335
. read ( ) ?
332
- . coins )
336
+ . clone ( ) )
333
337
}
334
338
335
339
/// Query stakes by validator address.
336
340
#[ inline( always) ]
337
- fn query_by_validator ( & self , validator : Address ) -> StakesResult < Coins , Address , Coins , Epoch > {
341
+ fn query_by_validator (
342
+ & self ,
343
+ validator : Address ,
344
+ ) -> StakesResult < Vec < Stake < Address , Coins , Epoch , Power > > , Address , Coins , Epoch > {
338
345
Ok ( self
339
346
. by_validator
340
347
. get ( & validator)
341
348
. ok_or ( StakesError :: ValidatorNotFound { validator } ) ?
342
- . value
343
- . read ( ) ?
344
- . coins )
349
+ . iter ( )
350
+ . map ( |stake| stake . value . read ( ) . unwrap ( ) . clone ( ) )
351
+ . collect ( ) )
345
352
}
346
353
347
354
/// Query stakes by withdrawer address.
348
355
#[ inline( always) ]
349
356
fn query_by_withdrawer (
350
357
& self ,
351
358
withdrawer : Address ,
352
- ) -> StakesResult < Coins , Address , Coins , Epoch > {
359
+ ) -> StakesResult < Vec < Stake < Address , Coins , Epoch , Power > > , Address , Coins , Epoch > {
353
360
Ok ( self
354
361
. by_withdrawer
355
362
. get ( & withdrawer)
356
363
. ok_or ( StakesError :: WithdrawerNotFound { withdrawer } ) ?
357
- . value
358
- . read ( ) ?
359
- . coins )
364
+ . iter ( )
365
+ . map ( |stake| stake . value . read ( ) . unwrap ( ) . clone ( ) )
366
+ . collect ( ) )
360
367
}
361
368
}
362
369
@@ -753,11 +760,59 @@ mod tests {
753
760
let charlie_erin = ( charlie, erin) ;
754
761
755
762
stakes. add_stake ( alice_charlie, 10 , 0 ) . unwrap ( ) ;
756
- stakes. add_stake ( bob_david, 20 , 20 ) . unwrap ( ) ;
757
- stakes. add_stake ( charlie_erin, 30 , 30 ) . unwrap ( ) ;
763
+ stakes. add_stake ( bob_david, 20 , 30 ) . unwrap ( ) ;
764
+ stakes. add_stake ( charlie_erin, 40 , 50 ) . unwrap ( ) ;
765
+
766
+ let result = stakes. query_stakes ( QueryStakesKey :: Key ( bob_david. into ( ) ) ) ;
767
+ assert_eq ! (
768
+ result,
769
+ Ok ( vec![ Stake :: from_parts(
770
+ 20 ,
771
+ CapabilityMap {
772
+ mining: 30 ,
773
+ witnessing: 30
774
+ }
775
+ ) ] )
776
+ ) ;
758
777
759
- let result = stakes. query_stakes ( QueryStakesKey :: Key ( alice_charlie. into ( ) ) ) ;
778
+ let result = stakes. query_by_validator ( bob. into ( ) ) ;
779
+ assert_eq ! (
780
+ result,
781
+ Ok ( vec![ Stake :: from_parts(
782
+ 20 ,
783
+ CapabilityMap {
784
+ mining: 30 ,
785
+ witnessing: 30
786
+ }
787
+ ) ] )
788
+ ) ;
789
+
790
+ let result = stakes. query_by_validator ( david. into ( ) ) ;
791
+ assert_eq ! (
792
+ result,
793
+ Err ( StakesError :: ValidatorNotFound {
794
+ validator: david. into( )
795
+ } )
796
+ ) ;
760
797
761
- assert_eq ! ( result, Ok ( 10 ) )
798
+ let result = stakes. query_by_withdrawer ( david. into ( ) ) ;
799
+ assert_eq ! (
800
+ result,
801
+ Ok ( vec![ Stake :: from_parts(
802
+ 20 ,
803
+ CapabilityMap {
804
+ mining: 30 ,
805
+ witnessing: 30
806
+ }
807
+ ) ] )
808
+ ) ;
809
+
810
+ let result = stakes. query_by_withdrawer ( bob. into ( ) ) ;
811
+ assert_eq ! (
812
+ result,
813
+ Err ( StakesError :: WithdrawerNotFound {
814
+ withdrawer: bob. into( )
815
+ } )
816
+ ) ;
762
817
}
763
818
}
0 commit comments