Skip to content

Commit 429e5d4

Browse files
add ValidatorRewardPercentage param (#1199)
1 parent ec7b156 commit 429e5d4

3 files changed

Lines changed: 113 additions & 14 deletions

File tree

builtin/energy/energy.go

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -276,12 +276,19 @@ func (e *Energy) DistributeRewards(beneficiary, signer thor.Address, staker stak
276276
if err != nil {
277277
return err
278278
}
279+
validatorRewardPerc, err := e.params.Get(thor.KeyValidatorRewardPercentage)
280+
if err != nil {
281+
return err
282+
}
283+
if validatorRewardPerc.Uint64() == 0 {
284+
validatorRewardPerc = big.NewInt(int64(thor.InitialValidatorRewardPercentage))
285+
}
279286

280287
// If delegated amount of VET is 0 then transfer the whole reward to the validator
281288
proposerReward := new(big.Int).Set(reward)
282289
if hasDelegations {
283-
proposerReward.Mul(proposerReward, big.NewInt(3))
284-
proposerReward.Div(proposerReward, big.NewInt(10))
290+
proposerReward.Mul(proposerReward, validatorRewardPerc)
291+
proposerReward.Div(proposerReward, big.NewInt(100))
285292

286293
val, err := e.params.Get(thor.KeyStargateContractAddress)
287294
if err != nil {

builtin/energy/energy_test.go

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
package energy
77

88
import (
9+
"errors"
910
"math"
1011
"math/big"
1112
"testing"
@@ -269,3 +270,92 @@ func TestCalculateRewards(t *testing.T) {
269270
assert.NoError(t, err)
270271
assert.Equal(t, big.NewInt(121432908318154219), reward)
271272
}
273+
274+
func TestDistributeRewards(t *testing.T) {
275+
st := state.New(muxdb.NewMem(), trie.Root{})
276+
277+
beneficiary := thor.BytesToAddress([]byte("beneficiary"))
278+
signer := thor.BytesToAddress([]byte("signer"))
279+
stargateAddr := thor.BytesToAddress([]byte("stargate"))
280+
energyAddr := thor.BytesToAddress([]byte("eng"))
281+
282+
paramsAddr := thor.BytesToAddress([]byte("par"))
283+
p := params.New(paramsAddr, st)
284+
285+
st.SetStorage(paramsAddr, thor.KeyValidatorRewardPercentage, thor.BytesToBytes32(big.NewInt(int64(thor.InitialValidatorRewardPercentage)).Bytes()))
286+
st.SetStorage(paramsAddr, thor.KeyStargateContractAddress, thor.BytesToBytes32(stargateAddr.Bytes()))
287+
288+
eng := New(thor.BytesToAddress([]byte("eng")), st, 1, p)
289+
290+
stake := big.NewInt(0).Mul(big.NewInt(25), big.NewInt(1e18))
291+
expectedReward := big.NewInt(121765601217656012)
292+
293+
expectedBeneficiaryReward := big.NewInt(0).Mul(expectedReward, big.NewInt(3))
294+
expectedBeneficiaryReward = big.NewInt(0).Div(expectedBeneficiaryReward, big.NewInt(10))
295+
296+
tests := []struct {
297+
name string
298+
hasDelegations bool
299+
expectedErr error
300+
expectedBeneficiaryReward *big.Int
301+
expectedDelegatorReward *big.Int
302+
expectedIssued *big.Int
303+
}{
304+
{
305+
name: "No delegations - full reward to beneficiary",
306+
hasDelegations: false,
307+
expectedErr: nil,
308+
expectedBeneficiaryReward: expectedReward,
309+
expectedDelegatorReward: big.NewInt(0),
310+
expectedIssued: expectedReward,
311+
},
312+
{
313+
name: "With delegations - split reward",
314+
hasDelegations: true,
315+
expectedErr: nil,
316+
expectedBeneficiaryReward: expectedBeneficiaryReward,
317+
expectedDelegatorReward: new(big.Int).Sub(expectedReward, expectedBeneficiaryReward),
318+
expectedIssued: expectedReward,
319+
},
320+
{
321+
name: "With delegations - IncreaseDelegatorsReward fails",
322+
hasDelegations: true,
323+
expectedErr: errors.New("increase reward failed"),
324+
expectedBeneficiaryReward: big.NewInt(0),
325+
expectedDelegatorReward: big.NewInt(0),
326+
expectedIssued: big.NewInt(0),
327+
},
328+
}
329+
330+
for _, tt := range tests {
331+
t.Run(tt.name, func(t *testing.T) {
332+
// Reset state for each test
333+
st.SetEnergy(beneficiary, big.NewInt(0), 1)
334+
st.SetEnergy(stargateAddr, big.NewInt(0), 1)
335+
st.SetStorage(energyAddr, issuedKey, thor.Bytes32{})
336+
337+
mockStaker := &mockStaker{
338+
lockedVET: stake,
339+
hasDelegations: tt.hasDelegations,
340+
increaseRewardErr: tt.expectedErr,
341+
}
342+
343+
err := eng.DistributeRewards(beneficiary, signer, mockStaker)
344+
assert.Equal(t, tt.expectedErr, err)
345+
346+
beneficiaryEnergy, err := eng.Get(beneficiary)
347+
assert.NoError(t, err)
348+
assert.Equal(t, tt.expectedBeneficiaryReward, beneficiaryEnergy)
349+
350+
if tt.hasDelegations {
351+
stargateEnergy, err := eng.Get(stargateAddr)
352+
assert.NoError(t, err)
353+
assert.Equal(t, tt.expectedDelegatorReward, stargateEnergy)
354+
}
355+
356+
issued, err := eng.getIssued()
357+
assert.NoError(t, err)
358+
assert.Equal(t, tt.expectedIssued, issued)
359+
})
360+
}
361+
}

thor/params.go

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -51,18 +51,20 @@ const (
5151

5252
// Keys of governance params.
5353
var (
54-
KeyExecutorAddress = BytesToBytes32([]byte("executor"))
55-
KeyRewardRatio = BytesToBytes32([]byte("reward-ratio"))
56-
KeyLegacyTxBaseGasPrice = BytesToBytes32([]byte("base-gas-price")) // the legacy tx default gas price
57-
KeyProposerEndorsement = BytesToBytes32([]byte("proposer-endorsement"))
58-
KeyMaxBlockProposers = BytesToBytes32([]byte("max-block-proposers"))
59-
KeyStargateContractAddress = BytesToBytes32([]byte("stargate-contract-address"))
60-
KeyCurveFactor = BytesToBytes32([]byte("curve-factor")) // curve factor to define VTHO issuance after PoS
61-
62-
InitialRewardRatio = big.NewInt(3e17) // 30%
63-
InitialBaseGasPrice = big.NewInt(1e15)
64-
InitialProposerEndorsement = new(big.Int).Mul(big.NewInt(1e18), big.NewInt(25000000))
65-
InitialCurveFactor = big.NewInt(76800)
54+
KeyExecutorAddress = BytesToBytes32([]byte("executor"))
55+
KeyRewardRatio = BytesToBytes32([]byte("reward-ratio"))
56+
KeyValidatorRewardPercentage = BytesToBytes32([]byte("validator-reward-percentage"))
57+
KeyLegacyTxBaseGasPrice = BytesToBytes32([]byte("base-gas-price")) // the legacy tx default gas price
58+
KeyProposerEndorsement = BytesToBytes32([]byte("proposer-endorsement"))
59+
KeyMaxBlockProposers = BytesToBytes32([]byte("max-block-proposers"))
60+
KeyStargateContractAddress = BytesToBytes32([]byte("stargate-contract-address"))
61+
KeyCurveFactor = BytesToBytes32([]byte("curve-factor")) // curve factor to define VTHO issuance after PoS
62+
63+
InitialRewardRatio = big.NewInt(3e17) // 30%
64+
InitialValidatorRewardPercentage = 30 // 30%
65+
InitialBaseGasPrice = big.NewInt(1e15)
66+
InitialProposerEndorsement = new(big.Int).Mul(big.NewInt(1e18), big.NewInt(25000000))
67+
InitialCurveFactor = big.NewInt(76800)
6668

6769
EnergyGrowthRate = big.NewInt(5000000000) // WEI THOR per token(VET) per second. about 0.000432 THOR per token per day.
6870
NumberOfBlocksPerYear = big.NewInt(3153600) // number of blocks per year, non leap

0 commit comments

Comments
 (0)