mirror of
https://github.com/0glabs/0g-chain.git
synced 2024-12-24 15:25:18 +00:00
This commit is contained in:
parent
1602c96a40
commit
605a71e826
@ -22,7 +22,6 @@ struct CommissionRates {
|
||||
uint maxChangeRate; // 18 decimals
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @dev Commission defines the commission parameters.
|
||||
*/
|
||||
@ -207,7 +206,7 @@ interface IStaking {
|
||||
function delegate(
|
||||
string memory validatorAddress,
|
||||
uint amount // in bond denom
|
||||
) external returns (bool success);
|
||||
) external;
|
||||
|
||||
/**
|
||||
* @dev BeginRedelegate defines a method for performing a redelegationA
|
||||
|
@ -142,13 +142,7 @@
|
||||
}
|
||||
],
|
||||
"name": "delegate",
|
||||
"outputs": [
|
||||
{
|
||||
"internalType": "bool",
|
||||
"name": "success",
|
||||
"type": "bool"
|
||||
}
|
||||
],
|
||||
"outputs": [],
|
||||
"stateMutability": "nonpayable",
|
||||
"type": "function"
|
||||
},
|
||||
|
File diff suppressed because one or more lines are too long
@ -103,6 +103,8 @@ func (suite *StakingTestSuite) setupValidator(signer *testutil.TestSigner) {
|
||||
suite.Assert().NoError(err)
|
||||
_, err = suite.runTx(input, signer, 10000000)
|
||||
suite.Assert().NoError(err)
|
||||
_, err = suite.stakingKeeper.ApplyAndReturnValidatorSetUpdates(suite.Ctx)
|
||||
suite.Assert().NoError(err)
|
||||
}
|
||||
|
||||
func (suite *StakingTestSuite) firstBondedValidator() (sdk.ValAddress, error) {
|
||||
|
@ -2,6 +2,7 @@ package staking
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"math/big"
|
||||
|
||||
precopmiles_common "github.com/0glabs/0g-chain/precompiles/common"
|
||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||
@ -103,12 +104,12 @@ func (s *StakingPrecompile) BeginRedelegate(
|
||||
return nil, fmt.Errorf(precopmiles_common.ErrSenderNotOrigin)
|
||||
}
|
||||
// execute
|
||||
_, err = stakingkeeper.NewMsgServerImpl(s.stakingKeeper).BeginRedelegate(ctx, msg)
|
||||
response, err := stakingkeeper.NewMsgServerImpl(s.stakingKeeper).BeginRedelegate(ctx, msg)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
// emit events
|
||||
return method.Outputs.Pack()
|
||||
return method.Outputs.Pack(big.NewInt(response.CompletionTime.UTC().Unix()))
|
||||
}
|
||||
|
||||
func (s *StakingPrecompile) Undelegate(
|
||||
@ -128,12 +129,12 @@ func (s *StakingPrecompile) Undelegate(
|
||||
return nil, fmt.Errorf(precopmiles_common.ErrSenderNotOrigin)
|
||||
}
|
||||
// execute
|
||||
_, err = stakingkeeper.NewMsgServerImpl(s.stakingKeeper).Undelegate(ctx, msg)
|
||||
response, err := stakingkeeper.NewMsgServerImpl(s.stakingKeeper).Undelegate(ctx, msg)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
// emit events
|
||||
return method.Outputs.Pack()
|
||||
return method.Outputs.Pack(big.NewInt(response.CompletionTime.UTC().Unix()))
|
||||
}
|
||||
|
||||
func (s *StakingPrecompile) CancelUnbondingDelegation(
|
||||
|
@ -3,10 +3,13 @@ package staking_test
|
||||
import (
|
||||
"encoding/base64"
|
||||
"math/big"
|
||||
"time"
|
||||
|
||||
"cosmossdk.io/math"
|
||||
stakingprecompile "github.com/0glabs/0g-chain/precompiles/staking"
|
||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||
"github.com/ethereum/go-ethereum/common"
|
||||
"github.com/evmos/ethermint/x/evm/statedb"
|
||||
)
|
||||
|
||||
func (s *StakingTestSuite) TestCreateValidator() {
|
||||
@ -83,6 +86,7 @@ func (s *StakingTestSuite) TestCreateValidator() {
|
||||
s.SetupTest()
|
||||
|
||||
bz, err := s.runTx(tc.malleate(), s.signerOne, 10000000)
|
||||
s.stakingKeeper.ApplyAndReturnValidatorSetUpdates(s.Ctx)
|
||||
|
||||
if tc.expError {
|
||||
s.Require().ErrorContains(err, tc.errContains)
|
||||
@ -97,7 +101,7 @@ func (s *StakingTestSuite) TestCreateValidator() {
|
||||
tc.postCheck(bz)
|
||||
|
||||
isBonded := validator.IsBonded()
|
||||
s.Require().Equal(false, isBonded, "expected validator bonded to be %t; got %t", false, isBonded)
|
||||
s.Require().Equal(true, isBonded, "expected validator bonded to be %t; got %t", true, isBonded)
|
||||
|
||||
consPubKey, err := validator.ConsPubKey()
|
||||
s.Require().NoError(err)
|
||||
@ -122,3 +126,360 @@ func (s *StakingTestSuite) TestCreateValidator() {
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func (s *StakingTestSuite) TestEditValidator() {
|
||||
method := stakingprecompile.StakingFunctionEditValidator
|
||||
description := stakingprecompile.Description{
|
||||
Moniker: "test node",
|
||||
Identity: "test node identity",
|
||||
Website: "http://test.node.com",
|
||||
SecurityContact: "test node security contract",
|
||||
Details: "test node details",
|
||||
}
|
||||
newRate := math.LegacyOneDec().BigInt()
|
||||
newRate.Div(newRate, big.NewInt(2))
|
||||
minSelfDelegation := big.NewInt(2)
|
||||
|
||||
testCases := []struct {
|
||||
name string
|
||||
malleate func() []byte
|
||||
gas uint64
|
||||
callerAddress *common.Address
|
||||
postCheck func(data []byte)
|
||||
expError bool
|
||||
errContains string
|
||||
}{
|
||||
{
|
||||
"success",
|
||||
func() []byte {
|
||||
input, err := s.abi.Pack(
|
||||
method,
|
||||
description,
|
||||
stakingprecompile.NullableUint{
|
||||
IsNull: false,
|
||||
Value: newRate,
|
||||
},
|
||||
stakingprecompile.NullableUint{
|
||||
IsNull: true,
|
||||
Value: math.LegacyOneDec().BigInt(),
|
||||
},
|
||||
)
|
||||
s.Assert().NoError(err)
|
||||
return input
|
||||
},
|
||||
200000,
|
||||
nil,
|
||||
func(data []byte) {},
|
||||
false,
|
||||
"",
|
||||
},
|
||||
}
|
||||
|
||||
for _, tc := range testCases {
|
||||
s.Run(tc.name, func() {
|
||||
s.SetupTest()
|
||||
s.setupValidator(s.signerOne)
|
||||
// move block time forward
|
||||
s.Ctx = s.Ctx.WithBlockTime(time.Now().Add(time.Hour * 100))
|
||||
s.Statedb = statedb.New(s.Ctx, s.EvmKeeper, statedb.NewEmptyTxConfig(common.BytesToHash(s.Ctx.HeaderHash().Bytes())))
|
||||
|
||||
bz, err := s.runTx(tc.malleate(), s.signerOne, 10000000)
|
||||
|
||||
if tc.expError {
|
||||
s.Require().ErrorContains(err, tc.errContains)
|
||||
s.Require().Empty(bz)
|
||||
} else {
|
||||
s.Require().NoError(err)
|
||||
// query the validator in the staking keeper
|
||||
validator := s.StakingKeeper.Validator(s.Ctx, s.signerOne.ValAddr)
|
||||
s.Require().NoError(err)
|
||||
|
||||
s.Require().NotNil(validator, "expected validator not to be nil")
|
||||
tc.postCheck(bz)
|
||||
|
||||
isBonded := validator.IsBonded()
|
||||
s.Require().Equal(true, isBonded, "expected validator bonded to be %t; got %t", false, isBonded)
|
||||
|
||||
operator := validator.GetOperator()
|
||||
s.Require().Equal(s.signerOne.ValAddr, operator, "expected validator operator to be %s; got %s", s.signerOne.ValAddr, operator)
|
||||
|
||||
commissionRate := validator.GetCommission()
|
||||
s.Require().Equal(newRate.String(), commissionRate.BigInt().String(), "expected validator commission rate to be %s; got %s", newRate.String(), commissionRate.String())
|
||||
|
||||
valMinSelfDelegation := validator.GetMinSelfDelegation()
|
||||
s.Require().Equal(big.NewInt(1).String(), valMinSelfDelegation.String(), "expected validator min self delegation to be %s; got %s", minSelfDelegation.String(), valMinSelfDelegation.String())
|
||||
|
||||
moniker := validator.GetMoniker()
|
||||
s.Require().Equal(description.Moniker, moniker, "expected validator moniker to be %s; got %s", description.Moniker, moniker)
|
||||
|
||||
jailed := validator.IsJailed()
|
||||
s.Require().Equal(false, jailed, "expected validator jailed to be %t; got %t", false, jailed)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func (s *StakingTestSuite) TestDelegate() {
|
||||
method := stakingprecompile.StakingFunctionDelegate
|
||||
|
||||
testCases := []struct {
|
||||
name string
|
||||
malleate func(valAddr string) []byte
|
||||
gas uint64
|
||||
callerAddress *common.Address
|
||||
postCheck func(valAddr sdk.ValAddress)
|
||||
expError bool
|
||||
errContains string
|
||||
}{
|
||||
{
|
||||
"success",
|
||||
func(valAddr string) []byte {
|
||||
input, err := s.abi.Pack(
|
||||
method,
|
||||
valAddr,
|
||||
big.NewInt(1000000),
|
||||
)
|
||||
s.Assert().NoError(err)
|
||||
return input
|
||||
},
|
||||
200000,
|
||||
nil,
|
||||
func(valAddr sdk.ValAddress) {
|
||||
d, found := s.stakingKeeper.GetDelegation(s.Ctx, s.signerOne.AccAddr, valAddr)
|
||||
s.Assert().EqualValues(found, true)
|
||||
s.Assert().EqualValues(d.ValidatorAddress, valAddr.String())
|
||||
s.Assert().EqualValues(d.DelegatorAddress, s.signerOne.AccAddr.String())
|
||||
|
||||
// jsonData, _ := json.MarshalIndent(d, "", " ")
|
||||
// fmt.Printf("delegation: %s\n", string(jsonData))
|
||||
},
|
||||
false,
|
||||
"",
|
||||
},
|
||||
}
|
||||
|
||||
for _, tc := range testCases {
|
||||
s.Run(tc.name, func() {
|
||||
s.SetupTest()
|
||||
|
||||
operatorAddress, err := s.firstBondedValidator()
|
||||
s.Require().NoError(err)
|
||||
|
||||
bz, err := s.runTx(tc.malleate(operatorAddress.String()), s.signerOne, 10000000)
|
||||
|
||||
if tc.expError {
|
||||
s.Require().ErrorContains(err, tc.errContains)
|
||||
s.Require().Empty(bz)
|
||||
} else {
|
||||
s.Require().NoError(err)
|
||||
tc.postCheck(operatorAddress)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func (s *StakingTestSuite) TestBeginRedelegate() {
|
||||
method := stakingprecompile.StakingFunctionBeginRedelegate
|
||||
|
||||
testCases := []struct {
|
||||
name string
|
||||
malleate func(srcAddr, dstAddr string) []byte
|
||||
gas uint64
|
||||
callerAddress *common.Address
|
||||
postCheck func(data []byte, srcAddr, dstAddr sdk.ValAddress)
|
||||
expError bool
|
||||
errContains string
|
||||
}{
|
||||
{
|
||||
"success",
|
||||
func(srcAddr, dstAddr string) []byte {
|
||||
input, err := s.abi.Pack(
|
||||
method,
|
||||
srcAddr,
|
||||
dstAddr,
|
||||
big.NewInt(1000000),
|
||||
)
|
||||
s.Assert().NoError(err)
|
||||
return input
|
||||
},
|
||||
200000,
|
||||
nil,
|
||||
func(data []byte, srcAddr, dstAddr sdk.ValAddress) {
|
||||
out, err := s.abi.Methods[method].Outputs.Unpack(data)
|
||||
s.Require().NoError(err, "failed to unpack output")
|
||||
|
||||
d, found := s.stakingKeeper.GetRedelegation(s.Ctx, s.signerOne.AccAddr, srcAddr, dstAddr)
|
||||
s.Assert().EqualValues(found, true)
|
||||
s.Assert().EqualValues(d.DelegatorAddress, s.signerOne.AccAddr.String())
|
||||
s.Assert().EqualValues(d.ValidatorSrcAddress, srcAddr.String())
|
||||
s.Assert().EqualValues(d.ValidatorDstAddress, dstAddr.String())
|
||||
|
||||
completionTime := out[0].(*big.Int)
|
||||
params := s.stakingKeeper.GetParams(s.Ctx)
|
||||
s.Assert().EqualValues(completionTime.Int64(), s.Ctx.BlockHeader().Time.Add(params.UnbondingTime).UTC().Unix())
|
||||
// jsonData, _ := json.MarshalIndent(d, "", " ")
|
||||
// fmt.Printf("redelegation: %s\n", string(jsonData))
|
||||
},
|
||||
false,
|
||||
"",
|
||||
},
|
||||
}
|
||||
|
||||
for _, tc := range testCases {
|
||||
s.Run(tc.name, func() {
|
||||
s.SetupTest()
|
||||
operatorAddress, err := s.firstBondedValidator()
|
||||
s.Require().NoError(err)
|
||||
|
||||
// move block time forward
|
||||
s.Ctx = s.Ctx.WithBlockTime(time.Now().Add(time.Hour * 100))
|
||||
s.Statedb = statedb.New(s.Ctx, s.EvmKeeper, statedb.NewEmptyTxConfig(common.BytesToHash(s.Ctx.HeaderHash().Bytes())))
|
||||
|
||||
s.setupValidator(s.signerOne)
|
||||
|
||||
bz, err := s.runTx(tc.malleate(s.signerOne.ValAddr.String(), operatorAddress.String()), s.signerOne, 10000000)
|
||||
|
||||
if tc.expError {
|
||||
s.Require().ErrorContains(err, tc.errContains)
|
||||
s.Require().Empty(bz)
|
||||
} else {
|
||||
s.Require().NoError(err)
|
||||
tc.postCheck(bz, s.signerOne.ValAddr, operatorAddress)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func (s *StakingTestSuite) TestUndelegate() {
|
||||
method := stakingprecompile.StakingFunctionUndelegate
|
||||
|
||||
testCases := []struct {
|
||||
name string
|
||||
malleate func(valAddr string) []byte
|
||||
gas uint64
|
||||
callerAddress *common.Address
|
||||
postCheck func(data []byte, valAddr sdk.ValAddress)
|
||||
expError bool
|
||||
errContains string
|
||||
}{
|
||||
{
|
||||
"success",
|
||||
func(valAddr string) []byte {
|
||||
input, err := s.abi.Pack(
|
||||
method,
|
||||
valAddr,
|
||||
big.NewInt(1000000),
|
||||
)
|
||||
s.Assert().NoError(err)
|
||||
return input
|
||||
},
|
||||
200000,
|
||||
nil,
|
||||
func(data []byte, valAddr sdk.ValAddress) {
|
||||
out, err := s.abi.Methods[method].Outputs.Unpack(data)
|
||||
s.Require().NoError(err, "failed to unpack output")
|
||||
|
||||
d, found := s.stakingKeeper.GetUnbondingDelegation(s.Ctx, s.signerOne.AccAddr, valAddr)
|
||||
s.Assert().EqualValues(found, true)
|
||||
s.Assert().EqualValues(d.DelegatorAddress, s.signerOne.AccAddr.String())
|
||||
s.Assert().EqualValues(d.ValidatorAddress, valAddr.String())
|
||||
|
||||
completionTime := out[0].(*big.Int)
|
||||
params := s.stakingKeeper.GetParams(s.Ctx)
|
||||
s.Assert().EqualValues(completionTime.Int64(), s.Ctx.BlockHeader().Time.Add(params.UnbondingTime).UTC().Unix())
|
||||
// jsonData, _ := json.MarshalIndent(d, "", " ")
|
||||
// fmt.Printf("redelegation: %s\n", string(jsonData))
|
||||
},
|
||||
false,
|
||||
"",
|
||||
},
|
||||
}
|
||||
|
||||
for _, tc := range testCases {
|
||||
s.Run(tc.name, func() {
|
||||
s.SetupTest()
|
||||
|
||||
// move block time forward
|
||||
s.Ctx = s.Ctx.WithBlockTime(time.Now().Add(time.Hour * 100))
|
||||
s.Statedb = statedb.New(s.Ctx, s.EvmKeeper, statedb.NewEmptyTxConfig(common.BytesToHash(s.Ctx.HeaderHash().Bytes())))
|
||||
|
||||
s.setupValidator(s.signerOne)
|
||||
|
||||
bz, err := s.runTx(tc.malleate(s.signerOne.ValAddr.String()), s.signerOne, 10000000)
|
||||
|
||||
if tc.expError {
|
||||
s.Require().ErrorContains(err, tc.errContains)
|
||||
s.Require().Empty(bz)
|
||||
} else {
|
||||
s.Require().NoError(err)
|
||||
tc.postCheck(bz, s.signerOne.ValAddr)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func (s *StakingTestSuite) TestCancelUnbondingDelegation() {
|
||||
method := stakingprecompile.StakingFunctionCancelUnbondingDelegation
|
||||
|
||||
testCases := []struct {
|
||||
name string
|
||||
malleate func(valAddr string, height *big.Int) []byte
|
||||
gas uint64
|
||||
callerAddress *common.Address
|
||||
postCheck func(valAddr sdk.ValAddress)
|
||||
expError bool
|
||||
errContains string
|
||||
}{
|
||||
{
|
||||
"success",
|
||||
func(valAddr string, height *big.Int) []byte {
|
||||
input, err := s.abi.Pack(
|
||||
method,
|
||||
valAddr,
|
||||
big.NewInt(1),
|
||||
height,
|
||||
)
|
||||
s.Assert().NoError(err)
|
||||
return input
|
||||
},
|
||||
200000,
|
||||
nil,
|
||||
func(valAddr sdk.ValAddress) {
|
||||
_, found := s.stakingKeeper.GetUnbondingDelegation(s.Ctx, s.signerOne.AccAddr, valAddr)
|
||||
s.Assert().EqualValues(found, false)
|
||||
// jsonData, _ := json.MarshalIndent(d, "", " ")
|
||||
// fmt.Printf("redelegation: %s\n", string(jsonData))
|
||||
},
|
||||
false,
|
||||
"",
|
||||
},
|
||||
}
|
||||
|
||||
for _, tc := range testCases {
|
||||
s.Run(tc.name, func() {
|
||||
s.SetupTest()
|
||||
|
||||
// move block time forward
|
||||
s.Ctx = s.Ctx.WithBlockTime(time.Now().Add(time.Hour * 100))
|
||||
s.Statedb = statedb.New(s.Ctx, s.EvmKeeper, statedb.NewEmptyTxConfig(common.BytesToHash(s.Ctx.HeaderHash().Bytes())))
|
||||
|
||||
s.setupValidator(s.signerOne)
|
||||
// unbond
|
||||
_, err := s.stakingKeeper.Undelegate(s.Ctx, s.signerOne.AccAddr, s.signerOne.ValAddr, sdk.NewDec(1))
|
||||
s.Require().NoError(err)
|
||||
|
||||
u, _ := s.stakingKeeper.GetUnbondingDelegation(s.Ctx, s.signerOne.AccAddr, s.signerOne.ValAddr)
|
||||
height := u.Entries[0].CreationHeight
|
||||
|
||||
bz, err := s.runTx(tc.malleate(s.signerOne.ValAddr.String(), big.NewInt(height)), s.signerOne, 10000000)
|
||||
|
||||
if tc.expError {
|
||||
s.Require().ErrorContains(err, tc.errContains)
|
||||
s.Require().Empty(bz)
|
||||
} else {
|
||||
s.Require().NoError(err)
|
||||
tc.postCheck(s.signerOne.ValAddr)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
@ -335,7 +335,7 @@ func NewMsgCreateValidator(args []interface{}, sender common.Address, denom stri
|
||||
}
|
||||
|
||||
value := args[4].(*big.Int)
|
||||
return &stakingtypes.MsgCreateValidator{
|
||||
msg := &stakingtypes.MsgCreateValidator{
|
||||
Description: convertStakingDescription(description),
|
||||
Commission: convertStakingCommissionRates(commission),
|
||||
MinSelfDelegation: math.NewIntFromBigInt(minSelfDelegation),
|
||||
@ -343,7 +343,8 @@ func NewMsgCreateValidator(args []interface{}, sender common.Address, denom stri
|
||||
ValidatorAddress: sdk.ValAddress(sender.Bytes()).String(),
|
||||
Pubkey: pkAny,
|
||||
Value: sdk.Coin{Denom: denom, Amount: math.NewIntFromBigInt(value)},
|
||||
}, nil
|
||||
}
|
||||
return msg, msg.ValidateBasic()
|
||||
}
|
||||
|
||||
func NewMsgEditValidator(args []interface{}, sender common.Address) (*stakingtypes.MsgEditValidator, error) {
|
||||
@ -366,12 +367,13 @@ func NewMsgEditValidator(args []interface{}, sender common.Address) (*stakingtyp
|
||||
minSelfDelegation = &value
|
||||
}
|
||||
|
||||
return &stakingtypes.MsgEditValidator{
|
||||
msg := &stakingtypes.MsgEditValidator{
|
||||
Description: convertStakingDescription(description),
|
||||
CommissionRate: commissionRate,
|
||||
ValidatorAddress: sdk.ValAddress(sender.Bytes()).String(),
|
||||
MinSelfDelegation: minSelfDelegation,
|
||||
}, nil
|
||||
}
|
||||
return msg, msg.ValidateBasic()
|
||||
}
|
||||
|
||||
func NewMsgDelegate(args []interface{}, sender common.Address, denom string) (*stakingtypes.MsgDelegate, error) {
|
||||
@ -381,11 +383,12 @@ func NewMsgDelegate(args []interface{}, sender common.Address, denom string) (*s
|
||||
validatorAddress := args[0].(string)
|
||||
amount := args[1].(*big.Int)
|
||||
|
||||
return &stakingtypes.MsgDelegate{
|
||||
msg := &stakingtypes.MsgDelegate{
|
||||
DelegatorAddress: sdk.AccAddress(sender.Bytes()).String(),
|
||||
ValidatorAddress: validatorAddress,
|
||||
Amount: sdk.Coin{Denom: denom, Amount: math.NewIntFromBigInt(amount)},
|
||||
}, nil
|
||||
}
|
||||
return msg, msg.ValidateBasic()
|
||||
}
|
||||
|
||||
func NewMsgBeginRedelegate(args []interface{}, sender common.Address, denom string) (*stakingtypes.MsgBeginRedelegate, error) {
|
||||
@ -396,12 +399,13 @@ func NewMsgBeginRedelegate(args []interface{}, sender common.Address, denom stri
|
||||
validatorDstAddress := args[1].(string)
|
||||
amount := args[2].(*big.Int)
|
||||
|
||||
return &stakingtypes.MsgBeginRedelegate{
|
||||
msg := &stakingtypes.MsgBeginRedelegate{
|
||||
DelegatorAddress: sdk.AccAddress(sender.Bytes()).String(),
|
||||
ValidatorSrcAddress: validatorSrcAddress,
|
||||
ValidatorDstAddress: validatorDstAddress,
|
||||
Amount: sdk.Coin{Denom: denom, Amount: math.NewIntFromBigInt(amount)},
|
||||
}, nil
|
||||
}
|
||||
return msg, msg.ValidateBasic()
|
||||
}
|
||||
|
||||
func NewMsgUndelegate(args []interface{}, sender common.Address, denom string) (*stakingtypes.MsgUndelegate, error) {
|
||||
@ -411,11 +415,12 @@ func NewMsgUndelegate(args []interface{}, sender common.Address, denom string) (
|
||||
validatorAddress := args[0].(string)
|
||||
amount := args[1].(*big.Int)
|
||||
|
||||
return &stakingtypes.MsgUndelegate{
|
||||
msg := &stakingtypes.MsgUndelegate{
|
||||
DelegatorAddress: sdk.AccAddress(sender.Bytes()).String(),
|
||||
ValidatorAddress: validatorAddress,
|
||||
Amount: sdk.Coin{Denom: denom, Amount: math.NewIntFromBigInt(amount)},
|
||||
}, nil
|
||||
}
|
||||
return msg, msg.ValidateBasic()
|
||||
}
|
||||
|
||||
func NewMsgCancelUnbondingDelegation(args []interface{}, sender common.Address, denom string) (*stakingtypes.MsgCancelUnbondingDelegation, error) {
|
||||
@ -426,12 +431,13 @@ func NewMsgCancelUnbondingDelegation(args []interface{}, sender common.Address,
|
||||
amount := args[1].(*big.Int)
|
||||
creationHeight := args[2].(*big.Int)
|
||||
|
||||
return &stakingtypes.MsgCancelUnbondingDelegation{
|
||||
msg := &stakingtypes.MsgCancelUnbondingDelegation{
|
||||
DelegatorAddress: sdk.AccAddress(sender.Bytes()).String(),
|
||||
ValidatorAddress: validatorAddress,
|
||||
Amount: sdk.Coin{Denom: denom, Amount: math.NewIntFromBigInt(amount)},
|
||||
CreationHeight: creationHeight.Int64(),
|
||||
}, nil
|
||||
}
|
||||
return msg, msg.ValidateBasic()
|
||||
}
|
||||
|
||||
func NewQueryValidatorsRequest(args []interface{}) (*stakingtypes.QueryValidatorsRequest, error) {
|
||||
|
@ -3,6 +3,7 @@ package testutil
|
||||
import (
|
||||
"math/big"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/0glabs/0g-chain/app"
|
||||
"github.com/0glabs/0g-chain/chaincfg"
|
||||
@ -81,7 +82,7 @@ func (suite *PrecompileTestSuite) SetupTest() {
|
||||
hexAddr := strings.ToLower(crypto.PubkeyToAddress(key.PublicKey).Hex()[2:])
|
||||
valAddr, err := sdk.ValAddressFromHex(hexAddr)
|
||||
suite.Assert().NoError(err)
|
||||
suite.Ctx = suite.App.NewContext(true, tmproto.Header{Height: 1, ChainID: app.TestChainId, ProposerAddress: consAddress})
|
||||
suite.Ctx = suite.App.NewContext(true, tmproto.Header{Height: 1, ChainID: app.TestChainId, ProposerAddress: consAddress, Time: time.Now()})
|
||||
newValidator, err := stakingtypes.NewValidator(valAddr, privkey.PubKey(), stakingtypes.Description{})
|
||||
suite.Assert().NoError(err)
|
||||
err = suite.StakingKeeper.SetValidatorByConsAddr(suite.Ctx, newValidator)
|
||||
|
Loading…
Reference in New Issue
Block a user