From 979b7d5fbf2afa78948a858a1caac24308a2a40f Mon Sep 17 00:00:00 2001 From: Aleksei Kokinos Date: Thu, 5 Feb 2026 19:07:59 +0700 Subject: [PATCH 01/19] WIP created eth_tacSimulate rpc method --- proto/cosmos/evm/vm/v1/query.proto | 21 +++++++++++ rpc/backend/backend.go | 1 + rpc/backend/call_tx.go | 60 ++++++++++++++++++++++++++++++ rpc/namespaces/ethereum/eth/api.go | 41 +++++++++++++++++++- rpc/types/types.go | 30 +++++++-------- x/vm/keeper/grpc_query.go | 4 ++ x/vm/types/state_override.go | 23 ++++++++++++ 7 files changed, 161 insertions(+), 19 deletions(-) create mode 100644 x/vm/types/state_override.go diff --git a/proto/cosmos/evm/vm/v1/query.proto b/proto/cosmos/evm/vm/v1/query.proto index 70818b833..5e6116766 100644 --- a/proto/cosmos/evm/vm/v1/query.proto +++ b/proto/cosmos/evm/vm/v1/query.proto @@ -59,6 +59,11 @@ service Query { option (google.api.http).get = "/cosmos/evm/vm/v1/eth_call"; } + // TacSimulate implements the custom `eth_tacSimulate` rpc api which supports state override + rpc TacSimulate(TacSimulateRequest) returns (MsgEthereumTxResponse) { + option (google.api.http).get = "/cosmos/evm/vm/v1/tac_simulate"; + } + // EstimateGas implements the `eth_estimateGas` rpc api rpc EstimateGas(EthCallRequest) returns (EstimateGasResponse) { option (google.api.http).get = "/cosmos/evm/vm/v1/estimate_gas"; @@ -260,6 +265,22 @@ message EthCallRequest { int64 chain_id = 4; } +// TacSimulateRequest defines TacSimulate request +message TacSimulateRequest { + // args uses the same json format as the json rpc api. + bytes args = 1; + // state_override defines the state override for the call, it uses the same json format as the json rpc api. + bytes state_override = 2; + // gas_cap defines the default gas cap to be used + uint64 gas_cap = 3; + // proposer_address of the requested block in hex format + bytes proposer_address = 4 + [ (gogoproto.casttype) = + "github.com/cosmos/cosmos-sdk/types.ConsAddress" ]; + // chain_id is the eip155 chain id parsed from the requested block header + int64 chain_id = 5; +} + // EstimateGasResponse defines EstimateGas response message EstimateGasResponse { // gas returns the estimated gas diff --git a/rpc/backend/backend.go b/rpc/backend/backend.go index 2523aed67..d898c29b2 100644 --- a/rpc/backend/backend.go +++ b/rpc/backend/backend.go @@ -110,6 +110,7 @@ type EVMBackend interface { SetTxDefaults(args evmtypes.TransactionArgs) (evmtypes.TransactionArgs, error) EstimateGas(args evmtypes.TransactionArgs, blockNrOptional *rpctypes.BlockNumber) (hexutil.Uint64, error) DoCall(args evmtypes.TransactionArgs, blockNr rpctypes.BlockNumber) (*evmtypes.MsgEthereumTxResponse, error) + DoTacSimulate(args evmtypes.TransactionArgs, blockNr rpctypes.BlockNumber, stateOverride *evmtypes.StateOverride) (*evmtypes.MsgEthereumTxResponse, error) GasPrice() (*hexutil.Big, error) // Filter API diff --git a/rpc/backend/call_tx.go b/rpc/backend/call_tx.go index d7bcc0aa9..597490cf5 100644 --- a/rpc/backend/call_tx.go +++ b/rpc/backend/call_tx.go @@ -372,6 +372,66 @@ func (b *Backend) DoCall( return res, nil } +func (b *Backend) DoTacSimulate( + args evmtypes.TransactionArgs, + blockNr rpctypes.BlockNumber, + stateOverride *evmtypes.StateOverride, +) (*evmtypes.MsgEthereumTxResponse, error) { + bz, err := json.Marshal(&args) + if err != nil { + return nil, err + } + + header, err := b.TendermintBlockByNumber(blockNr) + if err != nil { + // the error message imitates geth behavior + return nil, errors.New("header not found") + } + + overrideBz, err := json.Marshal(stateOverride) + if err != nil { + return nil, err + } + + req := evmtypes.TacSimulateRequest{ + Args: bz, + GasCap: b.RPCGasCap(), + ProposerAddress: sdk.ConsAddress(header.Block.ProposerAddress), + ChainId: b.chainID.Int64(), + StateOverride: overrideBz, + } + + // From ContextWithHeight: if the provided height is 0, + // it will return an empty context and the gRPC query will use + // the latest block height for querying. + ctx := rpctypes.ContextWithHeight(blockNr.Int64()) + timeout := b.RPCEVMTimeout() + + // Setup context so it may be canceled the call has completed + // or, in case of unmetered gas, setup a context with a timeout. + var cancel context.CancelFunc + if timeout > 0 { + ctx, cancel = context.WithTimeout(ctx, timeout) + } else { + ctx, cancel = context.WithCancel(ctx) + } + + // Make sure the context is canceled when the call has completed + // this makes sure resources are cleaned up. + defer cancel() + + res, err := b.queryClient.TacSimulate(ctx, &req) + if err != nil { + return nil, err + } + + if err = handleRevertError(res.VmError, res.Ret); err != nil { + return nil, err + } + + return res, nil +} + // GasPrice returns the current gas price based on Cosmos EVM' gas price oracle. func (b *Backend) GasPrice() (*hexutil.Big, error) { var ( diff --git a/rpc/namespaces/ethereum/eth/api.go b/rpc/namespaces/ethereum/eth/api.go index 3c48efd9c..c186c7c60 100644 --- a/rpc/namespaces/ethereum/eth/api.go +++ b/rpc/namespaces/ethereum/eth/api.go @@ -2,6 +2,7 @@ package eth import ( "context" + "encoding/json" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" @@ -66,7 +67,13 @@ type EthereumAPI interface { // // Allows developers to read data from the blockchain which includes executing // smart contracts. However, no data is published to the Ethereum network. - Call(args evmtypes.TransactionArgs, blockNrOrHash rpctypes.BlockNumberOrHash, _ *rpctypes.StateOverride) (hexutil.Bytes, error) + Call(args evmtypes.TransactionArgs, blockNrOrHash rpctypes.BlockNumberOrHash, _ *evmtypes.StateOverride) (hexutil.Bytes, error) + + // eth_tacSimulate implements the custom `eth_tacSimulate` rpc api which supports state override and event logs as result + TacSimulate(args evmtypes.TransactionArgs, + blockNrOrHash rpctypes.BlockNumberOrHash, + stateOverride *evmtypes.StateOverride, + ) (hexutil.Bytes, error) // Chain Information // @@ -268,7 +275,7 @@ func (e *PublicAPI) GetProof(address common.Address, // Call performs a raw contract call. func (e *PublicAPI) Call(args evmtypes.TransactionArgs, blockNrOrHash rpctypes.BlockNumberOrHash, - _ *rpctypes.StateOverride, + _ *evmtypes.StateOverride, ) (hexutil.Bytes, error) { e.logger.Debug("eth_call", "args", args.String(), "block number or hash", blockNrOrHash) @@ -284,6 +291,36 @@ func (e *PublicAPI) Call(args evmtypes.TransactionArgs, return (hexutil.Bytes)(data.Ret), nil } +func (e *PublicAPI) TacSimulate(args evmtypes.TransactionArgs, + blockNrOrHash rpctypes.BlockNumberOrHash, + stateOverride *evmtypes.StateOverride, +) (hexutil.Bytes, error) { + e.logger.Debug("eth_tacSimulate", "args", args.String(), "block number or hash", blockNrOrHash, "state override", stateOverride) + + blockNum, err := e.backend.BlockNumberFromTendermint(blockNrOrHash) + if err != nil { + return nil, err + } + data, err := e.backend.DoTacSimulate(args, blockNum, stateOverride) + if err != nil { + return []byte{}, err + } + + tacSimulateResult := rpctypes.TacSimulateResult{ + Output: hexutil.Bytes(data.Ret), + VmError: data.VmError, + Logs: data.Logs, + GasUsed: hexutil.Uint64(data.GasUsed), + } + + ret, err := json.Marshal(tacSimulateResult) + if err != nil { + return []byte{}, err + } + + return ret, nil +} + /////////////////////////////////////////////////////////////////////////////// /// Event Logs /// /////////////////////////////////////////////////////////////////////////////// diff --git a/rpc/types/types.go b/rpc/types/types.go index df44e50d6..43106d838 100644 --- a/rpc/types/types.go +++ b/rpc/types/types.go @@ -6,6 +6,8 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" ethtypes "github.com/ethereum/go-ethereum/core/types" + + evmtypes "github.com/cosmos/evm/x/vm/types" ) // Copied the Account and StorageResult types since they are registered under an @@ -52,23 +54,6 @@ type RPCTransaction struct { S *hexutil.Big `json:"s"` } -// StateOverride is the collection of overridden accounts. -type StateOverride map[common.Address]OverrideAccount - -// OverrideAccount indicates the overriding fields of account during the execution of -// a message call. -// Note, state and stateDiff can't be specified at the same time. If state is -// set, message execution will only use the data in the given state. Otherwise -// if statDiff is set, all diff will be applied first and then execute the call -// message. -type OverrideAccount struct { - Nonce *hexutil.Uint64 `json:"nonce"` - Code *hexutil.Bytes `json:"code"` - Balance **hexutil.Big `json:"balance"` - State *map[common.Hash]common.Hash `json:"state"` - StateDiff *map[common.Hash]common.Hash `json:"stateDiff"` -} - type FeeHistoryResult struct { OldestBlock *hexutil.Big `json:"oldestBlock"` Reward [][]*hexutil.Big `json:"reward,omitempty"` @@ -87,3 +72,14 @@ type OneFeeHistory struct { Reward []*big.Int // each element of the array will have the tip provided to miners for the percentile given GasUsedRatio float64 // the ratio of gas used to the gas limit for each block } + +type TacSimulateResult struct { + // Output is the result of the EVM execution, it is the same as the output of eth_call + Output hexutil.Bytes `json:"output"` + // VmError is the revert reason if the EVM execution is reverted, it is empty if the execution is successful + VmError string `json:"vmError,omitempty"` + // Logs are the event logs generated by the EVM execution, it is empty if no logs are generated + Logs []*evmtypes.Log `json:"logs,omitempty"` + // GasUsed is the gas used by the EVM execution, it is 0 if the execution is reverted + GasUsed hexutil.Uint64 `json:"gasUsed"` +} diff --git a/x/vm/keeper/grpc_query.go b/x/vm/keeper/grpc_query.go index eb567821c..ba724d490 100644 --- a/x/vm/keeper/grpc_query.go +++ b/x/vm/keeper/grpc_query.go @@ -256,6 +256,10 @@ func (k Keeper) EthCall(c context.Context, req *types.EthCallRequest) (*types.Ms return res, nil } +func (k Keeper) TacSimulate(c context.Context, req *types.TacSimulateRequest) (*types.MsgEthereumTxResponse, error) { + +} + // EstimateGas implements eth_estimateGas rpc api. func (k Keeper) EstimateGas(c context.Context, req *types.EthCallRequest) (*types.EstimateGasResponse, error) { return k.EstimateGasInternal(c, req, types.RPC) diff --git a/x/vm/types/state_override.go b/x/vm/types/state_override.go new file mode 100644 index 000000000..92fcc715a --- /dev/null +++ b/x/vm/types/state_override.go @@ -0,0 +1,23 @@ +package types + +import ( + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" +) + +// StateOverride is the collection of overridden accounts. +type StateOverride map[common.Address]OverrideAccount + +// OverrideAccount indicates the overriding fields of account during the execution of +// a message call. +// Note, state and stateDiff can't be specified at the same time. If state is +// set, message execution will only use the data in the given state. Otherwise +// if statDiff is set, all diff will be applied first and then execute the call +// message. +type OverrideAccount struct { + Nonce *hexutil.Uint64 `json:"nonce"` + Code *hexutil.Bytes `json:"code"` + Balance **hexutil.Big `json:"balance"` + State *map[common.Hash]common.Hash `json:"state"` + StateDiff *map[common.Hash]common.Hash `json:"stateDiff"` +} From 0bbf57296bc207d9c1265403fce76e1a7636b8da Mon Sep 17 00:00:00 2001 From: Aleksei Kokinos Date: Thu, 5 Feb 2026 19:20:35 +0700 Subject: [PATCH 02/19] created proto-gen github actions workflow --- .github/workflows/proto-gen-pr.yml | 66 ++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 .github/workflows/proto-gen-pr.yml diff --git a/.github/workflows/proto-gen-pr.yml b/.github/workflows/proto-gen-pr.yml new file mode 100644 index 000000000..05ba35228 --- /dev/null +++ b/.github/workflows/proto-gen-pr.yml @@ -0,0 +1,66 @@ +name: Generate Protobuf and Create PR + +on: + workflow_dispatch: + inputs: + target_branch: + description: 'Branch to create PR against' + required: true + default: 'enter target branch here' + type: string + +permissions: + contents: write + pull-requests: write + +jobs: + generate-proto: + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + ref: ${{ github.event.inputs.target_branch }} + fetch-depth: 0 + + - name: Generate Protobuf files + run: make proto-gen + + - name: Check for changes + id: check_changes + run: | + if [[ -n $(git status --porcelain) ]]; then + echo "changes=true" >> $GITHUB_OUTPUT + echo "Proto files have changed:" + git status --porcelain + else + echo "changes=false" >> $GITHUB_OUTPUT + echo "No changes detected in proto files" + fi + + - name: Create Pull Request + if: steps.check_changes.outputs.changes == 'true' + uses: peter-evans/create-pull-request@v6 + with: + token: ${{ secrets.GITHUB_TOKEN }} + commit-message: "chore: regenerate protobuf files" + title: "chore: regenerate protobuf files for ${{ github.event.inputs.target_branch }}" + body: | + This PR was automatically generated by the `proto-gen-pr` workflow. + ## Changes + - Regenerated protobuf Go files from `.proto` definitions + ## Target Branch + `${{ github.event.inputs.target_branch }}` + ## Triggered by + @${{ github.actor }} + branch: proto-gen/${{ github.event.inputs.target_branch }}-${{ github.run_number }} + base: ${{ github.event.inputs.target_branch }} + delete-branch: true + labels: | + automated + protobuf + + - name: No changes summary + if: steps.check_changes.outputs.changes == 'false' + run: | + echo "::notice::No protobuf changes detected. PR was not created." From 4997eb23377c5f7f067e49c4f319465daa5b892a Mon Sep 17 00:00:00 2001 From: AkKoks <14041402+AkKoks@users.noreply.github.com> Date: Thu, 5 Feb 2026 12:34:48 +0000 Subject: [PATCH 03/19] chore: regenerate protobuf files --- api/cosmos/evm/vm/v1/query.pulsar.go | 1355 +++++++++++++++++++------ api/cosmos/evm/vm/v1/query_grpc.pb.go | 39 + x/vm/types/query.pb.go | 620 +++++++++-- x/vm/types/query.pb.gw.go | 83 ++ 4 files changed, 1688 insertions(+), 409 deletions(-) diff --git a/api/cosmos/evm/vm/v1/query.pulsar.go b/api/cosmos/evm/vm/v1/query.pulsar.go index 37650ed88..f63396451 100644 --- a/api/cosmos/evm/vm/v1/query.pulsar.go +++ b/api/cosmos/evm/vm/v1/query.pulsar.go @@ -8665,6 +8665,656 @@ func (x *fastReflection_EthCallRequest) ProtoMethods() *protoiface.Methods { } } +var ( + md_TacSimulateRequest protoreflect.MessageDescriptor + fd_TacSimulateRequest_args protoreflect.FieldDescriptor + fd_TacSimulateRequest_state_override protoreflect.FieldDescriptor + fd_TacSimulateRequest_gas_cap protoreflect.FieldDescriptor + fd_TacSimulateRequest_proposer_address protoreflect.FieldDescriptor + fd_TacSimulateRequest_chain_id protoreflect.FieldDescriptor +) + +func init() { + file_cosmos_evm_vm_v1_query_proto_init() + md_TacSimulateRequest = File_cosmos_evm_vm_v1_query_proto.Messages().ByName("TacSimulateRequest") + fd_TacSimulateRequest_args = md_TacSimulateRequest.Fields().ByName("args") + fd_TacSimulateRequest_state_override = md_TacSimulateRequest.Fields().ByName("state_override") + fd_TacSimulateRequest_gas_cap = md_TacSimulateRequest.Fields().ByName("gas_cap") + fd_TacSimulateRequest_proposer_address = md_TacSimulateRequest.Fields().ByName("proposer_address") + fd_TacSimulateRequest_chain_id = md_TacSimulateRequest.Fields().ByName("chain_id") +} + +var _ protoreflect.Message = (*fastReflection_TacSimulateRequest)(nil) + +type fastReflection_TacSimulateRequest TacSimulateRequest + +func (x *TacSimulateRequest) ProtoReflect() protoreflect.Message { + return (*fastReflection_TacSimulateRequest)(x) +} + +func (x *TacSimulateRequest) slowProtoReflect() protoreflect.Message { + mi := &file_cosmos_evm_vm_v1_query_proto_msgTypes[19] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +var _fastReflection_TacSimulateRequest_messageType fastReflection_TacSimulateRequest_messageType +var _ protoreflect.MessageType = fastReflection_TacSimulateRequest_messageType{} + +type fastReflection_TacSimulateRequest_messageType struct{} + +func (x fastReflection_TacSimulateRequest_messageType) Zero() protoreflect.Message { + return (*fastReflection_TacSimulateRequest)(nil) +} +func (x fastReflection_TacSimulateRequest_messageType) New() protoreflect.Message { + return new(fastReflection_TacSimulateRequest) +} +func (x fastReflection_TacSimulateRequest_messageType) Descriptor() protoreflect.MessageDescriptor { + return md_TacSimulateRequest +} + +// Descriptor returns message descriptor, which contains only the protobuf +// type information for the message. +func (x *fastReflection_TacSimulateRequest) Descriptor() protoreflect.MessageDescriptor { + return md_TacSimulateRequest +} + +// Type returns the message type, which encapsulates both Go and protobuf +// type information. If the Go type information is not needed, +// it is recommended that the message descriptor be used instead. +func (x *fastReflection_TacSimulateRequest) Type() protoreflect.MessageType { + return _fastReflection_TacSimulateRequest_messageType +} + +// New returns a newly allocated and mutable empty message. +func (x *fastReflection_TacSimulateRequest) New() protoreflect.Message { + return new(fastReflection_TacSimulateRequest) +} + +// Interface unwraps the message reflection interface and +// returns the underlying ProtoMessage interface. +func (x *fastReflection_TacSimulateRequest) Interface() protoreflect.ProtoMessage { + return (*TacSimulateRequest)(x) +} + +// Range iterates over every populated field in an undefined order, +// calling f for each field descriptor and value encountered. +// Range returns immediately if f returns false. +// While iterating, mutating operations may only be performed +// on the current field descriptor. +func (x *fastReflection_TacSimulateRequest) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { + if len(x.Args) != 0 { + value := protoreflect.ValueOfBytes(x.Args) + if !f(fd_TacSimulateRequest_args, value) { + return + } + } + if len(x.StateOverride) != 0 { + value := protoreflect.ValueOfBytes(x.StateOverride) + if !f(fd_TacSimulateRequest_state_override, value) { + return + } + } + if x.GasCap != uint64(0) { + value := protoreflect.ValueOfUint64(x.GasCap) + if !f(fd_TacSimulateRequest_gas_cap, value) { + return + } + } + if len(x.ProposerAddress) != 0 { + value := protoreflect.ValueOfBytes(x.ProposerAddress) + if !f(fd_TacSimulateRequest_proposer_address, value) { + return + } + } + if x.ChainId != int64(0) { + value := protoreflect.ValueOfInt64(x.ChainId) + if !f(fd_TacSimulateRequest_chain_id, value) { + return + } + } +} + +// Has reports whether a field is populated. +// +// Some fields have the property of nullability where it is possible to +// distinguish between the default value of a field and whether the field +// was explicitly populated with the default value. Singular message fields, +// member fields of a oneof, and proto2 scalar fields are nullable. Such +// fields are populated only if explicitly set. +// +// In other cases (aside from the nullable cases above), +// a proto3 scalar field is populated if it contains a non-zero value, and +// a repeated field is populated if it is non-empty. +func (x *fastReflection_TacSimulateRequest) Has(fd protoreflect.FieldDescriptor) bool { + switch fd.FullName() { + case "cosmos.evm.vm.v1.TacSimulateRequest.args": + return len(x.Args) != 0 + case "cosmos.evm.vm.v1.TacSimulateRequest.state_override": + return len(x.StateOverride) != 0 + case "cosmos.evm.vm.v1.TacSimulateRequest.gas_cap": + return x.GasCap != uint64(0) + case "cosmos.evm.vm.v1.TacSimulateRequest.proposer_address": + return len(x.ProposerAddress) != 0 + case "cosmos.evm.vm.v1.TacSimulateRequest.chain_id": + return x.ChainId != int64(0) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.evm.vm.v1.TacSimulateRequest")) + } + panic(fmt.Errorf("message cosmos.evm.vm.v1.TacSimulateRequest does not contain field %s", fd.FullName())) + } +} + +// Clear clears the field such that a subsequent Has call reports false. +// +// Clearing an extension field clears both the extension type and value +// associated with the given field number. +// +// Clear is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_TacSimulateRequest) Clear(fd protoreflect.FieldDescriptor) { + switch fd.FullName() { + case "cosmos.evm.vm.v1.TacSimulateRequest.args": + x.Args = nil + case "cosmos.evm.vm.v1.TacSimulateRequest.state_override": + x.StateOverride = nil + case "cosmos.evm.vm.v1.TacSimulateRequest.gas_cap": + x.GasCap = uint64(0) + case "cosmos.evm.vm.v1.TacSimulateRequest.proposer_address": + x.ProposerAddress = nil + case "cosmos.evm.vm.v1.TacSimulateRequest.chain_id": + x.ChainId = int64(0) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.evm.vm.v1.TacSimulateRequest")) + } + panic(fmt.Errorf("message cosmos.evm.vm.v1.TacSimulateRequest does not contain field %s", fd.FullName())) + } +} + +// Get retrieves the value for a field. +// +// For unpopulated scalars, it returns the default value, where +// the default value of a bytes scalar is guaranteed to be a copy. +// For unpopulated composite types, it returns an empty, read-only view +// of the value; to obtain a mutable reference, use Mutable. +func (x *fastReflection_TacSimulateRequest) Get(descriptor protoreflect.FieldDescriptor) protoreflect.Value { + switch descriptor.FullName() { + case "cosmos.evm.vm.v1.TacSimulateRequest.args": + value := x.Args + return protoreflect.ValueOfBytes(value) + case "cosmos.evm.vm.v1.TacSimulateRequest.state_override": + value := x.StateOverride + return protoreflect.ValueOfBytes(value) + case "cosmos.evm.vm.v1.TacSimulateRequest.gas_cap": + value := x.GasCap + return protoreflect.ValueOfUint64(value) + case "cosmos.evm.vm.v1.TacSimulateRequest.proposer_address": + value := x.ProposerAddress + return protoreflect.ValueOfBytes(value) + case "cosmos.evm.vm.v1.TacSimulateRequest.chain_id": + value := x.ChainId + return protoreflect.ValueOfInt64(value) + default: + if descriptor.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.evm.vm.v1.TacSimulateRequest")) + } + panic(fmt.Errorf("message cosmos.evm.vm.v1.TacSimulateRequest does not contain field %s", descriptor.FullName())) + } +} + +// Set stores the value for a field. +// +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType. +// When setting a composite type, it is unspecified whether the stored value +// aliases the source's memory in any way. If the composite value is an +// empty, read-only value, then it panics. +// +// Set is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_TacSimulateRequest) Set(fd protoreflect.FieldDescriptor, value protoreflect.Value) { + switch fd.FullName() { + case "cosmos.evm.vm.v1.TacSimulateRequest.args": + x.Args = value.Bytes() + case "cosmos.evm.vm.v1.TacSimulateRequest.state_override": + x.StateOverride = value.Bytes() + case "cosmos.evm.vm.v1.TacSimulateRequest.gas_cap": + x.GasCap = value.Uint() + case "cosmos.evm.vm.v1.TacSimulateRequest.proposer_address": + x.ProposerAddress = value.Bytes() + case "cosmos.evm.vm.v1.TacSimulateRequest.chain_id": + x.ChainId = value.Int() + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.evm.vm.v1.TacSimulateRequest")) + } + panic(fmt.Errorf("message cosmos.evm.vm.v1.TacSimulateRequest does not contain field %s", fd.FullName())) + } +} + +// Mutable returns a mutable reference to a composite type. +// +// If the field is unpopulated, it may allocate a composite value. +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType +// if not already stored. +// It panics if the field does not contain a composite type. +// +// Mutable is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_TacSimulateRequest) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "cosmos.evm.vm.v1.TacSimulateRequest.args": + panic(fmt.Errorf("field args of message cosmos.evm.vm.v1.TacSimulateRequest is not mutable")) + case "cosmos.evm.vm.v1.TacSimulateRequest.state_override": + panic(fmt.Errorf("field state_override of message cosmos.evm.vm.v1.TacSimulateRequest is not mutable")) + case "cosmos.evm.vm.v1.TacSimulateRequest.gas_cap": + panic(fmt.Errorf("field gas_cap of message cosmos.evm.vm.v1.TacSimulateRequest is not mutable")) + case "cosmos.evm.vm.v1.TacSimulateRequest.proposer_address": + panic(fmt.Errorf("field proposer_address of message cosmos.evm.vm.v1.TacSimulateRequest is not mutable")) + case "cosmos.evm.vm.v1.TacSimulateRequest.chain_id": + panic(fmt.Errorf("field chain_id of message cosmos.evm.vm.v1.TacSimulateRequest is not mutable")) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.evm.vm.v1.TacSimulateRequest")) + } + panic(fmt.Errorf("message cosmos.evm.vm.v1.TacSimulateRequest does not contain field %s", fd.FullName())) + } +} + +// NewField returns a new value that is assignable to the field +// for the given descriptor. For scalars, this returns the default value. +// For lists, maps, and messages, this returns a new, empty, mutable value. +func (x *fastReflection_TacSimulateRequest) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "cosmos.evm.vm.v1.TacSimulateRequest.args": + return protoreflect.ValueOfBytes(nil) + case "cosmos.evm.vm.v1.TacSimulateRequest.state_override": + return protoreflect.ValueOfBytes(nil) + case "cosmos.evm.vm.v1.TacSimulateRequest.gas_cap": + return protoreflect.ValueOfUint64(uint64(0)) + case "cosmos.evm.vm.v1.TacSimulateRequest.proposer_address": + return protoreflect.ValueOfBytes(nil) + case "cosmos.evm.vm.v1.TacSimulateRequest.chain_id": + return protoreflect.ValueOfInt64(int64(0)) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.evm.vm.v1.TacSimulateRequest")) + } + panic(fmt.Errorf("message cosmos.evm.vm.v1.TacSimulateRequest does not contain field %s", fd.FullName())) + } +} + +// WhichOneof reports which field within the oneof is populated, +// returning nil if none are populated. +// It panics if the oneof descriptor does not belong to this message. +func (x *fastReflection_TacSimulateRequest) WhichOneof(d protoreflect.OneofDescriptor) protoreflect.FieldDescriptor { + switch d.FullName() { + default: + panic(fmt.Errorf("%s is not a oneof field in cosmos.evm.vm.v1.TacSimulateRequest", d.FullName())) + } + panic("unreachable") +} + +// GetUnknown retrieves the entire list of unknown fields. +// The caller may only mutate the contents of the RawFields +// if the mutated bytes are stored back into the message with SetUnknown. +func (x *fastReflection_TacSimulateRequest) GetUnknown() protoreflect.RawFields { + return x.unknownFields +} + +// SetUnknown stores an entire list of unknown fields. +// The raw fields must be syntactically valid according to the wire format. +// An implementation may panic if this is not the case. +// Once stored, the caller must not mutate the content of the RawFields. +// An empty RawFields may be passed to clear the fields. +// +// SetUnknown is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_TacSimulateRequest) SetUnknown(fields protoreflect.RawFields) { + x.unknownFields = fields +} + +// IsValid reports whether the message is valid. +// +// An invalid message is an empty, read-only value. +// +// An invalid message often corresponds to a nil pointer of the concrete +// message type, but the details are implementation dependent. +// Validity is not part of the protobuf data model, and may not +// be preserved in marshaling or other operations. +func (x *fastReflection_TacSimulateRequest) IsValid() bool { + return x != nil +} + +// ProtoMethods returns optional fastReflectionFeature-path implementations of various operations. +// This method may return nil. +// +// The returned methods type is identical to +// "google.golang.org/protobuf/runtime/protoiface".Methods. +// Consult the protoiface package documentation for details. +func (x *fastReflection_TacSimulateRequest) ProtoMethods() *protoiface.Methods { + size := func(input protoiface.SizeInput) protoiface.SizeOutput { + x := input.Message.Interface().(*TacSimulateRequest) + if x == nil { + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: 0, + } + } + options := runtime.SizeInputToOptions(input) + _ = options + var n int + var l int + _ = l + l = len(x.Args) + if l > 0 { + n += 1 + l + runtime.Sov(uint64(l)) + } + l = len(x.StateOverride) + if l > 0 { + n += 1 + l + runtime.Sov(uint64(l)) + } + if x.GasCap != 0 { + n += 1 + runtime.Sov(uint64(x.GasCap)) + } + l = len(x.ProposerAddress) + if l > 0 { + n += 1 + l + runtime.Sov(uint64(l)) + } + if x.ChainId != 0 { + n += 1 + runtime.Sov(uint64(x.ChainId)) + } + if x.unknownFields != nil { + n += len(x.unknownFields) + } + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: n, + } + } + + marshal := func(input protoiface.MarshalInput) (protoiface.MarshalOutput, error) { + x := input.Message.Interface().(*TacSimulateRequest) + if x == nil { + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + options := runtime.MarshalInputToOptions(input) + _ = options + size := options.Size(x) + dAtA := make([]byte, size) + i := len(dAtA) + _ = i + var l int + _ = l + if x.unknownFields != nil { + i -= len(x.unknownFields) + copy(dAtA[i:], x.unknownFields) + } + if x.ChainId != 0 { + i = runtime.EncodeVarint(dAtA, i, uint64(x.ChainId)) + i-- + dAtA[i] = 0x28 + } + if len(x.ProposerAddress) > 0 { + i -= len(x.ProposerAddress) + copy(dAtA[i:], x.ProposerAddress) + i = runtime.EncodeVarint(dAtA, i, uint64(len(x.ProposerAddress))) + i-- + dAtA[i] = 0x22 + } + if x.GasCap != 0 { + i = runtime.EncodeVarint(dAtA, i, uint64(x.GasCap)) + i-- + dAtA[i] = 0x18 + } + if len(x.StateOverride) > 0 { + i -= len(x.StateOverride) + copy(dAtA[i:], x.StateOverride) + i = runtime.EncodeVarint(dAtA, i, uint64(len(x.StateOverride))) + i-- + dAtA[i] = 0x12 + } + if len(x.Args) > 0 { + i -= len(x.Args) + copy(dAtA[i:], x.Args) + i = runtime.EncodeVarint(dAtA, i, uint64(len(x.Args))) + i-- + dAtA[i] = 0xa + } + if input.Buf != nil { + input.Buf = append(input.Buf, dAtA...) + } else { + input.Buf = dAtA + } + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + unmarshal := func(input protoiface.UnmarshalInput) (protoiface.UnmarshalOutput, error) { + x := input.Message.Interface().(*TacSimulateRequest) + if x == nil { + return protoiface.UnmarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Flags: input.Flags, + }, nil + } + options := runtime.UnmarshalInputToOptions(input) + _ = options + dAtA := input.Buf + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, 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 protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: TacSimulateRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: TacSimulateRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field Args", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if postIndex > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + x.Args = append(x.Args[:0], dAtA[iNdEx:postIndex]...) + if x.Args == nil { + x.Args = []byte{} + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field StateOverride", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if postIndex > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + x.StateOverride = append(x.StateOverride[:0], dAtA[iNdEx:postIndex]...) + if x.StateOverride == nil { + x.StateOverride = []byte{} + } + iNdEx = postIndex + case 3: + if wireType != 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field GasCap", wireType) + } + x.GasCap = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + x.GasCap |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 4: + if wireType != 2 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field ProposerAddress", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if postIndex > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + x.ProposerAddress = append(x.ProposerAddress[:0], dAtA[iNdEx:postIndex]...) + if x.ProposerAddress == nil { + x.ProposerAddress = []byte{} + } + iNdEx = postIndex + case 5: + if wireType != 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field ChainId", wireType) + } + x.ChainId = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + x.ChainId |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := runtime.Skip(dAtA[iNdEx:]) + if err != nil { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + if !options.DiscardUnknown { + x.unknownFields = append(x.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + } + iNdEx += skippy + } + } + + if iNdEx > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, nil + } + return &protoiface.Methods{ + NoUnkeyedLiterals: struct{}{}, + Flags: protoiface.SupportMarshalDeterministic | protoiface.SupportUnmarshalDiscardUnknown, + Size: size, + Marshal: marshal, + Unmarshal: unmarshal, + Merge: nil, + CheckInitialized: nil, + } +} + var ( md_EstimateGasResponse protoreflect.MessageDescriptor fd_EstimateGasResponse_gas protoreflect.FieldDescriptor @@ -8689,7 +9339,7 @@ func (x *EstimateGasResponse) ProtoReflect() protoreflect.Message { } func (x *EstimateGasResponse) slowProtoReflect() protoreflect.Message { - mi := &file_cosmos_evm_vm_v1_query_proto_msgTypes[19] + mi := &file_cosmos_evm_vm_v1_query_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9286,7 +9936,7 @@ func (x *QueryTraceTxRequest) ProtoReflect() protoreflect.Message { } func (x *QueryTraceTxRequest) slowProtoReflect() protoreflect.Message { - mi := &file_cosmos_evm_vm_v1_query_proto_msgTypes[20] + mi := &file_cosmos_evm_vm_v1_query_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10224,7 +10874,7 @@ func (x *QueryTraceTxResponse) ProtoReflect() protoreflect.Message { } func (x *QueryTraceTxResponse) slowProtoReflect() protoreflect.Message { - mi := &file_cosmos_evm_vm_v1_query_proto_msgTypes[21] + mi := &file_cosmos_evm_vm_v1_query_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10711,7 +11361,7 @@ func (x *QueryTraceBlockRequest) ProtoReflect() protoreflect.Message { } func (x *QueryTraceBlockRequest) slowProtoReflect() protoreflect.Message { - mi := &file_cosmos_evm_vm_v1_query_proto_msgTypes[22] + mi := &file_cosmos_evm_vm_v1_query_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11572,7 +12222,7 @@ func (x *QueryTraceBlockResponse) ProtoReflect() protoreflect.Message { } func (x *QueryTraceBlockResponse) slowProtoReflect() protoreflect.Message { - mi := &file_cosmos_evm_vm_v1_query_proto_msgTypes[23] + mi := &file_cosmos_evm_vm_v1_query_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11992,7 +12642,7 @@ func (x *QueryBaseFeeRequest) ProtoReflect() protoreflect.Message { } func (x *QueryBaseFeeRequest) slowProtoReflect() protoreflect.Message { - mi := &file_cosmos_evm_vm_v1_query_proto_msgTypes[24] + mi := &file_cosmos_evm_vm_v1_query_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12350,7 +13000,7 @@ func (x *QueryBaseFeeResponse) ProtoReflect() protoreflect.Message { } func (x *QueryBaseFeeResponse) slowProtoReflect() protoreflect.Message { - mi := &file_cosmos_evm_vm_v1_query_proto_msgTypes[25] + mi := &file_cosmos_evm_vm_v1_query_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12768,7 +13418,7 @@ func (x *QueryGlobalMinGasPriceRequest) ProtoReflect() protoreflect.Message { } func (x *QueryGlobalMinGasPriceRequest) slowProtoReflect() protoreflect.Message { - mi := &file_cosmos_evm_vm_v1_query_proto_msgTypes[26] + mi := &file_cosmos_evm_vm_v1_query_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13126,7 +13776,7 @@ func (x *QueryGlobalMinGasPriceResponse) ProtoReflect() protoreflect.Message { } func (x *QueryGlobalMinGasPriceResponse) slowProtoReflect() protoreflect.Message { - mi := &file_cosmos_evm_vm_v1_query_proto_msgTypes[27] + mi := &file_cosmos_evm_vm_v1_query_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14336,6 +14986,79 @@ func (x *EthCallRequest) GetChainId() int64 { return 0 } +// TacSimulateRequest defines TacSimulate request +type TacSimulateRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // args uses the same json format as the json rpc api. + Args []byte `protobuf:"bytes,1,opt,name=args,proto3" json:"args,omitempty"` + // state_override defines the state override for the call, it uses the same json format as the json rpc api. + StateOverride []byte `protobuf:"bytes,2,opt,name=state_override,json=stateOverride,proto3" json:"state_override,omitempty"` + // gas_cap defines the default gas cap to be used + GasCap uint64 `protobuf:"varint,3,opt,name=gas_cap,json=gasCap,proto3" json:"gas_cap,omitempty"` + // proposer_address of the requested block in hex format + ProposerAddress []byte `protobuf:"bytes,4,opt,name=proposer_address,json=proposerAddress,proto3" json:"proposer_address,omitempty"` + // chain_id is the eip155 chain id parsed from the requested block header + ChainId int64 `protobuf:"varint,5,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` +} + +func (x *TacSimulateRequest) Reset() { + *x = TacSimulateRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_cosmos_evm_vm_v1_query_proto_msgTypes[19] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TacSimulateRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TacSimulateRequest) ProtoMessage() {} + +// Deprecated: Use TacSimulateRequest.ProtoReflect.Descriptor instead. +func (*TacSimulateRequest) Descriptor() ([]byte, []int) { + return file_cosmos_evm_vm_v1_query_proto_rawDescGZIP(), []int{19} +} + +func (x *TacSimulateRequest) GetArgs() []byte { + if x != nil { + return x.Args + } + return nil +} + +func (x *TacSimulateRequest) GetStateOverride() []byte { + if x != nil { + return x.StateOverride + } + return nil +} + +func (x *TacSimulateRequest) GetGasCap() uint64 { + if x != nil { + return x.GasCap + } + return 0 +} + +func (x *TacSimulateRequest) GetProposerAddress() []byte { + if x != nil { + return x.ProposerAddress + } + return nil +} + +func (x *TacSimulateRequest) GetChainId() int64 { + if x != nil { + return x.ChainId + } + return 0 +} + // EstimateGasResponse defines EstimateGas response type EstimateGasResponse struct { state protoimpl.MessageState @@ -14354,7 +15077,7 @@ type EstimateGasResponse struct { func (x *EstimateGasResponse) Reset() { *x = EstimateGasResponse{} if protoimpl.UnsafeEnabled { - mi := &file_cosmos_evm_vm_v1_query_proto_msgTypes[19] + mi := &file_cosmos_evm_vm_v1_query_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14368,7 +15091,7 @@ func (*EstimateGasResponse) ProtoMessage() {} // Deprecated: Use EstimateGasResponse.ProtoReflect.Descriptor instead. func (*EstimateGasResponse) Descriptor() ([]byte, []int) { - return file_cosmos_evm_vm_v1_query_proto_rawDescGZIP(), []int{19} + return file_cosmos_evm_vm_v1_query_proto_rawDescGZIP(), []int{20} } func (x *EstimateGasResponse) GetGas() uint64 { @@ -14422,7 +15145,7 @@ type QueryTraceTxRequest struct { func (x *QueryTraceTxRequest) Reset() { *x = QueryTraceTxRequest{} if protoimpl.UnsafeEnabled { - mi := &file_cosmos_evm_vm_v1_query_proto_msgTypes[20] + mi := &file_cosmos_evm_vm_v1_query_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14436,7 +15159,7 @@ func (*QueryTraceTxRequest) ProtoMessage() {} // Deprecated: Use QueryTraceTxRequest.ProtoReflect.Descriptor instead. func (*QueryTraceTxRequest) Descriptor() ([]byte, []int) { - return file_cosmos_evm_vm_v1_query_proto_rawDescGZIP(), []int{20} + return file_cosmos_evm_vm_v1_query_proto_rawDescGZIP(), []int{21} } func (x *QueryTraceTxRequest) GetMsg() *MsgEthereumTx { @@ -14515,7 +15238,7 @@ type QueryTraceTxResponse struct { func (x *QueryTraceTxResponse) Reset() { *x = QueryTraceTxResponse{} if protoimpl.UnsafeEnabled { - mi := &file_cosmos_evm_vm_v1_query_proto_msgTypes[21] + mi := &file_cosmos_evm_vm_v1_query_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14529,7 +15252,7 @@ func (*QueryTraceTxResponse) ProtoMessage() {} // Deprecated: Use QueryTraceTxResponse.ProtoReflect.Descriptor instead. func (*QueryTraceTxResponse) Descriptor() ([]byte, []int) { - return file_cosmos_evm_vm_v1_query_proto_rawDescGZIP(), []int{21} + return file_cosmos_evm_vm_v1_query_proto_rawDescGZIP(), []int{22} } func (x *QueryTraceTxResponse) GetData() []byte { @@ -14566,7 +15289,7 @@ type QueryTraceBlockRequest struct { func (x *QueryTraceBlockRequest) Reset() { *x = QueryTraceBlockRequest{} if protoimpl.UnsafeEnabled { - mi := &file_cosmos_evm_vm_v1_query_proto_msgTypes[22] + mi := &file_cosmos_evm_vm_v1_query_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14580,7 +15303,7 @@ func (*QueryTraceBlockRequest) ProtoMessage() {} // Deprecated: Use QueryTraceBlockRequest.ProtoReflect.Descriptor instead. func (*QueryTraceBlockRequest) Descriptor() ([]byte, []int) { - return file_cosmos_evm_vm_v1_query_proto_rawDescGZIP(), []int{22} + return file_cosmos_evm_vm_v1_query_proto_rawDescGZIP(), []int{23} } func (x *QueryTraceBlockRequest) GetTxs() []*MsgEthereumTx { @@ -14652,7 +15375,7 @@ type QueryTraceBlockResponse struct { func (x *QueryTraceBlockResponse) Reset() { *x = QueryTraceBlockResponse{} if protoimpl.UnsafeEnabled { - mi := &file_cosmos_evm_vm_v1_query_proto_msgTypes[23] + mi := &file_cosmos_evm_vm_v1_query_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14666,7 +15389,7 @@ func (*QueryTraceBlockResponse) ProtoMessage() {} // Deprecated: Use QueryTraceBlockResponse.ProtoReflect.Descriptor instead. func (*QueryTraceBlockResponse) Descriptor() ([]byte, []int) { - return file_cosmos_evm_vm_v1_query_proto_rawDescGZIP(), []int{23} + return file_cosmos_evm_vm_v1_query_proto_rawDescGZIP(), []int{24} } func (x *QueryTraceBlockResponse) GetData() []byte { @@ -14687,7 +15410,7 @@ type QueryBaseFeeRequest struct { func (x *QueryBaseFeeRequest) Reset() { *x = QueryBaseFeeRequest{} if protoimpl.UnsafeEnabled { - mi := &file_cosmos_evm_vm_v1_query_proto_msgTypes[24] + mi := &file_cosmos_evm_vm_v1_query_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14701,7 +15424,7 @@ func (*QueryBaseFeeRequest) ProtoMessage() {} // Deprecated: Use QueryBaseFeeRequest.ProtoReflect.Descriptor instead. func (*QueryBaseFeeRequest) Descriptor() ([]byte, []int) { - return file_cosmos_evm_vm_v1_query_proto_rawDescGZIP(), []int{24} + return file_cosmos_evm_vm_v1_query_proto_rawDescGZIP(), []int{25} } // QueryBaseFeeResponse returns the EIP1559 base fee. @@ -14717,7 +15440,7 @@ type QueryBaseFeeResponse struct { func (x *QueryBaseFeeResponse) Reset() { *x = QueryBaseFeeResponse{} if protoimpl.UnsafeEnabled { - mi := &file_cosmos_evm_vm_v1_query_proto_msgTypes[25] + mi := &file_cosmos_evm_vm_v1_query_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14731,7 +15454,7 @@ func (*QueryBaseFeeResponse) ProtoMessage() {} // Deprecated: Use QueryBaseFeeResponse.ProtoReflect.Descriptor instead. func (*QueryBaseFeeResponse) Descriptor() ([]byte, []int) { - return file_cosmos_evm_vm_v1_query_proto_rawDescGZIP(), []int{25} + return file_cosmos_evm_vm_v1_query_proto_rawDescGZIP(), []int{26} } func (x *QueryBaseFeeResponse) GetBaseFee() string { @@ -14752,7 +15475,7 @@ type QueryGlobalMinGasPriceRequest struct { func (x *QueryGlobalMinGasPriceRequest) Reset() { *x = QueryGlobalMinGasPriceRequest{} if protoimpl.UnsafeEnabled { - mi := &file_cosmos_evm_vm_v1_query_proto_msgTypes[26] + mi := &file_cosmos_evm_vm_v1_query_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14766,7 +15489,7 @@ func (*QueryGlobalMinGasPriceRequest) ProtoMessage() {} // Deprecated: Use QueryGlobalMinGasPriceRequest.ProtoReflect.Descriptor instead. func (*QueryGlobalMinGasPriceRequest) Descriptor() ([]byte, []int) { - return file_cosmos_evm_vm_v1_query_proto_rawDescGZIP(), []int{26} + return file_cosmos_evm_vm_v1_query_proto_rawDescGZIP(), []int{27} } // QueryGlobalMinGasPriceResponse returns the GlobalMinGasPrice @@ -14782,7 +15505,7 @@ type QueryGlobalMinGasPriceResponse struct { func (x *QueryGlobalMinGasPriceResponse) Reset() { *x = QueryGlobalMinGasPriceResponse{} if protoimpl.UnsafeEnabled { - mi := &file_cosmos_evm_vm_v1_query_proto_msgTypes[27] + mi := &file_cosmos_evm_vm_v1_query_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14796,7 +15519,7 @@ func (*QueryGlobalMinGasPriceResponse) ProtoMessage() {} // Deprecated: Use QueryGlobalMinGasPriceResponse.ProtoReflect.Descriptor instead. func (*QueryGlobalMinGasPriceResponse) Descriptor() ([]byte, []int) { - return file_cosmos_evm_vm_v1_query_proto_rawDescGZIP(), []int{27} + return file_cosmos_evm_vm_v1_query_proto_rawDescGZIP(), []int{28} } func (x *QueryGlobalMinGasPriceResponse) GetMinGasPrice() string { @@ -14922,225 +15645,248 @@ var file_cosmos_evm_vm_v1_query_proto_rawDesc = []byte{ 0x73, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x07, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x22, 0x54, 0x0a, 0x13, 0x45, 0x73, 0x74, - 0x69, 0x6d, 0x61, 0x74, 0x65, 0x47, 0x61, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x10, 0x0a, 0x03, 0x67, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x03, 0x67, - 0x61, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x72, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x03, 0x72, 0x65, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x76, 0x6d, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x6d, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, - 0x89, 0x04, 0x0a, 0x13, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, 0x63, 0x65, 0x54, 0x78, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x31, 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, + 0x52, 0x07, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x22, 0xe2, 0x01, 0x0a, 0x12, 0x54, 0x61, + 0x63, 0x53, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x12, 0x0a, 0x04, 0x61, 0x72, 0x67, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, + 0x61, 0x72, 0x67, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x6f, 0x76, + 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x73, 0x74, + 0x61, 0x74, 0x65, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x67, + 0x61, 0x73, 0x5f, 0x63, 0x61, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x67, 0x61, + 0x73, 0x43, 0x61, 0x70, 0x12, 0x5d, 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, + 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x32, + 0xfa, 0xde, 0x1f, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, + 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2d, 0x73, 0x64, 0x6b, + 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x41, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x22, 0x54, + 0x0a, 0x13, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x47, 0x61, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x03, 0x67, 0x61, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x72, 0x65, 0x74, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x72, 0x65, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x76, 0x6d, 0x5f, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x6d, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x22, 0x89, 0x04, 0x0a, 0x13, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, + 0x61, 0x63, 0x65, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x31, 0x0a, 0x03, + 0x6d, 0x73, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x63, 0x6f, 0x73, 0x6d, + 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, + 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x54, 0x78, 0x52, 0x03, 0x6d, 0x73, 0x67, 0x12, + 0x40, 0x0a, 0x0c, 0x74, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, + 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x65, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0b, 0x74, 0x72, 0x61, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x12, 0x43, 0x0a, 0x0c, 0x70, 0x72, 0x65, 0x64, 0x65, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, + 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, + 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x45, 0x74, + 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x54, 0x78, 0x52, 0x0c, 0x70, 0x72, 0x65, 0x64, 0x65, 0x63, + 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, + 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x12, 0x48, 0x0a, 0x0a, 0x62, 0x6c, 0x6f, 0x63, + 0x6b, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x0d, 0xc8, 0xde, 0x1f, 0x00, 0x90, 0xdf, + 0x1f, 0x01, 0xa8, 0xe7, 0xb0, 0x2a, 0x01, 0x52, 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x69, + 0x6d, 0x65, 0x12, 0x5d, 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x5f, 0x61, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x32, 0xfa, 0xde, + 0x1f, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x73, + 0x6d, 0x6f, 0x73, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2d, 0x73, 0x64, 0x6b, 0x2f, 0x74, + 0x79, 0x70, 0x65, 0x73, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x12, 0x19, 0x0a, 0x08, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x07, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x12, 0x22, 0x0a, 0x0d, + 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x67, 0x61, 0x73, 0x18, 0x0a, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x4d, 0x61, 0x78, 0x47, 0x61, 0x73, + 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x52, 0x08, 0x74, 0x78, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x22, 0x2a, 0x0a, 0x14, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, 0x63, 0x65, 0x54, 0x78, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0xb7, 0x03, 0x0a, + 0x16, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, 0x63, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x31, 0x0a, 0x03, 0x74, 0x78, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x45, 0x74, 0x68, 0x65, 0x72, - 0x65, 0x75, 0x6d, 0x54, 0x78, 0x52, 0x03, 0x6d, 0x73, 0x67, 0x12, 0x40, 0x0a, 0x0c, 0x74, 0x72, + 0x65, 0x75, 0x6d, 0x54, 0x78, 0x52, 0x03, 0x74, 0x78, 0x73, 0x12, 0x40, 0x0a, 0x0c, 0x74, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, - 0x0b, 0x74, 0x72, 0x61, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x43, 0x0a, 0x0c, - 0x70, 0x72, 0x65, 0x64, 0x65, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x18, 0x04, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, - 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, - 0x6d, 0x54, 0x78, 0x52, 0x0c, 0x70, 0x72, 0x65, 0x64, 0x65, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, - 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, - 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x75, - 0x6d, 0x62, 0x65, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x61, - 0x73, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, - 0x61, 0x73, 0x68, 0x12, 0x48, 0x0a, 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x69, 0x6d, - 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x42, 0x0d, 0xc8, 0xde, 0x1f, 0x00, 0x90, 0xdf, 0x1f, 0x01, 0xa8, 0xe7, 0xb0, - 0x2a, 0x01, 0x52, 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x5d, 0x0a, - 0x10, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x32, 0xfa, 0xde, 0x1f, 0x2e, 0x67, 0x69, 0x74, - 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x63, - 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2d, 0x73, 0x64, 0x6b, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, - 0x43, 0x6f, 0x6e, 0x73, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x0f, 0x70, 0x72, 0x6f, - 0x70, 0x6f, 0x73, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x19, 0x0a, 0x08, - 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, - 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x12, 0x22, 0x0a, 0x0d, 0x62, 0x6c, 0x6f, 0x63, 0x6b, - 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x67, 0x61, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, - 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x4d, 0x61, 0x78, 0x47, 0x61, 0x73, 0x4a, 0x04, 0x08, 0x02, 0x10, - 0x03, 0x52, 0x08, 0x74, 0x78, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2a, 0x0a, 0x14, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, 0x63, 0x65, 0x54, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0xb7, 0x03, 0x0a, 0x16, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x54, 0x72, 0x61, 0x63, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x31, 0x0a, 0x03, 0x74, 0x78, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x1f, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, - 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x54, 0x78, - 0x52, 0x03, 0x74, 0x78, 0x73, 0x12, 0x40, 0x0a, 0x0c, 0x74, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x63, 0x6f, - 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x54, - 0x72, 0x61, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0b, 0x74, 0x72, 0x61, 0x63, - 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, - 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x62, - 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x6c, - 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x12, 0x48, 0x0a, 0x0a, 0x62, 0x6c, 0x6f, - 0x63, 0x6b, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x0d, 0xc8, 0xde, 0x1f, 0x00, 0x90, - 0xdf, 0x1f, 0x01, 0xa8, 0xe7, 0xb0, 0x2a, 0x01, 0x52, 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x54, - 0x69, 0x6d, 0x65, 0x12, 0x5d, 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x5f, - 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x32, 0xfa, - 0xde, 0x1f, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, - 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2d, 0x73, 0x64, 0x6b, 0x2f, - 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x12, 0x22, 0x0a, - 0x0d, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x67, 0x61, 0x73, 0x18, 0x0a, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x4d, 0x61, 0x78, 0x47, 0x61, - 0x73, 0x22, 0x2d, 0x0a, 0x17, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, 0x63, 0x65, 0x42, - 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, - 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, - 0x22, 0x15, 0x0a, 0x13, 0x51, 0x75, 0x65, 0x72, 0x79, 0x42, 0x61, 0x73, 0x65, 0x46, 0x65, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x4c, 0x0a, 0x14, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x42, 0x61, 0x73, 0x65, 0x46, 0x65, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x34, 0x0a, 0x08, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x66, 0x65, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x42, 0x19, 0xda, 0xde, 0x1f, 0x15, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x73, 0x64, 0x6b, - 0x2e, 0x69, 0x6f, 0x2f, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x49, 0x6e, 0x74, 0x52, 0x07, 0x62, 0x61, - 0x73, 0x65, 0x46, 0x65, 0x65, 0x22, 0x1f, 0x0a, 0x1d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x6c, - 0x6f, 0x62, 0x61, 0x6c, 0x4d, 0x69, 0x6e, 0x47, 0x61, 0x73, 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x63, 0x0a, 0x1e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, - 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x4d, 0x69, 0x6e, 0x47, 0x61, 0x73, 0x50, 0x72, 0x69, 0x63, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x41, 0x0a, 0x0d, 0x6d, 0x69, 0x6e, 0x5f, - 0x67, 0x61, 0x73, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, - 0x1d, 0xc8, 0xde, 0x1f, 0x00, 0xda, 0xde, 0x1f, 0x15, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x73, - 0x64, 0x6b, 0x2e, 0x69, 0x6f, 0x2f, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x49, 0x6e, 0x74, 0x52, 0x0b, - 0x6d, 0x69, 0x6e, 0x47, 0x61, 0x73, 0x50, 0x72, 0x69, 0x63, 0x65, 0x32, 0x8a, 0x0f, 0x0a, 0x05, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x85, 0x01, 0x0a, 0x07, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x12, 0x25, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, - 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, - 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x12, 0x23, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, - 0x73, 0x2f, 0x65, 0x76, 0x6d, 0x2f, 0x76, 0x6d, 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x63, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x2f, 0x7b, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x7d, 0x12, 0x9e, 0x01, - 0x0a, 0x0d, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, - 0x2b, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, - 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x41, 0x63, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x63, - 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x41, 0x63, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x32, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x2c, 0x12, 0x2a, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x65, 0x76, 0x6d, 0x2f, - 0x76, 0x6d, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x5f, 0x61, 0x63, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x7b, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x7d, 0x12, 0xaf, - 0x01, 0x0a, 0x10, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x41, 0x63, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x12, 0x2e, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, - 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x6f, 0x72, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, - 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x6f, 0x72, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x34, 0x12, 0x32, 0x2f, 0x63, - 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x65, 0x76, 0x6d, 0x2f, 0x76, 0x6d, 0x2f, 0x76, 0x31, 0x2f, - 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x2f, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x7d, - 0x12, 0x86, 0x01, 0x0a, 0x07, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x25, 0x2e, 0x63, - 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, - 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x42, 0x61, 0x6c, 0x61, - 0x6e, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x26, 0x12, 0x24, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x65, 0x76, 0x6d, - 0x2f, 0x76, 0x6d, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, - 0x7b, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x7d, 0x12, 0x8b, 0x01, 0x0a, 0x07, 0x53, 0x74, - 0x6f, 0x72, 0x61, 0x67, 0x65, 0x12, 0x25, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, - 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x74, - 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x63, - 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x31, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2b, 0x12, 0x29, 0x2f, 0x63, - 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x65, 0x76, 0x6d, 0x2f, 0x76, 0x6d, 0x2f, 0x76, 0x31, 0x2f, - 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2f, 0x7b, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x7d, 0x2f, 0x7b, 0x6b, 0x65, 0x79, 0x7d, 0x12, 0x7a, 0x0a, 0x04, 0x43, 0x6f, 0x64, 0x65, 0x12, - 0x22, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, - 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, - 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x64, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x23, - 0x12, 0x21, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x65, 0x76, 0x6d, 0x2f, 0x76, 0x6d, - 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x73, 0x2f, 0x7b, 0x61, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x7d, 0x12, 0x77, 0x0a, 0x06, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x24, 0x2e, + 0x0b, 0x74, 0x72, 0x61, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x21, 0x0a, 0x0c, + 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, + 0x1d, 0x0a, 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x12, 0x48, + 0x0a, 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x0d, + 0xc8, 0xde, 0x1f, 0x00, 0x90, 0xdf, 0x1f, 0x01, 0xa8, 0xe7, 0xb0, 0x2a, 0x01, 0x52, 0x09, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x5d, 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x70, + 0x6f, 0x73, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x0c, 0x42, 0x32, 0xfa, 0xde, 0x1f, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, + 0x2d, 0x73, 0x64, 0x6b, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x41, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, + 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x63, 0x68, 0x61, 0x69, 0x6e, + 0x5f, 0x69, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x63, 0x68, 0x61, 0x69, 0x6e, + 0x49, 0x64, 0x12, 0x22, 0x0a, 0x0d, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6d, 0x61, 0x78, 0x5f, + 0x67, 0x61, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x4d, 0x61, 0x78, 0x47, 0x61, 0x73, 0x22, 0x2d, 0x0a, 0x17, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, + 0x72, 0x61, 0x63, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x15, 0x0a, 0x13, 0x51, 0x75, 0x65, 0x72, 0x79, 0x42, 0x61, + 0x73, 0x65, 0x46, 0x65, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x4c, 0x0a, 0x14, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x42, 0x61, 0x73, 0x65, 0x46, 0x65, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x34, 0x0a, 0x08, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x66, 0x65, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x19, 0xda, 0xde, 0x1f, 0x15, 0x63, 0x6f, 0x73, 0x6d, + 0x6f, 0x73, 0x73, 0x64, 0x6b, 0x2e, 0x69, 0x6f, 0x2f, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x49, 0x6e, + 0x74, 0x52, 0x07, 0x62, 0x61, 0x73, 0x65, 0x46, 0x65, 0x65, 0x22, 0x1f, 0x0a, 0x1d, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x4d, 0x69, 0x6e, 0x47, 0x61, 0x73, 0x50, + 0x72, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x63, 0x0a, 0x1e, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x4d, 0x69, 0x6e, 0x47, 0x61, 0x73, + 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x41, 0x0a, + 0x0d, 0x6d, 0x69, 0x6e, 0x5f, 0x67, 0x61, 0x73, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x1d, 0xc8, 0xde, 0x1f, 0x00, 0xda, 0xde, 0x1f, 0x15, 0x63, 0x6f, + 0x73, 0x6d, 0x6f, 0x73, 0x73, 0x64, 0x6b, 0x2e, 0x69, 0x6f, 0x2f, 0x6d, 0x61, 0x74, 0x68, 0x2e, + 0x49, 0x6e, 0x74, 0x52, 0x0b, 0x6d, 0x69, 0x6e, 0x47, 0x61, 0x73, 0x50, 0x72, 0x69, 0x63, 0x65, + 0x32, 0x91, 0x10, 0x0a, 0x05, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x85, 0x01, 0x0a, 0x07, 0x41, + 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x25, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, + 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, + 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, - 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, - 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x61, 0x72, 0x61, - 0x6d, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x1a, 0x12, 0x18, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x65, 0x76, 0x6d, 0x2f, - 0x76, 0x6d, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x78, 0x0a, 0x07, - 0x45, 0x74, 0x68, 0x43, 0x61, 0x6c, 0x6c, 0x12, 0x20, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, - 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x74, 0x68, 0x43, 0x61, - 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x63, 0x6f, 0x73, 0x6d, - 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, - 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x54, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x22, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1c, 0x12, 0x1a, 0x2f, 0x63, 0x6f, 0x73, - 0x6d, 0x6f, 0x73, 0x2f, 0x65, 0x76, 0x6d, 0x2f, 0x76, 0x6d, 0x2f, 0x76, 0x31, 0x2f, 0x65, 0x74, - 0x68, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x12, 0x7e, 0x0a, 0x0b, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, - 0x74, 0x65, 0x47, 0x61, 0x73, 0x12, 0x20, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, - 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x74, 0x68, 0x43, 0x61, 0x6c, 0x6c, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, - 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x73, 0x74, 0x69, 0x6d, - 0x61, 0x74, 0x65, 0x47, 0x61, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x12, 0x1e, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, - 0x65, 0x76, 0x6d, 0x2f, 0x76, 0x6d, 0x2f, 0x76, 0x31, 0x2f, 0x65, 0x73, 0x74, 0x69, 0x6d, 0x61, - 0x74, 0x65, 0x5f, 0x67, 0x61, 0x73, 0x12, 0x7c, 0x0a, 0x07, 0x54, 0x72, 0x61, 0x63, 0x65, 0x54, - 0x78, 0x12, 0x25, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, - 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, 0x63, 0x65, 0x54, - 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, + 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x12, 0x23, 0x2f, + 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x65, 0x76, 0x6d, 0x2f, 0x76, 0x6d, 0x2f, 0x76, 0x31, + 0x2f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x7b, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x7d, 0x12, 0x9e, 0x01, 0x0a, 0x0d, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x41, 0x63, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2b, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, + 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x73, + 0x6d, 0x6f, 0x73, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x2c, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, + 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x73, + 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x32, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2c, 0x12, 0x2a, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, + 0x2f, 0x65, 0x76, 0x6d, 0x2f, 0x76, 0x6d, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, + 0x73, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x7b, 0x61, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x7d, 0x12, 0xaf, 0x01, 0x0a, 0x10, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, + 0x72, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2e, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x54, 0x72, 0x61, 0x63, 0x65, 0x54, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x22, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1c, 0x12, 0x1a, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, - 0x73, 0x2f, 0x65, 0x76, 0x6d, 0x2f, 0x76, 0x6d, 0x2f, 0x76, 0x31, 0x2f, 0x74, 0x72, 0x61, 0x63, - 0x65, 0x5f, 0x74, 0x78, 0x12, 0x88, 0x01, 0x0a, 0x0a, 0x54, 0x72, 0x61, 0x63, 0x65, 0x42, 0x6c, - 0x6f, 0x63, 0x6b, 0x12, 0x28, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, - 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, 0x63, - 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, - 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, - 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, 0x63, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x25, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1f, - 0x12, 0x1d, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x65, 0x76, 0x6d, 0x2f, 0x76, 0x6d, - 0x2f, 0x76, 0x31, 0x2f, 0x74, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x12, - 0x7c, 0x0a, 0x07, 0x42, 0x61, 0x73, 0x65, 0x46, 0x65, 0x65, 0x12, 0x25, 0x2e, 0x63, 0x6f, 0x73, + 0x79, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, + 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3a, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x34, 0x12, 0x32, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x65, 0x76, 0x6d, 0x2f, 0x76, + 0x6d, 0x2f, 0x76, 0x31, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x61, + 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x5f, 0x61, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x7d, 0x12, 0x86, 0x01, 0x0a, 0x07, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, + 0x65, 0x12, 0x25, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, + 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, + 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x26, 0x12, 0x24, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, + 0x73, 0x2f, 0x65, 0x76, 0x6d, 0x2f, 0x76, 0x6d, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x61, 0x6c, 0x61, + 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x7d, 0x12, 0x8b, + 0x01, 0x0a, 0x07, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x12, 0x25, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x42, 0x61, 0x73, 0x65, 0x46, 0x65, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x65, 0x72, 0x79, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, - 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x42, 0x61, 0x73, 0x65, 0x46, 0x65, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x22, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x1c, 0x12, 0x1a, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x65, 0x76, 0x6d, 0x2f, 0x76, - 0x6d, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x66, 0x65, 0x65, 0x12, 0x77, 0x0a, - 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x24, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, - 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, + 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x31, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x2b, 0x12, 0x29, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x65, 0x76, 0x6d, 0x2f, 0x76, + 0x6d, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2f, 0x7b, 0x61, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x7d, 0x2f, 0x7b, 0x6b, 0x65, 0x79, 0x7d, 0x12, 0x7a, 0x0a, 0x04, + 0x43, 0x6f, 0x64, 0x65, 0x12, 0x22, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, + 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x64, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, + 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x23, 0x12, 0x21, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x65, + 0x76, 0x6d, 0x2f, 0x76, 0x6d, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x73, 0x2f, 0x7b, + 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x7d, 0x12, 0x77, 0x0a, 0x06, 0x50, 0x61, 0x72, 0x61, + 0x6d, 0x73, 0x12, 0x24, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, + 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, + 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x12, 0x18, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, + 0x2f, 0x65, 0x76, 0x6d, 0x2f, 0x76, 0x6d, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x61, 0x72, 0x61, 0x6d, + 0x73, 0x12, 0x78, 0x0a, 0x07, 0x45, 0x74, 0x68, 0x43, 0x61, 0x6c, 0x6c, 0x12, 0x20, 0x2e, 0x63, + 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, + 0x45, 0x74, 0x68, 0x43, 0x61, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, + 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, + 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x54, 0x78, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x22, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1c, 0x12, + 0x1a, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x65, 0x76, 0x6d, 0x2f, 0x76, 0x6d, 0x2f, + 0x76, 0x31, 0x2f, 0x65, 0x74, 0x68, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x12, 0x84, 0x01, 0x0a, 0x0b, + 0x54, 0x61, 0x63, 0x53, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x24, 0x2e, 0x63, 0x6f, + 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x54, + 0x61, 0x63, 0x53, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x27, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, + 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, + 0x54, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x20, 0x12, 0x1e, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x65, 0x76, 0x6d, 0x2f, + 0x76, 0x6d, 0x2f, 0x76, 0x31, 0x2f, 0x74, 0x61, 0x63, 0x5f, 0x73, 0x69, 0x6d, 0x75, 0x6c, 0x61, + 0x74, 0x65, 0x12, 0x7e, 0x0a, 0x0b, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x47, 0x61, + 0x73, 0x12, 0x20, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, + 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x74, 0x68, 0x43, 0x61, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, + 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x47, + 0x61, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x20, 0x12, 0x1e, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x65, 0x76, 0x6d, 0x2f, + 0x76, 0x6d, 0x2f, 0x76, 0x31, 0x2f, 0x65, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x5f, 0x67, + 0x61, 0x73, 0x12, 0x7c, 0x0a, 0x07, 0x54, 0x72, 0x61, 0x63, 0x65, 0x54, 0x78, 0x12, 0x25, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, - 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x12, 0x18, 0x2f, 0x63, + 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, 0x63, 0x65, 0x54, 0x78, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, + 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, + 0x63, 0x65, 0x54, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x22, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x1c, 0x12, 0x1a, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x65, 0x76, + 0x6d, 0x2f, 0x76, 0x6d, 0x2f, 0x76, 0x31, 0x2f, 0x74, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x74, 0x78, + 0x12, 0x88, 0x01, 0x0a, 0x0a, 0x54, 0x72, 0x61, 0x63, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, + 0x28, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, + 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, 0x63, 0x65, 0x42, 0x6c, 0x6f, + 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x63, 0x6f, 0x73, 0x6d, + 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x54, 0x72, 0x61, 0x63, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x25, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1f, 0x12, 0x1d, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x65, 0x76, 0x6d, 0x2f, 0x76, 0x6d, 0x2f, 0x76, 0x31, 0x2f, - 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x9f, 0x01, 0x0a, 0x11, 0x47, 0x6c, 0x6f, 0x62, 0x61, - 0x6c, 0x4d, 0x69, 0x6e, 0x47, 0x61, 0x73, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x2f, 0x2e, 0x63, - 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x4d, 0x69, 0x6e, 0x47, 0x61, - 0x73, 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, + 0x74, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x7c, 0x0a, 0x07, 0x42, + 0x61, 0x73, 0x65, 0x46, 0x65, 0x65, 0x12, 0x25, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, + 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x42, + 0x61, 0x73, 0x65, 0x46, 0x65, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, - 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x4d, 0x69, 0x6e, 0x47, - 0x61, 0x73, 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x27, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x21, 0x12, 0x1f, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, - 0x2f, 0x65, 0x76, 0x6d, 0x2f, 0x76, 0x6d, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x69, 0x6e, 0x5f, 0x67, - 0x61, 0x73, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x42, 0xad, 0x01, 0x0a, 0x14, 0x63, 0x6f, 0x6d, - 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, - 0x31, 0x42, 0x0a, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, - 0x26, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x73, 0x64, 0x6b, 0x2e, 0x69, 0x6f, 0x2f, 0x61, 0x70, - 0x69, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x65, 0x76, 0x6d, 0x2f, 0x76, 0x6d, 0x2f, - 0x76, 0x31, 0x3b, 0x76, 0x6d, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x43, 0x45, 0x56, 0xaa, 0x02, 0x10, - 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x45, 0x76, 0x6d, 0x2e, 0x56, 0x6d, 0x2e, 0x56, 0x31, - 0xca, 0x02, 0x10, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x5c, 0x45, 0x76, 0x6d, 0x5c, 0x56, 0x6d, - 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x1c, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x5c, 0x45, 0x76, 0x6d, - 0x5c, 0x56, 0x6d, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0xea, 0x02, 0x13, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x3a, 0x3a, 0x45, 0x76, 0x6d, - 0x3a, 0x3a, 0x56, 0x6d, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x42, 0x61, 0x73, 0x65, 0x46, 0x65, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x22, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1c, 0x12, 0x1a, 0x2f, + 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x65, 0x76, 0x6d, 0x2f, 0x76, 0x6d, 0x2f, 0x76, 0x31, + 0x2f, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x66, 0x65, 0x65, 0x12, 0x77, 0x0a, 0x06, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x12, 0x24, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, + 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x63, 0x6f, 0x73, 0x6d, + 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x12, 0x18, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, + 0x73, 0x2f, 0x65, 0x76, 0x6d, 0x2f, 0x76, 0x6d, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x12, 0x9f, 0x01, 0x0a, 0x11, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x4d, 0x69, 0x6e, + 0x47, 0x61, 0x73, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x2f, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, + 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x4d, 0x69, 0x6e, 0x47, 0x61, 0x73, 0x50, 0x72, 0x69, + 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x63, 0x6f, 0x73, 0x6d, + 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x4d, 0x69, 0x6e, 0x47, 0x61, 0x73, 0x50, 0x72, + 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x27, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x21, 0x12, 0x1f, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x65, 0x76, 0x6d, + 0x2f, 0x76, 0x6d, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x69, 0x6e, 0x5f, 0x67, 0x61, 0x73, 0x5f, 0x70, + 0x72, 0x69, 0x63, 0x65, 0x42, 0xad, 0x01, 0x0a, 0x14, 0x63, 0x6f, 0x6d, 0x2e, 0x63, 0x6f, 0x73, + 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x42, 0x0a, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x26, 0x63, 0x6f, 0x73, + 0x6d, 0x6f, 0x73, 0x73, 0x64, 0x6b, 0x2e, 0x69, 0x6f, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6f, + 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x65, 0x76, 0x6d, 0x2f, 0x76, 0x6d, 0x2f, 0x76, 0x31, 0x3b, 0x76, + 0x6d, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x43, 0x45, 0x56, 0xaa, 0x02, 0x10, 0x43, 0x6f, 0x73, 0x6d, + 0x6f, 0x73, 0x2e, 0x45, 0x76, 0x6d, 0x2e, 0x56, 0x6d, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x10, 0x43, + 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x5c, 0x45, 0x76, 0x6d, 0x5c, 0x56, 0x6d, 0x5c, 0x56, 0x31, 0xe2, + 0x02, 0x1c, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x5c, 0x45, 0x76, 0x6d, 0x5c, 0x56, 0x6d, 0x5c, + 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, + 0x13, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x3a, 0x3a, 0x45, 0x76, 0x6d, 0x3a, 0x3a, 0x56, 0x6d, + 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -15155,7 +15901,7 @@ func file_cosmos_evm_vm_v1_query_proto_rawDescGZIP() []byte { return file_cosmos_evm_vm_v1_query_proto_rawDescData } -var file_cosmos_evm_vm_v1_query_proto_msgTypes = make([]protoimpl.MessageInfo, 28) +var file_cosmos_evm_vm_v1_query_proto_msgTypes = make([]protoimpl.MessageInfo, 29) var file_cosmos_evm_vm_v1_query_proto_goTypes = []interface{}{ (*QueryConfigRequest)(nil), // 0: cosmos.evm.vm.v1.QueryConfigRequest (*QueryConfigResponse)(nil), // 1: cosmos.evm.vm.v1.QueryConfigResponse @@ -15176,38 +15922,39 @@ var file_cosmos_evm_vm_v1_query_proto_goTypes = []interface{}{ (*QueryParamsRequest)(nil), // 16: cosmos.evm.vm.v1.QueryParamsRequest (*QueryParamsResponse)(nil), // 17: cosmos.evm.vm.v1.QueryParamsResponse (*EthCallRequest)(nil), // 18: cosmos.evm.vm.v1.EthCallRequest - (*EstimateGasResponse)(nil), // 19: cosmos.evm.vm.v1.EstimateGasResponse - (*QueryTraceTxRequest)(nil), // 20: cosmos.evm.vm.v1.QueryTraceTxRequest - (*QueryTraceTxResponse)(nil), // 21: cosmos.evm.vm.v1.QueryTraceTxResponse - (*QueryTraceBlockRequest)(nil), // 22: cosmos.evm.vm.v1.QueryTraceBlockRequest - (*QueryTraceBlockResponse)(nil), // 23: cosmos.evm.vm.v1.QueryTraceBlockResponse - (*QueryBaseFeeRequest)(nil), // 24: cosmos.evm.vm.v1.QueryBaseFeeRequest - (*QueryBaseFeeResponse)(nil), // 25: cosmos.evm.vm.v1.QueryBaseFeeResponse - (*QueryGlobalMinGasPriceRequest)(nil), // 26: cosmos.evm.vm.v1.QueryGlobalMinGasPriceRequest - (*QueryGlobalMinGasPriceResponse)(nil), // 27: cosmos.evm.vm.v1.QueryGlobalMinGasPriceResponse - (*ChainConfig)(nil), // 28: cosmos.evm.vm.v1.ChainConfig - (*v1beta1.PageRequest)(nil), // 29: cosmos.base.query.v1beta1.PageRequest - (*Log)(nil), // 30: cosmos.evm.vm.v1.Log - (*v1beta1.PageResponse)(nil), // 31: cosmos.base.query.v1beta1.PageResponse - (*Params)(nil), // 32: cosmos.evm.vm.v1.Params - (*MsgEthereumTx)(nil), // 33: cosmos.evm.vm.v1.MsgEthereumTx - (*TraceConfig)(nil), // 34: cosmos.evm.vm.v1.TraceConfig - (*timestamppb.Timestamp)(nil), // 35: google.protobuf.Timestamp - (*MsgEthereumTxResponse)(nil), // 36: cosmos.evm.vm.v1.MsgEthereumTxResponse + (*TacSimulateRequest)(nil), // 19: cosmos.evm.vm.v1.TacSimulateRequest + (*EstimateGasResponse)(nil), // 20: cosmos.evm.vm.v1.EstimateGasResponse + (*QueryTraceTxRequest)(nil), // 21: cosmos.evm.vm.v1.QueryTraceTxRequest + (*QueryTraceTxResponse)(nil), // 22: cosmos.evm.vm.v1.QueryTraceTxResponse + (*QueryTraceBlockRequest)(nil), // 23: cosmos.evm.vm.v1.QueryTraceBlockRequest + (*QueryTraceBlockResponse)(nil), // 24: cosmos.evm.vm.v1.QueryTraceBlockResponse + (*QueryBaseFeeRequest)(nil), // 25: cosmos.evm.vm.v1.QueryBaseFeeRequest + (*QueryBaseFeeResponse)(nil), // 26: cosmos.evm.vm.v1.QueryBaseFeeResponse + (*QueryGlobalMinGasPriceRequest)(nil), // 27: cosmos.evm.vm.v1.QueryGlobalMinGasPriceRequest + (*QueryGlobalMinGasPriceResponse)(nil), // 28: cosmos.evm.vm.v1.QueryGlobalMinGasPriceResponse + (*ChainConfig)(nil), // 29: cosmos.evm.vm.v1.ChainConfig + (*v1beta1.PageRequest)(nil), // 30: cosmos.base.query.v1beta1.PageRequest + (*Log)(nil), // 31: cosmos.evm.vm.v1.Log + (*v1beta1.PageResponse)(nil), // 32: cosmos.base.query.v1beta1.PageResponse + (*Params)(nil), // 33: cosmos.evm.vm.v1.Params + (*MsgEthereumTx)(nil), // 34: cosmos.evm.vm.v1.MsgEthereumTx + (*TraceConfig)(nil), // 35: cosmos.evm.vm.v1.TraceConfig + (*timestamppb.Timestamp)(nil), // 36: google.protobuf.Timestamp + (*MsgEthereumTxResponse)(nil), // 37: cosmos.evm.vm.v1.MsgEthereumTxResponse } var file_cosmos_evm_vm_v1_query_proto_depIdxs = []int32{ - 28, // 0: cosmos.evm.vm.v1.QueryConfigResponse.config:type_name -> cosmos.evm.vm.v1.ChainConfig - 29, // 1: cosmos.evm.vm.v1.QueryTxLogsRequest.pagination:type_name -> cosmos.base.query.v1beta1.PageRequest - 30, // 2: cosmos.evm.vm.v1.QueryTxLogsResponse.logs:type_name -> cosmos.evm.vm.v1.Log - 31, // 3: cosmos.evm.vm.v1.QueryTxLogsResponse.pagination:type_name -> cosmos.base.query.v1beta1.PageResponse - 32, // 4: cosmos.evm.vm.v1.QueryParamsResponse.params:type_name -> cosmos.evm.vm.v1.Params - 33, // 5: cosmos.evm.vm.v1.QueryTraceTxRequest.msg:type_name -> cosmos.evm.vm.v1.MsgEthereumTx - 34, // 6: cosmos.evm.vm.v1.QueryTraceTxRequest.trace_config:type_name -> cosmos.evm.vm.v1.TraceConfig - 33, // 7: cosmos.evm.vm.v1.QueryTraceTxRequest.predecessors:type_name -> cosmos.evm.vm.v1.MsgEthereumTx - 35, // 8: cosmos.evm.vm.v1.QueryTraceTxRequest.block_time:type_name -> google.protobuf.Timestamp - 33, // 9: cosmos.evm.vm.v1.QueryTraceBlockRequest.txs:type_name -> cosmos.evm.vm.v1.MsgEthereumTx - 34, // 10: cosmos.evm.vm.v1.QueryTraceBlockRequest.trace_config:type_name -> cosmos.evm.vm.v1.TraceConfig - 35, // 11: cosmos.evm.vm.v1.QueryTraceBlockRequest.block_time:type_name -> google.protobuf.Timestamp + 29, // 0: cosmos.evm.vm.v1.QueryConfigResponse.config:type_name -> cosmos.evm.vm.v1.ChainConfig + 30, // 1: cosmos.evm.vm.v1.QueryTxLogsRequest.pagination:type_name -> cosmos.base.query.v1beta1.PageRequest + 31, // 2: cosmos.evm.vm.v1.QueryTxLogsResponse.logs:type_name -> cosmos.evm.vm.v1.Log + 32, // 3: cosmos.evm.vm.v1.QueryTxLogsResponse.pagination:type_name -> cosmos.base.query.v1beta1.PageResponse + 33, // 4: cosmos.evm.vm.v1.QueryParamsResponse.params:type_name -> cosmos.evm.vm.v1.Params + 34, // 5: cosmos.evm.vm.v1.QueryTraceTxRequest.msg:type_name -> cosmos.evm.vm.v1.MsgEthereumTx + 35, // 6: cosmos.evm.vm.v1.QueryTraceTxRequest.trace_config:type_name -> cosmos.evm.vm.v1.TraceConfig + 34, // 7: cosmos.evm.vm.v1.QueryTraceTxRequest.predecessors:type_name -> cosmos.evm.vm.v1.MsgEthereumTx + 36, // 8: cosmos.evm.vm.v1.QueryTraceTxRequest.block_time:type_name -> google.protobuf.Timestamp + 34, // 9: cosmos.evm.vm.v1.QueryTraceBlockRequest.txs:type_name -> cosmos.evm.vm.v1.MsgEthereumTx + 35, // 10: cosmos.evm.vm.v1.QueryTraceBlockRequest.trace_config:type_name -> cosmos.evm.vm.v1.TraceConfig + 36, // 11: cosmos.evm.vm.v1.QueryTraceBlockRequest.block_time:type_name -> google.protobuf.Timestamp 2, // 12: cosmos.evm.vm.v1.Query.Account:input_type -> cosmos.evm.vm.v1.QueryAccountRequest 4, // 13: cosmos.evm.vm.v1.Query.CosmosAccount:input_type -> cosmos.evm.vm.v1.QueryCosmosAccountRequest 6, // 14: cosmos.evm.vm.v1.Query.ValidatorAccount:input_type -> cosmos.evm.vm.v1.QueryValidatorAccountRequest @@ -15216,28 +15963,30 @@ var file_cosmos_evm_vm_v1_query_proto_depIdxs = []int32{ 12, // 17: cosmos.evm.vm.v1.Query.Code:input_type -> cosmos.evm.vm.v1.QueryCodeRequest 16, // 18: cosmos.evm.vm.v1.Query.Params:input_type -> cosmos.evm.vm.v1.QueryParamsRequest 18, // 19: cosmos.evm.vm.v1.Query.EthCall:input_type -> cosmos.evm.vm.v1.EthCallRequest - 18, // 20: cosmos.evm.vm.v1.Query.EstimateGas:input_type -> cosmos.evm.vm.v1.EthCallRequest - 20, // 21: cosmos.evm.vm.v1.Query.TraceTx:input_type -> cosmos.evm.vm.v1.QueryTraceTxRequest - 22, // 22: cosmos.evm.vm.v1.Query.TraceBlock:input_type -> cosmos.evm.vm.v1.QueryTraceBlockRequest - 24, // 23: cosmos.evm.vm.v1.Query.BaseFee:input_type -> cosmos.evm.vm.v1.QueryBaseFeeRequest - 0, // 24: cosmos.evm.vm.v1.Query.Config:input_type -> cosmos.evm.vm.v1.QueryConfigRequest - 26, // 25: cosmos.evm.vm.v1.Query.GlobalMinGasPrice:input_type -> cosmos.evm.vm.v1.QueryGlobalMinGasPriceRequest - 3, // 26: cosmos.evm.vm.v1.Query.Account:output_type -> cosmos.evm.vm.v1.QueryAccountResponse - 5, // 27: cosmos.evm.vm.v1.Query.CosmosAccount:output_type -> cosmos.evm.vm.v1.QueryCosmosAccountResponse - 7, // 28: cosmos.evm.vm.v1.Query.ValidatorAccount:output_type -> cosmos.evm.vm.v1.QueryValidatorAccountResponse - 9, // 29: cosmos.evm.vm.v1.Query.Balance:output_type -> cosmos.evm.vm.v1.QueryBalanceResponse - 11, // 30: cosmos.evm.vm.v1.Query.Storage:output_type -> cosmos.evm.vm.v1.QueryStorageResponse - 13, // 31: cosmos.evm.vm.v1.Query.Code:output_type -> cosmos.evm.vm.v1.QueryCodeResponse - 17, // 32: cosmos.evm.vm.v1.Query.Params:output_type -> cosmos.evm.vm.v1.QueryParamsResponse - 36, // 33: cosmos.evm.vm.v1.Query.EthCall:output_type -> cosmos.evm.vm.v1.MsgEthereumTxResponse - 19, // 34: cosmos.evm.vm.v1.Query.EstimateGas:output_type -> cosmos.evm.vm.v1.EstimateGasResponse - 21, // 35: cosmos.evm.vm.v1.Query.TraceTx:output_type -> cosmos.evm.vm.v1.QueryTraceTxResponse - 23, // 36: cosmos.evm.vm.v1.Query.TraceBlock:output_type -> cosmos.evm.vm.v1.QueryTraceBlockResponse - 25, // 37: cosmos.evm.vm.v1.Query.BaseFee:output_type -> cosmos.evm.vm.v1.QueryBaseFeeResponse - 1, // 38: cosmos.evm.vm.v1.Query.Config:output_type -> cosmos.evm.vm.v1.QueryConfigResponse - 27, // 39: cosmos.evm.vm.v1.Query.GlobalMinGasPrice:output_type -> cosmos.evm.vm.v1.QueryGlobalMinGasPriceResponse - 26, // [26:40] is the sub-list for method output_type - 12, // [12:26] is the sub-list for method input_type + 19, // 20: cosmos.evm.vm.v1.Query.TacSimulate:input_type -> cosmos.evm.vm.v1.TacSimulateRequest + 18, // 21: cosmos.evm.vm.v1.Query.EstimateGas:input_type -> cosmos.evm.vm.v1.EthCallRequest + 21, // 22: cosmos.evm.vm.v1.Query.TraceTx:input_type -> cosmos.evm.vm.v1.QueryTraceTxRequest + 23, // 23: cosmos.evm.vm.v1.Query.TraceBlock:input_type -> cosmos.evm.vm.v1.QueryTraceBlockRequest + 25, // 24: cosmos.evm.vm.v1.Query.BaseFee:input_type -> cosmos.evm.vm.v1.QueryBaseFeeRequest + 0, // 25: cosmos.evm.vm.v1.Query.Config:input_type -> cosmos.evm.vm.v1.QueryConfigRequest + 27, // 26: cosmos.evm.vm.v1.Query.GlobalMinGasPrice:input_type -> cosmos.evm.vm.v1.QueryGlobalMinGasPriceRequest + 3, // 27: cosmos.evm.vm.v1.Query.Account:output_type -> cosmos.evm.vm.v1.QueryAccountResponse + 5, // 28: cosmos.evm.vm.v1.Query.CosmosAccount:output_type -> cosmos.evm.vm.v1.QueryCosmosAccountResponse + 7, // 29: cosmos.evm.vm.v1.Query.ValidatorAccount:output_type -> cosmos.evm.vm.v1.QueryValidatorAccountResponse + 9, // 30: cosmos.evm.vm.v1.Query.Balance:output_type -> cosmos.evm.vm.v1.QueryBalanceResponse + 11, // 31: cosmos.evm.vm.v1.Query.Storage:output_type -> cosmos.evm.vm.v1.QueryStorageResponse + 13, // 32: cosmos.evm.vm.v1.Query.Code:output_type -> cosmos.evm.vm.v1.QueryCodeResponse + 17, // 33: cosmos.evm.vm.v1.Query.Params:output_type -> cosmos.evm.vm.v1.QueryParamsResponse + 37, // 34: cosmos.evm.vm.v1.Query.EthCall:output_type -> cosmos.evm.vm.v1.MsgEthereumTxResponse + 37, // 35: cosmos.evm.vm.v1.Query.TacSimulate:output_type -> cosmos.evm.vm.v1.MsgEthereumTxResponse + 20, // 36: cosmos.evm.vm.v1.Query.EstimateGas:output_type -> cosmos.evm.vm.v1.EstimateGasResponse + 22, // 37: cosmos.evm.vm.v1.Query.TraceTx:output_type -> cosmos.evm.vm.v1.QueryTraceTxResponse + 24, // 38: cosmos.evm.vm.v1.Query.TraceBlock:output_type -> cosmos.evm.vm.v1.QueryTraceBlockResponse + 26, // 39: cosmos.evm.vm.v1.Query.BaseFee:output_type -> cosmos.evm.vm.v1.QueryBaseFeeResponse + 1, // 40: cosmos.evm.vm.v1.Query.Config:output_type -> cosmos.evm.vm.v1.QueryConfigResponse + 28, // 41: cosmos.evm.vm.v1.Query.GlobalMinGasPrice:output_type -> cosmos.evm.vm.v1.QueryGlobalMinGasPriceResponse + 27, // [27:42] is the sub-list for method output_type + 12, // [12:27] is the sub-list for method input_type 12, // [12:12] is the sub-list for extension type_name 12, // [12:12] is the sub-list for extension extendee 0, // [0:12] is the sub-list for field type_name @@ -15480,7 +16229,7 @@ func file_cosmos_evm_vm_v1_query_proto_init() { } } file_cosmos_evm_vm_v1_query_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EstimateGasResponse); i { + switch v := v.(*TacSimulateRequest); i { case 0: return &v.state case 1: @@ -15492,7 +16241,7 @@ func file_cosmos_evm_vm_v1_query_proto_init() { } } file_cosmos_evm_vm_v1_query_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*QueryTraceTxRequest); i { + switch v := v.(*EstimateGasResponse); i { case 0: return &v.state case 1: @@ -15504,7 +16253,7 @@ func file_cosmos_evm_vm_v1_query_proto_init() { } } file_cosmos_evm_vm_v1_query_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*QueryTraceTxResponse); i { + switch v := v.(*QueryTraceTxRequest); i { case 0: return &v.state case 1: @@ -15516,7 +16265,7 @@ func file_cosmos_evm_vm_v1_query_proto_init() { } } file_cosmos_evm_vm_v1_query_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*QueryTraceBlockRequest); i { + switch v := v.(*QueryTraceTxResponse); i { case 0: return &v.state case 1: @@ -15528,7 +16277,7 @@ func file_cosmos_evm_vm_v1_query_proto_init() { } } file_cosmos_evm_vm_v1_query_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*QueryTraceBlockResponse); i { + switch v := v.(*QueryTraceBlockRequest); i { case 0: return &v.state case 1: @@ -15540,7 +16289,7 @@ func file_cosmos_evm_vm_v1_query_proto_init() { } } file_cosmos_evm_vm_v1_query_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*QueryBaseFeeRequest); i { + switch v := v.(*QueryTraceBlockResponse); i { case 0: return &v.state case 1: @@ -15552,7 +16301,7 @@ func file_cosmos_evm_vm_v1_query_proto_init() { } } file_cosmos_evm_vm_v1_query_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*QueryBaseFeeResponse); i { + switch v := v.(*QueryBaseFeeRequest); i { case 0: return &v.state case 1: @@ -15564,7 +16313,7 @@ func file_cosmos_evm_vm_v1_query_proto_init() { } } file_cosmos_evm_vm_v1_query_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*QueryGlobalMinGasPriceRequest); i { + switch v := v.(*QueryBaseFeeResponse); i { case 0: return &v.state case 1: @@ -15576,6 +16325,18 @@ func file_cosmos_evm_vm_v1_query_proto_init() { } } file_cosmos_evm_vm_v1_query_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*QueryGlobalMinGasPriceRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_cosmos_evm_vm_v1_query_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*QueryGlobalMinGasPriceResponse); i { case 0: return &v.state @@ -15594,7 +16355,7 @@ func file_cosmos_evm_vm_v1_query_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_cosmos_evm_vm_v1_query_proto_rawDesc, NumEnums: 0, - NumMessages: 28, + NumMessages: 29, NumExtensions: 0, NumServices: 1, }, diff --git a/api/cosmos/evm/vm/v1/query_grpc.pb.go b/api/cosmos/evm/vm/v1/query_grpc.pb.go index b37d39ffe..b656be958 100644 --- a/api/cosmos/evm/vm/v1/query_grpc.pb.go +++ b/api/cosmos/evm/vm/v1/query_grpc.pb.go @@ -27,6 +27,7 @@ const ( Query_Code_FullMethodName = "/cosmos.evm.vm.v1.Query/Code" Query_Params_FullMethodName = "/cosmos.evm.vm.v1.Query/Params" Query_EthCall_FullMethodName = "/cosmos.evm.vm.v1.Query/EthCall" + Query_TacSimulate_FullMethodName = "/cosmos.evm.vm.v1.Query/TacSimulate" Query_EstimateGas_FullMethodName = "/cosmos.evm.vm.v1.Query/EstimateGas" Query_TraceTx_FullMethodName = "/cosmos.evm.vm.v1.Query/TraceTx" Query_TraceBlock_FullMethodName = "/cosmos.evm.vm.v1.Query/TraceBlock" @@ -57,6 +58,8 @@ type QueryClient interface { Params(ctx context.Context, in *QueryParamsRequest, opts ...grpc.CallOption) (*QueryParamsResponse, error) // EthCall implements the `eth_call` rpc api EthCall(ctx context.Context, in *EthCallRequest, opts ...grpc.CallOption) (*MsgEthereumTxResponse, error) + // TacSimulate implements the custom `eth_tacSimulate` rpc api which supports state override + TacSimulate(ctx context.Context, in *TacSimulateRequest, opts ...grpc.CallOption) (*MsgEthereumTxResponse, error) // EstimateGas implements the `eth_estimateGas` rpc api EstimateGas(ctx context.Context, in *EthCallRequest, opts ...grpc.CallOption) (*EstimateGasResponse, error) // TraceTx implements the `debug_traceTransaction` rpc api @@ -157,6 +160,15 @@ func (c *queryClient) EthCall(ctx context.Context, in *EthCallRequest, opts ...g return out, nil } +func (c *queryClient) TacSimulate(ctx context.Context, in *TacSimulateRequest, opts ...grpc.CallOption) (*MsgEthereumTxResponse, error) { + out := new(MsgEthereumTxResponse) + err := c.cc.Invoke(ctx, Query_TacSimulate_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *queryClient) EstimateGas(ctx context.Context, in *EthCallRequest, opts ...grpc.CallOption) (*EstimateGasResponse, error) { out := new(EstimateGasResponse) err := c.cc.Invoke(ctx, Query_EstimateGas_FullMethodName, in, out, opts...) @@ -233,6 +245,8 @@ type QueryServer interface { Params(context.Context, *QueryParamsRequest) (*QueryParamsResponse, error) // EthCall implements the `eth_call` rpc api EthCall(context.Context, *EthCallRequest) (*MsgEthereumTxResponse, error) + // TacSimulate implements the custom `eth_tacSimulate` rpc api which supports state override + TacSimulate(context.Context, *TacSimulateRequest) (*MsgEthereumTxResponse, error) // EstimateGas implements the `eth_estimateGas` rpc api EstimateGas(context.Context, *EthCallRequest) (*EstimateGasResponse, error) // TraceTx implements the `debug_traceTransaction` rpc api @@ -282,6 +296,9 @@ func (UnimplementedQueryServer) Params(context.Context, *QueryParamsRequest) (*Q func (UnimplementedQueryServer) EthCall(context.Context, *EthCallRequest) (*MsgEthereumTxResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method EthCall not implemented") } +func (UnimplementedQueryServer) TacSimulate(context.Context, *TacSimulateRequest) (*MsgEthereumTxResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method TacSimulate not implemented") +} func (UnimplementedQueryServer) EstimateGas(context.Context, *EthCallRequest) (*EstimateGasResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method EstimateGas not implemented") } @@ -457,6 +474,24 @@ func _Query_EthCall_Handler(srv interface{}, ctx context.Context, dec func(inter return interceptor(ctx, in, info, handler) } +func _Query_TacSimulate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(TacSimulateRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).TacSimulate(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Query_TacSimulate_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).TacSimulate(ctx, req.(*TacSimulateRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _Query_EstimateGas_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(EthCallRequest) if err := dec(in); err != nil { @@ -604,6 +639,10 @@ var Query_ServiceDesc = grpc.ServiceDesc{ MethodName: "EthCall", Handler: _Query_EthCall_Handler, }, + { + MethodName: "TacSimulate", + Handler: _Query_TacSimulate_Handler, + }, { MethodName: "EstimateGas", Handler: _Query_EstimateGas_Handler, diff --git a/x/vm/types/query.pb.go b/x/vm/types/query.pb.go index c38adab2b..468e82e68 100644 --- a/x/vm/types/query.pb.go +++ b/x/vm/types/query.pb.go @@ -944,6 +944,88 @@ func (m *EthCallRequest) GetChainId() int64 { return 0 } +// TacSimulateRequest defines TacSimulate request +type TacSimulateRequest struct { + // args uses the same json format as the json rpc api. + Args []byte `protobuf:"bytes,1,opt,name=args,proto3" json:"args,omitempty"` + // state_override defines the state override for the call, it uses the same json format as the json rpc api. + StateOverride []byte `protobuf:"bytes,2,opt,name=state_override,json=stateOverride,proto3" json:"state_override,omitempty"` + // gas_cap defines the default gas cap to be used + GasCap uint64 `protobuf:"varint,3,opt,name=gas_cap,json=gasCap,proto3" json:"gas_cap,omitempty"` + // proposer_address of the requested block in hex format + ProposerAddress github_com_cosmos_cosmos_sdk_types.ConsAddress `protobuf:"bytes,4,opt,name=proposer_address,json=proposerAddress,proto3,casttype=github.com/cosmos/cosmos-sdk/types.ConsAddress" json:"proposer_address,omitempty"` + // chain_id is the eip155 chain id parsed from the requested block header + ChainId int64 `protobuf:"varint,5,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` +} + +func (m *TacSimulateRequest) Reset() { *m = TacSimulateRequest{} } +func (m *TacSimulateRequest) String() string { return proto.CompactTextString(m) } +func (*TacSimulateRequest) ProtoMessage() {} +func (*TacSimulateRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_0e8f08e175b3ef0c, []int{19} +} +func (m *TacSimulateRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *TacSimulateRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_TacSimulateRequest.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 *TacSimulateRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_TacSimulateRequest.Merge(m, src) +} +func (m *TacSimulateRequest) XXX_Size() int { + return m.Size() +} +func (m *TacSimulateRequest) XXX_DiscardUnknown() { + xxx_messageInfo_TacSimulateRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_TacSimulateRequest proto.InternalMessageInfo + +func (m *TacSimulateRequest) GetArgs() []byte { + if m != nil { + return m.Args + } + return nil +} + +func (m *TacSimulateRequest) GetStateOverride() []byte { + if m != nil { + return m.StateOverride + } + return nil +} + +func (m *TacSimulateRequest) GetGasCap() uint64 { + if m != nil { + return m.GasCap + } + return 0 +} + +func (m *TacSimulateRequest) GetProposerAddress() github_com_cosmos_cosmos_sdk_types.ConsAddress { + if m != nil { + return m.ProposerAddress + } + return nil +} + +func (m *TacSimulateRequest) GetChainId() int64 { + if m != nil { + return m.ChainId + } + return 0 +} + // EstimateGasResponse defines EstimateGas response type EstimateGasResponse struct { // gas returns the estimated gas @@ -959,7 +1041,7 @@ func (m *EstimateGasResponse) Reset() { *m = EstimateGasResponse{} } func (m *EstimateGasResponse) String() string { return proto.CompactTextString(m) } func (*EstimateGasResponse) ProtoMessage() {} func (*EstimateGasResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0e8f08e175b3ef0c, []int{19} + return fileDescriptor_0e8f08e175b3ef0c, []int{20} } func (m *EstimateGasResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1036,7 +1118,7 @@ func (m *QueryTraceTxRequest) Reset() { *m = QueryTraceTxRequest{} } func (m *QueryTraceTxRequest) String() string { return proto.CompactTextString(m) } func (*QueryTraceTxRequest) ProtoMessage() {} func (*QueryTraceTxRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0e8f08e175b3ef0c, []int{20} + return fileDescriptor_0e8f08e175b3ef0c, []int{21} } func (m *QueryTraceTxRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1138,7 +1220,7 @@ func (m *QueryTraceTxResponse) Reset() { *m = QueryTraceTxResponse{} } func (m *QueryTraceTxResponse) String() string { return proto.CompactTextString(m) } func (*QueryTraceTxResponse) ProtoMessage() {} func (*QueryTraceTxResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0e8f08e175b3ef0c, []int{21} + return fileDescriptor_0e8f08e175b3ef0c, []int{22} } func (m *QueryTraceTxResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1198,7 +1280,7 @@ func (m *QueryTraceBlockRequest) Reset() { *m = QueryTraceBlockRequest{} func (m *QueryTraceBlockRequest) String() string { return proto.CompactTextString(m) } func (*QueryTraceBlockRequest) ProtoMessage() {} func (*QueryTraceBlockRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0e8f08e175b3ef0c, []int{22} + return fileDescriptor_0e8f08e175b3ef0c, []int{23} } func (m *QueryTraceBlockRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1293,7 +1375,7 @@ func (m *QueryTraceBlockResponse) Reset() { *m = QueryTraceBlockResponse func (m *QueryTraceBlockResponse) String() string { return proto.CompactTextString(m) } func (*QueryTraceBlockResponse) ProtoMessage() {} func (*QueryTraceBlockResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0e8f08e175b3ef0c, []int{23} + return fileDescriptor_0e8f08e175b3ef0c, []int{24} } func (m *QueryTraceBlockResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1338,7 +1420,7 @@ 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_0e8f08e175b3ef0c, []int{24} + return fileDescriptor_0e8f08e175b3ef0c, []int{25} } func (m *QueryBaseFeeRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1377,7 +1459,7 @@ 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_0e8f08e175b3ef0c, []int{25} + return fileDescriptor_0e8f08e175b3ef0c, []int{26} } func (m *QueryBaseFeeResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1415,7 +1497,7 @@ func (m *QueryGlobalMinGasPriceRequest) Reset() { *m = QueryGlobalMinGas func (m *QueryGlobalMinGasPriceRequest) String() string { return proto.CompactTextString(m) } func (*QueryGlobalMinGasPriceRequest) ProtoMessage() {} func (*QueryGlobalMinGasPriceRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0e8f08e175b3ef0c, []int{26} + return fileDescriptor_0e8f08e175b3ef0c, []int{27} } func (m *QueryGlobalMinGasPriceRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1454,7 +1536,7 @@ func (m *QueryGlobalMinGasPriceResponse) Reset() { *m = QueryGlobalMinGa func (m *QueryGlobalMinGasPriceResponse) String() string { return proto.CompactTextString(m) } func (*QueryGlobalMinGasPriceResponse) ProtoMessage() {} func (*QueryGlobalMinGasPriceResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0e8f08e175b3ef0c, []int{27} + return fileDescriptor_0e8f08e175b3ef0c, []int{28} } func (m *QueryGlobalMinGasPriceResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1503,6 +1585,7 @@ func init() { proto.RegisterType((*QueryParamsRequest)(nil), "cosmos.evm.vm.v1.QueryParamsRequest") proto.RegisterType((*QueryParamsResponse)(nil), "cosmos.evm.vm.v1.QueryParamsResponse") proto.RegisterType((*EthCallRequest)(nil), "cosmos.evm.vm.v1.EthCallRequest") + proto.RegisterType((*TacSimulateRequest)(nil), "cosmos.evm.vm.v1.TacSimulateRequest") proto.RegisterType((*EstimateGasResponse)(nil), "cosmos.evm.vm.v1.EstimateGasResponse") proto.RegisterType((*QueryTraceTxRequest)(nil), "cosmos.evm.vm.v1.QueryTraceTxRequest") proto.RegisterType((*QueryTraceTxResponse)(nil), "cosmos.evm.vm.v1.QueryTraceTxResponse") @@ -1517,109 +1600,113 @@ func init() { func init() { proto.RegisterFile("cosmos/evm/vm/v1/query.proto", fileDescriptor_0e8f08e175b3ef0c) } var fileDescriptor_0e8f08e175b3ef0c = []byte{ - // 1623 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x58, 0xcf, 0x6f, 0x13, 0xc7, - 0x17, 0xcf, 0xc6, 0x4e, 0xec, 0x8c, 0x13, 0x08, 0x43, 0xf8, 0xe2, 0xec, 0x37, 0xb1, 0xc3, 0x42, - 0x7e, 0x12, 0x76, 0x49, 0x4a, 0x2b, 0x95, 0x1e, 0xda, 0x24, 0x0a, 0x81, 0x02, 0x15, 0xdd, 0x46, - 0x3d, 0x54, 0xaa, 0xac, 0xf1, 0x7a, 0x58, 0xaf, 0xe2, 0xdd, 0x31, 0x3b, 0xeb, 0xd4, 0x81, 0xd2, - 0x43, 0xa5, 0x22, 0x28, 0x17, 0xa4, 0xde, 0x5b, 0x8e, 0xbd, 0xb5, 0x37, 0xfe, 0x05, 0x8e, 0x48, - 0xbd, 0x54, 0x3d, 0xd0, 0x0a, 0x2a, 0xb5, 0x7f, 0x43, 0x4f, 0xd5, 0xfc, 0x58, 0xdb, 0xeb, 0xf5, - 0xda, 0xa1, 0xa2, 0xb7, 0x4a, 0x11, 0xec, 0xcc, 0xbc, 0x1f, 0x9f, 0xf7, 0xe6, 0xcd, 0x7b, 0x9f, - 0x04, 0xcc, 0x58, 0x84, 0xba, 0x84, 0x1a, 0x78, 0xdf, 0x35, 0xd8, 0xcf, 0x9a, 0x71, 0xab, 0x81, - 0xfd, 0x03, 0xbd, 0xee, 0x93, 0x80, 0xc0, 0x49, 0x71, 0xaa, 0xe3, 0x7d, 0x57, 0x67, 0x3f, 0x6b, - 0xea, 0x31, 0xe4, 0x3a, 0x1e, 0x31, 0xf8, 0xbf, 0x42, 0x48, 0x5d, 0x91, 0x26, 0xca, 0x88, 0x62, - 0xa1, 0x6d, 0xec, 0xaf, 0x95, 0x71, 0x80, 0xd6, 0x8c, 0x3a, 0xb2, 0x1d, 0x0f, 0x05, 0x0e, 0xf1, - 0xa4, 0xec, 0x94, 0x4d, 0x6c, 0xc2, 0x3f, 0x0d, 0xf6, 0x25, 0x77, 0x67, 0x6c, 0x42, 0xec, 0x1a, - 0x36, 0x50, 0xdd, 0x31, 0x90, 0xe7, 0x91, 0x80, 0xab, 0x50, 0x79, 0x5a, 0x94, 0xa7, 0x7c, 0x55, - 0x6e, 0xdc, 0x34, 0x02, 0xc7, 0xc5, 0x34, 0x40, 0x6e, 0x5d, 0x0a, 0xa8, 0xb1, 0x18, 0x18, 0x5e, - 0x71, 0x36, 0x1d, 0x3b, 0x0b, 0x9a, 0xe2, 0x48, 0x9b, 0x02, 0xf0, 0x43, 0x86, 0x76, 0x8b, 0x78, - 0x37, 0x1d, 0xdb, 0xc4, 0xb7, 0x1a, 0x98, 0x06, 0xda, 0x35, 0x70, 0x3c, 0xb2, 0x4b, 0xeb, 0xc4, - 0xa3, 0x18, 0xbe, 0x09, 0x46, 0x2d, 0xbe, 0x93, 0x57, 0xe6, 0x94, 0xa5, 0xdc, 0xfa, 0xac, 0xde, - 0x9d, 0x1a, 0x7d, 0xab, 0x8a, 0x1c, 0x4f, 0xaa, 0x49, 0x61, 0xed, 0x6d, 0x69, 0x6d, 0xc3, 0xb2, - 0x48, 0xc3, 0x0b, 0xa4, 0x13, 0x98, 0x07, 0x19, 0x54, 0xa9, 0xf8, 0x98, 0x52, 0x6e, 0x6e, 0xcc, - 0x0c, 0x97, 0x17, 0xb3, 0xf7, 0x1f, 0x17, 0x87, 0xfe, 0x7c, 0x5c, 0x1c, 0xd2, 0x2c, 0x30, 0x15, - 0x55, 0x95, 0x48, 0xf2, 0x20, 0x53, 0x46, 0x35, 0xe4, 0x59, 0x38, 0xd4, 0x95, 0x4b, 0xf8, 0x7f, - 0x30, 0x66, 0x91, 0x0a, 0x2e, 0x55, 0x11, 0xad, 0xe6, 0x87, 0xf9, 0x59, 0x96, 0x6d, 0x5c, 0x46, - 0xb4, 0x0a, 0xa7, 0xc0, 0x88, 0x47, 0x98, 0x52, 0x6a, 0x4e, 0x59, 0x4a, 0x9b, 0x62, 0xa1, 0xbd, - 0x0b, 0xa6, 0x65, 0xb4, 0x2c, 0x98, 0x7f, 0x80, 0xf2, 0x9e, 0x02, 0xd4, 0x5e, 0x16, 0x24, 0xd8, - 0x79, 0x70, 0x44, 0xe4, 0xa9, 0x14, 0xb5, 0x34, 0x21, 0x76, 0x37, 0xc4, 0x26, 0x54, 0x41, 0x96, - 0x32, 0xa7, 0x0c, 0xdf, 0x30, 0xc7, 0xd7, 0x5a, 0x33, 0x13, 0x48, 0x58, 0x2d, 0x79, 0x0d, 0xb7, - 0x8c, 0x7d, 0x19, 0xc1, 0x84, 0xdc, 0xfd, 0x80, 0x6f, 0x6a, 0x57, 0xc1, 0x0c, 0xc7, 0xf1, 0x31, - 0xaa, 0x39, 0x15, 0x14, 0x10, 0xbf, 0x2b, 0x98, 0x53, 0x60, 0xdc, 0x22, 0x5e, 0x37, 0x8e, 0x1c, - 0xdb, 0xdb, 0x88, 0x45, 0xf5, 0x50, 0x01, 0xb3, 0x09, 0xd6, 0x64, 0x60, 0x8b, 0xe0, 0x68, 0x88, - 0x2a, 0x6a, 0x31, 0x04, 0xfb, 0x1a, 0x43, 0x0b, 0x8b, 0x68, 0x53, 0xdc, 0xf3, 0xab, 0x5c, 0xcf, - 0x79, 0x59, 0x44, 0x2d, 0xd5, 0x41, 0x45, 0xa4, 0x5d, 0x95, 0xce, 0x3e, 0x0a, 0x88, 0x8f, 0xec, - 0xc1, 0xce, 0xe0, 0x24, 0x48, 0xed, 0xe1, 0x03, 0x59, 0x6f, 0xec, 0xb3, 0xc3, 0xfd, 0xaa, 0x74, - 0xdf, 0x32, 0x26, 0xdd, 0x4f, 0x81, 0x91, 0x7d, 0x54, 0x6b, 0x84, 0xce, 0xc5, 0x42, 0x7b, 0x0b, - 0x4c, 0xca, 0x52, 0xaa, 0xbc, 0x52, 0x90, 0x8b, 0xe0, 0x58, 0x87, 0x9e, 0x74, 0x01, 0x41, 0x9a, - 0xd5, 0x3e, 0xd7, 0x1a, 0x37, 0xf9, 0xb7, 0x76, 0x5b, 0xbe, 0xf8, 0xdd, 0xe6, 0x35, 0x62, 0xd3, - 0xd0, 0x05, 0x04, 0x69, 0xfe, 0x62, 0x84, 0x7d, 0xfe, 0x0d, 0x2f, 0x01, 0xd0, 0xee, 0x5d, 0x3c, - 0xb6, 0xdc, 0xfa, 0x42, 0xf8, 0xe4, 0x59, 0xa3, 0xd3, 0x45, 0x9b, 0x94, 0x8d, 0x4e, 0xbf, 0xd1, - 0x4e, 0x95, 0xd9, 0xa1, 0xd9, 0x01, 0xf2, 0x81, 0x22, 0x13, 0x1b, 0x3a, 0x97, 0x38, 0x97, 0x41, - 0xba, 0x46, 0x6c, 0x16, 0x5d, 0x6a, 0x29, 0xb7, 0x7e, 0x22, 0xde, 0x56, 0xae, 0x11, 0xdb, 0xe4, - 0x22, 0x70, 0xa7, 0x07, 0xa8, 0xc5, 0x81, 0xa0, 0x84, 0x9f, 0x4e, 0x54, 0xad, 0xce, 0x77, 0x03, - 0xf9, 0xc8, 0x0d, 0xf3, 0xa0, 0x99, 0x12, 0x60, 0xb8, 0x2b, 0x01, 0xbe, 0x03, 0x46, 0xeb, 0x7c, - 0x47, 0x76, 0xbe, 0x7c, 0x1c, 0xa2, 0xd0, 0xd8, 0x1c, 0x7b, 0xfa, 0xbc, 0x38, 0xf4, 0xfd, 0x1f, - 0x3f, 0xae, 0x28, 0xa6, 0x54, 0xd1, 0x9e, 0x28, 0xe0, 0xc8, 0x76, 0x50, 0xdd, 0x42, 0xb5, 0x5a, - 0x47, 0xba, 0x91, 0x6f, 0xd3, 0xf0, 0x62, 0xd8, 0x37, 0x3c, 0x09, 0x32, 0x36, 0xa2, 0x25, 0x0b, - 0xd5, 0xe5, 0x1b, 0x19, 0xb5, 0x11, 0xdd, 0x42, 0x75, 0xf8, 0x29, 0x98, 0xac, 0xfb, 0xa4, 0x4e, - 0x28, 0xf6, 0x5b, 0xef, 0x8c, 0xbd, 0x91, 0xf1, 0xcd, 0xf5, 0xbf, 0x9e, 0x17, 0x75, 0xdb, 0x09, - 0xaa, 0x8d, 0xb2, 0x6e, 0x11, 0xd7, 0x90, 0x7d, 0x5e, 0xfc, 0x77, 0x8e, 0x56, 0xf6, 0x8c, 0xe0, - 0xa0, 0x8e, 0xa9, 0xbe, 0xd5, 0x7e, 0xe0, 0xe6, 0xd1, 0xd0, 0x56, 0xf8, 0x38, 0xa7, 0x41, 0xd6, - 0x62, 0x5d, 0xbb, 0xe4, 0x54, 0xf2, 0xe9, 0x39, 0x65, 0x29, 0x65, 0x66, 0xf8, 0xfa, 0x4a, 0x45, - 0xdb, 0x05, 0xc7, 0xb7, 0x69, 0xe0, 0xb8, 0x28, 0xc0, 0x3b, 0xa8, 0x9d, 0x8d, 0x49, 0x90, 0xb2, - 0x91, 0x00, 0x9f, 0x36, 0xd9, 0x27, 0xdb, 0xf1, 0x71, 0xc0, 0x71, 0x8f, 0x9b, 0xec, 0x93, 0x59, - 0xdd, 0x77, 0x4b, 0xd8, 0xf7, 0x89, 0x78, 0xd0, 0x63, 0x66, 0x66, 0xdf, 0xdd, 0x66, 0x4b, 0xed, - 0x41, 0x3a, 0xac, 0x02, 0x1f, 0x59, 0x78, 0xb7, 0x19, 0x26, 0x65, 0x0d, 0xa4, 0x5c, 0x1a, 0xce, - 0x96, 0x62, 0x3c, 0xc3, 0xd7, 0xa9, 0xbd, 0x1d, 0x54, 0xb1, 0x8f, 0x1b, 0xee, 0x6e, 0xd3, 0x64, - 0xb2, 0xf0, 0x3d, 0x30, 0x1e, 0x30, 0x23, 0x25, 0x39, 0x97, 0x52, 0x49, 0x73, 0x89, 0xbb, 0x92, - 0x73, 0x29, 0x17, 0xb4, 0x17, 0x70, 0x0b, 0x8c, 0xd7, 0x7d, 0x5c, 0xc1, 0x16, 0xa6, 0x94, 0xf8, - 0x34, 0x9f, 0xe6, 0x25, 0x38, 0xd0, 0x7b, 0x44, 0x89, 0xf5, 0xd5, 0x72, 0x8d, 0x58, 0x7b, 0x61, - 0x07, 0x1b, 0xe1, 0x69, 0xcc, 0xf1, 0x3d, 0xd1, 0xbf, 0xe0, 0x2c, 0x00, 0x42, 0x84, 0x3f, 0xb3, - 0x51, 0x9e, 0x91, 0x31, 0xbe, 0xc3, 0x27, 0xd3, 0xe5, 0xf0, 0x98, 0xcd, 0xf5, 0x7c, 0x86, 0x87, - 0xa1, 0xea, 0x62, 0xe8, 0xeb, 0xe1, 0xd0, 0xd7, 0x77, 0xc3, 0xa1, 0xbf, 0x39, 0xc1, 0xca, 0xec, - 0xd1, 0xaf, 0x45, 0x45, 0x94, 0x9a, 0xb0, 0xc4, 0x8e, 0x7b, 0x56, 0x4b, 0xf6, 0xdf, 0xa9, 0x96, - 0xb1, 0x48, 0xb5, 0x40, 0x0d, 0x4c, 0x88, 0x18, 0x5c, 0xd4, 0x2c, 0xb1, 0x02, 0x01, 0x1d, 0x69, - 0xb8, 0x8e, 0x9a, 0x3b, 0x88, 0xbe, 0x9f, 0xce, 0x0e, 0x4f, 0xa6, 0xcc, 0x6c, 0xd0, 0x2c, 0x39, - 0x5e, 0x05, 0x37, 0xb5, 0x15, 0xd9, 0x1c, 0x5b, 0xa5, 0xd0, 0xee, 0x5c, 0x15, 0x14, 0xa0, 0xf0, - 0x81, 0xb0, 0x6f, 0xed, 0x49, 0x0a, 0xfc, 0xaf, 0x2d, 0xbc, 0xc9, 0xac, 0x76, 0x94, 0x4e, 0xd0, - 0x0c, 0xfb, 0xc7, 0xe0, 0xd2, 0x09, 0x9a, 0xf4, 0x35, 0x94, 0xce, 0x7f, 0xb7, 0x7e, 0xc8, 0x5b, - 0xd7, 0xce, 0x81, 0x93, 0xb1, 0x8b, 0xeb, 0x73, 0xd1, 0x27, 0x5a, 0xb3, 0x9e, 0xe2, 0x4b, 0x18, - 0xb7, 0x59, 0xe9, 0x54, 0x74, 0x5b, 0x9a, 0xb8, 0x00, 0xb2, 0xac, 0xf1, 0x97, 0x6e, 0x62, 0x39, - 0x4b, 0x37, 0xa7, 0x7f, 0x79, 0x5e, 0x3c, 0x21, 0x22, 0xa4, 0x95, 0x3d, 0xdd, 0x21, 0x86, 0x8b, - 0x82, 0xaa, 0x7e, 0xc5, 0x0b, 0xd8, 0x8c, 0xe7, 0xda, 0x5a, 0x51, 0xb2, 0x9b, 0x9d, 0x1a, 0x29, - 0xa3, 0xda, 0x75, 0xc7, 0xdb, 0x41, 0xf4, 0x86, 0xef, 0xb4, 0xa8, 0x85, 0x66, 0x81, 0x42, 0x92, - 0x80, 0x74, 0xbc, 0x01, 0x26, 0x5c, 0xc7, 0x63, 0x41, 0x97, 0xea, 0xec, 0x40, 0x7a, 0x9f, 0x65, - 0xb7, 0x94, 0x8c, 0x20, 0xe7, 0xb6, 0x4d, 0xad, 0x7f, 0x7d, 0x14, 0x8c, 0x70, 0x2f, 0xf0, 0x2b, - 0x05, 0x64, 0x24, 0xc1, 0x82, 0xf3, 0xf1, 0x2a, 0xec, 0xc1, 0xa0, 0xd5, 0x85, 0x41, 0x62, 0x02, - 0xa7, 0x76, 0xf6, 0xcb, 0x9f, 0x7e, 0xff, 0x66, 0x78, 0x1e, 0x9e, 0x36, 0x62, 0xbf, 0x08, 0x48, - 0x92, 0x65, 0xdc, 0x91, 0x45, 0x73, 0x17, 0x7e, 0xab, 0x80, 0x89, 0x08, 0x8f, 0x85, 0x67, 0x13, - 0xdc, 0xf4, 0xe2, 0xcb, 0xea, 0xea, 0xe1, 0x84, 0x25, 0xb2, 0x75, 0x8e, 0x6c, 0x15, 0xae, 0xc4, - 0x91, 0x85, 0x94, 0x39, 0x06, 0xf0, 0x07, 0x05, 0x4c, 0x76, 0x53, 0x52, 0xa8, 0x27, 0xb8, 0x4d, - 0x60, 0xc2, 0xaa, 0x71, 0x68, 0x79, 0x89, 0xf4, 0x22, 0x47, 0x7a, 0x01, 0xae, 0xc7, 0x91, 0xee, - 0x87, 0x3a, 0x6d, 0xb0, 0x9d, 0x2c, 0xfb, 0x2e, 0xbc, 0xa7, 0x80, 0x8c, 0x24, 0x9f, 0x89, 0x57, - 0x1b, 0xe5, 0xb5, 0x89, 0x57, 0xdb, 0xc5, 0x61, 0xb5, 0x55, 0x0e, 0x6b, 0x01, 0x9e, 0x89, 0xc3, - 0x92, 0x64, 0x96, 0x76, 0xa4, 0xee, 0xa1, 0x02, 0x32, 0x92, 0x86, 0x26, 0x02, 0x89, 0x72, 0xde, - 0x44, 0x20, 0x5d, 0x6c, 0x56, 0x5b, 0xe3, 0x40, 0xce, 0xc2, 0xe5, 0x38, 0x10, 0x2a, 0x44, 0xdb, - 0x38, 0x8c, 0x3b, 0x7b, 0xf8, 0xe0, 0x2e, 0xbc, 0x0d, 0xd2, 0x8c, 0xad, 0x42, 0x2d, 0xb1, 0x64, - 0x5a, 0x14, 0x58, 0x3d, 0xdd, 0x57, 0x46, 0x62, 0x58, 0xe6, 0x18, 0x4e, 0xc3, 0x53, 0xbd, 0xaa, - 0xa9, 0x12, 0xc9, 0xc4, 0x67, 0x60, 0x54, 0x10, 0x36, 0x78, 0x26, 0xc1, 0x72, 0x84, 0x17, 0xaa, - 0xf3, 0x03, 0xa4, 0x24, 0x82, 0x39, 0x8e, 0x40, 0x85, 0xf9, 0x38, 0x02, 0x41, 0x06, 0x61, 0x13, - 0x64, 0x24, 0x17, 0x84, 0x73, 0x71, 0x9b, 0x51, 0x9a, 0xa8, 0x2e, 0x0e, 0x9a, 0x64, 0xa1, 0x5f, - 0x8d, 0xfb, 0x9d, 0x81, 0x6a, 0xdc, 0x2f, 0x0e, 0xaa, 0x25, 0x8b, 0xb9, 0xfb, 0x02, 0xe4, 0x3a, - 0xc8, 0xdc, 0x21, 0xbc, 0xf7, 0x88, 0xb9, 0x07, 0x1b, 0xd4, 0x16, 0xb8, 0xef, 0x39, 0x58, 0xe8, - 0xe1, 0x5b, 0x8a, 0xb3, 0x16, 0x09, 0x3f, 0x07, 0x19, 0x39, 0xe5, 0x13, 0x6b, 0x2f, 0x4a, 0x08, - 0x13, 0x6b, 0xaf, 0x8b, 0x2c, 0xf4, 0x8b, 0x5e, 0x8c, 0xf8, 0xa0, 0x09, 0xef, 0x2b, 0x00, 0xb4, - 0xc7, 0x0f, 0x5c, 0xea, 0x67, 0xba, 0x93, 0x5a, 0xa8, 0xcb, 0x87, 0x90, 0x94, 0x38, 0xe6, 0x39, - 0x8e, 0x22, 0x9c, 0x4d, 0xc2, 0xc1, 0x67, 0x22, 0x4b, 0x84, 0x1c, 0x61, 0x7d, 0xba, 0x41, 0xe7, - 0xe4, 0xeb, 0xd3, 0x0d, 0x22, 0x93, 0xb0, 0x5f, 0x22, 0xc2, 0x09, 0xc9, 0x2a, 0x5f, 0xf2, 0x97, - 0x33, 0x89, 0x6f, 0xaa, 0xe3, 0x6f, 0x41, 0x89, 0x95, 0x1f, 0xfd, 0xdb, 0x50, 0xbf, 0xca, 0x17, - 0x04, 0x0b, 0x7e, 0xa7, 0x80, 0x63, 0xb1, 0x59, 0x0a, 0x93, 0x1a, 0x71, 0xd2, 0x58, 0x56, 0xcf, - 0x1f, 0x5e, 0x41, 0x42, 0x5b, 0xe4, 0xd0, 0x4e, 0xc1, 0x62, 0x1c, 0x5a, 0x64, 0x7c, 0x6f, 0x5e, - 0x7c, 0xfa, 0xa2, 0xa0, 0x3c, 0x7b, 0x51, 0x50, 0x7e, 0x7b, 0x51, 0x50, 0x1e, 0xbd, 0x2c, 0x0c, - 0x3d, 0x7b, 0x59, 0x18, 0xfa, 0xf9, 0x65, 0x61, 0xe8, 0x93, 0xb9, 0x38, 0x81, 0x62, 0x46, 0x9a, - 0xcc, 0x0c, 0xa7, 0x4f, 0xe5, 0x51, 0x4e, 0xd7, 0xde, 0xf8, 0x3b, 0x00, 0x00, 0xff, 0xff, 0x36, - 0xbb, 0x12, 0xbc, 0x4c, 0x14, 0x00, 0x00, + // 1693 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x58, 0xcd, 0x6f, 0x13, 0xdb, + 0x15, 0xcf, 0xc4, 0x4e, 0xec, 0x5c, 0x27, 0x60, 0x2e, 0xa1, 0x38, 0xd3, 0xc4, 0x0e, 0x03, 0xf9, + 0x24, 0xcc, 0x90, 0x94, 0x56, 0x2a, 0x5d, 0xb4, 0x49, 0x14, 0x02, 0x05, 0x5a, 0x6a, 0xa2, 0x2e, + 0x2a, 0x55, 0xd6, 0xf5, 0xf8, 0x32, 0x1e, 0xc5, 0x33, 0x63, 0xe6, 0x5e, 0xbb, 0x0e, 0x94, 0x2e, + 0xaa, 0x16, 0x81, 0xd8, 0x50, 0x75, 0xdf, 0xb2, 0xec, 0xae, 0xdd, 0xf1, 0x2f, 0xb0, 0x44, 0xea, + 0xe6, 0xe9, 0x2d, 0x78, 0x4f, 0xe1, 0x49, 0xef, 0xfd, 0x0d, 0x6f, 0xf5, 0x74, 0x3f, 0xc6, 0x9e, + 0xc9, 0x78, 0x6c, 0xf3, 0x04, 0xbb, 0x27, 0x45, 0x70, 0x3f, 0xcf, 0xf9, 0x9d, 0x73, 0xcf, 0xc7, + 0x6f, 0x0c, 0xe6, 0x4d, 0x8f, 0x38, 0x1e, 0x31, 0x70, 0xdb, 0x31, 0xd8, 0xdf, 0xa6, 0xf1, 0xb0, + 0x85, 0xfd, 0x23, 0xbd, 0xe9, 0x7b, 0xd4, 0x83, 0x79, 0xb1, 0xab, 0xe3, 0xb6, 0xa3, 0xb3, 0xbf, + 0x4d, 0xf5, 0x0c, 0x72, 0x6c, 0xd7, 0x33, 0xf8, 0xbf, 0xe2, 0x90, 0xba, 0x2e, 0x45, 0x54, 0x11, + 0xc1, 0xe2, 0xb6, 0xd1, 0xde, 0xac, 0x62, 0x8a, 0x36, 0x8d, 0x26, 0xb2, 0x6c, 0x17, 0x51, 0xdb, + 0x73, 0xe5, 0xd9, 0x59, 0xcb, 0xb3, 0x3c, 0x3e, 0x34, 0xd8, 0x48, 0xae, 0xce, 0x5b, 0x9e, 0x67, + 0x35, 0xb0, 0x81, 0x9a, 0xb6, 0x81, 0x5c, 0xd7, 0xa3, 0xfc, 0x0a, 0x91, 0xbb, 0x25, 0xb9, 0xcb, + 0x67, 0xd5, 0xd6, 0x03, 0x83, 0xda, 0x0e, 0x26, 0x14, 0x39, 0x4d, 0x79, 0x40, 0x8d, 0xd9, 0xc0, + 0xf0, 0x8a, 0xbd, 0xb9, 0xd8, 0x1e, 0xed, 0x88, 0x2d, 0x6d, 0x16, 0xc0, 0xdf, 0x31, 0xb4, 0xbb, + 0x9e, 0xfb, 0xc0, 0xb6, 0xca, 0xf8, 0x61, 0x0b, 0x13, 0xaa, 0xdd, 0x01, 0x67, 0x23, 0xab, 0xa4, + 0xe9, 0xb9, 0x04, 0xc3, 0x9f, 0x82, 0x49, 0x93, 0xaf, 0x14, 0x94, 0x45, 0x65, 0x35, 0xb7, 0xb5, + 0xa0, 0x9f, 0x74, 0x8d, 0xbe, 0x5b, 0x47, 0xb6, 0x2b, 0xaf, 0xc9, 0xc3, 0xda, 0xcf, 0xa5, 0xb4, + 0x6d, 0xd3, 0xf4, 0x5a, 0x2e, 0x95, 0x4a, 0x60, 0x01, 0x64, 0x50, 0xad, 0xe6, 0x63, 0x42, 0xb8, + 0xb8, 0xa9, 0x72, 0x30, 0xbd, 0x9e, 0x7d, 0xf6, 0xaa, 0x34, 0xf6, 0xcd, 0xab, 0xd2, 0x98, 0x66, + 0x82, 0xd9, 0xe8, 0x55, 0x89, 0xa4, 0x00, 0x32, 0x55, 0xd4, 0x40, 0xae, 0x89, 0x83, 0xbb, 0x72, + 0x0a, 0x7f, 0x0c, 0xa6, 0x4c, 0xaf, 0x86, 0x2b, 0x75, 0x44, 0xea, 0x85, 0x71, 0xbe, 0x97, 0x65, + 0x0b, 0x37, 0x11, 0xa9, 0xc3, 0x59, 0x30, 0xe1, 0x7a, 0xec, 0x52, 0x6a, 0x51, 0x59, 0x4d, 0x97, + 0xc5, 0x44, 0xfb, 0x25, 0x98, 0x93, 0xd6, 0x32, 0x63, 0xbe, 0x07, 0xca, 0xa7, 0x0a, 0x50, 0xfb, + 0x49, 0x90, 0x60, 0x97, 0xc0, 0x29, 0xe1, 0xa7, 0x4a, 0x54, 0xd2, 0x8c, 0x58, 0xdd, 0x16, 0x8b, + 0x50, 0x05, 0x59, 0xc2, 0x94, 0x32, 0x7c, 0xe3, 0x1c, 0x5f, 0x77, 0xce, 0x44, 0x20, 0x21, 0xb5, + 0xe2, 0xb6, 0x9c, 0x2a, 0xf6, 0xa5, 0x05, 0x33, 0x72, 0xf5, 0x37, 0x7c, 0x51, 0xbb, 0x0d, 0xe6, + 0x39, 0x8e, 0xdf, 0xa3, 0x86, 0x5d, 0x43, 0xd4, 0xf3, 0x4f, 0x18, 0x73, 0x01, 0x4c, 0x9b, 0x9e, + 0x7b, 0x12, 0x47, 0x8e, 0xad, 0x6d, 0xc7, 0xac, 0x7a, 0xa1, 0x80, 0x85, 0x04, 0x69, 0xd2, 0xb0, + 0x15, 0x70, 0x3a, 0x40, 0x15, 0x95, 0x18, 0x80, 0xfd, 0x88, 0xa6, 0x05, 0x41, 0xb4, 0x23, 0xde, + 0xf9, 0x43, 0x9e, 0xe7, 0xaa, 0x0c, 0xa2, 0xee, 0xd5, 0x61, 0x41, 0xa4, 0xdd, 0x96, 0xca, 0xee, + 0x53, 0xcf, 0x47, 0xd6, 0x70, 0x65, 0x30, 0x0f, 0x52, 0x87, 0xf8, 0x48, 0xc6, 0x1b, 0x1b, 0x86, + 0xd4, 0x6f, 0x48, 0xf5, 0x5d, 0x61, 0x52, 0xfd, 0x2c, 0x98, 0x68, 0xa3, 0x46, 0x2b, 0x50, 0x2e, + 0x26, 0xda, 0xcf, 0x40, 0x5e, 0x86, 0x52, 0xed, 0x83, 0x8c, 0x5c, 0x01, 0x67, 0x42, 0xf7, 0xa4, + 0x0a, 0x08, 0xd2, 0x2c, 0xf6, 0xf9, 0xad, 0xe9, 0x32, 0x1f, 0x6b, 0x8f, 0x64, 0xc6, 0x1f, 0x74, + 0xee, 0x78, 0x16, 0x09, 0x54, 0x40, 0x90, 0xe6, 0x19, 0x23, 0xe4, 0xf3, 0x31, 0xbc, 0x01, 0x40, + 0xaf, 0x76, 0x71, 0xdb, 0x72, 0x5b, 0xcb, 0x41, 0xca, 0xb3, 0x42, 0xa7, 0x8b, 0x32, 0x29, 0x0b, + 0x9d, 0x7e, 0xaf, 0xe7, 0xaa, 0x72, 0xe8, 0x66, 0x08, 0xe4, 0x73, 0x45, 0x3a, 0x36, 0x50, 0x2e, + 0x71, 0xae, 0x81, 0x74, 0xc3, 0xb3, 0x98, 0x75, 0xa9, 0xd5, 0xdc, 0xd6, 0xb9, 0x78, 0x59, 0xb9, + 0xe3, 0x59, 0x65, 0x7e, 0x04, 0xee, 0xf7, 0x01, 0xb5, 0x32, 0x14, 0x94, 0xd0, 0x13, 0x46, 0xd5, + 0xad, 0x7c, 0xf7, 0x90, 0x8f, 0x9c, 0xc0, 0x0f, 0x5a, 0x59, 0x02, 0x0c, 0x56, 0x25, 0xc0, 0x5f, + 0x80, 0xc9, 0x26, 0x5f, 0x91, 0x95, 0xaf, 0x10, 0x87, 0x28, 0x6e, 0xec, 0x4c, 0xbd, 0x79, 0x57, + 0x1a, 0xfb, 0xcf, 0xd7, 0xff, 0x5b, 0x57, 0xca, 0xf2, 0x8a, 0xf6, 0x5a, 0x01, 0xa7, 0xf6, 0x68, + 0x7d, 0x17, 0x35, 0x1a, 0x21, 0x77, 0x23, 0xdf, 0x22, 0xc1, 0xc3, 0xb0, 0x31, 0x3c, 0x0f, 0x32, + 0x16, 0x22, 0x15, 0x13, 0x35, 0x65, 0x8e, 0x4c, 0x5a, 0x88, 0xec, 0xa2, 0x26, 0xfc, 0x23, 0xc8, + 0x37, 0x7d, 0xaf, 0xe9, 0x11, 0xec, 0x77, 0xf3, 0x8c, 0xe5, 0xc8, 0xf4, 0xce, 0xd6, 0xb7, 0xef, + 0x4a, 0xba, 0x65, 0xd3, 0x7a, 0xab, 0xaa, 0x9b, 0x9e, 0x63, 0xc8, 0x3a, 0x2f, 0xfe, 0xbb, 0x42, + 0x6a, 0x87, 0x06, 0x3d, 0x6a, 0x62, 0xa2, 0xef, 0xf6, 0x12, 0xbc, 0x7c, 0x3a, 0x90, 0x15, 0x24, + 0xe7, 0x1c, 0xc8, 0x9a, 0xac, 0x6a, 0x57, 0xec, 0x5a, 0x21, 0xbd, 0xa8, 0xac, 0xa6, 0xca, 0x19, + 0x3e, 0xbf, 0x55, 0xd3, 0x8e, 0x15, 0x00, 0x0f, 0x90, 0x79, 0xdf, 0x76, 0x5a, 0x0d, 0x44, 0xf1, + 0x20, 0xf4, 0x4b, 0xe0, 0x14, 0xa1, 0x88, 0xe2, 0x8a, 0xd7, 0xc6, 0xbe, 0x6f, 0xd7, 0x44, 0xa2, + 0x4f, 0x97, 0x67, 0xf8, 0xea, 0x6f, 0xe5, 0x62, 0xd8, 0xc8, 0xd4, 0x50, 0x23, 0xd3, 0x9f, 0xc6, + 0xc8, 0x89, 0xa8, 0x91, 0x07, 0xe0, 0xec, 0x1e, 0xa1, 0xb6, 0x83, 0x28, 0xde, 0x47, 0xbd, 0x27, + 0xcf, 0x83, 0x94, 0x85, 0x84, 0x8d, 0xe9, 0x32, 0x1b, 0xb2, 0x15, 0x1f, 0x53, 0x69, 0x17, 0x1b, + 0x32, 0xa9, 0x6d, 0xa7, 0x82, 0x7d, 0xdf, 0x13, 0x55, 0x6b, 0xaa, 0x9c, 0x69, 0x3b, 0x7b, 0x6c, + 0xaa, 0x3d, 0x4f, 0x07, 0xa1, 0xee, 0x23, 0x13, 0x1f, 0x74, 0x02, 0xdf, 0x6d, 0x82, 0x94, 0x43, + 0x82, 0x06, 0x5a, 0x8a, 0x87, 0xd1, 0x5d, 0x62, 0xed, 0xd1, 0x3a, 0xf6, 0x71, 0xcb, 0x39, 0xe8, + 0x94, 0xd9, 0x59, 0xf8, 0x2b, 0x30, 0x4d, 0x99, 0x90, 0x8a, 0x6c, 0xbe, 0xa9, 0xa4, 0xe6, 0xcb, + 0x55, 0xc9, 0xe6, 0x9b, 0xa3, 0xbd, 0x09, 0xdc, 0x05, 0xd3, 0x4d, 0x1f, 0xd7, 0xb0, 0x89, 0x09, + 0xf1, 0x7c, 0xe6, 0xd8, 0xd4, 0x28, 0xda, 0x23, 0x97, 0x58, 0xf3, 0xa8, 0x36, 0x3c, 0xf3, 0x30, + 0x28, 0xd3, 0xc2, 0x8d, 0x39, 0xbe, 0x26, 0x8a, 0x34, 0x5c, 0x00, 0x40, 0x1c, 0xe1, 0xb5, 0x64, + 0x92, 0x7b, 0x64, 0x8a, 0xaf, 0xf0, 0xf6, 0x7b, 0x33, 0xd8, 0x66, 0xe4, 0xa5, 0x90, 0xe1, 0x66, + 0xa8, 0xba, 0x60, 0x36, 0x7a, 0xc0, 0x6c, 0xf4, 0x83, 0x80, 0xd9, 0xec, 0xcc, 0xb0, 0x5c, 0x7a, + 0xf9, 0x45, 0x49, 0x11, 0xf9, 0x24, 0x24, 0xb1, 0xed, 0xbe, 0xd1, 0x92, 0xfd, 0x34, 0xd1, 0x32, + 0x15, 0x89, 0x16, 0xa8, 0x81, 0x19, 0x61, 0x83, 0x83, 0x3a, 0x15, 0x16, 0x20, 0x20, 0xe4, 0x86, + 0xbb, 0xa8, 0xb3, 0x8f, 0xc8, 0xaf, 0xd3, 0xd9, 0xf1, 0x7c, 0xaa, 0x9c, 0xa5, 0x9d, 0x8a, 0xed, + 0xd6, 0x70, 0x47, 0x5b, 0x97, 0x1d, 0xa0, 0x1b, 0x0a, 0xbd, 0xf2, 0x5c, 0x43, 0x14, 0x05, 0x79, + 0xc4, 0xc6, 0xda, 0xeb, 0x14, 0xf8, 0x51, 0xef, 0xf0, 0x0e, 0x93, 0x1a, 0x0a, 0x1d, 0xda, 0x09, + 0x8a, 0xe4, 0xf0, 0xd0, 0xa1, 0x1d, 0xf2, 0x11, 0x42, 0xe7, 0x87, 0x57, 0x1f, 0xf1, 0xd5, 0xb5, + 0x2b, 0xe0, 0x7c, 0xec, 0xe1, 0x06, 0x3c, 0xf4, 0xb9, 0x2e, 0xa1, 0x21, 0xf8, 0x06, 0xc6, 0x3d, + 0xea, 0x3d, 0x1b, 0x5d, 0x96, 0x22, 0xae, 0x81, 0x2c, 0xeb, 0x6e, 0x95, 0x07, 0x58, 0x12, 0x86, + 0x9d, 0xb9, 0xcf, 0xdf, 0x95, 0xce, 0x09, 0x0b, 0x49, 0xed, 0x50, 0xb7, 0x3d, 0xc3, 0x41, 0xb4, + 0xae, 0xdf, 0x72, 0x29, 0x23, 0x32, 0xfc, 0xb6, 0x56, 0x92, 0x14, 0x6e, 0xbf, 0xe1, 0x55, 0x51, + 0xe3, 0xae, 0xed, 0xee, 0x23, 0x72, 0xcf, 0xb7, 0xbb, 0xfc, 0x49, 0x33, 0x41, 0x31, 0xe9, 0x80, + 0x54, 0xbc, 0x0d, 0x66, 0x1c, 0xdb, 0x65, 0x46, 0x57, 0x9a, 0x6c, 0x43, 0x6a, 0x5f, 0x60, 0xaf, + 0x94, 0x8c, 0x20, 0xe7, 0xf4, 0x44, 0x6d, 0xfd, 0x23, 0x0f, 0x26, 0xb8, 0x16, 0xf8, 0x77, 0x05, + 0x64, 0x24, 0x8b, 0x84, 0x4b, 0xf1, 0x28, 0xec, 0xf3, 0x99, 0xa0, 0x2e, 0x0f, 0x3b, 0x26, 0x70, + 0x6a, 0x97, 0xff, 0xfa, 0xff, 0xaf, 0xfe, 0x39, 0xbe, 0x04, 0x2f, 0x1a, 0xb1, 0xaf, 0x1d, 0xc9, + 0x24, 0x8d, 0xc7, 0x32, 0x68, 0x9e, 0xc0, 0x7f, 0x29, 0x60, 0x26, 0x42, 0xd6, 0xe1, 0xe5, 0x04, + 0x35, 0xfd, 0x3e, 0x0a, 0xd4, 0x8d, 0xd1, 0x0e, 0x4b, 0x64, 0x5b, 0x1c, 0xd9, 0x06, 0x5c, 0x8f, + 0x23, 0x0b, 0xbe, 0x0b, 0x62, 0x00, 0xff, 0xab, 0x80, 0xfc, 0x49, 0xde, 0x0d, 0xf5, 0x04, 0xb5, + 0x09, 0x74, 0x5f, 0x35, 0x46, 0x3e, 0x2f, 0x91, 0x5e, 0xe7, 0x48, 0xaf, 0xc1, 0xad, 0x38, 0xd2, + 0x76, 0x70, 0xa7, 0x07, 0x36, 0xfc, 0x29, 0xf1, 0x04, 0x3e, 0x55, 0x40, 0x46, 0x32, 0xec, 0xc4, + 0xa7, 0x8d, 0x92, 0xf7, 0xc4, 0xa7, 0x3d, 0x41, 0xd4, 0xb5, 0x0d, 0x0e, 0x6b, 0x19, 0x5e, 0x8a, + 0xc3, 0x92, 0x8c, 0x9d, 0x84, 0x5c, 0xf7, 0x42, 0x01, 0x19, 0xc9, 0xb5, 0x13, 0x81, 0x44, 0x89, + 0x7d, 0x22, 0x90, 0x13, 0x94, 0x5d, 0xdb, 0xe4, 0x40, 0x2e, 0xc3, 0xb5, 0x38, 0x10, 0x22, 0x8e, + 0xf6, 0x70, 0x18, 0x8f, 0x0f, 0xf1, 0xd1, 0x13, 0xf8, 0x08, 0xa4, 0x19, 0x25, 0x87, 0x5a, 0x62, + 0xc8, 0x74, 0x79, 0xbe, 0x7a, 0x71, 0xe0, 0x19, 0x89, 0x61, 0x8d, 0x63, 0xb8, 0x08, 0x2f, 0xf4, + 0x8b, 0xa6, 0x5a, 0xc4, 0x13, 0x7f, 0x02, 0x93, 0x82, 0x95, 0xc2, 0x4b, 0x09, 0x92, 0x23, 0xe4, + 0x57, 0x5d, 0x1a, 0x72, 0x4a, 0x22, 0x58, 0xe4, 0x08, 0x54, 0x58, 0x88, 0x23, 0x10, 0x8c, 0x17, + 0x76, 0x40, 0x46, 0x12, 0x5e, 0xb8, 0x18, 0x97, 0x19, 0xe5, 0xc2, 0xea, 0xca, 0xb0, 0x4e, 0x16, + 0xe8, 0xd5, 0xb8, 0xde, 0x79, 0xa8, 0xc6, 0xf5, 0x62, 0x5a, 0xaf, 0x98, 0x4c, 0xdd, 0xdf, 0x14, + 0x90, 0x0b, 0x31, 0xd6, 0x7e, 0x86, 0xc7, 0x09, 0xed, 0xe8, 0x10, 0x96, 0x39, 0x84, 0x45, 0x58, + 0x8c, 0x43, 0xa0, 0xc8, 0xac, 0x90, 0x40, 0xed, 0x5f, 0x40, 0x2e, 0xc4, 0x29, 0x47, 0x70, 0x42, + 0x1f, 0xd7, 0xf7, 0x21, 0xa5, 0x83, 0xf4, 0x63, 0x79, 0x9c, 0x55, 0x6a, 0xf8, 0x67, 0x90, 0x91, + 0x64, 0x23, 0x31, 0x05, 0xa2, 0xbc, 0x34, 0x31, 0x05, 0x4e, 0x70, 0x96, 0x41, 0x8f, 0x20, 0x98, + 0x06, 0xed, 0xc0, 0x67, 0x0a, 0x00, 0xbd, 0x2e, 0x08, 0x57, 0x07, 0x89, 0x0e, 0x33, 0x1c, 0x75, + 0x6d, 0x84, 0x93, 0x12, 0xc7, 0x12, 0xc7, 0x51, 0x82, 0x0b, 0x49, 0x38, 0x78, 0x6b, 0x66, 0x8e, + 0x90, 0x9d, 0x74, 0x40, 0x51, 0x0a, 0x37, 0xe0, 0x01, 0x45, 0x29, 0xd2, 0x90, 0x07, 0x39, 0x22, + 0x68, 0xd4, 0x2c, 0x01, 0x25, 0x8d, 0xba, 0x94, 0x98, 0xda, 0xa1, 0xdf, 0xdd, 0x12, 0x13, 0x30, + 0xfa, 0x3b, 0xdc, 0xa0, 0x04, 0x14, 0x3c, 0x0f, 0xfe, 0x5b, 0x01, 0x67, 0x62, 0x2d, 0x1d, 0x26, + 0xf5, 0x83, 0x24, 0x76, 0xa0, 0x5e, 0x1d, 0xfd, 0x82, 0x84, 0xb6, 0xc2, 0xa1, 0x5d, 0x80, 0xa5, + 0x38, 0xb4, 0x08, 0x8b, 0xd8, 0xb9, 0xfe, 0xe6, 0xb8, 0xa8, 0xbc, 0x3d, 0x2e, 0x2a, 0x5f, 0x1e, + 0x17, 0x95, 0x97, 0xef, 0x8b, 0x63, 0x6f, 0xdf, 0x17, 0xc7, 0x3e, 0x7b, 0x5f, 0x1c, 0xfb, 0xc3, + 0x62, 0x9c, 0xc7, 0x31, 0x21, 0x1d, 0x26, 0x86, 0xb3, 0xb8, 0xea, 0x24, 0x67, 0x8d, 0x3f, 0xf9, + 0x2e, 0x00, 0x00, 0xff, 0xff, 0x4b, 0x5e, 0xae, 0x69, 0xb8, 0x15, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -1652,6 +1739,8 @@ type QueryClient interface { Params(ctx context.Context, in *QueryParamsRequest, opts ...grpc.CallOption) (*QueryParamsResponse, error) // EthCall implements the `eth_call` rpc api EthCall(ctx context.Context, in *EthCallRequest, opts ...grpc.CallOption) (*MsgEthereumTxResponse, error) + // TacSimulate implements the custom `eth_tacSimulate` rpc api which supports state override + TacSimulate(ctx context.Context, in *TacSimulateRequest, opts ...grpc.CallOption) (*MsgEthereumTxResponse, error) // EstimateGas implements the `eth_estimateGas` rpc api EstimateGas(ctx context.Context, in *EthCallRequest, opts ...grpc.CallOption) (*EstimateGasResponse, error) // TraceTx implements the `debug_traceTransaction` rpc api @@ -1752,6 +1841,15 @@ func (c *queryClient) EthCall(ctx context.Context, in *EthCallRequest, opts ...g return out, nil } +func (c *queryClient) TacSimulate(ctx context.Context, in *TacSimulateRequest, opts ...grpc.CallOption) (*MsgEthereumTxResponse, error) { + out := new(MsgEthereumTxResponse) + err := c.cc.Invoke(ctx, "/cosmos.evm.vm.v1.Query/TacSimulate", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *queryClient) EstimateGas(ctx context.Context, in *EthCallRequest, opts ...grpc.CallOption) (*EstimateGasResponse, error) { out := new(EstimateGasResponse) err := c.cc.Invoke(ctx, "/cosmos.evm.vm.v1.Query/EstimateGas", in, out, opts...) @@ -1826,6 +1924,8 @@ type QueryServer interface { Params(context.Context, *QueryParamsRequest) (*QueryParamsResponse, error) // EthCall implements the `eth_call` rpc api EthCall(context.Context, *EthCallRequest) (*MsgEthereumTxResponse, error) + // TacSimulate implements the custom `eth_tacSimulate` rpc api which supports state override + TacSimulate(context.Context, *TacSimulateRequest) (*MsgEthereumTxResponse, error) // EstimateGas implements the `eth_estimateGas` rpc api EstimateGas(context.Context, *EthCallRequest) (*EstimateGasResponse, error) // TraceTx implements the `debug_traceTransaction` rpc api @@ -1874,6 +1974,9 @@ func (*UnimplementedQueryServer) Params(ctx context.Context, req *QueryParamsReq func (*UnimplementedQueryServer) EthCall(ctx context.Context, req *EthCallRequest) (*MsgEthereumTxResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method EthCall not implemented") } +func (*UnimplementedQueryServer) TacSimulate(ctx context.Context, req *TacSimulateRequest) (*MsgEthereumTxResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method TacSimulate not implemented") +} func (*UnimplementedQueryServer) EstimateGas(ctx context.Context, req *EthCallRequest) (*EstimateGasResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method EstimateGas not implemented") } @@ -2041,6 +2144,24 @@ func _Query_EthCall_Handler(srv interface{}, ctx context.Context, dec func(inter return interceptor(ctx, in, info, handler) } +func _Query_TacSimulate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(TacSimulateRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).TacSimulate(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/cosmos.evm.vm.v1.Query/TacSimulate", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).TacSimulate(ctx, req.(*TacSimulateRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _Query_EstimateGas_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(EthCallRequest) if err := dec(in); err != nil { @@ -2185,6 +2306,10 @@ var _Query_serviceDesc = grpc.ServiceDesc{ MethodName: "EthCall", Handler: _Query_EthCall_Handler, }, + { + MethodName: "TacSimulate", + Handler: _Query_TacSimulate_Handler, + }, { MethodName: "EstimateGas", Handler: _Query_EstimateGas_Handler, @@ -2865,6 +2990,60 @@ func (m *EthCallRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *TacSimulateRequest) 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 *TacSimulateRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *TacSimulateRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.ChainId != 0 { + i = encodeVarintQuery(dAtA, i, uint64(m.ChainId)) + i-- + dAtA[i] = 0x28 + } + if len(m.ProposerAddress) > 0 { + i -= len(m.ProposerAddress) + copy(dAtA[i:], m.ProposerAddress) + i = encodeVarintQuery(dAtA, i, uint64(len(m.ProposerAddress))) + i-- + dAtA[i] = 0x22 + } + if m.GasCap != 0 { + i = encodeVarintQuery(dAtA, i, uint64(m.GasCap)) + i-- + dAtA[i] = 0x18 + } + if len(m.StateOverride) > 0 { + i -= len(m.StateOverride) + copy(dAtA[i:], m.StateOverride) + i = encodeVarintQuery(dAtA, i, uint64(len(m.StateOverride))) + i-- + dAtA[i] = 0x12 + } + if len(m.Args) > 0 { + i -= len(m.Args) + copy(dAtA[i:], m.Args) + i = encodeVarintQuery(dAtA, i, uint64(len(m.Args))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func (m *EstimateGasResponse) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -3556,6 +3735,33 @@ func (m *EthCallRequest) Size() (n int) { return n } +func (m *TacSimulateRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Args) + if l > 0 { + n += 1 + l + sovQuery(uint64(l)) + } + l = len(m.StateOverride) + if l > 0 { + n += 1 + l + sovQuery(uint64(l)) + } + if m.GasCap != 0 { + n += 1 + sovQuery(uint64(m.GasCap)) + } + l = len(m.ProposerAddress) + if l > 0 { + n += 1 + l + sovQuery(uint64(l)) + } + if m.ChainId != 0 { + n += 1 + sovQuery(uint64(m.ChainId)) + } + return n +} + func (m *EstimateGasResponse) Size() (n int) { if m == nil { return 0 @@ -5538,6 +5744,196 @@ func (m *EthCallRequest) Unmarshal(dAtA []byte) error { } return nil } +func (m *TacSimulateRequest) 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: TacSimulateRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: TacSimulateRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Args", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Args = append(m.Args[:0], dAtA[iNdEx:postIndex]...) + if m.Args == nil { + m.Args = []byte{} + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field StateOverride", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.StateOverride = append(m.StateOverride[:0], dAtA[iNdEx:postIndex]...) + if m.StateOverride == nil { + m.StateOverride = []byte{} + } + iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field GasCap", wireType) + } + m.GasCap = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.GasCap |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ProposerAddress", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ProposerAddress = append(m.ProposerAddress[:0], dAtA[iNdEx:postIndex]...) + if m.ProposerAddress == nil { + m.ProposerAddress = []byte{} + } + iNdEx = postIndex + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ChainId", wireType) + } + m.ChainId = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.ChainId |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + 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 *EstimateGasResponse) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/x/vm/types/query.pb.gw.go b/x/vm/types/query.pb.gw.go index 5e55ca809..0abc70748 100644 --- a/x/vm/types/query.pb.gw.go +++ b/x/vm/types/query.pb.gw.go @@ -433,6 +433,42 @@ func local_request_Query_EthCall_0(ctx context.Context, marshaler runtime.Marsha } +var ( + filter_Query_TacSimulate_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} +) + +func request_Query_TacSimulate_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq TacSimulateRequest + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_TacSimulate_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.TacSimulate(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Query_TacSimulate_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq TacSimulateRequest + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_TacSimulate_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.TacSimulate(ctx, &protoReq) + return msg, metadata, err + +} + var ( filter_Query_EstimateGas_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} ) @@ -785,6 +821,29 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv }) + mux.Handle("GET", pattern_Query_TacSimulate_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + 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_TacSimulate_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_TacSimulate_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("GET", pattern_Query_EstimateGas_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -1124,6 +1183,26 @@ func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie }) + mux.Handle("GET", pattern_Query_TacSimulate_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_TacSimulate_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_TacSimulate_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("GET", pattern_Query_EstimateGas_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -1264,6 +1343,8 @@ var ( pattern_Query_EthCall_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4}, []string{"cosmos", "evm", "vm", "v1", "eth_call"}, "", runtime.AssumeColonVerbOpt(false))) + pattern_Query_TacSimulate_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4}, []string{"cosmos", "evm", "vm", "v1", "tac_simulate"}, "", runtime.AssumeColonVerbOpt(false))) + pattern_Query_EstimateGas_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4}, []string{"cosmos", "evm", "vm", "v1", "estimate_gas"}, "", runtime.AssumeColonVerbOpt(false))) pattern_Query_TraceTx_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4}, []string{"cosmos", "evm", "vm", "v1", "trace_tx"}, "", runtime.AssumeColonVerbOpt(false))) @@ -1294,6 +1375,8 @@ var ( forward_Query_EthCall_0 = runtime.ForwardResponseMessage + forward_Query_TacSimulate_0 = runtime.ForwardResponseMessage + forward_Query_EstimateGas_0 = runtime.ForwardResponseMessage forward_Query_TraceTx_0 = runtime.ForwardResponseMessage From 13da91abca1070670054ed9e07206c84448bfb5b Mon Sep 17 00:00:00 2001 From: Aleksei Kokinos Date: Thu, 5 Feb 2026 22:55:15 +0700 Subject: [PATCH 04/19] added state override to stateDB and state transition to ApplyMessageWithConfig --- x/vm/keeper/state_transition.go | 14 +- x/vm/keeper/state_transition_test.go | 239 +++++++++++++++++++++++++++ x/vm/statedb/statedb.go | 66 ++++++++ x/vm/types/errors.go | 4 + x/vm/types/state_override.go | 10 +- 5 files changed, 326 insertions(+), 7 deletions(-) diff --git a/x/vm/keeper/state_transition.go b/x/vm/keeper/state_transition.go index b349c417e..9feb611b5 100644 --- a/x/vm/keeper/state_transition.go +++ b/x/vm/keeper/state_transition.go @@ -167,7 +167,7 @@ func (k *Keeper) ApplyTransaction(ctx sdk.Context, tx *ethtypes.Transaction) (*t tmpCtx, commit := ctx.CacheContext() // pass true to commit the StateDB - res, err := k.ApplyMessageWithConfig(tmpCtx, *msg, nil, true, cfg, txConfig) + res, err := k.ApplyMessageWithConfig(tmpCtx, *msg, nil, true, cfg, txConfig, nil) if err != nil { // when a transaction contains multiple msg, as long as one of the msg fails // all gas will be deducted. so is not msg.Gas() @@ -222,7 +222,7 @@ func (k *Keeper) ApplyMessage(ctx sdk.Context, msg evmcore.Message, tracer vm.EV } txConfig := statedb.NewEmptyTxConfig(common.BytesToHash(ctx.HeaderHash())) - return k.ApplyMessageWithConfig(ctx, msg, tracer, commit, cfg, txConfig) + return k.ApplyMessageWithConfig(ctx, msg, tracer, commit, cfg, txConfig, nil) } // ApplyMessageWithConfig computes the new state by applying the given message against the existing state. @@ -270,6 +270,7 @@ func (k *Keeper) ApplyMessageWithConfig( commit bool, cfg *statedb.EVMConfig, txConfig statedb.TxConfig, + stateOverride *types.StateOverride, ) (*types.MsgEthereumTxResponse, error) { var ( ret []byte // return bytes from evm execution @@ -312,6 +313,15 @@ func (k *Keeper) ApplyMessageWithConfig( rules := cfg.ChainConfig.Rules(big.NewInt(ctx.BlockHeight()), true, uint64(ctx.BlockTime().Unix())) stateDB.Prepare(rules, msg.From, common.Address{}, msg.To, evm.ActivePrecompiles(rules), msg.AccessList) + if stateOverride != nil { + if commit { + return nil, errorsmod.Wrap(types.ErrUnexpectedStateOverride, "state override is not nil") + } + if err := stateDB.ApplyStateOverride(stateOverride); err != nil { + return nil, errorsmod.Wrap(err, "failed to apply state override") + } + } + if contractCreation { // take over the nonce management from evm: // - reset sender's nonce to msg.Nonce() before calling evm. diff --git a/x/vm/keeper/state_transition_test.go b/x/vm/keeper/state_transition_test.go index ff5805298..37063f79e 100644 --- a/x/vm/keeper/state_transition_test.go +++ b/x/vm/keeper/state_transition_test.go @@ -6,6 +6,7 @@ import ( "math/big" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/core" gethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/params" @@ -747,6 +748,7 @@ func (suite *KeeperTestSuite) TestApplyMessageWithConfig() { true, config, txConfig, + nil, ) if tc.expErr { @@ -773,6 +775,243 @@ func (suite *KeeperTestSuite) TestApplyMessageWithConfig() { } } +func (suite *KeeperTestSuite) TestApplyMessageWithStateOverride() { + suite.SetupTest() + + sender := suite.keyring.GetKey(0) + recipient := suite.keyring.GetAddr(1) + + // Get proposer address and EVM config + proposerAddress := suite.network.GetContext().BlockHeader().ProposerAddress + config, err := suite.network.App.EVMKeeper.EVMConfig( + suite.network.GetContext(), + proposerAddress, + ) + suite.Require().NoError(err) + + testCases := []struct { + name string + stateOverride *types.StateOverride + commit bool + expErr bool + expErrMsg string + }{ + { + name: "success - nil state override", + stateOverride: nil, + commit: false, + expErr: false, + }, + { + name: "success - override balance", + stateOverride: &types.StateOverride{ + recipient: types.OverrideAccount{ + Balance: (*hexutil.Big)(big.NewInt(1e18)), + }, + }, + commit: false, + expErr: false, + }, + { + name: "success - override nonce", + stateOverride: &types.StateOverride{ + recipient: types.OverrideAccount{ + Nonce: func() *hexutil.Uint64 { n := hexutil.Uint64(100); return &n }(), + }, + }, + commit: false, + expErr: false, + }, + { + name: "success - override code (empty code does not affect simple transfer)", + stateOverride: &types.StateOverride{ + recipient: types.OverrideAccount{ + // Setting empty code on recipient - simple transfer should still work + Code: func() *hexutil.Bytes { b := hexutil.Bytes([]byte{}); return &b }(), + }, + }, + commit: false, + expErr: false, + }, + { + name: "success - override state diff", + stateOverride: &types.StateOverride{ + recipient: types.OverrideAccount{ + StateDiff: map[common.Hash]common.Hash{ + common.HexToHash("0x01"): common.HexToHash("0x02"), + }, + }, + }, + commit: false, + expErr: false, + }, + { + name: "fail - state override with commit=true", + stateOverride: &types.StateOverride{ + recipient: types.OverrideAccount{ + Balance: (*hexutil.Big)(big.NewInt(1e18)), + }, + }, + commit: true, + expErr: true, + expErrMsg: "state override is not nil", + }, + { + name: "fail - both state and stateDiff provided", + stateOverride: &types.StateOverride{ + recipient: types.OverrideAccount{ + State: map[common.Hash]common.Hash{ + common.HexToHash("0x01"): common.HexToHash("0x02"), + }, + StateDiff: map[common.Hash]common.Hash{ + common.HexToHash("0x03"): common.HexToHash("0x04"), + }, + }, + }, + commit: false, + expErr: true, + expErrMsg: "has both 'state' and 'stateDiff'", + }, + } + + for _, tc := range testCases { + suite.Run(tc.name, func() { + // Generate a transfer message + msg, err := suite.factory.GenerateGethCoreMsg(sender.Priv, types.EvmTxArgs{ + To: &recipient, + Amount: big.NewInt(100), + }) + suite.Require().NoError(err) + + txConfig := suite.network.App.EVMKeeper.TxConfig( + suite.network.GetContext(), + common.Hash{}, + ) + + // Function being tested + res, err := suite.network.App.EVMKeeper.ApplyMessageWithConfig( + suite.network.GetContext(), + *msg, + nil, + tc.commit, + config, + txConfig, + tc.stateOverride, + ) + + if tc.expErr { + suite.Require().Error(err) + suite.Require().Contains(err.Error(), tc.expErrMsg) + } else { + suite.Require().NoError(err) + suite.Require().NotNil(res) + suite.Require().False(res.Failed()) + } + }) + } +} + +// TestStateOverrideBalanceCheck tests that StateOverride actually changes the balance +// by calling a contract that checks the balance of an address +func (suite *KeeperTestSuite) TestStateOverrideBalanceCheck() { + suite.SetupTest() + + sender := suite.keyring.GetKey(0) + senderAddr := suite.keyring.GetAddr(0) + + // Address to check balance + targetAddr := common.HexToAddress("0x1234567890123456789012345678901234567890") + + // Contract bytecode that returns balance of msg.sender: + // SELFBALANCE opcode returns the balance of the current contract + // We'll use BALANCE opcode to get balance of a specific address + // + // Bytecode explanation: + // PUSH20
- push target address + // BALANCE - get balance of that address + // PUSH1 0x00 - push memory offset + // MSTORE - store balance in memory + // PUSH1 0x20 - push return size (32 bytes) + // PUSH1 0x00 - push return offset + // RETURN - return the balance + // + // 73 <20 bytes address> 31 60 00 52 60 20 60 00 f3 + balanceCheckerCode := append( + []byte{0x73}, // PUSH20 + append( + targetAddr.Bytes(), + []byte{ + 0x31, // BALANCE + 0x60, 0x00, // PUSH1 0x00 + 0x52, // MSTORE + 0x60, 0x20, // PUSH1 0x20 + 0x60, 0x00, // PUSH1 0x00 + 0xf3, // RETURN + }..., + )..., + ) + + // Deploy a simple contract that will check balance + contractAddr := common.HexToAddress("0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef") + + // Get proposer address and EVM config + proposerAddress := suite.network.GetContext().BlockHeader().ProposerAddress + config, err := suite.network.App.EVMKeeper.EVMConfig( + suite.network.GetContext(), + proposerAddress, + ) + suite.Require().NoError(err) + + // Test 1: Without state override - balance should be 0 + txConfig := suite.network.App.EVMKeeper.TxConfig( + suite.network.GetContext(), + common.Hash{}, + ) + + msg, err := suite.factory.GenerateGethCoreMsg(sender.Priv, types.EvmTxArgs{ + To: &contractAddr, + Input: []byte{}, // just call the contract + GasLimit: 100000, // enough gas for the call + }) + suite.Require().NoError(err) + + // State override: set code for contractAddr and balance for targetAddr + overriddenBalance := big.NewInt(123456789) + stateOverride := &types.StateOverride{ + contractAddr: types.OverrideAccount{ + Code: func() *hexutil.Bytes { b := hexutil.Bytes(balanceCheckerCode); return &b }(), + }, + targetAddr: types.OverrideAccount{ + Balance: (*hexutil.Big)(overriddenBalance), + }, + } + + res, err := suite.network.App.EVMKeeper.ApplyMessageWithConfig( + suite.network.GetContext(), + *msg, + nil, + false, // don't commit + config, + txConfig, + stateOverride, + ) + suite.Require().NoError(err) + suite.Require().NotNil(res) + suite.Require().False(res.Failed(), "VM error: %s", res.VmError) + + // The result should contain the overridden balance + returnedBalance := new(big.Int).SetBytes(res.Ret) + suite.Require().Equal(overriddenBalance.String(), returnedBalance.String(), + "StateOverride should have changed the balance visible to the contract") + + // Test 2: Verify original state is unchanged (targetAddr should have 0 balance) + originalBalance := suite.network.App.EVMKeeper.GetBalance(suite.network.GetContext(), targetAddr) + suite.Require().Equal(big.NewInt(0).String(), originalBalance.String(), + "Original state should not be modified") + + _ = senderAddr // suppress unused variable warning +} + func (suite *KeeperTestSuite) TestGetProposerAddress() { suite.SetupTest() address := sdk.ConsAddress(suite.keyring.GetAddr(0).Bytes()) diff --git a/x/vm/statedb/statedb.go b/x/vm/statedb/statedb.go index ad4961fcd..3c6ec2b3f 100644 --- a/x/vm/statedb/statedb.go +++ b/x/vm/statedb/statedb.go @@ -3,6 +3,7 @@ package statedb import ( "errors" "fmt" + "math/big" "sort" "github.com/ethereum/go-ethereum/common" @@ -615,3 +616,68 @@ func (s *StateDB) commitWithCtx(ctx sdk.Context) error { } return nil } + +func (s *StateDB) SetBalance(addr common.Address, amount *uint256.Int) { + stateObject := s.getOrNewStateObject(addr) + if stateObject != nil { + stateObject.SetBalance(amount) + } +} + +// SetStorage replaces the entire storage for the specified account with given +// storage. This function should only be used for debugging and the mutations +// must be discarded afterwards. +func (s *StateDB) SetStorage(addr common.Address, storage map[common.Hash]common.Hash) { + newObj, prev := s.createObject(addr) + for k, v := range storage { + newObj.SetState(k, v) + } + // Inherit the metadata of original object if it was existent + if prev != nil { + newObj.SetCode(common.BytesToHash(prev.CodeHash()), prev.code) + newObj.SetNonce(prev.Nonce()) + newObj.SetBalance(prev.Balance()) + } +} + +// Apply overrides the fields of specified accounts into the given state. +func (statedb *StateDB) ApplyStateOverride(diff *types.StateOverride) error { + if diff == nil { + return nil + } + // Tracks destinations of precompiles that were moved. + dirtyAddrs := make(map[common.Address]struct{}) + for addr, account := range *diff { + // If a precompile was moved to this address already, it can't be overridden. + if _, ok := dirtyAddrs[addr]; ok { + return fmt.Errorf("account %s has already been overridden by a precompile", addr.Hex()) + } + // Override account nonce. + if account.Nonce != nil { + statedb.SetNonce(addr, uint64(*account.Nonce)) + } + // Override account(contract) code. + if account.Code != nil { + statedb.SetCode(addr, *account.Code) + } + // Override account balance. + if account.Balance != nil { + u256Balance, _ := uint256.FromBig((*big.Int)(account.Balance)) + statedb.SetBalance(addr, u256Balance) + } + if account.State != nil && account.StateDiff != nil { + return fmt.Errorf("account %s has both 'state' and 'stateDiff'", addr.Hex()) + } + // Replace entire state if caller requires. + if account.State != nil { + statedb.SetStorage(addr, account.State) + } + // Apply state diff into specified accounts. + if account.StateDiff != nil { + for key, value := range account.StateDiff { + statedb.SetState(addr, key, value) + } + } + } + return nil +} diff --git a/x/vm/types/errors.go b/x/vm/types/errors.go index 40942908c..30415849a 100644 --- a/x/vm/types/errors.go +++ b/x/vm/types/errors.go @@ -30,6 +30,7 @@ const ( codeErrInactivePrecompile codeErrABIPack codeErrABIUnpack + codeErrUnexpectedStateOverride ) var ( @@ -86,6 +87,9 @@ var ( // ErrABIUnpack returns an error if the contract ABI unpacking fails ErrABIUnpack = errorsmod.Register(ModuleName, codeErrABIUnpack, "contract ABI unpack failed") + + // ErrUnexpectedStateOverride returns an error if the state override is not nil when commit is true + ErrUnexpectedStateOverride = errorsmod.Register(ModuleName, codeErrUnexpectedStateOverride, "state override is not allowed when commit is true") ) // NewExecErrorWithReason unpacks the revert return bytes and returns a wrapped error diff --git a/x/vm/types/state_override.go b/x/vm/types/state_override.go index 92fcc715a..8e6786dee 100644 --- a/x/vm/types/state_override.go +++ b/x/vm/types/state_override.go @@ -15,9 +15,9 @@ type StateOverride map[common.Address]OverrideAccount // if statDiff is set, all diff will be applied first and then execute the call // message. type OverrideAccount struct { - Nonce *hexutil.Uint64 `json:"nonce"` - Code *hexutil.Bytes `json:"code"` - Balance **hexutil.Big `json:"balance"` - State *map[common.Hash]common.Hash `json:"state"` - StateDiff *map[common.Hash]common.Hash `json:"stateDiff"` + Nonce *hexutil.Uint64 `json:"nonce"` + Code *hexutil.Bytes `json:"code"` + Balance *hexutil.Big `json:"balance"` + State map[common.Hash]common.Hash `json:"state"` + StateDiff map[common.Hash]common.Hash `json:"stateDiff"` } From c205d2843600ffc6bdb2c3223119bad87fa41200 Mon Sep 17 00:00:00 2001 From: Aleksei Kokinos Date: Thu, 5 Feb 2026 22:58:33 +0700 Subject: [PATCH 05/19] finish grpc query server --- rpc/backend/mocks/evm_query_client.go | 129 +++++++++++++++++--------- x/vm/keeper/grpc_query.go | 48 +++++++++- 2 files changed, 130 insertions(+), 47 deletions(-) diff --git a/rpc/backend/mocks/evm_query_client.go b/rpc/backend/mocks/evm_query_client.go index 0c7f3049e..82a6cf9f9 100644 --- a/rpc/backend/mocks/evm_query_client.go +++ b/rpc/backend/mocks/evm_query_client.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.43.2. DO NOT EDIT. +// Code generated by mockery v2.53.5. DO NOT EDIT. package mocks @@ -12,7 +12,7 @@ import ( types "github.com/cosmos/evm/x/vm/types" ) -// EVMQueryClient is an autogenerated mock type for the EVMQueryClient type +// EVMQueryClient is an autogenerated mock type for the QueryClient type type EVMQueryClient struct { mock.Mock } @@ -165,8 +165,8 @@ func (_m *EVMQueryClient) Code(ctx context.Context, in *types.QueryCodeRequest, return r0, r1 } -// CosmosAccount provides a mock function with given fields: ctx, in, opts -func (_m *EVMQueryClient) CosmosAccount(ctx context.Context, in *types.QueryCosmosAccountRequest, opts ...grpc.CallOption) (*types.QueryCosmosAccountResponse, error) { +// Config provides a mock function with given fields: ctx, in, opts +func (_m *EVMQueryClient) Config(ctx context.Context, in *types.QueryConfigRequest, opts ...grpc.CallOption) (*types.QueryConfigResponse, error) { _va := make([]interface{}, len(opts)) for _i := range opts { _va[_i] = opts[_i] @@ -177,23 +177,23 @@ func (_m *EVMQueryClient) CosmosAccount(ctx context.Context, in *types.QueryCosm ret := _m.Called(_ca...) if len(ret) == 0 { - panic("no return value specified for CosmosAccount") + panic("no return value specified for Config") } - var r0 *types.QueryCosmosAccountResponse + var r0 *types.QueryConfigResponse var r1 error - if rf, ok := ret.Get(0).(func(context.Context, *types.QueryCosmosAccountRequest, ...grpc.CallOption) (*types.QueryCosmosAccountResponse, error)); ok { + if rf, ok := ret.Get(0).(func(context.Context, *types.QueryConfigRequest, ...grpc.CallOption) (*types.QueryConfigResponse, error)); ok { return rf(ctx, in, opts...) } - if rf, ok := ret.Get(0).(func(context.Context, *types.QueryCosmosAccountRequest, ...grpc.CallOption) *types.QueryCosmosAccountResponse); ok { + if rf, ok := ret.Get(0).(func(context.Context, *types.QueryConfigRequest, ...grpc.CallOption) *types.QueryConfigResponse); ok { r0 = rf(ctx, in, opts...) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).(*types.QueryCosmosAccountResponse) + r0 = ret.Get(0).(*types.QueryConfigResponse) } } - if rf, ok := ret.Get(1).(func(context.Context, *types.QueryCosmosAccountRequest, ...grpc.CallOption) error); ok { + if rf, ok := ret.Get(1).(func(context.Context, *types.QueryConfigRequest, ...grpc.CallOption) error); ok { r1 = rf(ctx, in, opts...) } else { r1 = ret.Error(1) @@ -202,8 +202,8 @@ func (_m *EVMQueryClient) CosmosAccount(ctx context.Context, in *types.QueryCosm return r0, r1 } -// EstimateGas provides a mock function with given fields: ctx, in, opts -func (_m *EVMQueryClient) EstimateGas(ctx context.Context, in *types.EthCallRequest, opts ...grpc.CallOption) (*types.EstimateGasResponse, error) { +// CosmosAccount provides a mock function with given fields: ctx, in, opts +func (_m *EVMQueryClient) CosmosAccount(ctx context.Context, in *types.QueryCosmosAccountRequest, opts ...grpc.CallOption) (*types.QueryCosmosAccountResponse, error) { _va := make([]interface{}, len(opts)) for _i := range opts { _va[_i] = opts[_i] @@ -214,23 +214,23 @@ func (_m *EVMQueryClient) EstimateGas(ctx context.Context, in *types.EthCallRequ ret := _m.Called(_ca...) if len(ret) == 0 { - panic("no return value specified for EstimateGas") + panic("no return value specified for CosmosAccount") } - var r0 *types.EstimateGasResponse + var r0 *types.QueryCosmosAccountResponse var r1 error - if rf, ok := ret.Get(0).(func(context.Context, *types.EthCallRequest, ...grpc.CallOption) (*types.EstimateGasResponse, error)); ok { + if rf, ok := ret.Get(0).(func(context.Context, *types.QueryCosmosAccountRequest, ...grpc.CallOption) (*types.QueryCosmosAccountResponse, error)); ok { return rf(ctx, in, opts...) } - if rf, ok := ret.Get(0).(func(context.Context, *types.EthCallRequest, ...grpc.CallOption) *types.EstimateGasResponse); ok { + if rf, ok := ret.Get(0).(func(context.Context, *types.QueryCosmosAccountRequest, ...grpc.CallOption) *types.QueryCosmosAccountResponse); ok { r0 = rf(ctx, in, opts...) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).(*types.EstimateGasResponse) + r0 = ret.Get(0).(*types.QueryCosmosAccountResponse) } } - if rf, ok := ret.Get(1).(func(context.Context, *types.EthCallRequest, ...grpc.CallOption) error); ok { + if rf, ok := ret.Get(1).(func(context.Context, *types.QueryCosmosAccountRequest, ...grpc.CallOption) error); ok { r1 = rf(ctx, in, opts...) } else { r1 = ret.Error(1) @@ -239,8 +239,8 @@ func (_m *EVMQueryClient) EstimateGas(ctx context.Context, in *types.EthCallRequ return r0, r1 } -// GlobalMinGasPrice provides a mock function with given fields: ctx, in, opts -func (_m *EVMQueryClient) GlobalMinGasPrice(ctx context.Context, in *types.QueryGlobalMinGasPriceRequest, opts ...grpc.CallOption) (*types.QueryGlobalMinGasPriceResponse, error) { +// EstimateGas provides a mock function with given fields: ctx, in, opts +func (_m *EVMQueryClient) EstimateGas(ctx context.Context, in *types.EthCallRequest, opts ...grpc.CallOption) (*types.EstimateGasResponse, error) { _va := make([]interface{}, len(opts)) for _i := range opts { _va[_i] = opts[_i] @@ -250,17 +250,24 @@ func (_m *EVMQueryClient) GlobalMinGasPrice(ctx context.Context, in *types.Query _ca = append(_ca, _va...) ret := _m.Called(_ca...) - var r0 *types.QueryGlobalMinGasPriceResponse - if rf, ok := ret.Get(0).(func(context.Context, *types.QueryGlobalMinGasPriceRequest, ...grpc.CallOption) *types.QueryGlobalMinGasPriceResponse); ok { + if len(ret) == 0 { + panic("no return value specified for EstimateGas") + } + + var r0 *types.EstimateGasResponse + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *types.EthCallRequest, ...grpc.CallOption) (*types.EstimateGasResponse, error)); ok { + return rf(ctx, in, opts...) + } + if rf, ok := ret.Get(0).(func(context.Context, *types.EthCallRequest, ...grpc.CallOption) *types.EstimateGasResponse); ok { r0 = rf(ctx, in, opts...) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).(*types.QueryGlobalMinGasPriceResponse) + r0 = ret.Get(0).(*types.EstimateGasResponse) } } - var r1 error - if rf, ok := ret.Get(1).(func(context.Context, *types.QueryGlobalMinGasPriceRequest, ...grpc.CallOption) error); ok { + if rf, ok := ret.Get(1).(func(context.Context, *types.EthCallRequest, ...grpc.CallOption) error); ok { r1 = rf(ctx, in, opts...) } else { r1 = ret.Error(1) @@ -269,8 +276,8 @@ func (_m *EVMQueryClient) GlobalMinGasPrice(ctx context.Context, in *types.Query return r0, r1 } -// Config provides a mock function with given fields: ctx, in, opts -func (_m *EVMQueryClient) Config(ctx context.Context, in *types.QueryConfigRequest, opts ...grpc.CallOption) (*types.QueryConfigResponse, error) { +// EthCall provides a mock function with given fields: ctx, in, opts +func (_m *EVMQueryClient) EthCall(ctx context.Context, in *types.EthCallRequest, opts ...grpc.CallOption) (*types.MsgEthereumTxResponse, error) { _va := make([]interface{}, len(opts)) for _i := range opts { _va[_i] = opts[_i] @@ -281,23 +288,23 @@ func (_m *EVMQueryClient) Config(ctx context.Context, in *types.QueryConfigReque ret := _m.Called(_ca...) if len(ret) == 0 { - panic("no return value specified for Config") + panic("no return value specified for EthCall") } - var r0 *types.QueryConfigResponse + var r0 *types.MsgEthereumTxResponse var r1 error - if rf, ok := ret.Get(0).(func(context.Context, *types.QueryConfigRequest, ...grpc.CallOption) (*types.QueryConfigResponse, error)); ok { + if rf, ok := ret.Get(0).(func(context.Context, *types.EthCallRequest, ...grpc.CallOption) (*types.MsgEthereumTxResponse, error)); ok { return rf(ctx, in, opts...) } - if rf, ok := ret.Get(0).(func(context.Context, *types.QueryConfigRequest, ...grpc.CallOption) *types.QueryConfigResponse); ok { + if rf, ok := ret.Get(0).(func(context.Context, *types.EthCallRequest, ...grpc.CallOption) *types.MsgEthereumTxResponse); ok { r0 = rf(ctx, in, opts...) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).(*types.QueryConfigResponse) + r0 = ret.Get(0).(*types.MsgEthereumTxResponse) } } - if rf, ok := ret.Get(1).(func(context.Context, *types.QueryConfigRequest, ...grpc.CallOption) error); ok { + if rf, ok := ret.Get(1).(func(context.Context, *types.EthCallRequest, ...grpc.CallOption) error); ok { r1 = rf(ctx, in, opts...) } else { r1 = ret.Error(1) @@ -306,8 +313,8 @@ func (_m *EVMQueryClient) Config(ctx context.Context, in *types.QueryConfigReque return r0, r1 } -// EthCall provides a mock function with given fields: ctx, in, opts -func (_m *EVMQueryClient) EthCall(ctx context.Context, in *types.EthCallRequest, opts ...grpc.CallOption) (*types.MsgEthereumTxResponse, error) { +// GlobalMinGasPrice provides a mock function with given fields: ctx, in, opts +func (_m *EVMQueryClient) GlobalMinGasPrice(ctx context.Context, in *types.QueryGlobalMinGasPriceRequest, opts ...grpc.CallOption) (*types.QueryGlobalMinGasPriceResponse, error) { _va := make([]interface{}, len(opts)) for _i := range opts { _va[_i] = opts[_i] @@ -318,23 +325,23 @@ func (_m *EVMQueryClient) EthCall(ctx context.Context, in *types.EthCallRequest, ret := _m.Called(_ca...) if len(ret) == 0 { - panic("no return value specified for EthCall") + panic("no return value specified for GlobalMinGasPrice") } - var r0 *types.MsgEthereumTxResponse + var r0 *types.QueryGlobalMinGasPriceResponse var r1 error - if rf, ok := ret.Get(0).(func(context.Context, *types.EthCallRequest, ...grpc.CallOption) (*types.MsgEthereumTxResponse, error)); ok { + if rf, ok := ret.Get(0).(func(context.Context, *types.QueryGlobalMinGasPriceRequest, ...grpc.CallOption) (*types.QueryGlobalMinGasPriceResponse, error)); ok { return rf(ctx, in, opts...) } - if rf, ok := ret.Get(0).(func(context.Context, *types.EthCallRequest, ...grpc.CallOption) *types.MsgEthereumTxResponse); ok { + if rf, ok := ret.Get(0).(func(context.Context, *types.QueryGlobalMinGasPriceRequest, ...grpc.CallOption) *types.QueryGlobalMinGasPriceResponse); ok { r0 = rf(ctx, in, opts...) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).(*types.MsgEthereumTxResponse) + r0 = ret.Get(0).(*types.QueryGlobalMinGasPriceResponse) } } - if rf, ok := ret.Get(1).(func(context.Context, *types.EthCallRequest, ...grpc.CallOption) error); ok { + if rf, ok := ret.Get(1).(func(context.Context, *types.QueryGlobalMinGasPriceRequest, ...grpc.CallOption) error); ok { r1 = rf(ctx, in, opts...) } else { r1 = ret.Error(1) @@ -417,6 +424,43 @@ func (_m *EVMQueryClient) Storage(ctx context.Context, in *types.QueryStorageReq return r0, r1 } +// TacSimulate provides a mock function with given fields: ctx, in, opts +func (_m *EVMQueryClient) TacSimulate(ctx context.Context, in *types.TacSimulateRequest, opts ...grpc.CallOption) (*types.MsgEthereumTxResponse, error) { + _va := make([]interface{}, len(opts)) + for _i := range opts { + _va[_i] = opts[_i] + } + var _ca []interface{} + _ca = append(_ca, ctx, in) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + if len(ret) == 0 { + panic("no return value specified for TacSimulate") + } + + var r0 *types.MsgEthereumTxResponse + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *types.TacSimulateRequest, ...grpc.CallOption) (*types.MsgEthereumTxResponse, error)); ok { + return rf(ctx, in, opts...) + } + if rf, ok := ret.Get(0).(func(context.Context, *types.TacSimulateRequest, ...grpc.CallOption) *types.MsgEthereumTxResponse); ok { + r0 = rf(ctx, in, opts...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.MsgEthereumTxResponse) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *types.TacSimulateRequest, ...grpc.CallOption) error); ok { + r1 = rf(ctx, in, opts...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + // TraceBlock provides a mock function with given fields: ctx, in, opts func (_m *EVMQueryClient) TraceBlock(ctx context.Context, in *types.QueryTraceBlockRequest, opts ...grpc.CallOption) (*types.QueryTraceBlockResponse, error) { _va := make([]interface{}, len(opts)) @@ -533,8 +577,7 @@ func (_m *EVMQueryClient) ValidatorAccount(ctx context.Context, in *types.QueryV func NewEVMQueryClient(t interface { mock.TestingT Cleanup(func()) -}, -) *EVMQueryClient { +}) *EVMQueryClient { mock := &EVMQueryClient{} mock.Mock.Test(t) diff --git a/x/vm/keeper/grpc_query.go b/x/vm/keeper/grpc_query.go index ba724d490..f8629ad0d 100644 --- a/x/vm/keeper/grpc_query.go +++ b/x/vm/keeper/grpc_query.go @@ -248,7 +248,7 @@ func (k Keeper) EthCall(c context.Context, req *types.EthCallRequest) (*types.Ms txConfig := statedb.NewEmptyTxConfig(common.BytesToHash(ctx.HeaderHash())) // pass false to not commit StateDB - res, err := k.ApplyMessageWithConfig(ctx, msg, nil, false, cfg, txConfig) + res, err := k.ApplyMessageWithConfig(ctx, msg, nil, false, cfg, txConfig, nil) if err != nil { return nil, status.Error(codes.Internal, err.Error()) } @@ -257,6 +257,46 @@ func (k Keeper) EthCall(c context.Context, req *types.EthCallRequest) (*types.Ms } func (k Keeper) TacSimulate(c context.Context, req *types.TacSimulateRequest) (*types.MsgEthereumTxResponse, error) { + if req == nil { + return nil, status.Error(codes.InvalidArgument, "empty request") + } + + ctx := sdk.UnwrapSDKContext(c) + + var args types.TransactionArgs + err := json.Unmarshal(req.Args, &args) + if err != nil { + return nil, status.Error(codes.InvalidArgument, err.Error()) + } + + var stateOverridePtr *types.StateOverride + if req.StateOverride != nil { + var stateOverride types.StateOverride + err = json.Unmarshal(req.StateOverride, &stateOverride) + if err != nil { + return nil, status.Error(codes.InvalidArgument, err.Error()) + } + stateOverridePtr = &stateOverride + } + + cfg, err := k.EVMConfig(ctx, GetProposerAddress(ctx, req.ProposerAddress)) + if err != nil { + return nil, status.Error(codes.Internal, err.Error()) + } + + // ApplyMessageWithConfig expect correct nonce set in msg + nonce := k.GetNonce(ctx, args.GetFrom()) + args.Nonce = (*hexutil.Uint64)(&nonce) + + msg, err := args.ToMessage(req.GasCap, cfg.BaseFee) + if err != nil { + return nil, status.Error(codes.InvalidArgument, err.Error()) + } + + txConfig := statedb.NewEmptyTxConfig(common.BytesToHash(ctx.HeaderHash())) + + // pass false to not commit StateDB + return k.ApplyMessageWithConfig(ctx, msg, nil, false, cfg, txConfig, stateOverridePtr) } @@ -403,7 +443,7 @@ func (k Keeper) EstimateGasInternal(c context.Context, req *types.EthCallRequest tmpCtx = evmante.BuildEvmExecutionCtx(tmpCtx).WithGasMeter(gasMeter) } // pass false to not commit StateDB - rsp, err = k.ApplyMessageWithConfig(tmpCtx, msg, nil, false, cfg, txConfig) + rsp, err = k.ApplyMessageWithConfig(tmpCtx, msg, nil, false, cfg, txConfig, nil) if err != nil { if errors.Is(err, core.ErrIntrinsicGas) { return true, nil, nil // Special case, raise gas limit @@ -502,7 +542,7 @@ func (k Keeper) TraceTx(c context.Context, req *types.QueryTraceTxRequest) (*typ // reset gas meter for each transaction ctx = evmante.BuildEvmExecutionCtx(ctx). WithGasMeter(cosmosevmtypes.NewInfiniteGasMeterWithLimit(msg.GasLimit)) - rsp, err := k.ApplyMessageWithConfig(ctx, *msg, nil, true, cfg, txConfig) + rsp, err := k.ApplyMessageWithConfig(ctx, *msg, nil, true, cfg, txConfig, nil) if err != nil { continue } @@ -684,7 +724,7 @@ func (k *Keeper) traceTx( // Build EVM execution context ctx = evmante.BuildEvmExecutionCtx(ctx). WithGasMeter(cosmosevmtypes.NewInfiniteGasMeterWithLimit(msg.GasLimit)) - res, err := k.ApplyMessageWithConfig(ctx, *msg, tracer, commitMessage, cfg, txConfig) + res, err := k.ApplyMessageWithConfig(ctx, *msg, tracer, commitMessage, cfg, txConfig, nil) if err != nil { return nil, 0, status.Error(codes.Internal, err.Error()) } From 048d4b6f466c60c84c2d0807609a1ed470a6f9b5 Mon Sep 17 00:00:00 2001 From: Aleksei Kokinos Date: Thu, 5 Feb 2026 23:02:16 +0700 Subject: [PATCH 06/19] fix proto-gen github action --- .github/workflows/proto-gen-pr.yml | 66 ------------------------------ .github/workflows/proto-gen.yml | 52 +++++++++++++++++++++++ 2 files changed, 52 insertions(+), 66 deletions(-) delete mode 100644 .github/workflows/proto-gen-pr.yml create mode 100644 .github/workflows/proto-gen.yml diff --git a/.github/workflows/proto-gen-pr.yml b/.github/workflows/proto-gen-pr.yml deleted file mode 100644 index 05ba35228..000000000 --- a/.github/workflows/proto-gen-pr.yml +++ /dev/null @@ -1,66 +0,0 @@ -name: Generate Protobuf and Create PR - -on: - workflow_dispatch: - inputs: - target_branch: - description: 'Branch to create PR against' - required: true - default: 'enter target branch here' - type: string - -permissions: - contents: write - pull-requests: write - -jobs: - generate-proto: - runs-on: ubuntu-latest - steps: - - name: Checkout repository - uses: actions/checkout@v4 - with: - ref: ${{ github.event.inputs.target_branch }} - fetch-depth: 0 - - - name: Generate Protobuf files - run: make proto-gen - - - name: Check for changes - id: check_changes - run: | - if [[ -n $(git status --porcelain) ]]; then - echo "changes=true" >> $GITHUB_OUTPUT - echo "Proto files have changed:" - git status --porcelain - else - echo "changes=false" >> $GITHUB_OUTPUT - echo "No changes detected in proto files" - fi - - - name: Create Pull Request - if: steps.check_changes.outputs.changes == 'true' - uses: peter-evans/create-pull-request@v6 - with: - token: ${{ secrets.GITHUB_TOKEN }} - commit-message: "chore: regenerate protobuf files" - title: "chore: regenerate protobuf files for ${{ github.event.inputs.target_branch }}" - body: | - This PR was automatically generated by the `proto-gen-pr` workflow. - ## Changes - - Regenerated protobuf Go files from `.proto` definitions - ## Target Branch - `${{ github.event.inputs.target_branch }}` - ## Triggered by - @${{ github.actor }} - branch: proto-gen/${{ github.event.inputs.target_branch }}-${{ github.run_number }} - base: ${{ github.event.inputs.target_branch }} - delete-branch: true - labels: | - automated - protobuf - - - name: No changes summary - if: steps.check_changes.outputs.changes == 'false' - run: | - echo "::notice::No protobuf changes detected. PR was not created." diff --git a/.github/workflows/proto-gen.yml b/.github/workflows/proto-gen.yml new file mode 100644 index 000000000..257f19713 --- /dev/null +++ b/.github/workflows/proto-gen.yml @@ -0,0 +1,52 @@ +name: Generate Protobuf + +on: + workflow_dispatch: + inputs: + target_branch: + description: 'Branch to generate proto for' + required: true + default: 'enter target branch here' + type: string + +permissions: + contents: write + +jobs: + generate-proto: + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + ref: ${{ github.event.inputs.target_branch }} + fetch-depth: 0 + + - name: Generate Protobuf files + run: make proto-gen + + - name: Check for changes + id: check_changes + run: | + if [[ -n $(git status --porcelain) ]]; then + echo "changes=true" >> $GITHUB_OUTPUT + echo "Proto files have changed:" + git status --porcelain + else + echo "changes=false" >> $GITHUB_OUTPUT + echo "No changes detected in proto files" + fi + + - name: Commit and push changes + if: steps.check_changes.outputs.changes == 'true' + run: | + git config user.name "github-actions[bot]" + git config user.email "github-actions[bot]@users.noreply.github.com" + git add . + git commit -m "chore: regenerate protobuf files" + git push origin ${{ github.event.inputs.target_branch }} + + - name: No changes summary + if: steps.check_changes.outputs.changes == 'false' + run: | + echo "::notice::No protobuf changes detected. Nothing to push." From 9e8bcd5e6e5c027f0c1996e6bb90c4b704cbd4aa Mon Sep 17 00:00:00 2001 From: Aleksei Kokinos Date: Fri, 6 Feb 2026 00:13:11 +0700 Subject: [PATCH 07/19] little refactor --- x/vm/keeper/grpc_query.go | 57 +++++++++++++++------------------------ 1 file changed, 22 insertions(+), 35 deletions(-) diff --git a/x/vm/keeper/grpc_query.go b/x/vm/keeper/grpc_query.go index f8629ad0d..df9cd3278 100644 --- a/x/vm/keeper/grpc_query.go +++ b/x/vm/keeper/grpc_query.go @@ -217,21 +217,8 @@ func (k Keeper) Params(c context.Context, _ *types.QueryParamsRequest) (*types.Q }, nil } -// EthCall implements eth_call rpc api. -func (k Keeper) EthCall(c context.Context, req *types.EthCallRequest) (*types.MsgEthereumTxResponse, error) { - if req == nil { - return nil, status.Error(codes.InvalidArgument, "empty request") - } - - ctx := sdk.UnwrapSDKContext(c) - - var args types.TransactionArgs - err := json.Unmarshal(req.Args, &args) - if err != nil { - return nil, status.Error(codes.InvalidArgument, err.Error()) - } - - cfg, err := k.EVMConfig(ctx, GetProposerAddress(ctx, req.ProposerAddress)) +func (k Keeper) call(ctx sdk.Context, args types.TransactionArgs, proposerAddress sdk.ConsAddress, gasCap uint64, stateOverridePtr *types.StateOverride) (*types.MsgEthereumTxResponse, error) { + cfg, err := k.EVMConfig(ctx, GetProposerAddress(ctx, proposerAddress)) if err != nil { return nil, status.Error(codes.Internal, err.Error()) } @@ -240,7 +227,7 @@ func (k Keeper) EthCall(c context.Context, req *types.EthCallRequest) (*types.Ms nonce := k.GetNonce(ctx, args.GetFrom()) args.Nonce = (*hexutil.Uint64)(&nonce) - msg, err := args.ToMessage(req.GasCap, cfg.BaseFee) + msg, err := args.ToMessage(gasCap, cfg.BaseFee) if err != nil { return nil, status.Error(codes.InvalidArgument, err.Error()) } @@ -248,7 +235,7 @@ func (k Keeper) EthCall(c context.Context, req *types.EthCallRequest) (*types.Ms txConfig := statedb.NewEmptyTxConfig(common.BytesToHash(ctx.HeaderHash())) // pass false to not commit StateDB - res, err := k.ApplyMessageWithConfig(ctx, msg, nil, false, cfg, txConfig, nil) + res, err := k.ApplyMessageWithConfig(ctx, msg, nil, false, cfg, txConfig, stateOverridePtr) if err != nil { return nil, status.Error(codes.Internal, err.Error()) } @@ -256,6 +243,23 @@ func (k Keeper) EthCall(c context.Context, req *types.EthCallRequest) (*types.Ms return res, nil } +// EthCall implements eth_call rpc api. +func (k Keeper) EthCall(c context.Context, req *types.EthCallRequest) (*types.MsgEthereumTxResponse, error) { + if req == nil { + return nil, status.Error(codes.InvalidArgument, "empty request") + } + + ctx := sdk.UnwrapSDKContext(c) + + var args types.TransactionArgs + err := json.Unmarshal(req.Args, &args) + if err != nil { + return nil, status.Error(codes.InvalidArgument, err.Error()) + } + + return k.call(ctx, args, req.ProposerAddress, req.GasCap, nil) +} + func (k Keeper) TacSimulate(c context.Context, req *types.TacSimulateRequest) (*types.MsgEthereumTxResponse, error) { if req == nil { return nil, status.Error(codes.InvalidArgument, "empty request") @@ -279,24 +283,7 @@ func (k Keeper) TacSimulate(c context.Context, req *types.TacSimulateRequest) (* stateOverridePtr = &stateOverride } - cfg, err := k.EVMConfig(ctx, GetProposerAddress(ctx, req.ProposerAddress)) - if err != nil { - return nil, status.Error(codes.Internal, err.Error()) - } - - // ApplyMessageWithConfig expect correct nonce set in msg - nonce := k.GetNonce(ctx, args.GetFrom()) - args.Nonce = (*hexutil.Uint64)(&nonce) - - msg, err := args.ToMessage(req.GasCap, cfg.BaseFee) - if err != nil { - return nil, status.Error(codes.InvalidArgument, err.Error()) - } - - txConfig := statedb.NewEmptyTxConfig(common.BytesToHash(ctx.HeaderHash())) - - // pass false to not commit StateDB - return k.ApplyMessageWithConfig(ctx, msg, nil, false, cfg, txConfig, stateOverridePtr) + return k.call(ctx, args, req.ProposerAddress, req.GasCap, stateOverridePtr) } From e0d2cf1ae314b87dcda19eb410a9c99a3703abe0 Mon Sep 17 00:00:00 2001 From: Aleksei Kokinos Date: Fri, 6 Feb 2026 00:22:22 +0700 Subject: [PATCH 08/19] fix TestParams with new ed25519 precompile --- x/vm/types/precompiles.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/x/vm/types/precompiles.go b/x/vm/types/precompiles.go index ce687740e..c0e621089 100644 --- a/x/vm/types/precompiles.go +++ b/x/vm/types/precompiles.go @@ -23,10 +23,11 @@ const LiquidStakePrecompileAddress = "0x000000000000000000000000000000000000 // // NOTE: To be explicit, this list does not include the dynamically registered EVM extensions // like the ERC-20 extensions. +// NOTE: This list MUST be sorted lexicographically by address to match the expected order +// after params are set (SetParams sorts the precompiles). var AvailableStaticPrecompiles = []string{ P256PrecompileAddress, Bech32PrecompileAddress, - Ed25519PrecompileAddress, StakingPrecompileAddress, DistributionPrecompileAddress, ICS20PrecompileAddress, @@ -35,5 +36,6 @@ var AvailableStaticPrecompiles = []string{ GovPrecompileAddress, SlashingPrecompileAddress, EvidencePrecompileAddress, + Ed25519PrecompileAddress, LiquidStakePrecompileAddress, } From afff503a23df8b2cbfa959986d53325445f63897 Mon Sep 17 00:00:00 2001 From: Aleksei Kokinos Date: Fri, 6 Feb 2026 00:22:44 +0700 Subject: [PATCH 09/19] add test for TacSimulate for grpc_query server --- x/vm/keeper/grpc_query.go | 4 +- x/vm/keeper/grpc_query_test.go | 271 +++++++++++++++++++++++++++++++++ 2 files changed, 273 insertions(+), 2 deletions(-) diff --git a/x/vm/keeper/grpc_query.go b/x/vm/keeper/grpc_query.go index df9cd3278..309735213 100644 --- a/x/vm/keeper/grpc_query.go +++ b/x/vm/keeper/grpc_query.go @@ -217,7 +217,7 @@ func (k Keeper) Params(c context.Context, _ *types.QueryParamsRequest) (*types.Q }, nil } -func (k Keeper) call(ctx sdk.Context, args types.TransactionArgs, proposerAddress sdk.ConsAddress, gasCap uint64, stateOverridePtr *types.StateOverride) (*types.MsgEthereumTxResponse, error) { +func (k Keeper) call(ctx sdk.Context, args types.TransactionArgs, proposerAddress sdk.ConsAddress, gasCap uint64, stateOverride *types.StateOverride) (*types.MsgEthereumTxResponse, error) { cfg, err := k.EVMConfig(ctx, GetProposerAddress(ctx, proposerAddress)) if err != nil { return nil, status.Error(codes.Internal, err.Error()) @@ -235,7 +235,7 @@ func (k Keeper) call(ctx sdk.Context, args types.TransactionArgs, proposerAddres txConfig := statedb.NewEmptyTxConfig(common.BytesToHash(ctx.HeaderHash())) // pass false to not commit StateDB - res, err := k.ApplyMessageWithConfig(ctx, msg, nil, false, cfg, txConfig, stateOverridePtr) + res, err := k.ApplyMessageWithConfig(ctx, msg, nil, false, cfg, txConfig, stateOverride) if err != nil { return nil, status.Error(codes.Internal, err.Error()) } diff --git a/x/vm/keeper/grpc_query_test.go b/x/vm/keeper/grpc_query_test.go index 677d47d69..26aea6d64 100644 --- a/x/vm/keeper/grpc_query_test.go +++ b/x/vm/keeper/grpc_query_test.go @@ -1667,6 +1667,277 @@ func (suite *KeeperTestSuite) TestEthCall() { } } +func (suite *KeeperTestSuite) TestTacSimulate() { + suite.enableFeemarket = true + defer func() { suite.enableFeemarket = false }() + suite.SetupTest() + + erc20Contract, err := testdata.LoadERC20Contract() + suite.Require().NoError(err) + + // Generate common data for requests + sender := suite.keyring.GetAddr(0) + supply := sdkmath.NewIntWithDecimal(1000, 18).BigInt() + ctorArgs, err := erc20Contract.ABI.Pack("", sender, supply) + suite.Require().NoError(err) + deployData := erc20Contract.Bin + deployData = append(deployData, ctorArgs...) + + // Deploy ERC20 contract for transfer tests + senderKey := suite.keyring.GetKey(0) + contractAddr, err := deployErc20Contract(senderKey, suite.factory) + suite.Require().NoError(err) + + err = suite.network.NextBlock() + suite.Require().NoError(err) + + // Prepare transfer call data + recipient := common.HexToAddress("0xC6Fe5D33615a1C52c08018c47E8Bc53646A0E101") + transferData, err := erc20Contract.ABI.Pack("transfer", recipient, big.NewInt(1000)) + suite.Require().NoError(err) + + testCases := []struct { + name string + getReq func() *types.TacSimulateRequest + expPass bool + expVMError bool + validate func(res *types.MsgEthereumTxResponse) + }{ + { + name: "fail - nil request", + getReq: func() *types.TacSimulateRequest { + return nil + }, + expPass: false, + }, + { + name: "fail - invalid args", + getReq: func() *types.TacSimulateRequest { + return &types.TacSimulateRequest{ + Args: []byte("invalid args"), + GasCap: config.DefaultGasCap, + } + }, + expPass: false, + }, + { + name: "fail - invalid state override json", + getReq: func() *types.TacSimulateRequest { + args, err := json.Marshal(&types.TransactionArgs{ + From: &sender, + To: &contractAddr, + Data: (*hexutil.Bytes)(&transferData), + }) + suite.Require().NoError(err) + + return &types.TacSimulateRequest{ + Args: args, + StateOverride: []byte("invalid json"), + GasCap: config.DefaultGasCap, + ProposerAddress: suite.network.GetContext().BlockHeader().ProposerAddress, + } + }, + expPass: false, + }, + { + name: "success - simple transfer call", + getReq: func() *types.TacSimulateRequest { + args, err := json.Marshal(&types.TransactionArgs{ + From: &sender, + To: &contractAddr, + Data: (*hexutil.Bytes)(&transferData), + }) + suite.Require().NoError(err) + + return &types.TacSimulateRequest{ + Args: args, + GasCap: config.DefaultGasCap, + ProposerAddress: suite.network.GetContext().BlockHeader().ProposerAddress, + } + }, + expPass: true, + validate: func(res *types.MsgEthereumTxResponse) { + suite.Require().False(res.Failed(), "VM error: %s", res.VmError) + suite.Require().NotEmpty(res.Ret) + }, + }, + { + name: "success - call with state override (override balance)", + getReq: func() *types.TacSimulateRequest { + // Create a new address with zero balance + newAddr := common.HexToAddress("0x1234567890123456789012345678901234567890") + + args, err := json.Marshal(&types.TransactionArgs{ + From: &newAddr, + To: &contractAddr, + Data: (*hexutil.Bytes)(&transferData), + Value: (*hexutil.Big)(big.NewInt(0)), + }) + suite.Require().NoError(err) + + // Override balance for newAddr so it can pay for gas + stateOverride := types.StateOverride{ + newAddr: types.OverrideAccount{ + Balance: (*hexutil.Big)(big.NewInt(1e18)), + }, + } + stateOverrideBytes, err := json.Marshal(stateOverride) + suite.Require().NoError(err) + + return &types.TacSimulateRequest{ + Args: args, + StateOverride: stateOverrideBytes, + GasCap: config.DefaultGasCap, + ProposerAddress: suite.network.GetContext().BlockHeader().ProposerAddress, + } + }, + expPass: true, + expVMError: true, // Will fail because newAddr doesn't have ERC20 tokens, but balance override worked + }, + { + name: "success - call with empty state override", + getReq: func() *types.TacSimulateRequest { + args, err := json.Marshal(&types.TransactionArgs{ + From: &sender, + To: &contractAddr, + Data: (*hexutil.Bytes)(&transferData), + }) + suite.Require().NoError(err) + + // Empty state override + stateOverride := types.StateOverride{} + stateOverrideBytes, err := json.Marshal(stateOverride) + suite.Require().NoError(err) + + return &types.TacSimulateRequest{ + Args: args, + StateOverride: stateOverrideBytes, + GasCap: config.DefaultGasCap, + ProposerAddress: suite.network.GetContext().BlockHeader().ProposerAddress, + } + }, + expPass: true, + validate: func(res *types.MsgEthereumTxResponse) { + suite.Require().False(res.Failed(), "VM error: %s", res.VmError) + }, + }, + { + name: "success - contract deployment", + getReq: func() *types.TacSimulateRequest { + args, err := json.Marshal(&types.TransactionArgs{ + From: &sender, + Data: (*hexutil.Bytes)(&deployData), + }) + suite.Require().NoError(err) + + return &types.TacSimulateRequest{ + Args: args, + GasCap: config.DefaultGasCap, + ProposerAddress: suite.network.GetContext().BlockHeader().ProposerAddress, + } + }, + expPass: true, + validate: func(res *types.MsgEthereumTxResponse) { + suite.Require().False(res.Failed(), "VM error: %s", res.VmError) + }, + }, + } + + for _, tc := range testCases { + suite.Run(tc.name, func() { + req := tc.getReq() + + res, err := suite.network.App.EVMKeeper.TacSimulate(suite.network.GetContext(), req) + + if tc.expPass { + suite.Require().NoError(err) + suite.Require().NotNil(res) + + if tc.expVMError { + suite.Require().True(res.Failed(), "expected VM error but got success") + } + + if tc.validate != nil { + tc.validate(res) + } + } else { + suite.Require().Error(err) + } + }) + } +} + +func (suite *KeeperTestSuite) TestTacSimulateWithStateOverride() { + suite.SetupTest() + + sender := suite.keyring.GetAddr(0) + + // Target address to check balance + targetAddr := common.HexToAddress("0x1234567890123456789012345678901234567890") + + // Contract bytecode that returns balance of a specific address + // PUSH20
BALANCE PUSH1 0x00 MSTORE PUSH1 0x20 PUSH1 0x00 RETURN + balanceCheckerCode := append( + []byte{0x73}, // PUSH20 + append( + targetAddr.Bytes(), + []byte{ + 0x31, // BALANCE + 0x60, 0x00, // PUSH1 0x00 + 0x52, // MSTORE + 0x60, 0x20, // PUSH1 0x20 + 0x60, 0x00, // PUSH1 0x00 + 0xf3, // RETURN + }..., + )..., + ) + + contractAddr := common.HexToAddress("0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef") + + // Test: Use state override to inject code and check balance + overriddenBalance := big.NewInt(123456789) + + args, err := json.Marshal(&types.TransactionArgs{ + From: &sender, + To: &contractAddr, + Gas: func() *hexutil.Uint64 { g := hexutil.Uint64(100000); return &g }(), + }) + suite.Require().NoError(err) + + stateOverride := types.StateOverride{ + contractAddr: types.OverrideAccount{ + Code: func() *hexutil.Bytes { b := hexutil.Bytes(balanceCheckerCode); return &b }(), + }, + targetAddr: types.OverrideAccount{ + Balance: (*hexutil.Big)(overriddenBalance), + }, + } + stateOverrideBytes, err := json.Marshal(stateOverride) + suite.Require().NoError(err) + + req := &types.TacSimulateRequest{ + Args: args, + StateOverride: stateOverrideBytes, + GasCap: config.DefaultGasCap, + ProposerAddress: suite.network.GetContext().BlockHeader().ProposerAddress, + } + + res, err := suite.network.App.EVMKeeper.TacSimulate(suite.network.GetContext(), req) + suite.Require().NoError(err) + suite.Require().NotNil(res) + suite.Require().False(res.Failed(), "VM error: %s", res.VmError) + + // The result should contain the overridden balance + returnedBalance := new(big.Int).SetBytes(res.Ret) + suite.Require().Equal(overriddenBalance.String(), returnedBalance.String(), + "StateOverride should have changed the balance visible to the contract") + + // Verify original state is unchanged + originalBalance := suite.network.App.EVMKeeper.GetBalance(suite.network.GetContext(), targetAddr) + suite.Require().Equal(big.NewInt(0).String(), originalBalance.String(), + "Original state should not be modified") +} + func (suite *KeeperTestSuite) TestEmptyRequest() { suite.SetupTest() k := suite.network.App.EVMKeeper From cb40e7bf320c729ef0c9e2ee587807ce6a6b1376 Mon Sep 17 00:00:00 2001 From: Aleksei Kokinos Date: Fri, 6 Feb 2026 17:57:30 +0700 Subject: [PATCH 10/19] fix precompile override --- x/vm/keeper/state_transition.go | 2 +- x/vm/statedb/statedb.go | 11 +++++------ 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/x/vm/keeper/state_transition.go b/x/vm/keeper/state_transition.go index 9feb611b5..725f8e9bd 100644 --- a/x/vm/keeper/state_transition.go +++ b/x/vm/keeper/state_transition.go @@ -317,7 +317,7 @@ func (k *Keeper) ApplyMessageWithConfig( if commit { return nil, errorsmod.Wrap(types.ErrUnexpectedStateOverride, "state override is not nil") } - if err := stateDB.ApplyStateOverride(stateOverride); err != nil { + if err := stateDB.ApplyStateOverride(stateOverride, evm.ActivePrecompiles(rules)); err != nil { return nil, errorsmod.Wrap(err, "failed to apply state override") } } diff --git a/x/vm/statedb/statedb.go b/x/vm/statedb/statedb.go index 3c6ec2b3f..58487ea30 100644 --- a/x/vm/statedb/statedb.go +++ b/x/vm/statedb/statedb.go @@ -4,6 +4,7 @@ import ( "errors" "fmt" "math/big" + "slices" "sort" "github.com/ethereum/go-ethereum/common" @@ -641,16 +642,14 @@ func (s *StateDB) SetStorage(addr common.Address, storage map[common.Hash]common } // Apply overrides the fields of specified accounts into the given state. -func (statedb *StateDB) ApplyStateOverride(diff *types.StateOverride) error { +func (statedb *StateDB) ApplyStateOverride(diff *types.StateOverride, activePrecompiles []common.Address) error { if diff == nil { return nil } - // Tracks destinations of precompiles that were moved. - dirtyAddrs := make(map[common.Address]struct{}) for addr, account := range *diff { - // If a precompile was moved to this address already, it can't be overridden. - if _, ok := dirtyAddrs[addr]; ok { - return fmt.Errorf("account %s has already been overridden by a precompile", addr.Hex()) + // check if the account is a precompile, if so, return error since state override is not allowed for precompiles + if slices.Index(activePrecompiles, addr) != -1 { + return fmt.Errorf("account %s is a precompile, state override is not allowed", addr.Hex()) } // Override account nonce. if account.Nonce != nil { From 95c645fa953953b466ea566cfae2b9f4aa53ed6a Mon Sep 17 00:00:00 2001 From: Aleksei Kokinos Date: Mon, 9 Feb 2026 20:06:35 +0700 Subject: [PATCH 11/19] little fix naming --- x/vm/keeper/grpc_query.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/x/vm/keeper/grpc_query.go b/x/vm/keeper/grpc_query.go index 309735213..61f84b098 100644 --- a/x/vm/keeper/grpc_query.go +++ b/x/vm/keeper/grpc_query.go @@ -217,7 +217,7 @@ func (k Keeper) Params(c context.Context, _ *types.QueryParamsRequest) (*types.Q }, nil } -func (k Keeper) call(ctx sdk.Context, args types.TransactionArgs, proposerAddress sdk.ConsAddress, gasCap uint64, stateOverride *types.StateOverride) (*types.MsgEthereumTxResponse, error) { +func (k Keeper) callWithOverride(ctx sdk.Context, args types.TransactionArgs, proposerAddress sdk.ConsAddress, gasCap uint64, stateOverride *types.StateOverride) (*types.MsgEthereumTxResponse, error) { cfg, err := k.EVMConfig(ctx, GetProposerAddress(ctx, proposerAddress)) if err != nil { return nil, status.Error(codes.Internal, err.Error()) @@ -257,7 +257,7 @@ func (k Keeper) EthCall(c context.Context, req *types.EthCallRequest) (*types.Ms return nil, status.Error(codes.InvalidArgument, err.Error()) } - return k.call(ctx, args, req.ProposerAddress, req.GasCap, nil) + return k.callWithOverride(ctx, args, req.ProposerAddress, req.GasCap, nil) } func (k Keeper) TacSimulate(c context.Context, req *types.TacSimulateRequest) (*types.MsgEthereumTxResponse, error) { @@ -283,7 +283,7 @@ func (k Keeper) TacSimulate(c context.Context, req *types.TacSimulateRequest) (* stateOverridePtr = &stateOverride } - return k.call(ctx, args, req.ProposerAddress, req.GasCap, stateOverridePtr) + return k.callWithOverride(ctx, args, req.ProposerAddress, req.GasCap, stateOverridePtr) } From 0319c80ca121bc2bd3f44116ea6ab28a669410f3 Mon Sep 17 00:00:00 2001 From: Aleksei Kokinos Date: Mon, 9 Feb 2026 22:19:39 +0700 Subject: [PATCH 12/19] fix returned log types --- rpc/namespaces/ethereum/eth/api.go | 5 ++++- rpc/types/types.go | 25 ++++++++++++++++++++++++- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/rpc/namespaces/ethereum/eth/api.go b/rpc/namespaces/ethereum/eth/api.go index c186c7c60..438e16a06 100644 --- a/rpc/namespaces/ethereum/eth/api.go +++ b/rpc/namespaces/ethereum/eth/api.go @@ -306,10 +306,13 @@ func (e *PublicAPI) TacSimulate(args evmtypes.TransactionArgs, return []byte{}, err } + // convert evmtypes.Log to ethtypes.Log + rpcLogs := rpctypes.ToRPCTypeLogs(data.Logs) + tacSimulateResult := rpctypes.TacSimulateResult{ Output: hexutil.Bytes(data.Ret), VmError: data.VmError, - Logs: data.Logs, + Logs: rpcLogs, GasUsed: hexutil.Uint64(data.GasUsed), } diff --git a/rpc/types/types.go b/rpc/types/types.go index 43106d838..41e73ff59 100644 --- a/rpc/types/types.go +++ b/rpc/types/types.go @@ -79,7 +79,30 @@ type TacSimulateResult struct { // VmError is the revert reason if the EVM execution is reverted, it is empty if the execution is successful VmError string `json:"vmError,omitempty"` // Logs are the event logs generated by the EVM execution, it is empty if no logs are generated - Logs []*evmtypes.Log `json:"logs,omitempty"` + Logs []*ethtypes.Log `json:"logs,omitempty"` // GasUsed is the gas used by the EVM execution, it is 0 if the execution is reverted GasUsed hexutil.Uint64 `json:"gasUsed"` } + +func ToRPCTypeLogs(logs []*evmtypes.Log) []*ethtypes.Log { + rpcLogs := make([]*ethtypes.Log, len(logs)) + for i, log := range logs { + topics := make([]common.Hash, len(log.Topics)) + for j := range log.Topics { + topics[j] = common.HexToHash(log.Topics[j]) + } + rpcLogs[i] = ðtypes.Log{ + Address: common.HexToAddress(log.Address), + Topics: topics, + Data: log.Data, + BlockNumber: log.BlockNumber, + TxHash: common.HexToHash(log.TxHash), + TxIndex: uint(log.TxIndex), + BlockHash: common.HexToHash(log.BlockHash), + Index: uint(log.Index), + Removed: log.Removed, + } + } + + return rpcLogs +} From 2c357dda912297d0ac695a87fc0d1452ec226a55 Mon Sep 17 00:00:00 2001 From: Aleksei Kokinos Date: Mon, 9 Feb 2026 23:16:24 +0700 Subject: [PATCH 13/19] fix stateoverride type from map ptr to just map --- rpc/backend/backend.go | 2 +- rpc/backend/call_tx.go | 2 +- rpc/namespaces/ethereum/eth/api.go | 4 ++-- rpc/types/types.go | 8 ++++---- x/vm/keeper/grpc_query.go | 8 +++----- x/vm/keeper/state_transition.go | 2 +- x/vm/statedb/statedb.go | 4 ++-- 7 files changed, 14 insertions(+), 16 deletions(-) diff --git a/rpc/backend/backend.go b/rpc/backend/backend.go index d898c29b2..3a3097454 100644 --- a/rpc/backend/backend.go +++ b/rpc/backend/backend.go @@ -110,7 +110,7 @@ type EVMBackend interface { SetTxDefaults(args evmtypes.TransactionArgs) (evmtypes.TransactionArgs, error) EstimateGas(args evmtypes.TransactionArgs, blockNrOptional *rpctypes.BlockNumber) (hexutil.Uint64, error) DoCall(args evmtypes.TransactionArgs, blockNr rpctypes.BlockNumber) (*evmtypes.MsgEthereumTxResponse, error) - DoTacSimulate(args evmtypes.TransactionArgs, blockNr rpctypes.BlockNumber, stateOverride *evmtypes.StateOverride) (*evmtypes.MsgEthereumTxResponse, error) + DoTacSimulate(args evmtypes.TransactionArgs, blockNr rpctypes.BlockNumber, stateOverride evmtypes.StateOverride) (*evmtypes.MsgEthereumTxResponse, error) GasPrice() (*hexutil.Big, error) // Filter API diff --git a/rpc/backend/call_tx.go b/rpc/backend/call_tx.go index 597490cf5..73d03eeb0 100644 --- a/rpc/backend/call_tx.go +++ b/rpc/backend/call_tx.go @@ -375,7 +375,7 @@ func (b *Backend) DoCall( func (b *Backend) DoTacSimulate( args evmtypes.TransactionArgs, blockNr rpctypes.BlockNumber, - stateOverride *evmtypes.StateOverride, + stateOverride evmtypes.StateOverride, ) (*evmtypes.MsgEthereumTxResponse, error) { bz, err := json.Marshal(&args) if err != nil { diff --git a/rpc/namespaces/ethereum/eth/api.go b/rpc/namespaces/ethereum/eth/api.go index 438e16a06..e71b1986a 100644 --- a/rpc/namespaces/ethereum/eth/api.go +++ b/rpc/namespaces/ethereum/eth/api.go @@ -72,7 +72,7 @@ type EthereumAPI interface { // eth_tacSimulate implements the custom `eth_tacSimulate` rpc api which supports state override and event logs as result TacSimulate(args evmtypes.TransactionArgs, blockNrOrHash rpctypes.BlockNumberOrHash, - stateOverride *evmtypes.StateOverride, + stateOverride evmtypes.StateOverride, ) (hexutil.Bytes, error) // Chain Information @@ -293,7 +293,7 @@ func (e *PublicAPI) Call(args evmtypes.TransactionArgs, func (e *PublicAPI) TacSimulate(args evmtypes.TransactionArgs, blockNrOrHash rpctypes.BlockNumberOrHash, - stateOverride *evmtypes.StateOverride, + stateOverride evmtypes.StateOverride, ) (hexutil.Bytes, error) { e.logger.Debug("eth_tacSimulate", "args", args.String(), "block number or hash", blockNrOrHash, "state override", stateOverride) diff --git a/rpc/types/types.go b/rpc/types/types.go index 41e73ff59..6edad12c0 100644 --- a/rpc/types/types.go +++ b/rpc/types/types.go @@ -79,19 +79,19 @@ type TacSimulateResult struct { // VmError is the revert reason if the EVM execution is reverted, it is empty if the execution is successful VmError string `json:"vmError,omitempty"` // Logs are the event logs generated by the EVM execution, it is empty if no logs are generated - Logs []*ethtypes.Log `json:"logs,omitempty"` + Logs []ethtypes.Log `json:"logs,omitempty"` // GasUsed is the gas used by the EVM execution, it is 0 if the execution is reverted GasUsed hexutil.Uint64 `json:"gasUsed"` } -func ToRPCTypeLogs(logs []*evmtypes.Log) []*ethtypes.Log { - rpcLogs := make([]*ethtypes.Log, len(logs)) +func ToRPCTypeLogs(logs []*evmtypes.Log) []ethtypes.Log { + rpcLogs := make([]ethtypes.Log, len(logs)) for i, log := range logs { topics := make([]common.Hash, len(log.Topics)) for j := range log.Topics { topics[j] = common.HexToHash(log.Topics[j]) } - rpcLogs[i] = ðtypes.Log{ + rpcLogs[i] = ethtypes.Log{ Address: common.HexToAddress(log.Address), Topics: topics, Data: log.Data, diff --git a/x/vm/keeper/grpc_query.go b/x/vm/keeper/grpc_query.go index 61f84b098..8197df65a 100644 --- a/x/vm/keeper/grpc_query.go +++ b/x/vm/keeper/grpc_query.go @@ -217,7 +217,7 @@ func (k Keeper) Params(c context.Context, _ *types.QueryParamsRequest) (*types.Q }, nil } -func (k Keeper) callWithOverride(ctx sdk.Context, args types.TransactionArgs, proposerAddress sdk.ConsAddress, gasCap uint64, stateOverride *types.StateOverride) (*types.MsgEthereumTxResponse, error) { +func (k Keeper) callWithOverride(ctx sdk.Context, args types.TransactionArgs, proposerAddress sdk.ConsAddress, gasCap uint64, stateOverride types.StateOverride) (*types.MsgEthereumTxResponse, error) { cfg, err := k.EVMConfig(ctx, GetProposerAddress(ctx, proposerAddress)) if err != nil { return nil, status.Error(codes.Internal, err.Error()) @@ -273,17 +273,15 @@ func (k Keeper) TacSimulate(c context.Context, req *types.TacSimulateRequest) (* return nil, status.Error(codes.InvalidArgument, err.Error()) } - var stateOverridePtr *types.StateOverride + var stateOverride types.StateOverride if req.StateOverride != nil { - var stateOverride types.StateOverride err = json.Unmarshal(req.StateOverride, &stateOverride) if err != nil { return nil, status.Error(codes.InvalidArgument, err.Error()) } - stateOverridePtr = &stateOverride } - return k.callWithOverride(ctx, args, req.ProposerAddress, req.GasCap, stateOverridePtr) + return k.callWithOverride(ctx, args, req.ProposerAddress, req.GasCap, stateOverride) } diff --git a/x/vm/keeper/state_transition.go b/x/vm/keeper/state_transition.go index 725f8e9bd..b35daa996 100644 --- a/x/vm/keeper/state_transition.go +++ b/x/vm/keeper/state_transition.go @@ -270,7 +270,7 @@ func (k *Keeper) ApplyMessageWithConfig( commit bool, cfg *statedb.EVMConfig, txConfig statedb.TxConfig, - stateOverride *types.StateOverride, + stateOverride types.StateOverride, ) (*types.MsgEthereumTxResponse, error) { var ( ret []byte // return bytes from evm execution diff --git a/x/vm/statedb/statedb.go b/x/vm/statedb/statedb.go index 58487ea30..b3d822508 100644 --- a/x/vm/statedb/statedb.go +++ b/x/vm/statedb/statedb.go @@ -642,11 +642,11 @@ func (s *StateDB) SetStorage(addr common.Address, storage map[common.Hash]common } // Apply overrides the fields of specified accounts into the given state. -func (statedb *StateDB) ApplyStateOverride(diff *types.StateOverride, activePrecompiles []common.Address) error { +func (statedb *StateDB) ApplyStateOverride(diff types.StateOverride, activePrecompiles []common.Address) error { if diff == nil { return nil } - for addr, account := range *diff { + for addr, account := range diff { // check if the account is a precompile, if so, return error since state override is not allowed for precompiles if slices.Index(activePrecompiles, addr) != -1 { return fmt.Errorf("account %s is a precompile, state override is not allowed", addr.Hex()) From 98900688324d9f404c90f3c561d2307f54e024c1 Mon Sep 17 00:00:00 2001 From: Aleksei Kokinos Date: Wed, 11 Feb 2026 23:40:49 +0700 Subject: [PATCH 14/19] fix state override with clean full state obj storage --- x/vm/statedb/state_object.go | 14 ++++++++++++++ x/vm/statedb/statedb.go | 1 + 2 files changed, 15 insertions(+) diff --git a/x/vm/statedb/state_object.go b/x/vm/statedb/state_object.go index 5e0e8158d..e74e52ef5 100644 --- a/x/vm/statedb/state_object.go +++ b/x/vm/statedb/state_object.go @@ -74,6 +74,10 @@ type stateObject struct { // flags dirtyCode bool suicided bool + // used for state overriding, indicates whether the state of this account is overridden by the given state override, + // if true, it means all keys that are not in originStorage should be treated as zero value. + // used only for debug and state override simulation + stateOverriden bool } // newObject creates a state object. @@ -230,6 +234,10 @@ func (s *stateObject) GetCommittedState(key common.Hash) common.Hash { if value, cached := s.originStorage[key]; cached { return value } + if s.stateOverriden { + // If state is overridden but the key is not in originStorage, it means the value is default + return common.Hash{} + } // If no live objects are available, load it from keeper value := s.db.keeper.GetState(s.db.ctx, s.Address(), key) s.originStorage[key] = value @@ -263,3 +271,9 @@ func (s *stateObject) SetState(key common.Hash, value common.Hash) { func (s *stateObject) setState(key, value common.Hash) { s.dirtyStorage[key] = value } + +// SetStateOverriden sets the state override flag to true, which means all keys that are not in originStorage should be treated as zero value. +// Used only for debug and state override simulation +func (s *stateObject) SetStateOverriden() { + s.stateOverriden = true +} diff --git a/x/vm/statedb/statedb.go b/x/vm/statedb/statedb.go index b3d822508..ec9b08322 100644 --- a/x/vm/statedb/statedb.go +++ b/x/vm/statedb/statedb.go @@ -630,6 +630,7 @@ func (s *StateDB) SetBalance(addr common.Address, amount *uint256.Int) { // must be discarded afterwards. func (s *StateDB) SetStorage(addr common.Address, storage map[common.Hash]common.Hash) { newObj, prev := s.createObject(addr) + newObj.SetStateOverriden() for k, v := range storage { newObj.SetState(k, v) } From 607c98673f3cd606d09ac658e4385e4ef096b458 Mon Sep 17 00:00:00 2001 From: Aleksei Kokinos Date: Thu, 12 Feb 2026 17:26:17 +0700 Subject: [PATCH 15/19] state transition tests --- x/vm/keeper/state_transition_test.go | 274 ++++++++++++++++++++++++++- 1 file changed, 266 insertions(+), 8 deletions(-) diff --git a/x/vm/keeper/state_transition_test.go b/x/vm/keeper/state_transition_test.go index 37063f79e..1666707cc 100644 --- a/x/vm/keeper/state_transition_test.go +++ b/x/vm/keeper/state_transition_test.go @@ -791,7 +791,7 @@ func (suite *KeeperTestSuite) TestApplyMessageWithStateOverride() { testCases := []struct { name string - stateOverride *types.StateOverride + stateOverride types.StateOverride commit bool expErr bool expErrMsg string @@ -804,7 +804,7 @@ func (suite *KeeperTestSuite) TestApplyMessageWithStateOverride() { }, { name: "success - override balance", - stateOverride: &types.StateOverride{ + stateOverride: types.StateOverride{ recipient: types.OverrideAccount{ Balance: (*hexutil.Big)(big.NewInt(1e18)), }, @@ -814,7 +814,7 @@ func (suite *KeeperTestSuite) TestApplyMessageWithStateOverride() { }, { name: "success - override nonce", - stateOverride: &types.StateOverride{ + stateOverride: types.StateOverride{ recipient: types.OverrideAccount{ Nonce: func() *hexutil.Uint64 { n := hexutil.Uint64(100); return &n }(), }, @@ -824,7 +824,7 @@ func (suite *KeeperTestSuite) TestApplyMessageWithStateOverride() { }, { name: "success - override code (empty code does not affect simple transfer)", - stateOverride: &types.StateOverride{ + stateOverride: types.StateOverride{ recipient: types.OverrideAccount{ // Setting empty code on recipient - simple transfer should still work Code: func() *hexutil.Bytes { b := hexutil.Bytes([]byte{}); return &b }(), @@ -835,7 +835,7 @@ func (suite *KeeperTestSuite) TestApplyMessageWithStateOverride() { }, { name: "success - override state diff", - stateOverride: &types.StateOverride{ + stateOverride: types.StateOverride{ recipient: types.OverrideAccount{ StateDiff: map[common.Hash]common.Hash{ common.HexToHash("0x01"): common.HexToHash("0x02"), @@ -847,7 +847,7 @@ func (suite *KeeperTestSuite) TestApplyMessageWithStateOverride() { }, { name: "fail - state override with commit=true", - stateOverride: &types.StateOverride{ + stateOverride: types.StateOverride{ recipient: types.OverrideAccount{ Balance: (*hexutil.Big)(big.NewInt(1e18)), }, @@ -858,7 +858,7 @@ func (suite *KeeperTestSuite) TestApplyMessageWithStateOverride() { }, { name: "fail - both state and stateDiff provided", - stateOverride: &types.StateOverride{ + stateOverride: types.StateOverride{ recipient: types.OverrideAccount{ State: map[common.Hash]common.Hash{ common.HexToHash("0x01"): common.HexToHash("0x02"), @@ -977,7 +977,7 @@ func (suite *KeeperTestSuite) TestStateOverrideBalanceCheck() { // State override: set code for contractAddr and balance for targetAddr overriddenBalance := big.NewInt(123456789) - stateOverride := &types.StateOverride{ + stateOverride := types.StateOverride{ contractAddr: types.OverrideAccount{ Code: func() *hexutil.Bytes { b := hexutil.Bytes(balanceCheckerCode); return &b }(), }, @@ -1012,6 +1012,264 @@ func (suite *KeeperTestSuite) TestStateOverrideBalanceCheck() { _ = senderAddr // suppress unused variable warning } +// TestStateOverrideStateMapResetsNonOverriddenKeys verifies that when State map (full state replacement) +// is used in state override, storage keys NOT present in the override return zero values, +// even if they exist in the actual on-chain storage. This mimics geth behavior. +// In contrast, StateDiff (partial override) should preserve non-overridden keys. +func (suite *KeeperTestSuite) TestStateOverrideStateMapResetsNonOverriddenKeys() { + suite.SetupTest() + + sender := suite.keyring.GetKey(0) + + // Contract address where we'll set real storage and override it + contractAddr := common.HexToAddress("0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef") + + // Storage slots and values + slot0 := common.HexToHash("0x00") + slot1 := common.HexToHash("0x01") + realValue0 := common.HexToHash("0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA") + realValue1 := common.HexToHash("0xBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB") + overrideValue0 := common.HexToHash("0xCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC") + + // Write real storage values into the keeper (on-chain state) + suite.network.App.EVMKeeper.SetState(suite.network.GetContext(), contractAddr, slot0, realValue0.Bytes()) + suite.network.App.EVMKeeper.SetState(suite.network.GetContext(), contractAddr, slot1, realValue1.Bytes()) + + // Verify real storage was written correctly + readValue0 := suite.network.App.EVMKeeper.GetState(suite.network.GetContext(), contractAddr, slot0) + readValue1 := suite.network.App.EVMKeeper.GetState(suite.network.GetContext(), contractAddr, slot1) + suite.Require().Equal(realValue0, readValue0, "slot0 should be written to keeper") + suite.Require().Equal(realValue1, readValue1, "slot1 should be written to keeper") + + // Bytecode: reads slot 0 and slot 1, returns both as 64 bytes + // + // PUSH1 0x00 SLOAD PUSH1 0x00 MSTORE -> memory[0..31] = storage[0] + // PUSH1 0x01 SLOAD PUSH1 0x20 MSTORE -> memory[32..63] = storage[1] + // PUSH1 0x40 PUSH1 0x00 RETURN -> return 64 bytes from memory + storageReaderCode := []byte{ + 0x60, 0x00, // PUSH1 0x00 + 0x54, // SLOAD + 0x60, 0x00, // PUSH1 0x00 + 0x52, // MSTORE + 0x60, 0x01, // PUSH1 0x01 + 0x54, // SLOAD + 0x60, 0x20, // PUSH1 0x20 + 0x52, // MSTORE + 0x60, 0x40, // PUSH1 0x40 + 0x60, 0x00, // PUSH1 0x00 + 0xf3, // RETURN + } + + // Get proposer address and EVM config + proposerAddress := suite.network.GetContext().BlockHeader().ProposerAddress + config, err := suite.network.App.EVMKeeper.EVMConfig( + suite.network.GetContext(), + proposerAddress, + ) + suite.Require().NoError(err) + + txConfig := suite.network.App.EVMKeeper.TxConfig( + suite.network.GetContext(), + common.Hash{}, + ) + + msg, err := suite.factory.GenerateGethCoreMsg(sender.Priv, types.EvmTxArgs{ + To: &contractAddr, + Input: []byte{}, + GasLimit: 100000, + }) + suite.Require().NoError(err) + + // --------------------------------------------------------------- + // Test 1: State override with State map (full replacement) + // Override only slot0 -> non-overridden slot1 MUST return zero + // --------------------------------------------------------------- + stateOverrideFullReplace := types.StateOverride{ + contractAddr: types.OverrideAccount{ + Code: func() *hexutil.Bytes { b := hexutil.Bytes(storageReaderCode); return &b }(), + State: map[common.Hash]common.Hash{ + slot0: overrideValue0, + // slot1 is intentionally NOT in the State map + }, + }, + } + + res, err := suite.network.App.EVMKeeper.ApplyMessageWithConfig( + suite.network.GetContext(), + *msg, + nil, + false, + config, + txConfig, + stateOverrideFullReplace, + ) + suite.Require().NoError(err) + suite.Require().NotNil(res) + suite.Require().False(res.Failed(), "VM error: %s", res.VmError) + suite.Require().Len(res.Ret, 64, "expected 64 bytes return (two 32-byte slots)") + + returnedSlot0 := common.BytesToHash(res.Ret[:32]) + returnedSlot1 := common.BytesToHash(res.Ret[32:64]) + + suite.Require().Equal(overrideValue0, returnedSlot0, + "State override: slot0 should return the overridden value") + suite.Require().Equal(common.Hash{}, returnedSlot1, + "State override: slot1 (not in override State map) should return zero, not the real on-chain value") + + // --------------------------------------------------------------- + // Test 2: State override with StateDiff (partial override) + // Override only slot0 -> non-overridden slot1 MUST return real value + // --------------------------------------------------------------- + msg2, err := suite.factory.GenerateGethCoreMsg(sender.Priv, types.EvmTxArgs{ + To: &contractAddr, + Input: []byte{}, + GasLimit: 100000, + }) + suite.Require().NoError(err) + + stateOverridePartial := types.StateOverride{ + contractAddr: types.OverrideAccount{ + Code: func() *hexutil.Bytes { b := hexutil.Bytes(storageReaderCode); return &b }(), + StateDiff: map[common.Hash]common.Hash{ + slot0: overrideValue0, + // slot1 is intentionally NOT in the StateDiff map + }, + }, + } + + txConfig2 := suite.network.App.EVMKeeper.TxConfig( + suite.network.GetContext(), + common.Hash{}, + ) + + res2, err := suite.network.App.EVMKeeper.ApplyMessageWithConfig( + suite.network.GetContext(), + *msg2, + nil, + false, + config, + txConfig2, + stateOverridePartial, + ) + suite.Require().NoError(err) + suite.Require().NotNil(res2) + suite.Require().False(res2.Failed(), "VM error: %s", res2.VmError) + suite.Require().Len(res2.Ret, 64, "expected 64 bytes return (two 32-byte slots)") + + returnedSlot0Diff := common.BytesToHash(res2.Ret[:32]) + returnedSlot1Diff := common.BytesToHash(res2.Ret[32:64]) + + suite.Require().Equal(overrideValue0, returnedSlot0Diff, + "StateDiff override: slot0 should return the overridden value") + suite.Require().Equal(realValue1, returnedSlot1Diff, + "StateDiff override: slot1 (not in override) should return the real on-chain value") + + // --------------------------------------------------------------- + // Test 3: Verify original on-chain state is unchanged after overrides + // --------------------------------------------------------------- + finalValue0 := suite.network.App.EVMKeeper.GetState(suite.network.GetContext(), contractAddr, slot0) + finalValue1 := suite.network.App.EVMKeeper.GetState(suite.network.GetContext(), contractAddr, slot1) + suite.Require().Equal(realValue0, finalValue0, "Original slot0 should not be modified") + suite.Require().Equal(realValue1, finalValue1, "Original slot1 should not be modified") +} + +// TestStateOverrideCannotOverridePrecompile verifies that state override +// returns an error when trying to override a precompile contract address. +func (suite *KeeperTestSuite) TestStateOverrideCannotOverridePrecompile() { + suite.SetupTest() + + sender := suite.keyring.GetKey(0) + + // Use standard EVM precompile addresses (ecrecover=0x01, sha256=0x02, etc.) + // These are always present in ActivePrecompiles regardless of the chain configuration. + ecrecoverAddr := common.HexToAddress("0x0000000000000000000000000000000000000001") + + proposerAddress := suite.network.GetContext().BlockHeader().ProposerAddress + config, err := suite.network.App.EVMKeeper.EVMConfig( + suite.network.GetContext(), + proposerAddress, + ) + suite.Require().NoError(err) + + txConfig := suite.network.App.EVMKeeper.TxConfig( + suite.network.GetContext(), + common.Hash{}, + ) + + recipient := suite.keyring.GetAddr(1) + msg, err := suite.factory.GenerateGethCoreMsg(sender.Priv, types.EvmTxArgs{ + To: &recipient, + Amount: big.NewInt(100), + }) + suite.Require().NoError(err) + + testCases := []struct { + name string + stateOverride types.StateOverride + }{ + { + name: "fail - override precompile balance", + stateOverride: types.StateOverride{ + ecrecoverAddr: types.OverrideAccount{ + Balance: (*hexutil.Big)(big.NewInt(1e18)), + }, + }, + }, + { + name: "fail - override precompile code", + stateOverride: types.StateOverride{ + ecrecoverAddr: types.OverrideAccount{ + Code: func() *hexutil.Bytes { b := hexutil.Bytes([]byte{0x60, 0x00}); return &b }(), + }, + }, + }, + { + name: "fail - override precompile nonce", + stateOverride: types.StateOverride{ + ecrecoverAddr: types.OverrideAccount{ + Nonce: func() *hexutil.Uint64 { n := hexutil.Uint64(1); return &n }(), + }, + }, + }, + { + name: "fail - override precompile state", + stateOverride: types.StateOverride{ + ecrecoverAddr: types.OverrideAccount{ + State: map[common.Hash]common.Hash{ + common.HexToHash("0x01"): common.HexToHash("0x02"), + }, + }, + }, + }, + { + name: "fail - override precompile stateDiff", + stateOverride: types.StateOverride{ + ecrecoverAddr: types.OverrideAccount{ + StateDiff: map[common.Hash]common.Hash{ + common.HexToHash("0x01"): common.HexToHash("0x02"), + }, + }, + }, + }, + } + + for _, tc := range testCases { + suite.Run(tc.name, func() { + _, err := suite.network.App.EVMKeeper.ApplyMessageWithConfig( + suite.network.GetContext(), + *msg, + nil, + false, + config, + txConfig, + tc.stateOverride, + ) + suite.Require().Error(err) + suite.Require().Contains(err.Error(), "is a precompile, state override is not allowed") + }) + } +} + func (suite *KeeperTestSuite) TestGetProposerAddress() { suite.SetupTest() address := sdk.ConsAddress(suite.keyring.GetAddr(0).Bytes()) From a097b38621eec582b9702e6c5be635a9908e940a Mon Sep 17 00:00:00 2001 From: Aleksei Kokinos Date: Tue, 17 Feb 2026 19:31:14 +0700 Subject: [PATCH 16/19] gen new proto type TacSimulateResponse --- api/cosmos/evm/vm/v1/query.pulsar.go | 1536 +++++++++++++++++++------ api/cosmos/evm/vm/v1/query_grpc.pb.go | 10 +- proto/cosmos/evm/vm/v1/query.proto | 20 +- x/vm/types/query.pb.go | 662 +++++++++-- 4 files changed, 1780 insertions(+), 448 deletions(-) diff --git a/api/cosmos/evm/vm/v1/query.pulsar.go b/api/cosmos/evm/vm/v1/query.pulsar.go index f63396451..4f0ce6dc7 100644 --- a/api/cosmos/evm/vm/v1/query.pulsar.go +++ b/api/cosmos/evm/vm/v1/query.pulsar.go @@ -9315,6 +9315,790 @@ func (x *fastReflection_TacSimulateRequest) ProtoMethods() *protoiface.Methods { } } +var _ protoreflect.List = (*_TacSimulateResponse_2_list)(nil) + +type _TacSimulateResponse_2_list struct { + list *[]*Log +} + +func (x *_TacSimulateResponse_2_list) Len() int { + if x.list == nil { + return 0 + } + return len(*x.list) +} + +func (x *_TacSimulateResponse_2_list) Get(i int) protoreflect.Value { + return protoreflect.ValueOfMessage((*x.list)[i].ProtoReflect()) +} + +func (x *_TacSimulateResponse_2_list) Set(i int, value protoreflect.Value) { + valueUnwrapped := value.Message() + concreteValue := valueUnwrapped.Interface().(*Log) + (*x.list)[i] = concreteValue +} + +func (x *_TacSimulateResponse_2_list) Append(value protoreflect.Value) { + valueUnwrapped := value.Message() + concreteValue := valueUnwrapped.Interface().(*Log) + *x.list = append(*x.list, concreteValue) +} + +func (x *_TacSimulateResponse_2_list) AppendMutable() protoreflect.Value { + v := new(Log) + *x.list = append(*x.list, v) + return protoreflect.ValueOfMessage(v.ProtoReflect()) +} + +func (x *_TacSimulateResponse_2_list) Truncate(n int) { + for i := n; i < len(*x.list); i++ { + (*x.list)[i] = nil + } + *x.list = (*x.list)[:n] +} + +func (x *_TacSimulateResponse_2_list) NewElement() protoreflect.Value { + v := new(Log) + return protoreflect.ValueOfMessage(v.ProtoReflect()) +} + +func (x *_TacSimulateResponse_2_list) IsValid() bool { + return x.list != nil +} + +var ( + md_TacSimulateResponse protoreflect.MessageDescriptor + fd_TacSimulateResponse_hash protoreflect.FieldDescriptor + fd_TacSimulateResponse_logs protoreflect.FieldDescriptor + fd_TacSimulateResponse_ret protoreflect.FieldDescriptor + fd_TacSimulateResponse_vm_error protoreflect.FieldDescriptor + fd_TacSimulateResponse_gas_used protoreflect.FieldDescriptor + fd_TacSimulateResponse_gas_estimated protoreflect.FieldDescriptor +) + +func init() { + file_cosmos_evm_vm_v1_query_proto_init() + md_TacSimulateResponse = File_cosmos_evm_vm_v1_query_proto.Messages().ByName("TacSimulateResponse") + fd_TacSimulateResponse_hash = md_TacSimulateResponse.Fields().ByName("hash") + fd_TacSimulateResponse_logs = md_TacSimulateResponse.Fields().ByName("logs") + fd_TacSimulateResponse_ret = md_TacSimulateResponse.Fields().ByName("ret") + fd_TacSimulateResponse_vm_error = md_TacSimulateResponse.Fields().ByName("vm_error") + fd_TacSimulateResponse_gas_used = md_TacSimulateResponse.Fields().ByName("gas_used") + fd_TacSimulateResponse_gas_estimated = md_TacSimulateResponse.Fields().ByName("gas_estimated") +} + +var _ protoreflect.Message = (*fastReflection_TacSimulateResponse)(nil) + +type fastReflection_TacSimulateResponse TacSimulateResponse + +func (x *TacSimulateResponse) ProtoReflect() protoreflect.Message { + return (*fastReflection_TacSimulateResponse)(x) +} + +func (x *TacSimulateResponse) slowProtoReflect() protoreflect.Message { + mi := &file_cosmos_evm_vm_v1_query_proto_msgTypes[20] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +var _fastReflection_TacSimulateResponse_messageType fastReflection_TacSimulateResponse_messageType +var _ protoreflect.MessageType = fastReflection_TacSimulateResponse_messageType{} + +type fastReflection_TacSimulateResponse_messageType struct{} + +func (x fastReflection_TacSimulateResponse_messageType) Zero() protoreflect.Message { + return (*fastReflection_TacSimulateResponse)(nil) +} +func (x fastReflection_TacSimulateResponse_messageType) New() protoreflect.Message { + return new(fastReflection_TacSimulateResponse) +} +func (x fastReflection_TacSimulateResponse_messageType) Descriptor() protoreflect.MessageDescriptor { + return md_TacSimulateResponse +} + +// Descriptor returns message descriptor, which contains only the protobuf +// type information for the message. +func (x *fastReflection_TacSimulateResponse) Descriptor() protoreflect.MessageDescriptor { + return md_TacSimulateResponse +} + +// Type returns the message type, which encapsulates both Go and protobuf +// type information. If the Go type information is not needed, +// it is recommended that the message descriptor be used instead. +func (x *fastReflection_TacSimulateResponse) Type() protoreflect.MessageType { + return _fastReflection_TacSimulateResponse_messageType +} + +// New returns a newly allocated and mutable empty message. +func (x *fastReflection_TacSimulateResponse) New() protoreflect.Message { + return new(fastReflection_TacSimulateResponse) +} + +// Interface unwraps the message reflection interface and +// returns the underlying ProtoMessage interface. +func (x *fastReflection_TacSimulateResponse) Interface() protoreflect.ProtoMessage { + return (*TacSimulateResponse)(x) +} + +// Range iterates over every populated field in an undefined order, +// calling f for each field descriptor and value encountered. +// Range returns immediately if f returns false. +// While iterating, mutating operations may only be performed +// on the current field descriptor. +func (x *fastReflection_TacSimulateResponse) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { + if x.Hash != "" { + value := protoreflect.ValueOfString(x.Hash) + if !f(fd_TacSimulateResponse_hash, value) { + return + } + } + if len(x.Logs) != 0 { + value := protoreflect.ValueOfList(&_TacSimulateResponse_2_list{list: &x.Logs}) + if !f(fd_TacSimulateResponse_logs, value) { + return + } + } + if len(x.Ret) != 0 { + value := protoreflect.ValueOfBytes(x.Ret) + if !f(fd_TacSimulateResponse_ret, value) { + return + } + } + if x.VmError != "" { + value := protoreflect.ValueOfString(x.VmError) + if !f(fd_TacSimulateResponse_vm_error, value) { + return + } + } + if x.GasUsed != uint64(0) { + value := protoreflect.ValueOfUint64(x.GasUsed) + if !f(fd_TacSimulateResponse_gas_used, value) { + return + } + } + if x.GasEstimated != uint64(0) { + value := protoreflect.ValueOfUint64(x.GasEstimated) + if !f(fd_TacSimulateResponse_gas_estimated, value) { + return + } + } +} + +// Has reports whether a field is populated. +// +// Some fields have the property of nullability where it is possible to +// distinguish between the default value of a field and whether the field +// was explicitly populated with the default value. Singular message fields, +// member fields of a oneof, and proto2 scalar fields are nullable. Such +// fields are populated only if explicitly set. +// +// In other cases (aside from the nullable cases above), +// a proto3 scalar field is populated if it contains a non-zero value, and +// a repeated field is populated if it is non-empty. +func (x *fastReflection_TacSimulateResponse) Has(fd protoreflect.FieldDescriptor) bool { + switch fd.FullName() { + case "cosmos.evm.vm.v1.TacSimulateResponse.hash": + return x.Hash != "" + case "cosmos.evm.vm.v1.TacSimulateResponse.logs": + return len(x.Logs) != 0 + case "cosmos.evm.vm.v1.TacSimulateResponse.ret": + return len(x.Ret) != 0 + case "cosmos.evm.vm.v1.TacSimulateResponse.vm_error": + return x.VmError != "" + case "cosmos.evm.vm.v1.TacSimulateResponse.gas_used": + return x.GasUsed != uint64(0) + case "cosmos.evm.vm.v1.TacSimulateResponse.gas_estimated": + return x.GasEstimated != uint64(0) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.evm.vm.v1.TacSimulateResponse")) + } + panic(fmt.Errorf("message cosmos.evm.vm.v1.TacSimulateResponse does not contain field %s", fd.FullName())) + } +} + +// Clear clears the field such that a subsequent Has call reports false. +// +// Clearing an extension field clears both the extension type and value +// associated with the given field number. +// +// Clear is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_TacSimulateResponse) Clear(fd protoreflect.FieldDescriptor) { + switch fd.FullName() { + case "cosmos.evm.vm.v1.TacSimulateResponse.hash": + x.Hash = "" + case "cosmos.evm.vm.v1.TacSimulateResponse.logs": + x.Logs = nil + case "cosmos.evm.vm.v1.TacSimulateResponse.ret": + x.Ret = nil + case "cosmos.evm.vm.v1.TacSimulateResponse.vm_error": + x.VmError = "" + case "cosmos.evm.vm.v1.TacSimulateResponse.gas_used": + x.GasUsed = uint64(0) + case "cosmos.evm.vm.v1.TacSimulateResponse.gas_estimated": + x.GasEstimated = uint64(0) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.evm.vm.v1.TacSimulateResponse")) + } + panic(fmt.Errorf("message cosmos.evm.vm.v1.TacSimulateResponse does not contain field %s", fd.FullName())) + } +} + +// Get retrieves the value for a field. +// +// For unpopulated scalars, it returns the default value, where +// the default value of a bytes scalar is guaranteed to be a copy. +// For unpopulated composite types, it returns an empty, read-only view +// of the value; to obtain a mutable reference, use Mutable. +func (x *fastReflection_TacSimulateResponse) Get(descriptor protoreflect.FieldDescriptor) protoreflect.Value { + switch descriptor.FullName() { + case "cosmos.evm.vm.v1.TacSimulateResponse.hash": + value := x.Hash + return protoreflect.ValueOfString(value) + case "cosmos.evm.vm.v1.TacSimulateResponse.logs": + if len(x.Logs) == 0 { + return protoreflect.ValueOfList(&_TacSimulateResponse_2_list{}) + } + listValue := &_TacSimulateResponse_2_list{list: &x.Logs} + return protoreflect.ValueOfList(listValue) + case "cosmos.evm.vm.v1.TacSimulateResponse.ret": + value := x.Ret + return protoreflect.ValueOfBytes(value) + case "cosmos.evm.vm.v1.TacSimulateResponse.vm_error": + value := x.VmError + return protoreflect.ValueOfString(value) + case "cosmos.evm.vm.v1.TacSimulateResponse.gas_used": + value := x.GasUsed + return protoreflect.ValueOfUint64(value) + case "cosmos.evm.vm.v1.TacSimulateResponse.gas_estimated": + value := x.GasEstimated + return protoreflect.ValueOfUint64(value) + default: + if descriptor.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.evm.vm.v1.TacSimulateResponse")) + } + panic(fmt.Errorf("message cosmos.evm.vm.v1.TacSimulateResponse does not contain field %s", descriptor.FullName())) + } +} + +// Set stores the value for a field. +// +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType. +// When setting a composite type, it is unspecified whether the stored value +// aliases the source's memory in any way. If the composite value is an +// empty, read-only value, then it panics. +// +// Set is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_TacSimulateResponse) Set(fd protoreflect.FieldDescriptor, value protoreflect.Value) { + switch fd.FullName() { + case "cosmos.evm.vm.v1.TacSimulateResponse.hash": + x.Hash = value.Interface().(string) + case "cosmos.evm.vm.v1.TacSimulateResponse.logs": + lv := value.List() + clv := lv.(*_TacSimulateResponse_2_list) + x.Logs = *clv.list + case "cosmos.evm.vm.v1.TacSimulateResponse.ret": + x.Ret = value.Bytes() + case "cosmos.evm.vm.v1.TacSimulateResponse.vm_error": + x.VmError = value.Interface().(string) + case "cosmos.evm.vm.v1.TacSimulateResponse.gas_used": + x.GasUsed = value.Uint() + case "cosmos.evm.vm.v1.TacSimulateResponse.gas_estimated": + x.GasEstimated = value.Uint() + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.evm.vm.v1.TacSimulateResponse")) + } + panic(fmt.Errorf("message cosmos.evm.vm.v1.TacSimulateResponse does not contain field %s", fd.FullName())) + } +} + +// Mutable returns a mutable reference to a composite type. +// +// If the field is unpopulated, it may allocate a composite value. +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType +// if not already stored. +// It panics if the field does not contain a composite type. +// +// Mutable is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_TacSimulateResponse) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "cosmos.evm.vm.v1.TacSimulateResponse.logs": + if x.Logs == nil { + x.Logs = []*Log{} + } + value := &_TacSimulateResponse_2_list{list: &x.Logs} + return protoreflect.ValueOfList(value) + case "cosmos.evm.vm.v1.TacSimulateResponse.hash": + panic(fmt.Errorf("field hash of message cosmos.evm.vm.v1.TacSimulateResponse is not mutable")) + case "cosmos.evm.vm.v1.TacSimulateResponse.ret": + panic(fmt.Errorf("field ret of message cosmos.evm.vm.v1.TacSimulateResponse is not mutable")) + case "cosmos.evm.vm.v1.TacSimulateResponse.vm_error": + panic(fmt.Errorf("field vm_error of message cosmos.evm.vm.v1.TacSimulateResponse is not mutable")) + case "cosmos.evm.vm.v1.TacSimulateResponse.gas_used": + panic(fmt.Errorf("field gas_used of message cosmos.evm.vm.v1.TacSimulateResponse is not mutable")) + case "cosmos.evm.vm.v1.TacSimulateResponse.gas_estimated": + panic(fmt.Errorf("field gas_estimated of message cosmos.evm.vm.v1.TacSimulateResponse is not mutable")) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.evm.vm.v1.TacSimulateResponse")) + } + panic(fmt.Errorf("message cosmos.evm.vm.v1.TacSimulateResponse does not contain field %s", fd.FullName())) + } +} + +// NewField returns a new value that is assignable to the field +// for the given descriptor. For scalars, this returns the default value. +// For lists, maps, and messages, this returns a new, empty, mutable value. +func (x *fastReflection_TacSimulateResponse) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "cosmos.evm.vm.v1.TacSimulateResponse.hash": + return protoreflect.ValueOfString("") + case "cosmos.evm.vm.v1.TacSimulateResponse.logs": + list := []*Log{} + return protoreflect.ValueOfList(&_TacSimulateResponse_2_list{list: &list}) + case "cosmos.evm.vm.v1.TacSimulateResponse.ret": + return protoreflect.ValueOfBytes(nil) + case "cosmos.evm.vm.v1.TacSimulateResponse.vm_error": + return protoreflect.ValueOfString("") + case "cosmos.evm.vm.v1.TacSimulateResponse.gas_used": + return protoreflect.ValueOfUint64(uint64(0)) + case "cosmos.evm.vm.v1.TacSimulateResponse.gas_estimated": + return protoreflect.ValueOfUint64(uint64(0)) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.evm.vm.v1.TacSimulateResponse")) + } + panic(fmt.Errorf("message cosmos.evm.vm.v1.TacSimulateResponse does not contain field %s", fd.FullName())) + } +} + +// WhichOneof reports which field within the oneof is populated, +// returning nil if none are populated. +// It panics if the oneof descriptor does not belong to this message. +func (x *fastReflection_TacSimulateResponse) WhichOneof(d protoreflect.OneofDescriptor) protoreflect.FieldDescriptor { + switch d.FullName() { + default: + panic(fmt.Errorf("%s is not a oneof field in cosmos.evm.vm.v1.TacSimulateResponse", d.FullName())) + } + panic("unreachable") +} + +// GetUnknown retrieves the entire list of unknown fields. +// The caller may only mutate the contents of the RawFields +// if the mutated bytes are stored back into the message with SetUnknown. +func (x *fastReflection_TacSimulateResponse) GetUnknown() protoreflect.RawFields { + return x.unknownFields +} + +// SetUnknown stores an entire list of unknown fields. +// The raw fields must be syntactically valid according to the wire format. +// An implementation may panic if this is not the case. +// Once stored, the caller must not mutate the content of the RawFields. +// An empty RawFields may be passed to clear the fields. +// +// SetUnknown is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_TacSimulateResponse) SetUnknown(fields protoreflect.RawFields) { + x.unknownFields = fields +} + +// IsValid reports whether the message is valid. +// +// An invalid message is an empty, read-only value. +// +// An invalid message often corresponds to a nil pointer of the concrete +// message type, but the details are implementation dependent. +// Validity is not part of the protobuf data model, and may not +// be preserved in marshaling or other operations. +func (x *fastReflection_TacSimulateResponse) IsValid() bool { + return x != nil +} + +// ProtoMethods returns optional fastReflectionFeature-path implementations of various operations. +// This method may return nil. +// +// The returned methods type is identical to +// "google.golang.org/protobuf/runtime/protoiface".Methods. +// Consult the protoiface package documentation for details. +func (x *fastReflection_TacSimulateResponse) ProtoMethods() *protoiface.Methods { + size := func(input protoiface.SizeInput) protoiface.SizeOutput { + x := input.Message.Interface().(*TacSimulateResponse) + if x == nil { + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: 0, + } + } + options := runtime.SizeInputToOptions(input) + _ = options + var n int + var l int + _ = l + l = len(x.Hash) + if l > 0 { + n += 1 + l + runtime.Sov(uint64(l)) + } + if len(x.Logs) > 0 { + for _, e := range x.Logs { + l = options.Size(e) + n += 1 + l + runtime.Sov(uint64(l)) + } + } + l = len(x.Ret) + if l > 0 { + n += 1 + l + runtime.Sov(uint64(l)) + } + l = len(x.VmError) + if l > 0 { + n += 1 + l + runtime.Sov(uint64(l)) + } + if x.GasUsed != 0 { + n += 1 + runtime.Sov(uint64(x.GasUsed)) + } + if x.GasEstimated != 0 { + n += 1 + runtime.Sov(uint64(x.GasEstimated)) + } + if x.unknownFields != nil { + n += len(x.unknownFields) + } + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: n, + } + } + + marshal := func(input protoiface.MarshalInput) (protoiface.MarshalOutput, error) { + x := input.Message.Interface().(*TacSimulateResponse) + if x == nil { + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + options := runtime.MarshalInputToOptions(input) + _ = options + size := options.Size(x) + dAtA := make([]byte, size) + i := len(dAtA) + _ = i + var l int + _ = l + if x.unknownFields != nil { + i -= len(x.unknownFields) + copy(dAtA[i:], x.unknownFields) + } + if x.GasEstimated != 0 { + i = runtime.EncodeVarint(dAtA, i, uint64(x.GasEstimated)) + i-- + dAtA[i] = 0x30 + } + if x.GasUsed != 0 { + i = runtime.EncodeVarint(dAtA, i, uint64(x.GasUsed)) + i-- + dAtA[i] = 0x28 + } + if len(x.VmError) > 0 { + i -= len(x.VmError) + copy(dAtA[i:], x.VmError) + i = runtime.EncodeVarint(dAtA, i, uint64(len(x.VmError))) + i-- + dAtA[i] = 0x22 + } + if len(x.Ret) > 0 { + i -= len(x.Ret) + copy(dAtA[i:], x.Ret) + i = runtime.EncodeVarint(dAtA, i, uint64(len(x.Ret))) + i-- + dAtA[i] = 0x1a + } + if len(x.Logs) > 0 { + for iNdEx := len(x.Logs) - 1; iNdEx >= 0; iNdEx-- { + encoded, err := options.Marshal(x.Logs[iNdEx]) + if err != nil { + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, err + } + i -= len(encoded) + copy(dAtA[i:], encoded) + i = runtime.EncodeVarint(dAtA, i, uint64(len(encoded))) + i-- + dAtA[i] = 0x12 + } + } + if len(x.Hash) > 0 { + i -= len(x.Hash) + copy(dAtA[i:], x.Hash) + i = runtime.EncodeVarint(dAtA, i, uint64(len(x.Hash))) + i-- + dAtA[i] = 0xa + } + if input.Buf != nil { + input.Buf = append(input.Buf, dAtA...) + } else { + input.Buf = dAtA + } + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + unmarshal := func(input protoiface.UnmarshalInput) (protoiface.UnmarshalOutput, error) { + x := input.Message.Interface().(*TacSimulateResponse) + if x == nil { + return protoiface.UnmarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Flags: input.Flags, + }, nil + } + options := runtime.UnmarshalInputToOptions(input) + _ = options + dAtA := input.Buf + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, 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 protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: TacSimulateResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: TacSimulateResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field Hash", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if postIndex > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + x.Hash = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field Logs", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if postIndex > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + x.Logs = append(x.Logs, &Log{}) + if err := options.Unmarshal(dAtA[iNdEx:postIndex], x.Logs[len(x.Logs)-1]); err != nil { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field Ret", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if postIndex > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + x.Ret = append(x.Ret[:0], dAtA[iNdEx:postIndex]...) + if x.Ret == nil { + x.Ret = []byte{} + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field VmError", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if postIndex > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + x.VmError = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 5: + if wireType != 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field GasUsed", wireType) + } + x.GasUsed = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + x.GasUsed |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 6: + if wireType != 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field GasEstimated", wireType) + } + x.GasEstimated = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + x.GasEstimated |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := runtime.Skip(dAtA[iNdEx:]) + if err != nil { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + if !options.DiscardUnknown { + x.unknownFields = append(x.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + } + iNdEx += skippy + } + } + + if iNdEx > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, nil + } + return &protoiface.Methods{ + NoUnkeyedLiterals: struct{}{}, + Flags: protoiface.SupportMarshalDeterministic | protoiface.SupportUnmarshalDiscardUnknown, + Size: size, + Marshal: marshal, + Unmarshal: unmarshal, + Merge: nil, + CheckInitialized: nil, + } +} + var ( md_EstimateGasResponse protoreflect.MessageDescriptor fd_EstimateGasResponse_gas protoreflect.FieldDescriptor @@ -9339,7 +10123,7 @@ func (x *EstimateGasResponse) ProtoReflect() protoreflect.Message { } func (x *EstimateGasResponse) slowProtoReflect() protoreflect.Message { - mi := &file_cosmos_evm_vm_v1_query_proto_msgTypes[20] + mi := &file_cosmos_evm_vm_v1_query_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9936,7 +10720,7 @@ func (x *QueryTraceTxRequest) ProtoReflect() protoreflect.Message { } func (x *QueryTraceTxRequest) slowProtoReflect() protoreflect.Message { - mi := &file_cosmos_evm_vm_v1_query_proto_msgTypes[21] + mi := &file_cosmos_evm_vm_v1_query_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10874,7 +11658,7 @@ func (x *QueryTraceTxResponse) ProtoReflect() protoreflect.Message { } func (x *QueryTraceTxResponse) slowProtoReflect() protoreflect.Message { - mi := &file_cosmos_evm_vm_v1_query_proto_msgTypes[22] + mi := &file_cosmos_evm_vm_v1_query_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11361,7 +12145,7 @@ func (x *QueryTraceBlockRequest) ProtoReflect() protoreflect.Message { } func (x *QueryTraceBlockRequest) slowProtoReflect() protoreflect.Message { - mi := &file_cosmos_evm_vm_v1_query_proto_msgTypes[23] + mi := &file_cosmos_evm_vm_v1_query_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12222,7 +13006,7 @@ func (x *QueryTraceBlockResponse) ProtoReflect() protoreflect.Message { } func (x *QueryTraceBlockResponse) slowProtoReflect() protoreflect.Message { - mi := &file_cosmos_evm_vm_v1_query_proto_msgTypes[24] + mi := &file_cosmos_evm_vm_v1_query_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12642,7 +13426,7 @@ func (x *QueryBaseFeeRequest) ProtoReflect() protoreflect.Message { } func (x *QueryBaseFeeRequest) slowProtoReflect() protoreflect.Message { - mi := &file_cosmos_evm_vm_v1_query_proto_msgTypes[25] + mi := &file_cosmos_evm_vm_v1_query_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13000,7 +13784,7 @@ func (x *QueryBaseFeeResponse) ProtoReflect() protoreflect.Message { } func (x *QueryBaseFeeResponse) slowProtoReflect() protoreflect.Message { - mi := &file_cosmos_evm_vm_v1_query_proto_msgTypes[26] + mi := &file_cosmos_evm_vm_v1_query_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13418,7 +14202,7 @@ func (x *QueryGlobalMinGasPriceRequest) ProtoReflect() protoreflect.Message { } func (x *QueryGlobalMinGasPriceRequest) slowProtoReflect() protoreflect.Message { - mi := &file_cosmos_evm_vm_v1_query_proto_msgTypes[27] + mi := &file_cosmos_evm_vm_v1_query_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13776,7 +14560,7 @@ func (x *QueryGlobalMinGasPriceResponse) ProtoReflect() protoreflect.Message { } func (x *QueryGlobalMinGasPriceResponse) slowProtoReflect() protoreflect.Message { - mi := &file_cosmos_evm_vm_v1_query_proto_msgTypes[28] + mi := &file_cosmos_evm_vm_v1_query_proto_msgTypes[29] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15059,6 +15843,90 @@ func (x *TacSimulateRequest) GetChainId() int64 { return 0 } +// TacSimulateResponse defines TacSimulate response +type TacSimulateResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // hash of the ethereum transaction in hex format + Hash string `protobuf:"bytes,1,opt,name=hash,proto3" json:"hash,omitempty"` + // logs contains the proto-compatible ethereum logs + Logs []*Log `protobuf:"bytes,2,rep,name=logs,proto3" json:"logs,omitempty"` + // ret is the returned data from evm function (result or data supplied with + // revert opcode) + Ret []byte `protobuf:"bytes,3,opt,name=ret,proto3" json:"ret,omitempty"` + // vm_error is the error returned by vm execution + VmError string `protobuf:"bytes,4,opt,name=vm_error,json=vmError,proto3" json:"vm_error,omitempty"` + // gas_used specifies how much gas was consumed by the EVM execution + GasUsed uint64 `protobuf:"varint,5,opt,name=gas_used,json=gasUsed,proto3" json:"gas_used,omitempty"` + // gas_estimated is the estimated minimum gas limit needed to execute + // the transaction successfully (result of binary search, like eth_estimateGas) + GasEstimated uint64 `protobuf:"varint,6,opt,name=gas_estimated,json=gasEstimated,proto3" json:"gas_estimated,omitempty"` +} + +func (x *TacSimulateResponse) Reset() { + *x = TacSimulateResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_cosmos_evm_vm_v1_query_proto_msgTypes[20] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TacSimulateResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TacSimulateResponse) ProtoMessage() {} + +// Deprecated: Use TacSimulateResponse.ProtoReflect.Descriptor instead. +func (*TacSimulateResponse) Descriptor() ([]byte, []int) { + return file_cosmos_evm_vm_v1_query_proto_rawDescGZIP(), []int{20} +} + +func (x *TacSimulateResponse) GetHash() string { + if x != nil { + return x.Hash + } + return "" +} + +func (x *TacSimulateResponse) GetLogs() []*Log { + if x != nil { + return x.Logs + } + return nil +} + +func (x *TacSimulateResponse) GetRet() []byte { + if x != nil { + return x.Ret + } + return nil +} + +func (x *TacSimulateResponse) GetVmError() string { + if x != nil { + return x.VmError + } + return "" +} + +func (x *TacSimulateResponse) GetGasUsed() uint64 { + if x != nil { + return x.GasUsed + } + return 0 +} + +func (x *TacSimulateResponse) GetGasEstimated() uint64 { + if x != nil { + return x.GasEstimated + } + return 0 +} + // EstimateGasResponse defines EstimateGas response type EstimateGasResponse struct { state protoimpl.MessageState @@ -15077,7 +15945,7 @@ type EstimateGasResponse struct { func (x *EstimateGasResponse) Reset() { *x = EstimateGasResponse{} if protoimpl.UnsafeEnabled { - mi := &file_cosmos_evm_vm_v1_query_proto_msgTypes[20] + mi := &file_cosmos_evm_vm_v1_query_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15091,7 +15959,7 @@ func (*EstimateGasResponse) ProtoMessage() {} // Deprecated: Use EstimateGasResponse.ProtoReflect.Descriptor instead. func (*EstimateGasResponse) Descriptor() ([]byte, []int) { - return file_cosmos_evm_vm_v1_query_proto_rawDescGZIP(), []int{20} + return file_cosmos_evm_vm_v1_query_proto_rawDescGZIP(), []int{21} } func (x *EstimateGasResponse) GetGas() uint64 { @@ -15145,7 +16013,7 @@ type QueryTraceTxRequest struct { func (x *QueryTraceTxRequest) Reset() { *x = QueryTraceTxRequest{} if protoimpl.UnsafeEnabled { - mi := &file_cosmos_evm_vm_v1_query_proto_msgTypes[21] + mi := &file_cosmos_evm_vm_v1_query_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15159,7 +16027,7 @@ func (*QueryTraceTxRequest) ProtoMessage() {} // Deprecated: Use QueryTraceTxRequest.ProtoReflect.Descriptor instead. func (*QueryTraceTxRequest) Descriptor() ([]byte, []int) { - return file_cosmos_evm_vm_v1_query_proto_rawDescGZIP(), []int{21} + return file_cosmos_evm_vm_v1_query_proto_rawDescGZIP(), []int{22} } func (x *QueryTraceTxRequest) GetMsg() *MsgEthereumTx { @@ -15238,7 +16106,7 @@ type QueryTraceTxResponse struct { func (x *QueryTraceTxResponse) Reset() { *x = QueryTraceTxResponse{} if protoimpl.UnsafeEnabled { - mi := &file_cosmos_evm_vm_v1_query_proto_msgTypes[22] + mi := &file_cosmos_evm_vm_v1_query_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15252,7 +16120,7 @@ func (*QueryTraceTxResponse) ProtoMessage() {} // Deprecated: Use QueryTraceTxResponse.ProtoReflect.Descriptor instead. func (*QueryTraceTxResponse) Descriptor() ([]byte, []int) { - return file_cosmos_evm_vm_v1_query_proto_rawDescGZIP(), []int{22} + return file_cosmos_evm_vm_v1_query_proto_rawDescGZIP(), []int{23} } func (x *QueryTraceTxResponse) GetData() []byte { @@ -15289,7 +16157,7 @@ type QueryTraceBlockRequest struct { func (x *QueryTraceBlockRequest) Reset() { *x = QueryTraceBlockRequest{} if protoimpl.UnsafeEnabled { - mi := &file_cosmos_evm_vm_v1_query_proto_msgTypes[23] + mi := &file_cosmos_evm_vm_v1_query_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15303,7 +16171,7 @@ func (*QueryTraceBlockRequest) ProtoMessage() {} // Deprecated: Use QueryTraceBlockRequest.ProtoReflect.Descriptor instead. func (*QueryTraceBlockRequest) Descriptor() ([]byte, []int) { - return file_cosmos_evm_vm_v1_query_proto_rawDescGZIP(), []int{23} + return file_cosmos_evm_vm_v1_query_proto_rawDescGZIP(), []int{24} } func (x *QueryTraceBlockRequest) GetTxs() []*MsgEthereumTx { @@ -15375,7 +16243,7 @@ type QueryTraceBlockResponse struct { func (x *QueryTraceBlockResponse) Reset() { *x = QueryTraceBlockResponse{} if protoimpl.UnsafeEnabled { - mi := &file_cosmos_evm_vm_v1_query_proto_msgTypes[24] + mi := &file_cosmos_evm_vm_v1_query_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15389,7 +16257,7 @@ func (*QueryTraceBlockResponse) ProtoMessage() {} // Deprecated: Use QueryTraceBlockResponse.ProtoReflect.Descriptor instead. func (*QueryTraceBlockResponse) Descriptor() ([]byte, []int) { - return file_cosmos_evm_vm_v1_query_proto_rawDescGZIP(), []int{24} + return file_cosmos_evm_vm_v1_query_proto_rawDescGZIP(), []int{25} } func (x *QueryTraceBlockResponse) GetData() []byte { @@ -15410,7 +16278,7 @@ type QueryBaseFeeRequest struct { func (x *QueryBaseFeeRequest) Reset() { *x = QueryBaseFeeRequest{} if protoimpl.UnsafeEnabled { - mi := &file_cosmos_evm_vm_v1_query_proto_msgTypes[25] + mi := &file_cosmos_evm_vm_v1_query_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15424,7 +16292,7 @@ func (*QueryBaseFeeRequest) ProtoMessage() {} // Deprecated: Use QueryBaseFeeRequest.ProtoReflect.Descriptor instead. func (*QueryBaseFeeRequest) Descriptor() ([]byte, []int) { - return file_cosmos_evm_vm_v1_query_proto_rawDescGZIP(), []int{25} + return file_cosmos_evm_vm_v1_query_proto_rawDescGZIP(), []int{26} } // QueryBaseFeeResponse returns the EIP1559 base fee. @@ -15440,7 +16308,7 @@ type QueryBaseFeeResponse struct { func (x *QueryBaseFeeResponse) Reset() { *x = QueryBaseFeeResponse{} if protoimpl.UnsafeEnabled { - mi := &file_cosmos_evm_vm_v1_query_proto_msgTypes[26] + mi := &file_cosmos_evm_vm_v1_query_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15454,7 +16322,7 @@ func (*QueryBaseFeeResponse) ProtoMessage() {} // Deprecated: Use QueryBaseFeeResponse.ProtoReflect.Descriptor instead. func (*QueryBaseFeeResponse) Descriptor() ([]byte, []int) { - return file_cosmos_evm_vm_v1_query_proto_rawDescGZIP(), []int{26} + return file_cosmos_evm_vm_v1_query_proto_rawDescGZIP(), []int{27} } func (x *QueryBaseFeeResponse) GetBaseFee() string { @@ -15475,7 +16343,7 @@ type QueryGlobalMinGasPriceRequest struct { func (x *QueryGlobalMinGasPriceRequest) Reset() { *x = QueryGlobalMinGasPriceRequest{} if protoimpl.UnsafeEnabled { - mi := &file_cosmos_evm_vm_v1_query_proto_msgTypes[27] + mi := &file_cosmos_evm_vm_v1_query_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15489,7 +16357,7 @@ func (*QueryGlobalMinGasPriceRequest) ProtoMessage() {} // Deprecated: Use QueryGlobalMinGasPriceRequest.ProtoReflect.Descriptor instead. func (*QueryGlobalMinGasPriceRequest) Descriptor() ([]byte, []int) { - return file_cosmos_evm_vm_v1_query_proto_rawDescGZIP(), []int{27} + return file_cosmos_evm_vm_v1_query_proto_rawDescGZIP(), []int{28} } // QueryGlobalMinGasPriceResponse returns the GlobalMinGasPrice @@ -15505,7 +16373,7 @@ type QueryGlobalMinGasPriceResponse struct { func (x *QueryGlobalMinGasPriceResponse) Reset() { *x = QueryGlobalMinGasPriceResponse{} if protoimpl.UnsafeEnabled { - mi := &file_cosmos_evm_vm_v1_query_proto_msgTypes[28] + mi := &file_cosmos_evm_vm_v1_query_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15519,7 +16387,7 @@ func (*QueryGlobalMinGasPriceResponse) ProtoMessage() {} // Deprecated: Use QueryGlobalMinGasPriceResponse.ProtoReflect.Descriptor instead. func (*QueryGlobalMinGasPriceResponse) Descriptor() ([]byte, []int) { - return file_cosmos_evm_vm_v1_query_proto_rawDescGZIP(), []int{28} + return file_cosmos_evm_vm_v1_query_proto_rawDescGZIP(), []int{29} } func (x *QueryGlobalMinGasPriceResponse) GetMinGasPrice() string { @@ -15659,234 +16527,246 @@ var file_cosmos_evm_vm_v1_query_proto_rawDesc = []byte{ 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x22, 0x54, - 0x0a, 0x13, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x47, 0x61, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x03, 0x67, 0x61, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x72, 0x65, 0x74, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x72, 0x65, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x76, 0x6d, 0x5f, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x6d, 0x45, - 0x72, 0x72, 0x6f, 0x72, 0x22, 0x89, 0x04, 0x0a, 0x13, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, - 0x61, 0x63, 0x65, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x31, 0x0a, 0x03, - 0x6d, 0x73, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x63, 0x6f, 0x73, 0x6d, - 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, - 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x54, 0x78, 0x52, 0x03, 0x6d, 0x73, 0x67, 0x12, - 0x40, 0x0a, 0x0c, 0x74, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, - 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x65, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0b, 0x74, 0x72, 0x61, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x12, 0x43, 0x0a, 0x0c, 0x70, 0x72, 0x65, 0x64, 0x65, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, - 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, - 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x45, 0x74, - 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x54, 0x78, 0x52, 0x0c, 0x70, 0x72, 0x65, 0x64, 0x65, 0x63, - 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, - 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x62, 0x6c, - 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x6c, 0x6f, - 0x63, 0x6b, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x62, - 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x12, 0x48, 0x0a, 0x0a, 0x62, 0x6c, 0x6f, 0x63, - 0x6b, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x0d, 0xc8, 0xde, 0x1f, 0x00, 0x90, 0xdf, - 0x1f, 0x01, 0xa8, 0xe7, 0xb0, 0x2a, 0x01, 0x52, 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x69, - 0x6d, 0x65, 0x12, 0x5d, 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x5f, 0x61, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x32, 0xfa, 0xde, - 0x1f, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x73, - 0x6d, 0x6f, 0x73, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2d, 0x73, 0x64, 0x6b, 0x2f, 0x74, - 0x79, 0x70, 0x65, 0x73, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x12, 0x19, 0x0a, 0x08, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x07, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x12, 0x22, 0x0a, 0x0d, - 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x67, 0x61, 0x73, 0x18, 0x0a, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x4d, 0x61, 0x78, 0x47, 0x61, 0x73, - 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x52, 0x08, 0x74, 0x78, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x22, 0x2a, 0x0a, 0x14, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, 0x63, 0x65, 0x54, 0x78, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0xb7, 0x03, 0x0a, - 0x16, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, 0x63, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x31, 0x0a, 0x03, 0x74, 0x78, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, - 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x45, 0x74, 0x68, 0x65, 0x72, - 0x65, 0x75, 0x6d, 0x54, 0x78, 0x52, 0x03, 0x74, 0x78, 0x73, 0x12, 0x40, 0x0a, 0x0c, 0x74, 0x72, - 0x61, 0x63, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1d, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, - 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, - 0x0b, 0x74, 0x72, 0x61, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x21, 0x0a, 0x0c, - 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, - 0x1d, 0x0a, 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x12, 0x48, - 0x0a, 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x0d, - 0xc8, 0xde, 0x1f, 0x00, 0x90, 0xdf, 0x1f, 0x01, 0xa8, 0xe7, 0xb0, 0x2a, 0x01, 0x52, 0x09, 0x62, - 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x5d, 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x70, - 0x6f, 0x73, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x0c, 0x42, 0x32, 0xfa, 0xde, 0x1f, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, - 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, - 0x2d, 0x73, 0x64, 0x6b, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x41, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, - 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x63, 0x68, 0x61, 0x69, 0x6e, - 0x5f, 0x69, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x63, 0x68, 0x61, 0x69, 0x6e, - 0x49, 0x64, 0x12, 0x22, 0x0a, 0x0d, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6d, 0x61, 0x78, 0x5f, - 0x67, 0x61, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, - 0x4d, 0x61, 0x78, 0x47, 0x61, 0x73, 0x22, 0x2d, 0x0a, 0x17, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, - 0x72, 0x61, 0x63, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x15, 0x0a, 0x13, 0x51, 0x75, 0x65, 0x72, 0x79, 0x42, 0x61, - 0x73, 0x65, 0x46, 0x65, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x4c, 0x0a, 0x14, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x42, 0x61, 0x73, 0x65, 0x46, 0x65, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x34, 0x0a, 0x08, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x66, 0x65, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x19, 0xda, 0xde, 0x1f, 0x15, 0x63, 0x6f, 0x73, 0x6d, - 0x6f, 0x73, 0x73, 0x64, 0x6b, 0x2e, 0x69, 0x6f, 0x2f, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x49, 0x6e, - 0x74, 0x52, 0x07, 0x62, 0x61, 0x73, 0x65, 0x46, 0x65, 0x65, 0x22, 0x1f, 0x0a, 0x1d, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x4d, 0x69, 0x6e, 0x47, 0x61, 0x73, 0x50, - 0x72, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x63, 0x0a, 0x1e, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x4d, 0x69, 0x6e, 0x47, 0x61, 0x73, - 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x41, 0x0a, - 0x0d, 0x6d, 0x69, 0x6e, 0x5f, 0x67, 0x61, 0x73, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x42, 0x1d, 0xc8, 0xde, 0x1f, 0x00, 0xda, 0xde, 0x1f, 0x15, 0x63, 0x6f, - 0x73, 0x6d, 0x6f, 0x73, 0x73, 0x64, 0x6b, 0x2e, 0x69, 0x6f, 0x2f, 0x6d, 0x61, 0x74, 0x68, 0x2e, - 0x49, 0x6e, 0x74, 0x52, 0x0b, 0x6d, 0x69, 0x6e, 0x47, 0x61, 0x73, 0x50, 0x72, 0x69, 0x63, 0x65, - 0x32, 0x91, 0x10, 0x0a, 0x05, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x85, 0x01, 0x0a, 0x07, 0x41, - 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x25, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, - 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, - 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, + 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x22, 0xc1, + 0x01, 0x0a, 0x13, 0x54, 0x61, 0x63, 0x53, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x29, 0x0a, 0x04, 0x6c, 0x6f, + 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, + 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x52, + 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x72, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x03, 0x72, 0x65, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x76, 0x6d, 0x5f, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x6d, 0x45, 0x72, 0x72, + 0x6f, 0x72, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x61, 0x73, 0x5f, 0x75, 0x73, 0x65, 0x64, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x67, 0x61, 0x73, 0x55, 0x73, 0x65, 0x64, 0x12, 0x23, 0x0a, + 0x0d, 0x67, 0x61, 0x73, 0x5f, 0x65, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x64, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x67, 0x61, 0x73, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, + 0x65, 0x64, 0x22, 0x54, 0x0a, 0x13, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x47, 0x61, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x61, 0x73, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x03, 0x67, 0x61, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x72, + 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x72, 0x65, 0x74, 0x12, 0x19, 0x0a, + 0x08, 0x76, 0x6d, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x76, 0x6d, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x89, 0x04, 0x0a, 0x13, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x54, 0x72, 0x61, 0x63, 0x65, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x31, 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, - 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x12, 0x23, 0x2f, - 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x65, 0x76, 0x6d, 0x2f, 0x76, 0x6d, 0x2f, 0x76, 0x31, - 0x2f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x7b, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x7d, 0x12, 0x9e, 0x01, 0x0a, 0x0d, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x41, 0x63, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2b, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, - 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x73, - 0x6d, 0x6f, 0x73, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x2c, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, - 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x73, - 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x32, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2c, 0x12, 0x2a, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, - 0x2f, 0x65, 0x76, 0x6d, 0x2f, 0x76, 0x6d, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, - 0x73, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x7b, 0x61, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x7d, 0x12, 0xaf, 0x01, 0x0a, 0x10, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, - 0x72, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2e, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, - 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, - 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3a, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x34, 0x12, 0x32, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x65, 0x76, 0x6d, 0x2f, 0x76, - 0x6d, 0x2f, 0x76, 0x31, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x61, - 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x5f, 0x61, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x7d, 0x12, 0x86, 0x01, 0x0a, 0x07, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, - 0x65, 0x12, 0x25, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, - 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, - 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x26, 0x12, 0x24, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, - 0x73, 0x2f, 0x65, 0x76, 0x6d, 0x2f, 0x76, 0x6d, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x61, 0x6c, 0x61, - 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x7d, 0x12, 0x8b, - 0x01, 0x0a, 0x07, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x12, 0x25, 0x2e, 0x63, 0x6f, 0x73, + 0x2e, 0x4d, 0x73, 0x67, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x54, 0x78, 0x52, 0x03, + 0x6d, 0x73, 0x67, 0x12, 0x40, 0x0a, 0x0c, 0x74, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x63, 0x6f, 0x73, 0x6d, + 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, + 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0b, 0x74, 0x72, 0x61, 0x63, 0x65, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x43, 0x0a, 0x0c, 0x70, 0x72, 0x65, 0x64, 0x65, 0x63, 0x65, + 0x73, 0x73, 0x6f, 0x72, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x63, 0x6f, + 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x4d, + 0x73, 0x67, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x54, 0x78, 0x52, 0x0c, 0x70, 0x72, + 0x65, 0x64, 0x65, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x1d, 0x0a, + 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x12, 0x48, 0x0a, 0x0a, + 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x0d, 0xc8, 0xde, + 0x1f, 0x00, 0x90, 0xdf, 0x1f, 0x01, 0xa8, 0xe7, 0xb0, 0x2a, 0x01, 0x52, 0x09, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x5d, 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, + 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, + 0x42, 0x32, 0xfa, 0xde, 0x1f, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2d, 0x73, + 0x64, 0x6b, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x41, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x41, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, + 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, + 0x12, 0x22, 0x0a, 0x0d, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x67, 0x61, + 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x4d, 0x61, + 0x78, 0x47, 0x61, 0x73, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x52, 0x08, 0x74, 0x78, 0x5f, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2a, 0x0a, 0x14, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, + 0x63, 0x65, 0x54, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, + 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, + 0x22, 0xb7, 0x03, 0x0a, 0x16, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, 0x63, 0x65, 0x42, + 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x31, 0x0a, 0x03, 0x74, + 0x78, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, + 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x45, + 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x54, 0x78, 0x52, 0x03, 0x74, 0x78, 0x73, 0x12, 0x40, + 0x0a, 0x0c, 0x74, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, + 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x65, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x52, 0x0b, 0x74, 0x72, 0x61, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x61, 0x73, + 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, + 0x73, 0x68, 0x12, 0x48, 0x0a, 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x42, 0x0d, 0xc8, 0xde, 0x1f, 0x00, 0x90, 0xdf, 0x1f, 0x01, 0xa8, 0xe7, 0xb0, 0x2a, + 0x01, 0x52, 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x5d, 0x0a, 0x10, + 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x32, 0xfa, 0xde, 0x1f, 0x2e, 0x67, 0x69, 0x74, 0x68, + 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x63, 0x6f, + 0x73, 0x6d, 0x6f, 0x73, 0x2d, 0x73, 0x64, 0x6b, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x43, + 0x6f, 0x6e, 0x73, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x70, + 0x6f, 0x73, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x63, + 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x63, + 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x12, 0x22, 0x0a, 0x0d, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, + 0x6d, 0x61, 0x78, 0x5f, 0x67, 0x61, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x4d, 0x61, 0x78, 0x47, 0x61, 0x73, 0x22, 0x2d, 0x0a, 0x17, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, 0x63, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x15, 0x0a, 0x13, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x42, 0x61, 0x73, 0x65, 0x46, 0x65, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x22, 0x4c, 0x0a, 0x14, 0x51, 0x75, 0x65, 0x72, 0x79, 0x42, 0x61, 0x73, 0x65, 0x46, 0x65, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x34, 0x0a, 0x08, 0x62, 0x61, 0x73, 0x65, + 0x5f, 0x66, 0x65, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x19, 0xda, 0xde, 0x1f, 0x15, + 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x73, 0x64, 0x6b, 0x2e, 0x69, 0x6f, 0x2f, 0x6d, 0x61, 0x74, + 0x68, 0x2e, 0x49, 0x6e, 0x74, 0x52, 0x07, 0x62, 0x61, 0x73, 0x65, 0x46, 0x65, 0x65, 0x22, 0x1f, + 0x0a, 0x1d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x4d, 0x69, 0x6e, + 0x47, 0x61, 0x73, 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, + 0x63, 0x0a, 0x1e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x4d, 0x69, + 0x6e, 0x47, 0x61, 0x73, 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x41, 0x0a, 0x0d, 0x6d, 0x69, 0x6e, 0x5f, 0x67, 0x61, 0x73, 0x5f, 0x70, 0x72, 0x69, + 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x1d, 0xc8, 0xde, 0x1f, 0x00, 0xda, 0xde, + 0x1f, 0x15, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x73, 0x64, 0x6b, 0x2e, 0x69, 0x6f, 0x2f, 0x6d, + 0x61, 0x74, 0x68, 0x2e, 0x49, 0x6e, 0x74, 0x52, 0x0b, 0x6d, 0x69, 0x6e, 0x47, 0x61, 0x73, 0x50, + 0x72, 0x69, 0x63, 0x65, 0x32, 0x8f, 0x10, 0x0a, 0x05, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x85, + 0x01, 0x0a, 0x07, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x25, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x65, 0x72, 0x79, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, - 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x31, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x2b, 0x12, 0x29, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x65, 0x76, 0x6d, 0x2f, 0x76, - 0x6d, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2f, 0x7b, 0x61, 0x64, - 0x64, 0x72, 0x65, 0x73, 0x73, 0x7d, 0x2f, 0x7b, 0x6b, 0x65, 0x79, 0x7d, 0x12, 0x7a, 0x0a, 0x04, - 0x43, 0x6f, 0x64, 0x65, 0x12, 0x22, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, - 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x64, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, - 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x23, 0x12, 0x21, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x65, - 0x76, 0x6d, 0x2f, 0x76, 0x6d, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x73, 0x2f, 0x7b, - 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x7d, 0x12, 0x77, 0x0a, 0x06, 0x50, 0x61, 0x72, 0x61, - 0x6d, 0x73, 0x12, 0x24, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, - 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, + 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x25, 0x12, 0x23, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x65, 0x76, 0x6d, 0x2f, 0x76, + 0x6d, 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x7b, 0x61, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x7d, 0x12, 0x9e, 0x01, 0x0a, 0x0d, 0x43, 0x6f, 0x73, 0x6d, 0x6f, + 0x73, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2b, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x12, 0x18, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, - 0x2f, 0x65, 0x76, 0x6d, 0x2f, 0x76, 0x6d, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x61, 0x72, 0x61, 0x6d, - 0x73, 0x12, 0x78, 0x0a, 0x07, 0x45, 0x74, 0x68, 0x43, 0x61, 0x6c, 0x6c, 0x12, 0x20, 0x2e, 0x63, + 0x79, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, + 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6f, + 0x73, 0x6d, 0x6f, 0x73, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x32, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2c, 0x12, 0x2a, 0x2f, 0x63, 0x6f, + 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x65, 0x76, 0x6d, 0x2f, 0x76, 0x6d, 0x2f, 0x76, 0x31, 0x2f, 0x63, + 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x7b, 0x61, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x7d, 0x12, 0xaf, 0x01, 0x0a, 0x10, 0x56, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x6f, 0x72, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2e, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, - 0x45, 0x74, 0x68, 0x43, 0x61, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x41, 0x63, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x63, + 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x41, 0x63, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3a, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x34, 0x12, 0x32, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x65, + 0x76, 0x6d, 0x2f, 0x76, 0x6d, 0x2f, 0x76, 0x31, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x6f, 0x72, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x7b, 0x63, 0x6f, 0x6e, 0x73, + 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x7d, 0x12, 0x86, 0x01, 0x0a, 0x07, 0x42, 0x61, + 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x25, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, + 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x42, 0x61, + 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x63, + 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x26, 0x12, 0x24, 0x2f, 0x63, + 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x65, 0x76, 0x6d, 0x2f, 0x76, 0x6d, 0x2f, 0x76, 0x31, 0x2f, + 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x7d, 0x12, 0x8b, 0x01, 0x0a, 0x07, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x12, 0x25, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, - 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x54, 0x78, 0x52, + 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, + 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x74, + 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x31, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x2b, 0x12, 0x29, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x65, + 0x76, 0x6d, 0x2f, 0x76, 0x6d, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, + 0x2f, 0x7b, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x7d, 0x2f, 0x7b, 0x6b, 0x65, 0x79, 0x7d, + 0x12, 0x7a, 0x0a, 0x04, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x22, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, + 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x63, + 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x29, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x23, 0x12, 0x21, 0x2f, 0x63, 0x6f, 0x73, 0x6d, + 0x6f, 0x73, 0x2f, 0x65, 0x76, 0x6d, 0x2f, 0x76, 0x6d, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x64, + 0x65, 0x73, 0x2f, 0x7b, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x7d, 0x12, 0x77, 0x0a, 0x06, + 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x24, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, + 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, + 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x63, + 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x12, 0x18, 0x2f, 0x63, 0x6f, + 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x65, 0x76, 0x6d, 0x2f, 0x76, 0x6d, 0x2f, 0x76, 0x31, 0x2f, 0x70, + 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x78, 0x0a, 0x07, 0x45, 0x74, 0x68, 0x43, 0x61, 0x6c, 0x6c, + 0x12, 0x20, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, + 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x74, 0x68, 0x43, 0x61, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, + 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, + 0x6d, 0x54, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x22, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x1c, 0x12, 0x1a, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x65, 0x76, 0x6d, + 0x2f, 0x76, 0x6d, 0x2f, 0x76, 0x31, 0x2f, 0x65, 0x74, 0x68, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x12, + 0x82, 0x01, 0x0a, 0x0b, 0x54, 0x61, 0x63, 0x53, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x12, + 0x24, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, + 0x76, 0x31, 0x2e, 0x54, 0x61, 0x63, 0x53, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, + 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x63, 0x53, 0x69, 0x6d, 0x75, + 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x20, 0x12, 0x1e, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x65, 0x76, + 0x6d, 0x2f, 0x76, 0x6d, 0x2f, 0x76, 0x31, 0x2f, 0x74, 0x61, 0x63, 0x5f, 0x73, 0x69, 0x6d, 0x75, + 0x6c, 0x61, 0x74, 0x65, 0x12, 0x7e, 0x0a, 0x0b, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, + 0x47, 0x61, 0x73, 0x12, 0x20, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, + 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x74, 0x68, 0x43, 0x61, 0x6c, 0x6c, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, + 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, + 0x65, 0x47, 0x61, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x20, 0x12, 0x1e, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x65, 0x76, + 0x6d, 0x2f, 0x76, 0x6d, 0x2f, 0x76, 0x31, 0x2f, 0x65, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, + 0x5f, 0x67, 0x61, 0x73, 0x12, 0x7c, 0x0a, 0x07, 0x54, 0x72, 0x61, 0x63, 0x65, 0x54, 0x78, 0x12, + 0x25, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, + 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, 0x63, 0x65, 0x54, 0x78, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, + 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, + 0x72, 0x61, 0x63, 0x65, 0x54, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x22, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1c, 0x12, 0x1a, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, + 0x65, 0x76, 0x6d, 0x2f, 0x76, 0x6d, 0x2f, 0x76, 0x31, 0x2f, 0x74, 0x72, 0x61, 0x63, 0x65, 0x5f, + 0x74, 0x78, 0x12, 0x88, 0x01, 0x0a, 0x0a, 0x54, 0x72, 0x61, 0x63, 0x65, 0x42, 0x6c, 0x6f, 0x63, + 0x6b, 0x12, 0x28, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, + 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, 0x63, 0x65, 0x42, + 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x63, 0x6f, + 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, 0x63, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x25, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1f, 0x12, 0x1d, + 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x65, 0x76, 0x6d, 0x2f, 0x76, 0x6d, 0x2f, 0x76, + 0x31, 0x2f, 0x74, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x7c, 0x0a, + 0x07, 0x42, 0x61, 0x73, 0x65, 0x46, 0x65, 0x65, 0x12, 0x25, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, + 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x42, 0x61, 0x73, 0x65, 0x46, 0x65, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x26, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, + 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x42, 0x61, 0x73, 0x65, 0x46, 0x65, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x22, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1c, 0x12, 0x1a, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x65, 0x76, 0x6d, 0x2f, 0x76, 0x6d, 0x2f, - 0x76, 0x31, 0x2f, 0x65, 0x74, 0x68, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x12, 0x84, 0x01, 0x0a, 0x0b, - 0x54, 0x61, 0x63, 0x53, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x24, 0x2e, 0x63, 0x6f, - 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x54, - 0x61, 0x63, 0x53, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x27, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, - 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, - 0x54, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x20, 0x12, 0x1e, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x65, 0x76, 0x6d, 0x2f, - 0x76, 0x6d, 0x2f, 0x76, 0x31, 0x2f, 0x74, 0x61, 0x63, 0x5f, 0x73, 0x69, 0x6d, 0x75, 0x6c, 0x61, - 0x74, 0x65, 0x12, 0x7e, 0x0a, 0x0b, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x47, 0x61, - 0x73, 0x12, 0x20, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, - 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x74, 0x68, 0x43, 0x61, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, - 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x47, - 0x61, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x20, 0x12, 0x1e, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x65, 0x76, 0x6d, 0x2f, - 0x76, 0x6d, 0x2f, 0x76, 0x31, 0x2f, 0x65, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x5f, 0x67, - 0x61, 0x73, 0x12, 0x7c, 0x0a, 0x07, 0x54, 0x72, 0x61, 0x63, 0x65, 0x54, 0x78, 0x12, 0x25, 0x2e, - 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, - 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, 0x63, 0x65, 0x54, 0x78, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, - 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, - 0x63, 0x65, 0x54, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x22, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x1c, 0x12, 0x1a, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x65, 0x76, - 0x6d, 0x2f, 0x76, 0x6d, 0x2f, 0x76, 0x31, 0x2f, 0x74, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x74, 0x78, - 0x12, 0x88, 0x01, 0x0a, 0x0a, 0x54, 0x72, 0x61, 0x63, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, - 0x28, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, - 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, 0x63, 0x65, 0x42, 0x6c, 0x6f, - 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x63, 0x6f, 0x73, 0x6d, - 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x54, 0x72, 0x61, 0x63, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x25, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1f, 0x12, 0x1d, 0x2f, 0x63, - 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x65, 0x76, 0x6d, 0x2f, 0x76, 0x6d, 0x2f, 0x76, 0x31, 0x2f, - 0x74, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x7c, 0x0a, 0x07, 0x42, - 0x61, 0x73, 0x65, 0x46, 0x65, 0x65, 0x12, 0x25, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, - 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x42, - 0x61, 0x73, 0x65, 0x46, 0x65, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, - 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, - 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x42, 0x61, 0x73, 0x65, 0x46, 0x65, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x22, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1c, 0x12, 0x1a, 0x2f, + 0x76, 0x31, 0x2f, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x66, 0x65, 0x65, 0x12, 0x77, 0x0a, 0x06, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x24, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, + 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x63, 0x6f, + 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x12, 0x18, 0x2f, 0x63, 0x6f, 0x73, + 0x6d, 0x6f, 0x73, 0x2f, 0x65, 0x76, 0x6d, 0x2f, 0x76, 0x6d, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x12, 0x9f, 0x01, 0x0a, 0x11, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x4d, + 0x69, 0x6e, 0x47, 0x61, 0x73, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x2f, 0x2e, 0x63, 0x6f, 0x73, + 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x4d, 0x69, 0x6e, 0x47, 0x61, 0x73, 0x50, + 0x72, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x63, 0x6f, + 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x4d, 0x69, 0x6e, 0x47, 0x61, 0x73, + 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x27, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x21, 0x12, 0x1f, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x65, + 0x76, 0x6d, 0x2f, 0x76, 0x6d, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x69, 0x6e, 0x5f, 0x67, 0x61, 0x73, + 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x42, 0xad, 0x01, 0x0a, 0x14, 0x63, 0x6f, 0x6d, 0x2e, 0x63, + 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x42, + 0x0a, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x26, 0x63, + 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x73, 0x64, 0x6b, 0x2e, 0x69, 0x6f, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x65, 0x76, 0x6d, 0x2f, 0x76, 0x6d, 0x2f, 0x76, 0x31, - 0x2f, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x66, 0x65, 0x65, 0x12, 0x77, 0x0a, 0x06, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x12, 0x24, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, - 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x63, 0x6f, 0x73, 0x6d, - 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x12, 0x18, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, - 0x73, 0x2f, 0x65, 0x76, 0x6d, 0x2f, 0x76, 0x6d, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x12, 0x9f, 0x01, 0x0a, 0x11, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x4d, 0x69, 0x6e, - 0x47, 0x61, 0x73, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x2f, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, - 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x4d, 0x69, 0x6e, 0x47, 0x61, 0x73, 0x50, 0x72, 0x69, - 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x63, 0x6f, 0x73, 0x6d, - 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x4d, 0x69, 0x6e, 0x47, 0x61, 0x73, 0x50, 0x72, - 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x27, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x21, 0x12, 0x1f, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x65, 0x76, 0x6d, - 0x2f, 0x76, 0x6d, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x69, 0x6e, 0x5f, 0x67, 0x61, 0x73, 0x5f, 0x70, - 0x72, 0x69, 0x63, 0x65, 0x42, 0xad, 0x01, 0x0a, 0x14, 0x63, 0x6f, 0x6d, 0x2e, 0x63, 0x6f, 0x73, - 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x42, 0x0a, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x26, 0x63, 0x6f, 0x73, - 0x6d, 0x6f, 0x73, 0x73, 0x64, 0x6b, 0x2e, 0x69, 0x6f, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6f, - 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x65, 0x76, 0x6d, 0x2f, 0x76, 0x6d, 0x2f, 0x76, 0x31, 0x3b, 0x76, - 0x6d, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x43, 0x45, 0x56, 0xaa, 0x02, 0x10, 0x43, 0x6f, 0x73, 0x6d, - 0x6f, 0x73, 0x2e, 0x45, 0x76, 0x6d, 0x2e, 0x56, 0x6d, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x10, 0x43, - 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x5c, 0x45, 0x76, 0x6d, 0x5c, 0x56, 0x6d, 0x5c, 0x56, 0x31, 0xe2, - 0x02, 0x1c, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x5c, 0x45, 0x76, 0x6d, 0x5c, 0x56, 0x6d, 0x5c, - 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, - 0x13, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x3a, 0x3a, 0x45, 0x76, 0x6d, 0x3a, 0x3a, 0x56, 0x6d, - 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x3b, 0x76, 0x6d, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x43, 0x45, 0x56, 0xaa, 0x02, 0x10, 0x43, 0x6f, + 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x45, 0x76, 0x6d, 0x2e, 0x56, 0x6d, 0x2e, 0x56, 0x31, 0xca, 0x02, + 0x10, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x5c, 0x45, 0x76, 0x6d, 0x5c, 0x56, 0x6d, 0x5c, 0x56, + 0x31, 0xe2, 0x02, 0x1c, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x5c, 0x45, 0x76, 0x6d, 0x5c, 0x56, + 0x6d, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0xea, 0x02, 0x13, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x3a, 0x3a, 0x45, 0x76, 0x6d, 0x3a, 0x3a, + 0x56, 0x6d, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -15901,7 +16781,7 @@ func file_cosmos_evm_vm_v1_query_proto_rawDescGZIP() []byte { return file_cosmos_evm_vm_v1_query_proto_rawDescData } -var file_cosmos_evm_vm_v1_query_proto_msgTypes = make([]protoimpl.MessageInfo, 29) +var file_cosmos_evm_vm_v1_query_proto_msgTypes = make([]protoimpl.MessageInfo, 30) var file_cosmos_evm_vm_v1_query_proto_goTypes = []interface{}{ (*QueryConfigRequest)(nil), // 0: cosmos.evm.vm.v1.QueryConfigRequest (*QueryConfigResponse)(nil), // 1: cosmos.evm.vm.v1.QueryConfigResponse @@ -15923,73 +16803,75 @@ var file_cosmos_evm_vm_v1_query_proto_goTypes = []interface{}{ (*QueryParamsResponse)(nil), // 17: cosmos.evm.vm.v1.QueryParamsResponse (*EthCallRequest)(nil), // 18: cosmos.evm.vm.v1.EthCallRequest (*TacSimulateRequest)(nil), // 19: cosmos.evm.vm.v1.TacSimulateRequest - (*EstimateGasResponse)(nil), // 20: cosmos.evm.vm.v1.EstimateGasResponse - (*QueryTraceTxRequest)(nil), // 21: cosmos.evm.vm.v1.QueryTraceTxRequest - (*QueryTraceTxResponse)(nil), // 22: cosmos.evm.vm.v1.QueryTraceTxResponse - (*QueryTraceBlockRequest)(nil), // 23: cosmos.evm.vm.v1.QueryTraceBlockRequest - (*QueryTraceBlockResponse)(nil), // 24: cosmos.evm.vm.v1.QueryTraceBlockResponse - (*QueryBaseFeeRequest)(nil), // 25: cosmos.evm.vm.v1.QueryBaseFeeRequest - (*QueryBaseFeeResponse)(nil), // 26: cosmos.evm.vm.v1.QueryBaseFeeResponse - (*QueryGlobalMinGasPriceRequest)(nil), // 27: cosmos.evm.vm.v1.QueryGlobalMinGasPriceRequest - (*QueryGlobalMinGasPriceResponse)(nil), // 28: cosmos.evm.vm.v1.QueryGlobalMinGasPriceResponse - (*ChainConfig)(nil), // 29: cosmos.evm.vm.v1.ChainConfig - (*v1beta1.PageRequest)(nil), // 30: cosmos.base.query.v1beta1.PageRequest - (*Log)(nil), // 31: cosmos.evm.vm.v1.Log - (*v1beta1.PageResponse)(nil), // 32: cosmos.base.query.v1beta1.PageResponse - (*Params)(nil), // 33: cosmos.evm.vm.v1.Params - (*MsgEthereumTx)(nil), // 34: cosmos.evm.vm.v1.MsgEthereumTx - (*TraceConfig)(nil), // 35: cosmos.evm.vm.v1.TraceConfig - (*timestamppb.Timestamp)(nil), // 36: google.protobuf.Timestamp - (*MsgEthereumTxResponse)(nil), // 37: cosmos.evm.vm.v1.MsgEthereumTxResponse + (*TacSimulateResponse)(nil), // 20: cosmos.evm.vm.v1.TacSimulateResponse + (*EstimateGasResponse)(nil), // 21: cosmos.evm.vm.v1.EstimateGasResponse + (*QueryTraceTxRequest)(nil), // 22: cosmos.evm.vm.v1.QueryTraceTxRequest + (*QueryTraceTxResponse)(nil), // 23: cosmos.evm.vm.v1.QueryTraceTxResponse + (*QueryTraceBlockRequest)(nil), // 24: cosmos.evm.vm.v1.QueryTraceBlockRequest + (*QueryTraceBlockResponse)(nil), // 25: cosmos.evm.vm.v1.QueryTraceBlockResponse + (*QueryBaseFeeRequest)(nil), // 26: cosmos.evm.vm.v1.QueryBaseFeeRequest + (*QueryBaseFeeResponse)(nil), // 27: cosmos.evm.vm.v1.QueryBaseFeeResponse + (*QueryGlobalMinGasPriceRequest)(nil), // 28: cosmos.evm.vm.v1.QueryGlobalMinGasPriceRequest + (*QueryGlobalMinGasPriceResponse)(nil), // 29: cosmos.evm.vm.v1.QueryGlobalMinGasPriceResponse + (*ChainConfig)(nil), // 30: cosmos.evm.vm.v1.ChainConfig + (*v1beta1.PageRequest)(nil), // 31: cosmos.base.query.v1beta1.PageRequest + (*Log)(nil), // 32: cosmos.evm.vm.v1.Log + (*v1beta1.PageResponse)(nil), // 33: cosmos.base.query.v1beta1.PageResponse + (*Params)(nil), // 34: cosmos.evm.vm.v1.Params + (*MsgEthereumTx)(nil), // 35: cosmos.evm.vm.v1.MsgEthereumTx + (*TraceConfig)(nil), // 36: cosmos.evm.vm.v1.TraceConfig + (*timestamppb.Timestamp)(nil), // 37: google.protobuf.Timestamp + (*MsgEthereumTxResponse)(nil), // 38: cosmos.evm.vm.v1.MsgEthereumTxResponse } var file_cosmos_evm_vm_v1_query_proto_depIdxs = []int32{ - 29, // 0: cosmos.evm.vm.v1.QueryConfigResponse.config:type_name -> cosmos.evm.vm.v1.ChainConfig - 30, // 1: cosmos.evm.vm.v1.QueryTxLogsRequest.pagination:type_name -> cosmos.base.query.v1beta1.PageRequest - 31, // 2: cosmos.evm.vm.v1.QueryTxLogsResponse.logs:type_name -> cosmos.evm.vm.v1.Log - 32, // 3: cosmos.evm.vm.v1.QueryTxLogsResponse.pagination:type_name -> cosmos.base.query.v1beta1.PageResponse - 33, // 4: cosmos.evm.vm.v1.QueryParamsResponse.params:type_name -> cosmos.evm.vm.v1.Params - 34, // 5: cosmos.evm.vm.v1.QueryTraceTxRequest.msg:type_name -> cosmos.evm.vm.v1.MsgEthereumTx - 35, // 6: cosmos.evm.vm.v1.QueryTraceTxRequest.trace_config:type_name -> cosmos.evm.vm.v1.TraceConfig - 34, // 7: cosmos.evm.vm.v1.QueryTraceTxRequest.predecessors:type_name -> cosmos.evm.vm.v1.MsgEthereumTx - 36, // 8: cosmos.evm.vm.v1.QueryTraceTxRequest.block_time:type_name -> google.protobuf.Timestamp - 34, // 9: cosmos.evm.vm.v1.QueryTraceBlockRequest.txs:type_name -> cosmos.evm.vm.v1.MsgEthereumTx - 35, // 10: cosmos.evm.vm.v1.QueryTraceBlockRequest.trace_config:type_name -> cosmos.evm.vm.v1.TraceConfig - 36, // 11: cosmos.evm.vm.v1.QueryTraceBlockRequest.block_time:type_name -> google.protobuf.Timestamp - 2, // 12: cosmos.evm.vm.v1.Query.Account:input_type -> cosmos.evm.vm.v1.QueryAccountRequest - 4, // 13: cosmos.evm.vm.v1.Query.CosmosAccount:input_type -> cosmos.evm.vm.v1.QueryCosmosAccountRequest - 6, // 14: cosmos.evm.vm.v1.Query.ValidatorAccount:input_type -> cosmos.evm.vm.v1.QueryValidatorAccountRequest - 8, // 15: cosmos.evm.vm.v1.Query.Balance:input_type -> cosmos.evm.vm.v1.QueryBalanceRequest - 10, // 16: cosmos.evm.vm.v1.Query.Storage:input_type -> cosmos.evm.vm.v1.QueryStorageRequest - 12, // 17: cosmos.evm.vm.v1.Query.Code:input_type -> cosmos.evm.vm.v1.QueryCodeRequest - 16, // 18: cosmos.evm.vm.v1.Query.Params:input_type -> cosmos.evm.vm.v1.QueryParamsRequest - 18, // 19: cosmos.evm.vm.v1.Query.EthCall:input_type -> cosmos.evm.vm.v1.EthCallRequest - 19, // 20: cosmos.evm.vm.v1.Query.TacSimulate:input_type -> cosmos.evm.vm.v1.TacSimulateRequest - 18, // 21: cosmos.evm.vm.v1.Query.EstimateGas:input_type -> cosmos.evm.vm.v1.EthCallRequest - 21, // 22: cosmos.evm.vm.v1.Query.TraceTx:input_type -> cosmos.evm.vm.v1.QueryTraceTxRequest - 23, // 23: cosmos.evm.vm.v1.Query.TraceBlock:input_type -> cosmos.evm.vm.v1.QueryTraceBlockRequest - 25, // 24: cosmos.evm.vm.v1.Query.BaseFee:input_type -> cosmos.evm.vm.v1.QueryBaseFeeRequest - 0, // 25: cosmos.evm.vm.v1.Query.Config:input_type -> cosmos.evm.vm.v1.QueryConfigRequest - 27, // 26: cosmos.evm.vm.v1.Query.GlobalMinGasPrice:input_type -> cosmos.evm.vm.v1.QueryGlobalMinGasPriceRequest - 3, // 27: cosmos.evm.vm.v1.Query.Account:output_type -> cosmos.evm.vm.v1.QueryAccountResponse - 5, // 28: cosmos.evm.vm.v1.Query.CosmosAccount:output_type -> cosmos.evm.vm.v1.QueryCosmosAccountResponse - 7, // 29: cosmos.evm.vm.v1.Query.ValidatorAccount:output_type -> cosmos.evm.vm.v1.QueryValidatorAccountResponse - 9, // 30: cosmos.evm.vm.v1.Query.Balance:output_type -> cosmos.evm.vm.v1.QueryBalanceResponse - 11, // 31: cosmos.evm.vm.v1.Query.Storage:output_type -> cosmos.evm.vm.v1.QueryStorageResponse - 13, // 32: cosmos.evm.vm.v1.Query.Code:output_type -> cosmos.evm.vm.v1.QueryCodeResponse - 17, // 33: cosmos.evm.vm.v1.Query.Params:output_type -> cosmos.evm.vm.v1.QueryParamsResponse - 37, // 34: cosmos.evm.vm.v1.Query.EthCall:output_type -> cosmos.evm.vm.v1.MsgEthereumTxResponse - 37, // 35: cosmos.evm.vm.v1.Query.TacSimulate:output_type -> cosmos.evm.vm.v1.MsgEthereumTxResponse - 20, // 36: cosmos.evm.vm.v1.Query.EstimateGas:output_type -> cosmos.evm.vm.v1.EstimateGasResponse - 22, // 37: cosmos.evm.vm.v1.Query.TraceTx:output_type -> cosmos.evm.vm.v1.QueryTraceTxResponse - 24, // 38: cosmos.evm.vm.v1.Query.TraceBlock:output_type -> cosmos.evm.vm.v1.QueryTraceBlockResponse - 26, // 39: cosmos.evm.vm.v1.Query.BaseFee:output_type -> cosmos.evm.vm.v1.QueryBaseFeeResponse - 1, // 40: cosmos.evm.vm.v1.Query.Config:output_type -> cosmos.evm.vm.v1.QueryConfigResponse - 28, // 41: cosmos.evm.vm.v1.Query.GlobalMinGasPrice:output_type -> cosmos.evm.vm.v1.QueryGlobalMinGasPriceResponse - 27, // [27:42] is the sub-list for method output_type - 12, // [12:27] is the sub-list for method input_type - 12, // [12:12] is the sub-list for extension type_name - 12, // [12:12] is the sub-list for extension extendee - 0, // [0:12] is the sub-list for field type_name + 30, // 0: cosmos.evm.vm.v1.QueryConfigResponse.config:type_name -> cosmos.evm.vm.v1.ChainConfig + 31, // 1: cosmos.evm.vm.v1.QueryTxLogsRequest.pagination:type_name -> cosmos.base.query.v1beta1.PageRequest + 32, // 2: cosmos.evm.vm.v1.QueryTxLogsResponse.logs:type_name -> cosmos.evm.vm.v1.Log + 33, // 3: cosmos.evm.vm.v1.QueryTxLogsResponse.pagination:type_name -> cosmos.base.query.v1beta1.PageResponse + 34, // 4: cosmos.evm.vm.v1.QueryParamsResponse.params:type_name -> cosmos.evm.vm.v1.Params + 32, // 5: cosmos.evm.vm.v1.TacSimulateResponse.logs:type_name -> cosmos.evm.vm.v1.Log + 35, // 6: cosmos.evm.vm.v1.QueryTraceTxRequest.msg:type_name -> cosmos.evm.vm.v1.MsgEthereumTx + 36, // 7: cosmos.evm.vm.v1.QueryTraceTxRequest.trace_config:type_name -> cosmos.evm.vm.v1.TraceConfig + 35, // 8: cosmos.evm.vm.v1.QueryTraceTxRequest.predecessors:type_name -> cosmos.evm.vm.v1.MsgEthereumTx + 37, // 9: cosmos.evm.vm.v1.QueryTraceTxRequest.block_time:type_name -> google.protobuf.Timestamp + 35, // 10: cosmos.evm.vm.v1.QueryTraceBlockRequest.txs:type_name -> cosmos.evm.vm.v1.MsgEthereumTx + 36, // 11: cosmos.evm.vm.v1.QueryTraceBlockRequest.trace_config:type_name -> cosmos.evm.vm.v1.TraceConfig + 37, // 12: cosmos.evm.vm.v1.QueryTraceBlockRequest.block_time:type_name -> google.protobuf.Timestamp + 2, // 13: cosmos.evm.vm.v1.Query.Account:input_type -> cosmos.evm.vm.v1.QueryAccountRequest + 4, // 14: cosmos.evm.vm.v1.Query.CosmosAccount:input_type -> cosmos.evm.vm.v1.QueryCosmosAccountRequest + 6, // 15: cosmos.evm.vm.v1.Query.ValidatorAccount:input_type -> cosmos.evm.vm.v1.QueryValidatorAccountRequest + 8, // 16: cosmos.evm.vm.v1.Query.Balance:input_type -> cosmos.evm.vm.v1.QueryBalanceRequest + 10, // 17: cosmos.evm.vm.v1.Query.Storage:input_type -> cosmos.evm.vm.v1.QueryStorageRequest + 12, // 18: cosmos.evm.vm.v1.Query.Code:input_type -> cosmos.evm.vm.v1.QueryCodeRequest + 16, // 19: cosmos.evm.vm.v1.Query.Params:input_type -> cosmos.evm.vm.v1.QueryParamsRequest + 18, // 20: cosmos.evm.vm.v1.Query.EthCall:input_type -> cosmos.evm.vm.v1.EthCallRequest + 19, // 21: cosmos.evm.vm.v1.Query.TacSimulate:input_type -> cosmos.evm.vm.v1.TacSimulateRequest + 18, // 22: cosmos.evm.vm.v1.Query.EstimateGas:input_type -> cosmos.evm.vm.v1.EthCallRequest + 22, // 23: cosmos.evm.vm.v1.Query.TraceTx:input_type -> cosmos.evm.vm.v1.QueryTraceTxRequest + 24, // 24: cosmos.evm.vm.v1.Query.TraceBlock:input_type -> cosmos.evm.vm.v1.QueryTraceBlockRequest + 26, // 25: cosmos.evm.vm.v1.Query.BaseFee:input_type -> cosmos.evm.vm.v1.QueryBaseFeeRequest + 0, // 26: cosmos.evm.vm.v1.Query.Config:input_type -> cosmos.evm.vm.v1.QueryConfigRequest + 28, // 27: cosmos.evm.vm.v1.Query.GlobalMinGasPrice:input_type -> cosmos.evm.vm.v1.QueryGlobalMinGasPriceRequest + 3, // 28: cosmos.evm.vm.v1.Query.Account:output_type -> cosmos.evm.vm.v1.QueryAccountResponse + 5, // 29: cosmos.evm.vm.v1.Query.CosmosAccount:output_type -> cosmos.evm.vm.v1.QueryCosmosAccountResponse + 7, // 30: cosmos.evm.vm.v1.Query.ValidatorAccount:output_type -> cosmos.evm.vm.v1.QueryValidatorAccountResponse + 9, // 31: cosmos.evm.vm.v1.Query.Balance:output_type -> cosmos.evm.vm.v1.QueryBalanceResponse + 11, // 32: cosmos.evm.vm.v1.Query.Storage:output_type -> cosmos.evm.vm.v1.QueryStorageResponse + 13, // 33: cosmos.evm.vm.v1.Query.Code:output_type -> cosmos.evm.vm.v1.QueryCodeResponse + 17, // 34: cosmos.evm.vm.v1.Query.Params:output_type -> cosmos.evm.vm.v1.QueryParamsResponse + 38, // 35: cosmos.evm.vm.v1.Query.EthCall:output_type -> cosmos.evm.vm.v1.MsgEthereumTxResponse + 20, // 36: cosmos.evm.vm.v1.Query.TacSimulate:output_type -> cosmos.evm.vm.v1.TacSimulateResponse + 21, // 37: cosmos.evm.vm.v1.Query.EstimateGas:output_type -> cosmos.evm.vm.v1.EstimateGasResponse + 23, // 38: cosmos.evm.vm.v1.Query.TraceTx:output_type -> cosmos.evm.vm.v1.QueryTraceTxResponse + 25, // 39: cosmos.evm.vm.v1.Query.TraceBlock:output_type -> cosmos.evm.vm.v1.QueryTraceBlockResponse + 27, // 40: cosmos.evm.vm.v1.Query.BaseFee:output_type -> cosmos.evm.vm.v1.QueryBaseFeeResponse + 1, // 41: cosmos.evm.vm.v1.Query.Config:output_type -> cosmos.evm.vm.v1.QueryConfigResponse + 29, // 42: cosmos.evm.vm.v1.Query.GlobalMinGasPrice:output_type -> cosmos.evm.vm.v1.QueryGlobalMinGasPriceResponse + 28, // [28:43] is the sub-list for method output_type + 13, // [13:28] is the sub-list for method input_type + 13, // [13:13] is the sub-list for extension type_name + 13, // [13:13] is the sub-list for extension extendee + 0, // [0:13] is the sub-list for field type_name } func init() { file_cosmos_evm_vm_v1_query_proto_init() } @@ -16241,7 +17123,7 @@ func file_cosmos_evm_vm_v1_query_proto_init() { } } file_cosmos_evm_vm_v1_query_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EstimateGasResponse); i { + switch v := v.(*TacSimulateResponse); i { case 0: return &v.state case 1: @@ -16253,7 +17135,7 @@ func file_cosmos_evm_vm_v1_query_proto_init() { } } file_cosmos_evm_vm_v1_query_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*QueryTraceTxRequest); i { + switch v := v.(*EstimateGasResponse); i { case 0: return &v.state case 1: @@ -16265,7 +17147,7 @@ func file_cosmos_evm_vm_v1_query_proto_init() { } } file_cosmos_evm_vm_v1_query_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*QueryTraceTxResponse); i { + switch v := v.(*QueryTraceTxRequest); i { case 0: return &v.state case 1: @@ -16277,7 +17159,7 @@ func file_cosmos_evm_vm_v1_query_proto_init() { } } file_cosmos_evm_vm_v1_query_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*QueryTraceBlockRequest); i { + switch v := v.(*QueryTraceTxResponse); i { case 0: return &v.state case 1: @@ -16289,7 +17171,7 @@ func file_cosmos_evm_vm_v1_query_proto_init() { } } file_cosmos_evm_vm_v1_query_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*QueryTraceBlockResponse); i { + switch v := v.(*QueryTraceBlockRequest); i { case 0: return &v.state case 1: @@ -16301,7 +17183,7 @@ func file_cosmos_evm_vm_v1_query_proto_init() { } } file_cosmos_evm_vm_v1_query_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*QueryBaseFeeRequest); i { + switch v := v.(*QueryTraceBlockResponse); i { case 0: return &v.state case 1: @@ -16313,7 +17195,7 @@ func file_cosmos_evm_vm_v1_query_proto_init() { } } file_cosmos_evm_vm_v1_query_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*QueryBaseFeeResponse); i { + switch v := v.(*QueryBaseFeeRequest); i { case 0: return &v.state case 1: @@ -16325,7 +17207,7 @@ func file_cosmos_evm_vm_v1_query_proto_init() { } } file_cosmos_evm_vm_v1_query_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*QueryGlobalMinGasPriceRequest); i { + switch v := v.(*QueryBaseFeeResponse); i { case 0: return &v.state case 1: @@ -16337,6 +17219,18 @@ func file_cosmos_evm_vm_v1_query_proto_init() { } } file_cosmos_evm_vm_v1_query_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*QueryGlobalMinGasPriceRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_cosmos_evm_vm_v1_query_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*QueryGlobalMinGasPriceResponse); i { case 0: return &v.state @@ -16355,7 +17249,7 @@ func file_cosmos_evm_vm_v1_query_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_cosmos_evm_vm_v1_query_proto_rawDesc, NumEnums: 0, - NumMessages: 29, + NumMessages: 30, NumExtensions: 0, NumServices: 1, }, diff --git a/api/cosmos/evm/vm/v1/query_grpc.pb.go b/api/cosmos/evm/vm/v1/query_grpc.pb.go index b656be958..b88d78163 100644 --- a/api/cosmos/evm/vm/v1/query_grpc.pb.go +++ b/api/cosmos/evm/vm/v1/query_grpc.pb.go @@ -59,7 +59,7 @@ type QueryClient interface { // EthCall implements the `eth_call` rpc api EthCall(ctx context.Context, in *EthCallRequest, opts ...grpc.CallOption) (*MsgEthereumTxResponse, error) // TacSimulate implements the custom `eth_tacSimulate` rpc api which supports state override - TacSimulate(ctx context.Context, in *TacSimulateRequest, opts ...grpc.CallOption) (*MsgEthereumTxResponse, error) + TacSimulate(ctx context.Context, in *TacSimulateRequest, opts ...grpc.CallOption) (*TacSimulateResponse, error) // EstimateGas implements the `eth_estimateGas` rpc api EstimateGas(ctx context.Context, in *EthCallRequest, opts ...grpc.CallOption) (*EstimateGasResponse, error) // TraceTx implements the `debug_traceTransaction` rpc api @@ -160,8 +160,8 @@ func (c *queryClient) EthCall(ctx context.Context, in *EthCallRequest, opts ...g return out, nil } -func (c *queryClient) TacSimulate(ctx context.Context, in *TacSimulateRequest, opts ...grpc.CallOption) (*MsgEthereumTxResponse, error) { - out := new(MsgEthereumTxResponse) +func (c *queryClient) TacSimulate(ctx context.Context, in *TacSimulateRequest, opts ...grpc.CallOption) (*TacSimulateResponse, error) { + out := new(TacSimulateResponse) err := c.cc.Invoke(ctx, Query_TacSimulate_FullMethodName, in, out, opts...) if err != nil { return nil, err @@ -246,7 +246,7 @@ type QueryServer interface { // EthCall implements the `eth_call` rpc api EthCall(context.Context, *EthCallRequest) (*MsgEthereumTxResponse, error) // TacSimulate implements the custom `eth_tacSimulate` rpc api which supports state override - TacSimulate(context.Context, *TacSimulateRequest) (*MsgEthereumTxResponse, error) + TacSimulate(context.Context, *TacSimulateRequest) (*TacSimulateResponse, error) // EstimateGas implements the `eth_estimateGas` rpc api EstimateGas(context.Context, *EthCallRequest) (*EstimateGasResponse, error) // TraceTx implements the `debug_traceTransaction` rpc api @@ -296,7 +296,7 @@ func (UnimplementedQueryServer) Params(context.Context, *QueryParamsRequest) (*Q func (UnimplementedQueryServer) EthCall(context.Context, *EthCallRequest) (*MsgEthereumTxResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method EthCall not implemented") } -func (UnimplementedQueryServer) TacSimulate(context.Context, *TacSimulateRequest) (*MsgEthereumTxResponse, error) { +func (UnimplementedQueryServer) TacSimulate(context.Context, *TacSimulateRequest) (*TacSimulateResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method TacSimulate not implemented") } func (UnimplementedQueryServer) EstimateGas(context.Context, *EthCallRequest) (*EstimateGasResponse, error) { diff --git a/proto/cosmos/evm/vm/v1/query.proto b/proto/cosmos/evm/vm/v1/query.proto index 5e6116766..6f1384f35 100644 --- a/proto/cosmos/evm/vm/v1/query.proto +++ b/proto/cosmos/evm/vm/v1/query.proto @@ -60,7 +60,7 @@ service Query { } // TacSimulate implements the custom `eth_tacSimulate` rpc api which supports state override - rpc TacSimulate(TacSimulateRequest) returns (MsgEthereumTxResponse) { + rpc TacSimulate(TacSimulateRequest) returns (TacSimulateResponse) { option (google.api.http).get = "/cosmos/evm/vm/v1/tac_simulate"; } @@ -281,6 +281,24 @@ message TacSimulateRequest { int64 chain_id = 5; } +// TacSimulateResponse defines TacSimulate response +message TacSimulateResponse { + // hash of the ethereum transaction in hex format + string hash = 1; + // logs contains the proto-compatible ethereum logs + repeated Log logs = 2; + // ret is the returned data from evm function (result or data supplied with + // revert opcode) + bytes ret = 3; + // vm_error is the error returned by vm execution + string vm_error = 4; + // gas_used specifies how much gas was consumed by the EVM execution + uint64 gas_used = 5; + // gas_estimated is the estimated minimum gas limit needed to execute + // the transaction successfully (result of binary search, like eth_estimateGas) + uint64 gas_estimated = 6; +} + // EstimateGasResponse defines EstimateGas response message EstimateGasResponse { // gas returns the estimated gas diff --git a/x/vm/types/query.pb.go b/x/vm/types/query.pb.go index 468e82e68..075ee86e3 100644 --- a/x/vm/types/query.pb.go +++ b/x/vm/types/query.pb.go @@ -1026,6 +1026,99 @@ func (m *TacSimulateRequest) GetChainId() int64 { return 0 } +// TacSimulateResponse defines TacSimulate response +type TacSimulateResponse struct { + // hash of the ethereum transaction in hex format + Hash string `protobuf:"bytes,1,opt,name=hash,proto3" json:"hash,omitempty"` + // logs contains the proto-compatible ethereum logs + Logs []*Log `protobuf:"bytes,2,rep,name=logs,proto3" json:"logs,omitempty"` + // ret is the returned data from evm function (result or data supplied with + // revert opcode) + Ret []byte `protobuf:"bytes,3,opt,name=ret,proto3" json:"ret,omitempty"` + // vm_error is the error returned by vm execution + VmError string `protobuf:"bytes,4,opt,name=vm_error,json=vmError,proto3" json:"vm_error,omitempty"` + // gas_used specifies how much gas was consumed by the EVM execution + GasUsed uint64 `protobuf:"varint,5,opt,name=gas_used,json=gasUsed,proto3" json:"gas_used,omitempty"` + // gas_estimated is the estimated minimum gas limit needed to execute + // the transaction successfully (result of binary search, like eth_estimateGas) + GasEstimated uint64 `protobuf:"varint,6,opt,name=gas_estimated,json=gasEstimated,proto3" json:"gas_estimated,omitempty"` +} + +func (m *TacSimulateResponse) Reset() { *m = TacSimulateResponse{} } +func (m *TacSimulateResponse) String() string { return proto.CompactTextString(m) } +func (*TacSimulateResponse) ProtoMessage() {} +func (*TacSimulateResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_0e8f08e175b3ef0c, []int{20} +} +func (m *TacSimulateResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *TacSimulateResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_TacSimulateResponse.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 *TacSimulateResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_TacSimulateResponse.Merge(m, src) +} +func (m *TacSimulateResponse) XXX_Size() int { + return m.Size() +} +func (m *TacSimulateResponse) XXX_DiscardUnknown() { + xxx_messageInfo_TacSimulateResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_TacSimulateResponse proto.InternalMessageInfo + +func (m *TacSimulateResponse) GetHash() string { + if m != nil { + return m.Hash + } + return "" +} + +func (m *TacSimulateResponse) GetLogs() []*Log { + if m != nil { + return m.Logs + } + return nil +} + +func (m *TacSimulateResponse) GetRet() []byte { + if m != nil { + return m.Ret + } + return nil +} + +func (m *TacSimulateResponse) GetVmError() string { + if m != nil { + return m.VmError + } + return "" +} + +func (m *TacSimulateResponse) GetGasUsed() uint64 { + if m != nil { + return m.GasUsed + } + return 0 +} + +func (m *TacSimulateResponse) GetGasEstimated() uint64 { + if m != nil { + return m.GasEstimated + } + return 0 +} + // EstimateGasResponse defines EstimateGas response type EstimateGasResponse struct { // gas returns the estimated gas @@ -1041,7 +1134,7 @@ func (m *EstimateGasResponse) Reset() { *m = EstimateGasResponse{} } func (m *EstimateGasResponse) String() string { return proto.CompactTextString(m) } func (*EstimateGasResponse) ProtoMessage() {} func (*EstimateGasResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0e8f08e175b3ef0c, []int{20} + return fileDescriptor_0e8f08e175b3ef0c, []int{21} } func (m *EstimateGasResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1118,7 +1211,7 @@ func (m *QueryTraceTxRequest) Reset() { *m = QueryTraceTxRequest{} } func (m *QueryTraceTxRequest) String() string { return proto.CompactTextString(m) } func (*QueryTraceTxRequest) ProtoMessage() {} func (*QueryTraceTxRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0e8f08e175b3ef0c, []int{21} + return fileDescriptor_0e8f08e175b3ef0c, []int{22} } func (m *QueryTraceTxRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1220,7 +1313,7 @@ func (m *QueryTraceTxResponse) Reset() { *m = QueryTraceTxResponse{} } func (m *QueryTraceTxResponse) String() string { return proto.CompactTextString(m) } func (*QueryTraceTxResponse) ProtoMessage() {} func (*QueryTraceTxResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0e8f08e175b3ef0c, []int{22} + return fileDescriptor_0e8f08e175b3ef0c, []int{23} } func (m *QueryTraceTxResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1280,7 +1373,7 @@ func (m *QueryTraceBlockRequest) Reset() { *m = QueryTraceBlockRequest{} func (m *QueryTraceBlockRequest) String() string { return proto.CompactTextString(m) } func (*QueryTraceBlockRequest) ProtoMessage() {} func (*QueryTraceBlockRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0e8f08e175b3ef0c, []int{23} + return fileDescriptor_0e8f08e175b3ef0c, []int{24} } func (m *QueryTraceBlockRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1375,7 +1468,7 @@ func (m *QueryTraceBlockResponse) Reset() { *m = QueryTraceBlockResponse func (m *QueryTraceBlockResponse) String() string { return proto.CompactTextString(m) } func (*QueryTraceBlockResponse) ProtoMessage() {} func (*QueryTraceBlockResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0e8f08e175b3ef0c, []int{24} + return fileDescriptor_0e8f08e175b3ef0c, []int{25} } func (m *QueryTraceBlockResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1420,7 +1513,7 @@ 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_0e8f08e175b3ef0c, []int{25} + return fileDescriptor_0e8f08e175b3ef0c, []int{26} } func (m *QueryBaseFeeRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1459,7 +1552,7 @@ 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_0e8f08e175b3ef0c, []int{26} + return fileDescriptor_0e8f08e175b3ef0c, []int{27} } func (m *QueryBaseFeeResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1497,7 +1590,7 @@ func (m *QueryGlobalMinGasPriceRequest) Reset() { *m = QueryGlobalMinGas func (m *QueryGlobalMinGasPriceRequest) String() string { return proto.CompactTextString(m) } func (*QueryGlobalMinGasPriceRequest) ProtoMessage() {} func (*QueryGlobalMinGasPriceRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0e8f08e175b3ef0c, []int{27} + return fileDescriptor_0e8f08e175b3ef0c, []int{28} } func (m *QueryGlobalMinGasPriceRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1536,7 +1629,7 @@ func (m *QueryGlobalMinGasPriceResponse) Reset() { *m = QueryGlobalMinGa func (m *QueryGlobalMinGasPriceResponse) String() string { return proto.CompactTextString(m) } func (*QueryGlobalMinGasPriceResponse) ProtoMessage() {} func (*QueryGlobalMinGasPriceResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0e8f08e175b3ef0c, []int{28} + return fileDescriptor_0e8f08e175b3ef0c, []int{29} } func (m *QueryGlobalMinGasPriceResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1586,6 +1679,7 @@ func init() { proto.RegisterType((*QueryParamsResponse)(nil), "cosmos.evm.vm.v1.QueryParamsResponse") proto.RegisterType((*EthCallRequest)(nil), "cosmos.evm.vm.v1.EthCallRequest") proto.RegisterType((*TacSimulateRequest)(nil), "cosmos.evm.vm.v1.TacSimulateRequest") + proto.RegisterType((*TacSimulateResponse)(nil), "cosmos.evm.vm.v1.TacSimulateResponse") proto.RegisterType((*EstimateGasResponse)(nil), "cosmos.evm.vm.v1.EstimateGasResponse") proto.RegisterType((*QueryTraceTxRequest)(nil), "cosmos.evm.vm.v1.QueryTraceTxRequest") proto.RegisterType((*QueryTraceTxResponse)(nil), "cosmos.evm.vm.v1.QueryTraceTxResponse") @@ -1600,113 +1694,118 @@ func init() { func init() { proto.RegisterFile("cosmos/evm/vm/v1/query.proto", fileDescriptor_0e8f08e175b3ef0c) } var fileDescriptor_0e8f08e175b3ef0c = []byte{ - // 1693 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x58, 0xcd, 0x6f, 0x13, 0xdb, - 0x15, 0xcf, 0xc4, 0x4e, 0xec, 0x5c, 0x27, 0x60, 0x2e, 0xa1, 0x38, 0xd3, 0xc4, 0x0e, 0x03, 0xf9, - 0x24, 0xcc, 0x90, 0x94, 0x56, 0x2a, 0x5d, 0xb4, 0x49, 0x14, 0x02, 0x05, 0x5a, 0x6a, 0xa2, 0x2e, - 0x2a, 0x55, 0xd6, 0xf5, 0xf8, 0x32, 0x1e, 0xc5, 0x33, 0x63, 0xe6, 0x5e, 0xbb, 0x0e, 0x94, 0x2e, - 0xaa, 0x16, 0x81, 0xd8, 0x50, 0x75, 0xdf, 0xb2, 0xec, 0xae, 0xdd, 0xf1, 0x2f, 0xb0, 0x44, 0xea, - 0xe6, 0xe9, 0x2d, 0x78, 0x4f, 0xe1, 0x49, 0xef, 0xfd, 0x0d, 0x6f, 0xf5, 0x74, 0x3f, 0xc6, 0x9e, - 0xc9, 0x78, 0x6c, 0xf3, 0x04, 0xbb, 0x27, 0x45, 0x70, 0x3f, 0xcf, 0xf9, 0x9d, 0x73, 0xcf, 0xc7, - 0x6f, 0x0c, 0xe6, 0x4d, 0x8f, 0x38, 0x1e, 0x31, 0x70, 0xdb, 0x31, 0xd8, 0xdf, 0xa6, 0xf1, 0xb0, - 0x85, 0xfd, 0x23, 0xbd, 0xe9, 0x7b, 0xd4, 0x83, 0x79, 0xb1, 0xab, 0xe3, 0xb6, 0xa3, 0xb3, 0xbf, - 0x4d, 0xf5, 0x0c, 0x72, 0x6c, 0xd7, 0x33, 0xf8, 0xbf, 0xe2, 0x90, 0xba, 0x2e, 0x45, 0x54, 0x11, - 0xc1, 0xe2, 0xb6, 0xd1, 0xde, 0xac, 0x62, 0x8a, 0x36, 0x8d, 0x26, 0xb2, 0x6c, 0x17, 0x51, 0xdb, - 0x73, 0xe5, 0xd9, 0x59, 0xcb, 0xb3, 0x3c, 0x3e, 0x34, 0xd8, 0x48, 0xae, 0xce, 0x5b, 0x9e, 0x67, - 0x35, 0xb0, 0x81, 0x9a, 0xb6, 0x81, 0x5c, 0xd7, 0xa3, 0xfc, 0x0a, 0x91, 0xbb, 0x25, 0xb9, 0xcb, - 0x67, 0xd5, 0xd6, 0x03, 0x83, 0xda, 0x0e, 0x26, 0x14, 0x39, 0x4d, 0x79, 0x40, 0x8d, 0xd9, 0xc0, - 0xf0, 0x8a, 0xbd, 0xb9, 0xd8, 0x1e, 0xed, 0x88, 0x2d, 0x6d, 0x16, 0xc0, 0xdf, 0x31, 0xb4, 0xbb, - 0x9e, 0xfb, 0xc0, 0xb6, 0xca, 0xf8, 0x61, 0x0b, 0x13, 0xaa, 0xdd, 0x01, 0x67, 0x23, 0xab, 0xa4, - 0xe9, 0xb9, 0x04, 0xc3, 0x9f, 0x82, 0x49, 0x93, 0xaf, 0x14, 0x94, 0x45, 0x65, 0x35, 0xb7, 0xb5, - 0xa0, 0x9f, 0x74, 0x8d, 0xbe, 0x5b, 0x47, 0xb6, 0x2b, 0xaf, 0xc9, 0xc3, 0xda, 0xcf, 0xa5, 0xb4, - 0x6d, 0xd3, 0xf4, 0x5a, 0x2e, 0x95, 0x4a, 0x60, 0x01, 0x64, 0x50, 0xad, 0xe6, 0x63, 0x42, 0xb8, - 0xb8, 0xa9, 0x72, 0x30, 0xbd, 0x9e, 0x7d, 0xf6, 0xaa, 0x34, 0xf6, 0xcd, 0xab, 0xd2, 0x98, 0x66, - 0x82, 0xd9, 0xe8, 0x55, 0x89, 0xa4, 0x00, 0x32, 0x55, 0xd4, 0x40, 0xae, 0x89, 0x83, 0xbb, 0x72, - 0x0a, 0x7f, 0x0c, 0xa6, 0x4c, 0xaf, 0x86, 0x2b, 0x75, 0x44, 0xea, 0x85, 0x71, 0xbe, 0x97, 0x65, - 0x0b, 0x37, 0x11, 0xa9, 0xc3, 0x59, 0x30, 0xe1, 0x7a, 0xec, 0x52, 0x6a, 0x51, 0x59, 0x4d, 0x97, - 0xc5, 0x44, 0xfb, 0x25, 0x98, 0x93, 0xd6, 0x32, 0x63, 0xbe, 0x07, 0xca, 0xa7, 0x0a, 0x50, 0xfb, - 0x49, 0x90, 0x60, 0x97, 0xc0, 0x29, 0xe1, 0xa7, 0x4a, 0x54, 0xd2, 0x8c, 0x58, 0xdd, 0x16, 0x8b, - 0x50, 0x05, 0x59, 0xc2, 0x94, 0x32, 0x7c, 0xe3, 0x1c, 0x5f, 0x77, 0xce, 0x44, 0x20, 0x21, 0xb5, - 0xe2, 0xb6, 0x9c, 0x2a, 0xf6, 0xa5, 0x05, 0x33, 0x72, 0xf5, 0x37, 0x7c, 0x51, 0xbb, 0x0d, 0xe6, - 0x39, 0x8e, 0xdf, 0xa3, 0x86, 0x5d, 0x43, 0xd4, 0xf3, 0x4f, 0x18, 0x73, 0x01, 0x4c, 0x9b, 0x9e, - 0x7b, 0x12, 0x47, 0x8e, 0xad, 0x6d, 0xc7, 0xac, 0x7a, 0xa1, 0x80, 0x85, 0x04, 0x69, 0xd2, 0xb0, - 0x15, 0x70, 0x3a, 0x40, 0x15, 0x95, 0x18, 0x80, 0xfd, 0x88, 0xa6, 0x05, 0x41, 0xb4, 0x23, 0xde, - 0xf9, 0x43, 0x9e, 0xe7, 0xaa, 0x0c, 0xa2, 0xee, 0xd5, 0x61, 0x41, 0xa4, 0xdd, 0x96, 0xca, 0xee, - 0x53, 0xcf, 0x47, 0xd6, 0x70, 0x65, 0x30, 0x0f, 0x52, 0x87, 0xf8, 0x48, 0xc6, 0x1b, 0x1b, 0x86, - 0xd4, 0x6f, 0x48, 0xf5, 0x5d, 0x61, 0x52, 0xfd, 0x2c, 0x98, 0x68, 0xa3, 0x46, 0x2b, 0x50, 0x2e, - 0x26, 0xda, 0xcf, 0x40, 0x5e, 0x86, 0x52, 0xed, 0x83, 0x8c, 0x5c, 0x01, 0x67, 0x42, 0xf7, 0xa4, - 0x0a, 0x08, 0xd2, 0x2c, 0xf6, 0xf9, 0xad, 0xe9, 0x32, 0x1f, 0x6b, 0x8f, 0x64, 0xc6, 0x1f, 0x74, - 0xee, 0x78, 0x16, 0x09, 0x54, 0x40, 0x90, 0xe6, 0x19, 0x23, 0xe4, 0xf3, 0x31, 0xbc, 0x01, 0x40, - 0xaf, 0x76, 0x71, 0xdb, 0x72, 0x5b, 0xcb, 0x41, 0xca, 0xb3, 0x42, 0xa7, 0x8b, 0x32, 0x29, 0x0b, - 0x9d, 0x7e, 0xaf, 0xe7, 0xaa, 0x72, 0xe8, 0x66, 0x08, 0xe4, 0x73, 0x45, 0x3a, 0x36, 0x50, 0x2e, - 0x71, 0xae, 0x81, 0x74, 0xc3, 0xb3, 0x98, 0x75, 0xa9, 0xd5, 0xdc, 0xd6, 0xb9, 0x78, 0x59, 0xb9, - 0xe3, 0x59, 0x65, 0x7e, 0x04, 0xee, 0xf7, 0x01, 0xb5, 0x32, 0x14, 0x94, 0xd0, 0x13, 0x46, 0xd5, - 0xad, 0x7c, 0xf7, 0x90, 0x8f, 0x9c, 0xc0, 0x0f, 0x5a, 0x59, 0x02, 0x0c, 0x56, 0x25, 0xc0, 0x5f, - 0x80, 0xc9, 0x26, 0x5f, 0x91, 0x95, 0xaf, 0x10, 0x87, 0x28, 0x6e, 0xec, 0x4c, 0xbd, 0x79, 0x57, - 0x1a, 0xfb, 0xcf, 0xd7, 0xff, 0x5b, 0x57, 0xca, 0xf2, 0x8a, 0xf6, 0x5a, 0x01, 0xa7, 0xf6, 0x68, - 0x7d, 0x17, 0x35, 0x1a, 0x21, 0x77, 0x23, 0xdf, 0x22, 0xc1, 0xc3, 0xb0, 0x31, 0x3c, 0x0f, 0x32, - 0x16, 0x22, 0x15, 0x13, 0x35, 0x65, 0x8e, 0x4c, 0x5a, 0x88, 0xec, 0xa2, 0x26, 0xfc, 0x23, 0xc8, - 0x37, 0x7d, 0xaf, 0xe9, 0x11, 0xec, 0x77, 0xf3, 0x8c, 0xe5, 0xc8, 0xf4, 0xce, 0xd6, 0xb7, 0xef, - 0x4a, 0xba, 0x65, 0xd3, 0x7a, 0xab, 0xaa, 0x9b, 0x9e, 0x63, 0xc8, 0x3a, 0x2f, 0xfe, 0xbb, 0x42, - 0x6a, 0x87, 0x06, 0x3d, 0x6a, 0x62, 0xa2, 0xef, 0xf6, 0x12, 0xbc, 0x7c, 0x3a, 0x90, 0x15, 0x24, - 0xe7, 0x1c, 0xc8, 0x9a, 0xac, 0x6a, 0x57, 0xec, 0x5a, 0x21, 0xbd, 0xa8, 0xac, 0xa6, 0xca, 0x19, - 0x3e, 0xbf, 0x55, 0xd3, 0x8e, 0x15, 0x00, 0x0f, 0x90, 0x79, 0xdf, 0x76, 0x5a, 0x0d, 0x44, 0xf1, - 0x20, 0xf4, 0x4b, 0xe0, 0x14, 0xa1, 0x88, 0xe2, 0x8a, 0xd7, 0xc6, 0xbe, 0x6f, 0xd7, 0x44, 0xa2, - 0x4f, 0x97, 0x67, 0xf8, 0xea, 0x6f, 0xe5, 0x62, 0xd8, 0xc8, 0xd4, 0x50, 0x23, 0xd3, 0x9f, 0xc6, - 0xc8, 0x89, 0xa8, 0x91, 0x07, 0xe0, 0xec, 0x1e, 0xa1, 0xb6, 0x83, 0x28, 0xde, 0x47, 0xbd, 0x27, - 0xcf, 0x83, 0x94, 0x85, 0x84, 0x8d, 0xe9, 0x32, 0x1b, 0xb2, 0x15, 0x1f, 0x53, 0x69, 0x17, 0x1b, - 0x32, 0xa9, 0x6d, 0xa7, 0x82, 0x7d, 0xdf, 0x13, 0x55, 0x6b, 0xaa, 0x9c, 0x69, 0x3b, 0x7b, 0x6c, - 0xaa, 0x3d, 0x4f, 0x07, 0xa1, 0xee, 0x23, 0x13, 0x1f, 0x74, 0x02, 0xdf, 0x6d, 0x82, 0x94, 0x43, - 0x82, 0x06, 0x5a, 0x8a, 0x87, 0xd1, 0x5d, 0x62, 0xed, 0xd1, 0x3a, 0xf6, 0x71, 0xcb, 0x39, 0xe8, - 0x94, 0xd9, 0x59, 0xf8, 0x2b, 0x30, 0x4d, 0x99, 0x90, 0x8a, 0x6c, 0xbe, 0xa9, 0xa4, 0xe6, 0xcb, - 0x55, 0xc9, 0xe6, 0x9b, 0xa3, 0xbd, 0x09, 0xdc, 0x05, 0xd3, 0x4d, 0x1f, 0xd7, 0xb0, 0x89, 0x09, - 0xf1, 0x7c, 0xe6, 0xd8, 0xd4, 0x28, 0xda, 0x23, 0x97, 0x58, 0xf3, 0xa8, 0x36, 0x3c, 0xf3, 0x30, - 0x28, 0xd3, 0xc2, 0x8d, 0x39, 0xbe, 0x26, 0x8a, 0x34, 0x5c, 0x00, 0x40, 0x1c, 0xe1, 0xb5, 0x64, - 0x92, 0x7b, 0x64, 0x8a, 0xaf, 0xf0, 0xf6, 0x7b, 0x33, 0xd8, 0x66, 0xe4, 0xa5, 0x90, 0xe1, 0x66, - 0xa8, 0xba, 0x60, 0x36, 0x7a, 0xc0, 0x6c, 0xf4, 0x83, 0x80, 0xd9, 0xec, 0xcc, 0xb0, 0x5c, 0x7a, - 0xf9, 0x45, 0x49, 0x11, 0xf9, 0x24, 0x24, 0xb1, 0xed, 0xbe, 0xd1, 0x92, 0xfd, 0x34, 0xd1, 0x32, - 0x15, 0x89, 0x16, 0xa8, 0x81, 0x19, 0x61, 0x83, 0x83, 0x3a, 0x15, 0x16, 0x20, 0x20, 0xe4, 0x86, - 0xbb, 0xa8, 0xb3, 0x8f, 0xc8, 0xaf, 0xd3, 0xd9, 0xf1, 0x7c, 0xaa, 0x9c, 0xa5, 0x9d, 0x8a, 0xed, - 0xd6, 0x70, 0x47, 0x5b, 0x97, 0x1d, 0xa0, 0x1b, 0x0a, 0xbd, 0xf2, 0x5c, 0x43, 0x14, 0x05, 0x79, - 0xc4, 0xc6, 0xda, 0xeb, 0x14, 0xf8, 0x51, 0xef, 0xf0, 0x0e, 0x93, 0x1a, 0x0a, 0x1d, 0xda, 0x09, - 0x8a, 0xe4, 0xf0, 0xd0, 0xa1, 0x1d, 0xf2, 0x11, 0x42, 0xe7, 0x87, 0x57, 0x1f, 0xf1, 0xd5, 0xb5, - 0x2b, 0xe0, 0x7c, 0xec, 0xe1, 0x06, 0x3c, 0xf4, 0xb9, 0x2e, 0xa1, 0x21, 0xf8, 0x06, 0xc6, 0x3d, - 0xea, 0x3d, 0x1b, 0x5d, 0x96, 0x22, 0xae, 0x81, 0x2c, 0xeb, 0x6e, 0x95, 0x07, 0x58, 0x12, 0x86, - 0x9d, 0xb9, 0xcf, 0xdf, 0x95, 0xce, 0x09, 0x0b, 0x49, 0xed, 0x50, 0xb7, 0x3d, 0xc3, 0x41, 0xb4, - 0xae, 0xdf, 0x72, 0x29, 0x23, 0x32, 0xfc, 0xb6, 0x56, 0x92, 0x14, 0x6e, 0xbf, 0xe1, 0x55, 0x51, - 0xe3, 0xae, 0xed, 0xee, 0x23, 0x72, 0xcf, 0xb7, 0xbb, 0xfc, 0x49, 0x33, 0x41, 0x31, 0xe9, 0x80, - 0x54, 0xbc, 0x0d, 0x66, 0x1c, 0xdb, 0x65, 0x46, 0x57, 0x9a, 0x6c, 0x43, 0x6a, 0x5f, 0x60, 0xaf, - 0x94, 0x8c, 0x20, 0xe7, 0xf4, 0x44, 0x6d, 0xfd, 0x23, 0x0f, 0x26, 0xb8, 0x16, 0xf8, 0x77, 0x05, - 0x64, 0x24, 0x8b, 0x84, 0x4b, 0xf1, 0x28, 0xec, 0xf3, 0x99, 0xa0, 0x2e, 0x0f, 0x3b, 0x26, 0x70, - 0x6a, 0x97, 0xff, 0xfa, 0xff, 0xaf, 0xfe, 0x39, 0xbe, 0x04, 0x2f, 0x1a, 0xb1, 0xaf, 0x1d, 0xc9, - 0x24, 0x8d, 0xc7, 0x32, 0x68, 0x9e, 0xc0, 0x7f, 0x29, 0x60, 0x26, 0x42, 0xd6, 0xe1, 0xe5, 0x04, - 0x35, 0xfd, 0x3e, 0x0a, 0xd4, 0x8d, 0xd1, 0x0e, 0x4b, 0x64, 0x5b, 0x1c, 0xd9, 0x06, 0x5c, 0x8f, - 0x23, 0x0b, 0xbe, 0x0b, 0x62, 0x00, 0xff, 0xab, 0x80, 0xfc, 0x49, 0xde, 0x0d, 0xf5, 0x04, 0xb5, - 0x09, 0x74, 0x5f, 0x35, 0x46, 0x3e, 0x2f, 0x91, 0x5e, 0xe7, 0x48, 0xaf, 0xc1, 0xad, 0x38, 0xd2, - 0x76, 0x70, 0xa7, 0x07, 0x36, 0xfc, 0x29, 0xf1, 0x04, 0x3e, 0x55, 0x40, 0x46, 0x32, 0xec, 0xc4, - 0xa7, 0x8d, 0x92, 0xf7, 0xc4, 0xa7, 0x3d, 0x41, 0xd4, 0xb5, 0x0d, 0x0e, 0x6b, 0x19, 0x5e, 0x8a, - 0xc3, 0x92, 0x8c, 0x9d, 0x84, 0x5c, 0xf7, 0x42, 0x01, 0x19, 0xc9, 0xb5, 0x13, 0x81, 0x44, 0x89, - 0x7d, 0x22, 0x90, 0x13, 0x94, 0x5d, 0xdb, 0xe4, 0x40, 0x2e, 0xc3, 0xb5, 0x38, 0x10, 0x22, 0x8e, - 0xf6, 0x70, 0x18, 0x8f, 0x0f, 0xf1, 0xd1, 0x13, 0xf8, 0x08, 0xa4, 0x19, 0x25, 0x87, 0x5a, 0x62, - 0xc8, 0x74, 0x79, 0xbe, 0x7a, 0x71, 0xe0, 0x19, 0x89, 0x61, 0x8d, 0x63, 0xb8, 0x08, 0x2f, 0xf4, - 0x8b, 0xa6, 0x5a, 0xc4, 0x13, 0x7f, 0x02, 0x93, 0x82, 0x95, 0xc2, 0x4b, 0x09, 0x92, 0x23, 0xe4, - 0x57, 0x5d, 0x1a, 0x72, 0x4a, 0x22, 0x58, 0xe4, 0x08, 0x54, 0x58, 0x88, 0x23, 0x10, 0x8c, 0x17, - 0x76, 0x40, 0x46, 0x12, 0x5e, 0xb8, 0x18, 0x97, 0x19, 0xe5, 0xc2, 0xea, 0xca, 0xb0, 0x4e, 0x16, - 0xe8, 0xd5, 0xb8, 0xde, 0x79, 0xa8, 0xc6, 0xf5, 0x62, 0x5a, 0xaf, 0x98, 0x4c, 0xdd, 0xdf, 0x14, - 0x90, 0x0b, 0x31, 0xd6, 0x7e, 0x86, 0xc7, 0x09, 0xed, 0xe8, 0x10, 0x96, 0x39, 0x84, 0x45, 0x58, - 0x8c, 0x43, 0xa0, 0xc8, 0xac, 0x90, 0x40, 0xed, 0x5f, 0x40, 0x2e, 0xc4, 0x29, 0x47, 0x70, 0x42, - 0x1f, 0xd7, 0xf7, 0x21, 0xa5, 0x83, 0xf4, 0x63, 0x79, 0x9c, 0x55, 0x6a, 0xf8, 0x67, 0x90, 0x91, - 0x64, 0x23, 0x31, 0x05, 0xa2, 0xbc, 0x34, 0x31, 0x05, 0x4e, 0x70, 0x96, 0x41, 0x8f, 0x20, 0x98, - 0x06, 0xed, 0xc0, 0x67, 0x0a, 0x00, 0xbd, 0x2e, 0x08, 0x57, 0x07, 0x89, 0x0e, 0x33, 0x1c, 0x75, - 0x6d, 0x84, 0x93, 0x12, 0xc7, 0x12, 0xc7, 0x51, 0x82, 0x0b, 0x49, 0x38, 0x78, 0x6b, 0x66, 0x8e, - 0x90, 0x9d, 0x74, 0x40, 0x51, 0x0a, 0x37, 0xe0, 0x01, 0x45, 0x29, 0xd2, 0x90, 0x07, 0x39, 0x22, - 0x68, 0xd4, 0x2c, 0x01, 0x25, 0x8d, 0xba, 0x94, 0x98, 0xda, 0xa1, 0xdf, 0xdd, 0x12, 0x13, 0x30, - 0xfa, 0x3b, 0xdc, 0xa0, 0x04, 0x14, 0x3c, 0x0f, 0xfe, 0x5b, 0x01, 0x67, 0x62, 0x2d, 0x1d, 0x26, - 0xf5, 0x83, 0x24, 0x76, 0xa0, 0x5e, 0x1d, 0xfd, 0x82, 0x84, 0xb6, 0xc2, 0xa1, 0x5d, 0x80, 0xa5, - 0x38, 0xb4, 0x08, 0x8b, 0xd8, 0xb9, 0xfe, 0xe6, 0xb8, 0xa8, 0xbc, 0x3d, 0x2e, 0x2a, 0x5f, 0x1e, - 0x17, 0x95, 0x97, 0xef, 0x8b, 0x63, 0x6f, 0xdf, 0x17, 0xc7, 0x3e, 0x7b, 0x5f, 0x1c, 0xfb, 0xc3, - 0x62, 0x9c, 0xc7, 0x31, 0x21, 0x1d, 0x26, 0x86, 0xb3, 0xb8, 0xea, 0x24, 0x67, 0x8d, 0x3f, 0xf9, - 0x2e, 0x00, 0x00, 0xff, 0xff, 0x4b, 0x5e, 0xae, 0x69, 0xb8, 0x15, 0x00, 0x00, + // 1764 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x58, 0xcd, 0x6f, 0x1b, 0xc7, + 0x15, 0xd7, 0x8a, 0xb4, 0x28, 0x3d, 0x4a, 0x0e, 0x3d, 0x96, 0x1b, 0x7a, 0x6b, 0x89, 0xf2, 0xda, + 0xb2, 0xe4, 0x8f, 0xec, 0x46, 0x6a, 0x5a, 0xa0, 0xee, 0xa1, 0xb5, 0x04, 0x47, 0x49, 0x63, 0xb7, + 0xee, 0x46, 0xed, 0xa1, 0x40, 0x41, 0x0c, 0x77, 0xc7, 0xcb, 0x85, 0xb8, 0xbb, 0xcc, 0xce, 0x50, + 0xa5, 0x93, 0xba, 0x87, 0x00, 0x0d, 0x12, 0xe4, 0xd0, 0x00, 0xbd, 0xb7, 0x39, 0xf6, 0xd6, 0xde, + 0x72, 0xee, 0x2d, 0xc7, 0x00, 0xbd, 0x14, 0x3d, 0xb8, 0x85, 0x5c, 0xa0, 0xfd, 0x1b, 0x7a, 0x2a, + 0xe6, 0x8b, 0xdc, 0xd5, 0x72, 0x49, 0xa5, 0x88, 0x6f, 0x01, 0x04, 0x7b, 0xe7, 0xcd, 0xcc, 0x7b, + 0xbf, 0x37, 0xf3, 0xde, 0x9b, 0xdf, 0x23, 0x5c, 0xf1, 0x12, 0x1a, 0x25, 0xd4, 0x21, 0xc7, 0x91, + 0xc3, 0xff, 0x76, 0x9c, 0x77, 0x06, 0x24, 0x7d, 0x62, 0xf7, 0xd3, 0x84, 0x25, 0xa8, 0x21, 0x67, + 0x6d, 0x72, 0x1c, 0xd9, 0xfc, 0x6f, 0xc7, 0xbc, 0x80, 0xa3, 0x30, 0x4e, 0x1c, 0xf1, 0xaf, 0x5c, + 0x64, 0xde, 0x52, 0x2a, 0x3a, 0x98, 0x12, 0xb9, 0xdb, 0x39, 0xde, 0xe9, 0x10, 0x86, 0x77, 0x9c, + 0x3e, 0x0e, 0xc2, 0x18, 0xb3, 0x30, 0x89, 0xd5, 0xda, 0xd5, 0x20, 0x09, 0x12, 0xf1, 0xe9, 0xf0, + 0x2f, 0x25, 0xbd, 0x12, 0x24, 0x49, 0xd0, 0x23, 0x0e, 0xee, 0x87, 0x0e, 0x8e, 0xe3, 0x84, 0x89, + 0x2d, 0x54, 0xcd, 0xb6, 0xd4, 0xac, 0x18, 0x75, 0x06, 0x8f, 0x1d, 0x16, 0x46, 0x84, 0x32, 0x1c, + 0xf5, 0xd5, 0x02, 0xb3, 0xe0, 0x03, 0xc7, 0x2b, 0xe7, 0x2e, 0x17, 0xe6, 0xd8, 0x50, 0x4e, 0x59, + 0xab, 0x80, 0x7e, 0xc2, 0xd1, 0xee, 0x27, 0xf1, 0xe3, 0x30, 0x70, 0xc9, 0x3b, 0x03, 0x42, 0x99, + 0xf5, 0x00, 0x2e, 0xe6, 0xa4, 0xb4, 0x9f, 0xc4, 0x94, 0xa0, 0x6f, 0xc3, 0x82, 0x27, 0x24, 0x4d, + 0x63, 0xc3, 0xd8, 0xae, 0xef, 0xae, 0xd9, 0xa7, 0x8f, 0xc6, 0xde, 0xef, 0xe2, 0x30, 0x56, 0xdb, + 0xd4, 0x62, 0xeb, 0xbb, 0x4a, 0xdb, 0x3d, 0xcf, 0x4b, 0x06, 0x31, 0x53, 0x46, 0x50, 0x13, 0x6a, + 0xd8, 0xf7, 0x53, 0x42, 0xa9, 0x50, 0xb7, 0xe4, 0xea, 0xe1, 0xdd, 0xc5, 0x0f, 0x3f, 0x6d, 0xcd, + 0xfd, 0xe7, 0xd3, 0xd6, 0x9c, 0xe5, 0xc1, 0x6a, 0x7e, 0xab, 0x42, 0xd2, 0x84, 0x5a, 0x07, 0xf7, + 0x70, 0xec, 0x11, 0xbd, 0x57, 0x0d, 0xd1, 0x37, 0x61, 0xc9, 0x4b, 0x7c, 0xd2, 0xee, 0x62, 0xda, + 0x6d, 0xce, 0x8b, 0xb9, 0x45, 0x2e, 0x78, 0x03, 0xd3, 0x2e, 0x5a, 0x85, 0x73, 0x71, 0xc2, 0x37, + 0x55, 0x36, 0x8c, 0xed, 0xaa, 0x2b, 0x07, 0xd6, 0xf7, 0xe1, 0xb2, 0xf2, 0x96, 0x3b, 0xf3, 0x7f, + 0xa0, 0xfc, 0xc0, 0x00, 0x73, 0x92, 0x06, 0x05, 0x76, 0x13, 0xce, 0xcb, 0x73, 0x6a, 0xe7, 0x35, + 0xad, 0x48, 0xe9, 0x3d, 0x29, 0x44, 0x26, 0x2c, 0x52, 0x6e, 0x94, 0xe3, 0x9b, 0x17, 0xf8, 0x46, + 0x63, 0xae, 0x02, 0x4b, 0xad, 0xed, 0x78, 0x10, 0x75, 0x48, 0xaa, 0x3c, 0x58, 0x51, 0xd2, 0x1f, + 0x09, 0xa1, 0xf5, 0x16, 0x5c, 0x11, 0x38, 0x7e, 0x86, 0x7b, 0xa1, 0x8f, 0x59, 0x92, 0x9e, 0x72, + 0xe6, 0x2a, 0x2c, 0x7b, 0x49, 0x7c, 0x1a, 0x47, 0x9d, 0xcb, 0xee, 0x15, 0xbc, 0xfa, 0xd8, 0x80, + 0xb5, 0x12, 0x6d, 0xca, 0xb1, 0x2d, 0x78, 0x49, 0xa3, 0xca, 0x6b, 0xd4, 0x60, 0xbf, 0x42, 0xd7, + 0x74, 0x10, 0xed, 0xc9, 0x7b, 0xfe, 0x32, 0xd7, 0xf3, 0xaa, 0x0a, 0xa2, 0xd1, 0xd6, 0x59, 0x41, + 0x64, 0xbd, 0xa5, 0x8c, 0xbd, 0xcd, 0x92, 0x14, 0x07, 0xb3, 0x8d, 0xa1, 0x06, 0x54, 0x8e, 0xc8, + 0x13, 0x15, 0x6f, 0xfc, 0x33, 0x63, 0xfe, 0x8e, 0x32, 0x3f, 0x52, 0xa6, 0xcc, 0xaf, 0xc2, 0xb9, + 0x63, 0xdc, 0x1b, 0x68, 0xe3, 0x72, 0x60, 0x7d, 0x07, 0x1a, 0x2a, 0x94, 0xfc, 0x2f, 0xe5, 0xe4, + 0x16, 0x5c, 0xc8, 0xec, 0x53, 0x26, 0x10, 0x54, 0x79, 0xec, 0x8b, 0x5d, 0xcb, 0xae, 0xf8, 0xb6, + 0xde, 0x55, 0x19, 0x7f, 0x38, 0x7c, 0x90, 0x04, 0x54, 0x9b, 0x40, 0x50, 0x15, 0x19, 0x23, 0xf5, + 0x8b, 0x6f, 0xf4, 0x3a, 0xc0, 0xb8, 0x76, 0x09, 0xdf, 0xea, 0xbb, 0x37, 0x74, 0xca, 0xf3, 0x42, + 0x67, 0xcb, 0x32, 0xa9, 0x0a, 0x9d, 0xfd, 0x68, 0x7c, 0x54, 0x6e, 0x66, 0x67, 0x06, 0xe4, 0x47, + 0x86, 0x3a, 0x58, 0x6d, 0x5c, 0xe1, 0xbc, 0x09, 0xd5, 0x5e, 0x12, 0x70, 0xef, 0x2a, 0xdb, 0xf5, + 0xdd, 0x4b, 0xc5, 0xb2, 0xf2, 0x20, 0x09, 0x5c, 0xb1, 0x04, 0x1d, 0x4c, 0x00, 0xb5, 0x35, 0x13, + 0x94, 0xb4, 0x93, 0x45, 0x35, 0xaa, 0x7c, 0x8f, 0x70, 0x8a, 0x23, 0x7d, 0x0e, 0x96, 0xab, 0x00, + 0x6a, 0xa9, 0x02, 0xf8, 0x3d, 0x58, 0xe8, 0x0b, 0x89, 0xaa, 0x7c, 0xcd, 0x22, 0x44, 0xb9, 0x63, + 0x6f, 0xe9, 0xf3, 0x67, 0xad, 0xb9, 0x3f, 0xfe, 0xfb, 0xcf, 0xb7, 0x0c, 0x57, 0x6d, 0xb1, 0x3e, + 0x33, 0xe0, 0xfc, 0x7d, 0xd6, 0xdd, 0xc7, 0xbd, 0x5e, 0xe6, 0xb8, 0x71, 0x1a, 0x50, 0x7d, 0x31, + 0xfc, 0x1b, 0xbd, 0x0c, 0xb5, 0x00, 0xd3, 0xb6, 0x87, 0xfb, 0x2a, 0x47, 0x16, 0x02, 0x4c, 0xf7, + 0x71, 0x1f, 0xfd, 0x02, 0x1a, 0xfd, 0x34, 0xe9, 0x27, 0x94, 0xa4, 0xa3, 0x3c, 0xe3, 0x39, 0xb2, + 0xbc, 0xb7, 0xfb, 0xdf, 0x67, 0x2d, 0x3b, 0x08, 0x59, 0x77, 0xd0, 0xb1, 0xbd, 0x24, 0x72, 0x54, + 0x9d, 0x97, 0xff, 0xbd, 0x42, 0xfd, 0x23, 0x87, 0x3d, 0xe9, 0x13, 0x6a, 0xef, 0x8f, 0x13, 0xdc, + 0x7d, 0x49, 0xeb, 0xd2, 0xc9, 0x79, 0x19, 0x16, 0x3d, 0x5e, 0xb5, 0xdb, 0xa1, 0xdf, 0xac, 0x6e, + 0x18, 0xdb, 0x15, 0xb7, 0x26, 0xc6, 0x6f, 0xfa, 0xd6, 0x89, 0x01, 0xe8, 0x10, 0x7b, 0x6f, 0x87, + 0xd1, 0xa0, 0x87, 0x19, 0x99, 0x86, 0x7e, 0x13, 0xce, 0x53, 0x86, 0x19, 0x69, 0x27, 0xc7, 0x24, + 0x4d, 0x43, 0x5f, 0x26, 0xfa, 0xb2, 0xbb, 0x22, 0xa4, 0x3f, 0x56, 0xc2, 0xac, 0x93, 0x95, 0x99, + 0x4e, 0x56, 0x5f, 0x8c, 0x93, 0xe7, 0xf2, 0x4e, 0xfe, 0xc5, 0x80, 0x8b, 0x39, 0x27, 0xc7, 0xc9, + 0x53, 0x48, 0x09, 0x1d, 0xa8, 0xf3, 0xb3, 0x03, 0xb5, 0x01, 0x95, 0x94, 0x30, 0x79, 0x51, 0x2e, + 0xff, 0xe4, 0x18, 0x8e, 0xa3, 0x36, 0x49, 0xd3, 0x24, 0x15, 0xae, 0x2d, 0xb9, 0xb5, 0xe3, 0xe8, + 0x3e, 0x1f, 0xf2, 0x29, 0x7e, 0x2c, 0x03, 0x4a, 0x24, 0xbc, 0xaa, 0xcb, 0x8f, 0xe9, 0xa7, 0x94, + 0xf8, 0xe8, 0x1a, 0xac, 0xf0, 0x29, 0x42, 0x59, 0x18, 0x61, 0x46, 0xfc, 0xe6, 0x82, 0x98, 0x5f, + 0x0e, 0x30, 0xbd, 0xaf, 0x65, 0xd6, 0x21, 0x5c, 0xd4, 0x83, 0x03, 0x3c, 0x0e, 0xdb, 0x06, 0x54, + 0x02, 0x2c, 0xef, 0xa9, 0xea, 0xf2, 0x4f, 0x8d, 0x6a, 0x7e, 0x32, 0xaa, 0x4a, 0x0e, 0x95, 0xf5, + 0x51, 0x55, 0xa7, 0x6b, 0x8a, 0x3d, 0x72, 0x38, 0xd4, 0xf7, 0xbf, 0x03, 0x95, 0x88, 0x6a, 0x12, + 0xd0, 0x2a, 0x1e, 0xc2, 0x43, 0x1a, 0xdc, 0x67, 0x5d, 0x92, 0x92, 0x41, 0x74, 0x38, 0x74, 0xf9, + 0x5a, 0xf4, 0x03, 0x58, 0x66, 0x5c, 0x49, 0x5b, 0x11, 0x88, 0x4a, 0x19, 0x81, 0x10, 0xa6, 0x14, + 0x81, 0xa8, 0xb3, 0xf1, 0x00, 0xed, 0xc3, 0x72, 0x3f, 0x25, 0x3e, 0xf1, 0x08, 0xa5, 0x49, 0xca, + 0x83, 0xa3, 0x72, 0x16, 0xeb, 0xb9, 0x4d, 0xfc, 0x01, 0xec, 0xf4, 0x12, 0xef, 0x48, 0x3f, 0x35, + 0x32, 0x14, 0xea, 0x42, 0x26, 0x1f, 0x1a, 0xb4, 0x06, 0x20, 0x97, 0x88, 0xcb, 0x5f, 0x10, 0x27, + 0xb2, 0x24, 0x24, 0x82, 0x42, 0xbc, 0xa1, 0xa7, 0x39, 0x01, 0x6b, 0xd6, 0x84, 0x1b, 0xa6, 0x2d, + 0xd9, 0x99, 0xad, 0xd9, 0x99, 0x7d, 0xa8, 0xd9, 0xd9, 0xde, 0x0a, 0xaf, 0x07, 0x9f, 0xfc, 0xa3, + 0x65, 0xc8, 0x9a, 0x20, 0x35, 0xf1, 0xe9, 0x89, 0x11, 0xbf, 0xf8, 0x62, 0x22, 0x7e, 0x29, 0x17, + 0xf1, 0xc8, 0x82, 0x15, 0xe9, 0x43, 0x84, 0x87, 0x6d, 0x1e, 0x20, 0x90, 0x39, 0x86, 0x87, 0x78, + 0x78, 0x80, 0xe9, 0x0f, 0xab, 0x8b, 0xf3, 0x8d, 0x8a, 0xbb, 0xc8, 0x86, 0xed, 0x30, 0xf6, 0xc9, + 0xd0, 0xba, 0xa5, 0x5e, 0xb1, 0x51, 0x28, 0x8c, 0xb3, 0xc4, 0xc7, 0x0c, 0xeb, 0x5a, 0xc0, 0xbf, + 0xad, 0xcf, 0x2a, 0xf0, 0x8d, 0xf1, 0xe2, 0x3d, 0xae, 0x35, 0x13, 0x3a, 0x6c, 0xa8, 0x0b, 0xfd, + 0xec, 0xd0, 0x61, 0x43, 0xfa, 0x15, 0x84, 0xce, 0xd7, 0xb7, 0x7e, 0xc6, 0x5b, 0xb7, 0x5e, 0x81, + 0x97, 0x0b, 0x17, 0x37, 0xe5, 0xa2, 0x2f, 0x8d, 0x48, 0x19, 0x25, 0xaf, 0x13, 0x32, 0x6e, 0x1f, + 0x56, 0xf3, 0x62, 0xa5, 0xe2, 0x35, 0x58, 0xe4, 0x2f, 0x74, 0xfb, 0x31, 0x51, 0xa4, 0x67, 0xef, + 0xf2, 0xdf, 0x9f, 0xb5, 0x2e, 0x49, 0x0f, 0xa9, 0x7f, 0x64, 0x87, 0x89, 0x13, 0x61, 0xd6, 0xb5, + 0xdf, 0x8c, 0x19, 0x27, 0x63, 0x62, 0xb7, 0xd5, 0x52, 0x34, 0xf4, 0xa0, 0x97, 0x74, 0x70, 0xef, + 0x61, 0x18, 0x1f, 0x60, 0xfa, 0x28, 0x0d, 0x47, 0x1c, 0xd0, 0xf2, 0x60, 0xbd, 0x6c, 0x81, 0x32, + 0x7c, 0x0f, 0x56, 0xa2, 0x30, 0xe6, 0x4e, 0xb7, 0xfb, 0x7c, 0x42, 0x59, 0x5f, 0xe3, 0xb7, 0x54, + 0x8e, 0xa0, 0x1e, 0x8d, 0x55, 0xed, 0xfe, 0xb6, 0x01, 0xe7, 0x84, 0x15, 0xf4, 0x1b, 0x03, 0x6a, + 0x8a, 0x09, 0xa3, 0xcd, 0x62, 0x14, 0x4e, 0x68, 0x75, 0xcc, 0x1b, 0xb3, 0x96, 0x49, 0x9c, 0xd6, + 0xed, 0xf7, 0xff, 0xfa, 0xaf, 0xdf, 0xcd, 0x6f, 0xa2, 0x6b, 0x4e, 0xa1, 0x63, 0x53, 0x6c, 0xd8, + 0x79, 0x4f, 0x05, 0xcd, 0x53, 0xf4, 0x7b, 0x03, 0x56, 0x72, 0x0d, 0x07, 0xba, 0x5d, 0x62, 0x66, + 0x52, 0x63, 0x63, 0xde, 0x39, 0xdb, 0x62, 0x85, 0x6c, 0x57, 0x20, 0xbb, 0x83, 0x6e, 0x15, 0x91, + 0xe9, 0xde, 0xa6, 0x00, 0xf0, 0x4f, 0x06, 0x34, 0x4e, 0xf7, 0x0e, 0xc8, 0x2e, 0x31, 0x5b, 0xd2, + 0xb2, 0x98, 0xce, 0x99, 0xd7, 0x2b, 0xa4, 0x77, 0x05, 0xd2, 0xd7, 0xd0, 0x6e, 0x11, 0xe9, 0xb1, + 0xde, 0x33, 0x06, 0x9b, 0x6d, 0x87, 0x9e, 0xa2, 0x0f, 0x0c, 0xa8, 0xa9, 0x2e, 0xa1, 0xf4, 0x6a, + 0xf3, 0x0d, 0x48, 0xe9, 0xd5, 0x9e, 0x6a, 0x36, 0xac, 0x3b, 0x02, 0xd6, 0x0d, 0x74, 0xbd, 0x08, + 0x4b, 0x75, 0x1d, 0x34, 0x73, 0x74, 0x1f, 0x1b, 0x50, 0x53, 0xfd, 0x42, 0x29, 0x90, 0x7c, 0x73, + 0x52, 0x0a, 0xe4, 0x54, 0xdb, 0x61, 0xed, 0x08, 0x20, 0xb7, 0xd1, 0xcd, 0x22, 0x10, 0x2a, 0x97, + 0x8e, 0x71, 0x38, 0xef, 0x1d, 0x91, 0x27, 0x4f, 0xd1, 0xbb, 0x50, 0xe5, 0x6d, 0x05, 0xb2, 0x4a, + 0x43, 0x66, 0xd4, 0xab, 0x98, 0xd7, 0xa6, 0xae, 0x51, 0x18, 0x6e, 0x0a, 0x0c, 0xd7, 0xd0, 0xd5, + 0x49, 0xd1, 0xe4, 0xe7, 0x4e, 0xe2, 0x97, 0xb0, 0x20, 0x99, 0x35, 0xba, 0x5e, 0xa2, 0x39, 0x47, + 0xe0, 0xcd, 0xcd, 0x19, 0xab, 0x14, 0x82, 0x0d, 0x81, 0xc0, 0x44, 0xcd, 0x22, 0x02, 0xc9, 0xda, + 0xd1, 0x10, 0x6a, 0x8a, 0xb4, 0xa3, 0x8d, 0xa2, 0xce, 0x3c, 0x9f, 0x37, 0xb7, 0x66, 0xbd, 0x64, + 0xda, 0xae, 0x25, 0xec, 0x5e, 0x41, 0x66, 0xd1, 0x2e, 0x61, 0xdd, 0xb6, 0xc7, 0xcd, 0xbd, 0x6f, + 0x40, 0x3d, 0x43, 0x48, 0x27, 0x39, 0x5e, 0x24, 0xe5, 0x93, 0x1c, 0x9f, 0xc0, 0x6a, 0xad, 0x1b, + 0x02, 0xc0, 0x06, 0x5a, 0x2f, 0x02, 0x60, 0xd8, 0x6b, 0x53, 0x6d, 0xf4, 0xd7, 0x50, 0xcf, 0x30, + 0xca, 0x33, 0x1c, 0xc1, 0x04, 0xfb, 0x13, 0x28, 0xe9, 0x34, 0xfb, 0x9a, 0xe2, 0xf2, 0x3a, 0x8d, + 0x7e, 0x05, 0x35, 0x45, 0x35, 0x4a, 0x13, 0x20, 0xcf, 0x4a, 0x4b, 0x13, 0xe0, 0x14, 0x63, 0x99, + 0x76, 0x05, 0x92, 0x67, 0xb0, 0x21, 0xfa, 0xd0, 0x00, 0x18, 0xbf, 0x81, 0x68, 0x7b, 0x9a, 0xea, + 0x2c, 0xbf, 0x31, 0x6f, 0x9e, 0x61, 0xa5, 0xc2, 0xb1, 0x29, 0x70, 0xb4, 0xd0, 0x5a, 0x19, 0x0e, + 0xf1, 0x30, 0xf3, 0x83, 0x50, 0xef, 0xe8, 0x94, 0x92, 0x94, 0x7d, 0x7e, 0xa7, 0x94, 0xa4, 0xdc, + 0x73, 0x3c, 0xed, 0x20, 0xf4, 0x33, 0xcd, 0xd3, 0x4f, 0x91, 0xa8, 0xeb, 0xa5, 0x89, 0x9d, 0xf9, + 0xe5, 0xb0, 0x34, 0xfd, 0xf2, 0xbf, 0x24, 0x4e, 0x4b, 0x3f, 0xc9, 0xf2, 0xd0, 0x1f, 0x0c, 0xb8, + 0x50, 0x78, 0xd0, 0x51, 0xd9, 0x6b, 0x50, 0xc6, 0x0d, 0xcc, 0x57, 0xcf, 0xbe, 0x41, 0x41, 0xdb, + 0x12, 0xd0, 0xae, 0xa2, 0x56, 0x11, 0x5a, 0x8e, 0x43, 0xec, 0xdd, 0xfd, 0xfc, 0x64, 0xdd, 0xf8, + 0xe2, 0x64, 0xdd, 0xf8, 0xe7, 0xc9, 0xba, 0xf1, 0xc9, 0xf3, 0xf5, 0xb9, 0x2f, 0x9e, 0xaf, 0xcf, + 0xfd, 0xed, 0xf9, 0xfa, 0xdc, 0xcf, 0x37, 0x8a, 0x2c, 0x8e, 0x2b, 0x19, 0x72, 0x35, 0x82, 0xc3, + 0x75, 0x16, 0x04, 0x67, 0xfc, 0xd6, 0xff, 0x02, 0x00, 0x00, 0xff, 0xff, 0x2b, 0x91, 0xfa, 0x1c, + 0x7a, 0x16, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -1740,7 +1839,7 @@ type QueryClient interface { // EthCall implements the `eth_call` rpc api EthCall(ctx context.Context, in *EthCallRequest, opts ...grpc.CallOption) (*MsgEthereumTxResponse, error) // TacSimulate implements the custom `eth_tacSimulate` rpc api which supports state override - TacSimulate(ctx context.Context, in *TacSimulateRequest, opts ...grpc.CallOption) (*MsgEthereumTxResponse, error) + TacSimulate(ctx context.Context, in *TacSimulateRequest, opts ...grpc.CallOption) (*TacSimulateResponse, error) // EstimateGas implements the `eth_estimateGas` rpc api EstimateGas(ctx context.Context, in *EthCallRequest, opts ...grpc.CallOption) (*EstimateGasResponse, error) // TraceTx implements the `debug_traceTransaction` rpc api @@ -1841,8 +1940,8 @@ func (c *queryClient) EthCall(ctx context.Context, in *EthCallRequest, opts ...g return out, nil } -func (c *queryClient) TacSimulate(ctx context.Context, in *TacSimulateRequest, opts ...grpc.CallOption) (*MsgEthereumTxResponse, error) { - out := new(MsgEthereumTxResponse) +func (c *queryClient) TacSimulate(ctx context.Context, in *TacSimulateRequest, opts ...grpc.CallOption) (*TacSimulateResponse, error) { + out := new(TacSimulateResponse) err := c.cc.Invoke(ctx, "/cosmos.evm.vm.v1.Query/TacSimulate", in, out, opts...) if err != nil { return nil, err @@ -1925,7 +2024,7 @@ type QueryServer interface { // EthCall implements the `eth_call` rpc api EthCall(context.Context, *EthCallRequest) (*MsgEthereumTxResponse, error) // TacSimulate implements the custom `eth_tacSimulate` rpc api which supports state override - TacSimulate(context.Context, *TacSimulateRequest) (*MsgEthereumTxResponse, error) + TacSimulate(context.Context, *TacSimulateRequest) (*TacSimulateResponse, error) // EstimateGas implements the `eth_estimateGas` rpc api EstimateGas(context.Context, *EthCallRequest) (*EstimateGasResponse, error) // TraceTx implements the `debug_traceTransaction` rpc api @@ -1974,7 +2073,7 @@ func (*UnimplementedQueryServer) Params(ctx context.Context, req *QueryParamsReq func (*UnimplementedQueryServer) EthCall(ctx context.Context, req *EthCallRequest) (*MsgEthereumTxResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method EthCall not implemented") } -func (*UnimplementedQueryServer) TacSimulate(ctx context.Context, req *TacSimulateRequest) (*MsgEthereumTxResponse, error) { +func (*UnimplementedQueryServer) TacSimulate(ctx context.Context, req *TacSimulateRequest) (*TacSimulateResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method TacSimulate not implemented") } func (*UnimplementedQueryServer) EstimateGas(ctx context.Context, req *EthCallRequest) (*EstimateGasResponse, error) { @@ -3044,6 +3143,74 @@ func (m *TacSimulateRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *TacSimulateResponse) 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 *TacSimulateResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *TacSimulateResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.GasEstimated != 0 { + i = encodeVarintQuery(dAtA, i, uint64(m.GasEstimated)) + i-- + dAtA[i] = 0x30 + } + if m.GasUsed != 0 { + i = encodeVarintQuery(dAtA, i, uint64(m.GasUsed)) + i-- + dAtA[i] = 0x28 + } + if len(m.VmError) > 0 { + i -= len(m.VmError) + copy(dAtA[i:], m.VmError) + i = encodeVarintQuery(dAtA, i, uint64(len(m.VmError))) + i-- + dAtA[i] = 0x22 + } + if len(m.Ret) > 0 { + i -= len(m.Ret) + copy(dAtA[i:], m.Ret) + i = encodeVarintQuery(dAtA, i, uint64(len(m.Ret))) + i-- + dAtA[i] = 0x1a + } + if len(m.Logs) > 0 { + for iNdEx := len(m.Logs) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Logs[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + if len(m.Hash) > 0 { + i -= len(m.Hash) + copy(dAtA[i:], m.Hash) + i = encodeVarintQuery(dAtA, i, uint64(len(m.Hash))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func (m *EstimateGasResponse) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -3762,6 +3929,39 @@ func (m *TacSimulateRequest) Size() (n int) { return n } +func (m *TacSimulateResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Hash) + if l > 0 { + n += 1 + l + sovQuery(uint64(l)) + } + if len(m.Logs) > 0 { + for _, e := range m.Logs { + l = e.Size() + n += 1 + l + sovQuery(uint64(l)) + } + } + l = len(m.Ret) + if l > 0 { + n += 1 + l + sovQuery(uint64(l)) + } + l = len(m.VmError) + if l > 0 { + n += 1 + l + sovQuery(uint64(l)) + } + if m.GasUsed != 0 { + n += 1 + sovQuery(uint64(m.GasUsed)) + } + if m.GasEstimated != 0 { + n += 1 + sovQuery(uint64(m.GasEstimated)) + } + return n +} + func (m *EstimateGasResponse) Size() (n int) { if m == nil { return 0 @@ -5934,6 +6134,226 @@ func (m *TacSimulateRequest) Unmarshal(dAtA []byte) error { } return nil } +func (m *TacSimulateResponse) 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: TacSimulateResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: TacSimulateResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Hash", 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 + } + m.Hash = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Logs", 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 + } + m.Logs = append(m.Logs, &Log{}) + if err := m.Logs[len(m.Logs)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Ret", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Ret = append(m.Ret[:0], dAtA[iNdEx:postIndex]...) + if m.Ret == nil { + m.Ret = []byte{} + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field VmError", 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 + } + m.VmError = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field GasUsed", wireType) + } + m.GasUsed = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.GasUsed |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 6: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field GasEstimated", wireType) + } + m.GasEstimated = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.GasEstimated |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + 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 *EstimateGasResponse) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 From d235109c764ee5b564bd5643dfcf52bba8492cf9 Mon Sep 17 00:00:00 2001 From: Aleksei Kokinos Date: Tue, 17 Feb 2026 19:44:55 +0700 Subject: [PATCH 17/19] - fix TacSimulate grpc to return estimatedGas value in response. - add to EstimateGasIntenal possibility use stateOverride --- rpc/backend/backend.go | 2 +- rpc/backend/call_tx.go | 2 +- rpc/backend/mocks/evm_query_client.go | 10 ++++---- rpc/namespaces/ethereum/eth/api.go | 9 ++++--- rpc/types/types.go | 2 ++ x/erc20/keeper/msg_server_test.go | 8 +++--- x/erc20/keeper/proposals_test.go | 2 +- x/erc20/types/interfaces.go | 2 +- x/erc20/types/mocks/EVMKeeper.go | 18 ++++++------- x/vm/keeper/call_evm.go | 2 +- x/vm/keeper/grpc_query.go | 37 +++++++++++++++++++++++---- x/vm/keeper/grpc_query_test.go | 18 ++++++------- x/vm/keeper/state_transition.go | 8 ++++++ 13 files changed, 79 insertions(+), 41 deletions(-) diff --git a/rpc/backend/backend.go b/rpc/backend/backend.go index 3a3097454..bd24d27a0 100644 --- a/rpc/backend/backend.go +++ b/rpc/backend/backend.go @@ -110,7 +110,7 @@ type EVMBackend interface { SetTxDefaults(args evmtypes.TransactionArgs) (evmtypes.TransactionArgs, error) EstimateGas(args evmtypes.TransactionArgs, blockNrOptional *rpctypes.BlockNumber) (hexutil.Uint64, error) DoCall(args evmtypes.TransactionArgs, blockNr rpctypes.BlockNumber) (*evmtypes.MsgEthereumTxResponse, error) - DoTacSimulate(args evmtypes.TransactionArgs, blockNr rpctypes.BlockNumber, stateOverride evmtypes.StateOverride) (*evmtypes.MsgEthereumTxResponse, error) + DoTacSimulate(args evmtypes.TransactionArgs, blockNr rpctypes.BlockNumber, stateOverride evmtypes.StateOverride) (*evmtypes.TacSimulateResponse, error) GasPrice() (*hexutil.Big, error) // Filter API diff --git a/rpc/backend/call_tx.go b/rpc/backend/call_tx.go index 73d03eeb0..38617aa1b 100644 --- a/rpc/backend/call_tx.go +++ b/rpc/backend/call_tx.go @@ -376,7 +376,7 @@ func (b *Backend) DoTacSimulate( args evmtypes.TransactionArgs, blockNr rpctypes.BlockNumber, stateOverride evmtypes.StateOverride, -) (*evmtypes.MsgEthereumTxResponse, error) { +) (*evmtypes.TacSimulateResponse, error) { bz, err := json.Marshal(&args) if err != nil { return nil, err diff --git a/rpc/backend/mocks/evm_query_client.go b/rpc/backend/mocks/evm_query_client.go index 82a6cf9f9..70ef9fed0 100644 --- a/rpc/backend/mocks/evm_query_client.go +++ b/rpc/backend/mocks/evm_query_client.go @@ -425,7 +425,7 @@ func (_m *EVMQueryClient) Storage(ctx context.Context, in *types.QueryStorageReq } // TacSimulate provides a mock function with given fields: ctx, in, opts -func (_m *EVMQueryClient) TacSimulate(ctx context.Context, in *types.TacSimulateRequest, opts ...grpc.CallOption) (*types.MsgEthereumTxResponse, error) { +func (_m *EVMQueryClient) TacSimulate(ctx context.Context, in *types.TacSimulateRequest, opts ...grpc.CallOption) (*types.TacSimulateResponse, error) { _va := make([]interface{}, len(opts)) for _i := range opts { _va[_i] = opts[_i] @@ -439,16 +439,16 @@ func (_m *EVMQueryClient) TacSimulate(ctx context.Context, in *types.TacSimulate panic("no return value specified for TacSimulate") } - var r0 *types.MsgEthereumTxResponse + var r0 *types.TacSimulateResponse var r1 error - if rf, ok := ret.Get(0).(func(context.Context, *types.TacSimulateRequest, ...grpc.CallOption) (*types.MsgEthereumTxResponse, error)); ok { + if rf, ok := ret.Get(0).(func(context.Context, *types.TacSimulateRequest, ...grpc.CallOption) (*types.TacSimulateResponse, error)); ok { return rf(ctx, in, opts...) } - if rf, ok := ret.Get(0).(func(context.Context, *types.TacSimulateRequest, ...grpc.CallOption) *types.MsgEthereumTxResponse); ok { + if rf, ok := ret.Get(0).(func(context.Context, *types.TacSimulateRequest, ...grpc.CallOption) *types.TacSimulateResponse); ok { r0 = rf(ctx, in, opts...) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).(*types.MsgEthereumTxResponse) + r0 = ret.Get(0).(*types.TacSimulateResponse) } } diff --git a/rpc/namespaces/ethereum/eth/api.go b/rpc/namespaces/ethereum/eth/api.go index e71b1986a..de2fcace9 100644 --- a/rpc/namespaces/ethereum/eth/api.go +++ b/rpc/namespaces/ethereum/eth/api.go @@ -310,10 +310,11 @@ func (e *PublicAPI) TacSimulate(args evmtypes.TransactionArgs, rpcLogs := rpctypes.ToRPCTypeLogs(data.Logs) tacSimulateResult := rpctypes.TacSimulateResult{ - Output: hexutil.Bytes(data.Ret), - VmError: data.VmError, - Logs: rpcLogs, - GasUsed: hexutil.Uint64(data.GasUsed), + Output: hexutil.Bytes(data.Ret), + VmError: data.VmError, + Logs: rpcLogs, + GasUsed: hexutil.Uint64(data.GasUsed), + GasEstimated: hexutil.Uint64(data.GasEstimated), } ret, err := json.Marshal(tacSimulateResult) diff --git a/rpc/types/types.go b/rpc/types/types.go index 6edad12c0..084085d6f 100644 --- a/rpc/types/types.go +++ b/rpc/types/types.go @@ -82,6 +82,8 @@ type TacSimulateResult struct { Logs []ethtypes.Log `json:"logs,omitempty"` // GasUsed is the gas used by the EVM execution, it is 0 if the execution is reverted GasUsed hexutil.Uint64 `json:"gasUsed"` + // GasEstimated is the estimated gas limit needed to execute the transaction (from eth_estimateGas binary search) + GasEstimated hexutil.Uint64 `json:"gasEstimated"` } func ToRPCTypeLogs(logs []*evmtypes.Log) []ethtypes.Log { diff --git a/x/erc20/keeper/msg_server_test.go b/x/erc20/keeper/msg_server_test.go index d6e965c5b..e5fa15c4f 100644 --- a/x/erc20/keeper/msg_server_test.go +++ b/x/erc20/keeper/msg_server_test.go @@ -137,7 +137,7 @@ func (suite *KeeperTestSuite) TestConvertERC20NativeERC20() { existingAcc := &statedb.Account{Nonce: uint64(1), Balance: uint256.NewInt(1)} balance := make([]uint8, 32) - mockEVMKeeper.On("EstimateGasInternal", mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.EstimateGasResponse{Gas: uint64(200)}, nil) + mockEVMKeeper.On("EstimateGasInternal", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.EstimateGasResponse{Gas: uint64(200)}, nil) mockEVMKeeper.On("CallEVM", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{Ret: balance}, nil).Once() mockEVMKeeper.On("CallEVMWithData", mock.Anything, mock.Anything, mock.Anything, mock.Anything, @@ -165,7 +165,7 @@ func (suite *KeeperTestSuite) TestConvertERC20NativeERC20() { existingAcc := &statedb.Account{Nonce: uint64(1), Balance: uint256.NewInt(1)} balance := make([]uint8, 32) balance[31] = uint8(1) - mockEVMKeeper.On("EstimateGasInternal", mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.EstimateGasResponse{Gas: uint64(200)}, nil) + mockEVMKeeper.On("EstimateGasInternal", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.EstimateGasResponse{Gas: uint64(200)}, nil) mockEVMKeeper.On("CallEVM", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{Ret: balance}, nil).Twice() mockEVMKeeper.On("CallEVMWithData", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("forced balance error")) mockEVMKeeper.On("GetAccountWithoutBalance", mock.Anything, mock.Anything).Return(existingAcc, nil) @@ -190,7 +190,7 @@ func (suite *KeeperTestSuite) TestConvertERC20NativeERC20() { existingAcc := &statedb.Account{Nonce: uint64(1), Balance: uint256.NewInt(1)} balance := make([]uint8, 32) - mockEVMKeeper.On("EstimateGasInternal", mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.EstimateGasResponse{Gas: uint64(200)}, nil) + mockEVMKeeper.On("EstimateGasInternal", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.EstimateGasResponse{Gas: uint64(200)}, nil) mockEVMKeeper.On("CallEVM", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{Ret: balance}, nil).Once() mockEVMKeeper.On("CallEVMWithData", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{}, nil) @@ -217,7 +217,7 @@ func (suite *KeeperTestSuite) TestConvertERC20NativeERC20() { existingAcc := &statedb.Account{Nonce: uint64(1), Balance: uint256.NewInt(1)} balance := make([]uint8, 32) - mockEVMKeeper.On("EstimateGasInternal", mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.EstimateGasResponse{Gas: uint64(200)}, nil) + mockEVMKeeper.On("EstimateGasInternal", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.EstimateGasResponse{Gas: uint64(200)}, nil) mockEVMKeeper.On("CallEVM", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.MsgEthereumTxResponse{Ret: balance}, nil).Once() mockEVMKeeper.On("CallEVMWithData", mock.Anything, mock.Anything, mock.Anything, mock.Anything, diff --git a/x/erc20/keeper/proposals_test.go b/x/erc20/keeper/proposals_test.go index 324fbcd28..6537c3856 100644 --- a/x/erc20/keeper/proposals_test.go +++ b/x/erc20/keeper/proposals_test.go @@ -135,7 +135,7 @@ func (suite *KeeperTestSuite) TestRegisterERC20() { suite.network.App.AuthzKeeper, &suite.network.App.TransferKeeper, ) - mockEVMKeeper.On("EstimateGasInternal", mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.EstimateGasResponse{Gas: uint64(200)}, nil) + mockEVMKeeper.On("EstimateGasInternal", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&evmtypes.EstimateGasResponse{Gas: uint64(200)}, nil) mockEVMKeeper.On("CallEVM", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("forced CallEVM error")) mockEVMKeeper.On("ApplyMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("forced ApplyMessage error")) }, diff --git a/x/erc20/types/interfaces.go b/x/erc20/types/interfaces.go index b5da54d37..21524ccfa 100644 --- a/x/erc20/types/interfaces.go +++ b/x/erc20/types/interfaces.go @@ -35,7 +35,7 @@ type EVMKeeper interface { // TODO: should these methods also be converted to use context.Context? GetParams(ctx sdk.Context) evmtypes.Params GetAccountWithoutBalance(ctx sdk.Context, addr common.Address) *statedb.Account - EstimateGasInternal(c context.Context, req *evmtypes.EthCallRequest, fromType evmtypes.CallType) (*evmtypes.EstimateGasResponse, error) + EstimateGasInternal(c context.Context, req *evmtypes.EthCallRequest, fromType evmtypes.CallType, stateOverride evmtypes.StateOverride) (*evmtypes.EstimateGasResponse, error) ApplyMessage(ctx sdk.Context, msg core.Message, tracer vm.EVMLogger, commit bool) (*evmtypes.MsgEthereumTxResponse, error) DeleteAccount(ctx sdk.Context, addr common.Address) error IsAvailableStaticPrecompile(params *evmtypes.Params, address common.Address) bool diff --git a/x/erc20/types/mocks/EVMKeeper.go b/x/erc20/types/mocks/EVMKeeper.go index e918ca0c8..a0d02d808 100644 --- a/x/erc20/types/mocks/EVMKeeper.go +++ b/x/erc20/types/mocks/EVMKeeper.go @@ -137,9 +137,9 @@ func (_m *EVMKeeper) DeleteAccount(ctx types.Context, addr common.Address) error return r0 } -// EstimateGasInternal provides a mock function with given fields: c, req, fromType -func (_m *EVMKeeper) EstimateGasInternal(c context.Context, req *evmtypes.EthCallRequest, fromType evmtypes.CallType) (*evmtypes.EstimateGasResponse, error) { - ret := _m.Called(c, req, fromType) +// EstimateGasInternal provides a mock function with given fields: c, req, fromType, stateOverride +func (_m *EVMKeeper) EstimateGasInternal(c context.Context, req *evmtypes.EthCallRequest, fromType evmtypes.CallType, stateOverride evmtypes.StateOverride) (*evmtypes.EstimateGasResponse, error) { + ret := _m.Called(c, req, fromType, stateOverride) if len(ret) == 0 { panic("no return value specified for EstimateGasInternal") @@ -147,19 +147,19 @@ func (_m *EVMKeeper) EstimateGasInternal(c context.Context, req *evmtypes.EthCal var r0 *evmtypes.EstimateGasResponse var r1 error - if rf, ok := ret.Get(0).(func(context.Context, *evmtypes.EthCallRequest, evmtypes.CallType) (*evmtypes.EstimateGasResponse, error)); ok { - return rf(c, req, fromType) + if rf, ok := ret.Get(0).(func(context.Context, *evmtypes.EthCallRequest, evmtypes.CallType, evmtypes.StateOverride) (*evmtypes.EstimateGasResponse, error)); ok { + return rf(c, req, fromType, stateOverride) } - if rf, ok := ret.Get(0).(func(context.Context, *evmtypes.EthCallRequest, evmtypes.CallType) *evmtypes.EstimateGasResponse); ok { - r0 = rf(c, req, fromType) + if rf, ok := ret.Get(0).(func(context.Context, *evmtypes.EthCallRequest, evmtypes.CallType, evmtypes.StateOverride) *evmtypes.EstimateGasResponse); ok { + r0 = rf(c, req, fromType, stateOverride) } else { if ret.Get(0) != nil { r0 = ret.Get(0).(*evmtypes.EstimateGasResponse) } } - if rf, ok := ret.Get(1).(func(context.Context, *evmtypes.EthCallRequest, evmtypes.CallType) error); ok { - r1 = rf(c, req, fromType) + if rf, ok := ret.Get(1).(func(context.Context, *evmtypes.EthCallRequest, evmtypes.CallType, evmtypes.StateOverride) error); ok { + r1 = rf(c, req, fromType, stateOverride) } else { r1 = ret.Error(1) } diff --git a/x/vm/keeper/call_evm.go b/x/vm/keeper/call_evm.go index aad596ddf..33dc3bdec 100644 --- a/x/vm/keeper/call_evm.go +++ b/x/vm/keeper/call_evm.go @@ -70,7 +70,7 @@ func (k Keeper) CallEVMWithData( gasRes, err := k.EstimateGasInternal(ctx, &types.EthCallRequest{ Args: args, GasCap: config.DefaultGasCap, - }, types.Internal) + }, types.Internal, nil) if err != nil { return nil, err } diff --git a/x/vm/keeper/grpc_query.go b/x/vm/keeper/grpc_query.go index 8197df65a..d877733bb 100644 --- a/x/vm/keeper/grpc_query.go +++ b/x/vm/keeper/grpc_query.go @@ -260,7 +260,7 @@ func (k Keeper) EthCall(c context.Context, req *types.EthCallRequest) (*types.Ms return k.callWithOverride(ctx, args, req.ProposerAddress, req.GasCap, nil) } -func (k Keeper) TacSimulate(c context.Context, req *types.TacSimulateRequest) (*types.MsgEthereumTxResponse, error) { +func (k Keeper) TacSimulate(c context.Context, req *types.TacSimulateRequest) (*types.TacSimulateResponse, error) { if req == nil { return nil, status.Error(codes.InvalidArgument, "empty request") } @@ -281,13 +281,40 @@ func (k Keeper) TacSimulate(c context.Context, req *types.TacSimulateRequest) (* } } - return k.callWithOverride(ctx, args, req.ProposerAddress, req.GasCap, stateOverride) + // Execute the call with state override to get output, logs, vmError + res, err := k.callWithOverride(ctx, args, req.ProposerAddress, req.GasCap, stateOverride) + if err != nil { + return nil, err + } + + // Run gas estimation with state override using binary search + ethCallReq := &types.EthCallRequest{ + Args: req.Args, + GasCap: req.GasCap, + ProposerAddress: req.ProposerAddress, + ChainId: req.ChainId, + } + + var gasEstimated uint64 + gasEstimate, estimateErr := k.EstimateGasInternal(c, ethCallReq, types.RPC, stateOverride) + if estimateErr == nil { + gasEstimated = gasEstimate.Gas + } + // If estimation fails (e.g. revert), gasEstimated stays 0 + return &types.TacSimulateResponse{ + Hash: res.Hash, + Logs: res.Logs, + Ret: res.Ret, + VmError: res.VmError, + GasUsed: res.GasUsed, + GasEstimated: gasEstimated, + }, nil } // EstimateGas implements eth_estimateGas rpc api. func (k Keeper) EstimateGas(c context.Context, req *types.EthCallRequest) (*types.EstimateGasResponse, error) { - return k.EstimateGasInternal(c, req, types.RPC) + return k.EstimateGasInternal(c, req, types.RPC, nil) } // EstimateGasInternal returns the gas estimation for the corresponding request. @@ -295,7 +322,7 @@ func (k Keeper) EstimateGas(c context.Context, req *types.EthCallRequest) (*type // When called from the RPC client, we need to reset the gas meter before // simulating the transaction to have // an accurate gas estimation for EVM extensions transactions. -func (k Keeper) EstimateGasInternal(c context.Context, req *types.EthCallRequest, fromType types.CallType) (*types.EstimateGasResponse, error) { +func (k Keeper) EstimateGasInternal(c context.Context, req *types.EthCallRequest, fromType types.CallType, stateOverride types.StateOverride) (*types.EstimateGasResponse, error) { if req == nil { return nil, status.Error(codes.InvalidArgument, "empty request") } @@ -428,7 +455,7 @@ func (k Keeper) EstimateGasInternal(c context.Context, req *types.EthCallRequest tmpCtx = evmante.BuildEvmExecutionCtx(tmpCtx).WithGasMeter(gasMeter) } // pass false to not commit StateDB - rsp, err = k.ApplyMessageWithConfig(tmpCtx, msg, nil, false, cfg, txConfig, nil) + rsp, err = k.ApplyMessageWithConfig(tmpCtx, msg, nil, false, cfg, txConfig, stateOverride) if err != nil { if errors.Is(err, core.ErrIntrinsicGas) { return true, nil, nil // Special case, raise gas limit diff --git a/x/vm/keeper/grpc_query_test.go b/x/vm/keeper/grpc_query_test.go index 26aea6d64..bc604b084 100644 --- a/x/vm/keeper/grpc_query_test.go +++ b/x/vm/keeper/grpc_query_test.go @@ -1701,7 +1701,7 @@ func (suite *KeeperTestSuite) TestTacSimulate() { getReq func() *types.TacSimulateRequest expPass bool expVMError bool - validate func(res *types.MsgEthereumTxResponse) + validate func(res *types.TacSimulateResponse) }{ { name: "fail - nil request", @@ -1756,8 +1756,8 @@ func (suite *KeeperTestSuite) TestTacSimulate() { } }, expPass: true, - validate: func(res *types.MsgEthereumTxResponse) { - suite.Require().False(res.Failed(), "VM error: %s", res.VmError) + validate: func(res *types.TacSimulateResponse) { + suite.Require().Empty(res.VmError, "VM error: %s", res.VmError) suite.Require().NotEmpty(res.Ret) }, }, @@ -1817,8 +1817,8 @@ func (suite *KeeperTestSuite) TestTacSimulate() { } }, expPass: true, - validate: func(res *types.MsgEthereumTxResponse) { - suite.Require().False(res.Failed(), "VM error: %s", res.VmError) + validate: func(res *types.TacSimulateResponse) { + suite.Require().Empty(res.VmError, "VM error: %s", res.VmError) }, }, { @@ -1837,8 +1837,8 @@ func (suite *KeeperTestSuite) TestTacSimulate() { } }, expPass: true, - validate: func(res *types.MsgEthereumTxResponse) { - suite.Require().False(res.Failed(), "VM error: %s", res.VmError) + validate: func(res *types.TacSimulateResponse) { + suite.Require().Empty(res.VmError, "VM error: %s", res.VmError) }, }, } @@ -1854,7 +1854,7 @@ func (suite *KeeperTestSuite) TestTacSimulate() { suite.Require().NotNil(res) if tc.expVMError { - suite.Require().True(res.Failed(), "expected VM error but got success") + suite.Require().NotEmpty(res.VmError, "expected VM error but got success") } if tc.validate != nil { @@ -1925,7 +1925,7 @@ func (suite *KeeperTestSuite) TestTacSimulateWithStateOverride() { res, err := suite.network.App.EVMKeeper.TacSimulate(suite.network.GetContext(), req) suite.Require().NoError(err) suite.Require().NotNil(res) - suite.Require().False(res.Failed(), "VM error: %s", res.VmError) + suite.Require().Empty(res.VmError, "VM error: %s", res.VmError) // The result should contain the overridden balance returnedBalance := new(big.Int).SetBytes(res.Ret) diff --git a/x/vm/keeper/state_transition.go b/x/vm/keeper/state_transition.go index b35daa996..26d1c7de6 100644 --- a/x/vm/keeper/state_transition.go +++ b/x/vm/keeper/state_transition.go @@ -263,6 +263,14 @@ func (k *Keeper) ApplyMessage(ctx sdk.Context, msg evmcore.Message, tracer vm.EV // # Commit parameter // // If commit is true, the `StateDB` will be committed, otherwise discarded. +// +// # State override parameter +// +// If state override is not nil, the `StateDB` will apply the state override +// before EVM execution and discard the dirty state after execution, +// no matter the execution result. This is only used for `eth_call`, `eth_tacSimulate` and `eth_estimateGas` +// where the state should not be changed. + func (k *Keeper) ApplyMessageWithConfig( ctx sdk.Context, msg evmcore.Message, From 505d78bb2b4436b6b3e0a64756af76db0c104d9d Mon Sep 17 00:00:00 2001 From: Aleksei Kokinos Date: Tue, 17 Feb 2026 22:31:20 +0700 Subject: [PATCH 18/19] - eth_tacSimulate moved to "tac" namespace and renamed tac_simulate --- rpc/apis.go | 18 +++++++++ rpc/namespaces/ethereum/eth/api.go | 41 -------------------- rpc/namespaces/ethereum/tac/api.go | 61 ++++++++++++++++++++++++++++++ rpc/types/types.go | 2 - server/config/config.go | 2 +- 5 files changed, 80 insertions(+), 44 deletions(-) create mode 100644 rpc/namespaces/ethereum/tac/api.go diff --git a/rpc/apis.go b/rpc/apis.go index c2651c2dd..c29a72265 100644 --- a/rpc/apis.go +++ b/rpc/apis.go @@ -14,6 +14,7 @@ import ( "github.com/cosmos/evm/rpc/namespaces/ethereum/miner" "github.com/cosmos/evm/rpc/namespaces/ethereum/net" "github.com/cosmos/evm/rpc/namespaces/ethereum/personal" + "github.com/cosmos/evm/rpc/namespaces/ethereum/tac" "github.com/cosmos/evm/rpc/namespaces/ethereum/txpool" "github.com/cosmos/evm/rpc/namespaces/ethereum/web3" "github.com/cosmos/evm/types" @@ -37,6 +38,7 @@ const ( TxPoolNamespace = "txpool" DebugNamespace = "debug" MinerNamespace = "miner" + TacNamespace = "tac" apiVersion = "1.0" ) @@ -155,6 +157,22 @@ func init() { }, } }, + TacNamespace: func(ctx *server.Context, + clientCtx client.Context, + _ *rpcclient.WSClient, + allowUnprotectedTxs bool, + indexer types.EVMTxIndexer, + ) []rpc.API { + evmBackend := backend.NewBackend(ctx, ctx.Logger, clientCtx, allowUnprotectedTxs, indexer) + return []rpc.API{ + { + Namespace: TacNamespace, + Version: apiVersion, + Service: tac.NewTacAPI(ctx.Logger, evmBackend), + Public: true, + }, + } + }, } } diff --git a/rpc/namespaces/ethereum/eth/api.go b/rpc/namespaces/ethereum/eth/api.go index de2fcace9..5111a5643 100644 --- a/rpc/namespaces/ethereum/eth/api.go +++ b/rpc/namespaces/ethereum/eth/api.go @@ -2,7 +2,6 @@ package eth import ( "context" - "encoding/json" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" @@ -69,12 +68,6 @@ type EthereumAPI interface { // smart contracts. However, no data is published to the Ethereum network. Call(args evmtypes.TransactionArgs, blockNrOrHash rpctypes.BlockNumberOrHash, _ *evmtypes.StateOverride) (hexutil.Bytes, error) - // eth_tacSimulate implements the custom `eth_tacSimulate` rpc api which supports state override and event logs as result - TacSimulate(args evmtypes.TransactionArgs, - blockNrOrHash rpctypes.BlockNumberOrHash, - stateOverride evmtypes.StateOverride, - ) (hexutil.Bytes, error) - // Chain Information // // Returns information on the Ethereum network and internal settings. @@ -291,40 +284,6 @@ func (e *PublicAPI) Call(args evmtypes.TransactionArgs, return (hexutil.Bytes)(data.Ret), nil } -func (e *PublicAPI) TacSimulate(args evmtypes.TransactionArgs, - blockNrOrHash rpctypes.BlockNumberOrHash, - stateOverride evmtypes.StateOverride, -) (hexutil.Bytes, error) { - e.logger.Debug("eth_tacSimulate", "args", args.String(), "block number or hash", blockNrOrHash, "state override", stateOverride) - - blockNum, err := e.backend.BlockNumberFromTendermint(blockNrOrHash) - if err != nil { - return nil, err - } - data, err := e.backend.DoTacSimulate(args, blockNum, stateOverride) - if err != nil { - return []byte{}, err - } - - // convert evmtypes.Log to ethtypes.Log - rpcLogs := rpctypes.ToRPCTypeLogs(data.Logs) - - tacSimulateResult := rpctypes.TacSimulateResult{ - Output: hexutil.Bytes(data.Ret), - VmError: data.VmError, - Logs: rpcLogs, - GasUsed: hexutil.Uint64(data.GasUsed), - GasEstimated: hexutil.Uint64(data.GasEstimated), - } - - ret, err := json.Marshal(tacSimulateResult) - if err != nil { - return []byte{}, err - } - - return ret, nil -} - /////////////////////////////////////////////////////////////////////////////// /// Event Logs /// /////////////////////////////////////////////////////////////////////////////// diff --git a/rpc/namespaces/ethereum/tac/api.go b/rpc/namespaces/ethereum/tac/api.go new file mode 100644 index 000000000..a218475a5 --- /dev/null +++ b/rpc/namespaces/ethereum/tac/api.go @@ -0,0 +1,61 @@ +package tac + +import ( + "encoding/json" + + "github.com/ethereum/go-ethereum/common/hexutil" + + "github.com/cosmos/evm/rpc/backend" + rpctypes "github.com/cosmos/evm/rpc/types" + evmtypes "github.com/cosmos/evm/x/vm/types" + + "cosmossdk.io/log" +) + +// TacAPI is the tac_ prefixed set of custom TAC APIs in the Web3 JSON-RPC spec. +type TacAPI struct { + logger log.Logger + backend backend.EVMBackend +} + +// NewTacAPI creates an instance of the TAC Web3 API. +func NewTacAPI(logger log.Logger, backend backend.EVMBackend) *TacAPI { + return &TacAPI{ + logger: logger.With("client", "json-rpc"), + backend: backend, + } +} + +// Simulate implements the custom `tac_simulate` rpc api which supports state override and event logs as result. +func (api *TacAPI) Simulate(args evmtypes.TransactionArgs, + blockNrOrHash rpctypes.BlockNumberOrHash, + stateOverride evmtypes.StateOverride, +) (hexutil.Bytes, error) { + api.logger.Debug("tac_simulate", "args", args.String(), "block number or hash", blockNrOrHash, "state override", stateOverride) + + blockNum, err := api.backend.BlockNumberFromTendermint(blockNrOrHash) + if err != nil { + return nil, err + } + data, err := api.backend.DoTacSimulate(args, blockNum, stateOverride) + if err != nil { + return []byte{}, err + } + + // convert evmtypes.Log to ethtypes.Log + rpcLogs := rpctypes.ToRPCTypeLogs(data.Logs) + + tacSimulateResult := rpctypes.TacSimulateResult{ + Output: hexutil.Bytes(data.Ret), + VmError: data.VmError, + Logs: rpcLogs, + GasEstimated: hexutil.Uint64(data.GasEstimated), + } + + ret, err := json.Marshal(tacSimulateResult) + if err != nil { + return []byte{}, err + } + + return ret, nil +} diff --git a/rpc/types/types.go b/rpc/types/types.go index 084085d6f..8b66e4041 100644 --- a/rpc/types/types.go +++ b/rpc/types/types.go @@ -80,8 +80,6 @@ type TacSimulateResult struct { VmError string `json:"vmError,omitempty"` // Logs are the event logs generated by the EVM execution, it is empty if no logs are generated Logs []ethtypes.Log `json:"logs,omitempty"` - // GasUsed is the gas used by the EVM execution, it is 0 if the execution is reverted - GasUsed hexutil.Uint64 `json:"gasUsed"` // GasEstimated is the estimated gas limit needed to execute the transaction (from eth_estimateGas binary search) GasEstimated hexutil.Uint64 `json:"gasEstimated"` } diff --git a/server/config/config.go b/server/config/config.go index e90727435..7bdf9c6be 100644 --- a/server/config/config.go +++ b/server/config/config.go @@ -203,7 +203,7 @@ func GetDefaultAPINamespaces() []string { // GetAPINamespaces returns the all the available JSON-RPC API namespaces. func GetAPINamespaces() []string { - return []string{"web3", "eth", "personal", "net", "txpool", "debug", "miner"} + return []string{"web3", "eth", "personal", "net", "txpool", "debug", "miner", "tac"} } // DefaultJSONRPCConfig returns an EVM config with the JSON-RPC API enabled by default From a3949a4d3962ea3557e5485221afa93395d12449 Mon Sep 17 00:00:00 2001 From: Aleksei Kokinos Date: Mon, 23 Feb 2026 18:00:31 +0700 Subject: [PATCH 19/19] fix comments --- api/cosmos/evm/vm/v1/query_grpc.pb.go | 5 +++-- proto/cosmos/evm/vm/v1/query.proto | 2 +- x/vm/keeper/state_transition.go | 2 +- x/vm/types/query.pb.go | 15 ++++++++------- 4 files changed, 13 insertions(+), 11 deletions(-) diff --git a/api/cosmos/evm/vm/v1/query_grpc.pb.go b/api/cosmos/evm/vm/v1/query_grpc.pb.go index b88d78163..f092c061b 100644 --- a/api/cosmos/evm/vm/v1/query_grpc.pb.go +++ b/api/cosmos/evm/vm/v1/query_grpc.pb.go @@ -8,6 +8,7 @@ package vmv1 import ( context "context" + grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" @@ -58,7 +59,7 @@ type QueryClient interface { Params(ctx context.Context, in *QueryParamsRequest, opts ...grpc.CallOption) (*QueryParamsResponse, error) // EthCall implements the `eth_call` rpc api EthCall(ctx context.Context, in *EthCallRequest, opts ...grpc.CallOption) (*MsgEthereumTxResponse, error) - // TacSimulate implements the custom `eth_tacSimulate` rpc api which supports state override + // TacSimulate implements the custom `tac_simulate` rpc api which supports state override TacSimulate(ctx context.Context, in *TacSimulateRequest, opts ...grpc.CallOption) (*TacSimulateResponse, error) // EstimateGas implements the `eth_estimateGas` rpc api EstimateGas(ctx context.Context, in *EthCallRequest, opts ...grpc.CallOption) (*EstimateGasResponse, error) @@ -245,7 +246,7 @@ type QueryServer interface { Params(context.Context, *QueryParamsRequest) (*QueryParamsResponse, error) // EthCall implements the `eth_call` rpc api EthCall(context.Context, *EthCallRequest) (*MsgEthereumTxResponse, error) - // TacSimulate implements the custom `eth_tacSimulate` rpc api which supports state override + // TacSimulate implements the custom `tac_simulate` rpc api which supports state override TacSimulate(context.Context, *TacSimulateRequest) (*TacSimulateResponse, error) // EstimateGas implements the `eth_estimateGas` rpc api EstimateGas(context.Context, *EthCallRequest) (*EstimateGasResponse, error) diff --git a/proto/cosmos/evm/vm/v1/query.proto b/proto/cosmos/evm/vm/v1/query.proto index 6f1384f35..379905d49 100644 --- a/proto/cosmos/evm/vm/v1/query.proto +++ b/proto/cosmos/evm/vm/v1/query.proto @@ -59,7 +59,7 @@ service Query { option (google.api.http).get = "/cosmos/evm/vm/v1/eth_call"; } - // TacSimulate implements the custom `eth_tacSimulate` rpc api which supports state override + // TacSimulate implements the custom `tac_simulate` rpc api which supports state override rpc TacSimulate(TacSimulateRequest) returns (TacSimulateResponse) { option (google.api.http).get = "/cosmos/evm/vm/v1/tac_simulate"; } diff --git a/x/vm/keeper/state_transition.go b/x/vm/keeper/state_transition.go index 26d1c7de6..d0f9cfe45 100644 --- a/x/vm/keeper/state_transition.go +++ b/x/vm/keeper/state_transition.go @@ -268,7 +268,7 @@ func (k *Keeper) ApplyMessage(ctx sdk.Context, msg evmcore.Message, tracer vm.EV // // If state override is not nil, the `StateDB` will apply the state override // before EVM execution and discard the dirty state after execution, -// no matter the execution result. This is only used for `eth_call`, `eth_tacSimulate` and `eth_estimateGas` +// no matter the execution result. This is only used for `eth_call`, `tac_simulate` and `eth_estimateGas` // where the state should not be changed. func (k *Keeper) ApplyMessageWithConfig( diff --git a/x/vm/types/query.pb.go b/x/vm/types/query.pb.go index 075ee86e3..ea86ecf7f 100644 --- a/x/vm/types/query.pb.go +++ b/x/vm/types/query.pb.go @@ -5,8 +5,13 @@ package types import ( context "context" - cosmossdk_io_math "cosmossdk.io/math" fmt "fmt" + io "io" + math "math" + math_bits "math/bits" + time "time" + + cosmossdk_io_math "cosmossdk.io/math" github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" query "github.com/cosmos/cosmos-sdk/types/query" _ "github.com/cosmos/cosmos-sdk/types/tx/amino" @@ -19,10 +24,6 @@ import ( codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" _ "google.golang.org/protobuf/types/known/timestamppb" - io "io" - math "math" - math_bits "math/bits" - time "time" ) // Reference imports to suppress errors if they are not otherwise used. @@ -1838,7 +1839,7 @@ type QueryClient interface { Params(ctx context.Context, in *QueryParamsRequest, opts ...grpc.CallOption) (*QueryParamsResponse, error) // EthCall implements the `eth_call` rpc api EthCall(ctx context.Context, in *EthCallRequest, opts ...grpc.CallOption) (*MsgEthereumTxResponse, error) - // TacSimulate implements the custom `eth_tacSimulate` rpc api which supports state override + // TacSimulate implements the custom `tac_simulate` rpc api which supports state override TacSimulate(ctx context.Context, in *TacSimulateRequest, opts ...grpc.CallOption) (*TacSimulateResponse, error) // EstimateGas implements the `eth_estimateGas` rpc api EstimateGas(ctx context.Context, in *EthCallRequest, opts ...grpc.CallOption) (*EstimateGasResponse, error) @@ -2023,7 +2024,7 @@ type QueryServer interface { Params(context.Context, *QueryParamsRequest) (*QueryParamsResponse, error) // EthCall implements the `eth_call` rpc api EthCall(context.Context, *EthCallRequest) (*MsgEthereumTxResponse, error) - // TacSimulate implements the custom `eth_tacSimulate` rpc api which supports state override + // TacSimulate implements the custom `tac_simulate` rpc api which supports state override TacSimulate(context.Context, *TacSimulateRequest) (*TacSimulateResponse, error) // EstimateGas implements the `eth_estimateGas` rpc api EstimateGas(context.Context, *EthCallRequest) (*EstimateGasResponse, error)