Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
- [\#774](https://github.com/cosmos/evm/pull/774) Emit proper allowance amount in erc20 event.
- [\#790](https://github.com/cosmos/evm/pull/790) fix panic in historical query due to missing EvmCoinInfo.
- [\#800](https://github.com/cosmos/evm/pull/800) Fix denom exponent validation in virtual fee deduct in vm module.
- [\#817](https://github.com/cosmos/evm/pull/817) Align GetCoinbaseAddress to handle empty proposer address in contexts like CheckTx where proposer doesn't exist.
- [\#816](https://github.com/cosmos/evm/pull/816) Avoid nil pointer when RPC requests execute before evmCoinInfo initialization in PreBlock with defaultEvmCoinInfo fallback.

## v0.5.0
Expand Down
30 changes: 26 additions & 4 deletions tests/integration/x/vm/test_state_transition.go
Original file line number Diff line number Diff line change
Expand Up @@ -156,39 +156,61 @@ func (s *KeeperTestSuite) TestGetCoinbaseAddress() {
msg string
malleate func() sdk.Context
expPass bool
expEmpty bool
}{
{
"empty proposer address - should return empty address without error",
func() sdk.Context {
header := s.Network.GetContext().BlockHeader()
header.ProposerAddress = sdk.ConsAddress{}
return s.Network.GetContext().WithBlockHeader(header)
},
true,
true,
},
{
"validator not found",
func() sdk.Context {
header := s.Network.GetContext().BlockHeader()
header.ProposerAddress = []byte{}
header.ProposerAddress = []byte{1, 2, 3}
return s.Network.GetContext().WithBlockHeader(header)
},
false,
false,
},
{
"success",
func() sdk.Context {
return s.Network.GetContext()
},
true,
false,
},
}

for _, tc := range testCases {
s.Run(fmt.Sprintf("Case %s", tc.msg), func() {
ctx := tc.malleate()
proposerAddress := ctx.BlockHeader().ProposerAddress
var proposerAddress sdk.ConsAddress
if tc.expEmpty {
proposerAddress = sdk.ConsAddress{}
} else {
proposerAddress = ctx.BlockHeader().ProposerAddress
}

// Function being tested
coinbase, err := s.Network.App.GetEVMKeeper().GetCoinbaseAddress(
ctx,
sdk.ConsAddress(proposerAddress),
proposerAddress,
)

if tc.expPass {
s.Require().NoError(err)
s.Require().Equal(proposerAddressHex, coinbase)
if tc.expEmpty {
s.Require().Equal(common.Address{}, coinbase)
} else {
s.Require().Equal(proposerAddressHex, coinbase)
}
} else {
s.Require().Error(err)
}
Expand Down
7 changes: 6 additions & 1 deletion x/vm/keeper/block_proposer.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,12 @@ import (

// GetCoinbaseAddress returns the block proposer's validator operator address.
func (k Keeper) GetCoinbaseAddress(ctx sdk.Context, proposerAddress sdk.ConsAddress) (common.Address, error) {
validator, err := k.stakingKeeper.GetValidatorByConsAddr(ctx, GetProposerAddress(ctx, proposerAddress))
proposerAddress = GetProposerAddress(ctx, proposerAddress)
if len(proposerAddress) == 0 {
// it's ok that proposer address don't exsits in some contexts like CheckTx.
return common.Address{}, nil
}
validator, err := k.stakingKeeper.GetValidatorByConsAddr(ctx, proposerAddress)
if err != nil {
return common.Address{}, errorsmod.Wrapf(
stakingtypes.ErrNoValidatorFound,
Expand Down
Loading