fix!: london hardfork check logic in json-rpc apis (#1068)

This commit is contained in:
yihuang 2022-05-01 00:11:28 +08:00 committed by GitHub
parent fb13fd4835
commit 556c2cc8a3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
16 changed files with 2559 additions and 251 deletions

View File

@ -42,6 +42,10 @@ Ref: https://keepachangelog.com/en/1.0.0/
* (rpc) [tharsis#1059](https://github.com/tharsis/ethermint/pull/1059) Remove unnecessary event filtering logic on the `eth_baseFee` JSON-RPC endpoint.
### API Breaking
* (rpc) [tharsis#1068](https://github.com/tharsis/ethermint/pull/1068) Fix london hardfork check logic in json-rpc apis.
## [v0.14.0] - 2022-04-19
### API Breaking

View File

@ -263,7 +263,7 @@ func (ctd CanTransferDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulate
return ctx, sdkerrors.Wrapf(sdkerrors.ErrUnknownRequest, "invalid message type %T, expected %T", msg, (*evmtypes.MsgEthereumTx)(nil))
}
baseFee := ctd.evmKeeper.BaseFee(ctx, ethCfg)
baseFee := ctd.evmKeeper.GetBaseFee(ctx, ethCfg)
coreMsg, err := msgEthTx.AsMessage(signer, baseFee)
if err != nil {
@ -427,7 +427,7 @@ func (vbd EthValidateBasicDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simu
params := vbd.evmKeeper.GetParams(ctx)
chainID := vbd.evmKeeper.ChainID()
ethCfg := params.ChainConfig.EthereumConfig(chainID)
baseFee := vbd.evmKeeper.BaseFee(ctx, ethCfg)
baseFee := vbd.evmKeeper.GetBaseFee(ctx, ethCfg)
if baseFee == nil && txData.TxType() == ethtypes.DynamicFeeTxType {
return ctx, sdkerrors.Wrap(ethtypes.ErrTxTypeNotSupported, "dynamic fee tx not supported")
}
@ -511,7 +511,7 @@ func (mfd EthMempoolFeeDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulat
if ctx.IsCheckTx() && !simulate {
params := mfd.evmKeeper.GetParams(ctx)
ethCfg := params.ChainConfig.EthereumConfig(mfd.evmKeeper.ChainID())
baseFee := mfd.evmKeeper.BaseFee(ctx, ethCfg)
baseFee := mfd.evmKeeper.GetBaseFee(ctx, ethCfg)
if baseFee == nil {
for _, msg := range tx.GetMsgs() {
ethMsg, ok := msg.(*evmtypes.MsgEthereumTx)

View File

@ -23,7 +23,7 @@ type EVMKeeper interface {
DeductTxCostsFromUserBalance(
ctx sdk.Context, msgEthTx evmtypes.MsgEthereumTx, txData evmtypes.TxData, denom string, homestead, istanbul, london bool,
) (sdk.Coins, error)
BaseFee(ctx sdk.Context, ethCfg *params.ChainConfig) *big.Int
GetBaseFee(ctx sdk.Context, ethCfg *params.ChainConfig) *big.Int
GetBalance(ctx sdk.Context, addr common.Address) *big.Int
ResetTransientGasUsed(ctx sdk.Context)
}

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

View File

@ -39,6 +39,8 @@
- [QueryAccountResponse](#ethermint.evm.v1.QueryAccountResponse)
- [QueryBalanceRequest](#ethermint.evm.v1.QueryBalanceRequest)
- [QueryBalanceResponse](#ethermint.evm.v1.QueryBalanceResponse)
- [QueryBaseFeeRequest](#ethermint.evm.v1.QueryBaseFeeRequest)
- [QueryBaseFeeResponse](#ethermint.evm.v1.QueryBaseFeeResponse)
- [QueryCodeRequest](#ethermint.evm.v1.QueryCodeRequest)
- [QueryCodeResponse](#ethermint.evm.v1.QueryCodeResponse)
- [QueryCosmosAccountRequest](#ethermint.evm.v1.QueryCosmosAccountRequest)
@ -618,6 +620,32 @@ QueryBalanceResponse is the response type for the Query/Balance RPC method.
<a name="ethermint.evm.v1.QueryBaseFeeRequest"></a>
### QueryBaseFeeRequest
QueryBaseFeeRequest defines the request type for querying the EIP1559 base
fee.
<a name="ethermint.evm.v1.QueryBaseFeeResponse"></a>
### QueryBaseFeeResponse
BaseFeeResponse returns the EIP1559 base fee.
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| `base_fee` | [string](#string) | | |
<a name="ethermint.evm.v1.QueryCodeRequest"></a>
### QueryCodeRequest
@ -899,6 +927,7 @@ Query defines the gRPC querier service.
| `EstimateGas` | [EthCallRequest](#ethermint.evm.v1.EthCallRequest) | [EstimateGasResponse](#ethermint.evm.v1.EstimateGasResponse) | EstimateGas implements the `eth_estimateGas` rpc api | GET|/ethermint/evm/v1/estimate_gas|
| `TraceTx` | [QueryTraceTxRequest](#ethermint.evm.v1.QueryTraceTxRequest) | [QueryTraceTxResponse](#ethermint.evm.v1.QueryTraceTxResponse) | TraceTx implements the `debug_traceTransaction` rpc api | GET|/ethermint/evm/v1/trace_tx|
| `TraceBlock` | [QueryTraceBlockRequest](#ethermint.evm.v1.QueryTraceBlockRequest) | [QueryTraceBlockResponse](#ethermint.evm.v1.QueryTraceBlockResponse) | TraceBlock implements the `debug_traceBlockByNumber` and `debug_traceBlockByHash` rpc api | GET|/ethermint/evm/v1/trace_block|
| `BaseFee` | [QueryBaseFeeRequest](#ethermint.evm.v1.QueryBaseFeeRequest) | [QueryBaseFeeResponse](#ethermint.evm.v1.QueryBaseFeeResponse) | BaseFee queries the base fee of the parent block of the current block, it's similar to feemarket module's method, but also checks london hardfork status. | GET|/ethermint/evm/v1/base_fee|
<!-- end services -->

View File

@ -71,6 +71,13 @@ service Query {
rpc TraceBlock(QueryTraceBlockRequest) returns (QueryTraceBlockResponse) {
option (google.api.http).get = "/ethermint/evm/v1/trace_block";
}
// BaseFee queries the base fee of the parent block of the current block,
// it's similar to feemarket module's method, but also checks london hardfork status.
rpc BaseFee(QueryBaseFeeRequest) returns (QueryBaseFeeResponse) {
option (google.api.http).get = "/ethermint/evm/v1/base_fee";
}
}
// QueryAccountRequest is the request type for the Query/Account RPC method.
@ -271,3 +278,12 @@ message QueryTraceBlockResponse {
bytes data = 1;
}
// QueryBaseFeeRequest defines the request type for querying the EIP1559 base
// fee.
message QueryBaseFeeRequest {}
// BaseFeeResponse returns the EIP1559 base fee.
message QueryBaseFeeResponse {
string base_fee = 1
[ (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int" ];
}

View File

@ -945,7 +945,7 @@ func (e *EVMBackend) RPCMinGasPrice() int64 {
return amt
}
// ChainConfig return the ethereum chain configuration
// ChainConfig return the latest ethereum chain configuration
func (e *EVMBackend) ChainConfig() *params.ChainConfig {
params, err := e.queryClient.Params(e.ctx, &evmtypes.QueryParamsRequest{})
if err != nil {
@ -991,13 +991,8 @@ func (e *EVMBackend) SuggestGasTipCap(baseFee *big.Int) (*big.Int, error) {
// If the London hard fork is not activated at the current height, the query will
// return nil.
func (e *EVMBackend) BaseFee(height int64) (*big.Int, error) {
cfg := e.ChainConfig()
if !cfg.IsLondon(new(big.Int).SetInt64(height)) {
return nil, nil
}
// return BaseFee if London hard fork is activated and feemarket is not enabled
res, err := e.queryClient.FeeMarket.BaseFee(types.ContextWithHeight(height), &feemarkettypes.QueryBaseFeeRequest{})
// return BaseFee if London hard fork is activated and feemarket is enabled
res, err := e.queryClient.BaseFee(types.ContextWithHeight(height), &evmtypes.QueryBaseFeeRequest{})
if err != nil {
return nil, err
}

View File

@ -583,3 +583,20 @@ func (k *Keeper) traceTx(
return &result, txConfig.LogIndex + uint(len(res.Logs)), nil
}
// BaseFee implements the Query/BaseFee gRPC method
func (k Keeper) BaseFee(c context.Context, _ *types.QueryBaseFeeRequest) (*types.QueryBaseFeeResponse, error) {
ctx := sdk.UnwrapSDKContext(c)
params := k.GetParams(ctx)
ethCfg := params.ChainConfig.EthereumConfig(k.eip155ChainID)
baseFee := k.GetBaseFee(ctx, ethCfg)
res := &types.QueryBaseFeeResponse{}
if baseFee != nil {
aux := sdk.NewIntFromBigInt(baseFee)
res.BaseFee = &aux
}
return res, nil
}

View File

@ -9,6 +9,7 @@ import (
"github.com/ethereum/go-ethereum/common/hexutil"
"github.com/ethereum/go-ethereum/core/vm"
"github.com/ethereum/go-ethereum/crypto"
ethparams "github.com/ethereum/go-ethereum/params"
"github.com/tharsis/ethermint/x/evm/statedb"
sdk "github.com/cosmos/cosmos-sdk/types"
@ -899,3 +900,76 @@ func (suite *KeeperTestSuite) TestNonceInQuery() {
})
suite.Require().NoError(err)
}
func (suite *KeeperTestSuite) TestQueryBaseFee() {
var (
aux sdk.Int
expRes *types.QueryBaseFeeResponse
)
testCases := []struct {
name string
malleate func()
expPass bool
enableFeemarket bool
enableLondonHF bool
}{
{
"pass - default Base Fee",
func() {
initialBaseFee := sdk.NewInt(ethparams.InitialBaseFee)
expRes = &types.QueryBaseFeeResponse{BaseFee: &initialBaseFee}
},
true, true, true,
},
{
"pass - non-nil Base Fee",
func() {
baseFee := sdk.OneInt().BigInt()
suite.app.FeeMarketKeeper.SetBaseFee(suite.ctx, baseFee)
aux = sdk.NewIntFromBigInt(baseFee)
expRes = &types.QueryBaseFeeResponse{BaseFee: &aux}
},
true, true, true,
},
{
"pass - nil Base Fee when london hardfork not activated",
func() {
baseFee := sdk.OneInt().BigInt()
suite.app.FeeMarketKeeper.SetBaseFee(suite.ctx, baseFee)
expRes = &types.QueryBaseFeeResponse{}
},
true, true, false,
},
{
"pass - zero Base Fee when feemarket not activated",
func() {
baseFee := sdk.ZeroInt()
expRes = &types.QueryBaseFeeResponse{BaseFee: &baseFee}
},
true, false, true,
},
}
for _, tc := range testCases {
suite.Run(tc.name, func() {
suite.enableFeemarket = tc.enableFeemarket
suite.enableLondonHF = tc.enableLondonHF
suite.SetupTest()
tc.malleate()
res, err := suite.queryClient.BaseFee(suite.ctx.Context(), &types.QueryBaseFeeRequest{})
if tc.expPass {
suite.Require().NotNil(res)
suite.Require().Equal(expRes, res, tc.name)
suite.Require().NoError(err)
} else {
suite.Require().Error(err)
}
})
}
suite.enableFeemarket = false
suite.enableLondonHF = true
}

View File

@ -291,7 +291,7 @@ func (k *Keeper) GetBalance(ctx sdk.Context, addr common.Address) *big.Int {
// - `nil`: london hardfork not enabled.
// - `0`: london hardfork enabled but feemarket is not enabled.
// - `n`: both london hardfork and feemarket are enabled.
func (k Keeper) BaseFee(ctx sdk.Context, ethCfg *params.ChainConfig) *big.Int {
func (k Keeper) GetBaseFee(ctx sdk.Context, ethCfg *params.ChainConfig) *big.Int {
if !types.IsLondon(ethCfg, ctx.BlockHeight()) {
return nil
}

View File

@ -404,7 +404,7 @@ func (suite *KeeperTestSuite) TestBaseFee() {
suite.app.EvmKeeper.BeginBlock(suite.ctx, abci.RequestBeginBlock{})
params := suite.app.EvmKeeper.GetParams(suite.ctx)
ethCfg := params.ChainConfig.EthereumConfig(suite.app.EvmKeeper.ChainID())
baseFee := suite.app.EvmKeeper.BaseFee(suite.ctx, ethCfg)
baseFee := suite.app.EvmKeeper.GetBaseFee(suite.ctx, ethCfg)
suite.Require().Equal(tc.expectBaseFee, baseFee)
})
}

View File

@ -46,7 +46,7 @@ func (k *Keeper) EVMConfig(ctx sdk.Context) (*types.EVMConfig, error) {
return nil, sdkerrors.Wrap(err, "failed to obtain coinbase address")
}
baseFee := k.BaseFee(ctx, ethCfg)
baseFee := k.GetBaseFee(ctx, ethCfg)
return &types.EVMConfig{
Params: params,
ChainConfig: ethCfg,

View File

@ -210,7 +210,7 @@ func CreateRandomValidEthTx(ctx *simulateContext, from, to *common.Address, amou
gasLimit := estimateGas + uint64(ctx.rand.Intn(int(sdktx.MaxGasWanted-estimateGas)))
ethChainID := ctx.keeper.ChainID()
chainConfig := ctx.keeper.GetParams(ctx.context).ChainConfig.EthereumConfig(ethChainID)
gasPrice := ctx.keeper.BaseFee(ctx.context, chainConfig)
gasPrice := ctx.keeper.GetBaseFee(ctx.context, chainConfig)
gasFeeCap := new(big.Int).Add(gasPrice, big.NewInt(int64(ctx.rand.Int())))
gasTipCap := big.NewInt(int64(ctx.rand.Int()))
nonce := ctx.keeper.GetNonce(ctx.context, *from)

504
x/evm/types/query.pb.go generated
View File

@ -6,6 +6,7 @@ package types
import (
context "context"
fmt "fmt"
github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types"
query "github.com/cosmos/cosmos-sdk/types/query"
_ "github.com/gogo/protobuf/gogoproto"
grpc1 "github.com/gogo/protobuf/grpc"
@ -1151,6 +1152,82 @@ func (m *QueryTraceBlockResponse) GetData() []byte {
return nil
}
// QueryBaseFeeRequest defines the request type for querying the EIP1559 base
// fee.
type QueryBaseFeeRequest struct {
}
func (m *QueryBaseFeeRequest) Reset() { *m = QueryBaseFeeRequest{} }
func (m *QueryBaseFeeRequest) String() string { return proto.CompactTextString(m) }
func (*QueryBaseFeeRequest) ProtoMessage() {}
func (*QueryBaseFeeRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_e15a877459347994, []int{22}
}
func (m *QueryBaseFeeRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
}
func (m *QueryBaseFeeRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
if deterministic {
return xxx_messageInfo_QueryBaseFeeRequest.Marshal(b, m, deterministic)
} else {
b = b[:cap(b)]
n, err := m.MarshalToSizedBuffer(b)
if err != nil {
return nil, err
}
return b[:n], nil
}
}
func (m *QueryBaseFeeRequest) XXX_Merge(src proto.Message) {
xxx_messageInfo_QueryBaseFeeRequest.Merge(m, src)
}
func (m *QueryBaseFeeRequest) XXX_Size() int {
return m.Size()
}
func (m *QueryBaseFeeRequest) XXX_DiscardUnknown() {
xxx_messageInfo_QueryBaseFeeRequest.DiscardUnknown(m)
}
var xxx_messageInfo_QueryBaseFeeRequest proto.InternalMessageInfo
// BaseFeeResponse returns the EIP1559 base fee.
type QueryBaseFeeResponse struct {
BaseFee *github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,1,opt,name=base_fee,json=baseFee,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"base_fee,omitempty"`
}
func (m *QueryBaseFeeResponse) Reset() { *m = QueryBaseFeeResponse{} }
func (m *QueryBaseFeeResponse) String() string { return proto.CompactTextString(m) }
func (*QueryBaseFeeResponse) ProtoMessage() {}
func (*QueryBaseFeeResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_e15a877459347994, []int{23}
}
func (m *QueryBaseFeeResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
}
func (m *QueryBaseFeeResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
if deterministic {
return xxx_messageInfo_QueryBaseFeeResponse.Marshal(b, m, deterministic)
} else {
b = b[:cap(b)]
n, err := m.MarshalToSizedBuffer(b)
if err != nil {
return nil, err
}
return b[:n], nil
}
}
func (m *QueryBaseFeeResponse) XXX_Merge(src proto.Message) {
xxx_messageInfo_QueryBaseFeeResponse.Merge(m, src)
}
func (m *QueryBaseFeeResponse) XXX_Size() int {
return m.Size()
}
func (m *QueryBaseFeeResponse) XXX_DiscardUnknown() {
xxx_messageInfo_QueryBaseFeeResponse.DiscardUnknown(m)
}
var xxx_messageInfo_QueryBaseFeeResponse proto.InternalMessageInfo
func init() {
proto.RegisterType((*QueryAccountRequest)(nil), "ethermint.evm.v1.QueryAccountRequest")
proto.RegisterType((*QueryAccountResponse)(nil), "ethermint.evm.v1.QueryAccountResponse")
@ -1174,93 +1251,100 @@ func init() {
proto.RegisterType((*QueryTraceTxResponse)(nil), "ethermint.evm.v1.QueryTraceTxResponse")
proto.RegisterType((*QueryTraceBlockRequest)(nil), "ethermint.evm.v1.QueryTraceBlockRequest")
proto.RegisterType((*QueryTraceBlockResponse)(nil), "ethermint.evm.v1.QueryTraceBlockResponse")
proto.RegisterType((*QueryBaseFeeRequest)(nil), "ethermint.evm.v1.QueryBaseFeeRequest")
proto.RegisterType((*QueryBaseFeeResponse)(nil), "ethermint.evm.v1.QueryBaseFeeResponse")
}
func init() { proto.RegisterFile("ethermint/evm/v1/query.proto", fileDescriptor_e15a877459347994) }
var fileDescriptor_e15a877459347994 = []byte{
// 1294 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x56, 0x4d, 0x6f, 0x1b, 0xc5,
0x1b, 0xcf, 0xc6, 0x4e, 0x9c, 0x3e, 0x4e, 0xfb, 0xcf, 0x7f, 0x1a, 0xa8, 0xbb, 0x24, 0x76, 0xba,
0x6d, 0xde, 0xda, 0xb0, 0x4b, 0x0c, 0xaa, 0x44, 0x25, 0x04, 0x4d, 0x54, 0x8a, 0x68, 0x8b, 0xca,
0x12, 0x71, 0xe0, 0x62, 0x8d, 0xd7, 0xd3, 0xb5, 0x55, 0xef, 0x8e, 0xbb, 0x33, 0x36, 0x4e, 0x4b,
0x39, 0x20, 0x51, 0x15, 0xf5, 0x52, 0x09, 0xce, 0xa8, 0xdf, 0x80, 0xaf, 0xd1, 0x63, 0x25, 0x2e,
0x9c, 0x00, 0xb5, 0x08, 0x71, 0xe5, 0x1b, 0xa0, 0x79, 0xd9, 0x78, 0xed, 0xf5, 0xc6, 0x29, 0xea,
0x81, 0xdb, 0xce, 0xcc, 0x33, 0xcf, 0xef, 0xf7, 0xbc, 0xec, 0xf3, 0x1b, 0x58, 0x22, 0xbc, 0x49,
0xa2, 0xa0, 0x15, 0x72, 0x87, 0xf4, 0x02, 0xa7, 0xb7, 0xed, 0xdc, 0xe9, 0x92, 0x68, 0xdf, 0xee,
0x44, 0x94, 0x53, 0xb4, 0x70, 0x70, 0x6a, 0x93, 0x5e, 0x60, 0xf7, 0xb6, 0xcd, 0x45, 0x9f, 0xfa,
0x54, 0x1e, 0x3a, 0xe2, 0x4b, 0xd9, 0x99, 0xe7, 0x3d, 0xca, 0x02, 0xca, 0x9c, 0x3a, 0x66, 0x44,
0x39, 0x70, 0x7a, 0xdb, 0x75, 0xc2, 0xf1, 0xb6, 0xd3, 0xc1, 0x7e, 0x2b, 0xc4, 0xbc, 0x45, 0x43,
0x6d, 0xbb, 0xe4, 0x53, 0xea, 0xb7, 0x89, 0x83, 0x3b, 0x2d, 0x07, 0x87, 0x21, 0xe5, 0xf2, 0x90,
0xe9, 0x53, 0x33, 0xc5, 0x47, 0x00, 0xab, 0xb3, 0xd3, 0xa9, 0x33, 0xde, 0xd7, 0x47, 0x15, 0xed,
0x54, 0xae, 0xea, 0xdd, 0x5b, 0x0e, 0x6f, 0x05, 0x84, 0x71, 0x1c, 0x74, 0x94, 0x81, 0xf5, 0x2e,
0x9c, 0xfc, 0x54, 0xf0, 0xba, 0xec, 0x79, 0xb4, 0x1b, 0x72, 0x97, 0xdc, 0xe9, 0x12, 0xc6, 0x51,
0x09, 0x0a, 0xb8, 0xd1, 0x88, 0x08, 0x63, 0x25, 0x63, 0xc5, 0xd8, 0x38, 0xe6, 0xc6, 0xcb, 0x4b,
0x73, 0x0f, 0x9f, 0x54, 0xa6, 0xfe, 0x7a, 0x52, 0x99, 0xb2, 0x3c, 0x58, 0x1c, 0xbe, 0xca, 0x3a,
0x34, 0x64, 0x44, 0xdc, 0xad, 0xe3, 0x36, 0x0e, 0x3d, 0x12, 0xdf, 0xd5, 0x4b, 0xf4, 0x06, 0x1c,
0xf3, 0x68, 0x83, 0xd4, 0x9a, 0x98, 0x35, 0x4b, 0xd3, 0xf2, 0x6c, 0x4e, 0x6c, 0x7c, 0x84, 0x59,
0x13, 0x2d, 0xc2, 0x4c, 0x48, 0xc5, 0xa5, 0xdc, 0x8a, 0xb1, 0x91, 0x77, 0xd5, 0xc2, 0x7a, 0x1f,
0x4e, 0x4b, 0x90, 0x5d, 0x99, 0xc8, 0x7f, 0xc1, 0xf2, 0x81, 0x01, 0xe6, 0x38, 0x0f, 0x9a, 0xec,
0x2a, 0x9c, 0x50, 0x35, 0xaa, 0x0d, 0x7b, 0x3a, 0xae, 0x76, 0x2f, 0xab, 0x4d, 0x64, 0xc2, 0x1c,
0x13, 0xa0, 0x82, 0xdf, 0xb4, 0xe4, 0x77, 0xb0, 0x16, 0x2e, 0xb0, 0xf2, 0x5a, 0x0b, 0xbb, 0x41,
0x9d, 0x44, 0x3a, 0x82, 0xe3, 0x7a, 0xf7, 0x13, 0xb9, 0x69, 0x5d, 0x83, 0x25, 0xc9, 0xe3, 0x73,
0xdc, 0x6e, 0x35, 0x30, 0xa7, 0xd1, 0x48, 0x30, 0x67, 0x60, 0xde, 0xa3, 0xe1, 0x28, 0x8f, 0xa2,
0xd8, 0xbb, 0x9c, 0x8a, 0xea, 0x91, 0x01, 0xcb, 0x19, 0xde, 0x74, 0x60, 0xeb, 0xf0, 0xbf, 0x98,
0xd5, 0xb0, 0xc7, 0x98, 0xec, 0x2b, 0x0c, 0x2d, 0x6e, 0xa2, 0x1d, 0x55, 0xe7, 0x97, 0x29, 0xcf,
0x5b, 0xba, 0x89, 0x0e, 0xae, 0x4e, 0x6a, 0x22, 0xeb, 0x9a, 0x06, 0xfb, 0x8c, 0xd3, 0x08, 0xfb,
0x93, 0xc1, 0xd0, 0x02, 0xe4, 0x6e, 0x93, 0x7d, 0xdd, 0x6f, 0xe2, 0x33, 0x01, 0xbf, 0xa5, 0xe1,
0x0f, 0x9c, 0x69, 0xf8, 0x45, 0x98, 0xe9, 0xe1, 0x76, 0x37, 0x06, 0x57, 0x0b, 0xeb, 0x22, 0x2c,
0xe8, 0x56, 0x6a, 0xbc, 0x54, 0x90, 0xeb, 0xf0, 0xff, 0xc4, 0x3d, 0x0d, 0x81, 0x20, 0x2f, 0x7a,
0x5f, 0xde, 0x9a, 0x77, 0xe5, 0xb7, 0x75, 0x17, 0x90, 0x34, 0xdc, 0xeb, 0x5f, 0xa7, 0x3e, 0x8b,
0x21, 0x10, 0xe4, 0xe5, 0x1f, 0xa3, 0xfc, 0xcb, 0x6f, 0xf4, 0x21, 0xc0, 0x60, 0x82, 0xc8, 0xd8,
0x8a, 0xd5, 0x35, 0x5b, 0x35, 0xad, 0x2d, 0xc6, 0x8d, 0xad, 0xe6, 0x95, 0x1e, 0x37, 0xf6, 0xcd,
0x41, 0xaa, 0xdc, 0xc4, 0xcd, 0x04, 0xc9, 0xef, 0x0c, 0x9d, 0xd8, 0x18, 0x5c, 0xf3, 0xdc, 0x84,
0x7c, 0x9b, 0xfa, 0x22, 0xba, 0xdc, 0x46, 0xb1, 0xfa, 0x9a, 0x3d, 0x3a, 0xfa, 0xec, 0xeb, 0xd4,
0x77, 0xa5, 0x09, 0xba, 0x3a, 0x86, 0xd4, 0xfa, 0x44, 0x52, 0x0a, 0x27, 0xc9, 0xca, 0x5a, 0xd4,
0x79, 0xb8, 0x89, 0x23, 0x1c, 0xc4, 0x79, 0xb0, 0x6e, 0x68, 0x82, 0xf1, 0xae, 0x26, 0x78, 0x11,
0x66, 0x3b, 0x72, 0x47, 0x26, 0xa8, 0x58, 0x2d, 0xa5, 0x29, 0xaa, 0x1b, 0x3b, 0xf9, 0xa7, 0xbf,
0x56, 0xa6, 0x5c, 0x6d, 0x6d, 0xbd, 0x07, 0x27, 0xae, 0xf0, 0xe6, 0x2e, 0x6e, 0xb7, 0x13, 0x89,
0xc6, 0x91, 0xcf, 0xe2, 0x92, 0x88, 0x6f, 0x74, 0x0a, 0x0a, 0x3e, 0x66, 0x35, 0x0f, 0x77, 0xf4,
0xdf, 0x31, 0xeb, 0x63, 0xb6, 0x8b, 0x3b, 0xd6, 0x3a, 0x9c, 0xbc, 0xc2, 0x78, 0x2b, 0xc0, 0x9c,
0x5c, 0xc5, 0x03, 0x36, 0x0b, 0x90, 0xf3, 0xb1, 0x72, 0x91, 0x77, 0xc5, 0xa7, 0xf5, 0xe7, 0x74,
0x9c, 0xd8, 0x08, 0x7b, 0x64, 0xaf, 0x1f, 0xa3, 0x6d, 0x43, 0x2e, 0x60, 0xbe, 0x26, 0x5d, 0x49,
0x93, 0xbe, 0xc1, 0xfc, 0x2b, 0x62, 0x8f, 0x74, 0x83, 0xbd, 0xbe, 0x2b, 0x6c, 0xd1, 0x07, 0x30,
0xcf, 0x85, 0x93, 0x9a, 0x47, 0xc3, 0x5b, 0x2d, 0x5f, 0xfe, 0x8d, 0xc5, 0xea, 0x72, 0xfa, 0xae,
0x84, 0xda, 0x95, 0x46, 0x6e, 0x91, 0x0f, 0x16, 0x68, 0x17, 0xe6, 0x3b, 0x11, 0x69, 0x10, 0x8f,
0x30, 0x46, 0x23, 0x56, 0xca, 0xcb, 0xaa, 0x4e, 0x44, 0x1f, 0xba, 0x24, 0x46, 0x55, 0xbd, 0x4d,
0xbd, 0xdb, 0xf1, 0x50, 0x98, 0x59, 0x31, 0x36, 0x72, 0x6e, 0x51, 0xee, 0xa9, 0x91, 0x80, 0x96,
0x01, 0x94, 0x89, 0xec, 0xdc, 0x59, 0xd9, 0xb9, 0xc7, 0xe4, 0x8e, 0x1c, 0xf6, 0xbb, 0xf1, 0xb1,
0xd0, 0xa3, 0x52, 0x41, 0x86, 0x61, 0xda, 0x4a, 0xac, 0xec, 0x58, 0xac, 0xec, 0xbd, 0x58, 0xac,
0x76, 0xe6, 0x44, 0xe5, 0x1e, 0xff, 0x56, 0x31, 0xb4, 0x13, 0x71, 0xf2, 0x71, 0x7e, 0x6e, 0x7a,
0x21, 0xe7, 0xce, 0xf1, 0x7e, 0xad, 0x15, 0x36, 0x48, 0xdf, 0x3a, 0xaf, 0x7f, 0xe6, 0x83, 0x3c,
0x0f, 0xfe, 0xb4, 0x06, 0xe6, 0x38, 0x2e, 0xab, 0xf8, 0xb6, 0x7e, 0x98, 0x86, 0xd7, 0x07, 0xc6,
0x3b, 0xc2, 0x67, 0xa2, 0x2e, 0xbc, 0x1f, 0xf7, 0xfb, 0xe4, 0xba, 0xf0, 0x3e, 0x7b, 0x05, 0x75,
0xf9, 0x6f, 0xa4, 0xd4, 0x7a, 0x13, 0x4e, 0xa5, 0xb2, 0x92, 0x9d, 0xc5, 0xea, 0xdf, 0x45, 0x98,
0x91, 0xf6, 0xe8, 0x5b, 0x03, 0x0a, 0x5a, 0x82, 0xd0, 0x6a, 0x3a, 0xee, 0x31, 0x6f, 0x0c, 0x73,
0x6d, 0x92, 0x99, 0x02, 0xb6, 0x2e, 0x7c, 0xf3, 0xf3, 0x1f, 0xdf, 0x4f, 0xaf, 0xa2, 0xb3, 0x4e,
0xea, 0x9d, 0xa3, 0x65, 0xc8, 0xb9, 0xa7, 0x67, 0xee, 0x7d, 0xf4, 0xa3, 0x01, 0xc7, 0x87, 0x94,
0x1e, 0x5d, 0xc8, 0x80, 0x19, 0xf7, 0xa2, 0x30, 0xb7, 0x8e, 0x66, 0xac, 0x99, 0x55, 0x25, 0xb3,
0x2d, 0x74, 0x3e, 0xcd, 0x2c, 0x7e, 0x54, 0xa4, 0x08, 0xfe, 0x64, 0xc0, 0xc2, 0xa8, 0x68, 0x23,
0x3b, 0x03, 0x36, 0xe3, 0xad, 0x60, 0x3a, 0x47, 0xb6, 0xd7, 0x4c, 0x2f, 0x49, 0xa6, 0xef, 0xa0,
0x6a, 0x9a, 0x69, 0x2f, 0xbe, 0x33, 0x20, 0x9b, 0x7c, 0x87, 0xdc, 0x47, 0x0f, 0x0c, 0x28, 0x68,
0x79, 0xce, 0x2c, 0xed, 0xb0, 0xf2, 0x67, 0x96, 0x76, 0x44, 0xe5, 0xad, 0x2d, 0x49, 0x6b, 0x0d,
0x9d, 0x4b, 0xd3, 0xd2, 0x72, 0xcf, 0x12, 0xa9, 0x7b, 0x64, 0x40, 0x41, 0x0b, 0x75, 0x26, 0x91,
0xe1, 0x57, 0x41, 0x26, 0x91, 0x11, 0xbd, 0xb7, 0xb6, 0x25, 0x91, 0x0b, 0x68, 0x33, 0x4d, 0x84,
0x29, 0xd3, 0x01, 0x0f, 0xe7, 0xde, 0x6d, 0xb2, 0x7f, 0x1f, 0xdd, 0x85, 0xbc, 0xd0, 0x73, 0x64,
0x65, 0xb6, 0xcc, 0xc1, 0x23, 0xc1, 0x3c, 0x7b, 0xa8, 0x8d, 0xe6, 0xb0, 0x29, 0x39, 0x9c, 0x45,
0x67, 0xc6, 0x75, 0x53, 0x63, 0x28, 0x13, 0x5f, 0xc2, 0xac, 0x92, 0x34, 0x74, 0x2e, 0xc3, 0xf3,
0x90, 0x72, 0x9a, 0xab, 0x13, 0xac, 0x34, 0x83, 0x15, 0xc9, 0xc0, 0x44, 0xa5, 0x34, 0x03, 0xa5,
0x99, 0xa8, 0x0f, 0x05, 0xad, 0x99, 0x68, 0x25, 0xed, 0x73, 0x58, 0x4e, 0xcd, 0xf5, 0x49, 0xb3,
0x33, 0xc6, 0xb5, 0x24, 0xee, 0x12, 0x32, 0xd3, 0xb8, 0x84, 0x37, 0x6b, 0x9e, 0x80, 0xfb, 0x1a,
0x8a, 0x09, 0xb9, 0x3d, 0x02, 0xfa, 0x98, 0x98, 0xc7, 0xe8, 0xb5, 0xb5, 0x26, 0xb1, 0x57, 0x50,
0x79, 0x0c, 0xb6, 0x36, 0xaf, 0xf9, 0x98, 0xa1, 0xaf, 0xa0, 0xa0, 0x75, 0x25, 0xb3, 0xf7, 0x86,
0xf5, 0x3d, 0xb3, 0xf7, 0x46, 0xe4, 0xe9, 0xb0, 0xe8, 0x95, 0xa8, 0xf0, 0x3e, 0x7a, 0x68, 0x00,
0x0c, 0x66, 0x32, 0xda, 0x38, 0xcc, 0x75, 0x52, 0xcc, 0xcc, 0xcd, 0x23, 0x58, 0x6a, 0x1e, 0xab,
0x92, 0x47, 0x05, 0x2d, 0x67, 0xf1, 0x90, 0x32, 0xb1, 0xb3, 0xf3, 0xf4, 0x79, 0xd9, 0x78, 0xf6,
0xbc, 0x6c, 0xfc, 0xfe, 0xbc, 0x6c, 0x3c, 0x7e, 0x51, 0x9e, 0x7a, 0xf6, 0xa2, 0x3c, 0xf5, 0xcb,
0x8b, 0xf2, 0xd4, 0x17, 0x1b, 0x7e, 0x8b, 0x37, 0xbb, 0x75, 0xdb, 0xa3, 0x81, 0xc3, 0x9b, 0x38,
0x62, 0x2d, 0x96, 0x70, 0xd5, 0x97, 0xce, 0xf8, 0x7e, 0x87, 0xb0, 0xfa, 0xac, 0xd4, 0xa3, 0xb7,
0xff, 0x09, 0x00, 0x00, 0xff, 0xff, 0xa1, 0xbb, 0x33, 0x6b, 0x66, 0x0f, 0x00, 0x00,
// 1371 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x56, 0x4f, 0x6f, 0x1b, 0x45,
0x14, 0xcf, 0xc6, 0x4e, 0xec, 0x3e, 0xa7, 0x25, 0x4c, 0x53, 0xea, 0x2e, 0x89, 0x9d, 0x6e, 0x9b,
0xbf, 0x4d, 0x77, 0x89, 0x41, 0x95, 0xa8, 0x84, 0xa0, 0x8e, 0xd2, 0x02, 0x6d, 0x51, 0x31, 0x11,
0x07, 0x24, 0x64, 0x8d, 0xd7, 0xd3, 0xb5, 0x15, 0x7b, 0xd7, 0xdd, 0x19, 0x1b, 0xa7, 0xa5, 0x1c,
0x90, 0xa8, 0x8a, 0x7a, 0xa9, 0x04, 0x67, 0xd4, 0x6f, 0xc0, 0xd7, 0xe8, 0xb1, 0x12, 0x17, 0xc4,
0xa1, 0xa0, 0x06, 0x21, 0x6e, 0x7c, 0x05, 0x34, 0x7f, 0xd6, 0x5e, 0x7b, 0xbd, 0x76, 0x8a, 0x7a,
0xe0, 0xb4, 0xf3, 0xe7, 0xcd, 0xfb, 0xfd, 0xe6, 0xcd, 0xdb, 0xf7, 0x7b, 0xb0, 0x48, 0x58, 0x8d,
0xf8, 0xcd, 0xba, 0xcb, 0x2c, 0xd2, 0x69, 0x5a, 0x9d, 0x6d, 0xeb, 0x4e, 0x9b, 0xf8, 0x07, 0x66,
0xcb, 0xf7, 0x98, 0x87, 0xe6, 0x7b, 0xbb, 0x26, 0xe9, 0x34, 0xcd, 0xce, 0xb6, 0xbe, 0xe0, 0x78,
0x8e, 0x27, 0x36, 0x2d, 0x3e, 0x92, 0x76, 0xfa, 0xa6, 0xed, 0xd1, 0xa6, 0x47, 0xad, 0x0a, 0xa6,
0x44, 0x3a, 0xb0, 0x3a, 0xdb, 0x15, 0xc2, 0xf0, 0xb6, 0xd5, 0xc2, 0x4e, 0xdd, 0xc5, 0xac, 0xee,
0xb9, 0xca, 0x76, 0xd1, 0xf1, 0x3c, 0xa7, 0x41, 0x2c, 0xdc, 0xaa, 0x5b, 0xd8, 0x75, 0x3d, 0x26,
0x36, 0xa9, 0xda, 0xd5, 0x23, 0x7c, 0x38, 0xb0, 0xdc, 0x3b, 0x13, 0xd9, 0x63, 0x5d, 0xb5, 0x95,
0x57, 0x4e, 0xc5, 0xac, 0xd2, 0xbe, 0x6d, 0xb1, 0x7a, 0x93, 0x50, 0x86, 0x9b, 0x2d, 0x69, 0x60,
0xbc, 0x0b, 0x27, 0x3f, 0xe5, 0xbc, 0xae, 0xd8, 0xb6, 0xd7, 0x76, 0x59, 0x89, 0xdc, 0x69, 0x13,
0xca, 0x50, 0x16, 0x52, 0xb8, 0x5a, 0xf5, 0x09, 0xa5, 0x59, 0x6d, 0x59, 0x5b, 0x3f, 0x56, 0x0a,
0xa6, 0x97, 0xd3, 0x0f, 0x9f, 0xe4, 0xa7, 0xfe, 0x7e, 0x92, 0x9f, 0x32, 0x6c, 0x58, 0x18, 0x3c,
0x4a, 0x5b, 0x9e, 0x4b, 0x09, 0x3f, 0x5b, 0xc1, 0x0d, 0xec, 0xda, 0x24, 0x38, 0xab, 0xa6, 0xe8,
0x4d, 0x38, 0x66, 0x7b, 0x55, 0x52, 0xae, 0x61, 0x5a, 0xcb, 0x4e, 0x8b, 0xbd, 0x34, 0x5f, 0xf8,
0x10, 0xd3, 0x1a, 0x5a, 0x80, 0x19, 0xd7, 0xe3, 0x87, 0x12, 0xcb, 0xda, 0x7a, 0xb2, 0x24, 0x27,
0xc6, 0xfb, 0x70, 0x46, 0x80, 0xec, 0x88, 0x40, 0xfe, 0x07, 0x96, 0x0f, 0x34, 0xd0, 0x47, 0x79,
0x50, 0x64, 0x57, 0xe0, 0x84, 0x7c, 0xa3, 0xf2, 0xa0, 0xa7, 0xe3, 0x72, 0xf5, 0x8a, 0x5c, 0x44,
0x3a, 0xa4, 0x29, 0x07, 0xe5, 0xfc, 0xa6, 0x05, 0xbf, 0xde, 0x9c, 0xbb, 0xc0, 0xd2, 0x6b, 0xd9,
0x6d, 0x37, 0x2b, 0xc4, 0x57, 0x37, 0x38, 0xae, 0x56, 0x3f, 0x11, 0x8b, 0xc6, 0x75, 0x58, 0x14,
0x3c, 0x3e, 0xc7, 0x8d, 0x7a, 0x15, 0x33, 0xcf, 0x1f, 0xba, 0xcc, 0x59, 0x98, 0xb3, 0x3d, 0x77,
0x98, 0x47, 0x86, 0xaf, 0x5d, 0x89, 0xdc, 0xea, 0x91, 0x06, 0x4b, 0x31, 0xde, 0xd4, 0xc5, 0xd6,
0xe0, 0xb5, 0x80, 0xd5, 0xa0, 0xc7, 0x80, 0xec, 0x2b, 0xbc, 0x5a, 0x90, 0x44, 0x45, 0xf9, 0xce,
0x2f, 0xf3, 0x3c, 0x6f, 0xa9, 0x24, 0xea, 0x1d, 0x9d, 0x94, 0x44, 0xc6, 0x75, 0x05, 0xf6, 0x19,
0xf3, 0x7c, 0xec, 0x4c, 0x06, 0x43, 0xf3, 0x90, 0xd8, 0x27, 0x07, 0x2a, 0xdf, 0xf8, 0x30, 0x04,
0xbf, 0xa5, 0xe0, 0x7b, 0xce, 0x14, 0xfc, 0x02, 0xcc, 0x74, 0x70, 0xa3, 0x1d, 0x80, 0xcb, 0x89,
0x71, 0x09, 0xe6, 0x55, 0x2a, 0x55, 0x5f, 0xea, 0x92, 0x6b, 0xf0, 0x7a, 0xe8, 0x9c, 0x82, 0x40,
0x90, 0xe4, 0xb9, 0x2f, 0x4e, 0xcd, 0x95, 0xc4, 0xd8, 0xb8, 0x0b, 0x48, 0x18, 0xee, 0x75, 0x6f,
0x78, 0x0e, 0x0d, 0x20, 0x10, 0x24, 0xc5, 0x1f, 0x23, 0xfd, 0x8b, 0x31, 0xba, 0x0a, 0xd0, 0xaf,
0x20, 0xe2, 0x6e, 0x99, 0xc2, 0xaa, 0x29, 0x93, 0xd6, 0xe4, 0xe5, 0xc6, 0x94, 0xf5, 0x4a, 0x95,
0x1b, 0xf3, 0x56, 0x3f, 0x54, 0xa5, 0xd0, 0xc9, 0x10, 0xc9, 0xef, 0x35, 0x15, 0xd8, 0x00, 0x5c,
0xf1, 0xdc, 0x80, 0x64, 0xc3, 0x73, 0xf8, 0xed, 0x12, 0xeb, 0x99, 0xc2, 0x29, 0x73, 0xb8, 0xf4,
0x99, 0x37, 0x3c, 0xa7, 0x24, 0x4c, 0xd0, 0xb5, 0x11, 0xa4, 0xd6, 0x26, 0x92, 0x92, 0x38, 0x61,
0x56, 0xc6, 0x82, 0x8a, 0xc3, 0x2d, 0xec, 0xe3, 0x66, 0x10, 0x07, 0xe3, 0xa6, 0x22, 0x18, 0xac,
0x2a, 0x82, 0x97, 0x60, 0xb6, 0x25, 0x56, 0x44, 0x80, 0x32, 0x85, 0x6c, 0x94, 0xa2, 0x3c, 0x51,
0x4c, 0x3e, 0x7d, 0x9e, 0x9f, 0x2a, 0x29, 0x6b, 0xe3, 0x3d, 0x38, 0xb1, 0xcb, 0x6a, 0x3b, 0xb8,
0xd1, 0x08, 0x05, 0x1a, 0xfb, 0x0e, 0x0d, 0x9e, 0x84, 0x8f, 0xd1, 0x69, 0x48, 0x39, 0x98, 0x96,
0x6d, 0xdc, 0x52, 0x7f, 0xc7, 0xac, 0x83, 0xe9, 0x0e, 0x6e, 0x19, 0x6b, 0x70, 0x72, 0x97, 0xb2,
0x7a, 0x13, 0x33, 0x72, 0x0d, 0xf7, 0xd9, 0xcc, 0x43, 0xc2, 0xc1, 0xd2, 0x45, 0xb2, 0xc4, 0x87,
0xc6, 0x5f, 0xd3, 0x41, 0x60, 0x7d, 0x6c, 0x93, 0xbd, 0x6e, 0x80, 0xb6, 0x0d, 0x89, 0x26, 0x75,
0x14, 0xe9, 0x7c, 0x94, 0xf4, 0x4d, 0xea, 0xec, 0xf2, 0x35, 0xd2, 0x6e, 0xee, 0x75, 0x4b, 0xdc,
0x16, 0x7d, 0x00, 0x73, 0x8c, 0x3b, 0x29, 0xdb, 0x9e, 0x7b, 0xbb, 0xee, 0x88, 0xbf, 0x31, 0x53,
0x58, 0x8a, 0x9e, 0x15, 0x50, 0x3b, 0xc2, 0xa8, 0x94, 0x61, 0xfd, 0x09, 0xda, 0x81, 0xb9, 0x96,
0x4f, 0xaa, 0xc4, 0x26, 0x94, 0x7a, 0x3e, 0xcd, 0x26, 0xc5, 0xab, 0x4e, 0x44, 0x1f, 0x38, 0xc4,
0x4b, 0x55, 0xa5, 0xe1, 0xd9, 0xfb, 0x41, 0x51, 0x98, 0x59, 0xd6, 0xd6, 0x13, 0xa5, 0x8c, 0x58,
0x93, 0x25, 0x01, 0x2d, 0x01, 0x48, 0x13, 0x91, 0xb9, 0xb3, 0x22, 0x73, 0x8f, 0x89, 0x15, 0x51,
0xec, 0x77, 0x82, 0x6d, 0xae, 0x47, 0xd9, 0x94, 0xb8, 0x86, 0x6e, 0x4a, 0xb1, 0x32, 0x03, 0xb1,
0x32, 0xf7, 0x02, 0xb1, 0x2a, 0xa6, 0xf9, 0xcb, 0x3d, 0xfe, 0x3d, 0xaf, 0x29, 0x27, 0x7c, 0xe7,
0xe3, 0x64, 0x7a, 0x7a, 0x3e, 0x51, 0x4a, 0xb3, 0x6e, 0xb9, 0xee, 0x56, 0x49, 0xd7, 0xd8, 0x54,
0x3f, 0x73, 0x2f, 0xce, 0xfd, 0x3f, 0xad, 0x8a, 0x19, 0x0e, 0x9e, 0x95, 0x8f, 0x8d, 0x1f, 0xa7,
0xe1, 0x8d, 0xbe, 0x71, 0x91, 0xfb, 0x0c, 0xbd, 0x0b, 0xeb, 0x06, 0xf9, 0x3e, 0xf9, 0x5d, 0x58,
0x97, 0xbe, 0x82, 0x77, 0xf9, 0x7f, 0x84, 0xd4, 0xb8, 0x08, 0xa7, 0x23, 0x51, 0x19, 0x13, 0xc5,
0x53, 0xbd, 0xc2, 0x4f, 0xc9, 0x55, 0x12, 0x14, 0x18, 0xe3, 0xcb, 0x5e, 0x51, 0x57, 0xcb, 0xca,
0xc5, 0x2e, 0xa4, 0x79, 0x15, 0x28, 0xdf, 0x26, 0xaa, 0xb0, 0x16, 0x37, 0x7f, 0x7b, 0x9e, 0x5f,
0x75, 0xea, 0xac, 0xd6, 0xae, 0x98, 0xb6, 0xd7, 0xb4, 0x54, 0xbf, 0x24, 0x3f, 0x17, 0x69, 0x75,
0xdf, 0x62, 0x07, 0x2d, 0x42, 0xcd, 0x8f, 0x5c, 0xc6, 0x15, 0x40, 0xb8, 0x2b, 0xfc, 0x33, 0x07,
0x33, 0xc2, 0x3f, 0xfa, 0x4e, 0x83, 0x94, 0x12, 0x3e, 0xb4, 0x12, 0x8d, 0xf6, 0x88, 0xce, 0x46,
0x5f, 0x9d, 0x64, 0x26, 0xb9, 0x1a, 0x17, 0xbe, 0xfd, 0xe5, 0xcf, 0x1f, 0xa6, 0x57, 0xd0, 0x39,
0x2b, 0xd2, 0x5d, 0x29, 0xf1, 0xb3, 0xee, 0xa9, 0x4a, 0x7f, 0x1f, 0xfd, 0xa4, 0xc1, 0xf1, 0x81,
0xfe, 0x02, 0x5d, 0x88, 0x81, 0x19, 0xd5, 0xc7, 0xe8, 0x5b, 0x47, 0x33, 0x56, 0xcc, 0x0a, 0x82,
0xd9, 0x16, 0xda, 0x8c, 0x32, 0x0b, 0x5a, 0x99, 0x08, 0xc1, 0x9f, 0x35, 0x98, 0x1f, 0x6e, 0x15,
0x90, 0x19, 0x03, 0x1b, 0xd3, 0xa1, 0xe8, 0xd6, 0x91, 0xed, 0x15, 0xd3, 0xcb, 0x82, 0xe9, 0x3b,
0xa8, 0x10, 0x65, 0xda, 0x09, 0xce, 0xf4, 0xc9, 0x86, 0xbb, 0x9f, 0xfb, 0xe8, 0x81, 0x06, 0x29,
0xd5, 0x14, 0xc4, 0x3e, 0xed, 0x60, 0xbf, 0x11, 0xfb, 0xb4, 0x43, 0xbd, 0x85, 0xb1, 0x25, 0x68,
0xad, 0xa2, 0xf3, 0x51, 0x5a, 0xaa, 0xc9, 0xa0, 0xa1, 0xd0, 0x3d, 0xd2, 0x20, 0xa5, 0xda, 0x83,
0x58, 0x22, 0x83, 0xbd, 0x48, 0x2c, 0x91, 0xa1, 0x2e, 0xc3, 0xd8, 0x16, 0x44, 0x2e, 0xa0, 0x8d,
0x28, 0x11, 0x2a, 0x4d, 0xfb, 0x3c, 0xac, 0x7b, 0xfb, 0xe4, 0xe0, 0x3e, 0xba, 0x0b, 0x49, 0xde,
0x45, 0x20, 0x23, 0x36, 0x65, 0x7a, 0xad, 0x89, 0x7e, 0x6e, 0xac, 0x8d, 0xe2, 0xb0, 0x21, 0x38,
0x9c, 0x43, 0x67, 0x47, 0x65, 0x53, 0x75, 0x20, 0x12, 0x5f, 0xc1, 0xac, 0x14, 0x52, 0x74, 0x3e,
0xc6, 0xf3, 0x80, 0x5e, 0xeb, 0x2b, 0x13, 0xac, 0x14, 0x83, 0x65, 0xc1, 0x40, 0x47, 0xd9, 0x28,
0x03, 0xa9, 0xd4, 0xa8, 0x0b, 0x29, 0xa5, 0xd4, 0x68, 0x39, 0xea, 0x73, 0x50, 0xc4, 0xf5, 0xb5,
0x49, 0x15, 0x3b, 0xc0, 0x35, 0x04, 0xee, 0x22, 0xd2, 0xa3, 0xb8, 0x84, 0xd5, 0xca, 0x36, 0x87,
0xfb, 0x06, 0x32, 0x21, 0x91, 0x3f, 0x02, 0xfa, 0x88, 0x3b, 0x8f, 0xe8, 0x12, 0x8c, 0x55, 0x81,
0xbd, 0x8c, 0x72, 0x23, 0xb0, 0x95, 0x79, 0xd9, 0xc1, 0x14, 0x7d, 0x0d, 0x29, 0xa5, 0x66, 0xb1,
0xb9, 0x37, 0xd8, 0x55, 0xc4, 0xe6, 0xde, 0x90, 0x28, 0x8e, 0xbb, 0xbd, 0x94, 0x32, 0xd6, 0x45,
0x0f, 0x35, 0x80, 0xbe, 0x12, 0xa0, 0xf5, 0x71, 0xae, 0xc3, 0x12, 0xaa, 0x6f, 0x1c, 0xc1, 0x52,
0xf1, 0x58, 0x11, 0x3c, 0xf2, 0x68, 0x29, 0x8e, 0x87, 0x10, 0x27, 0x1e, 0x08, 0xa5, 0x26, 0x63,
0xaa, 0x41, 0x58, 0x84, 0xc6, 0x54, 0x83, 0x01, 0x51, 0x1a, 0x17, 0x88, 0x40, 0xac, 0x8a, 0xc5,
0xa7, 0x2f, 0x72, 0xda, 0xb3, 0x17, 0x39, 0xed, 0x8f, 0x17, 0x39, 0xed, 0xf1, 0x61, 0x6e, 0xea,
0xd9, 0x61, 0x6e, 0xea, 0xd7, 0xc3, 0xdc, 0xd4, 0x17, 0xeb, 0x21, 0xf1, 0x62, 0x35, 0xec, 0xd3,
0x3a, 0x0d, 0xf9, 0xe9, 0x0a, 0x4f, 0x42, 0xc2, 0x2a, 0xb3, 0x42, 0x83, 0xdf, 0xfe, 0x37, 0x00,
0x00, 0xff, 0xff, 0xe3, 0x18, 0xf8, 0xf5, 0x5a, 0x10, 0x00, 0x00,
}
// Reference imports to suppress errors if they are not otherwise used.
@ -1299,6 +1383,9 @@ type QueryClient interface {
TraceTx(ctx context.Context, in *QueryTraceTxRequest, opts ...grpc.CallOption) (*QueryTraceTxResponse, error)
// TraceBlock implements the `debug_traceBlockByNumber` and `debug_traceBlockByHash` rpc api
TraceBlock(ctx context.Context, in *QueryTraceBlockRequest, opts ...grpc.CallOption) (*QueryTraceBlockResponse, error)
// BaseFee queries the base fee of the parent block of the current block,
// it's similar to feemarket module's method, but also checks london hardfork status.
BaseFee(ctx context.Context, in *QueryBaseFeeRequest, opts ...grpc.CallOption) (*QueryBaseFeeResponse, error)
}
type queryClient struct {
@ -1408,6 +1495,15 @@ func (c *queryClient) TraceBlock(ctx context.Context, in *QueryTraceBlockRequest
return out, nil
}
func (c *queryClient) BaseFee(ctx context.Context, in *QueryBaseFeeRequest, opts ...grpc.CallOption) (*QueryBaseFeeResponse, error) {
out := new(QueryBaseFeeResponse)
err := c.cc.Invoke(ctx, "/ethermint.evm.v1.Query/BaseFee", in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
// QueryServer is the server API for Query service.
type QueryServer interface {
// Account queries an Ethereum account.
@ -1434,6 +1530,9 @@ type QueryServer interface {
TraceTx(context.Context, *QueryTraceTxRequest) (*QueryTraceTxResponse, error)
// TraceBlock implements the `debug_traceBlockByNumber` and `debug_traceBlockByHash` rpc api
TraceBlock(context.Context, *QueryTraceBlockRequest) (*QueryTraceBlockResponse, error)
// BaseFee queries the base fee of the parent block of the current block,
// it's similar to feemarket module's method, but also checks london hardfork status.
BaseFee(context.Context, *QueryBaseFeeRequest) (*QueryBaseFeeResponse, error)
}
// UnimplementedQueryServer can be embedded to have forward compatible implementations.
@ -1473,6 +1572,9 @@ func (*UnimplementedQueryServer) TraceTx(ctx context.Context, req *QueryTraceTxR
func (*UnimplementedQueryServer) TraceBlock(ctx context.Context, req *QueryTraceBlockRequest) (*QueryTraceBlockResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method TraceBlock not implemented")
}
func (*UnimplementedQueryServer) BaseFee(ctx context.Context, req *QueryBaseFeeRequest) (*QueryBaseFeeResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method BaseFee not implemented")
}
func RegisterQueryServer(s grpc1.Server, srv QueryServer) {
s.RegisterService(&_Query_serviceDesc, srv)
@ -1676,6 +1778,24 @@ func _Query_TraceBlock_Handler(srv interface{}, ctx context.Context, dec func(in
return interceptor(ctx, in, info, handler)
}
func _Query_BaseFee_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(QueryBaseFeeRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(QueryServer).BaseFee(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/ethermint.evm.v1.Query/BaseFee",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(QueryServer).BaseFee(ctx, req.(*QueryBaseFeeRequest))
}
return interceptor(ctx, in, info, handler)
}
var _Query_serviceDesc = grpc.ServiceDesc{
ServiceName: "ethermint.evm.v1.Query",
HandlerType: (*QueryServer)(nil),
@ -1724,6 +1844,10 @@ var _Query_serviceDesc = grpc.ServiceDesc{
MethodName: "TraceBlock",
Handler: _Query_TraceBlock_Handler,
},
{
MethodName: "BaseFee",
Handler: _Query_BaseFee_Handler,
},
},
Streams: []grpc.StreamDesc{},
Metadata: "ethermint/evm/v1/query.proto",
@ -2548,6 +2672,64 @@ func (m *QueryTraceBlockResponse) MarshalToSizedBuffer(dAtA []byte) (int, error)
return len(dAtA) - i, nil
}
func (m *QueryBaseFeeRequest) Marshal() (dAtA []byte, err error) {
size := m.Size()
dAtA = make([]byte, size)
n, err := m.MarshalToSizedBuffer(dAtA[:size])
if err != nil {
return nil, err
}
return dAtA[:n], nil
}
func (m *QueryBaseFeeRequest) MarshalTo(dAtA []byte) (int, error) {
size := m.Size()
return m.MarshalToSizedBuffer(dAtA[:size])
}
func (m *QueryBaseFeeRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) {
i := len(dAtA)
_ = i
var l int
_ = l
return len(dAtA) - i, nil
}
func (m *QueryBaseFeeResponse) Marshal() (dAtA []byte, err error) {
size := m.Size()
dAtA = make([]byte, size)
n, err := m.MarshalToSizedBuffer(dAtA[:size])
if err != nil {
return nil, err
}
return dAtA[:n], nil
}
func (m *QueryBaseFeeResponse) MarshalTo(dAtA []byte) (int, error) {
size := m.Size()
return m.MarshalToSizedBuffer(dAtA[:size])
}
func (m *QueryBaseFeeResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) {
i := len(dAtA)
_ = i
var l int
_ = l
if m.BaseFee != nil {
{
size := m.BaseFee.Size()
i -= size
if _, err := m.BaseFee.MarshalTo(dAtA[i:]); err != nil {
return 0, err
}
i = encodeVarintQuery(dAtA, i, uint64(size))
}
i--
dAtA[i] = 0xa
}
return len(dAtA) - i, nil
}
func encodeVarintQuery(dAtA []byte, offset int, v uint64) int {
offset -= sovQuery(v)
base := offset
@ -2908,6 +3090,28 @@ func (m *QueryTraceBlockResponse) Size() (n int) {
return n
}
func (m *QueryBaseFeeRequest) Size() (n int) {
if m == nil {
return 0
}
var l int
_ = l
return n
}
func (m *QueryBaseFeeResponse) Size() (n int) {
if m == nil {
return 0
}
var l int
_ = l
if m.BaseFee != nil {
l = m.BaseFee.Size()
n += 1 + l + sovQuery(uint64(l))
}
return n
}
func sovQuery(x uint64) (n int) {
return (math_bits.Len64(x|1) + 6) / 7
}
@ -5214,6 +5418,142 @@ func (m *QueryTraceBlockResponse) Unmarshal(dAtA []byte) error {
}
return nil
}
func (m *QueryBaseFeeRequest) Unmarshal(dAtA []byte) error {
l := len(dAtA)
iNdEx := 0
for iNdEx < l {
preIndex := iNdEx
var wire uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowQuery
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
wire |= uint64(b&0x7F) << shift
if b < 0x80 {
break
}
}
fieldNum := int32(wire >> 3)
wireType := int(wire & 0x7)
if wireType == 4 {
return fmt.Errorf("proto: QueryBaseFeeRequest: wiretype end group for non-group")
}
if fieldNum <= 0 {
return fmt.Errorf("proto: QueryBaseFeeRequest: illegal tag %d (wire type %d)", fieldNum, wire)
}
switch fieldNum {
default:
iNdEx = preIndex
skippy, err := skipQuery(dAtA[iNdEx:])
if err != nil {
return err
}
if (skippy < 0) || (iNdEx+skippy) < 0 {
return ErrInvalidLengthQuery
}
if (iNdEx + skippy) > l {
return io.ErrUnexpectedEOF
}
iNdEx += skippy
}
}
if iNdEx > l {
return io.ErrUnexpectedEOF
}
return nil
}
func (m *QueryBaseFeeResponse) Unmarshal(dAtA []byte) error {
l := len(dAtA)
iNdEx := 0
for iNdEx < l {
preIndex := iNdEx
var wire uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowQuery
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
wire |= uint64(b&0x7F) << shift
if b < 0x80 {
break
}
}
fieldNum := int32(wire >> 3)
wireType := int(wire & 0x7)
if wireType == 4 {
return fmt.Errorf("proto: QueryBaseFeeResponse: wiretype end group for non-group")
}
if fieldNum <= 0 {
return fmt.Errorf("proto: QueryBaseFeeResponse: illegal tag %d (wire type %d)", fieldNum, wire)
}
switch fieldNum {
case 1:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field BaseFee", wireType)
}
var stringLen uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowQuery
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
stringLen |= uint64(b&0x7F) << shift
if b < 0x80 {
break
}
}
intStringLen := int(stringLen)
if intStringLen < 0 {
return ErrInvalidLengthQuery
}
postIndex := iNdEx + intStringLen
if postIndex < 0 {
return ErrInvalidLengthQuery
}
if postIndex > l {
return io.ErrUnexpectedEOF
}
var v github_com_cosmos_cosmos_sdk_types.Int
m.BaseFee = &v
if err := m.BaseFee.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
return err
}
iNdEx = postIndex
default:
iNdEx = preIndex
skippy, err := skipQuery(dAtA[iNdEx:])
if err != nil {
return err
}
if (skippy < 0) || (iNdEx+skippy) < 0 {
return ErrInvalidLengthQuery
}
if (iNdEx + skippy) > l {
return io.ErrUnexpectedEOF
}
iNdEx += skippy
}
}
if iNdEx > l {
return io.ErrUnexpectedEOF
}
return nil
}
func skipQuery(dAtA []byte) (n int, err error) {
l := len(dAtA)
iNdEx := 0

View File

@ -539,6 +539,24 @@ func local_request_Query_TraceBlock_0(ctx context.Context, marshaler runtime.Mar
}
func request_Query_BaseFee_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
var protoReq QueryBaseFeeRequest
var metadata runtime.ServerMetadata
msg, err := client.BaseFee(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
return msg, metadata, err
}
func local_request_Query_BaseFee_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
var protoReq QueryBaseFeeRequest
var metadata runtime.ServerMetadata
msg, err := server.BaseFee(ctx, &protoReq)
return msg, metadata, err
}
// RegisterQueryHandlerServer registers the http handlers for service Query to "mux".
// UnaryRPC :call QueryServer directly.
// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906.
@ -765,6 +783,26 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv
})
mux.Handle("GET", pattern_Query_BaseFee_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
ctx, cancel := context.WithCancel(req.Context())
defer cancel()
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req)
if err != nil {
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
return
}
resp, md, err := local_request_Query_BaseFee_0(rctx, inboundMarshaler, server, req, pathParams)
ctx = runtime.NewServerMetadataContext(ctx, md)
if err != nil {
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
return
}
forward_Query_BaseFee_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
})
return nil
}
@ -1026,6 +1064,26 @@ func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie
})
mux.Handle("GET", pattern_Query_BaseFee_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
ctx, cancel := context.WithCancel(req.Context())
defer cancel()
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
rctx, err := runtime.AnnotateContext(ctx, mux, req)
if err != nil {
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
return
}
resp, md, err := request_Query_BaseFee_0(rctx, inboundMarshaler, client, req, pathParams)
ctx = runtime.NewServerMetadataContext(ctx, md)
if err != nil {
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
return
}
forward_Query_BaseFee_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
})
return nil
}
@ -1051,6 +1109,8 @@ var (
pattern_Query_TraceTx_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"ethermint", "evm", "v1", "trace_tx"}, "", runtime.AssumeColonVerbOpt(true)))
pattern_Query_TraceBlock_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"ethermint", "evm", "v1", "trace_block"}, "", runtime.AssumeColonVerbOpt(true)))
pattern_Query_BaseFee_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"ethermint", "evm", "v1", "base_fee"}, "", runtime.AssumeColonVerbOpt(true)))
)
var (
@ -1075,4 +1135,6 @@ var (
forward_Query_TraceTx_0 = runtime.ForwardResponseMessage
forward_Query_TraceBlock_0 = runtime.ForwardResponseMessage
forward_Query_BaseFee_0 = runtime.ForwardResponseMessage
)