Skip to content

Commit de61749

Browse files
authored
Merge pull request #6841 from multiversx/new_rewards_config
Added new config for rewards
2 parents 37ab7ad + 35d5b4e commit de61749

File tree

80 files changed

+811
-951
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

80 files changed

+811
-951
lines changed

cmd/node/config/economics.toml

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -20,22 +20,31 @@
2020

2121
[RewardsSettings]
2222
[[RewardsSettings.RewardsConfigByEpoch]]
23-
EpochEnable = 0
24-
LeaderPercentage = 0.1 #fraction of value 0.1 - 10%
25-
DeveloperPercentage = 0.3 #fraction of value 0.3 - 30%
26-
ProtocolSustainabilityPercentage = 0.1 #fraction of value 0.1 - 10%
27-
ProtocolSustainabilityAddress = "erd1j25xk97yf820rgdp3mj5scavhjkn6tjyn0t63pmv5qyjj7wxlcfqqe2rw5"
28-
TopUpGradientPoint = "3000000000000000000000000" # 3MIL eGLD (eligible topUp)
29-
TopUpFactor = 0.25 # fraction of value 0.25 - 25%
23+
EpochEnable = 0
24+
LeaderPercentage = 0.1 #fraction of value 0.1 - 10%
25+
DeveloperPercentage = 0.3 #fraction of value 0.3 - 30%
26+
ProtocolSustainabilityPercentage = 0.1 #fraction of value 0.1 - 10%
27+
ProtocolSustainabilityAddress = "erd1j25xk97yf820rgdp3mj5scavhjkn6tjyn0t63pmv5qyjj7wxlcfqqe2rw5"
28+
TopUpGradientPoint = "3000000000000000000000000" # 3MIL eGLD (eligible topUp)
29+
TopUpFactor = 0.25 # fraction of value 0.25 - 25%
3030

3131
[[RewardsSettings.RewardsConfigByEpoch]]
32-
EpochEnable = 1
33-
LeaderPercentage = 0.1 #fraction of value 0.1 - 10%
34-
DeveloperPercentage = 0.3 #fraction of value 0.3 - 30%
35-
ProtocolSustainabilityPercentage = 0.1 #fraction of value 0.1 - 10%
36-
ProtocolSustainabilityAddress = "erd1j25xk97yf820rgdp3mj5scavhjkn6tjyn0t63pmv5qyjj7wxlcfqqe2rw5"
37-
TopUpGradientPoint = "2000000000000000000000000" # 2MIL eGLD (eligible topUp)
38-
TopUpFactor = 0.5 # fraction of value 0.5 - 50%
32+
EpochEnable = 1
33+
LeaderPercentage = 0.1 #fraction of value 0.1 - 10%
34+
DeveloperPercentage = 0.3 #fraction of value 0.3 - 30%
35+
ProtocolSustainabilityPercentage = 0.1 #fraction of value 0.1 - 10%
36+
ProtocolSustainabilityAddress = "erd1j25xk97yf820rgdp3mj5scavhjkn6tjyn0t63pmv5qyjj7wxlcfqqe2rw5"
37+
TopUpGradientPoint = "2000000000000000000000000" # 2MIL eGLD (eligible topUp)
38+
TopUpFactor = 0.5 # fraction of value 0.5 - 50%
39+
40+
[[RewardsSettings.RewardsConfigByEpoch]]
41+
EpochEnable = 2
42+
LeaderPercentage = 0.1 #fraction of value 0.1 - 10%
43+
DeveloperPercentage = 0.3 #fraction of value 0.3 - 30%
44+
ProtocolSustainabilityPercentage = 0.1 #fraction of value 0.1 - 10%
45+
ProtocolSustainabilityAddress = "erd1e5cw5pegj9w2zfpzeq94wf3d5tp6g943xuhgnyysdwyr63rlkspqr0u05s"
46+
TopUpGradientPoint = "2000000000000000000000000" # 2MIL eGLD (eligible topUp)
47+
TopUpFactor = 0.5 # fraction of value 0.5 - 50%
3948

