forked from cerc-io/laconicd-deprecated
rpc, evm: fix eth_coinbase endpoint to return ethereum address of the validator node (#153)
* fix coinbase rpc endpoint to return ethereum address of the validator * update changelog * fix lint * clean code and simplify logic * fix changelog * change request variable name and type * add test * fix proto comments * fix proto comments * Update x/evm/keeper/grpc_query.go * Update x/evm/keeper/grpc_query.go Co-authored-by: Federico Kunze <31522760+fedekunze@users.noreply.github.com>
This commit is contained in:
co-authored by
Federico Kunze
parent
4ca7c43b62
commit
fada59551d
@@ -72,6 +72,42 @@ func (k Keeper) CosmosAccount(c context.Context, req *types.QueryCosmosAccountRe
|
||||
return &res, nil
|
||||
}
|
||||
|
||||
func (k Keeper) ValidatorAccount(c context.Context, req *types.QueryValidatorAccountRequest) (*types.QueryValidatorAccountResponse, error) {
|
||||
if req == nil {
|
||||
return nil, status.Error(codes.InvalidArgument, "empty request")
|
||||
}
|
||||
|
||||
consAddr, err := sdk.ConsAddressFromBech32(req.ConsAddress)
|
||||
if err != nil {
|
||||
return nil, status.Error(
|
||||
codes.InvalidArgument, err.Error(),
|
||||
)
|
||||
}
|
||||
|
||||
ctx := sdk.UnwrapSDKContext(c)
|
||||
k.WithContext(ctx)
|
||||
|
||||
validator, found := k.stakingKeeper.GetValidatorByConsAddr(ctx, consAddr)
|
||||
if !found {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
accAddr := sdk.AccAddress(validator.GetOperator())
|
||||
|
||||
res := types.QueryValidatorAccountResponse{
|
||||
AccountAddress: accAddr.String(),
|
||||
}
|
||||
|
||||
account := k.accountKeeper.GetAccount(ctx, accAddr)
|
||||
if account != nil {
|
||||
res.Sequence = account.GetSequence()
|
||||
res.AccountNumber = account.GetAccountNumber()
|
||||
}
|
||||
|
||||
return &res, nil
|
||||
|
||||
}
|
||||
|
||||
// Balance implements the Query/Balance gRPC method
|
||||
func (k Keeper) Balance(c context.Context, req *types.QueryBalanceRequest) (*types.QueryBalanceResponse, error) {
|
||||
if req == nil {
|
||||
|
||||
@@ -585,3 +585,81 @@ func (suite *KeeperTestSuite) TestQueryParams() {
|
||||
suite.Require().NoError(err)
|
||||
suite.Require().Equal(expParams, res.Params)
|
||||
}
|
||||
|
||||
func (suite *KeeperTestSuite) TestQueryValidatorAccount() {
|
||||
var (
|
||||
req *types.QueryValidatorAccountRequest
|
||||
expAccount *types.QueryValidatorAccountResponse
|
||||
)
|
||||
|
||||
testCases := []struct {
|
||||
msg string
|
||||
malleate func()
|
||||
expPass bool
|
||||
}{
|
||||
{"zero address",
|
||||
func() {
|
||||
suite.app.BankKeeper.SetBalance(suite.ctx, suite.address.Bytes(), ethermint.NewPhotonCoinInt64(0))
|
||||
expAccount = &types.QueryValidatorAccountResponse{
|
||||
AccountAddress: sdk.AccAddress(ethcmn.Address{}.Bytes()).String(),
|
||||
}
|
||||
req = &types.QueryValidatorAccountRequest{
|
||||
ConsAddress: "",
|
||||
}
|
||||
},
|
||||
false,
|
||||
},
|
||||
{
|
||||
"success",
|
||||
func() {
|
||||
expAccount = &types.QueryValidatorAccountResponse{
|
||||
AccountAddress: sdk.AccAddress(suite.address.Bytes()).String(),
|
||||
Sequence: 0,
|
||||
AccountNumber: 0,
|
||||
}
|
||||
req = &types.QueryValidatorAccountRequest{
|
||||
ConsAddress: suite.consAddress.String(),
|
||||
}
|
||||
},
|
||||
true,
|
||||
},
|
||||
{
|
||||
"success with seq and account number",
|
||||
func() {
|
||||
acc := suite.app.AccountKeeper.GetAccount(suite.ctx, suite.address.Bytes())
|
||||
suite.Require().NoError(acc.SetSequence(10))
|
||||
suite.Require().NoError(acc.SetAccountNumber(1))
|
||||
suite.app.AccountKeeper.SetAccount(suite.ctx, acc)
|
||||
|
||||
expAccount = &types.QueryValidatorAccountResponse{
|
||||
AccountAddress: sdk.AccAddress(suite.address.Bytes()).String(),
|
||||
Sequence: 10,
|
||||
AccountNumber: 1,
|
||||
}
|
||||
req = &types.QueryValidatorAccountRequest{
|
||||
ConsAddress: suite.consAddress.String(),
|
||||
}
|
||||
},
|
||||
true,
|
||||
},
|
||||
}
|
||||
|
||||
for _, tc := range testCases {
|
||||
suite.Run(fmt.Sprintf("Case %s", tc.msg), func() {
|
||||
suite.SetupTest() // reset
|
||||
|
||||
tc.malleate()
|
||||
ctx := sdk.WrapSDKContext(suite.ctx)
|
||||
res, err := suite.queryClient.ValidatorAccount(ctx, req)
|
||||
|
||||
if tc.expPass {
|
||||
suite.Require().NoError(err)
|
||||
suite.Require().NotNil(res)
|
||||
|
||||
suite.Require().Equal(expAccount, res)
|
||||
} else {
|
||||
suite.Require().Error(err)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,7 @@
|
||||
package keeper_test
|
||||
|
||||
import (
|
||||
"github.com/cosmos/ethermint/crypto/ethsecp256k1"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
@@ -9,6 +10,7 @@ import (
|
||||
"github.com/cosmos/cosmos-sdk/baseapp"
|
||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||
authtypes "github.com/cosmos/cosmos-sdk/x/auth/types"
|
||||
stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types"
|
||||
|
||||
"github.com/cosmos/ethermint/app"
|
||||
ethermint "github.com/cosmos/ethermint/types"
|
||||
@@ -34,6 +36,7 @@ type KeeperTestSuite struct {
|
||||
app *app.EthermintApp
|
||||
queryClient types.QueryClient
|
||||
address ethcmn.Address
|
||||
consAddress sdk.ConsAddress
|
||||
}
|
||||
|
||||
func (suite *KeeperTestSuite) SetupTest() {
|
||||
@@ -57,6 +60,14 @@ func (suite *KeeperTestSuite) SetupTest() {
|
||||
|
||||
suite.app.AccountKeeper.SetAccount(suite.ctx, acc)
|
||||
suite.app.BankKeeper.SetBalance(suite.ctx, acc.GetAddress(), balance)
|
||||
|
||||
priv, err := ethsecp256k1.GenerateKey()
|
||||
suite.Require().NoError(err)
|
||||
valAddr := sdk.ValAddress(suite.address.Bytes())
|
||||
validator, err := stakingtypes.NewValidator(valAddr, priv.PubKey(), stakingtypes.Description{})
|
||||
suite.app.StakingKeeper.SetValidatorByConsAddr(suite.ctx, validator)
|
||||
suite.app.StakingKeeper.SetValidator(suite.ctx, validator)
|
||||
suite.consAddress = sdk.ConsAddress(priv.PubKey().Address())
|
||||
}
|
||||
|
||||
func TestKeeperTestSuite(t *testing.T) {
|
||||
|
||||
Reference in New Issue
Block a user