Skip to content

Commit cd4f406

Browse files
mmsqealjo242
andauthored
fix: align GetCoinbaseAddress to handle empty proposer address in contexts like CheckTx (#817)
Co-authored-by: Alex | Cosmos Labs <[email protected]>
1 parent d450ea1 commit cd4f406

File tree

3 files changed

+33
-5
lines changed

3 files changed

+33
-5
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
- [\#774](https://github.com/cosmos/evm/pull/774) Emit proper allowance amount in erc20 event.
2929
- [\#790](https://github.com/cosmos/evm/pull/790) fix panic in historical query due to missing EvmCoinInfo.
3030
- [\#800](https://github.com/cosmos/evm/pull/800) Fix denom exponent validation in virtual fee deduct in vm module.
31+
- [\#817](https://github.com/cosmos/evm/pull/817) Align GetCoinbaseAddress to handle empty proposer address in contexts like CheckTx where proposer doesn't exist.
3132
- [\#816](https://github.com/cosmos/evm/pull/816) Avoid nil pointer when RPC requests execute before evmCoinInfo initialization in PreBlock with defaultEvmCoinInfo fallback.
3233

3334
## v0.5.0

tests/integration/x/vm/test_state_transition.go

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -156,39 +156,61 @@ func (s *KeeperTestSuite) TestGetCoinbaseAddress() {
156156
msg string
157157
malleate func() sdk.Context
158158
expPass bool
159+
expEmpty bool
159160
}{
161+
{
162+
"empty proposer address - should return empty address without error",
163+
func() sdk.Context {
164+
header := s.Network.GetContext().BlockHeader()
165+
header.ProposerAddress = sdk.ConsAddress{}
166+
return s.Network.GetContext().WithBlockHeader(header)
167+
},
168+
true,
169+
true,
170+
},
160171
{
161172
"validator not found",
162173
func() sdk.Context {
163174
header := s.Network.GetContext().BlockHeader()
164-
header.ProposerAddress = []byte{}
175+
header.ProposerAddress = []byte{1, 2, 3}
165176
return s.Network.GetContext().WithBlockHeader(header)
166177
},
167178
false,
179+
false,
168180
},
169181
{
170182
"success",
171183
func() sdk.Context {
172184
return s.Network.GetContext()
173185
},
174186
true,
187+
false,
175188
},
176189
}
177190

178191
for _, tc := range testCases {
179192
s.Run(fmt.Sprintf("Case %s", tc.msg), func() {
180193
ctx := tc.malleate()
181-
proposerAddress := ctx.BlockHeader().ProposerAddress
194+
var proposerAddress sdk.ConsAddress
195+
if tc.expEmpty {
196+
proposerAddress = sdk.ConsAddress{}
197+
} else {
198+
proposerAddress = ctx.BlockHeader().ProposerAddress
199+
}
182200

183201
// Function being tested
184202
coinbase, err := s.Network.App.GetEVMKeeper().GetCoinbaseAddress(
185203
ctx,
186-
sdk.ConsAddress(proposerAddress),
204+
proposerAddress,
187205
)
188206

189207
if tc.expPass {
190208
s.Require().NoError(err)
191-
s.Require().Equal(proposerAddressHex, coinbase)
209+
if tc.expEmpty {
210+
s.Require().Equal(common.Address{}, coinbase)
211+
} else {
212+
s.Require().Equal(proposerAddressHex, coinbase)
213+
}
192214
} else {
193215
s.Require().Error(err)
194216
}

x/vm/keeper/block_proposer.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,12 @@ import (
1111

1212
// GetCoinbaseAddress returns the block proposer's validator operator address.
1313
func (k Keeper) GetCoinbaseAddress(ctx sdk.Context, proposerAddress sdk.ConsAddress) (common.Address, error) {
14-
validator, err := k.stakingKeeper.GetValidatorByConsAddr(ctx, GetProposerAddress(ctx, proposerAddress))
14+
proposerAddress = GetProposerAddress(ctx, proposerAddress)
15+
if len(proposerAddress) == 0 {
16+
// it's ok that proposer address don't exsits in some contexts like CheckTx.
17+
return common.Address{}, nil
18+
}
19+
validator, err := k.stakingKeeper.GetValidatorByConsAddr(ctx, proposerAddress)
1520
if err != nil {
1621
return common.Address{}, errorsmod.Wrapf(
1722
stakingtypes.ErrNoValidatorFound,

0 commit comments

Comments
 (0)