Skip to content

Commit

Permalink
validator contract tests
Browse files Browse the repository at this point in the history
  • Loading branch information
sasurobert committed Oct 3, 2024
1 parent 174fd05 commit bece3f3
Show file tree
Hide file tree
Showing 3 changed files with 139 additions and 5 deletions.
9 changes: 8 additions & 1 deletion vm/systemSmartContracts/delegation_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -5373,10 +5373,16 @@ func TestDelegationSystemSC_ExecuteRemoveDelegationFromSource(t *testing.T) {
require.Equal(t, vmcommon.UserError, output)
require.Equal(t, eei.returnMessage, "invalid value to undelegate")

vmInput.Arguments[1] = big.NewInt(100).Bytes()
vmInput.Arguments[1] = big.NewInt(50).Bytes()
eei.returnMessage = ""
output = d.Execute(vmInput)
require.Equal(t, vmcommon.Ok, output)

fund, _ := d.getFund(fundKey)
require.Equal(t, fund.Value, big.NewInt(50))

globalFund, _ := d.getGlobalFundData()
require.Equal(t, globalFund.TotalActive, big.NewInt(50))
}

func TestDelegationSystemSC_ExecuteMoveDelegationToDestination(t *testing.T) {
Expand Down Expand Up @@ -5492,4 +5498,5 @@ func TestDelegationSystemSC_ExecuteMoveDelegationToDestination(t *testing.T) {
eei.returnMessage = ""
output = d.Execute(vmInput)
require.Equal(t, vmcommon.Ok, output)

}
12 changes: 8 additions & 4 deletions vm/systemSmartContracts/validator.go
Original file line number Diff line number Diff line change
Expand Up @@ -2220,16 +2220,16 @@ func (v *validatorSC) checkArgsForMoveStakeFromValidatorToValidator(args *vmcomm
v.eei.AddReturnMessage("invalid argument, wanted an address for the first and second argument")
return vmcommon.UserError
}
if !core.IsSmartContractAddress(validatorB) {
v.eei.AddReturnMessage("destination address must be a delegation smart contract")
if !core.IsSmartContractAddress(validatorA) {
v.eei.AddReturnMessage("sender address must be a delegation smart contract")
return vmcommon.UserError
}
if bytes.Equal(validatorA, validatorB) {
v.eei.AddReturnMessage("sender and destination addresses are equal")
return vmcommon.UserError
}
if !core.IsSmartContractAddress(validatorA) {
v.eei.AddReturnMessage("sender address must be a delegation smart contract")
if !core.IsSmartContractAddress(validatorB) {
v.eei.AddReturnMessage("destination address must be a delegation smart contract")
return vmcommon.UserError
}

Expand Down Expand Up @@ -2271,6 +2271,10 @@ func (v *validatorSC) moveStakeFromValidatorToValidator(args *vmcommon.ContractC
}

validatorDataA.TotalStakeValue.Sub(validatorDataA.TotalStakeValue, stakeToMove)
if validatorDataA.TotalStakeValue.Cmp(zero) < 0 {
v.eei.AddReturnMessage("cannot move tokens, not enough active stake")
return vmcommon.UserError
}
if validatorDataA.NumRegistered > 0 && validatorDataA.TotalStakeValue.Cmp(v.minDeposit) < 0 {
v.eei.AddReturnMessage("cannot move tokens, the validator would remain without min deposit, nodes are still active")
return vmcommon.UserError
Expand Down
123 changes: 123 additions & 0 deletions vm/systemSmartContracts/validator_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -5521,3 +5521,126 @@ func callFunctionAndCheckResult(
retCode := asc.Execute(arguments)
assert.Equal(t, expectedCode, retCode)
}

func TestStakingValidatorSC_MoveStakeFromValidatorToValidator(t *testing.T) {
t.Parallel()

enableEpochsHandler := &enableEpochsHandlerMock.EnableEpochsHandlerStub{}
enableEpochsHandler.AddActiveFlags(common.StakingV2Flag, common.DelegationManagerFlag)
argsVMContext := createArgsVMContext()
argsVMContext.InputParser = parsers.NewCallArgsParser()
argsVMContext.EnableEpochsHandler = enableEpochsHandler
eei, _ := NewVMContext(argsVMContext)

argsStaking := createMockStakingScArguments()
argsStaking.EnableEpochsHandler = enableEpochsHandler
argsStaking.Eei = eei
stakingSc, _ := NewStakingSmartContract(argsStaking)
eei.SetSCAddress(vm.StakingSCAddress)
_ = eei.SetSystemSCContainer(&mock.SystemSCContainerStub{GetCalled: func(key []byte) (contract vm.SystemSmartContract, err error) {
return stakingSc, nil
}})

args := createMockArgumentsForValidatorSC()
args.StakingSCConfig = argsStaking.StakingSCConfig
args.EnableEpochsHandler = enableEpochsHandler
args.Eei = eei

v, _ := NewValidatorSmartContract(args)

enableEpochsHandler.RemoveActiveFlags(common.DelegationImprovementsV3Flag)
vmInput := getDefaultVmInputForFunc("moveStakeFromValidatorToValidator", [][]byte{})
output := v.Execute(vmInput)
require.Equal(t, output, vmcommon.UserError)
require.Equal(t, eei.returnMessage, "invalid method to call")

enableEpochsHandler.AddActiveFlags(common.DelegationImprovementsV3Flag)

eei.returnMessage = ""
eei.gasRemaining = 0
v.gasCost.MetaChainSystemSCsCost.UnStakeTokens = 1
output = v.Execute(vmInput)
require.Equal(t, output, vmcommon.OutOfGas)
require.Equal(t, eei.returnMessage, vm.ErrNotEnoughGas.Error())

eei.returnMessage = ""
eei.gasRemaining = 100
output = v.Execute(vmInput)
require.Equal(t, output, vmcommon.UserError)
require.Equal(t, eei.returnMessage, "invalid caller address")

vmInput.CallValue = big.NewInt(100)
vmInput.CallerAddr = v.delegationMgrSCAddress
eei.returnMessage = ""
output = v.Execute(vmInput)
require.Equal(t, output, vmcommon.UserError)
require.Equal(t, eei.returnMessage, "callValue must be 0")

vmInput.CallValue = big.NewInt(0)
eei.returnMessage = ""
output = v.Execute(vmInput)
require.Equal(t, output, vmcommon.UserError)
require.Equal(t, eei.returnMessage, "invalid number of arguments")

eei.returnMessage = ""
vmInput.Arguments = [][]byte{{1}, {2}, {3}}
output = v.Execute(vmInput)
require.Equal(t, output, vmcommon.UserError)
require.Equal(t, eei.returnMessage, "invalid argument, wanted an address for the first and second argument")

vmInput.Arguments[0] = bytes.Repeat([]byte{1}, 32)
vmInput.Arguments[1] = bytes.Repeat([]byte{1}, 32)
eei.returnMessage = ""
output = v.Execute(vmInput)
require.Equal(t, output, vmcommon.UserError)
require.Equal(t, eei.returnMessage, "sender address must be a delegation smart contract")

vmInput.Arguments[0] = vm.FirstDelegationSCAddress
vmInput.Arguments[1] = vm.FirstDelegationSCAddress
eei.returnMessage = ""
output = v.Execute(vmInput)
require.Equal(t, output, vmcommon.UserError)
require.Equal(t, eei.returnMessage, "sender and destination addresses are equal")

vmInput.Arguments[1] = bytes.Repeat([]byte{1}, 32)
eei.returnMessage = ""
output = v.Execute(vmInput)
require.Equal(t, output, vmcommon.UserError)
require.Equal(t, eei.returnMessage, "destination address must be a delegation smart contract")

vmInput.Arguments[1] = createNewAddress(vm.FirstDelegationSCAddress)
eei.returnMessage = ""
output = v.Execute(vmInput)
require.Equal(t, output, vmcommon.UserError)
require.Equal(t, eei.returnMessage, "data was not found under requested key getDelegationManagementData")

_ = saveDelegationManagementData(eei, v.marshalizer, v.delegationMgrSCAddress, &DelegationManagement{MinDelegationAmount: big.NewInt(10)})
eei.returnMessage = ""
output = v.Execute(vmInput)
require.Equal(t, output, vmcommon.UserError)
require.Equal(t, eei.returnMessage, "can not unstake the provided value either because is under the minimum threshold or is not the value left to be unStaked")

vmInput.Arguments[2] = big.NewInt(20).Bytes()
eei.returnMessage = ""
output = v.Execute(vmInput)
require.Equal(t, output, vmcommon.UserError)
require.Equal(t, eei.returnMessage, "cannot move tokens, not enough active stake")

v.minDeposit = big.NewInt(10000)
_ = v.saveRegistrationData(vmInput.Arguments[0], &ValidatorDataV2{TotalStakeValue: big.NewInt(10000), NumRegistered: 10})
eei.returnMessage = ""
output = v.Execute(vmInput)
require.Equal(t, output, vmcommon.UserError)
require.Equal(t, eei.returnMessage, "cannot move tokens, the validator would remain without min deposit, nodes are still active")

_ = v.saveRegistrationData(vmInput.Arguments[0], &ValidatorDataV2{TotalStakeValue: big.NewInt(100000), NumRegistered: 10})
eei.returnMessage = ""
output = v.Execute(vmInput)
require.Equal(t, output, vmcommon.Ok)

validatorA, _ := v.getOrCreateRegistrationData(vmInput.Arguments[0])
validatorB, _ := v.getOrCreateRegistrationData(vmInput.Arguments[1])

require.Equal(t, validatorA.TotalStakeValue, big.NewInt(100000-20))
require.Equal(t, validatorB.TotalStakeValue, big.NewInt(20))
}

0 comments on commit bece3f3

Please sign in to comment.