4049
[FeeSettings]
4150
GasLimitSettings = [

dataRetriever/factory/dataPoolFactory_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ func TestNewDataPoolFromConfig_BadConfigShouldErr(t *testing.T) {
139139
}
140140

141141
func getGoodArgs() ArgsDataPool {
142-
testEconomics := &economicsmocks.EconomicsHandlerStub{
142+
testEconomics := &economicsmocks.EconomicsHandlerMock{
143143
MinGasPriceCalled: func() uint64 {
144144
return 200000000000
145145
},

epochStart/bootstrap/process_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,7 @@ func createMockEpochStartBootstrapArgs(
208208
},
209209
Requesters: generalCfg.Requesters,
210210
},
211-
EconomicsData: &economicsmocks.EconomicsHandlerStub{
211+
EconomicsData: &economicsmocks.EconomicsHandlerMock{
212212
MinGasPriceCalled: func() uint64 {
213213
return 1
214214
},

epochStart/bootstrap/storageProcess_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ func TestStorageEpochStartBootstrap_BootstrapFromGenesis(t *testing.T) {
8888
roundDuration := uint64(60000)
8989
coreComp, cryptoComp := createComponentsForEpochStart()
9090
args := createMockStorageEpochStartBootstrapArgs(coreComp, cryptoComp)
91-
args.EconomicsData = &economicsmocks.EconomicsHandlerStub{
91+
args.EconomicsData = &economicsmocks.EconomicsHandlerMock{
9292
MinGasPriceCalled: func() uint64 {
9393
return 1
9494
},
@@ -112,7 +112,7 @@ func TestStorageEpochStartBootstrap_BootstrapMetablockNotFound(t *testing.T) {
112112
roundDuration := uint64(6000)
113113
coreComp, cryptoComp := createComponentsForEpochStart()
114114
args := createMockStorageEpochStartBootstrapArgs(coreComp, cryptoComp)
115-
args.EconomicsData = &economicsmocks.EconomicsHandlerStub{
115+
args.EconomicsData = &economicsmocks.EconomicsHandlerMock{
116116
MinGasPriceCalled: func() uint64 {
117117
return 1
118118
},

epochStart/bootstrap/syncEpochStartMeta_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ func getEpochStartSyncerArgs() ArgsNewEpochStartMetaSyncer {
153153
RequestHandler: &testscommon.RequestHandlerStub{},
154154
Messenger: &p2pmocks.MessengerStub{},
155155
ShardCoordinator: mock.NewMultiShardsCoordinatorMock(2),
156-
EconomicsData: &economicsmocks.EconomicsHandlerStub{},
156+
EconomicsData: &economicsmocks.EconomicsHandlerMock{},
157157
WhitelistHandler: &testscommon.WhiteListHandlerStub{},
158158
StartInEpochConfig: config.EpochStartConfig{
159159
MinNumConnectedPeersToStart: 2,

epochStart/errors.go

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -62,9 +62,6 @@ var ErrNilHeaderValidator = errors.New("nil header validator")
6262
// ErrNilDataPoolsHolder signals that nil data pools holder has been provided
6363
var ErrNilDataPoolsHolder = errors.New("nil data pools holder")
6464

65-
// ErrNilProtocolSustainabilityAddress signals that a nil protocol sustainability address was provided
66-
var ErrNilProtocolSustainabilityAddress = errors.New("nil protocol sustainability address")
67-
6865
// ErrNilStorageService signals that a nil storage service has been provided
6966
var ErrNilStorageService = errors.New("nil storage service")
7067

@@ -203,9 +200,6 @@ var ErrNotEnoughNumOfPeersToConsiderBlockValid = errors.New("not enough num of p
203200
// ErrNilArgumentsParser signals that nil arguments parser was provided
204201
var ErrNilArgumentsParser = errors.New("nil arguments parsers")
205202

206-
// ErrProtocolSustainabilityAddressInMetachain signals that protocol sustainability address is in metachain which is not allowed
207-
var ErrProtocolSustainabilityAddressInMetachain = errors.New("protocol sustainability address in metachain")
208-
209203
// ErrNilGenesisTotalSupply signals that nil genesis total supply has been provided
210204
var ErrNilGenesisTotalSupply = errors.New("nil genesis total supply")
211205

epochStart/metachain/baseRewards.go

Lines changed: 21 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -29,18 +29,18 @@ import (
2929

3030
// BaseRewardsCreatorArgs defines the arguments structure needed to create a base rewards creator
3131
type BaseRewardsCreatorArgs struct {
32-
ShardCoordinator sharding.Coordinator
33-
PubkeyConverter core.PubkeyConverter
34-
RewardsStorage storage.Storer
35-
MiniBlockStorage storage.Storer
36-
Hasher hashing.Hasher
37-
Marshalizer marshal.Marshalizer
38-
DataPool dataRetriever.PoolsHolder
39-
ProtocolSustainabilityAddress string
40-
NodesConfigProvider epochStart.NodesConfigProvider
41-
UserAccountsDB state.AccountsAdapter
42-
EnableEpochsHandler common.EnableEpochsHandler
43-
ExecutionOrderHandler common.TxExecutionOrderHandler
32+
ShardCoordinator sharding.Coordinator
33+
PubkeyConverter core.PubkeyConverter
34+
RewardsStorage storage.Storer
35+
MiniBlockStorage storage.Storer
36+
Hasher hashing.Hasher
37+
Marshalizer marshal.Marshalizer
38+
DataPool dataRetriever.PoolsHolder
39+
NodesConfigProvider epochStart.NodesConfigProvider
40+
UserAccountsDB state.AccountsAdapter
41+
EnableEpochsHandler common.EnableEpochsHandler
42+
ExecutionOrderHandler common.TxExecutionOrderHandler
43+
RewardsHandler process.RewardsHandler
4444
}
4545

4646
type baseRewardsCreator struct {
@@ -49,7 +49,6 @@ type baseRewardsCreator struct {
4949
pubkeyConverter core.PubkeyConverter
5050
rewardsStorage storage.Storer
5151
miniBlockStorage storage.Storer
52-
protocolSustainabilityAddress []byte
5352
nodesConfigProvider epochStart.NodesConfigProvider
5453
hasher hashing.Hasher
5554
marshalizer marshal.Marshalizer
@@ -62,6 +61,7 @@ type baseRewardsCreator struct {
6261
enableEpochsHandler common.EnableEpochsHandler
6362
mutRewardsData sync.RWMutex
6463
executionOrderHandler common.TxExecutionOrderHandler
64+
rewardsHandler process.RewardsHandler
6565
}
6666

6767
// NewBaseRewardsCreator will create a new base rewards creator instance
@@ -71,17 +71,6 @@ func NewBaseRewardsCreator(args BaseRewardsCreatorArgs) (*baseRewardsCreator, er
7171
return nil, err
7272
}
7373

74-
address, err := args.PubkeyConverter.Decode(args.ProtocolSustainabilityAddress)
75-
if err != nil {
76-
log.Warn("invalid protocol sustainability reward address", "err", err, "provided address", args.ProtocolSustainabilityAddress)
77-
return nil, err
78-
}
79-
80-
protocolSustainabilityShardID := args.ShardCoordinator.ComputeId(address)
81-
if protocolSustainabilityShardID == core.MetachainShardId {
82-
return nil, epochStart.ErrProtocolSustainabilityAddressInMetachain
83-
}
84-
8574
currTxsCache := dataPool.NewCurrentBlockTransactionsPool()
8675
brc := &baseRewardsCreator{
8776
currTxs: currTxsCache,
@@ -92,14 +81,14 @@ func NewBaseRewardsCreator(args BaseRewardsCreatorArgs) (*baseRewardsCreator, er
9281
marshalizer: args.Marshalizer,
9382
miniBlockStorage: args.MiniBlockStorage,
9483
dataPool: args.DataPool,
95-
protocolSustainabilityAddress: address,
9684
nodesConfigProvider: args.NodesConfigProvider,
9785
accumulatedRewards: big.NewInt(0),
9886
protocolSustainabilityValue: big.NewInt(0),
9987
userAccountsDB: args.UserAccountsDB,
10088
mapBaseRewardsPerBlockPerValidator: make(map[uint32]*big.Int),
10189
enableEpochsHandler: args.EnableEpochsHandler,
10290
executionOrderHandler: args.ExecutionOrderHandler,
91+
rewardsHandler: args.RewardsHandler,
10392
}
10493

10594
return brc, nil
@@ -299,9 +288,6 @@ func checkBaseArgs(args BaseRewardsCreatorArgs) error {
299288
if check.IfNil(args.DataPool) {
300289
return epochStart.ErrNilDataPoolsHolder
301290
}
302-
if len(args.ProtocolSustainabilityAddress) == 0 {
303-
return epochStart.ErrNilProtocolSustainabilityAddress
304-
}
305291
if check.IfNil(args.NodesConfigProvider) {
306292
return epochStart.ErrNilNodesConfigProvider
307293
}
@@ -322,6 +308,9 @@ func checkBaseArgs(args BaseRewardsCreatorArgs) error {
322308
if check.IfNil(args.ExecutionOrderHandler) {
323309
return epochStart.ErrNilExecutionOrderHandler
324310
}
311+
if check.IfNil(args.RewardsHandler) {
312+
return epochStart.ErrNilRewardsHandler
313+
}
325314

326315
return nil
327316
}
@@ -358,16 +347,17 @@ func (brc *baseRewardsCreator) createProtocolSustainabilityRewardTransaction(
358347
computedEconomics *block.Economics,
359348
) (*rewardTx.RewardTx, uint32, error) {
360349

361-
shardID := brc.shardCoordinator.ComputeId(brc.protocolSustainabilityAddress)
350+
protocolSustainabilityAddressForEpoch := brc.rewardsHandler.ProtocolSustainabilityAddressInEpoch(metaBlock.GetEpoch())
351+
protocolSustainabilityShardID := brc.shardCoordinator.ComputeId([]byte(protocolSustainabilityAddressForEpoch))
362352
protocolSustainabilityRwdTx := &rewardTx.RewardTx{
363353
Round: metaBlock.GetRound(),
364354
Value: big.NewInt(0).Set(computedEconomics.RewardsForProtocolSustainability),
365-
RcvAddr: brc.protocolSustainabilityAddress,
355+
RcvAddr: []byte(protocolSustainabilityAddressForEpoch),
366356
Epoch: metaBlock.GetEpoch(),
367357
}
368358

369359
brc.accumulatedRewards.Add(brc.accumulatedRewards, protocolSustainabilityRwdTx.Value)
370-
return protocolSustainabilityRwdTx, shardID, nil
360+
return protocolSustainabilityRwdTx, protocolSustainabilityShardID, nil
371361
}
372362

373363
func (brc *baseRewardsCreator) createRewardFromRwdInfo(

epochStart/metachain/baseRewards_test.go

Lines changed: 35 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package metachain
22

33
import (
44
"bytes"
5-
"encoding/hex"
65
"errors"
76
"fmt"
87
"math/big"
@@ -18,7 +17,6 @@ import (
1817
"github.com/multiversx/mx-chain-go/epochStart"
1918
"github.com/multiversx/mx-chain-go/epochStart/mock"
2019
"github.com/multiversx/mx-chain-go/process"
21-
"github.com/multiversx/mx-chain-go/sharding"
2220
"github.com/multiversx/mx-chain-go/state/factory"
2321
"github.com/multiversx/mx-chain-go/testscommon"
2422
txExecOrderStub "github.com/multiversx/mx-chain-go/testscommon/common"
@@ -106,28 +104,6 @@ func TestBaseRewardsCreator_NilMarshalizer(t *testing.T) {
106104
assert.Equal(t, epochStart.ErrNilMarshalizer, err)
107105
}
108106

109-
func TestBaseRewardsCreator_EmptyProtocolSustainabilityAddress(t *testing.T) {
110-
t.Parallel()
111-
112-
args := getBaseRewardsArguments()
113-
args.ProtocolSustainabilityAddress = ""
114-
115-
rwd, err := NewBaseRewardsCreator(args)
116-
assert.True(t, check.IfNil(rwd))
117-
assert.Equal(t, epochStart.ErrNilProtocolSustainabilityAddress, err)
118-
}
119-
120-
func TestBaseRewardsCreator_InvalidProtocolSustainabilityAddress(t *testing.T) {
121-
t.Parallel()
122-
123-
args := getBaseRewardsArguments()
124-
args.ProtocolSustainabilityAddress = "xyz" // not a hex string
125-
126-
rwd, err := NewBaseRewardsCreator(args)
127-
assert.True(t, check.IfNil(rwd))
128-
assert.NotNil(t, err)
129-
}
130-
131107
func TestBaseRewardsCreator_NilDataPoolHolder(t *testing.T) {
132108
t.Parallel()
133109

@@ -176,6 +152,18 @@ func TestBaseRewardsCreator_NilEnableEpochsHandler(t *testing.T) {
176152
assert.Equal(t, epochStart.ErrNilEnableEpochsHandler, err)
177153
}
178154

155+
func TestBaseRewardsCreator_NilRewardsHandler(t *testing.T) {
156+
t.Parallel()
157+
158+
args := getBaseRewardsArguments()
159+
args.RewardsHandler = nil
160+
161+
rwd, err := NewBaseRewardsCreator(args)
162+
163+
assert.True(t, check.IfNil(rwd))
164+
assert.Equal(t, epochStart.ErrNilRewardsHandler, err)
165+
}
166+
179167
func TestBaseRewardsCreator_InvalidEnableEpochsHandler(t *testing.T) {
180168
t.Parallel()
181169

@@ -210,19 +198,6 @@ func TestBaseRewardsCreator_clean(t *testing.T) {
210198
require.NotNil(t, err)
211199
}
212200

213-
func TestBaseRewardsCreator_ProtocolSustainabilityAddressInMetachainShouldErr(t *testing.T) {
214-
t.Parallel()
215-
216-
args := getBaseRewardsArguments()
217-
args.ShardCoordinator, _ = sharding.NewMultiShardCoordinator(2, 0)
218-
// wrong configuration of staking system SC address (in metachain) as protocol sustainability address
219-
args.ProtocolSustainabilityAddress = hex.EncodeToString([]byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255})
220-
221-
rwd, err := NewBaseRewardsCreator(args)
222-
assert.True(t, check.IfNil(rwd))
223-
assert.Equal(t, epochStart.ErrProtocolSustainabilityAddressInMetachain, err)
224-
}
225-
226201
func TestBaseRewardsCreator_OkValsShouldWork(t *testing.T) {
227202
t.Parallel()
228203

@@ -266,7 +241,7 @@ func TestBaseRewardsCreator_addProtocolRewardToMiniblocks(t *testing.T) {
266241
require.NotNil(t, rwd)
267242

268243
initialProtRewardValue := big.NewInt(-100)
269-
protRwAddr, _ := args.PubkeyConverter.Decode(args.ProtocolSustainabilityAddress)
244+
protRwAddr, _ := args.PubkeyConverter.Decode(args.RewardsHandler.ProtocolSustainabilityAddressInEpoch(0))
270245
protRwTx := &rewardTx.RewardTx{
271246
Round: 100,
272247
Value: big.NewInt(0).Set(initialProtRewardValue),
@@ -1190,15 +1165,28 @@ func getBaseRewardsArguments() BaseRewardsCreatorArgs {
11901165
return 0
11911166
}
11921167

1168+
rewardsTopUpGradientPoint, _ := big.NewInt(0).SetString("3000000000000000000000000", 10)
1169+
1170+
rewardsHandler := &mock.RewardsHandlerStub{
1171+
RewardsTopUpGradientPointInEpochCalled: func(_ uint32) *big.Int {
1172+
return rewardsTopUpGradientPoint
1173+
},
1174+
RewardsTopUpFactorInEpochCalled: func(_ uint32) float64 {
1175+
return 0.25
1176+
},
1177+
ProtocolSustainabilityAddressInEpochCalled: func(_ uint32) string {
1178+
return "11"
1179+
},
1180+
}
1181+
11931182
return BaseRewardsCreatorArgs{
1194-
ShardCoordinator: shardCoordinator,
1195-
PubkeyConverter: testscommon.NewPubkeyConverterMock(32),
1196-
RewardsStorage: mock.NewStorerMock(),
1197-
MiniBlockStorage: mock.NewStorerMock(),
1198-
Hasher: &hashingMocks.HasherMock{},
1199-
Marshalizer: &mock.MarshalizerMock{},
1200-
DataPool: dataRetrieverMock.NewPoolsHolderMock(),
1201-
ProtocolSustainabilityAddress: "11", // string hex => 17 decimal
1183+
ShardCoordinator: shardCoordinator,
1184+
PubkeyConverter: testscommon.NewPubkeyConverterMock(32),
1185+
RewardsStorage: mock.NewStorerMock(),
1186+
MiniBlockStorage: mock.NewStorerMock(),
1187+
Hasher: &hashingMocks.HasherMock{},
1188+
Marshalizer: &mock.MarshalizerMock{},
1189+
DataPool: dataRetrieverMock.NewPoolsHolderMock(),
12021190
NodesConfigProvider: &shardingMocks.NodesCoordinatorStub{
12031191
ConsensusGroupSizeCalled: func(shardID uint32) int {
12041192
if shardID == core.MetachainShardId {
@@ -1210,6 +1198,7 @@ func getBaseRewardsArguments() BaseRewardsCreatorArgs {
12101198
UserAccountsDB: userAccountsDB,
12111199
EnableEpochsHandler: enableEpochsHandler,
12121200
ExecutionOrderHandler: &txExecOrderStub.TxExecutionOrderHandlerStub{},
1201+
RewardsHandler: rewardsHandler,
12131202
}
12141203
}
12151204

0 commit comments

Comments
 (0)