@@ -2430,32 +2430,42 @@ fn contract_stake_amount_stake_is_ok() {
2430
2430
assert ! ( contract_stake. staked_future. is_some( ) ) ;
2431
2431
}
2432
2432
2433
- // TODO: improve this a bit
2434
2433
#[ test]
2435
2434
fn contract_stake_amount_unstake_is_ok ( ) {
2436
2435
let mut contract_stake = ContractStakeAmount :: default ( ) ;
2437
2436
2438
2437
// Prep action - create a stake entry
2439
2438
let era_1 = 2 ;
2439
+ let era_2 = era_1 + 1 ;
2440
2440
let period = 3 ;
2441
2441
let period_info = PeriodInfo {
2442
2442
number : period,
2443
2443
subperiod : Subperiod :: Voting ,
2444
2444
next_subperiod_start_era : 20 ,
2445
2445
} ;
2446
- let stake_amount = 100 ;
2447
- contract_stake. stake ( stake_amount, period_info, era_1) ;
2446
+ let vp_stake_amount = 47 ;
2447
+ let bep_stake_amount = 53 ;
2448
+ contract_stake. stake ( vp_stake_amount, period_info, era_1) ;
2449
+ contract_stake. stake (
2450
+ bep_stake_amount,
2451
+ PeriodInfo {
2452
+ subperiod : Subperiod :: BuildAndEarn ,
2453
+ ..period_info
2454
+ } ,
2455
+ era_1,
2456
+ ) ;
2457
+ let total_stake_amount = vp_stake_amount + bep_stake_amount;
2448
2458
2449
- // 1st scenario - unstake in the same era
2459
+ // 1st scenario - unstake in the same era, from `Voting` subperiod
2450
2460
let amount_1 = 5 ;
2451
2461
contract_stake. unstake ( amount_1, 0 , period_info, era_1) ;
2452
2462
assert_eq ! (
2453
2463
contract_stake. total_staked_amount( period) ,
2454
- stake_amount - amount_1
2464
+ total_stake_amount - amount_1
2455
2465
) ;
2456
2466
assert_eq ! (
2457
2467
contract_stake. staked_amount( period, Subperiod :: Voting ) ,
2458
- stake_amount - amount_1
2468
+ vp_stake_amount - amount_1
2459
2469
) ;
2460
2470
assert ! ( contract_stake. staked. is_empty( ) ) ;
2461
2471
assert ! ( contract_stake. staked_future. is_some( ) ) ;
@@ -2466,16 +2476,20 @@ fn contract_stake_amount_unstake_is_ok() {
2466
2476
subperiod : Subperiod :: BuildAndEarn ,
2467
2477
next_subperiod_start_era : 40 ,
2468
2478
} ;
2469
- let era_2 = era_1 + 1 ;
2470
2479
2471
- contract_stake. unstake ( 0 , amount_1 , period_info, era_2) ;
2480
+ contract_stake. unstake ( amount_1 , 0 , period_info, era_2) ;
2472
2481
assert_eq ! (
2473
2482
contract_stake. total_staked_amount( period) ,
2474
- stake_amount - amount_1 * 2
2483
+ total_stake_amount - amount_1 * 2
2475
2484
) ;
2476
2485
assert_eq ! (
2477
2486
contract_stake. staked_amount( period, Subperiod :: Voting ) ,
2478
- stake_amount - amount_1 * 2
2487
+ vp_stake_amount - amount_1 * 2
2488
+ ) ;
2489
+ assert_eq ! (
2490
+ contract_stake. staked_amount( period, Subperiod :: BuildAndEarn ) ,
2491
+ bep_stake_amount,
2492
+ "Must remain unchanged."
2479
2493
) ;
2480
2494
assert ! (
2481
2495
!contract_stake. staked. is_empty( ) ,
@@ -2486,17 +2500,36 @@ fn contract_stake_amount_unstake_is_ok() {
2486
2500
"future entry should be cleaned up since it refers to the current era"
2487
2501
) ;
2488
2502
2489
- // 3rd scenario - bump up unstake eras by more than 1, entries should be aligned to the current era
2503
+ // 3rd scenario - same as previous scenario, but for `BuildAndEarn` subperiod
2504
+ contract_stake. unstake ( 0 , amount_1, period_info, era_2) ;
2505
+ assert_eq ! (
2506
+ contract_stake. total_staked_amount( period) ,
2507
+ total_stake_amount - amount_1 * 3
2508
+ ) ;
2509
+ assert_eq ! (
2510
+ contract_stake. staked_amount( period, Subperiod :: Voting ) ,
2511
+ vp_stake_amount - amount_1 * 2
2512
+ ) ;
2513
+ assert_eq ! (
2514
+ contract_stake. staked_amount( period, Subperiod :: BuildAndEarn ) ,
2515
+ bep_stake_amount - amount_1
2516
+ ) ;
2517
+
2518
+ // 4th scenario - bump up unstake eras by more than 1, entries should be aligned to the current era
2490
2519
let era_3 = era_2 + 3 ;
2491
2520
let amount_2 = 7 ;
2492
2521
contract_stake. unstake ( 0 , amount_2, period_info, era_3) ;
2493
2522
assert_eq ! (
2494
2523
contract_stake. total_staked_amount( period) ,
2495
- stake_amount - amount_1 * 2 - amount_2
2524
+ total_stake_amount - amount_1 * 3 - amount_2
2496
2525
) ;
2497
2526
assert_eq ! (
2498
2527
contract_stake. staked_amount( period, Subperiod :: Voting ) ,
2499
- stake_amount - amount_1 * 2 - amount_2
2528
+ vp_stake_amount - amount_1 * 2
2529
+ ) ;
2530
+ assert_eq ! (
2531
+ contract_stake. staked_amount( period, Subperiod :: BuildAndEarn ) ,
2532
+ bep_stake_amount - amount_1 - amount_2
2500
2533
) ;
2501
2534
assert_eq ! (
2502
2535
contract_stake. staked. era, era_3,
@@ -2507,8 +2540,8 @@ fn contract_stake_amount_unstake_is_ok() {
2507
2540
"future entry should remain 'None'"
2508
2541
) ;
2509
2542
2510
- // 4th scenario - do a full unstake with existing future entry, expect a cleanup
2511
- contract_stake. stake ( stake_amount , period_info, era_3) ;
2543
+ // 5th scenario - do a full unstake with existing future entry, expect a cleanup
2544
+ contract_stake. stake ( total_stake_amount , period_info, era_3) ;
2512
2545
contract_stake. unstake (
2513
2546
contract_stake. staked_amount ( period, Subperiod :: Voting ) ,
2514
2547
contract_stake. staked_amount ( period, Subperiod :: BuildAndEarn ) ,
0 commit comments