evm, rpc: query ChainConfig via gRPC (#239)

* evm, rpc: query ChainConfig via gRPC

* c++
This commit is contained in:
Federico Kunze Küllmer 2021-07-08 10:46:42 -04:00 committed by GitHub
parent 61296071e3
commit 623863231b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
14 changed files with 864 additions and 128 deletions

View File

@ -57,6 +57,7 @@ Ref: https://keepachangelog.com/en/1.0.0/
### Improvements ### Improvements
* (gRPC) [tharsis#239](https://github.com/tharsis/ethermint/pull/239) Query `ChainConfig` via gRPC.
* (rpc) [tharsis#181](https://github.com/tharsis/ethermint/pull/181) Use evm denomination for params on tx fee. * (rpc) [tharsis#181](https://github.com/tharsis/ethermint/pull/181) Use evm denomination for params on tx fee.
* (deps) [tharsis#165](https://github.com/tharsis/ethermint/pull/165) Bump Cosmos SDK and Tendermint versions to [v0.42.6](https://github.com/cosmos/cosmos-sdk/releases/tag/v0.42.6) and [v0.34.11](https://github.com/tendermint/tendermint/releases/tag/v0.34.11), respectively. * (deps) [tharsis#165](https://github.com/tharsis/ethermint/pull/165) Bump Cosmos SDK and Tendermint versions to [v0.42.6](https://github.com/cosmos/cosmos-sdk/releases/tag/v0.42.6) and [v0.34.11](https://github.com/tendermint/tendermint/releases/tag/v0.34.11), respectively.
* (evm) [tharsis#66](https://github.com/tharsis/ethermint/issues/66) Support legacy transaction types for signing. * (evm) [tharsis#66](https://github.com/tharsis/ethermint/issues/66) Support legacy transaction types for signing.

File diff suppressed because one or more lines are too long

View File

@ -328,6 +328,113 @@ paths:
type: boolean type: boolean
tags: tags:
- Query - Query
/ethermint/evm/v1alpha1/chain_config:
get:
summary: ChainConfig queries the chain configuration values of EVM.
operationId: ChainConfig
responses:
'200':
description: A successful response.
schema:
type: object
properties:
config:
description: ChainConfig define the evm chain configuration.
type: object
properties:
homestead_block:
type: string
title: >-
Homestead switch block (< 0 no fork, 0 = already
homestead)
dao_fork_block:
type: string
title: TheDAO hard-fork switch block (< 0 no fork)
dao_fork_support:
type: boolean
title: Whether the nodes supports or opposes the DAO hard-fork
eip150_block:
type: string
title: >-
EIP150 implements the Gas price changes
(https://github.com/ethereum/EIPs/issues/150) EIP150 HF
block (< 0 no fork)
eip150_hash:
type: string
title: >-
EIP150 HF hash (needed for header only clients as only gas
pricing changed)
eip155_block:
type: string
title: EIP155Block HF block
eip158_block:
type: string
title: EIP158 HF block
byzantium_block:
type: string
title: >-
Byzantium switch block (< 0 no fork, 0 = already on
byzantium)
constantinople_block:
type: string
title: >-
Constantinople switch block (< 0 no fork, 0 = already
activated)
petersburg_block:
type: string
title: Petersburg switch block (< 0 same as Constantinople)
istanbul_block:
type: string
title: >-
Istanbul switch block (< 0 no fork, 0 = already on
istanbul)
muir_glacier_block:
type: string
title: >-
Eip-2384 (bomb delay) switch block (< 0 no fork, 0 =
already activated)
berlin_block:
type: string
title: 'Berlin switch block (< 0 = no fork, 0 = already on berlin)'
yolo_v3_block:
type: string
title: 'YOLO v3: Gas repricings'
ewasm_block:
type: string
title: 'EWASM switch block (< 0 no fork, 0 = already activated)'
catalyst_block:
type: string
title: >-
Catalyst switch block (< 0 = no fork, 0 = already on
catalyst)
description: >-
QueryChainConfigResponse defines the response type for querying
x/evm chain configuration.
default:
description: An unexpected error response.
schema:
type: object
properties:
error:
type: string
code:
type: integer
format: int32
message:
type: string
details:
type: array
items:
type: object
properties:
type_url:
type: string
value:
type: string
format: byte
tags:
- Query
'/ethermint/evm/v1alpha1/codes/{address}': '/ethermint/evm/v1alpha1/codes/{address}':
get: get:
summary: Code queries the balance of all coins for a single account. summary: Code queries the balance of all coins for a single account.
@ -10500,6 +10607,87 @@ definitions:
repeated Bar results = 1; repeated Bar results = 1;
PageResponse page = 2; PageResponse page = 2;
} }
ethermint.evm.v1alpha1.ChainConfig:
type: object
properties:
homestead_block:
type: string
title: 'Homestead switch block (< 0 no fork, 0 = already homestead)'
dao_fork_block:
type: string
title: TheDAO hard-fork switch block (< 0 no fork)
dao_fork_support:
type: boolean
title: Whether the nodes supports or opposes the DAO hard-fork
eip150_block:
type: string
title: >-
EIP150 implements the Gas price changes
(https://github.com/ethereum/EIPs/issues/150) EIP150 HF block (< 0 no
fork)
eip150_hash:
type: string
title: >-
EIP150 HF hash (needed for header only clients as only gas pricing
changed)
eip155_block:
type: string
title: EIP155Block HF block
eip158_block:
type: string
title: EIP158 HF block
byzantium_block:
type: string
title: 'Byzantium switch block (< 0 no fork, 0 = already on byzantium)'
constantinople_block:
type: string
title: 'Constantinople switch block (< 0 no fork, 0 = already activated)'
petersburg_block:
type: string
title: Petersburg switch block (< 0 same as Constantinople)
istanbul_block:
type: string
title: 'Istanbul switch block (< 0 no fork, 0 = already on istanbul)'
muir_glacier_block:
type: string
title: >-
Eip-2384 (bomb delay) switch block (< 0 no fork, 0 = already
activated)
berlin_block:
type: string
title: 'Berlin switch block (< 0 = no fork, 0 = already on berlin)'
yolo_v3_block:
type: string
title: 'YOLO v3: Gas repricings'
ewasm_block:
type: string
title: 'EWASM switch block (< 0 no fork, 0 = already activated)'
catalyst_block:
type: string
title: 'Catalyst switch block (< 0 = no fork, 0 = already on catalyst)'
description: >-
ChainConfig defines the Ethereum ChainConfig parameters using sdk.Int
values
instead of big.Int.
NOTE 1: Since empty/uninitialized Ints (i.e with a nil big.Int value) are
parsed to zero, we need to manually specify that negative Int values will
be
considered as nil. See getBlockValue for reference.
NOTE 2: This type is not a configurable Param since the SDK does not allow
for validation against a previous stored parameter values or the current
block height (retrieved from context). If you want to update the config
values, use an software upgrade procedure.
ethermint.evm.v1alpha1.Log: ethermint.evm.v1alpha1.Log:
type: object type: object
properties: properties:
@ -10698,6 +10886,72 @@ definitions:
was set, its value is undefined otherwise was set, its value is undefined otherwise
description: QueryTxLogs is the response type for the Query/BlockLogs RPC method. description: QueryTxLogs is the response type for the Query/BlockLogs RPC method.
ethermint.evm.v1alpha1.QueryChainConfigResponse:
type: object
properties:
config:
description: ChainConfig define the evm chain configuration.
type: object
properties:
homestead_block:
type: string
title: 'Homestead switch block (< 0 no fork, 0 = already homestead)'
dao_fork_block:
type: string
title: TheDAO hard-fork switch block (< 0 no fork)
dao_fork_support:
type: boolean
title: Whether the nodes supports or opposes the DAO hard-fork
eip150_block:
type: string
title: >-
EIP150 implements the Gas price changes
(https://github.com/ethereum/EIPs/issues/150) EIP150 HF block (< 0
no fork)
eip150_hash:
type: string
title: >-
EIP150 HF hash (needed for header only clients as only gas pricing
changed)
eip155_block:
type: string
title: EIP155Block HF block
eip158_block:
type: string
title: EIP158 HF block
byzantium_block:
type: string
title: 'Byzantium switch block (< 0 no fork, 0 = already on byzantium)'
constantinople_block:
type: string
title: 'Constantinople switch block (< 0 no fork, 0 = already activated)'
petersburg_block:
type: string
title: Petersburg switch block (< 0 same as Constantinople)
istanbul_block:
type: string
title: 'Istanbul switch block (< 0 no fork, 0 = already on istanbul)'
muir_glacier_block:
type: string
title: >-
Eip-2384 (bomb delay) switch block (< 0 no fork, 0 = already
activated)
berlin_block:
type: string
title: 'Berlin switch block (< 0 = no fork, 0 = already on berlin)'
yolo_v3_block:
type: string
title: 'YOLO v3: Gas repricings'
ewasm_block:
type: string
title: 'EWASM switch block (< 0 no fork, 0 = already activated)'
catalyst_block:
type: string
title: 'Catalyst switch block (< 0 = no fork, 0 = already on catalyst)'
description: >-
QueryChainConfigResponse defines the response type for querying x/evm
chain configuration.
ethermint.evm.v1alpha1.QueryCodeResponse: ethermint.evm.v1alpha1.QueryCodeResponse:
type: object type: object
properties: properties:

View File

@ -30,6 +30,8 @@
- [QueryBlockBloomResponse](#ethermint.evm.v1alpha1.QueryBlockBloomResponse) - [QueryBlockBloomResponse](#ethermint.evm.v1alpha1.QueryBlockBloomResponse)
- [QueryBlockLogsRequest](#ethermint.evm.v1alpha1.QueryBlockLogsRequest) - [QueryBlockLogsRequest](#ethermint.evm.v1alpha1.QueryBlockLogsRequest)
- [QueryBlockLogsResponse](#ethermint.evm.v1alpha1.QueryBlockLogsResponse) - [QueryBlockLogsResponse](#ethermint.evm.v1alpha1.QueryBlockLogsResponse)
- [QueryChainConfigRequest](#ethermint.evm.v1alpha1.QueryChainConfigRequest)
- [QueryChainConfigResponse](#ethermint.evm.v1alpha1.QueryChainConfigResponse)
- [QueryCodeRequest](#ethermint.evm.v1alpha1.QueryCodeRequest) - [QueryCodeRequest](#ethermint.evm.v1alpha1.QueryCodeRequest)
- [QueryCodeResponse](#ethermint.evm.v1alpha1.QueryCodeResponse) - [QueryCodeResponse](#ethermint.evm.v1alpha1.QueryCodeResponse)
- [QueryCosmosAccountRequest](#ethermint.evm.v1alpha1.QueryCosmosAccountRequest) - [QueryCosmosAccountRequest](#ethermint.evm.v1alpha1.QueryCosmosAccountRequest)
@ -463,6 +465,31 @@ QueryTxLogs is the response type for the Query/BlockLogs RPC method.
<a name="ethermint.evm.v1alpha1.QueryChainConfigRequest"></a>
### QueryChainConfigRequest
QueryChainConfigRequest defines the request type for querying x/evm chain configuration.
<a name="ethermint.evm.v1alpha1.QueryChainConfigResponse"></a>
### QueryChainConfigResponse
QueryChainConfigResponse defines the response type for querying x/evm chain configuration.
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| `config` | [ChainConfig](#ethermint.evm.v1alpha1.ChainConfig) | | ChainConfig define the evm chain configuration. |
<a name="ethermint.evm.v1alpha1.QueryCodeRequest"></a> <a name="ethermint.evm.v1alpha1.QueryCodeRequest"></a>
### QueryCodeRequest ### QueryCodeRequest
@ -699,6 +726,7 @@ Query defines the gRPC querier service.
| `BlockLogs` | [QueryBlockLogsRequest](#ethermint.evm.v1alpha1.QueryBlockLogsRequest) | [QueryBlockLogsResponse](#ethermint.evm.v1alpha1.QueryBlockLogsResponse) | BlockLogs queries all the ethereum logs for a given block hash. | GET|/ethermint/evm/v1alpha1/block_logs/{hash}| | `BlockLogs` | [QueryBlockLogsRequest](#ethermint.evm.v1alpha1.QueryBlockLogsRequest) | [QueryBlockLogsResponse](#ethermint.evm.v1alpha1.QueryBlockLogsResponse) | BlockLogs queries all the ethereum logs for a given block hash. | GET|/ethermint/evm/v1alpha1/block_logs/{hash}|
| `BlockBloom` | [QueryBlockBloomRequest](#ethermint.evm.v1alpha1.QueryBlockBloomRequest) | [QueryBlockBloomResponse](#ethermint.evm.v1alpha1.QueryBlockBloomResponse) | BlockBloom queries the block bloom filter bytes at a given height. | GET|/ethermint/evm/v1alpha1/block_bloom| | `BlockBloom` | [QueryBlockBloomRequest](#ethermint.evm.v1alpha1.QueryBlockBloomRequest) | [QueryBlockBloomResponse](#ethermint.evm.v1alpha1.QueryBlockBloomResponse) | BlockBloom queries the block bloom filter bytes at a given height. | GET|/ethermint/evm/v1alpha1/block_bloom|
| `Params` | [QueryParamsRequest](#ethermint.evm.v1alpha1.QueryParamsRequest) | [QueryParamsResponse](#ethermint.evm.v1alpha1.QueryParamsResponse) | Params queries the parameters of x/evm module. | GET|/ethermint/evm/v1alpha1/params| | `Params` | [QueryParamsRequest](#ethermint.evm.v1alpha1.QueryParamsRequest) | [QueryParamsResponse](#ethermint.evm.v1alpha1.QueryParamsResponse) | Params queries the parameters of x/evm module. | GET|/ethermint/evm/v1alpha1/params|
| `ChainConfig` | [QueryChainConfigRequest](#ethermint.evm.v1alpha1.QueryChainConfigRequest) | [QueryChainConfigResponse](#ethermint.evm.v1alpha1.QueryChainConfigResponse) | ChainConfig queries the chain configuration values of EVM. | GET|/ethermint/evm/v1alpha1/chain_config|
| `StaticCall` | [QueryStaticCallRequest](#ethermint.evm.v1alpha1.QueryStaticCallRequest) | [QueryStaticCallResponse](#ethermint.evm.v1alpha1.QueryStaticCallResponse) | StaticCall queries the static call value of x/evm module. | GET|/ethermint/evm/v1alpha1/static_call| | `StaticCall` | [QueryStaticCallRequest](#ethermint.evm.v1alpha1.QueryStaticCallRequest) | [QueryStaticCallResponse](#ethermint.evm.v1alpha1.QueryStaticCallResponse) | StaticCall queries the static call value of x/evm module. | GET|/ethermint/evm/v1alpha1/static_call|
<!-- end services --> <!-- end services -->

View File

@ -16,6 +16,7 @@ import (
"github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/common/hexutil"
ethtypes "github.com/ethereum/go-ethereum/core/types" ethtypes "github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/params"
ethermint "github.com/tharsis/ethermint/types" ethermint "github.com/tharsis/ethermint/types"
evmtypes "github.com/tharsis/ethermint/x/evm/types" evmtypes "github.com/tharsis/ethermint/x/evm/types"
@ -40,6 +41,8 @@ type Backend interface {
// Used by log filter // Used by log filter
GetTransactionLogs(txHash common.Hash) ([]*ethtypes.Log, error) GetTransactionLogs(txHash common.Hash) ([]*ethtypes.Log, error)
BloomStatus() (uint64, uint64) BloomStatus() (uint64, uint64)
ChainConfig() *params.ChainConfig
} }
var _ Backend = (*EVMBackend)(nil) var _ Backend = (*EVMBackend)(nil)
@ -359,3 +362,14 @@ func (e *EVMBackend) GetLogsByNumber(blockNum types.BlockNumber) ([][]*ethtypes.
func (e *EVMBackend) BloomStatus() (uint64, uint64) { func (e *EVMBackend) BloomStatus() (uint64, uint64) {
return 4096, 0 return 4096, 0
} }
// ChainConfig returns the chain configuration for the chain. This method returns a nil pointer if
// the query fails.
func (e *EVMBackend) ChainConfig() *params.ChainConfig {
res, err := e.queryClient.QueryClient.ChainConfig(e.ctx, &evmtypes.QueryChainConfigRequest{})
if err != nil {
return nil
}
return res.Config.EthereumConfig(e.chainID)
}

4
go.mod
View File

@ -45,8 +45,8 @@ require (
github.com/xlab/closer v0.0.0-20190328110542-03326addb7c2 github.com/xlab/closer v0.0.0-20190328110542-03326addb7c2
github.com/xlab/suplog v1.3.0 github.com/xlab/suplog v1.3.0
golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e // indirect golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e // indirect
google.golang.org/genproto v0.0.0-20210701191553-46259e63a0a9 google.golang.org/genproto v0.0.0-20210707164411-8c882eb9abba
google.golang.org/grpc v1.38.0 google.golang.org/grpc v1.39.0
gopkg.in/yaml.v2 v2.4.0 gopkg.in/yaml.v2 v2.4.0
nhooyr.io/websocket v1.8.7 // indirect nhooyr.io/websocket v1.8.7 // indirect
) )

10
go.sum
View File

@ -192,6 +192,7 @@ github.com/cloudflare/cloudflare-go v0.14.0/go.mod h1:EnwdgGMaFOruiPZRFSgn+TsQ3h
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8=
github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI=
github.com/coinbase/rosetta-sdk-go v0.5.8/go.mod h1:xd4wYUhV3LkY78SPH8BUhc88rXfn2jYgN9BfiSjbcvM= github.com/coinbase/rosetta-sdk-go v0.5.8/go.mod h1:xd4wYUhV3LkY78SPH8BUhc88rXfn2jYgN9BfiSjbcvM=
@ -292,6 +293,7 @@ github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1m
github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po=
github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ=
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
github.com/ethereum/go-ethereum v1.9.23/go.mod h1:JIfVb6esrqALTExdz9hRYvrP0xBDf6wCncIu1hNwHpM= github.com/ethereum/go-ethereum v1.9.23/go.mod h1:JIfVb6esrqALTExdz9hRYvrP0xBDf6wCncIu1hNwHpM=
github.com/ethereum/go-ethereum v1.9.25/go.mod h1:vMkFiYLHI4tgPw4k2j4MHKoovchFE8plZ0M9VMk4/oM= github.com/ethereum/go-ethereum v1.9.25/go.mod h1:vMkFiYLHI4tgPw4k2j4MHKoovchFE8plZ0M9VMk4/oM=
@ -1051,6 +1053,7 @@ go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk=
go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=
go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
@ -1473,8 +1476,8 @@ google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6D
google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A=
google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=
google.golang.org/genproto v0.0.0-20210701191553-46259e63a0a9 h1:HBPuvo39L0DgfVn9eHR3ki/RjZoUFWa+em77e7KFDfs= google.golang.org/genproto v0.0.0-20210707164411-8c882eb9abba h1:7ajVqfUjhvVuXCb+sdXdKsOD53caRpfMofvihWF1314=
google.golang.org/genproto v0.0.0-20210701191553-46259e63a0a9/go.mod h1:yiaVoXHpRzHGyxV3o4DktVWY4mSUErTKaeEOq6C3t3U= google.golang.org/genproto v0.0.0-20210707164411-8c882eb9abba/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k=
google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs=
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
google.golang.org/grpc v1.19.1/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.19.1/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
@ -1502,8 +1505,9 @@ google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAG
google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
google.golang.org/grpc v1.38.0 h1:/9BgsAsa5nWe26HqOlvlgJnqBuktYOLCgjCPqsa56W0=
google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
google.golang.org/grpc v1.39.0 h1:Klz8I9kdtkIN6EpHHUOMLCYhTn/2WAe5a0s1hcBkdTI=
google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE=
google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.0.1/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.0.1/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw=
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=

View File

@ -61,6 +61,11 @@ service Query {
option (google.api.http).get = "/ethermint/evm/v1alpha1/params"; option (google.api.http).get = "/ethermint/evm/v1alpha1/params";
} }
// ChainConfig queries the chain configuration values of EVM.
rpc ChainConfig(QueryChainConfigRequest) returns (QueryChainConfigResponse) {
option (google.api.http).get = "/ethermint/evm/v1alpha1/chain_config";
}
// StaticCall queries the static call value of x/evm module. // StaticCall queries the static call value of x/evm module.
rpc StaticCall(QueryStaticCallRequest) returns (QueryStaticCallResponse) { rpc StaticCall(QueryStaticCallRequest) returns (QueryStaticCallResponse) {
option (google.api.http).get = "/ethermint/evm/v1alpha1/static_call"; option (google.api.http).get = "/ethermint/evm/v1alpha1/static_call";
@ -228,6 +233,15 @@ message QueryParamsResponse {
Params params = 1 [(gogoproto.nullable) = false]; Params params = 1 [(gogoproto.nullable) = false];
} }
// QueryChainConfigRequest defines the request type for querying x/evm chain configuration.
message QueryChainConfigRequest {}
// QueryChainConfigResponse defines the response type for querying x/evm chain configuration.
message QueryChainConfigResponse {
// ChainConfig define the evm chain configuration.
ChainConfig config = 1 [(gogoproto.nullable) = false];
}
// QueryStaticCallRequest defines static call request // QueryStaticCallRequest defines static call request
message QueryStaticCallRequest { message QueryStaticCallRequest {
// address is the ethereum contract hex address to for static call. // address is the ethereum contract hex address to for static call.

View File

@ -35,7 +35,7 @@ message MsgEthereumTx {
// LegacyTx is the transaction data of regular Ethereum transactions. // LegacyTx is the transaction data of regular Ethereum transactions.
message LegacyTx { message LegacyTx {
option (gogoproto.goproto_getters) = false; option (gogoproto.goproto_getters) = false;
option (cosmos_proto.implements_interface) = "TxDataI"; option (cosmos_proto.implements_interface) = "TxData";
// nonce corresponds to the account nonce (transaction sequence). // nonce corresponds to the account nonce (transaction sequence).
uint64 nonce = 1; uint64 nonce = 1;
@ -66,7 +66,7 @@ message LegacyTx {
// AccessListTx is the data of EIP-2930 access list transactions. // AccessListTx is the data of EIP-2930 access list transactions.
message AccessListTx { message AccessListTx {
option (gogoproto.goproto_getters) = false; option (gogoproto.goproto_getters) = false;
option (cosmos_proto.implements_interface) = "TxDataI"; option (cosmos_proto.implements_interface) = "TxData";
// destination EVM chain ID // destination EVM chain ID
string chain_id = 1 [ string chain_id = 1 [

View File

@ -287,6 +287,19 @@ func (k Keeper) Params(c context.Context, _ *types.QueryParamsRequest) (*types.Q
}, nil }, nil
} }
// ChainConfig implements the Query/ChainConfig gRPC method
func (k Keeper) ChainConfig(c context.Context, _ *types.QueryChainConfigRequest) (*types.QueryChainConfigResponse, error) {
ctx := sdk.UnwrapSDKContext(c)
cfg, found := k.GetChainConfig(ctx)
if !found {
return nil, status.Error(codes.NotFound, types.ErrChainConfigNotFound.Error())
}
return &types.QueryChainConfigResponse{
Config: cfg,
}, nil
}
// StaticCall implements Query/StaticCall gRPCP method // StaticCall implements Query/StaticCall gRPCP method
func (k Keeper) StaticCall(c context.Context, req *types.QueryStaticCallRequest) (*types.QueryStaticCallResponse, error) { func (k Keeper) StaticCall(c context.Context, req *types.QueryStaticCallRequest) (*types.QueryStaticCallResponse, error) {
if req == nil { if req == nil {

View File

@ -597,6 +597,15 @@ func (suite *KeeperTestSuite) TestQueryParams() {
suite.Require().Equal(expParams, res.Params) suite.Require().Equal(expParams, res.Params)
} }
func (suite *KeeperTestSuite) TestQueryChainConfig() {
ctx := sdk.WrapSDKContext(suite.ctx)
expChainConfig := types.DefaultChainConfig()
res, err := suite.queryClient.ChainConfig(ctx, &types.QueryChainConfigRequest{})
suite.Require().NoError(err)
suite.Require().Equal(expChainConfig, res.Config)
}
func (suite *KeeperTestSuite) TestQueryValidatorAccount() { func (suite *KeeperTestSuite) TestQueryValidatorAccount() {
var ( var (
req *types.QueryValidatorAccountRequest req *types.QueryValidatorAccountRequest

View File

@ -947,6 +947,89 @@ func (m *QueryParamsResponse) GetParams() Params {
return Params{} return Params{}
} }
// QueryChainConfigRequest defines the request type for querying x/evm chain configuration.
type QueryChainConfigRequest struct {
}
func (m *QueryChainConfigRequest) Reset() { *m = QueryChainConfigRequest{} }
func (m *QueryChainConfigRequest) String() string { return proto.CompactTextString(m) }
func (*QueryChainConfigRequest) ProtoMessage() {}
func (*QueryChainConfigRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_8bbc79ec2b6c5cb2, []int{20}
}
func (m *QueryChainConfigRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
}
func (m *QueryChainConfigRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
if deterministic {
return xxx_messageInfo_QueryChainConfigRequest.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 *QueryChainConfigRequest) XXX_Merge(src proto.Message) {
xxx_messageInfo_QueryChainConfigRequest.Merge(m, src)
}
func (m *QueryChainConfigRequest) XXX_Size() int {
return m.Size()
}
func (m *QueryChainConfigRequest) XXX_DiscardUnknown() {
xxx_messageInfo_QueryChainConfigRequest.DiscardUnknown(m)
}
var xxx_messageInfo_QueryChainConfigRequest proto.InternalMessageInfo
// QueryChainConfigResponse defines the response type for querying x/evm chain configuration.
type QueryChainConfigResponse struct {
// ChainConfig define the evm chain configuration.
Config ChainConfig `protobuf:"bytes,1,opt,name=config,proto3" json:"config"`
}
func (m *QueryChainConfigResponse) Reset() { *m = QueryChainConfigResponse{} }
func (m *QueryChainConfigResponse) String() string { return proto.CompactTextString(m) }
func (*QueryChainConfigResponse) ProtoMessage() {}
func (*QueryChainConfigResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_8bbc79ec2b6c5cb2, []int{21}
}
func (m *QueryChainConfigResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
}
func (m *QueryChainConfigResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
if deterministic {
return xxx_messageInfo_QueryChainConfigResponse.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 *QueryChainConfigResponse) XXX_Merge(src proto.Message) {
xxx_messageInfo_QueryChainConfigResponse.Merge(m, src)
}
func (m *QueryChainConfigResponse) XXX_Size() int {
return m.Size()
}
func (m *QueryChainConfigResponse) XXX_DiscardUnknown() {
xxx_messageInfo_QueryChainConfigResponse.DiscardUnknown(m)
}
var xxx_messageInfo_QueryChainConfigResponse proto.InternalMessageInfo
func (m *QueryChainConfigResponse) GetConfig() ChainConfig {
if m != nil {
return m.Config
}
return ChainConfig{}
}
// QueryStaticCallRequest defines static call request // QueryStaticCallRequest defines static call request
type QueryStaticCallRequest struct { type QueryStaticCallRequest struct {
// address is the ethereum contract hex address to for static call. // address is the ethereum contract hex address to for static call.
@ -959,7 +1042,7 @@ func (m *QueryStaticCallRequest) Reset() { *m = QueryStaticCallRequest{}
func (m *QueryStaticCallRequest) String() string { return proto.CompactTextString(m) } func (m *QueryStaticCallRequest) String() string { return proto.CompactTextString(m) }
func (*QueryStaticCallRequest) ProtoMessage() {} func (*QueryStaticCallRequest) ProtoMessage() {}
func (*QueryStaticCallRequest) Descriptor() ([]byte, []int) { func (*QueryStaticCallRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_8bbc79ec2b6c5cb2, []int{20} return fileDescriptor_8bbc79ec2b6c5cb2, []int{22}
} }
func (m *QueryStaticCallRequest) XXX_Unmarshal(b []byte) error { func (m *QueryStaticCallRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b) return m.Unmarshal(b)
@ -1011,7 +1094,7 @@ func (m *QueryStaticCallResponse) Reset() { *m = QueryStaticCallResponse
func (m *QueryStaticCallResponse) String() string { return proto.CompactTextString(m) } func (m *QueryStaticCallResponse) String() string { return proto.CompactTextString(m) }
func (*QueryStaticCallResponse) ProtoMessage() {} func (*QueryStaticCallResponse) ProtoMessage() {}
func (*QueryStaticCallResponse) Descriptor() ([]byte, []int) { func (*QueryStaticCallResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_8bbc79ec2b6c5cb2, []int{21} return fileDescriptor_8bbc79ec2b6c5cb2, []int{23}
} }
func (m *QueryStaticCallResponse) XXX_Unmarshal(b []byte) error { func (m *QueryStaticCallResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b) return m.Unmarshal(b)
@ -1068,6 +1151,8 @@ func init() {
proto.RegisterType((*QueryBlockBloomResponse)(nil), "ethermint.evm.v1alpha1.QueryBlockBloomResponse") proto.RegisterType((*QueryBlockBloomResponse)(nil), "ethermint.evm.v1alpha1.QueryBlockBloomResponse")
proto.RegisterType((*QueryParamsRequest)(nil), "ethermint.evm.v1alpha1.QueryParamsRequest") proto.RegisterType((*QueryParamsRequest)(nil), "ethermint.evm.v1alpha1.QueryParamsRequest")
proto.RegisterType((*QueryParamsResponse)(nil), "ethermint.evm.v1alpha1.QueryParamsResponse") proto.RegisterType((*QueryParamsResponse)(nil), "ethermint.evm.v1alpha1.QueryParamsResponse")
proto.RegisterType((*QueryChainConfigRequest)(nil), "ethermint.evm.v1alpha1.QueryChainConfigRequest")
proto.RegisterType((*QueryChainConfigResponse)(nil), "ethermint.evm.v1alpha1.QueryChainConfigResponse")
proto.RegisterType((*QueryStaticCallRequest)(nil), "ethermint.evm.v1alpha1.QueryStaticCallRequest") proto.RegisterType((*QueryStaticCallRequest)(nil), "ethermint.evm.v1alpha1.QueryStaticCallRequest")
proto.RegisterType((*QueryStaticCallResponse)(nil), "ethermint.evm.v1alpha1.QueryStaticCallResponse") proto.RegisterType((*QueryStaticCallResponse)(nil), "ethermint.evm.v1alpha1.QueryStaticCallResponse")
} }
@ -1077,77 +1162,82 @@ func init() {
} }
var fileDescriptor_8bbc79ec2b6c5cb2 = []byte{ var fileDescriptor_8bbc79ec2b6c5cb2 = []byte{
// 1117 bytes of a gzipped FileDescriptorProto // 1188 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x97, 0x4d, 0x6f, 0x1b, 0x45, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x97, 0xcd, 0x6f, 0x1b, 0xc5,
0x18, 0xc7, 0xbd, 0x8d, 0x13, 0x27, 0x4f, 0x12, 0x08, 0x83, 0x29, 0x61, 0x5b, 0x9c, 0xb0, 0xa8, 0x1b, 0xc7, 0xbd, 0x89, 0xe3, 0x24, 0x4f, 0x92, 0xfe, 0xf2, 0x1b, 0x4c, 0x49, 0xb7, 0xc5, 0x09,
0xb1, 0xf3, 0xd2, 0x9d, 0xda, 0xbc, 0x95, 0x0a, 0x09, 0xe2, 0x4a, 0xa1, 0x52, 0x2b, 0x54, 0x9c, 0x5b, 0x9a, 0x38, 0x2f, 0xdd, 0x8d, 0xcd, 0x5b, 0xa9, 0x90, 0x20, 0x89, 0x14, 0x2a, 0xb5, 0x42,
0x8a, 0x03, 0x17, 0x6b, 0xbc, 0x5e, 0xad, 0xad, 0xac, 0x77, 0xdc, 0x9d, 0xb5, 0x95, 0x28, 0xca, 0xc5, 0xa9, 0x38, 0x20, 0x21, 0x6b, 0xbc, 0x5e, 0xd6, 0x56, 0xd6, 0x3b, 0xee, 0xee, 0xda, 0x4a,
0x85, 0x03, 0x02, 0xc1, 0x01, 0xc4, 0x01, 0x84, 0x84, 0xd4, 0x2b, 0x37, 0xbe, 0x02, 0xb7, 0x1e, 0x14, 0xe5, 0xc2, 0x01, 0x81, 0xe0, 0x00, 0xe2, 0x00, 0x42, 0x02, 0xf5, 0xca, 0x8d, 0x7f, 0x81,
0x2b, 0x71, 0xe1, 0x80, 0x10, 0x4a, 0x38, 0xf0, 0x31, 0xd0, 0xbc, 0xac, 0xbd, 0x6b, 0x7b, 0xbd, 0x5b, 0x8f, 0x95, 0xb8, 0x70, 0x42, 0x28, 0xe1, 0xc0, 0x3f, 0x81, 0x84, 0x66, 0xe6, 0x59, 0x7b,
0x0e, 0xe2, 0x36, 0x33, 0xfb, 0xbc, 0xfc, 0x9e, 0x67, 0x1e, 0xcf, 0x5f, 0x06, 0xc3, 0x0e, 0x5a, 0xd7, 0xce, 0x7a, 0x1d, 0xc4, 0xcd, 0x33, 0xfb, 0xbc, 0x7c, 0x9e, 0x79, 0x9e, 0x99, 0xaf, 0x0c,
0xb6, 0xdf, 0x69, 0x7b, 0x01, 0xb6, 0xfb, 0x1d, 0xdc, 0x2f, 0x13, 0xb7, 0xdb, 0x22, 0x65, 0xfc, 0x9a, 0x15, 0x34, 0x2c, 0xaf, 0xd5, 0x74, 0x03, 0xc3, 0xea, 0xb6, 0x8c, 0x6e, 0x89, 0x3a, 0xed,
0xb8, 0x67, 0xfb, 0x27, 0x66, 0xd7, 0xa7, 0x01, 0x45, 0x57, 0x07, 0x36, 0xa6, 0xdd, 0xef, 0x98, 0x06, 0x2d, 0x19, 0x8f, 0x3b, 0x96, 0x77, 0xac, 0xb7, 0x3d, 0x16, 0x30, 0x72, 0xb5, 0x67, 0xa3,
0xa1, 0x8d, 0x9e, 0x77, 0xa8, 0x43, 0x85, 0x09, 0xe6, 0x2b, 0x69, 0xad, 0xef, 0x58, 0x94, 0x75, 0x5b, 0xdd, 0x96, 0x1e, 0xda, 0xa8, 0x79, 0x9b, 0xd9, 0x4c, 0x98, 0x18, 0xfc, 0x97, 0xb4, 0x56,
0x28, 0xc3, 0x0d, 0xc2, 0x6c, 0x19, 0x06, 0xf7, 0xcb, 0x0d, 0x3b, 0x20, 0x65, 0xdc, 0x25, 0x4e, 0x37, 0x4c, 0xe6, 0xb7, 0x98, 0x6f, 0xd4, 0xa8, 0x6f, 0xc9, 0x30, 0x46, 0xb7, 0x54, 0xb3, 0x02,
0xdb, 0x23, 0x41, 0x9b, 0x7a, 0xca, 0xf6, 0xba, 0x43, 0xa9, 0xe3, 0xda, 0x98, 0x74, 0xdb, 0x98, 0x5a, 0x32, 0xda, 0xd4, 0x6e, 0xba, 0x34, 0x68, 0x32, 0x17, 0x6d, 0x6f, 0xd8, 0x8c, 0xd9, 0x8e,
0x78, 0x1e, 0x0d, 0xc4, 0x47, 0xa6, 0xbe, 0x6e, 0x26, 0xb0, 0x71, 0x08, 0x61, 0x61, 0xbc, 0x0b, 0x65, 0xd0, 0x76, 0xd3, 0xa0, 0xae, 0xcb, 0x02, 0xf1, 0xd1, 0xc7, 0xaf, 0x2b, 0x09, 0x6c, 0x1c,
0x2f, 0x7e, 0xcc, 0x33, 0xec, 0x5b, 0x16, 0xed, 0x79, 0x41, 0xcd, 0x7e, 0xdc, 0xb3, 0x59, 0x80, 0x42, 0x58, 0x68, 0x6f, 0xc2, 0x73, 0xef, 0xf3, 0x0c, 0x3b, 0xa6, 0xc9, 0x3a, 0x6e, 0x50, 0xb1,
0xd6, 0x21, 0x47, 0x9a, 0x4d, 0xdf, 0x66, 0x6c, 0x5d, 0xdb, 0xd4, 0x4a, 0x4b, 0xb5, 0x70, 0x7b, 0x1e, 0x77, 0x2c, 0x3f, 0x20, 0x4b, 0x30, 0x4d, 0xeb, 0x75, 0xcf, 0xf2, 0xfd, 0x25, 0x65, 0x45,
0x67, 0xf1, 0x8b, 0x27, 0x1b, 0x99, 0x7f, 0x9e, 0x6c, 0x64, 0x0c, 0x0b, 0xf2, 0x71, 0x57, 0xd6, 0x29, 0xce, 0x56, 0xc2, 0xe5, 0xdd, 0x99, 0xcf, 0x9e, 0x2c, 0x67, 0xfe, 0x7a, 0xb2, 0x9c, 0xd1,
0xa5, 0x1e, 0xb3, 0xb9, 0x6f, 0x83, 0xb8, 0xc4, 0xb3, 0xec, 0xd0, 0x57, 0x6d, 0xd1, 0x35, 0x58, 0x4c, 0xc8, 0xc7, 0x5d, 0xfd, 0x36, 0x73, 0x7d, 0x8b, 0xfb, 0xd6, 0xa8, 0x43, 0x5d, 0xd3, 0x0a,
0xb2, 0x68, 0xd3, 0xae, 0xb7, 0x08, 0x6b, 0xad, 0x5f, 0x11, 0xdf, 0x16, 0xf9, 0xc1, 0x3d, 0xc2, 0x7d, 0x71, 0x49, 0xae, 0xc3, 0xac, 0xc9, 0xea, 0x56, 0xb5, 0x41, 0xfd, 0xc6, 0xd2, 0x84, 0xf8,
0x5a, 0x28, 0x0f, 0xf3, 0x1e, 0xe5, 0x4e, 0x73, 0x9b, 0x5a, 0x29, 0x5b, 0x93, 0x1b, 0xe3, 0x7d, 0x36, 0xc3, 0x37, 0xee, 0x51, 0xbf, 0x41, 0xf2, 0x30, 0xe5, 0x32, 0xee, 0x34, 0xb9, 0xa2, 0x14,
0x78, 0x45, 0x24, 0xb9, 0x2b, 0x5a, 0xf2, 0x1f, 0x28, 0x3f, 0xd7, 0x40, 0x9f, 0x14, 0x41, 0xc1, 0xb3, 0x15, 0xb9, 0xd0, 0xde, 0x86, 0x6b, 0x22, 0xc9, 0x9e, 0x38, 0x92, 0x7f, 0x41, 0xf9, 0xa9,
0xde, 0x80, 0xe7, 0x64, 0xb7, 0xeb, 0xf1, 0x48, 0xab, 0xf2, 0x74, 0x5f, 0x1e, 0x22, 0x1d, 0x16, 0x02, 0xea, 0x45, 0x11, 0x10, 0xf6, 0x16, 0x5c, 0x91, 0xa7, 0x5d, 0x8d, 0x47, 0x5a, 0x90, 0xbb,
0x19, 0x4f, 0xca, 0xf9, 0xae, 0x08, 0xbe, 0xc1, 0x9e, 0x87, 0x20, 0x32, 0x6a, 0xdd, 0xeb, 0x75, 0x3b, 0x72, 0x93, 0xa8, 0x30, 0xe3, 0xf3, 0xa4, 0x9c, 0x6f, 0x42, 0xf0, 0xf5, 0xd6, 0x3c, 0x04,
0x1a, 0xb6, 0xaf, 0x2a, 0x58, 0x55, 0xa7, 0x1f, 0x89, 0x43, 0xe3, 0x3e, 0x5c, 0x17, 0x1c, 0x9f, 0x95, 0x51, 0xab, 0x6e, 0xa7, 0x55, 0xb3, 0x3c, 0xac, 0x60, 0x01, 0x77, 0xdf, 0x13, 0x9b, 0xda,
0x10, 0xb7, 0xdd, 0x24, 0x01, 0xf5, 0x47, 0x8a, 0x79, 0x0d, 0x56, 0x2c, 0xea, 0x8d, 0x72, 0x2c, 0x7d, 0xb8, 0x21, 0x38, 0x3e, 0xa0, 0x4e, 0xb3, 0x4e, 0x03, 0xe6, 0x0d, 0x14, 0xf3, 0x12, 0xcc,
0xf3, 0xb3, 0xfd, 0xb1, 0xaa, 0xbe, 0xd2, 0xe0, 0xd5, 0x84, 0x68, 0xaa, 0xb0, 0x22, 0x3c, 0x1f, 0x9b, 0xcc, 0x1d, 0xe4, 0x98, 0xe3, 0x7b, 0x3b, 0x43, 0x55, 0x7d, 0xa1, 0xc0, 0x8b, 0x09, 0xd1,
0x52, 0xc5, 0x23, 0x86, 0xb0, 0xff, 0x63, 0x69, 0xe1, 0x10, 0x55, 0xe5, 0x3d, 0x5f, 0xe6, 0x7a, 0xb0, 0xb0, 0x35, 0xf8, 0x5f, 0x48, 0x15, 0x8f, 0x18, 0xc2, 0xfe, 0x87, 0xa5, 0x85, 0x43, 0xb4,
0x6e, 0xa9, 0x21, 0x1a, 0xb8, 0xa6, 0x0d, 0x91, 0x71, 0x5f, 0x25, 0x3b, 0x0c, 0xa8, 0x4f, 0x9c, 0x2b, 0xfb, 0x7c, 0x99, 0xf6, 0x6c, 0xe3, 0x10, 0xf5, 0x5c, 0xd3, 0x86, 0x48, 0xbb, 0x8f, 0xc9,
0xf4, 0x64, 0x68, 0x0d, 0xe6, 0x8e, 0xec, 0x13, 0x35, 0x6f, 0x7c, 0x19, 0x49, 0xbf, 0xa7, 0xd2, 0x0e, 0x02, 0xe6, 0x51, 0x3b, 0x3d, 0x19, 0x59, 0x84, 0xc9, 0x43, 0xeb, 0x18, 0xe7, 0x8d, 0xff,
0x0f, 0x82, 0xa9, 0xf4, 0x79, 0x98, 0xef, 0x13, 0xb7, 0x17, 0x26, 0x97, 0x1b, 0xe3, 0x6d, 0x58, 0x8c, 0xa4, 0xdf, 0xc2, 0xf4, 0xbd, 0x60, 0x98, 0x3e, 0x0f, 0x53, 0x5d, 0xea, 0x74, 0xc2, 0xe4,
0x53, 0xa3, 0xd4, 0xbc, 0x54, 0x91, 0x45, 0x78, 0x21, 0xe2, 0xa7, 0x52, 0x20, 0xc8, 0xf2, 0xd9, 0x72, 0xa1, 0xbd, 0x0e, 0x8b, 0x38, 0x4a, 0xf5, 0x4b, 0x15, 0xb9, 0x06, 0xff, 0x8f, 0xf8, 0x61,
0x17, 0x5e, 0x2b, 0x35, 0xb1, 0x36, 0x2a, 0x80, 0x84, 0xe1, 0xa3, 0xe3, 0x07, 0xd4, 0x61, 0x61, 0x0a, 0x02, 0x59, 0x3e, 0xfb, 0xc2, 0x6b, 0xbe, 0x22, 0x7e, 0x6b, 0x65, 0x20, 0xc2, 0xf0, 0xd1,
0x0a, 0x04, 0x59, 0xf1, 0x8b, 0x91, 0xf1, 0xc5, 0x3a, 0x12, 0xfc, 0x40, 0xf5, 0x23, 0xf4, 0x51, 0xd1, 0x03, 0x66, 0xfb, 0x61, 0x0a, 0x02, 0x59, 0x71, 0x63, 0x64, 0x7c, 0xf1, 0x3b, 0x12, 0x7c,
0xe1, 0x31, 0x64, 0x5d, 0xea, 0x70, 0xa8, 0xb9, 0xd2, 0x72, 0xe5, 0x9a, 0x39, 0xf9, 0x05, 0x32, 0x1f, 0xcf, 0x23, 0xf4, 0xc1, 0xf0, 0x06, 0x64, 0x1d, 0x66, 0x73, 0xa8, 0xc9, 0xe2, 0x5c, 0xf9,
0x1f, 0x50, 0xa7, 0x26, 0x0c, 0x8d, 0x33, 0x78, 0x49, 0xde, 0x84, 0x4b, 0xad, 0xa3, 0x94, 0xf4, 0xba, 0x7e, 0xf1, 0x0b, 0xa4, 0x3f, 0x60, 0x76, 0x45, 0x18, 0x6a, 0xa7, 0xf0, 0xbc, 0xec, 0x84,
0xe8, 0x00, 0x60, 0xf8, 0x14, 0x89, 0xd6, 0x2e, 0x57, 0xb6, 0x4c, 0xf9, 0x9b, 0x31, 0xf9, 0xbb, 0xc3, 0xcc, 0xc3, 0x94, 0xf4, 0x64, 0x1f, 0xa0, 0xff, 0x14, 0x89, 0xa3, 0x9d, 0x2b, 0xaf, 0xea,
0x65, 0xca, 0xe7, 0x4f, 0xbd, 0x5b, 0xe6, 0xc3, 0xe1, 0x4d, 0xd5, 0x22, 0x9e, 0x91, 0x32, 0x7e, 0xf2, 0xce, 0xe8, 0xfc, 0xdd, 0xd2, 0xe5, 0xf3, 0x87, 0xef, 0x96, 0xfe, 0xb0, 0xdf, 0xa9, 0x4a,
0xd6, 0xe0, 0xea, 0x68, 0x7e, 0x55, 0xca, 0x01, 0xe4, 0x82, 0xe3, 0x7a, 0xa4, 0x9a, 0x62, 0x52, 0xc4, 0x33, 0x52, 0xc6, 0x4f, 0x0a, 0x5c, 0x1d, 0xcc, 0x8f, 0xa5, 0xec, 0xc3, 0x74, 0x70, 0x54,
0x35, 0x8f, 0x7c, 0xe2, 0x31, 0x62, 0xf1, 0xd0, 0x3c, 0x42, 0x35, 0xfb, 0xf4, 0xcf, 0x8d, 0x4c, 0x8d, 0x54, 0xb3, 0x96, 0x54, 0xcd, 0x23, 0x8f, 0xba, 0x3e, 0x35, 0x79, 0x68, 0x1e, 0x61, 0x37,
0x6d, 0x21, 0x10, 0xad, 0x41, 0x1f, 0x4e, 0x80, 0x2e, 0xa6, 0x42, 0x4b, 0x88, 0x28, 0xb5, 0xb1, 0xfb, 0xf4, 0xf7, 0xe5, 0x4c, 0x25, 0x17, 0x88, 0xa3, 0x21, 0xef, 0x5e, 0x00, 0xbd, 0x96, 0x0a,
0x1e, 0x45, 0xad, 0xba, 0x94, 0x76, 0x54, 0x6d, 0x06, 0x86, 0x97, 0xc7, 0xbe, 0x0c, 0x47, 0xaa, 0x2d, 0x21, 0xa2, 0xd4, 0xda, 0x52, 0x14, 0x75, 0xd7, 0x61, 0xac, 0x85, 0xb5, 0x69, 0x06, 0xbc,
0xc1, 0x0f, 0xd4, 0x85, 0xcb, 0x8d, 0x91, 0x57, 0x37, 0xfe, 0x90, 0xf8, 0xa4, 0x13, 0xb6, 0xdc, 0x30, 0xf4, 0xa5, 0x3f, 0x52, 0x35, 0xbe, 0x81, 0x0d, 0x97, 0x0b, 0x2d, 0x8f, 0x1d, 0x7f, 0x48,
0x38, 0x54, 0x77, 0x1a, 0x9e, 0xaa, 0x10, 0xef, 0xc1, 0x42, 0x57, 0x9c, 0x88, 0x18, 0xcb, 0x95, 0x3d, 0xda, 0x0a, 0x8f, 0x5c, 0x3b, 0xc0, 0x9e, 0x86, 0xbb, 0x18, 0xe2, 0x2d, 0xc8, 0xb5, 0xc5,
0x42, 0x52, 0x1f, 0xa4, 0x5f, 0x58, 0xbe, 0xf4, 0x31, 0xee, 0x29, 0xea, 0x43, 0xae, 0x11, 0xd6, 0x8e, 0x88, 0x31, 0x57, 0x2e, 0x24, 0x9d, 0x83, 0xf4, 0x0b, 0xcb, 0x97, 0x3e, 0xda, 0x35, 0x64,
0x5d, 0xe2, 0xba, 0xe9, 0xbf, 0x9d, 0x3c, 0xcc, 0xb7, 0xbd, 0x6e, 0x2f, 0x10, 0xdd, 0x5a, 0xa9, 0xdb, 0x6b, 0xd0, 0xa6, 0xbb, 0xc7, 0xdc, 0x8f, 0x9b, 0x76, 0x98, 0xef, 0x23, 0x58, 0x1a, 0xfe,
0xc9, 0x8d, 0x71, 0x53, 0x55, 0x19, 0x8d, 0x34, 0x9c, 0xea, 0x26, 0x09, 0x48, 0x38, 0xd5, 0x7c, 0x84, 0x49, 0x77, 0x20, 0x67, 0x8a, 0x1d, 0x4c, 0x7a, 0x33, 0x29, 0x69, 0xc4, 0x39, 0xcc, 0x2c,
0x5d, 0xf9, 0x63, 0x15, 0xe6, 0x85, 0x3d, 0xfa, 0x5e, 0x83, 0x9c, 0x7a, 0xa8, 0xd0, 0x6e, 0x12, 0x1d, 0xb5, 0x7b, 0x78, 0x5e, 0x07, 0x5c, 0x9d, 0xcc, 0x3d, 0xea, 0x38, 0xe9, 0xb7, 0x36, 0x0f,
0xfc, 0x04, 0x3d, 0xd2, 0xf7, 0x66, 0x33, 0x96, 0x10, 0x46, 0xf9, 0xb3, 0xdf, 0xfe, 0xfe, 0xee, 0x53, 0x4d, 0xb7, 0xdd, 0x09, 0x44, 0x9f, 0xe6, 0x2b, 0x72, 0xa1, 0xdd, 0xc6, 0x1a, 0xa2, 0x91,
0xca, 0x2e, 0xda, 0xc6, 0x09, 0xfa, 0xa7, 0x9e, 0x2f, 0x7c, 0xaa, 0xea, 0x3c, 0x43, 0xbf, 0x68, 0xfa, 0xf7, 0xa9, 0x4e, 0x03, 0x1a, 0xde, 0x27, 0xfe, 0xbb, 0xfc, 0xf7, 0x15, 0x98, 0x12, 0xf6,
0xb0, 0x1a, 0x53, 0x08, 0x54, 0x9e, 0x9a, 0x72, 0x92, 0x1e, 0xe9, 0x95, 0xcb, 0xb8, 0x28, 0xd6, 0xe4, 0x5b, 0x05, 0xa6, 0xf1, 0x89, 0x24, 0x9b, 0x49, 0x15, 0x5c, 0xa0, 0x84, 0xea, 0xd6, 0x78,
0xdb, 0x82, 0xb5, 0x82, 0x6e, 0x25, 0xb1, 0x86, 0xf2, 0x34, 0x86, 0xfc, 0xab, 0x06, 0x6b, 0xa3, 0xc6, 0x12, 0x42, 0x2b, 0x7d, 0xf2, 0xeb, 0x9f, 0xdf, 0x4c, 0x6c, 0x92, 0x75, 0x23, 0x41, 0x79,
0xcf, 0x3f, 0x7a, 0x73, 0x2a, 0x42, 0x82, 0xf6, 0xe8, 0x6f, 0x5d, 0xd2, 0x4b, 0xb1, 0x7f, 0x20, 0xf1, 0xe1, 0x34, 0x4e, 0xb0, 0xce, 0x53, 0xf2, 0xb3, 0x02, 0x0b, 0x31, 0x6d, 0x22, 0xa5, 0x91,
0xd8, 0xef, 0xa0, 0xdb, 0x49, 0xec, 0xfd, 0xd0, 0x73, 0x88, 0x1f, 0xd5, 0xb8, 0x33, 0xf4, 0x83, 0x29, 0x2f, 0x52, 0x42, 0xb5, 0x7c, 0x19, 0x17, 0x64, 0xbd, 0x23, 0x58, 0xcb, 0x64, 0x3b, 0x89,
0x06, 0x39, 0xf5, 0xf4, 0xa7, 0x0c, 0x44, 0x5c, 0x5b, 0x52, 0x06, 0x62, 0x44, 0x4d, 0x8c, 0x8a, 0x35, 0x14, 0xc6, 0x21, 0xe4, 0x5f, 0x14, 0x58, 0x1c, 0x14, 0x1e, 0xf2, 0xea, 0x48, 0x84, 0x04,
0x00, 0xdd, 0x43, 0x3b, 0x49, 0xa0, 0x4a, 0x5c, 0x58, 0xa4, 0xbd, 0x3f, 0x69, 0x90, 0x53, 0xb2, 0xd5, 0x53, 0x5f, 0xbb, 0xa4, 0x17, 0xb2, 0xbf, 0x23, 0xd8, 0xef, 0x92, 0x3b, 0x49, 0xec, 0xdd,
0x90, 0x82, 0x16, 0x57, 0xa2, 0x14, 0xb4, 0x11, 0xa5, 0x31, 0xde, 0x11, 0x68, 0x65, 0x84, 0x93, 0xd0, 0xb3, 0x8f, 0x1f, 0x55, 0xd7, 0x53, 0xf2, 0x9d, 0x02, 0xd3, 0x28, 0x3a, 0x29, 0x03, 0x11,
0xd0, 0x98, 0x74, 0x18, 0x92, 0xe1, 0xd3, 0x23, 0xfb, 0xe4, 0x0c, 0x7d, 0xad, 0x41, 0x96, 0x0b, 0x57, 0xb5, 0x94, 0x81, 0x18, 0xd0, 0x31, 0xad, 0x2c, 0x40, 0xb7, 0xc8, 0x46, 0x12, 0x28, 0xca,
0x0a, 0x2a, 0xa5, 0x4c, 0xdd, 0x40, 0xab, 0xf4, 0xed, 0x19, 0x2c, 0x15, 0x16, 0x16, 0x58, 0xdb, 0x9a, 0x1f, 0x39, 0xde, 0x1f, 0x14, 0x98, 0x46, 0x41, 0x4a, 0x41, 0x8b, 0x6b, 0x60, 0x0a, 0xda,
0xa8, 0x98, 0x3c, 0x96, 0xcd, 0x58, 0xbb, 0xbe, 0xd5, 0x60, 0x41, 0x4a, 0x10, 0xda, 0x99, 0x9a, 0x80, 0xc6, 0x69, 0x6f, 0x08, 0xb4, 0x12, 0x31, 0x92, 0xd0, 0x7c, 0xe9, 0xd0, 0x27, 0x33, 0x4e,
0x26, 0xa6, 0x6d, 0xfa, 0xee, 0x4c, 0xb6, 0x0a, 0xca, 0x14, 0x50, 0x25, 0xb4, 0x95, 0x04, 0xa5, 0x0e, 0xad, 0xe3, 0x53, 0xf2, 0xa5, 0x02, 0x59, 0x2e, 0x65, 0xa4, 0x98, 0x32, 0x75, 0x3d, 0x95,
0x64, 0x02, 0x9f, 0x72, 0x91, 0x12, 0x57, 0xb8, 0x34, 0x90, 0x13, 0x74, 0x73, 0xfa, 0xc8, 0x8c, 0x54, 0xd7, 0xc7, 0xb0, 0x44, 0x2c, 0x43, 0x60, 0xad, 0x93, 0xb5, 0xe4, 0xb1, 0xac, 0xc7, 0x8e,
0xc8, 0x9e, 0x6e, 0xce, 0x6a, 0x3e, 0xeb, 0xa3, 0xd3, 0xe0, 0x2e, 0x31, 0xbe, 0x1f, 0x35, 0x80, 0xeb, 0x6b, 0x05, 0x72, 0x52, 0xfc, 0xc8, 0xc6, 0xc8, 0x34, 0x31, 0x55, 0x55, 0x37, 0xc7, 0xb2,
0xa1, 0x52, 0xa0, 0x19, 0x32, 0x46, 0xc5, 0x46, 0xc7, 0x33, 0xdb, 0x2b, 0xc4, 0x5d, 0x81, 0x78, 0x45, 0x28, 0x5d, 0x40, 0x15, 0xc9, 0x6a, 0x12, 0x14, 0x0a, 0x94, 0x71, 0xc2, 0xe5, 0x51, 0xb4,
0x03, 0xbd, 0x3e, 0x1d, 0x51, 0x28, 0x13, 0xfa, 0x52, 0x83, 0x05, 0xa9, 0x23, 0x29, 0x17, 0x1a, 0x70, 0xb6, 0x27, 0x64, 0xe4, 0xf6, 0xe8, 0x91, 0x19, 0x10, 0x5c, 0x55, 0x1f, 0xd7, 0x7c, 0xdc,
0x93, 0xae, 0x94, 0x0b, 0x8d, 0x0b, 0x9a, 0xb1, 0x25, 0x80, 0x36, 0x51, 0x21, 0x09, 0x48, 0x4a, 0x47, 0xa7, 0xc6, 0x5d, 0x62, 0x7c, 0xdf, 0x2b, 0x00, 0x7d, 0x8d, 0x22, 0x63, 0x64, 0x8c, 0xca,
0x97, 0x68, 0xd4, 0x50, 0x6c, 0x52, 0x1a, 0x35, 0xa6, 0x6f, 0x29, 0x8d, 0x1a, 0x57, 0xb1, 0xf4, 0x9c, 0x6a, 0x8c, 0x6d, 0x8f, 0x88, 0x9b, 0x02, 0xf1, 0x16, 0xb9, 0x39, 0x1a, 0x51, 0x68, 0x22,
0x46, 0x31, 0xe1, 0x53, 0xb7, 0x88, 0xeb, 0x56, 0xab, 0x4f, 0xcf, 0x0b, 0xda, 0xb3, 0xf3, 0x82, 0xf9, 0x5c, 0x81, 0x9c, 0x54, 0xb0, 0x94, 0x86, 0xc6, 0x44, 0x33, 0xa5, 0xa1, 0x71, 0x29, 0xd5,
0xf6, 0xd7, 0x79, 0x41, 0xfb, 0xe6, 0xa2, 0x90, 0x79, 0x76, 0x51, 0xc8, 0xfc, 0x7e, 0x51, 0xc8, 0x56, 0x05, 0xd0, 0x0a, 0x29, 0x24, 0x01, 0x49, 0xd1, 0x24, 0x3f, 0x2a, 0x30, 0x17, 0x11, 0x36,
0x7c, 0x5a, 0x72, 0xda, 0x41, 0xab, 0xd7, 0x30, 0x2d, 0xda, 0xc1, 0x41, 0x8b, 0xf8, 0xac, 0xcd, 0x32, 0xba, 0xf2, 0x61, 0x69, 0x55, 0xb7, 0xc7, 0x77, 0x40, 0xb4, 0x2d, 0x81, 0xb6, 0x4a, 0x5e,
0x22, 0x01, 0x8f, 0x45, 0xc8, 0xe0, 0xa4, 0x6b, 0xb3, 0xc6, 0x82, 0xf8, 0x37, 0xf6, 0xc6, 0xbf, 0x4e, 0xbc, 0x00, 0xdc, 0xa9, 0x2a, 0xb5, 0x55, 0x74, 0xb2, 0xaf, 0x86, 0x29, 0x9d, 0x1c, 0x12,
0x01, 0x00, 0x00, 0xff, 0xff, 0x4e, 0x4f, 0xb9, 0xc4, 0x4d, 0x0e, 0x00, 0x00, 0xe0, 0x94, 0x4e, 0x0e, 0xcb, 0x6c, 0x7a, 0x27, 0x7d, 0xe1, 0x53, 0x35, 0xa9, 0xe3, 0xec, 0xee,
0x3e, 0x3d, 0x2b, 0x28, 0xcf, 0xce, 0x0a, 0xca, 0x1f, 0x67, 0x05, 0xe5, 0xab, 0xf3, 0x42, 0xe6,
0xd9, 0x79, 0x21, 0xf3, 0xdb, 0x79, 0x21, 0xf3, 0x61, 0xd1, 0x6e, 0x06, 0x8d, 0x4e, 0x4d, 0x37,
0x59, 0xcb, 0x08, 0x1a, 0xd4, 0xf3, 0x9b, 0x7e, 0x24, 0xe0, 0x91, 0x08, 0x19, 0x1c, 0xb7, 0x2d,
0xbf, 0x96, 0x13, 0x7f, 0x54, 0x5f, 0xf9, 0x27, 0x00, 0x00, 0xff, 0xff, 0x7f, 0xcb, 0x23, 0x24,
0x68, 0x0f, 0x00, 0x00,
} }
// Reference imports to suppress errors if they are not otherwise used. // Reference imports to suppress errors if they are not otherwise used.
@ -1183,6 +1273,8 @@ type QueryClient interface {
BlockBloom(ctx context.Context, in *QueryBlockBloomRequest, opts ...grpc.CallOption) (*QueryBlockBloomResponse, error) BlockBloom(ctx context.Context, in *QueryBlockBloomRequest, opts ...grpc.CallOption) (*QueryBlockBloomResponse, error)
// Params queries the parameters of x/evm module. // Params queries the parameters of x/evm module.
Params(ctx context.Context, in *QueryParamsRequest, opts ...grpc.CallOption) (*QueryParamsResponse, error) Params(ctx context.Context, in *QueryParamsRequest, opts ...grpc.CallOption) (*QueryParamsResponse, error)
// ChainConfig queries the chain configuration values of EVM.
ChainConfig(ctx context.Context, in *QueryChainConfigRequest, opts ...grpc.CallOption) (*QueryChainConfigResponse, error)
// StaticCall queries the static call value of x/evm module. // StaticCall queries the static call value of x/evm module.
StaticCall(ctx context.Context, in *QueryStaticCallRequest, opts ...grpc.CallOption) (*QueryStaticCallResponse, error) StaticCall(ctx context.Context, in *QueryStaticCallRequest, opts ...grpc.CallOption) (*QueryStaticCallResponse, error)
} }
@ -1285,6 +1377,15 @@ func (c *queryClient) Params(ctx context.Context, in *QueryParamsRequest, opts .
return out, nil return out, nil
} }
func (c *queryClient) ChainConfig(ctx context.Context, in *QueryChainConfigRequest, opts ...grpc.CallOption) (*QueryChainConfigResponse, error) {
out := new(QueryChainConfigResponse)
err := c.cc.Invoke(ctx, "/ethermint.evm.v1alpha1.Query/ChainConfig", in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *queryClient) StaticCall(ctx context.Context, in *QueryStaticCallRequest, opts ...grpc.CallOption) (*QueryStaticCallResponse, error) { func (c *queryClient) StaticCall(ctx context.Context, in *QueryStaticCallRequest, opts ...grpc.CallOption) (*QueryStaticCallResponse, error) {
out := new(QueryStaticCallResponse) out := new(QueryStaticCallResponse)
err := c.cc.Invoke(ctx, "/ethermint.evm.v1alpha1.Query/StaticCall", in, out, opts...) err := c.cc.Invoke(ctx, "/ethermint.evm.v1alpha1.Query/StaticCall", in, out, opts...)
@ -1317,6 +1418,8 @@ type QueryServer interface {
BlockBloom(context.Context, *QueryBlockBloomRequest) (*QueryBlockBloomResponse, error) BlockBloom(context.Context, *QueryBlockBloomRequest) (*QueryBlockBloomResponse, error)
// Params queries the parameters of x/evm module. // Params queries the parameters of x/evm module.
Params(context.Context, *QueryParamsRequest) (*QueryParamsResponse, error) Params(context.Context, *QueryParamsRequest) (*QueryParamsResponse, error)
// ChainConfig queries the chain configuration values of EVM.
ChainConfig(context.Context, *QueryChainConfigRequest) (*QueryChainConfigResponse, error)
// StaticCall queries the static call value of x/evm module. // StaticCall queries the static call value of x/evm module.
StaticCall(context.Context, *QueryStaticCallRequest) (*QueryStaticCallResponse, error) StaticCall(context.Context, *QueryStaticCallRequest) (*QueryStaticCallResponse, error)
} }
@ -1355,6 +1458,9 @@ func (*UnimplementedQueryServer) BlockBloom(ctx context.Context, req *QueryBlock
func (*UnimplementedQueryServer) Params(ctx context.Context, req *QueryParamsRequest) (*QueryParamsResponse, error) { func (*UnimplementedQueryServer) Params(ctx context.Context, req *QueryParamsRequest) (*QueryParamsResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method Params not implemented") return nil, status.Errorf(codes.Unimplemented, "method Params not implemented")
} }
func (*UnimplementedQueryServer) ChainConfig(ctx context.Context, req *QueryChainConfigRequest) (*QueryChainConfigResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method ChainConfig not implemented")
}
func (*UnimplementedQueryServer) StaticCall(ctx context.Context, req *QueryStaticCallRequest) (*QueryStaticCallResponse, error) { func (*UnimplementedQueryServer) StaticCall(ctx context.Context, req *QueryStaticCallRequest) (*QueryStaticCallResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method StaticCall not implemented") return nil, status.Errorf(codes.Unimplemented, "method StaticCall not implemented")
} }
@ -1543,6 +1649,24 @@ func _Query_Params_Handler(srv interface{}, ctx context.Context, dec func(interf
return interceptor(ctx, in, info, handler) return interceptor(ctx, in, info, handler)
} }
func _Query_ChainConfig_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(QueryChainConfigRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(QueryServer).ChainConfig(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/ethermint.evm.v1alpha1.Query/ChainConfig",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(QueryServer).ChainConfig(ctx, req.(*QueryChainConfigRequest))
}
return interceptor(ctx, in, info, handler)
}
func _Query_StaticCall_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { func _Query_StaticCall_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(QueryStaticCallRequest) in := new(QueryStaticCallRequest)
if err := dec(in); err != nil { if err := dec(in); err != nil {
@ -1605,6 +1729,10 @@ var _Query_serviceDesc = grpc.ServiceDesc{
MethodName: "Params", MethodName: "Params",
Handler: _Query_Params_Handler, Handler: _Query_Params_Handler,
}, },
{
MethodName: "ChainConfig",
Handler: _Query_ChainConfig_Handler,
},
{ {
MethodName: "StaticCall", MethodName: "StaticCall",
Handler: _Query_StaticCall_Handler, Handler: _Query_StaticCall_Handler,
@ -2280,6 +2408,62 @@ func (m *QueryParamsResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) {
return len(dAtA) - i, nil return len(dAtA) - i, nil
} }
func (m *QueryChainConfigRequest) 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 *QueryChainConfigRequest) MarshalTo(dAtA []byte) (int, error) {
size := m.Size()
return m.MarshalToSizedBuffer(dAtA[:size])
}
func (m *QueryChainConfigRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) {
i := len(dAtA)
_ = i
var l int
_ = l
return len(dAtA) - i, nil
}
func (m *QueryChainConfigResponse) 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 *QueryChainConfigResponse) MarshalTo(dAtA []byte) (int, error) {
size := m.Size()
return m.MarshalToSizedBuffer(dAtA[:size])
}
func (m *QueryChainConfigResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) {
i := len(dAtA)
_ = i
var l int
_ = l
{
size, err := m.Config.MarshalToSizedBuffer(dAtA[:i])
if err != nil {
return 0, err
}
i -= size
i = encodeVarintQuery(dAtA, i, uint64(size))
}
i--
dAtA[i] = 0xa
return len(dAtA) - i, nil
}
func (m *QueryStaticCallRequest) Marshal() (dAtA []byte, err error) { func (m *QueryStaticCallRequest) Marshal() (dAtA []byte, err error) {
size := m.Size() size := m.Size()
dAtA = make([]byte, size) dAtA = make([]byte, size)
@ -2643,6 +2827,26 @@ func (m *QueryParamsResponse) Size() (n int) {
return n return n
} }
func (m *QueryChainConfigRequest) Size() (n int) {
if m == nil {
return 0
}
var l int
_ = l
return n
}
func (m *QueryChainConfigResponse) Size() (n int) {
if m == nil {
return 0
}
var l int
_ = l
l = m.Config.Size()
n += 1 + l + sovQuery(uint64(l))
return n
}
func (m *QueryStaticCallRequest) Size() (n int) { func (m *QueryStaticCallRequest) Size() (n int) {
if m == nil { if m == nil {
return 0 return 0
@ -4495,6 +4699,139 @@ func (m *QueryParamsResponse) Unmarshal(dAtA []byte) error {
} }
return nil return nil
} }
func (m *QueryChainConfigRequest) 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: QueryChainConfigRequest: wiretype end group for non-group")
}
if fieldNum <= 0 {
return fmt.Errorf("proto: QueryChainConfigRequest: 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 *QueryChainConfigResponse) 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: QueryChainConfigResponse: wiretype end group for non-group")
}
if fieldNum <= 0 {
return fmt.Errorf("proto: QueryChainConfigResponse: illegal tag %d (wire type %d)", fieldNum, wire)
}
switch fieldNum {
case 1:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field Config", wireType)
}
var msglen int
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowQuery
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
msglen |= int(b&0x7F) << shift
if b < 0x80 {
break
}
}
if msglen < 0 {
return ErrInvalidLengthQuery
}
postIndex := iNdEx + msglen
if postIndex < 0 {
return ErrInvalidLengthQuery
}
if postIndex > l {
return io.ErrUnexpectedEOF
}
if err := m.Config.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 (m *QueryStaticCallRequest) Unmarshal(dAtA []byte) error { func (m *QueryStaticCallRequest) Unmarshal(dAtA []byte) error {
l := len(dAtA) l := len(dAtA)
iNdEx := 0 iNdEx := 0

View File

@ -539,6 +539,24 @@ func local_request_Query_Params_0(ctx context.Context, marshaler runtime.Marshal
} }
func request_Query_ChainConfig_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
var protoReq QueryChainConfigRequest
var metadata runtime.ServerMetadata
msg, err := client.ChainConfig(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
return msg, metadata, err
}
func local_request_Query_ChainConfig_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
var protoReq QueryChainConfigRequest
var metadata runtime.ServerMetadata
msg, err := server.ChainConfig(ctx, &protoReq)
return msg, metadata, err
}
var ( var (
filter_Query_StaticCall_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} filter_Query_StaticCall_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)}
) )
@ -781,6 +799,26 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv
}) })
mux.Handle("GET", pattern_Query_ChainConfig_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_ChainConfig_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_ChainConfig_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
})
mux.Handle("GET", pattern_Query_StaticCall_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { mux.Handle("GET", pattern_Query_StaticCall_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
ctx, cancel := context.WithCancel(req.Context()) ctx, cancel := context.WithCancel(req.Context())
defer cancel() defer cancel()
@ -1042,6 +1080,26 @@ func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie
}) })
mux.Handle("GET", pattern_Query_ChainConfig_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_ChainConfig_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_ChainConfig_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
})
mux.Handle("GET", pattern_Query_StaticCall_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { mux.Handle("GET", pattern_Query_StaticCall_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
ctx, cancel := context.WithCancel(req.Context()) ctx, cancel := context.WithCancel(req.Context())
defer cancel() defer cancel()
@ -1086,6 +1144,8 @@ var (
pattern_Query_Params_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"ethermint", "evm", "v1alpha1", "params"}, "", runtime.AssumeColonVerbOpt(true))) pattern_Query_Params_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"ethermint", "evm", "v1alpha1", "params"}, "", runtime.AssumeColonVerbOpt(true)))
pattern_Query_ChainConfig_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"ethermint", "evm", "v1alpha1", "chain_config"}, "", runtime.AssumeColonVerbOpt(true)))
pattern_Query_StaticCall_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"ethermint", "evm", "v1alpha1", "static_call"}, "", runtime.AssumeColonVerbOpt(true))) pattern_Query_StaticCall_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"ethermint", "evm", "v1alpha1", "static_call"}, "", runtime.AssumeColonVerbOpt(true)))
) )
@ -1110,5 +1170,7 @@ var (
forward_Query_Params_0 = runtime.ForwardResponseMessage forward_Query_Params_0 = runtime.ForwardResponseMessage
forward_Query_ChainConfig_0 = runtime.ForwardResponseMessage
forward_Query_StaticCall_0 = runtime.ForwardResponseMessage forward_Query_StaticCall_0 = runtime.ForwardResponseMessage
) )

View File

@ -326,53 +326,53 @@ func init() { proto.RegisterFile("ethermint/evm/v1alpha1/tx.proto", fileDescript
var fileDescriptor_6a305e80b084ab0e = []byte{ var fileDescriptor_6a305e80b084ab0e = []byte{
// 748 bytes of a gzipped FileDescriptorProto // 748 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x54, 0x4d, 0x6f, 0xd3, 0x4c, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x54, 0x41, 0x6f, 0xd3, 0x4a,
0x10, 0xce, 0x26, 0x4e, 0xe2, 0x6c, 0xf2, 0x7e, 0x68, 0xd5, 0xb7, 0x72, 0xf3, 0x4a, 0x76, 0x14, 0x10, 0xce, 0x26, 0x4e, 0xe2, 0x6c, 0xf2, 0xaa, 0xa7, 0x55, 0x5f, 0xe5, 0xe6, 0x49, 0x76, 0x94,
0x04, 0x8a, 0x90, 0x62, 0xab, 0x2d, 0xa7, 0x9e, 0xa8, 0x69, 0x55, 0x15, 0xa5, 0x02, 0xad, 0x82, 0xa7, 0x87, 0x22, 0xa4, 0xd8, 0x6a, 0xcb, 0xa9, 0x27, 0x6a, 0x5a, 0x55, 0x45, 0xa9, 0x40, 0xab,
0x90, 0xe0, 0x50, 0x6d, 0x9c, 0xad, 0x63, 0x11, 0x7b, 0x23, 0xef, 0x26, 0x4a, 0xf8, 0x05, 0xdc, 0x20, 0x24, 0x38, 0x54, 0x1b, 0x67, 0xeb, 0x58, 0xc4, 0xde, 0xc8, 0xbb, 0x89, 0x12, 0x7e, 0x01,
0xe0, 0x27, 0x70, 0x86, 0x6b, 0x7f, 0x44, 0x8f, 0x15, 0x27, 0xc4, 0xc1, 0xa0, 0xf4, 0xd6, 0x23, 0x37, 0xf8, 0x09, 0x9c, 0xe1, 0x08, 0x3f, 0xa2, 0xc7, 0x8a, 0x13, 0xe2, 0x60, 0x50, 0x7a, 0xeb,
0x27, 0x8e, 0xc8, 0x6b, 0x27, 0x69, 0x80, 0xa0, 0x22, 0x38, 0x79, 0xc6, 0xf3, 0xec, 0xce, 0xec, 0x91, 0x0b, 0x57, 0xe4, 0xb5, 0x93, 0x34, 0x40, 0x50, 0x11, 0x9c, 0x3c, 0xe3, 0xf9, 0x76, 0x67,
0xf3, 0xcc, 0x0c, 0x34, 0xa8, 0xe8, 0xd1, 0xd0, 0xf7, 0x02, 0x61, 0xd1, 0x91, 0x6f, 0x8d, 0x36, 0xf6, 0xfb, 0x66, 0x06, 0x1a, 0x54, 0xf4, 0x68, 0xe8, 0x7b, 0x81, 0xb0, 0xe8, 0xc8, 0xb7, 0x46,
0x49, 0x7f, 0xd0, 0x23, 0x9b, 0x96, 0x18, 0x9b, 0x83, 0x90, 0x09, 0x86, 0xd6, 0xe7, 0x00, 0x93, 0x5b, 0xa4, 0x3f, 0xe8, 0x91, 0x2d, 0x4b, 0x8c, 0xcd, 0x41, 0xc8, 0x04, 0x43, 0x1b, 0x73, 0x80,
0x8e, 0x7c, 0x73, 0x06, 0xa8, 0xae, 0xb9, 0xcc, 0x65, 0x12, 0x62, 0xc5, 0x56, 0x82, 0xae, 0x6e, 0x49, 0x47, 0xbe, 0x39, 0x03, 0x54, 0xd7, 0x5d, 0xe6, 0x32, 0x09, 0xb1, 0x62, 0x2b, 0x41, 0x57,
0xb8, 0x8c, 0xb9, 0x7d, 0x6a, 0x49, 0xaf, 0x33, 0x3c, 0xb1, 0x48, 0x30, 0x99, 0x85, 0x1c, 0xc6, 0x37, 0x5d, 0xc6, 0xdc, 0x3e, 0xb5, 0xa4, 0xd7, 0x19, 0x9e, 0x5a, 0x24, 0x98, 0xcc, 0x42, 0x0e,
0x7d, 0xc6, 0x8f, 0x93, 0x33, 0x89, 0x93, 0x86, 0x6a, 0x2b, 0x8a, 0x88, 0x13, 0x4a, 0x44, 0xfd, 0xe3, 0x3e, 0xe3, 0x27, 0xc9, 0x99, 0xc4, 0x49, 0x43, 0xb5, 0x15, 0x45, 0xc4, 0x09, 0x25, 0xa2,
0x25, 0x80, 0x7f, 0x1d, 0x71, 0x77, 0x3f, 0xc6, 0xd1, 0xa1, 0xdf, 0x1e, 0xa3, 0x06, 0x54, 0xba, 0xfe, 0x1c, 0xc0, 0xbf, 0x8e, 0xb9, 0x7b, 0x10, 0xe3, 0xe8, 0xd0, 0x6f, 0x8f, 0x51, 0x03, 0x2a,
0x44, 0x10, 0x0d, 0xd4, 0x40, 0xa3, 0xbc, 0xb5, 0x66, 0x26, 0x89, 0xcd, 0x59, 0x62, 0x73, 0x37, 0x5d, 0x22, 0x88, 0x06, 0x6a, 0xa0, 0x51, 0xde, 0x5e, 0x37, 0x93, 0xc4, 0xe6, 0x2c, 0xb1, 0xb9,
0x98, 0x60, 0x89, 0x40, 0x1b, 0x50, 0xe1, 0xde, 0x73, 0xaa, 0x65, 0x6b, 0xa0, 0x01, 0xec, 0xfc, 0x17, 0x4c, 0xb0, 0x44, 0xa0, 0x4d, 0xa8, 0x70, 0xef, 0x29, 0xd5, 0xb2, 0x35, 0xd0, 0x00, 0x76,
0x65, 0x64, 0x80, 0x26, 0x96, 0xbf, 0x90, 0x01, 0x95, 0x1e, 0xe1, 0x3d, 0x2d, 0x57, 0x03, 0x8d, 0xfe, 0x32, 0x32, 0x40, 0x13, 0xcb, 0x5f, 0xc8, 0x80, 0x4a, 0x8f, 0xf0, 0x9e, 0x96, 0xab, 0x81,
0x92, 0x5d, 0xfe, 0x1c, 0x19, 0xc5, 0xb0, 0x3f, 0xd8, 0xa9, 0x37, 0xeb, 0x58, 0x06, 0x10, 0x82, 0x46, 0xc9, 0x2e, 0x7f, 0x8e, 0x8c, 0x62, 0xd8, 0x1f, 0xec, 0xd6, 0x9b, 0x75, 0x2c, 0x03, 0x08,
0xca, 0x49, 0xc8, 0x7c, 0x4d, 0x89, 0x01, 0x58, 0xda, 0x3b, 0xca, 0x8b, 0xd7, 0x46, 0xa6, 0x7e, 0x41, 0xe5, 0x34, 0x64, 0xbe, 0xa6, 0xc4, 0x00, 0x2c, 0xed, 0x5d, 0xe5, 0xd9, 0x4b, 0x23, 0x53,
0x9a, 0x85, 0x6a, 0x8b, 0xba, 0xc4, 0x99, 0xb4, 0xc7, 0x68, 0x0d, 0xe6, 0x03, 0x16, 0x38, 0x54, 0x7f, 0x93, 0x85, 0x6a, 0x8b, 0xba, 0xc4, 0x99, 0xb4, 0xc7, 0x68, 0x1d, 0xe6, 0x03, 0x16, 0x38,
0x56, 0xa3, 0xe0, 0xc4, 0x41, 0x07, 0xb0, 0xe4, 0x92, 0xf8, 0xc1, 0x9e, 0x93, 0x64, 0x2f, 0xd9, 0x54, 0x56, 0xa3, 0xe0, 0xc4, 0x41, 0x87, 0xb0, 0xe4, 0x92, 0xf8, 0xc1, 0x9e, 0x93, 0x64, 0x2f,
0xb7, 0x3f, 0x44, 0xc6, 0x2d, 0xd7, 0x13, 0xbd, 0x61, 0xc7, 0x74, 0x98, 0x9f, 0xd2, 0x90, 0x7e, 0xd9, 0x37, 0x3f, 0x44, 0xc6, 0x0d, 0xd7, 0x13, 0xbd, 0x61, 0xc7, 0x74, 0x98, 0x9f, 0xd2, 0x90,
0x9a, 0xbc, 0xfb, 0xcc, 0x12, 0x93, 0x01, 0xe5, 0xe6, 0x61, 0x20, 0xb0, 0xea, 0x12, 0xfe, 0x30, 0x7e, 0x9a, 0xbc, 0xfb, 0xc4, 0x12, 0x93, 0x01, 0xe5, 0xe6, 0x51, 0x20, 0xb0, 0xea, 0x12, 0x7e,
0x3e, 0x8b, 0x74, 0x98, 0x73, 0x09, 0x97, 0x55, 0x2a, 0x76, 0x65, 0x1a, 0x19, 0xea, 0x01, 0xe1, 0x3f, 0x3e, 0x8b, 0x74, 0x98, 0x73, 0x09, 0x97, 0x55, 0x2a, 0x76, 0x65, 0x1a, 0x19, 0xea, 0x21,
0x2d, 0xcf, 0xf7, 0x04, 0x8e, 0x03, 0xe8, 0x6f, 0x98, 0x15, 0x2c, 0xad, 0x31, 0x2b, 0x18, 0xba, 0xe1, 0x2d, 0xcf, 0xf7, 0x04, 0x8e, 0x03, 0x68, 0x0d, 0x66, 0x05, 0x4b, 0x6b, 0xcc, 0x0a, 0x86,
0x0f, 0xf3, 0x23, 0xd2, 0x1f, 0x52, 0x2d, 0x2f, 0x93, 0xde, 0xb9, 0x7e, 0xd2, 0x69, 0x64, 0x14, 0xee, 0xc2, 0xfc, 0x88, 0xf4, 0x87, 0x54, 0xcb, 0xcb, 0xa4, 0xb7, 0xae, 0x9f, 0x74, 0x1a, 0x19,
0x76, 0x7d, 0x36, 0x0c, 0x04, 0x4e, 0xae, 0x88, 0x19, 0x90, 0x3c, 0x17, 0x6a, 0xa0, 0x51, 0x49, 0x85, 0x3d, 0x9f, 0x0d, 0x03, 0x81, 0x93, 0x2b, 0x62, 0x06, 0x24, 0xcf, 0x85, 0x1a, 0x68, 0x54,
0x19, 0xad, 0x40, 0x30, 0xd2, 0x8a, 0xf2, 0x07, 0x18, 0xc5, 0x5e, 0xa8, 0xa9, 0x89, 0x17, 0xc6, 0x52, 0x46, 0x2b, 0x10, 0x8c, 0xb4, 0xa2, 0xfc, 0x01, 0x46, 0xb1, 0x17, 0x6a, 0x6a, 0xe2, 0x85,
0x1e, 0xd7, 0x4a, 0x89, 0xc7, 0x77, 0xfe, 0x89, 0xb9, 0x7a, 0x77, 0xda, 0x2c, 0xb6, 0xc7, 0x7b, 0xb1, 0xc7, 0xb5, 0x52, 0xe2, 0xf1, 0xdd, 0xb5, 0x98, 0xab, 0x77, 0x6f, 0x9b, 0x85, 0xf6, 0x78,
0x44, 0x90, 0xc3, 0xfa, 0x97, 0x1c, 0xac, 0xec, 0x3a, 0x0e, 0xe5, 0xbc, 0xe5, 0x71, 0xd1, 0x1e, 0x9f, 0x08, 0x52, 0xff, 0x92, 0x83, 0x95, 0x3d, 0xc7, 0xa1, 0x9c, 0xb7, 0x3c, 0x2e, 0xda, 0x63,
0xa3, 0xa7, 0x50, 0x75, 0x7a, 0xc4, 0x0b, 0x8e, 0xbd, 0xae, 0x64, 0xaf, 0x64, 0xdf, 0xfd, 0xa5, 0xf4, 0x18, 0xaa, 0x4e, 0x8f, 0x78, 0xc1, 0x89, 0xd7, 0x95, 0xe4, 0x95, 0xec, 0xdb, 0xbf, 0x54,
0x72, 0x8b, 0xf7, 0xe2, 0xd3, 0x87, 0x7b, 0x97, 0x91, 0x51, 0x74, 0x12, 0x13, 0xa7, 0x46, 0x77, 0x6d, 0xf1, 0x4e, 0x7c, 0xfa, 0x68, 0xff, 0x32, 0x32, 0x8a, 0x4e, 0x62, 0xe2, 0xd4, 0xe8, 0x2e,
0xa1, 0x4b, 0x76, 0xa5, 0x2e, 0xb9, 0xdf, 0xd7, 0x45, 0xf9, 0xb9, 0x2e, 0xf9, 0xef, 0x75, 0x29, 0x64, 0xc9, 0xae, 0x94, 0x25, 0xf7, 0xfb, 0xb2, 0x28, 0x3f, 0x97, 0x25, 0xff, 0xbd, 0x2c, 0x85,
0xfc, 0x39, 0x5d, 0x8a, 0x57, 0x74, 0x21, 0x50, 0x25, 0x92, 0x5b, 0xca, 0x35, 0xb5, 0x96, 0x6b, 0x3f, 0x27, 0x4b, 0xf1, 0x8a, 0x2c, 0x04, 0xaa, 0x44, 0x72, 0x4b, 0xb9, 0xa6, 0xd6, 0x72, 0x8d,
0x94, 0xb7, 0x6e, 0x98, 0x3f, 0x1e, 0x5f, 0x33, 0xd1, 0xa0, 0x3d, 0x1c, 0xf4, 0xa9, 0x5d, 0x3b, 0xf2, 0xf6, 0x7f, 0xe6, 0x8f, 0xa7, 0xd7, 0x4c, 0x34, 0x68, 0x0f, 0x07, 0x7d, 0x6a, 0xd7, 0xce,
0x8b, 0x8c, 0xcc, 0x65, 0x64, 0x40, 0x32, 0x17, 0xe6, 0xcd, 0x47, 0x03, 0x2e, 0x64, 0xc2, 0xf3, 0x22, 0x23, 0x73, 0x19, 0x19, 0x90, 0xcc, 0x85, 0x79, 0xf5, 0xd1, 0x80, 0x0b, 0x99, 0xf0, 0xfc,
0x6b, 0x13, 0xe9, 0x4b, 0x4b, 0xd2, 0xc3, 0x25, 0xe9, 0xcb, 0x2b, 0xa5, 0xaf, 0xc3, 0xea, 0xfe, 0xda, 0x44, 0xf9, 0xd2, 0x92, 0xf2, 0x70, 0x49, 0xf9, 0xf2, 0x2a, 0xe5, 0xeb, 0xb0, 0x7a, 0x30,
0x58, 0xd0, 0x80, 0x7b, 0x2c, 0x78, 0x30, 0x10, 0x1e, 0x0b, 0xf8, 0x62, 0x9e, 0xd3, 0xa9, 0xd2, 0x16, 0x34, 0xe0, 0x1e, 0x0b, 0xee, 0x0d, 0x84, 0xc7, 0x02, 0xbe, 0x98, 0xe6, 0x74, 0xa6, 0x74,
0xe1, 0xfa, 0xb7, 0x98, 0xc7, 0xb4, 0xb3, 0x3d, 0x8f, 0xbf, 0x05, 0xf0, 0xbf, 0xa5, 0x3d, 0x80, 0xb8, 0xf1, 0x2d, 0xe6, 0x21, 0xed, 0xec, 0xcc, 0xe3, 0xaf, 0x01, 0xfc, 0x67, 0x69, 0x0b, 0x60,
0x29, 0x1f, 0xb0, 0x80, 0x4b, 0x3e, 0xe4, 0x28, 0x83, 0x64, 0x52, 0xe5, 0xf4, 0x5a, 0x50, 0xe9, 0xca, 0x07, 0x2c, 0xe0, 0x92, 0x0e, 0x39, 0xc8, 0x20, 0x99, 0x53, 0x39, 0xbb, 0x16, 0x54, 0xfa,
0x33, 0x97, 0x6b, 0x59, 0xc9, 0xc5, 0xff, 0xab, 0xb8, 0x68, 0x31, 0x17, 0x4b, 0x20, 0xfa, 0x17, 0xcc, 0xe5, 0x5a, 0x56, 0x52, 0xf1, 0xef, 0x2a, 0x2a, 0x5a, 0xcc, 0xc5, 0x12, 0x88, 0xfe, 0x86,
0xe6, 0x42, 0x2a, 0x64, 0x4f, 0x54, 0x70, 0x6c, 0xa2, 0x2a, 0x54, 0x43, 0x3a, 0xa2, 0xa1, 0xa0, 0xb9, 0x90, 0x0a, 0xd9, 0x12, 0x15, 0x1c, 0x9b, 0xa8, 0x0a, 0xd5, 0x90, 0x8e, 0x68, 0x28, 0x68,
0x5d, 0xa9, 0xb3, 0x8a, 0xe7, 0x3e, 0xda, 0x80, 0x71, 0x2b, 0x1c, 0x0f, 0x39, 0xed, 0x4a, 0x91, 0x57, 0xca, 0xac, 0xe2, 0xb9, 0x8f, 0x36, 0x61, 0xdc, 0x09, 0x27, 0x43, 0x4e, 0xbb, 0x52, 0x63,
0x15, 0x5c, 0x74, 0x09, 0x7f, 0xc4, 0x69, 0x37, 0xa9, 0x76, 0xcb, 0x83, 0xb9, 0x23, 0xee, 0xa2, 0x05, 0x17, 0x5d, 0xc2, 0x1f, 0x70, 0xda, 0x4d, 0xaa, 0xdd, 0xf6, 0x60, 0xee, 0x98, 0xbb, 0xa8,
0x0e, 0x84, 0x57, 0x16, 0xd7, 0xcd, 0x55, 0x65, 0x2c, 0xbd, 0xab, 0xda, 0xbc, 0x16, 0x6c, 0xf6, 0x03, 0xe1, 0x95, 0xb5, 0xf5, 0xff, 0xaa, 0x32, 0x96, 0xde, 0x55, 0x6d, 0x5e, 0x0b, 0x36, 0x7b,
0x7c, 0xdb, 0x3e, 0x9b, 0xea, 0xe0, 0x7c, 0xaa, 0x83, 0x4f, 0x53, 0x1d, 0xbc, 0xba, 0xd0, 0x33, 0xbe, 0x6d, 0x9f, 0x4d, 0x75, 0x70, 0x3e, 0xd5, 0xc1, 0xa7, 0xa9, 0x0e, 0x5e, 0x5c, 0xe8, 0x99,
0xe7, 0x17, 0x7a, 0xe6, 0xfd, 0x85, 0x9e, 0x79, 0xd2, 0xb8, 0xd2, 0x61, 0xa2, 0x47, 0x42, 0xee, 0xf3, 0x0b, 0x3d, 0xf3, 0xfe, 0x42, 0xcf, 0x3c, 0x6a, 0x5c, 0x69, 0x30, 0xd1, 0x23, 0x21, 0xf7,
0x71, 0x6b, 0xb1, 0x6f, 0xc7, 0x72, 0xe3, 0xca, 0x3e, 0xeb, 0x14, 0xe4, 0xf2, 0xdc, 0xfe, 0x1a, 0xb8, 0xb5, 0xd8, 0xb6, 0x63, 0xb9, 0x6f, 0x65, 0x9b, 0x75, 0x0a, 0x72, 0x75, 0xee, 0x7c, 0x0d,
0x00, 0x00, 0xff, 0xff, 0x32, 0xb4, 0x39, 0xb0, 0x14, 0x06, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x19, 0x9b, 0x13, 0xd4, 0x12, 0x06, 0x00, 0x00,
} }
// Reference imports to suppress errors if they are not otherwise used. // Reference imports to suppress errors if they are not otherwise used.