Skip to content

Commit 7c638e5

Browse files
Fix overflow issue, add tests (#1456)
1 parent bd7757e commit 7c638e5

File tree

11 files changed

+115
-21
lines changed

11 files changed

+115
-21
lines changed

‎builtin/gen/compiled/Staker.bin-runtime‎

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

‎builtin/gen/staker.sol‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -295,6 +295,7 @@ contract Staker {
295295
modifier checkStake(uint256 amount) {
296296
require(amount > 0, "staker: stake is empty");
297297
require(amount % 1e18 == 0, "staker: stake is not multiple of 1VET");
298+
require(amount <= 100_000_000_000*1e18, "staker: stake is above max supply");
298299
_;
299300
}
300301

‎builtin/native_calls_test.go‎

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1690,6 +1690,19 @@ func TestStakerContract_Native_Revert(t *testing.T) {
16901690
assert.NoError(t, err)
16911691
assert.True(t, receipt.Reverted)
16921692

1693+
decreaseStakeArgs = []any{genesis.DevAccounts()[2].Address, big.NewInt(0).Mul(big.NewInt(0).SetUint64(math.MaxUint64), big.NewInt(1e18))}
1694+
desc = TestTxDescription{
1695+
t: t,
1696+
abi: abi,
1697+
methodName: "decreaseStake",
1698+
address: toAddr,
1699+
acc: genesis.DevAccounts()[2],
1700+
args: decreaseStakeArgs,
1701+
}
1702+
receipt, _, err = executeTxAndGetReceipt(desc)
1703+
assert.NoError(t, err)
1704+
assert.True(t, receipt.Reverted)
1705+
16931706
// update delegator auto renew
16941707
updateDelegatorAutoRenewArgs := []any{big.NewInt(0)}
16951708
desc = TestTxDescription{

‎builtin/staker/housekeep.go‎

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -310,7 +310,10 @@ func (s *Staker) ContractBalanceCheck(pendingWithdraw uint64) error {
310310
if err != nil {
311311
return err
312312
}
313-
balanceVET := ToVET(balance)
313+
balanceVET, err := ToVET(balance)
314+
if err != nil {
315+
return err
316+
}
314317

315318
// Get the Effective VET tracked
316319
effectiveVET, err := s.GetEffectiveVET()

‎builtin/staker/protocol.go‎

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,22 @@ func (s *Staker) SyncPOS(forkConfig *thor.ForkConfig, current uint32) (Status, e
6060
return status, nil
6161
}
6262

63-
func ToVET(wei *big.Int) uint64 {
64-
return new(big.Int).Div(wei, bigE18).Uint64()
63+
func ToVET(wei *big.Int) (uint64, error) {
64+
if wei == nil {
65+
return 0, fmt.Errorf("wei amount cannot be nil")
66+
}
67+
68+
if wei.Sign() < 0 {
69+
return 0, fmt.Errorf("wei amount cannot be negative")
70+
}
71+
72+
result := new(big.Int).Div(wei, bigE18)
73+
74+
if !result.IsUint64() {
75+
return 0, fmt.Errorf("wei amount too large")
76+
}
77+
78+
return result.Uint64(), nil
6579
}
6680

6781
func ToWei(vet uint64) *big.Int {

‎builtin/staker/protocol_test.go‎

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
package staker
88

99
import (
10+
"math"
1011
"math/big"
1112
"testing"
1213

@@ -401,3 +402,27 @@ func TestSyncPOS_NegativeCases(t *testing.T) {
401402
_, err = staker.SyncPOS(forkConfig, current)
402403
require.Error(t, err)
403404
}
405+
406+
func TestToVET(t *testing.T) {
407+
weiValue := big.NewInt(-1)
408+
_, err := ToVET(weiValue)
409+
assert.ErrorContains(t, err, "wei amount cannot be negative")
410+
411+
_, err = ToVET(nil)
412+
assert.ErrorContains(t, err, "wei amount cannot be nil")
413+
414+
weiValue = big.NewInt(0).SetUint64(math.MaxUint64)
415+
vetValue, err := ToVET(weiValue)
416+
assert.NoError(t, err)
417+
assert.Equal(t, uint64(math.MaxUint64)/1e18, vetValue)
418+
419+
weiValue = big.NewInt(0).SetUint64(math.MaxUint64)
420+
weiValue = big.NewInt(0).Mul(weiValue, big.NewInt(1e18))
421+
vetValue, err = ToVET(weiValue)
422+
assert.NoError(t, err)
423+
assert.Equal(t, uint64(math.MaxUint64), vetValue)
424+
425+
weiValue = big.NewInt(0).Add(weiValue, big.NewInt(1e18))
426+
_, err = ToVET(weiValue)
427+
assert.ErrorContains(t, err, "wei amount too large")
428+
}

‎builtin/staker/staker.go‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -777,5 +777,5 @@ func (s *Staker) GetEffectiveVET() (uint64, error) {
777777
return 0, err
778778
}
779779

780-
return ToVET(new(big.Int).SetBytes(val.Bytes())), nil
780+
return ToVET(new(big.Int).SetBytes(val.Bytes()))
781781
}

‎builtin/staker_native.go‎

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -198,12 +198,17 @@ func init() {
198198
}
199199
}
200200

201+
stake, err := staker.ToVET(args.Stake) // convert from wei to VET
202+
if err != nil {
203+
return nil, staker.NewReverts(err.Error())
204+
}
205+
201206
err = Staker.NativeMetered(env.State(), charger).
202207
AddValidation(
203208
val,
204209
end,
205210
args.Period,
206-
staker.ToVET(args.Stake), // convert from wei to VET
211+
stake,
207212
)
208213
if err != nil {
209214
return nil, err
@@ -239,11 +244,16 @@ func init() {
239244
env.ParseArgs(&args)
240245
charger := gascharger.New(env)
241246

242-
err := Staker.NativeMetered(env.State(), charger).
247+
stake, err := staker.ToVET(args.Amount) // convert from wei to VET
248+
if err != nil {
249+
return nil, staker.NewReverts(err.Error())
250+
}
251+
252+
err = Staker.NativeMetered(env.State(), charger).
243253
IncreaseStake(
244254
thor.Address(args.Validator),
245255
thor.Address(args.Endorser),
246-
staker.ToVET(args.Amount), // convert from wei to VET
256+
stake,
247257
)
248258
if err != nil {
249259
return nil, err
@@ -280,11 +290,16 @@ func init() {
280290
env.ParseArgs(&args)
281291
charger := gascharger.New(env)
282292

283-
err := Staker.NativeMetered(env.State(), charger).
293+
stake, err := staker.ToVET(args.Amount) // convert from wei to VET
294+
if err != nil {
295+
return nil, staker.NewReverts(err.Error())
296+
}
297+
298+
err = Staker.NativeMetered(env.State(), charger).
284299
DecreaseStake(
285300
thor.Address(args.Validator),
286301
thor.Address(args.Endorser),
287-
staker.ToVET(args.Amount), // convert from wei to VET,
302+
stake,
288303
)
289304
if err != nil {
290305
return nil, err
@@ -300,10 +315,15 @@ func init() {
300315
env.ParseArgs(&args)
301316
charger := gascharger.New(env)
302317

318+
stake, err := staker.ToVET(args.Stake) // convert from wei to VET,
319+
if err != nil {
320+
return nil, staker.NewReverts(err.Error())
321+
}
322+
303323
delegationID, err := Staker.NativeMetered(env.State(), charger).
304324
AddDelegation(
305325
thor.Address(args.Validator),
306-
staker.ToVET(args.Stake), // convert from wei to VET,
326+
stake,
307327
args.Multiplier,
308328
env.BlockContext().Number,
309329
)

‎builtin/staker_native_test.go‎

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -483,20 +483,20 @@ func TestStakerContract_PauseSwitches(t *testing.T) {
483483
test.Case("addValidation", master, thor.LowStakingPeriod()).
484484
Value(minStake).
485485
Caller(endorser).
486-
ShouldUseGas(1860).
486+
ShouldUseGas(1886).
487487
ShouldRevert("staker: staker is paused").
488488
Assert(t)
489489

490490
test.Case("increaseStake", validator1).
491491
Value(minStake).
492492
Caller(endorser).
493-
ShouldUseGas(1749).
493+
ShouldUseGas(1775).
494494
ShouldRevert("staker: staker is paused").
495495
Assert(t)
496496

497497
test.Case("decreaseStake", validator1, minStake).
498498
Caller(endorser).
499-
ShouldUseGas(1796).
499+
ShouldUseGas(1822).
500500
ShouldRevert("staker: staker is paused").
501501
Assert(t)
502502

@@ -516,7 +516,7 @@ func TestStakerContract_PauseSwitches(t *testing.T) {
516516
test.Case("addDelegation", validator1, uint8(100)).
517517
Value(minStake).
518518
Caller(delegator).
519-
ShouldUseGas(3132).
519+
ShouldUseGas(3158).
520520
ShouldRevert("staker: staker is paused").
521521
Assert(t)
522522

@@ -560,18 +560,18 @@ func TestStakerContract_PauseSwitches(t *testing.T) {
560560
test.Case("addValidation", master, thor.LowStakingPeriod()).
561561
Value(minStake).
562562
Caller(endorser).
563-
ShouldUseGas(132571).
563+
ShouldUseGas(132597).
564564
Assert(t)
565565

566566
test.Case("increaseStake", validator1).
567567
Value(minStake).
568568
Caller(endorser).
569-
ShouldUseGas(67189).
569+
ShouldUseGas(67215).
570570
Assert(t)
571571

572572
test.Case("decreaseStake", validator1, minStake).
573573
Caller(endorser).
574-
ShouldUseGas(16344).
574+
ShouldUseGas(16370).
575575
Assert(t)
576576

577577
test.Case("withdrawStake", validator1).
@@ -587,7 +587,7 @@ func TestStakerContract_PauseSwitches(t *testing.T) {
587587
test.Case("addDelegation", validator1, uint8(100)).
588588
Value(minStake).
589589
Caller(delegator).
590-
ShouldUseGas(48922).
590+
ShouldUseGas(48948).
591591
Assert(t)
592592

593593
// cannot add delegation after the signal validation exit

‎consensus/poa_validator_test.go‎

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,14 @@ func TestAuthority_Hayabusa_TransitionPeriod(t *testing.T) {
4545
// check the endorsor balance has reduced
4646
newEndorsorBal, err := getEndorsorBalance(best.Header, setup.chain)
4747
assert.NoError(t, err)
48-
assert.Equal(t, staker.ToVET(newEndorsorBal)+minStake, staker.ToVET(endorsorBal))
48+
49+
expectedEndorserVetBalance, err := staker.ToVET(newEndorsorBal)
50+
assert.NoError(t, err)
51+
expectedEndorserVetBalance = expectedEndorserVetBalance + minStake
52+
53+
endorserVetBalance, err := staker.ToVET(endorsorBal)
54+
assert.NoError(t, err)
55+
assert.Equal(t, expectedEndorserVetBalance, endorserVetBalance)
4956

5057
// check the staker contract has the correct stake
5158
masterStake, err := getMasterStake(setup.chain, blk.Header)

0 commit comments

Comments
 (0)