@@ -35,56 +35,89 @@ import (
3535)
3636
3737func TestProtocol_GrantBlockReward (t * testing.T ) {
38- testProtocol (t , func (t * testing.T , ctx context.Context , sm protocol.StateManager , p * Protocol ) {
39- blkCtx , ok := protocol .GetBlockCtx (ctx )
40- require .True (t , ok )
41-
42- // Grant block reward will fail because of no available balance
43- _ , err := p .GrantBlockReward (ctx , sm )
44- require .Error (t , err )
45-
46- _ , err = p .Deposit (ctx , sm , big .NewInt (200 ), iotextypes .TransactionLogType_DEPOSIT_TO_REWARDING_FUND )
47- require .NoError (t , err )
48-
49- // Grant block reward
50- rewardLog , err := p .GrantBlockReward (ctx , sm )
51- require .NoError (t , err )
52- require .Equal (t , p .addr .String (), rewardLog .Address )
53- var rl rewardingpb.RewardLog
54- require .NoError (t , proto .Unmarshal (rewardLog .Data , & rl ))
55- require .Equal (t , rewardingpb .RewardLog_BLOCK_REWARD , rl .Type )
56- require .Equal (t , "10" , rl .Amount )
57-
58- availableBalance , _ , err := p .AvailableBalance (ctx , sm )
59- require .NoError (t , err )
60- assert .Equal (t , big .NewInt (190 ), availableBalance )
61- // Operator shouldn't get reward
62- unclaimedBalance , _ , err := p .UnclaimedBalance (ctx , sm , blkCtx .Producer )
63- require .NoError (t , err )
64- assert .Equal (t , big .NewInt (0 ), unclaimedBalance )
65- // Beneficiary should get reward
66- unclaimedBalance , _ , err = p .UnclaimedBalance (ctx , sm , identityset .Address (0 ))
67- require .NoError (t , err )
68- assert .Equal (t , big .NewInt (10 ), unclaimedBalance )
69-
70- // Grant the same block reward again will fail
71- _ , err = p .GrantBlockReward (ctx , sm )
72- require .Error (t , err )
73-
74- // Grant with priority fee after VanuatuBlockHeight
75- blkCtx .AccumulatedTips = * big .NewInt (5 )
76- blkCtx .BlockHeight = genesis .TestDefault ().VanuatuBlockHeight
77- ctx = protocol .WithFeatureCtx (protocol .WithBlockCtx (ctx , blkCtx ))
78- rewardLog , err = p .GrantBlockReward (ctx , sm )
79- require .NoError (t , err )
80- rls , err := UnmarshalRewardLog (rewardLog .Data )
81- require .NoError (t , err )
82- require .Len (t , rls .Logs , 2 )
83- require .Equal (t , rewardingpb .RewardLog_BLOCK_REWARD , rls .Logs [0 ].Type )
84- require .Equal (t , "10" , rls .Logs [0 ].Amount )
85- require .Equal (t , rewardingpb .RewardLog_PRIORITY_BONUS , rls .Logs [1 ].Type )
86- require .Equal (t , blkCtx .AccumulatedTips .String (), rls .Logs [1 ].Amount )
87- }, false )
38+ req := require .New (t )
39+ for _ , tv := range []struct {
40+ blockReward * big.Int
41+ deposit * big.Int
42+ isWakeBlock bool
43+ }{
44+ {big .NewInt (10 ), big .NewInt (200 ), false },
45+ {big .NewInt (48 ), big .NewInt (300 ), true },
46+ } {
47+ testProtocol (t , func (t * testing.T , ctx context.Context , sm protocol.StateManager , p * Protocol ) {
48+ if tv .isWakeBlock {
49+ g := genesis .MustExtractGenesisContext (ctx )
50+ g .WakeBlockRewardStr = tv .blockReward .String ()
51+ wakeBlockCtx := genesis .WithGenesisContext (protocol .WithBlockCtx (ctx , protocol.BlockCtx {
52+ BlockHeight : genesis .TestDefault ().ToBeEnabledBlockHeight ,
53+ }), g )
54+ req .NoError (p .CreatePreStates (wakeBlockCtx , sm ))
55+ }
56+ // verify block reward
57+ br , err := p .BlockReward (ctx , sm )
58+ req .NoError (err )
59+ req .Equal (tv .blockReward , br )
60+ // Grant block reward will fail because of no available balance
61+ _ , err = p .GrantBlockReward (ctx , sm )
62+ req .Error (err )
63+
64+ _ , err = p .Deposit (ctx , sm , tv .deposit , iotextypes .TransactionLogType_DEPOSIT_TO_REWARDING_FUND )
65+ req .NoError (err )
66+
67+ // Grant block reward
68+ rewardLog , err := p .GrantBlockReward (ctx , sm )
69+ req .NoError (err )
70+ req .Equal (p .addr .String (), rewardLog .Address )
71+ var rl rewardingpb.RewardLog
72+ req .NoError (proto .Unmarshal (rewardLog .Data , & rl ))
73+ req .Equal (rewardingpb .RewardLog_BLOCK_REWARD , rl .Type )
74+ req .Equal (tv .blockReward .String (), rl .Amount )
75+
76+ availableBalance , _ , err := p .AvailableBalance (ctx , sm )
77+ req .NoError (err )
78+ req .Equal (tv .deposit .Sub (tv .deposit , tv .blockReward ), availableBalance )
79+ // Operator shouldn't get reward
80+ blkCtx := protocol .MustGetBlockCtx (ctx )
81+ unclaimedBalance , _ , err := p .UnclaimedBalance (ctx , sm , blkCtx .Producer )
82+ req .NoError (err )
83+ req .Equal (big .NewInt (0 ), unclaimedBalance )
84+ // Beneficiary should get reward
85+ unclaimedBalance , _ , err = p .UnclaimedBalance (ctx , sm , identityset .Address (0 ))
86+ req .NoError (err )
87+ req .Equal (tv .blockReward , unclaimedBalance )
88+
89+ // Grant the same block reward again will fail
90+ _ , err = p .GrantBlockReward (ctx , sm )
91+ req .Error (err )
92+
93+ // Grant with priority fee after VanuatuBlockHeight
94+ blkCtx .AccumulatedTips = * big .NewInt (5 )
95+ blkCtx .BlockHeight = genesis .TestDefault ().VanuatuBlockHeight
96+ ctx = protocol .WithFeatureCtx (protocol .WithBlockCtx (ctx , blkCtx ))
97+ tLog , err := DepositGas (ctx , sm , nil , protocol .PriorityFeeOption (& blkCtx .AccumulatedTips ))
98+ req .NoError (err )
99+ req .Equal (tLog [0 ].Type , iotextypes .TransactionLogType_PRIORITY_FEE )
100+ req .Equal (& blkCtx .AccumulatedTips , tLog [0 ].Amount )
101+ rewardLog , err = p .GrantBlockReward (ctx , sm )
102+ req .NoError (err )
103+ rls , err := UnmarshalRewardLog (rewardLog .Data )
104+ req .NoError (err )
105+ req .Len (rls .Logs , 2 )
106+ req .Equal (rewardingpb .RewardLog_BLOCK_REWARD , rls .Logs [0 ].Type )
107+ req .Equal (tv .blockReward .String (), rls .Logs [0 ].Amount )
108+ req .Equal (rewardingpb .RewardLog_PRIORITY_BONUS , rls .Logs [1 ].Type )
109+ req .Equal (blkCtx .AccumulatedTips .String (), rls .Logs [1 ].Amount )
110+
111+ // check available and receiver balance
112+ availableBalance , _ , err = p .AvailableBalance (ctx , sm )
113+ req .NoError (err )
114+ req .Equal (tv .deposit .Sub (tv .deposit , tv .blockReward ), availableBalance )
115+ unclaimedBalance , _ , err = p .UnclaimedBalance (ctx , sm , identityset .Address (0 ))
116+ req .NoError (err )
117+ tv .blockReward .Lsh (tv .blockReward , 1 )
118+ req .Equal (tv .blockReward .Add (tv .blockReward , & blkCtx .AccumulatedTips ), unclaimedBalance )
119+ }, false )
120+ }
88121}
89122
90123func TestProtocol_GrantEpochReward (t * testing.T ) {
0 commit comments