1
1
package keeper_test
2
2
3
3
import (
4
+ "context"
4
5
"fmt"
5
6
"math/big"
6
7
"testing"
7
8
9
+ "github.com/golang/mock/gomock"
10
+
8
11
"github.com/stretchr/testify/require"
9
12
10
13
"cosmossdk.io/collections"
@@ -16,6 +19,8 @@ import (
16
19
authtypes "github.com/cosmos/cosmos-sdk/x/auth/types"
17
20
disttypes "github.com/cosmos/cosmos-sdk/x/distribution/types"
18
21
v1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1"
22
+
23
+ stakeTypes "github.com/0xPolygon/heimdall-v2/x/stake/types"
19
24
)
20
25
21
26
const (
@@ -461,3 +466,141 @@ func TestChargeDeposit(t *testing.T) {
461
466
}
462
467
}
463
468
}
469
+
470
+ func TestDistributeAndDeleteDeposits (t * testing.T ) {
471
+ testcases := []struct {
472
+ name string
473
+ numValidators uint64
474
+ }{
475
+ {
476
+ name : "Single validator case" ,
477
+ numValidators : 1 ,
478
+ },
479
+ {
480
+ name : "Equal distribution case" ,
481
+ numValidators : 2 ,
482
+ },
483
+ {
484
+ name : "Edge case: Distribution of the remaining amount to a random validator" ,
485
+ numValidators : 3 ,
486
+ },
487
+ }
488
+
489
+ for _ , tc := range testcases {
490
+ t .Run (tc .name , func (t * testing.T ) {
491
+ govKeeper , authKeeper , bankKeeper , stakingKeeper , distKeeper , _ , ctx := setupGovKeeper (t )
492
+ trackMockBalances (bankKeeper , distKeeper )
493
+
494
+ accAmt := sdkmath .NewIntFromBigInt (new (big.Int ).Mul (big .NewInt (10 ), new (big.Int ).Exp (big .NewInt (10 ), big .NewInt (18 ), nil )))
495
+ TestAddrs := simtestutil .AddTestAddrsIncremental (bankKeeper , ctx , 5 , accAmt .Mul (sdkmath .NewInt (1 )))
496
+ authKeeper .EXPECT ().AddressCodec ().Return (address .NewHexCodec ()).AnyTimes ()
497
+
498
+ var mockValidators []stakeTypes.Validator
499
+
500
+ switch {
501
+ case tc .numValidators == 1 :
502
+ mockValidators = []stakeTypes.Validator {
503
+ {Signer : TestAddrs [2 ].String ()},
504
+ }
505
+ case tc .numValidators == 2 :
506
+ mockValidators = []stakeTypes.Validator {
507
+ {Signer : TestAddrs [2 ].String ()},
508
+ {Signer : TestAddrs [3 ].String ()},
509
+ }
510
+ case tc .numValidators == 3 :
511
+ mockValidators = []stakeTypes.Validator {
512
+ {Signer : TestAddrs [2 ].String ()},
513
+ {Signer : TestAddrs [3 ].String ()},
514
+ {Signer : TestAddrs [4 ].String ()},
515
+ }
516
+ }
517
+
518
+ stakingKeeper .EXPECT ().IterateCurrentValidatorsAndApplyFn (gomock .Any (), gomock .Any ()).DoAndReturn (
519
+ func (ctx context.Context , fn func (stakeTypes.Validator ) bool ) error {
520
+ for _ , validator := range mockValidators {
521
+ if stop := fn (validator ); stop {
522
+ break
523
+ }
524
+ }
525
+ return nil
526
+ },
527
+ ).AnyTimes ()
528
+
529
+ tp := TestProposal
530
+ proposal , err := govKeeper .SubmitProposal (ctx , tp , "" , "title" , "summary" , TestAddrs [0 ], false )
531
+ require .NoError (t , err )
532
+ proposalID := proposal .Id
533
+
534
+ stakeAmount := sdk .NewCoins (sdk .NewCoin (sdk .DefaultBondDenom , stakingKeeper .TokensFromConsensusPower (ctx , 5 )))
535
+
536
+ addr0Initial := bankKeeper .GetAllBalances (ctx , TestAddrs [0 ])
537
+ addr1Initial := bankKeeper .GetAllBalances (ctx , TestAddrs [1 ])
538
+
539
+ addr2Initial := bankKeeper .GetAllBalances (ctx , TestAddrs [2 ])
540
+ addr3Initial := bankKeeper .GetAllBalances (ctx , TestAddrs [3 ])
541
+ addr4Initial := bankKeeper .GetAllBalances (ctx , TestAddrs [4 ])
542
+
543
+ // 1st deposit from TestAddrs[0]
544
+ _ , err = govKeeper .AddDeposit (ctx , proposalID , TestAddrs [0 ], stakeAmount )
545
+ require .NoError (t , err )
546
+
547
+ // 2nd deposit from TestAddrs[1]
548
+ _ , err = govKeeper .AddDeposit (ctx , proposalID , TestAddrs [1 ], stakeAmount )
549
+ require .NoError (t , err )
550
+
551
+ // Check deposits length
552
+ deposits , _ := govKeeper .GetDeposits (ctx , proposalID )
553
+ require .Len (t , deposits , 2 )
554
+
555
+ // Check TestAddrs[0] and TestAddrs[1] balances
556
+ require .Equal (t , addr0Initial .Sub (stakeAmount ... ), bankKeeper .GetAllBalances (ctx , TestAddrs [0 ]))
557
+ require .Equal (t , addr1Initial .Sub (stakeAmount ... ), bankKeeper .GetAllBalances (ctx , TestAddrs [1 ]))
558
+
559
+ addr0After := bankKeeper .GetAllBalances (ctx , TestAddrs [0 ])
560
+ addr1After := bankKeeper .GetAllBalances (ctx , TestAddrs [1 ])
561
+
562
+ // 10 pol deposited in total from TestAddrs[0] and TestAddrs[1]
563
+
564
+ // Test DistributeAndDeleteDeposits
565
+ err = govKeeper .DistributeAndDeleteDeposits (ctx , proposalID )
566
+ require .NoError (t , err )
567
+
568
+ // Check balances
569
+
570
+ // Balances of TestAddrs[0] and TestAddrs[1] should be the same
571
+ // as the deposits will be distributed to the validators
572
+ require .Equal (t , addr0After , bankKeeper .GetAllBalances (ctx , TestAddrs [0 ]))
573
+ require .Equal (t , addr1After , bankKeeper .GetAllBalances (ctx , TestAddrs [1 ]))
574
+
575
+ // Balances of validators will be dependent on numValidators
576
+ switch {
577
+ case tc .numValidators == 1 :
578
+ // All the deposits will be transferred to the single validator
579
+ require .Equal (t , addr2Initial .Add (stakeAmount ... ).Add (stakeAmount ... ), bankKeeper .GetAllBalances (ctx , TestAddrs [2 ]))
580
+ case tc .numValidators == 2 :
581
+ // Equal distribution of deposits among validators
582
+ require .Equal (t , addr2Initial .Add (stakeAmount ... ), bankKeeper .GetAllBalances (ctx , TestAddrs [2 ]))
583
+ require .Equal (t , addr3Initial .Add (stakeAmount ... ), bankKeeper .GetAllBalances (ctx , TestAddrs [3 ]))
584
+ case tc .numValidators == 3 :
585
+ // A random validator will get a little bit of pol (NOT in the power 10**18) more because of truncation in division
586
+ addr2After := bankKeeper .GetAllBalances (ctx , TestAddrs [2 ])
587
+ addr3After := bankKeeper .GetAllBalances (ctx , TestAddrs [3 ])
588
+ addr4After := bankKeeper .GetAllBalances (ctx , TestAddrs [4 ])
589
+
590
+ if addr2After .AmountOf ("pol" ).GT (addr3After .AmountOf ("pol" )) && addr2After .AmountOf ("pol" ).GT (addr4After .AmountOf ("pol" )) {
591
+ require .Equal (t , addr2Initial .Add (sdk .NewCoin ("pol" , sdkmath .NewInt (3333333333333333336 ))), addr2After )
592
+ require .Equal (t , addr3Initial .Add (sdk .NewCoin ("pol" , sdkmath .NewInt (3333333333333333332 ))), addr3After )
593
+ require .Equal (t , addr4Initial .Add (sdk .NewCoin ("pol" , sdkmath .NewInt (3333333333333333332 ))), addr4After )
594
+ } else if addr3After .AmountOf ("pol" ).GT (addr2After .AmountOf ("pol" )) && addr3After .AmountOf ("pol" ).GT (addr4After .AmountOf ("pol" )) {
595
+ require .Equal (t , addr2Initial .Add (sdk .NewCoin ("pol" , sdkmath .NewInt (3333333333333333332 ))), addr2After )
596
+ require .Equal (t , addr3Initial .Add (sdk .NewCoin ("pol" , sdkmath .NewInt (3333333333333333336 ))), addr3After )
597
+ require .Equal (t , addr4Initial .Add (sdk .NewCoin ("pol" , sdkmath .NewInt (3333333333333333332 ))), addr4After )
598
+ } else {
599
+ require .Equal (t , addr2Initial .Add (sdk .NewCoin ("pol" , sdkmath .NewInt (3333333333333333332 ))), addr2After )
600
+ require .Equal (t , addr3Initial .Add (sdk .NewCoin ("pol" , sdkmath .NewInt (3333333333333333332 ))), addr3After )
601
+ require .Equal (t , addr4Initial .Add (sdk .NewCoin ("pol" , sdkmath .NewInt (3333333333333333336 ))), addr4After )
602
+ }
603
+ }
604
+ })
605
+ }
606
+ }
0 commit comments