Skip to content

Commit 55714d8

Browse files
authored
Darren/feat/implement staker native gas costs (#1159)
1 parent 6f04571 commit 55714d8

7 files changed

Lines changed: 291 additions & 123 deletions

File tree

builtin/staker/delegations.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ func (d *delegations) Add(
6262
}
6363
nextPeriodStake := validation.NextPeriodStakes(aggregated)
6464
nextPeriodStake = nextPeriodStake.Add(nextPeriodStake, stake)
65-
if nextPeriodStake.Cmp(maxStake) > 0 {
65+
if nextPeriodStake.Cmp(MaxStake) > 0 {
6666
return thor.Bytes32{}, errors.New("validation's next period stake exceeds max stake")
6767
}
6868

builtin/staker/delegations_test.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ func Test_IsLocked(t *testing.T) {
120120
func Test_AddDelegator_AutoRenew(t *testing.T) {
121121
staker, validators := newDelegationStaker(t)
122122

123-
stake := big.NewInt(0).Set(minStake)
123+
stake := big.NewInt(0).Set(MinStake)
124124

125125
// Auto Renew == true
126126
validator := validators[0]
@@ -164,7 +164,7 @@ func Test_AddDelegator_StakeRange(t *testing.T) {
164164
assert.ErrorContains(t, err, "stake must be greater than 0")
165165

166166
// should NOT be able to stake greater than max stake
167-
_, err = staker.AddDelegation(validator.ID, maxStake, true, 255)
167+
_, err = staker.AddDelegation(validator.ID, MaxStake, true, 255)
168168
assert.ErrorContains(t, err, "validation's next period stake exceeds max stake")
169169

170170
// should be able stake 1 VET
@@ -175,7 +175,7 @@ func Test_AddDelegator_StakeRange(t *testing.T) {
175175
validator = validators[1]
176176
validation, err := staker.Get(validator.ID)
177177
assert.NoError(t, err)
178-
remaining := big.NewInt(0).Sub(maxStake, validation.NextPeriodStakes(newAggregation()))
178+
remaining := big.NewInt(0).Sub(MaxStake, validation.NextPeriodStakes(newAggregation()))
179179
_, err = staker.AddDelegation(validator.ID, remaining, true, 255)
180180
assert.NoError(t, err)
181181
}
@@ -520,13 +520,13 @@ func Test_Delegator_Queued_Weight_QueuedValidator_Withdraw(t *testing.T) {
520520
staker, _ := newStaker(t, 0, 101, false)
521521

522522
validatorAddr := datagen.RandAddress()
523-
validatorID, err := staker.AddValidator(validatorAddr, validatorAddr, uint32(360)*24*15, minStake, true, 0)
523+
validatorID, err := staker.AddValidator(validatorAddr, validatorAddr, uint32(360)*24*15, MinStake, true, 0)
524524
assert.NoError(t, err)
525525

526526
initialQueuedVET, initialQueuedWeight, err := staker.QueuedStake()
527527
assert.NoError(t, err)
528528

529-
delegationStake := new(big.Int).Div(minStake, big.NewInt(4))
529+
delegationStake := new(big.Int).Div(MinStake, big.NewInt(4))
530530
delegationID, err := staker.AddDelegation(validatorID, delegationStake, true, 255)
531531
assert.NoError(t, err)
532532

@@ -554,8 +554,8 @@ func Test_Delegator_Queued_Weight_MultipleDelegations_Withdraw(t *testing.T) {
554554
staker, validators := newDelegationStaker(t)
555555

556556
validator := validators[0]
557-
stake1 := new(big.Int).Set(minStake)
558-
stake2 := new(big.Int).Div(minStake, big.NewInt(2))
557+
stake1 := new(big.Int).Set(MinStake)
558+
stake2 := new(big.Int).Div(MinStake, big.NewInt(2))
559559

560560
initialQueuedVET, initialQueuedWeight, err := staker.QueuedStake()
561561
assert.NoError(t, err)

builtin/staker/staker.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,12 @@ import (
1919
// TODO: Do these need to be set in params.sol, or some other dynamic way?
2020
var (
2121
logger = log.WithContext("pkg", "staker")
22-
minStake = big.NewInt(0).Mul(big.NewInt(25e6), big.NewInt(1e18))
23-
maxStake = big.NewInt(0).Mul(big.NewInt(600e6), big.NewInt(1e18))
22+
MinStake = big.NewInt(0).Mul(big.NewInt(25e6), big.NewInt(1e18))
23+
MaxStake = big.NewInt(0).Mul(big.NewInt(600e6), big.NewInt(1e18))
2424

25-
lowStakingPeriod = uint32(360) * 24 * 7 // 336 epochs
26-
mediumStakingPeriod = uint32(360) * 24 * 15 // 720 epochs
27-
highStakingPeriod = uint32(360) * 24 * 30 // 1,440 epochs
25+
LowStakingPeriod = uint32(360) * 24 * 7 // 336 epochs
26+
MediumStakingPeriod = uint32(360) * 24 * 15 // 720 epochs
27+
HighStakingPeriod = uint32(360) * 24 * 30 // 1,440 epochs
2828

2929
cooldownPeriod = uint32(8640)
3030
epochLength = uint32(180)
@@ -51,8 +51,8 @@ func New(addr thor.Address, state *state.State, params *params.Params, charger *
5151
storage := newStorage(addr, state, charger)
5252

5353
// debug overrides for testing
54-
storage.debugOverride(&epochLength, thor.BytesToBytes32([]byte("epoch-length")))
55-
storage.debugOverride(&cooldownPeriod, thor.BytesToBytes32([]byte("cooldown-period")))
54+
storage.debugOverride(&epochLength, slotEpochLength)
55+
storage.debugOverride(&cooldownPeriod, slotCooldownPeriod)
5656

5757
return &Staker{
5858
lockedVET: solidity.NewUint256(addr, state, slotLockedVET),

builtin/staker/staker_test.go

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -25,20 +25,20 @@ func M(a ...any) []any {
2525
return a
2626
}
2727

28-
// RandomStake returns a random number between minStake and (maxStake/2)
28+
// RandomStake returns a random number between MinStake and (MaxStake/2)
2929
func RandomStake() *big.Int {
3030
rng := rand.New(rand.NewSource(time.Now().UnixNano()))
3131

32-
max := big.NewInt(0).Div(maxStake, big.NewInt(2))
32+
max := big.NewInt(0).Div(MaxStake, big.NewInt(2))
3333

34-
// Calculate the range (max - minStake)
35-
rangeStake := new(big.Int).Sub(max, minStake)
34+
// Calculate the range (max - MinStake)
35+
rangeStake := new(big.Int).Sub(max, MinStake)
3636

3737
// Generate a random number within the range
3838
randomOffset := new(big.Int).Rand(rng, rangeStake)
3939

40-
// Add minStake to ensure the value is within the desired range
41-
return new(big.Int).Add(minStake, randomOffset)
40+
// Add MinStake to ensure the value is within the desired range
41+
return new(big.Int).Add(MinStake, randomOffset)
4242
}
4343

4444
type keySet struct {
@@ -212,40 +212,40 @@ func TestStaker_TotalStake_Withdrawal(t *testing.T) {
212212
func TestStaker_AddValidator_MinimumStake(t *testing.T) {
213213
staker, _ := newStaker(t, 68, 101, true)
214214

215-
tooLow := big.NewInt(0).Sub(minStake, big.NewInt(1))
215+
tooLow := big.NewInt(0).Sub(MinStake, big.NewInt(1))
216216
_, err := staker.AddValidator(datagen.RandAddress(), datagen.RandAddress(), uint32(360)*24*15, tooLow, true, 0)
217217
assert.ErrorContains(t, err, "stake is out of range")
218-
_, err = staker.AddValidator(datagen.RandAddress(), datagen.RandAddress(), uint32(360)*24*15, minStake, true, 0)
218+
_, err = staker.AddValidator(datagen.RandAddress(), datagen.RandAddress(), uint32(360)*24*15, MinStake, true, 0)
219219
assert.NoError(t, err)
220220
}
221221

222222
func TestStaker_AddValidator_MaximumStake(t *testing.T) {
223223
staker, _ := newStaker(t, 68, 101, true)
224224

225-
tooHigh := big.NewInt(0).Add(maxStake, big.NewInt(1))
225+
tooHigh := big.NewInt(0).Add(MaxStake, big.NewInt(1))
226226
_, err := staker.AddValidator(datagen.RandAddress(), datagen.RandAddress(), uint32(360)*24*15, tooHigh, true, 0)
227227
assert.ErrorContains(t, err, "stake is out of range")
228-
_, err = staker.AddValidator(datagen.RandAddress(), datagen.RandAddress(), uint32(360)*24*15, maxStake, true, 0)
228+
_, err = staker.AddValidator(datagen.RandAddress(), datagen.RandAddress(), uint32(360)*24*15, MaxStake, true, 0)
229229
assert.NoError(t, err)
230230
}
231231

232232
func TestStaker_AddValidator_MaximumStakingPeriod(t *testing.T) {
233233
staker, _ := newStaker(t, 101, 101, true)
234234

235-
_, err := staker.AddValidator(datagen.RandAddress(), datagen.RandAddress(), uint32(360)*24*400, minStake, true, 0)
235+
_, err := staker.AddValidator(datagen.RandAddress(), datagen.RandAddress(), uint32(360)*24*400, MinStake, true, 0)
236236
assert.ErrorContains(t, err, "period is out of boundaries")
237-
_, err = staker.AddValidator(datagen.RandAddress(), datagen.RandAddress(), uint32(360)*24*15, minStake, true, 0)
237+
_, err = staker.AddValidator(datagen.RandAddress(), datagen.RandAddress(), uint32(360)*24*15, MinStake, true, 0)
238238
assert.NoError(t, err)
239239
}
240240

241241
func TestStaker_AddValidator_MinimumStakingPeriod(t *testing.T) {
242242
staker, _ := newStaker(t, 101, 101, true)
243243

244-
_, err := staker.AddValidator(datagen.RandAddress(), datagen.RandAddress(), uint32(360)*24*1, minStake, true, 0)
244+
_, err := staker.AddValidator(datagen.RandAddress(), datagen.RandAddress(), uint32(360)*24*1, MinStake, true, 0)
245245
assert.ErrorContains(t, err, "period is out of boundaries")
246-
_, err = staker.AddValidator(datagen.RandAddress(), datagen.RandAddress(), 100, minStake, true, 0)
246+
_, err = staker.AddValidator(datagen.RandAddress(), datagen.RandAddress(), 100, MinStake, true, 0)
247247
assert.ErrorContains(t, err, "period is out of boundaries")
248-
_, err = staker.AddValidator(datagen.RandAddress(), datagen.RandAddress(), uint32(360)*24*15, minStake, true, 0)
248+
_, err = staker.AddValidator(datagen.RandAddress(), datagen.RandAddress(), uint32(360)*24*15, MinStake, true, 0)
249249
assert.NoError(t, err)
250250
}
251251

@@ -859,7 +859,7 @@ func TestStaker_ChangeStakeActiveValidatorWithQueued(t *testing.T) {
859859
func TestStaker_DecreaseActive(t *testing.T) {
860860
staker, _ := newStaker(t, 0, 101, false)
861861
addr := datagen.RandAddress()
862-
stake := maxStake
862+
stake := MaxStake
863863
period := uint32(360) * 24 * 15
864864

865865
// add the validator
@@ -905,7 +905,7 @@ func TestStaker_DecreaseActive(t *testing.T) {
905905
func TestStaker_DecreaseActiveThenExit(t *testing.T) {
906906
staker, _ := newStaker(t, 0, 101, false)
907907
addr := datagen.RandAddress()
908-
stake := maxStake
908+
stake := MaxStake
909909
period := uint32(360) * 24 * 15
910910

911911
// add the validator
@@ -1373,15 +1373,15 @@ func TestStaker_Initialise(t *testing.T) {
13731373
assert.NoError(t, param.Set(thor.KeyMaxBlockProposers, big.NewInt(3)))
13741374

13751375
for range 3 {
1376-
_, err := staker.AddValidator(datagen.RandAddress(), datagen.RandAddress(), uint32(360)*24*15, minStake, true, 0)
1376+
_, err := staker.AddValidator(datagen.RandAddress(), datagen.RandAddress(), uint32(360)*24*15, MinStake, true, 0)
13771377
assert.NoError(t, err)
13781378
}
13791379

13801380
transitioned, err := staker.Transition(0)
13811381
assert.NoError(t, err) // should succeed
13821382
assert.True(t, transitioned)
13831383
// should be able to add validations after initialisation
1384-
_, err = staker.AddValidator(addr, addr, uint32(360)*24*15, minStake, true, 0)
1384+
_, err = staker.AddValidator(addr, addr, uint32(360)*24*15, MinStake, true, 0)
13851385
assert.NoError(t, err)
13861386

13871387
staker, _ = newStaker(t, 101, 101, true)
@@ -1718,7 +1718,7 @@ func TestStaker_Housekeep_RecalculateIncrease(t *testing.T) {
17181718
staker, _ := newStaker(t, 0, 101, false)
17191719
addr1 := datagen.RandAddress()
17201720

1721-
stake := minStake
1721+
stake := MinStake
17221722
period := uint32(360) * 24 * 15
17231723

17241724
// auto renew is turned on
@@ -1756,7 +1756,7 @@ func TestStaker_Housekeep_RecalculateDecrease(t *testing.T) {
17561756
staker, _ := newStaker(t, 0, 101, false)
17571757
addr1 := datagen.RandAddress()
17581758

1759-
stake := maxStake
1759+
stake := MaxStake
17601760
period := uint32(360) * 24 * 15
17611761

17621762
// auto renew is turned on
@@ -1795,7 +1795,7 @@ func TestStaker_Housekeep_DecreaseThenWithdraw(t *testing.T) {
17951795
staker, _ := newStaker(t, 0, 101, false)
17961796
addr1 := datagen.RandAddress()
17971797

1798-
stake := maxStake
1798+
stake := MaxStake
17991799
period := uint32(360) * 24 * 15
18001800

18011801
// auto renew is turned on
@@ -2250,7 +2250,7 @@ func TestStaker_MultipleUpdates_CorrectWithdraw(t *testing.T) {
22502250
func Test_GetValidatorTotals(t *testing.T) {
22512251
staker, validators := newDelegationStaker(t)
22522252

2253-
stake := big.NewInt(0).Set(minStake)
2253+
stake := big.NewInt(0).Set(MinStake)
22542254

22552255
validator := validators[0]
22562256
id1, err := staker.AddDelegation(validator.ID, stake, true, 255)

builtin/staker/storage.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ var (
3939
slotLowStakingPeriod = nameToSlot("staker-low-staking-period")
4040
slotMediumStakingPeriod = nameToSlot("staker-medium-staking-period")
4141
slotHighStakingPeriod = nameToSlot("staker-high-staking-period")
42+
slotCooldownPeriod = nameToSlot("cooldown-period")
43+
slotEpochLength = nameToSlot("epoch-length")
4244
// exit epoch mapping
4345
slotExitEpochs = nameToSlot("exit-epochs")
4446
)

builtin/staker/validations.go

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,9 @@ type validations struct {
3333

3434
func newValidations(storage *storage) *validations {
3535
// debug overrides for testing
36-
storage.debugOverride(&lowStakingPeriod, slotLowStakingPeriod)
37-
storage.debugOverride(&mediumStakingPeriod, slotMediumStakingPeriod)
38-
storage.debugOverride(&highStakingPeriod, slotHighStakingPeriod)
36+
storage.debugOverride(&LowStakingPeriod, slotLowStakingPeriod)
37+
storage.debugOverride(&MediumStakingPeriod, slotMediumStakingPeriod)
38+
storage.debugOverride(&HighStakingPeriod, slotHighStakingPeriod)
3939

4040
return &validations{
4141
storage: storage,
@@ -45,9 +45,9 @@ func newValidations(storage *storage) *validations {
4545
lockedWeight: solidity.NewUint256(storage.Address(), storage.State(), slotLockedWeight),
4646
queuedVET: solidity.NewUint256(storage.Address(), storage.State(), slotQueuedVET),
4747
queuedWeight: solidity.NewUint256(storage.Address(), storage.State(), slotQueuedWeight),
48-
lowStakingPeriod: lowStakingPeriod,
49-
mediumStakingPeriod: mediumStakingPeriod,
50-
highStakingPeriod: highStakingPeriod,
48+
lowStakingPeriod: LowStakingPeriod,
49+
mediumStakingPeriod: MediumStakingPeriod,
50+
highStakingPeriod: HighStakingPeriod,
5151
}
5252
}
5353

@@ -98,7 +98,7 @@ func (v *validations) Add(
9898
autoRenew bool,
9999
currentBlock uint32,
100100
) (thor.Bytes32, error) {
101-
if stake.Cmp(minStake) < 0 || stake.Cmp(maxStake) > 0 {
101+
if stake.Cmp(MinStake) < 0 || stake.Cmp(MaxStake) > 0 {
102102
return thor.Bytes32{}, errors.New("stake is out of range")
103103
}
104104
lookup, err := v.storage.GetLookup(node)
@@ -328,7 +328,7 @@ func (v *validations) IncreaseStake(id thor.Bytes32, endorsor thor.Address, amou
328328
nextPeriodTVL := entry.NextPeriodStakes(aggregation)
329329
newTVL := big.NewInt(0).Add(nextPeriodTVL, amount)
330330

331-
if newTVL.Cmp(maxStake) > 0 {
331+
if newTVL.Cmp(MaxStake) > 0 {
332332
return errors.New("stake is out of range")
333333
}
334334

@@ -362,7 +362,7 @@ func (v *validations) DecreaseStake(id thor.Bytes32, endorsor thor.Address, amou
362362
}
363363
newStake := big.NewInt(0).Add(entry.LockedVET, entry.PendingLocked)
364364
newStake = newStake.Sub(newStake, amount)
365-
if newStake.Cmp(minStake) < 0 {
365+
if newStake.Cmp(MinStake) < 0 {
366366
return errors.New("stake is too low for validator")
367367
}
368368
aggregation, err := v.storage.GetAggregation(id)

0 commit comments

Comments
 (0)