From 8c348d520e0eb5da81cc97a3585c728974bf09b8 Mon Sep 17 00:00:00 2001 From: codchen Date: Tue, 14 May 2024 11:54:13 +0800 Subject: [PATCH] Fix event attribute names in CW pointer contracts (#1659) * Fix event attribute names in CW pointer contracts * use reverse registry to validate delegatecall --- .../cosmwasm/cw721/artifacts/checksums.txt | 2 +- .../cosmwasm/cw721/artifacts/cwerc721.wasm | Bin 255724 -> 256986 bytes example/cosmwasm/cw721/src/contract.rs | 38 +- go.mod | 2 + go.sum | 3 + precompiles/ibc/ibc_test.go | 5 +- precompiles/wasmd/wasmd_test.go | 14 +- proto/evm/query.proto | 13 + x/evm/artifacts/erc721/artifacts.go | 2 +- x/evm/artifacts/erc721/cwerc721.wasm | Bin 255724 -> 256986 bytes x/evm/client/cli/query.go | 33 +- x/evm/keeper/evm.go | 9 +- x/evm/keeper/grpc_query.go | 35 ++ x/evm/keeper/msg_server.go | 8 +- x/evm/keeper/params.go | 4 - x/evm/keeper/pointer.go | 21 + x/evm/keeper/whitelist.go | 16 - x/evm/keeper/whitelist_test.go | 14 - x/evm/migrations/store_cw_pointer_code.go | 34 +- x/evm/module.go | 8 +- x/evm/module_test.go | 4 +- x/evm/types/params.go | 12 +- x/evm/types/query.pb.go | 456 ++++++++++++++++-- x/evm/types/query.pb.gw.go | 83 ++++ 24 files changed, 687 insertions(+), 129 deletions(-) delete mode 100644 x/evm/keeper/whitelist.go delete mode 100644 x/evm/keeper/whitelist_test.go diff --git a/example/cosmwasm/cw721/artifacts/checksums.txt b/example/cosmwasm/cw721/artifacts/checksums.txt index a31da2c61..ae91b826c 100644 --- a/example/cosmwasm/cw721/artifacts/checksums.txt +++ b/example/cosmwasm/cw721/artifacts/checksums.txt @@ -1 +1 @@ -94cdd9c3e85c26f7cec43c23bfb4b3b2b2d71a0a8d85c58df12ffec0741febc8 cwerc721.wasm +d34f50997bd0ad45badcf8174b67900806021abca011cbba658517d5af5e5eca cwerc721.wasm diff --git a/example/cosmwasm/cw721/artifacts/cwerc721.wasm b/example/cosmwasm/cw721/artifacts/cwerc721.wasm index 318ada77bc67874fa3f7386116c2d75127549b30..f5ba0432f868a852f8860cc34a5357431ff53918 100644 GIT binary patch delta 65289 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 diff --git a/example/cosmwasm/cw721/src/contract.rs b/example/cosmwasm/cw721/src/contract.rs index 690bb262d..8d7f678b7 100644 --- a/example/cosmwasm/cw721/src/contract.rs +++ b/example/cosmwasm/cw721/src/contract.rs @@ -35,16 +35,16 @@ pub fn execute( execute_send_nft(deps, info, contract, token_id, msg) }, ExecuteMsg::Approve { spender, token_id, expires: _ } => { - execute_approve(deps, spender, token_id) + execute_approve(deps, info, spender, token_id, true) }, - ExecuteMsg::Revoke { spender: _, token_id } => { - execute_approve(deps, "".to_string(), token_id) + ExecuteMsg::Revoke { spender, token_id } => { + execute_approve(deps, info, spender, token_id, false) }, ExecuteMsg::ApproveAll { operator, expires: _ } => { - execute_approve_all(deps, operator, true) + execute_approve_all(deps, info, operator, true) }, ExecuteMsg::RevokeAll { operator } => { - execute_approve_all(deps, operator, false) + execute_approve_all(deps, info, operator, false) }, ExecuteMsg::Burn { token_id: _ } => { execute_burn() } } @@ -82,17 +82,27 @@ pub fn execute_send_nft( pub fn execute_approve( deps: DepsMut, + info: MessageInfo, spender: String, token_id: String, + approved: bool, ) -> Result, ContractError> { let erc_addr = ERC721_ADDRESS.load(deps.storage)?; let querier = EvmQuerier::new(&deps.querier); - let payload = querier.erc721_approve_payload(spender.clone(), token_id.clone())?; + let mut payload_spender = spender.clone(); + let mut action = "approve"; + if !approved { + payload_spender = "".to_string(); + action = "revoke"; + } + let payload = querier.erc721_approve_payload(payload_spender, token_id.clone())?; let msg = EvmMsg::DelegateCallEvm { to: erc_addr, data: payload.encoded_payload }; let res = Response::new() - .add_attribute("action", "approve") + .add_attribute("action", action) .add_attribute("token_id", token_id) + .add_attribute("sender", info.sender) + .add_attribute("spender", spender.clone()) .add_message(msg); Ok(res) @@ -100,6 +110,7 @@ pub fn execute_approve( pub fn execute_approve_all( deps: DepsMut, + info: MessageInfo, to: String, approved: bool, ) -> Result, ContractError> { @@ -108,9 +119,14 @@ pub fn execute_approve_all( let querier = EvmQuerier::new(&deps.querier); let payload = querier.erc721_set_approval_all_payload(to.clone(), approved)?; let msg = EvmMsg::DelegateCallEvm { to: erc_addr, data: payload.encoded_payload }; + let mut action = "approve_all"; + if !approved { + action = "revoke_all"; + } let res = Response::new() - .add_attribute("action", "approve_all") - .add_attribute("to", to) + .add_attribute("action", action) + .add_attribute("operator", to) + .add_attribute("sender", info.sender) .add_attribute("approved", format!("{}", approved)) .add_message(msg); @@ -136,8 +152,8 @@ fn transfer_nft( let payload = querier.erc721_transfer_payload(owner, recipient.clone(), token_id.clone())?; let msg = EvmMsg::DelegateCallEvm { to: erc_addr, data: payload.encoded_payload }; let res = Response::new() - .add_attribute("from", info.sender) - .add_attribute("to", recipient) + .add_attribute("sender", info.sender) + .add_attribute("recipient", recipient) .add_attribute("token_id", token_id) .add_message(msg); diff --git a/go.mod b/go.mod index c483ecea6..abb68a669 100644 --- a/go.mod +++ b/go.mod @@ -125,6 +125,7 @@ require ( github.com/fzipp/gocyclo v0.5.1 // indirect github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff // indirect github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46 // indirect + github.com/ghodss/yaml v1.0.0 // indirect github.com/go-critic/go-critic v0.6.3 // indirect github.com/go-kit/kit v0.12.0 // indirect github.com/go-kit/log v0.2.1 // indirect @@ -172,6 +173,7 @@ require ( github.com/gostaticanalysis/nilerr v0.1.1 // indirect github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 // indirect github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1 // indirect github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c // indirect github.com/hashicorp/errwrap v1.0.0 // indirect github.com/hashicorp/go-bexpr v0.1.10 // indirect diff --git a/go.sum b/go.sum index eb91caacb..6d4ac8704 100644 --- a/go.sum +++ b/go.sum @@ -457,6 +457,7 @@ github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46 h1:BAIP2Gihuqh github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46/go.mod h1:QNpY22eby74jVhqH4WhDLDwxc/vqsern6pW+u2kbkpc= github.com/getkin/kin-openapi v0.53.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= github.com/ghemawat/stream v0.0.0-20171120220530-696b145b53b9/go.mod h1:106OIgooyS7OzLDOpUGgm9fA3bQENb/cFSyyBmMoJDs= +github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= @@ -765,6 +766,8 @@ github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t github.com/grpc-ecosystem/grpc-gateway v1.12.1/go.mod h1:8XEsbTttt/W+VvjtQhLACqCisSPWTxCZ7sBRjU6iH9c= github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1 h1:/c3QmbOGMGTOumP2iT/rCwB7b0QDGLKzqOmktBjT+Is= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1/go.mod h1:5SN9VR2LTsRFsrEC6FHgRbTWrTHu6tqPeKxEQv15giM= github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c h1:6rhixN/i8ZofjG1Y75iExal34USq5p+wiN1tpie8IrU= github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c/go.mod h1:NMPJylDgVpX0MLRlPy15sqSwOFv/U1GZ2m21JhFfek0= github.com/guptarohit/asciigraph v0.5.5/go.mod h1:dYl5wwK4gNsnFf9Zp+l06rFiDZ5YtXM6x7SRWZ3KGag= diff --git a/precompiles/ibc/ibc_test.go b/precompiles/ibc/ibc_test.go index 8a6da8c14..ad8b311dc 100644 --- a/precompiles/ibc/ibc_test.go +++ b/precompiles/ibc/ibc_test.go @@ -2,12 +2,13 @@ package ibc_test import ( "errors" - "github.com/cosmos/ibc-go/v3/modules/core/exported" "math/big" "reflect" "testing" "time" + "github.com/cosmos/ibc-go/v3/modules/core/exported" + sdk "github.com/cosmos/cosmos-sdk/types" clienttypes "github.com/cosmos/ibc-go/v3/modules/core/02-client/types" "github.com/ethereum/go-ethereum/common" @@ -95,7 +96,7 @@ func TestPrecompile_Run(t *testing.T) { fields: fields{transferKeeper: &MockTransferKeeper{}}, args: commonArgs, wantBz: packedTrue, - wantRemainingGas: 994040, + wantRemainingGas: 994319, wantErr: false, }, { diff --git a/precompiles/wasmd/wasmd_test.go b/precompiles/wasmd/wasmd_test.go index 4dfbd65d4..95c8ba4a7 100644 --- a/precompiles/wasmd/wasmd_test.go +++ b/precompiles/wasmd/wasmd_test.go @@ -79,7 +79,7 @@ func TestInstantiate(t *testing.T) { require.Equal(t, 2, len(outputs)) require.Equal(t, "sei1hrpna9v7vs3stzyd4z3xf00676kf78zpe2u5ksvljswn2vnjp3yslucc3n", outputs[0].(string)) require.Empty(t, outputs[1].([]byte)) - require.Equal(t, uint64(880848), g) + require.Equal(t, uint64(881127), g) amtsbz, err = sdk.NewCoins().MarshalJSON() require.Nil(t, err) @@ -102,7 +102,7 @@ func TestInstantiate(t *testing.T) { require.Equal(t, 2, len(outputs)) require.Equal(t, "sei1hrpna9v7vs3stzyd4z3xf00676kf78zpe2u5ksvljswn2vnjp3yslucc3n", outputs[0].(string)) require.Empty(t, outputs[1].([]byte)) - require.Equal(t, uint64(903904), g) + require.Equal(t, uint64(904183), g) // non-existent code ID args, _ = instantiateMethod.Inputs.Pack( @@ -174,7 +174,7 @@ func TestExecute(t *testing.T) { require.Nil(t, err) require.Equal(t, 1, len(outputs)) require.Equal(t, fmt.Sprintf("received test msg from %s with 1000usei", mockAddr.String()), string(outputs[0].([]byte))) - require.Equal(t, uint64(907107), g) + require.Equal(t, uint64(907386), g) require.Equal(t, int64(1000), testApp.BankKeeper.GetBalance(statedb.Ctx(), contractAddr, "usei").Amount.Int64()) amtsbz, err = sdk.NewCoins().MarshalJSON() @@ -263,7 +263,7 @@ func TestQuery(t *testing.T) { require.Nil(t, err) require.Equal(t, 1, len(outputs)) require.Equal(t, "{\"message\":\"query test\"}", string(outputs[0].([]byte))) - require.Equal(t, uint64(931433), g) + require.Equal(t, uint64(931712), g) // bad contract address args, _ = queryMethod.Inputs.Pack(mockAddr.String(), []byte("{\"info\":{}}")) @@ -326,7 +326,7 @@ func TestExecuteBatchOneMessage(t *testing.T) { require.Nil(t, err) require.Equal(t, 1, len(outputs)) require.Equal(t, fmt.Sprintf("received test msg from %s with 1000usei", mockAddr.String()), string((outputs[0].([][]byte))[0])) - require.Equal(t, uint64(907107), g) + require.Equal(t, uint64(907386), g) require.Equal(t, int64(1000), testApp.BankKeeper.GetBalance(statedb.Ctx(), contractAddr, "usei").Amount.Int64()) amtsbz, err = sdk.NewCoins().MarshalJSON() @@ -432,7 +432,7 @@ func TestExecuteBatchMultipleMessages(t *testing.T) { require.Equal(t, fmt.Sprintf("received test msg from %s with 1000usei", mockAddr.String()), string(parsedOutputs[0])) require.Equal(t, fmt.Sprintf("received test msg from %s with 1000usei", mockAddr.String()), string(parsedOutputs[1])) require.Equal(t, fmt.Sprintf("received test msg from %s with 1000usei", mockAddr.String()), string(parsedOutputs[2])) - require.Equal(t, uint64(726445), g) + require.Equal(t, uint64(726724), g) require.Equal(t, int64(3000), testApp.BankKeeper.GetBalance(statedb.Ctx(), contractAddr, "usei").Amount.Int64()) amtsbz2, err := sdk.NewCoins().MarshalJSON() @@ -459,7 +459,7 @@ func TestExecuteBatchMultipleMessages(t *testing.T) { require.Equal(t, fmt.Sprintf("received test msg from %s with", mockAddr.String()), string(parsedOutputs[0])) require.Equal(t, fmt.Sprintf("received test msg from %s with 1000usei", mockAddr.String()), string(parsedOutputs[1])) require.Equal(t, fmt.Sprintf("received test msg from %s with", mockAddr.String()), string(parsedOutputs[2])) - require.Equal(t, uint64(774966), g) + require.Equal(t, uint64(775245), g) require.Equal(t, int64(1000), testApp.BankKeeper.GetBalance(statedb.Ctx(), contractAddr, "usei").Amount.Int64()) // allowed delegatecall diff --git a/proto/evm/query.proto b/proto/evm/query.proto index 6f90daa9b..f92d02df0 100644 --- a/proto/evm/query.proto +++ b/proto/evm/query.proto @@ -23,6 +23,10 @@ service Query { rpc Pointer(QueryPointerRequest) returns (QueryPointerResponse) { option (google.api.http).get = "/sei-protocol/seichain/evm/pointer"; } + + rpc PointerVersion(QueryPointerVersionRequest) returns (QueryPointerVersionResponse) { + option (google.api.http).get = "/sei-protocol/seichain/evm/pointer_version"; + } } message QuerySeiAddressByEVMAddressRequest { @@ -62,3 +66,12 @@ message QueryPointerResponse { uint32 version = 2; bool exists = 3; } + +message QueryPointerVersionRequest { + PointerType pointer_type = 1; +} + +message QueryPointerVersionResponse { + uint32 version = 1; + uint64 cw_code_id = 2; +} diff --git a/x/evm/artifacts/erc721/artifacts.go b/x/evm/artifacts/erc721/artifacts.go index b542ee3b4..9bae2456a 100644 --- a/x/evm/artifacts/erc721/artifacts.go +++ b/x/evm/artifacts/erc721/artifacts.go @@ -2,7 +2,7 @@ package erc721 import "embed" -const CurrentVersion uint16 = 1 +const CurrentVersion uint16 = 2 //go:embed cwerc721.wasm var f embed.FS diff --git a/x/evm/artifacts/erc721/cwerc721.wasm b/x/evm/artifacts/erc721/cwerc721.wasm index 318ada77bc67874fa3f7386116c2d75127549b30..f5ba0432f868a852f8860cc34a5357431ff53918 100644 GIT binary patch delta 65289 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 diff --git a/x/evm/client/cli/query.go b/x/evm/client/cli/query.go index 6209125b7..ad8806f81 100644 --- a/x/evm/client/cli/query.go +++ b/x/evm/client/cli/query.go @@ -43,6 +43,7 @@ func GetQueryCmd(_ string) *cobra.Command { cmd.AddCommand(CmdQueryERC20()) cmd.AddCommand(CmdQueryPayload()) cmd.AddCommand(CmdQueryPointer()) + cmd.AddCommand(CmdQueryPointerVersion()) return cmd } @@ -301,8 +302,9 @@ func CmdQueryPointer() *cobra.Command { return err } queryClient := types.NewQueryClient(clientCtx) + ctx := cmd.Context() - res, err := queryClient.Pointer(context.Background(), &types.QueryPointerRequest{ + res, err := queryClient.Pointer(ctx, &types.QueryPointerRequest{ PointerType: types.PointerType(types.PointerType_value[args[0]]), Pointee: args[1], }) if err != nil { @@ -317,3 +319,32 @@ func CmdQueryPointer() *cobra.Command { return cmd } + +func CmdQueryPointerVersion() *cobra.Command { + cmd := &cobra.Command{ + Use: "pointer-version [type]", + Short: "Query for the current pointer version and stored code ID (if applicable)", + Args: cobra.ExactArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + clientCtx, err := client.GetClientQueryContext(cmd) + if err != nil { + return err + } + + queryClient := types.NewQueryClient(clientCtx) + ctx := cmd.Context() + + req := types.QueryPointerVersionRequest{PointerType: types.PointerType(types.PointerType_value[args[0]])} + res, err := queryClient.PointerVersion(ctx, &req) + if err != nil { + return err + } + + return clientCtx.PrintProto(res) + }, + } + + flags.AddQueryFlagsToCmd(cmd) + + return cmd +} diff --git a/x/evm/keeper/evm.go b/x/evm/keeper/evm.go index 357746c42..23db1e18e 100644 --- a/x/evm/keeper/evm.go +++ b/x/evm/keeper/evm.go @@ -40,13 +40,16 @@ func (k *Keeper) HandleInternalEVMCall(ctx sdk.Context, req *types.MsgInternalEV } func (k *Keeper) HandleInternalEVMDelegateCall(ctx sdk.Context, req *types.MsgInternalEVMDelegateCall) (*sdk.Result, error) { - if !k.IsCWCodeHashWhitelistedForEVMDelegateCall(ctx, req.CodeHash) { - return nil, errors.New("code hash not authorized to make EVM delegate call") - } var to *common.Address if req.To != "" { addr := common.HexToAddress(req.To) to = &addr + } else { + return nil, errors.New("cannot use a CosmWasm contract to delegate-create an EVM contract") + } + addr, _, exists := k.GetPointerInfo(ctx, types.PointerReverseRegistryKey(common.BytesToAddress([]byte(req.FromContract)))) + if !exists || common.BytesToAddress(addr).Cmp(*to) != 0 { + return nil, errors.New("only pointer contract can make delegatecalls") } zeroInt := sdk.ZeroInt() senderAddr, err := sdk.AccAddressFromBech32(req.Sender) diff --git a/x/evm/keeper/grpc_query.go b/x/evm/keeper/grpc_query.go index 451e2998e..9fc3da36c 100644 --- a/x/evm/keeper/grpc_query.go +++ b/x/evm/keeper/grpc_query.go @@ -7,6 +7,11 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" "github.com/ethereum/go-ethereum/common" + "github.com/sei-protocol/sei-chain/x/evm/artifacts/cw20" + "github.com/sei-protocol/sei-chain/x/evm/artifacts/cw721" + "github.com/sei-protocol/sei-chain/x/evm/artifacts/erc20" + "github.com/sei-protocol/sei-chain/x/evm/artifacts/erc721" + "github.com/sei-protocol/sei-chain/x/evm/artifacts/native" "github.com/sei-protocol/sei-chain/x/evm/types" ) @@ -111,3 +116,33 @@ func (q Querier) Pointer(c context.Context, req *types.QueryPointerRequest) (*ty return nil, errors.ErrUnsupported } } + +func (q Querier) PointerVersion(c context.Context, req *types.QueryPointerVersionRequest) (*types.QueryPointerVersionResponse, error) { + ctx := sdk.UnwrapSDKContext(c) + switch req.PointerType { + case types.PointerType_NATIVE: + return &types.QueryPointerVersionResponse{ + Version: uint32(native.CurrentVersion), + }, nil + case types.PointerType_CW20: + return &types.QueryPointerVersionResponse{ + Version: uint32(cw20.CurrentVersion), + }, nil + case types.PointerType_CW721: + return &types.QueryPointerVersionResponse{ + Version: uint32(cw721.CurrentVersion), + }, nil + case types.PointerType_ERC20: + return &types.QueryPointerVersionResponse{ + Version: uint32(erc20.CurrentVersion), + CwCodeId: q.GetStoredPointerCodeID(ctx, types.PointerType_ERC20), + }, nil + case types.PointerType_ERC721: + return &types.QueryPointerVersionResponse{ + Version: uint32(erc721.CurrentVersion), + CwCodeId: q.GetStoredPointerCodeID(ctx, types.PointerType_ERC721), + }, nil + default: + return nil, errors.ErrUnsupported + } +} diff --git a/x/evm/keeper/msg_server.go b/x/evm/keeper/msg_server.go index f8f0f426a..234018cb3 100644 --- a/x/evm/keeper/msg_server.go +++ b/x/evm/keeper/msg_server.go @@ -2,7 +2,6 @@ package keeper import ( "context" - "encoding/binary" "encoding/json" "fmt" "math" @@ -10,7 +9,6 @@ import ( "runtime/debug" "github.com/armon/go-metrics" - "github.com/cosmos/cosmos-sdk/store/prefix" "github.com/cosmos/cosmos-sdk/telemetry" sdk "github.com/cosmos/cosmos-sdk/types" bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" @@ -24,7 +22,6 @@ import ( "github.com/sei-protocol/sei-chain/utils" "github.com/sei-protocol/sei-chain/x/evm/artifacts/erc20" "github.com/sei-protocol/sei-chain/x/evm/artifacts/erc721" - artifactsutils "github.com/sei-protocol/sei-chain/x/evm/artifacts/utils" "github.com/sei-protocol/sei-chain/x/evm/state" "github.com/sei-protocol/sei-chain/x/evm/types" ) @@ -289,19 +286,16 @@ func (server msgServer) RegisterPointer(goCtx context.Context, msg *types.MsgReg if exists && existingVersion >= currentVersion { return nil, fmt.Errorf("pointer %s already registered at version %d", existingPointer.String(), existingVersion) } - store := server.PrefixStore(ctx, types.PointerCWCodePrefix) payload := map[string]interface{}{} switch msg.PointerType { case types.PointerType_ERC20: - store = prefix.NewStore(store, types.PointerCW20ERC20Prefix) payload["erc20_address"] = msg.ErcAddress case types.PointerType_ERC721: - store = prefix.NewStore(store, types.PointerCW721ERC721Prefix) payload["erc721_address"] = msg.ErcAddress default: panic("unknown pointer type") } - codeID := binary.BigEndian.Uint64(store.Get(artifactsutils.GetVersionBz(currentVersion))) + codeID := server.GetStoredPointerCodeID(ctx, msg.PointerType) bz, err := json.Marshal(payload) if err != nil { return nil, err diff --git a/x/evm/keeper/params.go b/x/evm/keeper/params.go index 211e387d4..a70a52d86 100644 --- a/x/evm/keeper/params.go +++ b/x/evm/keeper/params.go @@ -46,7 +46,3 @@ func (k *Keeper) ChainID(ctx sdk.Context) *big.Int { return config.GetEVMChainID(ctx.ChainID()) } - -func (k *Keeper) WhitelistedCwCodeHashesForDelegateCall(ctx sdk.Context) [][]byte { - return k.GetParams(ctx).WhitelistedCwCodeHashesForDelegateCall -} diff --git a/x/evm/keeper/pointer.go b/x/evm/keeper/pointer.go index e9b2e1a07..58f175304 100644 --- a/x/evm/keeper/pointer.go +++ b/x/evm/keeper/pointer.go @@ -14,6 +14,7 @@ import ( "github.com/sei-protocol/sei-chain/x/evm/artifacts/erc20" "github.com/sei-protocol/sei-chain/x/evm/artifacts/erc721" "github.com/sei-protocol/sei-chain/x/evm/artifacts/native" + artifactsutils "github.com/sei-protocol/sei-chain/x/evm/artifacts/utils" "github.com/sei-protocol/sei-chain/x/evm/types" ) @@ -205,3 +206,23 @@ func (k *Keeper) deletePointerInfo(ctx sdk.Context, pref []byte, version uint16) binary.BigEndian.PutUint16(versionBz, version) store.Delete(versionBz) } + +func (k *Keeper) GetStoredPointerCodeID(ctx sdk.Context, pointerType types.PointerType) uint64 { + store := k.PrefixStore(ctx, types.PointerCWCodePrefix) + var versionBz []byte + switch pointerType { + case types.PointerType_ERC20: + store = prefix.NewStore(store, types.PointerCW20ERC20Prefix) + versionBz = artifactsutils.GetVersionBz(erc20.CurrentVersion) + case types.PointerType_ERC721: + store = prefix.NewStore(store, types.PointerCW721ERC721Prefix) + versionBz = artifactsutils.GetVersionBz(erc721.CurrentVersion) + default: + return 0 + } + bz := store.Get(versionBz) + if bz == nil { + return 0 + } + return binary.BigEndian.Uint64(bz) +} diff --git a/x/evm/keeper/whitelist.go b/x/evm/keeper/whitelist.go deleted file mode 100644 index 5e85bfbf4..000000000 --- a/x/evm/keeper/whitelist.go +++ /dev/null @@ -1,16 +0,0 @@ -package keeper - -import ( - "bytes" - - sdk "github.com/cosmos/cosmos-sdk/types" -) - -func (k *Keeper) IsCWCodeHashWhitelistedForEVMDelegateCall(ctx sdk.Context, h []byte) bool { - for _, w := range k.WhitelistedCwCodeHashesForDelegateCall(ctx) { - if bytes.Equal(w, h) { - return true - } - } - return false -} diff --git a/x/evm/keeper/whitelist_test.go b/x/evm/keeper/whitelist_test.go deleted file mode 100644 index f25db274b..000000000 --- a/x/evm/keeper/whitelist_test.go +++ /dev/null @@ -1,14 +0,0 @@ -package keeper_test - -import ( - "testing" - - keepertest "github.com/sei-protocol/sei-chain/testutil/keeper" - "github.com/stretchr/testify/require" -) - -func TestWhitelist(t *testing.T) { - k, ctx := keepertest.MockEVMKeeper() - require.True(t, k.IsCWCodeHashWhitelistedForEVMDelegateCall(ctx, k.WhitelistedCwCodeHashesForDelegateCall(ctx)[0])) - require.False(t, k.IsCWCodeHashWhitelistedForEVMDelegateCall(ctx, []byte("1"))) -} diff --git a/x/evm/migrations/store_cw_pointer_code.go b/x/evm/migrations/store_cw_pointer_code.go index 2e188ec24..3dea8ed44 100644 --- a/x/evm/migrations/store_cw_pointer_code.go +++ b/x/evm/migrations/store_cw_pointer_code.go @@ -10,23 +10,27 @@ import ( "github.com/sei-protocol/sei-chain/x/evm/types" ) -func StoreCWPointerCode(ctx sdk.Context, k *keeper.Keeper) error { - erc20CodeID, err := k.WasmKeeper().Create(ctx, k.AccountKeeper().GetModuleAddress(types.ModuleName), erc20.GetBin(), nil) - if err != nil { - panic(err) +func StoreCWPointerCode(ctx sdk.Context, k *keeper.Keeper, store20 bool, store721 bool) error { + if store20 { + erc20CodeID, err := k.WasmKeeper().Create(ctx, k.AccountKeeper().GetModuleAddress(types.ModuleName), erc20.GetBin(), nil) + if err != nil { + panic(err) + } + prefix.NewStore(k.PrefixStore(ctx, types.PointerCWCodePrefix), types.PointerCW20ERC20Prefix).Set( + artifactsutils.GetVersionBz(erc20.CurrentVersion), + artifactsutils.GetCodeIDBz(erc20CodeID), + ) } - prefix.NewStore(k.PrefixStore(ctx, types.PointerCWCodePrefix), types.PointerCW20ERC20Prefix).Set( - artifactsutils.GetVersionBz(erc20.CurrentVersion), - artifactsutils.GetCodeIDBz(erc20CodeID), - ) - erc721CodeID, err := k.WasmKeeper().Create(ctx, k.AccountKeeper().GetModuleAddress(types.ModuleName), erc721.GetBin(), nil) - if err != nil { - panic(err) + if store721 { + erc721CodeID, err := k.WasmKeeper().Create(ctx, k.AccountKeeper().GetModuleAddress(types.ModuleName), erc721.GetBin(), nil) + if err != nil { + panic(err) + } + prefix.NewStore(k.PrefixStore(ctx, types.PointerCWCodePrefix), types.PointerCW721ERC721Prefix).Set( + artifactsutils.GetVersionBz(erc721.CurrentVersion), + artifactsutils.GetCodeIDBz(erc721CodeID), + ) } - prefix.NewStore(k.PrefixStore(ctx, types.PointerCWCodePrefix), types.PointerCW721ERC721Prefix).Set( - artifactsutils.GetVersionBz(erc721.CurrentVersion), - artifactsutils.GetCodeIDBz(erc721CodeID), - ) return nil } diff --git a/x/evm/module.go b/x/evm/module.go index 1c834bcea..0e42a94ba 100644 --- a/x/evm/module.go +++ b/x/evm/module.go @@ -141,12 +141,16 @@ func (am AppModule) RegisterServices(cfg module.Configurator) { }) _ = cfg.RegisterMigration(types.ModuleName, 4, func(ctx sdk.Context) error { - return migrations.StoreCWPointerCode(ctx, am.keeper) + return migrations.StoreCWPointerCode(ctx, am.keeper, true, true) }) _ = cfg.RegisterMigration(types.ModuleName, 5, func(ctx sdk.Context) error { return migrations.FixTotalSupply(ctx, am.keeper) }) + + _ = cfg.RegisterMigration(types.ModuleName, 6, func(ctx sdk.Context) error { + return migrations.StoreCWPointerCode(ctx, am.keeper, false, true) + }) } // RegisterInvariants registers the capability module's invariants. @@ -171,7 +175,7 @@ func (am AppModule) ExportGenesis(ctx sdk.Context, cdc codec.JSONCodec) json.Raw } // ConsensusVersion implements ConsensusVersion. -func (AppModule) ConsensusVersion() uint64 { return 6 } +func (AppModule) ConsensusVersion() uint64 { return 7 } // BeginBlock executes all ABCI BeginBlock logic respective to the capability module. func (am AppModule) BeginBlock(ctx sdk.Context, _ abci.RequestBeginBlock) { diff --git a/x/evm/module_test.go b/x/evm/module_test.go index 4082dcb86..d91c6e109 100644 --- a/x/evm/module_test.go +++ b/x/evm/module_test.go @@ -45,13 +45,13 @@ func TestModuleExportGenesis(t *testing.T) { module := evm.NewAppModule(nil, k) jsonMsg := module.ExportGenesis(ctx, types.ModuleCdc) jsonStr := string(jsonMsg) - assert.Equal(t, "{\"params\":{\"priority_normalizer\":\"1.000000000000000000\",\"base_fee_per_gas\":\"0.000000000000000000\",\"minimum_fee_per_gas\":\"1000000000.000000000000000000\",\"whitelisted_cw_code_hashes_for_delegate_call\":[\"ol1416zS7kfMOcIk4WL+ebU+a75u0qVujAqGWT6+YQI=\",\"lM3Zw+hcJvfOxDwjv7SzsrLXGgqNhcWN8S/+wHQf68g=\"]},\"address_associations\":[{\"sei_address\":\"sei17xpfvakm2amg962yls6f84z3kell8c5la4jkdu\",\"eth_address\":\"0x27F7B8B8B5A4e71E8E9aA671f4e4031E3773303F\"}],\"codes\":[],\"states\":[],\"nonces\":[],\"serialized\":[{\"prefix\":\"Fg==\",\"key\":\"AwAB\",\"value\":\"AAAAAAAAAAM=\"},{\"prefix\":\"Fg==\",\"key\":\"BAAB\",\"value\":\"AAAAAAAAAAQ=\"}]}", jsonStr) + assert.Equal(t, "{\"params\":{\"priority_normalizer\":\"1.000000000000000000\",\"base_fee_per_gas\":\"0.000000000000000000\",\"minimum_fee_per_gas\":\"1000000000.000000000000000000\",\"whitelisted_cw_code_hashes_for_delegate_call\":[]},\"address_associations\":[{\"sei_address\":\"sei17xpfvakm2amg962yls6f84z3kell8c5la4jkdu\",\"eth_address\":\"0x27F7B8B8B5A4e71E8E9aA671f4e4031E3773303F\"}],\"codes\":[],\"states\":[],\"nonces\":[],\"serialized\":[{\"prefix\":\"Fg==\",\"key\":\"AwAB\",\"value\":\"AAAAAAAAAAM=\"},{\"prefix\":\"Fg==\",\"key\":\"BAAC\",\"value\":\"AAAAAAAAAAQ=\"}]}", jsonStr) } func TestConsensusVersion(t *testing.T) { k, _ := testkeeper.MockEVMKeeper() module := evm.NewAppModule(nil, k) - assert.Equal(t, uint64(6), module.ConsensusVersion()) + assert.Equal(t, uint64(7), module.ConsensusVersion()) } func TestABCI(t *testing.T) { diff --git a/x/evm/types/params.go b/x/evm/types/params.go index ff99431f5..faff9e9ec 100644 --- a/x/evm/types/params.go +++ b/x/evm/types/params.go @@ -1,7 +1,6 @@ package types import ( - "encoding/hex" "errors" fmt "fmt" @@ -11,9 +10,10 @@ import ( ) var ( - KeyPriorityNormalizer = []byte("KeyPriorityNormalizer") - KeyBaseFeePerGas = []byte("KeyBaseFeePerGas") - KeyMinFeePerGas = []byte("KeyMinFeePerGas") + KeyPriorityNormalizer = []byte("KeyPriorityNormalizer") + KeyBaseFeePerGas = []byte("KeyBaseFeePerGas") + KeyMinFeePerGas = []byte("KeyMinFeePerGas") + // deprecated KeyWhitelistedCwCodeHashesForDelegateCall = []byte("KeyWhitelistedCwCodeHashesForDelegateCall") ) @@ -120,7 +120,5 @@ func validateWhitelistedCwHashesForDelegateCall(i interface{}) error { } func generateDefaultWhitelistedCwCodeHashesForDelegateCall() [][]byte { - cw20, _ := hex.DecodeString("A25D78D7ACD2EE47CC39C224E162FE79B53E6BBE6ED2A56E8C0A86593EBE6102") - cw721, _ := hex.DecodeString("94CDD9C3E85C26F7CEC43C23BFB4B3B2B2D71A0A8D85C58DF12FFEC0741FEBC8") - return [][]byte{cw20, cw721} + return [][]byte(nil) } diff --git a/x/evm/types/query.pb.go b/x/evm/types/query.pb.go index 5c80febcc..a13d53789 100644 --- a/x/evm/types/query.pb.go +++ b/x/evm/types/query.pb.go @@ -428,6 +428,102 @@ func (m *QueryPointerResponse) GetExists() bool { return false } +type QueryPointerVersionRequest struct { + PointerType PointerType `protobuf:"varint,1,opt,name=pointer_type,json=pointerType,proto3,enum=seiprotocol.seichain.evm.PointerType" json:"pointer_type,omitempty"` +} + +func (m *QueryPointerVersionRequest) Reset() { *m = QueryPointerVersionRequest{} } +func (m *QueryPointerVersionRequest) String() string { return proto.CompactTextString(m) } +func (*QueryPointerVersionRequest) ProtoMessage() {} +func (*QueryPointerVersionRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_11c0d37eed5339f7, []int{8} +} +func (m *QueryPointerVersionRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryPointerVersionRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryPointerVersionRequest.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 *QueryPointerVersionRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryPointerVersionRequest.Merge(m, src) +} +func (m *QueryPointerVersionRequest) XXX_Size() int { + return m.Size() +} +func (m *QueryPointerVersionRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QueryPointerVersionRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryPointerVersionRequest proto.InternalMessageInfo + +func (m *QueryPointerVersionRequest) GetPointerType() PointerType { + if m != nil { + return m.PointerType + } + return PointerType_ERC20 +} + +type QueryPointerVersionResponse struct { + Version uint32 `protobuf:"varint,1,opt,name=version,proto3" json:"version,omitempty"` + CwCodeId uint64 `protobuf:"varint,2,opt,name=cw_code_id,json=cwCodeId,proto3" json:"cw_code_id,omitempty"` +} + +func (m *QueryPointerVersionResponse) Reset() { *m = QueryPointerVersionResponse{} } +func (m *QueryPointerVersionResponse) String() string { return proto.CompactTextString(m) } +func (*QueryPointerVersionResponse) ProtoMessage() {} +func (*QueryPointerVersionResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_11c0d37eed5339f7, []int{9} +} +func (m *QueryPointerVersionResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryPointerVersionResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryPointerVersionResponse.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 *QueryPointerVersionResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryPointerVersionResponse.Merge(m, src) +} +func (m *QueryPointerVersionResponse) XXX_Size() int { + return m.Size() +} +func (m *QueryPointerVersionResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QueryPointerVersionResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryPointerVersionResponse proto.InternalMessageInfo + +func (m *QueryPointerVersionResponse) GetVersion() uint32 { + if m != nil { + return m.Version + } + return 0 +} + +func (m *QueryPointerVersionResponse) GetCwCodeId() uint64 { + if m != nil { + return m.CwCodeId + } + return 0 +} + func init() { proto.RegisterType((*QuerySeiAddressByEVMAddressRequest)(nil), "seiprotocol.seichain.evm.QuerySeiAddressByEVMAddressRequest") proto.RegisterType((*QuerySeiAddressByEVMAddressResponse)(nil), "seiprotocol.seichain.evm.QuerySeiAddressByEVMAddressResponse") @@ -437,47 +533,54 @@ func init() { proto.RegisterType((*QueryStaticCallResponse)(nil), "seiprotocol.seichain.evm.QueryStaticCallResponse") proto.RegisterType((*QueryPointerRequest)(nil), "seiprotocol.seichain.evm.QueryPointerRequest") proto.RegisterType((*QueryPointerResponse)(nil), "seiprotocol.seichain.evm.QueryPointerResponse") + proto.RegisterType((*QueryPointerVersionRequest)(nil), "seiprotocol.seichain.evm.QueryPointerVersionRequest") + proto.RegisterType((*QueryPointerVersionResponse)(nil), "seiprotocol.seichain.evm.QueryPointerVersionResponse") } func init() { proto.RegisterFile("evm/query.proto", fileDescriptor_11c0d37eed5339f7) } var fileDescriptor_11c0d37eed5339f7 = []byte{ - // 547 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x53, 0xcd, 0x6e, 0xd3, 0x4c, - 0x14, 0x8d, 0xf3, 0x7d, 0x6d, 0xe9, 0x6d, 0x29, 0xd2, 0x80, 0x42, 0x14, 0x21, 0x53, 0x99, 0x1f, - 0x45, 0x48, 0xb6, 0xa1, 0x6c, 0xcb, 0x82, 0xa0, 0x0a, 0x36, 0x48, 0x60, 0x10, 0x0b, 0x36, 0xd1, - 0xc4, 0xb9, 0xa4, 0x23, 0xc5, 0x1e, 0xd7, 0x33, 0xb1, 0xea, 0x2d, 0x4f, 0x80, 0x04, 0x2f, 0xc0, - 0xc3, 0x20, 0xb1, 0xac, 0x60, 0xc3, 0x12, 0x25, 0x3c, 0x08, 0xf2, 0x78, 0x9c, 0xb8, 0x6d, 0x62, - 0xb7, 0xec, 0xe6, 0x8e, 0xe7, 0x9c, 0x7b, 0xce, 0xf5, 0xb9, 0x70, 0x0d, 0x93, 0xc0, 0x3d, 0x9a, - 0x60, 0x9c, 0x3a, 0x51, 0xcc, 0x25, 0x27, 0x6d, 0x81, 0x4c, 0x9d, 0x7c, 0x3e, 0x76, 0x04, 0x32, - 0xff, 0x90, 0xb2, 0xd0, 0xc1, 0x24, 0xe8, 0xdc, 0x1a, 0x71, 0x3e, 0x1a, 0xa3, 0x4b, 0x23, 0xe6, - 0xd2, 0x30, 0xe4, 0x92, 0x4a, 0xc6, 0x43, 0x91, 0xe3, 0x3a, 0x8a, 0x08, 0xc3, 0x49, 0xa0, 0x2f, - 0xac, 0x03, 0xb0, 0x5e, 0x67, 0xbc, 0x6f, 0x90, 0x3d, 0x1d, 0x0e, 0x63, 0x14, 0xa2, 0x97, 0x1e, - 0xbc, 0x7b, 0xa9, 0xcf, 0x1e, 0x1e, 0x4d, 0x50, 0x48, 0x72, 0x1b, 0xb6, 0x30, 0x09, 0xfa, 0x34, - 0xbf, 0x6d, 0x1b, 0xbb, 0x46, 0x77, 0xd3, 0x03, 0x4c, 0x02, 0xfd, 0xce, 0xfa, 0x00, 0x77, 0x2a, - 0x69, 0x44, 0xc4, 0x43, 0x81, 0x19, 0x8f, 0x40, 0x76, 0x96, 0x47, 0xcc, 0x41, 0xc4, 0x04, 0xa0, - 0x42, 0x70, 0x9f, 0x51, 0x89, 0xc3, 0x76, 0x73, 0xd7, 0xe8, 0x5e, 0xf1, 0x4a, 0x37, 0x73, 0xb9, - 0x0b, 0xee, 0x5e, 0xa9, 0x67, 0x49, 0x6e, 0x65, 0x9b, 0xb9, 0xdc, 0x55, 0x34, 0x0b, 0xb9, 0x95, - 0xb6, 0x6b, 0xe5, 0xee, 0x43, 0x2b, 0x1f, 0x4b, 0xf6, 0x17, 0xfc, 0x67, 0x74, 0x3c, 0x2e, 0x24, - 0x12, 0xf8, 0x7f, 0x48, 0x25, 0x55, 0x9c, 0xdb, 0x9e, 0x3a, 0x93, 0x1d, 0x68, 0x4a, 0xae, 0x58, - 0x36, 0xbd, 0xa6, 0xe4, 0x96, 0x0d, 0x37, 0xcf, 0xa1, 0xb5, 0xb2, 0x25, 0x70, 0x2b, 0x85, 0xeb, - 0xea, 0xf9, 0x2b, 0xce, 0x42, 0x89, 0x71, 0xd1, 0xe9, 0x05, 0x6c, 0x47, 0xf9, 0x4d, 0x5f, 0xa6, - 0x11, 0x2a, 0xc8, 0xce, 0xde, 0x3d, 0x67, 0x55, 0x82, 0x1c, 0x8d, 0x7f, 0x9b, 0x46, 0xe8, 0x6d, - 0x45, 0x8b, 0x82, 0xb4, 0x61, 0x23, 0x2f, 0x51, 0x8b, 0x2c, 0x4a, 0x6b, 0x00, 0x37, 0x4e, 0xb7, - 0xd6, 0x32, 0xe7, 0x88, 0x58, 0x0f, 0xaf, 0x28, 0xb3, 0x2f, 0x09, 0xc6, 0x82, 0xf1, 0x50, 0x71, - 0x5d, 0xf5, 0x8a, 0x92, 0xb4, 0x60, 0x1d, 0x8f, 0x99, 0x90, 0xa2, 0xfd, 0x9f, 0x9a, 0xa7, 0xae, - 0xf6, 0x7e, 0xac, 0xc1, 0x9a, 0x6a, 0x42, 0xbe, 0x19, 0xd0, 0x5a, 0x1e, 0x34, 0xb2, 0xbf, 0xda, - 0x56, 0x7d, 0xcc, 0x3b, 0x4f, 0xfe, 0x11, 0x9d, 0xbb, 0xb5, 0x9c, 0x8f, 0x3f, 0xff, 0x7c, 0x6e, - 0x76, 0xc9, 0x7d, 0x57, 0x20, 0xb3, 0x0b, 0x1e, 0xb7, 0xe0, 0x71, 0xb3, 0xdd, 0x2b, 0xe5, 0x52, - 0xf9, 0x58, 0x9e, 0xc0, 0x5a, 0x1f, 0x95, 0xf9, 0xaf, 0xf5, 0x51, 0x1d, 0xfb, 0x0b, 0xf9, 0x28, - 0xed, 0x05, 0xf9, 0x6a, 0x00, 0x2c, 0x32, 0x4a, 0x1e, 0xd6, 0x4d, 0xf1, 0xec, 0x32, 0x74, 0x1e, - 0x5d, 0x02, 0x71, 0x99, 0x59, 0x2b, 0x58, 0xdf, 0xcf, 0x44, 0x7d, 0x31, 0x60, 0x43, 0xa7, 0x93, - 0xd8, 0x35, 0xed, 0x4e, 0x2f, 0x50, 0xc7, 0xb9, 0xe8, 0x73, 0x2d, 0xed, 0x81, 0x92, 0x76, 0x97, - 0x58, 0x15, 0xd2, 0xf4, 0x1a, 0xf4, 0x9e, 0x7f, 0x9f, 0x9a, 0xc6, 0xc9, 0xd4, 0x34, 0x7e, 0x4f, - 0x4d, 0xe3, 0xd3, 0xcc, 0x6c, 0x9c, 0xcc, 0xcc, 0xc6, 0xaf, 0x99, 0xd9, 0x78, 0x6f, 0x8f, 0x98, - 0x3c, 0x9c, 0x0c, 0x1c, 0x9f, 0x07, 0xe7, 0x78, 0xec, 0x9c, 0xe8, 0x58, 0x51, 0x65, 0x4b, 0x2d, - 0x06, 0xeb, 0xea, 0xfb, 0xe3, 0xbf, 0x01, 0x00, 0x00, 0xff, 0xff, 0x7d, 0xec, 0x65, 0x60, 0x2a, - 0x06, 0x00, 0x00, + // 627 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x94, 0xcd, 0x6e, 0xd3, 0x4e, + 0x14, 0xc5, 0xeb, 0xfc, 0xfb, 0xef, 0xc7, 0x6d, 0x29, 0xd2, 0x80, 0x4a, 0x64, 0x2a, 0x53, 0x99, + 0x0f, 0x55, 0x15, 0xb1, 0xa1, 0xc0, 0xae, 0x2c, 0x68, 0x55, 0x01, 0x0b, 0x24, 0x30, 0xd0, 0x05, + 0x1b, 0xcb, 0xb5, 0x6f, 0xdb, 0x91, 0x62, 0x8f, 0xeb, 0x99, 0xa4, 0xcd, 0x96, 0x05, 0x6b, 0x24, + 0x78, 0x01, 0x1e, 0x81, 0x87, 0x40, 0x62, 0x59, 0x89, 0x0d, 0x4b, 0xd4, 0xf0, 0x20, 0xc8, 0xe3, + 0x71, 0xe2, 0xb4, 0x89, 0x9d, 0x20, 0x76, 0x73, 0x27, 0x73, 0xce, 0xfd, 0xdd, 0xc9, 0x1c, 0xc3, + 0x65, 0x6c, 0x87, 0xf6, 0x51, 0x0b, 0x93, 0x8e, 0x15, 0x27, 0x4c, 0x30, 0x52, 0xe7, 0x48, 0xe5, + 0xca, 0x67, 0x4d, 0x8b, 0x23, 0xf5, 0x0f, 0x3d, 0x1a, 0x59, 0xd8, 0x0e, 0xf5, 0x95, 0x03, 0xc6, + 0x0e, 0x9a, 0x68, 0x7b, 0x31, 0xb5, 0xbd, 0x28, 0x62, 0xc2, 0x13, 0x94, 0x45, 0x3c, 0xd3, 0xe9, + 0xd2, 0x08, 0xa3, 0x56, 0xa8, 0x36, 0xcc, 0x1d, 0x30, 0x5f, 0xa5, 0xbe, 0xaf, 0x91, 0x3e, 0x09, + 0x82, 0x04, 0x39, 0xdf, 0xea, 0xec, 0xec, 0xbe, 0x50, 0x6b, 0x07, 0x8f, 0x5a, 0xc8, 0x05, 0xb9, + 0x01, 0x0b, 0xd8, 0x0e, 0x5d, 0x2f, 0xdb, 0xad, 0x6b, 0xab, 0xda, 0xda, 0xbc, 0x03, 0xd8, 0x0e, + 0xd5, 0x39, 0x73, 0x1f, 0x6e, 0x96, 0xda, 0xf0, 0x98, 0x45, 0x1c, 0x53, 0x1f, 0x8e, 0xf4, 0xbc, + 0x0f, 0xef, 0x89, 0x88, 0x01, 0xe0, 0x71, 0xce, 0x7c, 0xea, 0x09, 0x0c, 0xea, 0xb5, 0x55, 0x6d, + 0x6d, 0xce, 0x29, 0xec, 0xf4, 0x70, 0xfb, 0xde, 0x5b, 0x85, 0x9e, 0x05, 0xdc, 0xd2, 0x36, 0x3d, + 0xdc, 0x51, 0x36, 0x7d, 0xdc, 0xd2, 0xb1, 0x2b, 0x71, 0x37, 0x61, 0x39, 0xbb, 0x96, 0xf4, 0x5f, + 0xf0, 0xb7, 0xbd, 0x66, 0x33, 0x47, 0x24, 0x30, 0x1d, 0x78, 0xc2, 0x93, 0x9e, 0x8b, 0x8e, 0x5c, + 0x93, 0x25, 0xa8, 0x09, 0x26, 0x5d, 0xe6, 0x9d, 0x9a, 0x60, 0x66, 0x03, 0xae, 0x5d, 0x50, 0x2b, + 0xb2, 0x21, 0x72, 0xb3, 0x03, 0x57, 0xe4, 0xf1, 0x97, 0x8c, 0x46, 0x02, 0x93, 0xbc, 0xd3, 0x33, + 0x58, 0x8c, 0xb3, 0x1d, 0x57, 0x74, 0x62, 0x94, 0x92, 0xa5, 0x8d, 0xdb, 0xd6, 0xa8, 0x17, 0x64, + 0x29, 0xfd, 0x9b, 0x4e, 0x8c, 0xce, 0x42, 0xdc, 0x2f, 0x48, 0x1d, 0x66, 0xb3, 0x12, 0x15, 0x64, + 0x5e, 0x9a, 0x7b, 0x70, 0x75, 0xb0, 0xb5, 0xc2, 0xec, 0x29, 0x12, 0x75, 0x79, 0x79, 0x99, 0xfe, + 0xd2, 0xc6, 0x84, 0x53, 0x16, 0x49, 0xaf, 0x4b, 0x4e, 0x5e, 0x92, 0x65, 0x98, 0xc1, 0x13, 0xca, + 0x05, 0xaf, 0xff, 0x27, 0xef, 0x53, 0x55, 0xe6, 0x3e, 0xe8, 0xc5, 0x1e, 0xbb, 0xd9, 0xf1, 0x7f, + 0x3e, 0xa5, 0xf9, 0x16, 0xae, 0x0f, 0xed, 0xd3, 0x1f, 0x29, 0x07, 0xd7, 0x06, 0xc1, 0x57, 0x00, + 0xfc, 0x63, 0xd7, 0x67, 0x01, 0xba, 0x34, 0x7b, 0x0c, 0xd3, 0xce, 0x9c, 0x7f, 0xbc, 0xcd, 0x02, + 0x7c, 0x1e, 0x6c, 0x7c, 0x98, 0x85, 0xff, 0xa5, 0x2f, 0xf9, 0xa6, 0xc1, 0xf2, 0xf0, 0x9c, 0x90, + 0xcd, 0xd1, 0xbc, 0xd5, 0x29, 0xd5, 0x1f, 0xff, 0xa5, 0x3a, 0x9b, 0xcc, 0xb4, 0xde, 0xff, 0xf8, + 0xfd, 0xa9, 0xb6, 0x46, 0xee, 0xd8, 0x1c, 0x69, 0x23, 0xf7, 0xb1, 0x73, 0x1f, 0x3b, 0xfd, 0x74, + 0x14, 0x62, 0x25, 0xe7, 0x18, 0x1e, 0xa0, 0xca, 0x39, 0x4a, 0xe3, 0x5b, 0x39, 0x47, 0x79, 0x6a, + 0xc7, 0x9a, 0xa3, 0x10, 0x6b, 0xf2, 0x45, 0x03, 0xe8, 0x47, 0x8c, 0xdc, 0xab, 0xba, 0xc5, 0xf3, + 0x59, 0xd6, 0xef, 0x4f, 0xa0, 0x98, 0xe4, 0xae, 0xa5, 0xcc, 0xf5, 0x53, 0xa8, 0xcf, 0x1a, 0xcc, + 0xaa, 0x07, 0x49, 0x1a, 0x15, 0xed, 0x06, 0xf3, 0xaf, 0x5b, 0xe3, 0x1e, 0x57, 0x68, 0xeb, 0x12, + 0xed, 0x16, 0x31, 0x4b, 0xd0, 0xf2, 0x14, 0x7f, 0xd5, 0x60, 0x69, 0x30, 0x27, 0xe4, 0xe1, 0x78, + 0xed, 0x06, 0xe3, 0xab, 0x3f, 0x9a, 0x50, 0xa5, 0x58, 0x37, 0x24, 0xeb, 0x5d, 0xb2, 0x5e, 0xcd, + 0xea, 0xaa, 0x98, 0x6e, 0x3d, 0xfd, 0x7e, 0x66, 0x68, 0xa7, 0x67, 0x86, 0xf6, 0xeb, 0xcc, 0xd0, + 0x3e, 0x76, 0x8d, 0xa9, 0xd3, 0xae, 0x31, 0xf5, 0xb3, 0x6b, 0x4c, 0xbd, 0x6b, 0x1c, 0x50, 0x71, + 0xd8, 0xda, 0xb3, 0x7c, 0x16, 0x5e, 0xf0, 0x6b, 0x64, 0x86, 0x27, 0xd2, 0x32, 0xfd, 0xc2, 0xf0, + 0xbd, 0x19, 0xf9, 0xfb, 0x83, 0x3f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x5d, 0xbe, 0x8f, 0x9b, 0x9d, + 0x07, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -496,6 +599,7 @@ type QueryClient interface { EVMAddressBySeiAddress(ctx context.Context, in *QueryEVMAddressBySeiAddressRequest, opts ...grpc.CallOption) (*QueryEVMAddressBySeiAddressResponse, error) StaticCall(ctx context.Context, in *QueryStaticCallRequest, opts ...grpc.CallOption) (*QueryStaticCallResponse, error) Pointer(ctx context.Context, in *QueryPointerRequest, opts ...grpc.CallOption) (*QueryPointerResponse, error) + PointerVersion(ctx context.Context, in *QueryPointerVersionRequest, opts ...grpc.CallOption) (*QueryPointerVersionResponse, error) } type queryClient struct { @@ -542,12 +646,22 @@ func (c *queryClient) Pointer(ctx context.Context, in *QueryPointerRequest, opts return out, nil } +func (c *queryClient) PointerVersion(ctx context.Context, in *QueryPointerVersionRequest, opts ...grpc.CallOption) (*QueryPointerVersionResponse, error) { + out := new(QueryPointerVersionResponse) + err := c.cc.Invoke(ctx, "/seiprotocol.seichain.evm.Query/PointerVersion", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // QueryServer is the server API for Query service. type QueryServer interface { SeiAddressByEVMAddress(context.Context, *QuerySeiAddressByEVMAddressRequest) (*QuerySeiAddressByEVMAddressResponse, error) EVMAddressBySeiAddress(context.Context, *QueryEVMAddressBySeiAddressRequest) (*QueryEVMAddressBySeiAddressResponse, error) StaticCall(context.Context, *QueryStaticCallRequest) (*QueryStaticCallResponse, error) Pointer(context.Context, *QueryPointerRequest) (*QueryPointerResponse, error) + PointerVersion(context.Context, *QueryPointerVersionRequest) (*QueryPointerVersionResponse, error) } // UnimplementedQueryServer can be embedded to have forward compatible implementations. @@ -566,6 +680,9 @@ func (*UnimplementedQueryServer) StaticCall(ctx context.Context, req *QueryStati func (*UnimplementedQueryServer) Pointer(ctx context.Context, req *QueryPointerRequest) (*QueryPointerResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method Pointer not implemented") } +func (*UnimplementedQueryServer) PointerVersion(ctx context.Context, req *QueryPointerVersionRequest) (*QueryPointerVersionResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method PointerVersion not implemented") +} func RegisterQueryServer(s grpc1.Server, srv QueryServer) { s.RegisterService(&_Query_serviceDesc, srv) @@ -643,6 +760,24 @@ func _Query_Pointer_Handler(srv interface{}, ctx context.Context, dec func(inter return interceptor(ctx, in, info, handler) } +func _Query_PointerVersion_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryPointerVersionRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).PointerVersion(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/seiprotocol.seichain.evm.Query/PointerVersion", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).PointerVersion(ctx, req.(*QueryPointerVersionRequest)) + } + return interceptor(ctx, in, info, handler) +} + var _Query_serviceDesc = grpc.ServiceDesc{ ServiceName: "seiprotocol.seichain.evm.Query", HandlerType: (*QueryServer)(nil), @@ -663,6 +798,10 @@ var _Query_serviceDesc = grpc.ServiceDesc{ MethodName: "Pointer", Handler: _Query_Pointer_Handler, }, + { + MethodName: "PointerVersion", + Handler: _Query_PointerVersion_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "evm/query.proto", @@ -955,6 +1094,67 @@ func (m *QueryPointerResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *QueryPointerVersionRequest) 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 *QueryPointerVersionRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryPointerVersionRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.PointerType != 0 { + i = encodeVarintQuery(dAtA, i, uint64(m.PointerType)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *QueryPointerVersionResponse) 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 *QueryPointerVersionResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryPointerVersionResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.CwCodeId != 0 { + i = encodeVarintQuery(dAtA, i, uint64(m.CwCodeId)) + i-- + dAtA[i] = 0x10 + } + if m.Version != 0 { + i = encodeVarintQuery(dAtA, i, uint64(m.Version)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + func encodeVarintQuery(dAtA []byte, offset int, v uint64) int { offset -= sovQuery(v) base := offset @@ -1089,6 +1289,33 @@ func (m *QueryPointerResponse) Size() (n int) { return n } +func (m *QueryPointerVersionRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.PointerType != 0 { + n += 1 + sovQuery(uint64(m.PointerType)) + } + return n +} + +func (m *QueryPointerVersionResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Version != 0 { + n += 1 + sovQuery(uint64(m.Version)) + } + if m.CwCodeId != 0 { + n += 1 + sovQuery(uint64(m.CwCodeId)) + } + return n +} + func sovQuery(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } @@ -1885,6 +2112,163 @@ func (m *QueryPointerResponse) Unmarshal(dAtA []byte) error { } return nil } +func (m *QueryPointerVersionRequest) 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: QueryPointerVersionRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryPointerVersionRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field PointerType", wireType) + } + m.PointerType = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.PointerType |= PointerType(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 *QueryPointerVersionResponse) 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: QueryPointerVersionResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryPointerVersionResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Version", wireType) + } + m.Version = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Version |= uint32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field CwCodeId", wireType) + } + m.CwCodeId = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.CwCodeId |= 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 skipQuery(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 diff --git a/x/evm/types/query.pb.gw.go b/x/evm/types/query.pb.gw.go index 8d4d10c21..72c5e53f0 100644 --- a/x/evm/types/query.pb.gw.go +++ b/x/evm/types/query.pb.gw.go @@ -177,6 +177,42 @@ func local_request_Query_Pointer_0(ctx context.Context, marshaler runtime.Marsha } +var ( + filter_Query_PointerVersion_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} +) + +func request_Query_PointerVersion_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryPointerVersionRequest + 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_PointerVersion_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.PointerVersion(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Query_PointerVersion_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryPointerVersionRequest + 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_PointerVersion_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.PointerVersion(ctx, &protoReq) + return msg, metadata, err + +} + // RegisterQueryHandlerServer registers the http handlers for service Query to "mux". // UnaryRPC :call QueryServer directly. // StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. @@ -275,6 +311,29 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv }) + mux.Handle("GET", pattern_Query_PointerVersion_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_PointerVersion_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_PointerVersion_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } @@ -396,6 +455,26 @@ func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie }) + mux.Handle("GET", pattern_Query_PointerVersion_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_PointerVersion_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_PointerVersion_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } @@ -407,6 +486,8 @@ var ( pattern_Query_StaticCall_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"sei-protocol", "seichain", "evm", "static_call"}, "", runtime.AssumeColonVerbOpt(true))) pattern_Query_Pointer_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"sei-protocol", "seichain", "evm", "pointer"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_Query_PointerVersion_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"sei-protocol", "seichain", "evm", "pointer_version"}, "", runtime.AssumeColonVerbOpt(true))) ) var ( @@ -417,4 +498,6 @@ var ( forward_Query_StaticCall_0 = runtime.ForwardResponseMessage forward_Query_Pointer_0 = runtime.ForwardResponseMessage + + forward_Query_PointerVersion_0 = runtime.ForwardResponseMessage )