diff --git a/.circleci/config.yml b/.circleci/config.yml index b275e525e3..7ca5270fbe 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -27,8 +27,8 @@ commands: jobs: build: docker: - - image: circleci/golang:1.17 - working_directory: /go/src/github.com/{{ORG_NAME}}/{{REPO_NAME}} + - image: cimg/go:1.20 + working_directory: /home/circleci/go/src/github.com/{{ORG_NAME}}/{{REPO_NAME}} steps: - checkout - restore_cache: diff --git a/.github/workflows/ci-exchain-ut.yml b/.github/workflows/ci-exchain-ut.yml index 8cfdc23369..ce18238398 100644 --- a/.github/workflows/ci-exchain-ut.yml +++ b/.github/workflows/ci-exchain-ut.yml @@ -15,7 +15,7 @@ jobs: - uses: actions/checkout@v2 - uses: actions/setup-go@v2 with: - go-version: 1.17 + go-version: "1.20" - name: Run Test exchain/app id: first-attempt @@ -48,7 +48,7 @@ jobs: - uses: actions/setup-go@v2 with: - go-version: 1.17 + go-version: "1.20" - name: Run Test exchain/x id: first-attempt @@ -81,7 +81,7 @@ jobs: - uses: actions/setup-go@v2 with: - go-version: 1.17 + go-version: "1.20" - name: Go Test exchain/libs/tm id: first-attempt @@ -123,7 +123,7 @@ jobs: - uses: actions/setup-go@v2 with: - go-version: 1.17 + go-version: "1.20" - name: Go Test exchain/libs/ibc-go id: first-attempt @@ -149,7 +149,7 @@ jobs: - uses: actions/setup-go@v2 with: - go-version: 1.17 + go-version: "1.20" - name: Go Test exchain/libs/cosmos-sdk/x id: first-attempt @@ -175,7 +175,7 @@ jobs: - uses: actions/setup-go@v2 with: - go-version: 1.17 + go-version: "1.20" - name: Go Test exchain/libs/other id: first-attempt diff --git a/Dockerfile b/Dockerfile index 3f3c91a926..801e5ebb05 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,7 +2,7 @@ # > docker build -t exchain . # > docker run -it -p 36657:36657 -p 36656:36656 -v ~/.exchaind:/root/.exchaind -v ~/.exchaincli:/root/.exchaincli exchain exchaind init mynode # > docker run -it -p 36657:36657 -p 36656:36656 -v ~/.exchaind:/root/.exchaind -v ~/.exchaincli:/root/.exchaincli exchain exchaind start -FROM golang:1.17.2-alpine AS build-env +FROM golang:1.20.2-alpine AS build-env # Install minimum necessary dependencies, remove packages RUN apk add --no-cache curl make git libc-dev bash gcc linux-headers eudev-dev diff --git a/Makefile b/Makefile index f5431aee87..e4bd0ff76a 100644 --- a/Makefile +++ b/Makefile @@ -7,13 +7,13 @@ export GO111MODULE=on GithubTop=github.com -GO_VERSION=1.17 +GO_VERSION=1.20 ROCKSDB_VERSION=6.27.3 IGNORE_CHECK_GO=false install_rocksdb_version:=$(ROCKSDB_VERSION) -Version=v1.7.5 +Version=v1.7.8 CosmosSDK=v0.39.2 Tendermint=v0.33.9 Iavl=v0.14.3 @@ -71,6 +71,18 @@ endif build_tags = netgo +system=$(shell $(shell pwd)/libs/scripts/system.sh) +ifeq ($(system),alpine) + ifeq ($(LINK_STATICALLY),false) + $(warning Your system is alpine. It must be compiled statically. Now we start compile statically.) + endif + LINK_STATICALLY=true +else + ifeq ($(LINK_STATICALLY),true) + $(error your system is $(system) which can not be complied statically. please set LINK_STATICALLY=false) + endif +endif + ifeq ($(WITH_ROCKSDB),true) CGO_ENABLED=1 build_tags += rocksdb @@ -82,8 +94,10 @@ else ROCKSDB_VERSION=0 endif + ifeq ($(LINK_STATICALLY),true) - build_tags += muslc + build_tags += muslc + dummy := $(shell $(shell pwd)/libs/scripts/wasm_static_install.sh) endif build_tags += $(BUILD_TAGS) @@ -118,7 +132,7 @@ ifeq ($(MAKECMDGOALS),testnet) endif ifeq ($(LINK_STATICALLY),true) - ldflags += -linkmode=external -extldflags "-Wl,-z,muldefs -static" + ldflags += -linkmode=external -extldflags "-Wl,-z,muldefs -static" endif ifeq ($(OKCMALLOC),tcmalloc) diff --git a/README.md b/README.md index 566d679cfb..0c54f5d622 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ The Infrastructure of Decentralized Exchange This repository hosts `OKTC`, the implementation of the OKTC based on the [Cosmos SDK](https://github.com/cosmos/cosmos-sdk). -**Note**: Requires [Go 1.17](https://golang.org/dl/) +**Note**: Requires [Go 1.20](https://golang.org/dl/) ## Getting Started Refer to the [documentation](https://okexchain-docs.readthedocs.io/en/latest/index.html). diff --git a/app/ante/account.go b/app/ante/account.go index 26069c53e4..7d532ab3df 100644 --- a/app/ante/account.go +++ b/app/ante/account.go @@ -2,18 +2,18 @@ package ante import ( "bytes" - tmtypes "github.com/okex/exchain/libs/tendermint/types" "math/big" "strconv" "strings" + tmtypes "github.com/okex/exchain/libs/tendermint/types" + "github.com/ethereum/go-ethereum/common" ethcore "github.com/ethereum/go-ethereum/core" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/okex/exchain/libs/cosmos-sdk/baseapp" sdk "github.com/okex/exchain/libs/cosmos-sdk/types" sdkerrors "github.com/okex/exchain/libs/cosmos-sdk/types/errors" - "github.com/okex/exchain/libs/cosmos-sdk/types/innertx" "github.com/okex/exchain/libs/cosmos-sdk/x/auth" "github.com/okex/exchain/libs/cosmos-sdk/x/auth/exported" "github.com/okex/exchain/libs/cosmos-sdk/x/auth/types" @@ -153,7 +153,7 @@ func nonceVerification(ctx sdk.Context, acc exported.Account, msgEthTx *evmtypes return ctx, nil } -func ethGasConsume(ek EVMKeeper, ak accountKeeperInterface, sk types.SupplyKeeper, ctx *sdk.Context, acc exported.Account, accGetGas sdk.Gas, msgEthTx *evmtypes.MsgEthereumTx, simulate bool) error { +func ethGasConsume(ek EVMKeeper, sk types.SupplyKeeper, ctx *sdk.Context, acc exported.Account, accGetGas sdk.Gas, msgEthTx *evmtypes.MsgEthereumTx, simulate bool) error { gasLimit := msgEthTx.GetGas() if shouldIntrinsicGas(ek, ctx, msgEthTx) { @@ -182,7 +182,7 @@ func ethGasConsume(ek EVMKeeper, ak accountKeeperInterface, sk types.SupplyKeepe ctx.UpdateFromAccountCache(acc, accGetGas) - err := deductFees(ek, ak, sk, *ctx, acc, feeAmt) + err := auth.DeductFees(sk, *ctx, acc, feeAmt) if err != nil { return err } @@ -212,43 +212,6 @@ func IsE2CTx(ek EVMKeeper, ctx *sdk.Context, msgEthTx *evmtypes.MsgEthereumTx) b return false } -func deductFees(ik innertx.InnerTxKeeper, ak accountKeeperInterface, sk types.SupplyKeeper, ctx sdk.Context, acc exported.Account, fees sdk.Coins) error { - blockTime := ctx.BlockTime() - coins := acc.GetCoins() - - if !fees.IsValid() { - return sdkerrors.Wrapf(sdkerrors.ErrInsufficientFee, "invalid fee amount: %s", fees) - } - - // verify the account has enough funds to pay for fees - balance, hasNeg := coins.SafeSub(fees) - if hasNeg { - return sdkerrors.Wrapf(sdkerrors.ErrInsufficientFunds, - "insufficient funds to pay for fees; %s < %s", coins, fees) - } - - // Validate the account has enough "spendable" coins as this will cover cases - // such as vesting accounts. - spendableCoins := acc.SpendableCoins(blockTime) - if _, hasNeg := spendableCoins.SafeSub(fees); hasNeg { - return sdkerrors.Wrapf(sdkerrors.ErrInsufficientFunds, - "insufficient funds to pay for fees; %s < %s", spendableCoins, fees) - } - - // set coins and record innertx - err := acc.SetCoins(balance) - if !ctx.IsCheckTx() { - toAcc := sk.GetModuleAddress(types.FeeCollectorName) - ik.UpdateInnerTx(ctx.TxBytes(), ctx.BlockHeight(), innertx.CosmosDepth, acc.GetAddress(), toAcc, innertx.CosmosCallType, innertx.SendCallName, fees, err) - } - if err != nil { - return err - } - ak.SetAccount(ctx, acc) - - return nil -} - func incrementSeq(ctx sdk.Context, msgEthTx *evmtypes.MsgEthereumTx, accAddress sdk.AccAddress, ak auth.AccountKeeper, acc exported.Account) { if ctx.IsCheckTx() && !ctx.IsReCheckTx() && !baseapp.IsMempoolEnableRecheck() && !ctx.IsTraceTx() { return @@ -339,7 +302,7 @@ func (avd AccountAnteDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulate ctx.EnableAccountCache() // account would be updated - err = ethGasConsume(avd.evmKeeper, avd.ak, avd.sk, &ctx, acc, getAccGasUsed, msgEthTx, simulate) + err = ethGasConsume(avd.evmKeeper, avd.sk, &ctx, acc, getAccGasUsed, msgEthTx, simulate) acc = nil acc, _ = ctx.GetFromAccountCacheData().(exported.Account) ctx.DisableAccountCache() diff --git a/app/app.go b/app/app.go index b4d4e5c2f7..08e09ef0a5 100644 --- a/app/app.go +++ b/app/app.go @@ -2,6 +2,7 @@ package app import ( "fmt" + "github.com/okex/exchain/libs/cosmos-sdk/client/flags" "io" "os" "runtime/debug" @@ -50,6 +51,7 @@ import ( "github.com/okex/exchain/libs/cosmos-sdk/server" "github.com/okex/exchain/libs/cosmos-sdk/simapp" "github.com/okex/exchain/libs/cosmos-sdk/store/mpt" + stypes "github.com/okex/exchain/libs/cosmos-sdk/store/types" sdk "github.com/okex/exchain/libs/cosmos-sdk/types" "github.com/okex/exchain/libs/cosmos-sdk/types/module" upgradetypes "github.com/okex/exchain/libs/cosmos-sdk/types/upgrade" @@ -758,13 +760,15 @@ func NewOKExChainApp( app.SetMptCommitHandler(NewMptCommitHandler(app.EvmKeeper)) app.SetUpdateWasmTxCount(fixCosmosTxCountInWasmForParallelTx(app.WasmHandler.TXCounterStoreKey)) app.SetUpdateFeeCollectorAccHandler(updateFeeCollectorHandler(app.BankKeeper, app.SupplyKeeper)) + app.SetGetFeeCollectorInfo(getFeeCollectorInfo(app.BankKeeper, app.SupplyKeeper)) app.SetParallelTxLogHandlers(fixLogForParallelTxHandler(app.EvmKeeper)) app.SetPreDeliverTxHandler(preDeliverTxHandler(app.AccountKeeper)) - app.SetPartialConcurrentHandlers(getTxFeeAndFromHandler(app.AccountKeeper)) + app.SetPartialConcurrentHandlers(getTxFeeAndFromHandler(app.EvmKeeper)) app.SetGetTxFeeHandler(getTxFeeHandler()) app.SetEvmSysContractAddressHandler(NewEvmSysContractAddressHandler(app.EvmKeeper)) app.SetEvmWatcherCollector(app.EvmKeeper.Watcher.Collect) app.SetUpdateCMTxNonceHandler(NewUpdateCMTxNonceHandler()) + app.SetGetGasConfigHandler(NewGetGasConfigHandler(app.ParamsKeeper)) if loadLatest { err := app.LoadLatestVersion(app.keys[bam.MainStoreKey]) @@ -955,6 +959,8 @@ func NewAccNonceHandler(ak auth.AccountKeeper) sdk.AccNonceHandler { } func PreRun(ctx *server.Context, cmd *cobra.Command) error { + prepareSnapshotDataIfNeed(viper.GetString(server.FlagStartFromSnapshot), viper.GetString(flags.FlagHome), ctx.Logger) + // check start flag conflicts err := sanity.CheckStart() if err != nil { @@ -1033,9 +1039,19 @@ func NewEvmSysContractAddressHandler(ak *evm.Keeper) sdk.EvmSysContractAddressHa func NewUpdateCMTxNonceHandler() sdk.UpdateCMTxNonceHandler { return func(tx sdk.Tx, nonce uint64) { - stdtx, ok := tx.(*authtypes.StdTx) - if ok && nonce != 0 { - stdtx.Nonce = nonce + if nonce != 0 { + switch v := tx.(type) { + case *authtypes.StdTx: + v.Nonce = nonce + case *authtypes.IbcTx: + v.Nonce = nonce + } } } } + +func NewGetGasConfigHandler(pk params.Keeper) sdk.GetGasConfigHandler { + return func(ctx sdk.Context) *stypes.GasConfig { + return pk.GetGasConfig(ctx) + } +} diff --git a/app/app_parallel.go b/app/app_parallel.go index ffc847f6b6..eb3bba5337 100644 --- a/app/app_parallel.go +++ b/app/app_parallel.go @@ -4,7 +4,9 @@ import ( "sort" "strings" + appante "github.com/okex/exchain/app/ante" ethermint "github.com/okex/exchain/app/types" + "github.com/okex/exchain/libs/cosmos-sdk/baseapp" sdk "github.com/okex/exchain/libs/cosmos-sdk/types" "github.com/okex/exchain/libs/cosmos-sdk/x/auth" authante "github.com/okex/exchain/libs/cosmos-sdk/x/auth/ante" @@ -18,12 +20,23 @@ import ( wasmkeeper "github.com/okex/exchain/x/wasm/keeper" ) +func getFeeCollectorInfo(bk bank.Keeper, sk supply.Keeper) sdk.GetFeeCollectorInfo { + return func(ctx sdk.Context, onlyGetFeeCollectorStoreKey bool) (sdk.Coins, []byte) { + if onlyGetFeeCollectorStoreKey { + return sdk.Coins{}, auth.AddressStoreKey(sk.GetModuleAddress(auth.FeeCollectorName)) + } + return bk.GetCoins(ctx, sk.GetModuleAddress(auth.FeeCollectorName)), nil + } +} + // feeCollectorHandler set or get the value of feeCollectorAcc func updateFeeCollectorHandler(bk bank.Keeper, sk supply.Keeper) sdk.UpdateFeeCollectorAccHandler { return func(ctx sdk.Context, balance sdk.Coins, txFeesplit []*sdk.FeeSplitInfo) error { - err := bk.SetCoins(ctx, sk.GetModuleAccount(ctx, auth.FeeCollectorName).GetAddress(), balance) - if err != nil { - return err + if !balance.Empty() { + err := bk.SetCoins(ctx, sk.GetModuleAccount(ctx, auth.FeeCollectorName).GetAddress(), balance) + if err != nil { + return err + } } // split fee @@ -32,7 +45,7 @@ func updateFeeCollectorHandler(bk bank.Keeper, sk supply.Keeper) sdk.UpdateFeeCo feesplits, sortAddrs := groupByAddrAndSortFeeSplits(txFeesplit) for _, addr := range sortAddrs { acc := sdk.MustAccAddressFromBech32(addr) - err = sk.SendCoinsFromModuleToAccount(ctx, auth.FeeCollectorName, acc, feesplits[addr]) + err := sk.SendCoinsFromModuleToAccount(ctx, auth.FeeCollectorName, acc, feesplits[addr]) if err != nil { return err } @@ -103,11 +116,21 @@ func getTxFeeHandler() sdk.GetTxFeeHandler { } // getTxFeeAndFromHandler get tx fee and from -func getTxFeeAndFromHandler(ak auth.AccountKeeper) sdk.GetTxFeeAndFromHandler { - return func(ctx sdk.Context, tx sdk.Tx) (fee sdk.Coins, isEvm bool, from string, to string, err error, supportPara bool) { +func getTxFeeAndFromHandler(ek appante.EVMKeeper) sdk.GetTxFeeAndFromHandler { + return func(ctx sdk.Context, tx sdk.Tx) (fee sdk.Coins, isEvm bool, needUpdateTXCounter bool, from string, to string, err error, supportPara bool) { if evmTx, ok := tx.(*evmtypes.MsgEthereumTx); ok { isEvm = true supportPara = true + if appante.IsE2CTx(ek, &ctx, evmTx) { + if tmtypes.HigherThanVenus6(ctx.BlockHeight()) { + needUpdateTXCounter = true + } + // E2C will include cosmos Msg in the Payload. + // Sometimes, this Msg do not support parallel execution. + if !tmtypes.HigherThanVenus6(ctx.BlockHeight()) || !isParaSupportedE2CMsg(evmTx.Data.Payload) { + supportPara = false + } + } err = evmTxVerifySigHandler(ctx.ChainID(), ctx.BlockHeight(), evmTx) if err != nil { return @@ -122,11 +145,18 @@ func getTxFeeAndFromHandler(ak auth.AccountKeeper) sdk.GetTxFeeAndFromHandler { } } else if feeTx, ok := tx.(authante.FeeTx); ok { fee = feeTx.GetFee() - if stdTx, ok := tx.(*auth.StdTx); ok && len(stdTx.Msgs) == 1 { // only support one message - if msg, ok := stdTx.Msgs[0].(interface{ CalFromAndToForPara() (string, string) }); ok { - from, to = msg.CalFromAndToForPara() - if tmtypes.HigherThanVenus6(ctx.BlockHeight()) { - supportPara = true + if tx.GetType() == sdk.StdTxType { + if tmtypes.HigherThanEarth(ctx.BlockHeight()) { + needUpdateTXCounter = true + } + txMsgs := tx.GetMsgs() + // only support one message + if len(txMsgs) == 1 { + if msg, ok := txMsgs[0].(interface{ CalFromAndToForPara() (string, string) }); ok { + from, to = msg.CalFromAndToForPara() + if tmtypes.HigherThanVenus6(ctx.BlockHeight()) { + supportPara = true + } } } } @@ -159,3 +189,23 @@ func groupByAddrAndSortFeeSplits(txFeesplit []*sdk.FeeSplitInfo) (feesplits map[ return } + +func isParaSupportedE2CMsg(payload []byte) bool { + // Here, payload must be E2C's Data.Payload + p, err := evm.ParseContractParam(payload) + if err != nil { + return false + } + mw, err := baseapp.ParseMsgWrapper(p) + if err != nil { + return false + } + switch mw.Name { + case "wasm/MsgExecuteContract": + return true + case "wasm/MsgStoreCode": + return true + default: + return false + } +} diff --git a/app/app_test.go b/app/app_test.go index df2c609a93..cdbc799926 100644 --- a/app/app_test.go +++ b/app/app_test.go @@ -258,7 +258,7 @@ func (suite *FakeBlockTxTestSuite) TestFakeBlockTx() { return txBytes }, 0, - 159669, + 159732, }, { "send tx for gov with error fee, failed, do not write to block", diff --git a/app/config/config.go b/app/config/config.go index a456b4a442..ac4cfbe88d 100644 --- a/app/config/config.go +++ b/app/config/config.go @@ -61,6 +61,8 @@ type OecConfig struct { nodeKeyWhitelist []string //mempool.check_tx_cost mempoolCheckTxCost bool + //mempool.pending-pool-blacklist + pendingPoolBlacklist string // p2p.sentry_addrs sentryAddrs []string @@ -152,6 +154,7 @@ const ( FlagNodeKeyWhitelist = "mempool.node_key_whitelist" FlagMempoolCheckTxCost = "mempool.check_tx_cost" FlagMempoolEnableDeleteMinGPTx = "mempool.enable_delete_min_gp_tx" + FlagPendingPoolBlacklist = "mempool.pending-pool-blacklist" FlagGasLimitBuffer = "gas-limit-buffer" FlagEnableDynamicGp = "enable-dynamic-gp" FlagDynamicGpMode = "dynamic-gp-mode" @@ -290,6 +293,7 @@ func (c *OecConfig) loadFromConfig() { c.SetMempoolCheckTxCost(viper.GetBool(FlagMempoolCheckTxCost)) c.SetMaxTxNumPerBlock(viper.GetInt64(FlagMaxTxNumPerBlock)) c.SetEnableDeleteMinGPTx(viper.GetBool(FlagMempoolEnableDeleteMinGPTx)) + c.SetPendingPoolBlacklist(viper.GetString(FlagPendingPoolBlacklist)) c.SetMaxGasUsedPerBlock(viper.GetInt64(FlagMaxGasUsedPerBlock)) c.SetEnablePGU(viper.GetBool(FlagEnablePGU)) c.SetPGUPercentageThreshold(viper.GetInt64(FlagPGUPercentageThreshold)) @@ -376,6 +380,7 @@ func (c *OecConfig) format() string { mempool.flush: %v mempool.max_tx_num_per_block: %d mempool.enable_delete_min_gp_tx: %v + mempool.pending-pool-blacklist: %v mempool.max_gas_used_per_block: %d mempool.check_tx_cost: %v @@ -410,6 +415,7 @@ func (c *OecConfig) format() string { c.GetMempoolFlush(), c.GetMaxTxNumPerBlock(), c.GetEnableDeleteMinGPTx(), + c.GetPendingPoolBlacklist(), c.GetMaxGasUsedPerBlock(), c.GetMempoolCheckTxCost(), c.GetGasLimitBuffer(), @@ -486,6 +492,8 @@ func (c *OecConfig) updateFromKVStr(k, v string) { return } c.SetEnableDeleteMinGPTx(r) + case FlagPendingPoolBlacklist: + c.SetPendingPoolBlacklist(v) case FlagNodeKeyWhitelist: c.SetNodeKeyWhitelist(v) case FlagMempoolCheckTxCost: @@ -1172,3 +1180,11 @@ func (c *OecConfig) SetMaxSubscriptionClients(v int) { func (c *OecConfig) GetMaxSubscriptionClients() int { return c.maxSubscriptionClients } + +func (c *OecConfig) SetPendingPoolBlacklist(v string) { + c.pendingPoolBlacklist = v +} + +func (c *OecConfig) GetPendingPoolBlacklist() string { + return c.pendingPoolBlacklist +} diff --git a/app/innertx_test.go b/app/innertx_test.go index 7f3f1009cd..a717b4e752 100644 --- a/app/innertx_test.go +++ b/app/innertx_test.go @@ -60,7 +60,7 @@ func (suite *InnerTxTestSuite) SetupTest() { suite.app = Setup(checkTx) suite.ctx = suite.app.BaseApp.NewContext(checkTx, abci.Header{Height: 1, ChainID: chain_id, Time: time.Now().UTC()}) - suite.ctx.SetDeliver() + suite.ctx.SetDeliverSerial() suite.stateDB = evm_types.CreateEmptyCommitStateDB(suite.app.EvmKeeper.GenerateCSDBParams(), suite.ctx) suite.codec = codec.New() diff --git a/app/node_mode.go b/app/node_mode.go index d7067079b5..bb230a2b75 100644 --- a/app/node_mode.go +++ b/app/node_mode.go @@ -61,13 +61,14 @@ func setRpcConfig(ctx *server.Context) { viper.SetDefault(backend.FlagApiBackendTxLruCache, 100000) viper.SetDefault(iavl.FlagIavlEnableAsyncCommit, true) viper.SetDefault(flags.FlagMaxOpenConnections, 20000) + viper.SetDefault(flags.FlagMaxBodyBytes, flags.DefaultMaxBodyBytes) viper.SetDefault(mempool.FlagEnablePendingPool, true) viper.SetDefault(server.FlagCORS, "*") ctx.Logger.Info(fmt.Sprintf( - "Set --%s=%v\n--%s=%v\n--%s=%v\n--%s=%v\n--%s=%v\n--%s=%v\n--%s=%v\n--%s=%v by rpc node mode", + "Set --%s=%v\n--%s=%v\n--%s=%v\n--%s=%v\n--%s=%v\n--%s=%v\n--%s=%v\n--%s=%v\n--%s=%v by rpc node mode", abcitypes.FlagDisableABCIQueryMutex, true, evmtypes.FlagEnableBloomFilter, true, watcher.FlagFastQueryLru, 10000, watcher.FlagFastQuery, true, iavl.FlagIavlEnableAsyncCommit, true, - flags.FlagMaxOpenConnections, 20000, mempool.FlagEnablePendingPool, true, + flags.FlagMaxOpenConnections, 20000, flags.FlagMaxBodyBytes, flags.DefaultMaxBodyBytes, mempool.FlagEnablePendingPool, true, server.FlagCORS, "*")) } diff --git a/app/refund/refund.go b/app/refund/refund.go index e52f271697..b0a5213ff5 100644 --- a/app/refund/refund.go +++ b/app/refund/refund.go @@ -1,19 +1,19 @@ package refund import ( - tmtypes "github.com/okex/exchain/libs/tendermint/types" "math/big" "sync" - "github.com/okex/exchain/libs/cosmos-sdk/x/auth/ante" - "github.com/okex/exchain/libs/cosmos-sdk/x/auth/keeper" - sdk "github.com/okex/exchain/libs/cosmos-sdk/types" sdkerrors "github.com/okex/exchain/libs/cosmos-sdk/types/errors" "github.com/okex/exchain/libs/cosmos-sdk/types/innertx" "github.com/okex/exchain/libs/cosmos-sdk/x/auth" + "github.com/okex/exchain/libs/cosmos-sdk/x/auth/ante" "github.com/okex/exchain/libs/cosmos-sdk/x/auth/exported" + "github.com/okex/exchain/libs/cosmos-sdk/x/auth/keeper" + "github.com/okex/exchain/libs/cosmos-sdk/x/auth/refund" "github.com/okex/exchain/libs/cosmos-sdk/x/auth/types" + tmtypes "github.com/okex/exchain/libs/tendermint/types" ) func NewGasRefundHandler(ak auth.AccountKeeper, sk types.SupplyKeeper, ik innertx.InnerTxKeeper) sdk.GasRefundHandler { @@ -89,18 +89,12 @@ func gasRefund(ik innertx.InnerTxKeeper, ak accountKeeperInterface, sk types.Sup gas := feeTx.GetGas() fees := feeTx.GetFee() gasFees := calculateRefundFees(gasUsed, gas, fees) - newCoins := feePayerAcc.GetCoins().Add(gasFees...) // set coins and record innertx - err = feePayerAcc.SetCoins(newCoins) - if !ctx.IsCheckTx() { - fromAddr := sk.GetModuleAddress(types.FeeCollectorName) - ik.UpdateInnerTx(ctx.TxBytes(), ctx.BlockHeight(), innertx.CosmosDepth, fromAddr, feePayerAcc.GetAddress(), innertx.CosmosCallType, innertx.SendCallName, gasFees, err) - } + err = refund.RefundFees(sk, ctx, feePayerAcc.GetAddress(), gasFees) if err != nil { return nil, err } - ak.SetAccount(ctx, feePayerAcc) return gasFees, nil } diff --git a/app/rpc/backend/backend.go b/app/rpc/backend/backend.go index bc3560ee89..477f759126 100644 --- a/app/rpc/backend/backend.go +++ b/app/rpc/backend/backend.go @@ -170,7 +170,7 @@ func (b *EthermintBackend) GetBlockByNumber(blockNum rpctypes.BlockNumber, fullT return nil, nil } - block, err = rpctypes.RpcBlockFromTendermint(b.clientCtx, resBlock.Block, fullTx) + block, err = rpctypes.RpcBlockFromTendermint(b.clientCtx, resBlock.Block, fullTx, b.logsLimit) if err != nil { return nil, err } @@ -207,7 +207,7 @@ func (b *EthermintBackend) GetBlockByHash(hash common.Hash, fullTx bool) (*watch return nil, nil } - block, err = rpctypes.RpcBlockFromTendermint(b.clientCtx, resBlock.Block, fullTx) + block, err = rpctypes.RpcBlockFromTendermint(b.clientCtx, resBlock.Block, fullTx, b.logsLimit) if err != nil { return nil, err } diff --git a/app/rpc/types/utils.go b/app/rpc/types/utils.go index dc7b3c491a..7d857ffdfb 100644 --- a/app/rpc/types/utils.go +++ b/app/rpc/types/utils.go @@ -62,15 +62,18 @@ func ToTransaction(tx *evmtypes.MsgEthereumTx, from *common.Address) *watcher.Tr } // RpcBlockFromTendermint returns a JSON-RPC compatible Ethereum blockfrom a given Tendermint block. -func RpcBlockFromTendermint(clientCtx clientcontext.CLIContext, block *tmtypes.Block, fullTx bool) (*watcher.Block, error) { +func RpcBlockFromTendermint(clientCtx clientcontext.CLIContext, block *tmtypes.Block, fullTx bool, txsLimit int) (*watcher.Block, error) { gasLimit, err := BlockMaxGasFromConsensusParams(context.Background(), clientCtx) if err != nil { return nil, err } - - gasUsed, ethTxs, err := EthTransactionsFromTendermint(clientCtx, block.Txs, common.BytesToHash(block.Hash()), uint64(block.Height)) - if err != nil { - return nil, err + var ethTxs []*watcher.Transaction + gasUsed := big.NewInt(0) + if txsLimit == 0 || len(block.Txs) <= txsLimit { + gasUsed, ethTxs, err = EthTransactionsFromTendermint(clientCtx, block.Txs, common.BytesToHash(block.Hash()), uint64(block.Height)) + if err != nil { + return nil, err + } } var bloom ethtypes.Bloom diff --git a/app/start_from_snapshot.go b/app/start_from_snapshot.go new file mode 100644 index 0000000000..2bf4eea660 --- /dev/null +++ b/app/start_from_snapshot.go @@ -0,0 +1,199 @@ +package app + +import ( + "archive/tar" + "bytes" + "fmt" + "github.com/klauspost/pgzip" + "github.com/okex/exchain/libs/cosmos-sdk/types/errors" + "github.com/okex/exchain/libs/tendermint/libs/log" + "io" + "io/ioutil" + "net/url" + "os" + "os/exec" + "path/filepath" + "runtime" + "strings" + "time" +) + +func prepareSnapshotDataIfNeed(snapshotURL string, home string, logger log.Logger) { + if snapshotURL == "" { + return + } + + snapshotHome := filepath.Join(home, ".download_snapshots") + + // check whether the snapshot file has been downloaded + byteData, err := os.ReadFile(filepath.Join(snapshotHome, ".record")) + if err == nil && strings.Contains(string(byteData), snapshotURL) { + return + } + + if _, err := url.Parse(snapshotURL); err != nil { + panic(errors.Wrap(err, "invalid snapshot URL")) + } + + // download snapshot + snapshotFile, err := downloadSnapshot(snapshotURL, snapshotHome, logger) + if err != nil { + panic(err) + } + + // uncompress snapshot + logger.Info("start to uncompress snapshot") + if err := extractTarGz(snapshotFile, snapshotHome); err != nil { + panic(err) + } + + // delete damaged data + logger.Info("start to delete damaged data") + if err := os.RemoveAll(filepath.Join(home, "data")); err != nil { + panic(err) + } + + // move snapshot data + logger.Info("start to move snapshot data") + if err := moveDir(filepath.Join(snapshotHome, "data"), filepath.Join(home, "data")); err != nil { + panic(err) + } + + os.Remove(snapshotFile) + + os.WriteFile(filepath.Join(snapshotHome, ".record"), []byte(snapshotURL+"\n"), 0644) + + logger.Info("snapshot data is ready, start node soon!") +} + +func downloadSnapshot(url, outputPath string, logger log.Logger) (string, error) { + // create dir + _, err := os.Stat(outputPath) + if err != nil { + os.MkdirAll(outputPath, 0755) + } + + fileName := url[strings.LastIndex(url, "/")+1:] + targetFile := filepath.Join(outputPath, fileName) + + // check file exists + if _, err := os.Stat(targetFile); err == nil { + os.Remove(targetFile) + } + + var stdoutProcessStatus bytes.Buffer + + axel := exec.Command("axel", "-n", fmt.Sprintf("%d", runtime.NumCPU()), "-o", targetFile, url) + axel.Stdout = io.MultiWriter(ioutil.Discard, &stdoutProcessStatus) + done := make(chan struct{}) + defer close(done) + + // print download detail + go func() { + tick := time.NewTicker(time.Millisecond * 50) + defer tick.Stop() + for { + select { + case <-done: + return + case <-tick.C: + bts := make([]byte, stdoutProcessStatus.Len()) + stdoutProcessStatus.Read(bts) + logger.Info(string(bts)) + } + } + }() + + // run and wait + err = axel.Run() + if err != nil { + return "", err + } + + return targetFile, nil +} + +func extractTarGz(tarGzFile, destinationDir string) error { + // open .tar.gz + file, err := os.Open(tarGzFile) + if err != nil { + return err + } + defer file.Close() + + // use gzip.Reader + gzReader, err := pgzip.NewReaderN(file, 1<<22, runtime.NumCPU()) + if err != nil { + return err + } + defer gzReader.Close() + + // create tar.Reader + tarReader := tar.NewReader(gzReader) + + // uncompress file back to back + for { + header, err := tarReader.Next() + if err == io.EOF { + break + } + if err != nil { + return err + } + if header == nil { + continue + } + target := filepath.Join(destinationDir, header.Name) + + switch header.Typeflag { + case tar.TypeDir: + err = os.MkdirAll(target, 0755) + if err != nil { + return err + } + case tar.TypeReg: + parent := filepath.Dir(target) + err = os.MkdirAll(parent, 0755) + if err != nil { + return err + } + + file, err := os.Create(target) + if err != nil { + return err + } + defer file.Close() + + _, err = io.Copy(file, tarReader) + if err != nil { + return err + } + } + } + + return nil +} + +func moveDir(sourceDir, destinationDir string) error { + sourceInfo, err := os.Stat(sourceDir) + if err != nil { + return err + } + + if !sourceInfo.IsDir() { + return fmt.Errorf("%s isn't dir", sourceDir) + } + + _, err = os.Stat(destinationDir) + if err == nil { + return fmt.Errorf("dest dir %s exists", destinationDir) + } + + // move + err = os.Rename(sourceDir, destinationDir) + if err != nil { + return err + } + + return nil +} diff --git a/cmd/client/flags.go b/cmd/client/flags.go index 6f96b5bdeb..30d859922e 100644 --- a/cmd/client/flags.go +++ b/cmd/client/flags.go @@ -113,7 +113,7 @@ func RegisterAppFlag(cmd *cobra.Command) { cmd.Flags().String(tmdb.FlagRocksdbOpts, "", "Options of rocksdb. (block_size=4KB,block_cache=1GB,statistics=true,allow_mmap_reads=true,max_open_files=-1,unordered_write=true,pipelined_write=true)") cmd.Flags().String(types.FlagNodeMode, "", "Node mode (rpc|val|archive) is used to manage flags") - cmd.Flags().Bool(consensus.EnablePrerunTx, true, "enable proactively runtx mode, default close") + cmd.Flags().Bool(consensus.EnablePrerunTx, true, "enable proactively runtx mode, default open") cmd.Flags().String(automation.ConsensusRole, "", "consensus role") cmd.Flags().String(automation.ConsensusTestcase, "", "consensus test case file") diff --git a/cmd/exchaind/iaviewer.go b/cmd/exchaind/iaviewer.go index e2a28def49..cd31c8353a 100644 --- a/cmd/exchaind/iaviewer.go +++ b/cmd/exchaind/iaviewer.go @@ -215,6 +215,10 @@ func iaviewerReadCmd(ctx *iaviewerContext) *cobra.Command { cmd.PersistentFlags().String(flagKey, "", "print only the value for this key, key must be in hex format.\n"+ "if specified, keyprefix, start and limit flags would be ignored") cmd.PersistentFlags().String(flagKeyPrefix, "", "print values for keys with specified prefix, prefix must be in hex format.") + viper.BindPFlag(flagKeyPrefix, cmd.PersistentFlags().Lookup(flagKeyPrefix)) + viper.BindPFlag(flagHex, cmd.PersistentFlags().Lookup(flagHex)) + viper.BindPFlag(flagKey, cmd.PersistentFlags().Lookup(flagKey)) + return cmd } @@ -232,6 +236,7 @@ func iaviewerReadNodeCmd(ctx *iaviewerContext) *cobra.Command { }, } cmd.PersistentFlags().String(flagNodeHash, "", "print only the value for this hash, key must be in hex format.") + viper.BindPFlag(flagNodeHash, cmd.PersistentFlags().Lookup(flagNodeHash)) return cmd } @@ -318,6 +323,8 @@ func iaviewerDiffCmd(ctx *iaviewerContext) *cobra.Command { } cmd.PersistentFlags().Bool(flagHex, false, "print key and value in hex format") cmd.PersistentFlags().String(flagKeyPrefix, "", "diff values for keys with specified prefix, prefix must be in hex format.") + viper.BindPFlag(flagHex, cmd.PersistentFlags().Lookup(flagHex)) + viper.BindPFlag(flagKeyPrefix, cmd.PersistentFlags().Lookup(flagKeyPrefix)) return cmd } diff --git a/dev/auto-install.sh b/dev/auto-install.sh index 95d51be872..45a8d2a35e 100755 --- a/dev/auto-install.sh +++ b/dev/auto-install.sh @@ -56,7 +56,7 @@ GetArchitecture() { echo "echo Arch Linux detected." os="linux" deptool="ldd" - goAchive="go1.17.linux-amd64.tar.gz" + goAchive="go1.20.2.linux-amd64.tar.gz" libArray=("/usr/local/lib/librocksdb.so.6.27.3" "/usr/local/lib/librocksdb.so.6.27" "/usr/local/lib/librocksdb.so.6" "/usr/local/lib/librocksdb.so" "/usr/lib/librocksdb.so.6.27.3" "/usr/lib/librocksdb.so.6.27" "/usr/lib/librocksdb.so.6" "/usr/lib/librocksdb.so") rocksdbdep=("/usr/local/lib/pkconfig/rocksdb.pc" "/usr/local/include/rocksdb" "/usr/local/lib/librocksdb.so*" "/usr//lib/pkconfig/rocksdb.pc" "/usr/include/rocksdb" "/usr/lib/librocksdb.so*") case "$(getOSName)" in @@ -108,9 +108,9 @@ GetArchitecture() { echo "$_cputype" if [ "$_cputype" == "arm64" ] then - goAchive="go1.17.darwin-arm64.tar.gz" + goAchive="go1.20.2.darwin-arm64.tar.gz" else - goAchive="go1.17.darwin-amd64.tar.gz" + goAchive="go1.20.2.darwin-amd64.tar.gz" fi brew install wget else @@ -222,12 +222,12 @@ Prepare() { v=$(/usr/local/go/bin/go version | { read _ _ v _; echo ${v#go}; }) # shellcheck disable=SC2046 - if [ $(checkgoversion "$v") -ge $(checkgoversion "1.17") ] + if [ $(checkgoversion "$v") -ge $(checkgoversion "1.20") ] then echo "$v" echo "should not install go" else - echo "should install go version above 1.17" + echo "should install go version above 1.20" installgo fi diff --git a/dev/client/go.mod b/dev/client/go.mod index e3ac595cd3..787384579b 100644 --- a/dev/client/go.mod +++ b/dev/client/go.mod @@ -1,6 +1,6 @@ module github.com/okex/exchain/dev/client -go 1.17 +go 1.20 require ( github.com/cosmos/cosmos-sdk v0.39.2 diff --git a/dev/vmbridge.sh b/dev/vmbridge.sh index 8b3abd2a97..2bd3c753d9 100755 --- a/dev/vmbridge.sh +++ b/dev/vmbridge.sh @@ -1,4 +1,4 @@ -res=$(exchaincli tx wasm store ./wasm/vmbridge-erc20/artifacts/cw_erc20.wasm --fees 0.01okt --from captain --gas=20000000 -b block -y) +res=$(exchaincli tx wasm store ./wasm/erc20/artifacts/cw_erc20.wasm --fees 0.01okt --from captain --gas=20000000 -b block -y) echo "store--------------" echo $res code_id=$(echo "$res" | jq '.logs[0].events[1].attributes[0].value' | sed 's/\"//g') diff --git a/dev/vmbridge/counter/go.mod b/dev/vmbridge/counter/go.mod index f5f380a5dc..b4c6e424e5 100644 --- a/dev/vmbridge/counter/go.mod +++ b/dev/vmbridge/counter/go.mod @@ -1,6 +1,6 @@ module vmbridge -go 1.17 +go 1.20 require ( github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6 // indirect diff --git a/dev/wasm/erc20/src/contract.rs b/dev/wasm/erc20/src/contract.rs index 772ccdac8e..34cca06b54 100644 --- a/dev/wasm/erc20/src/contract.rs +++ b/dev/wasm/erc20/src/contract.rs @@ -86,12 +86,6 @@ pub fn execute( recipient, amount, } => try_send_to_erc20(deps, env,evmContract,recipient,amount,info), - - ExecuteMsg::CallToEvmMsg { - evmaddr, - calldata, - value, - } => try_call_to_evm(deps, env,evmaddr,calldata,value,info), } } @@ -160,29 +154,7 @@ fn try_mint_cw20( .add_attribute("amount", amount.to_string())) } -fn try_call_to_evm( - deps: DepsMut, - _env: Env, - evmaddr: String, - calldata: String, - value: Uint128, - info: MessageInfo, -) -> Result, ContractError> { - let submsg = SendToEvmMsg { - sender: _env.contract.address.to_string(), - evmaddr: evmaddr.to_string(), - calldata: calldata, - value: value, - }; - - Ok(Response::new() - .add_attribute("action", "call to evm") - .add_attribute("evmaddr", evmaddr.to_string()) - .add_attribute("value", value.to_string()) - .add_message(submsg) - .set_data(b"the result data")) -} fn try_send_to_erc20( deps: DepsMut, diff --git a/dev/wasm/erc20/src/msg.rs b/dev/wasm/erc20/src/msg.rs index abcbdd2085..1d85691378 100644 --- a/dev/wasm/erc20/src/msg.rs +++ b/dev/wasm/erc20/src/msg.rs @@ -48,11 +48,6 @@ pub enum ExecuteMsg { recipient: String, amount: Uint128, }, - CallToEvm { - evmContract: String, - calldata: String, - value: Uint128, - } } #[derive(Serialize, Deserialize, Clone, PartialEq, JsonSchema, Debug)] @@ -71,21 +66,6 @@ impl Into> for SendToEvmMsg { } impl CustomMsg for SendToEvmMsg {} -#[derive(Serialize, Deserialize, Clone, PartialEq, JsonSchema, Debug)] -#[serde(rename_all = "snake_case")] -pub struct CallToEvmMsg { - pub sender: String, - pub evmaddr: String, - pub calldata: String, - pub value: Uint128, - -} -impl Into> for CallToEvmMsg { - fn into(self) -> CosmosMsg { - CosmosMsg::Custom(self) - } -} -impl CustomMsg for CallToEvmMsg {} #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] #[serde(rename_all = "snake_case")] diff --git a/dev/wasm/vmbridge-erc20/src/contract.rs b/dev/wasm/vmbridge-erc20/src/contract.rs index 475cf5af98..500c4bf507 100644 --- a/dev/wasm/vmbridge-erc20/src/contract.rs +++ b/dev/wasm/vmbridge-erc20/src/contract.rs @@ -157,11 +157,11 @@ fn try_mint_cw20( recipient: String, amount: Uint128, ) -> Result, ContractError> { - if info.sender.to_string() != EVM_CONTRACT_ADDR.to_string() { - return Err(ContractError::ContractERC20Err { - addr:info.sender.to_string() - }); - } + // if info.sender.to_string() != EVM_CONTRACT_ADDR.to_string() { + // return Err(ContractError::ContractERC20Err { + // addr:info.sender.to_string() + // }); + // } let amount_raw = amount.u128(); let recipient_address = deps.api.addr_validate(recipient.as_str())?; let mut account_balance = read_balance(deps.storage, &recipient_address)?; diff --git a/go.mod b/go.mod index 032180404a..6e47eddf8a 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/okex/exchain -go 1.17 +go 1.20 require ( github.com/99designs/keyring v1.1.6 @@ -48,6 +48,7 @@ require ( github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d github.com/jmhodges/levigo v1.0.0 github.com/json-iterator/go v1.1.12 + github.com/klauspost/pgzip v1.0.2-0.20170402124221-0bf5dcad4ada github.com/libp2p/go-buffer-pool v0.1.0 github.com/magiconair/properties v1.8.6 github.com/mattn/go-isatty v0.0.14 @@ -136,6 +137,8 @@ require ( github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/jonboulle/clockwork v0.2.0 // indirect github.com/keybase/go-keychain v0.0.0-20190712205309-48d3d31d256d // indirect + github.com/klauspost/compress v1.13.6 // indirect + github.com/klauspost/crc32 v0.0.0-20161016154125-cb6bfca970f6 // indirect github.com/lestrrat/go-file-rotatelogs v0.0.0-20180223000712-d3151e2a480f // indirect github.com/lestrrat/go-strftime v0.0.0-20180220042222-ba3bf9c1d042 // indirect github.com/mattn/go-runewidth v0.0.9 // indirect diff --git a/go.sum b/go.sum index a7f7793cdc..ee866ca067 100644 --- a/go.sum +++ b/go.sum @@ -19,18 +19,6 @@ cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHOb cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= -cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= -cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= -cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= -cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= -cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= -cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= -cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= -cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= -cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= @@ -38,15 +26,9 @@ cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUM cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= cloud.google.com/go/bigtable v1.2.0/go.mod h1:JcVAOl45lrTmQfLj7T6TxyMzIN/3FGGcFm+2xVAli2o= -cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= -cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= -cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= -cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s= -cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= -cloud.google.com/go/firestore v1.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= @@ -83,16 +65,11 @@ github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d/go.mod h1: github.com/CosmWasm/wasmvm v1.0.0 h1:NRmnHe3xXsKn2uEcB1F5Ha323JVAhON+BI6L177dlKc= github.com/CosmWasm/wasmvm v1.0.0/go.mod h1:ei0xpvomwSdONsxDuONzV7bL1jSET1M8brEx0FCXc+A= github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= -github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/DataDog/zstd v1.3.6-0.20190409195224-796139022798/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= github.com/DataDog/zstd v1.4.1 h1:3oxKN3wbHibqx897utPC2LTQU4J+IHWWJO+glkAkpFM= github.com/DataDog/zstd v1.4.1/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= -github.com/HdrHistogram/hdrhistogram-go v1.1.0/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= -github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= -github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= github.com/Shopify/sarama v1.23.1/go.mod h1:XLH1GYJnLVE0XCr6KdJGVJRTwY30moWNJ4sERjXX6fs= github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= @@ -103,11 +80,9 @@ github.com/VictoriaMetrics/fastcache v1.6.0/go.mod h1:0qHz5QP0GMX4pfmMA/zt5RgfNu github.com/VictoriaMetrics/fastcache v1.8.0 h1:ybZqS7kRy8YVzYsI09GLzQhs7iqS6cOEH2avtknD1SU= github.com/VictoriaMetrics/fastcache v1.8.0/go.mod h1:n7Sl+ioh/HlWeYHLSIBIE8TcZFHg/+xgvomWSS5xuEE= github.com/VividCortex/gohistogram v1.0.0 h1:6+hBz+qvs0JOrrNhhmR7lFxo5sINxBCGXrdtl/UvroE= -github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= github.com/Workiva/go-datastructures v1.0.53 h1:J6Y/52yX10Xc5JjXmGtWoSSxs3mZnGSaq37xZZh7Yig= github.com/Workiva/go-datastructures v1.0.53/go.mod h1:1yZL+zfsztete+ePzZz/Zb1/t5BnDuE2Ya2MMGhzP6A= github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= -github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= @@ -137,23 +112,16 @@ github.com/aristanetworks/splunk-hec-go v0.3.3/go.mod h1:1VHO9r17b0K7WmOlLb9nTk/ github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-metrics v0.3.9/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= -github.com/armon/go-metrics v0.3.10/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/aws/aws-sdk-go v1.40.45/go.mod h1:585smgzpB/KqRA+K3y/NL/oYRqQvpNJYvLm+LY1U59Q= github.com/aws/aws-sdk-go-v2 v1.2.0/go.mod h1:zEQs02YRBw1DjK0PoJv3ygDYOFTre1ejlJWl8FwAuQo= -github.com/aws/aws-sdk-go-v2 v1.9.1/go.mod h1:cK/D0BBs0b/oWPIcX/Z/obahJK1TT7IPVjy53i/mX/4= github.com/aws/aws-sdk-go-v2/config v1.1.1/go.mod h1:0XsVy9lBI/BCXm+2Tuvt39YmdHwS5unDQmxZOYe8F5Y= github.com/aws/aws-sdk-go-v2/credentials v1.1.1/go.mod h1:mM2iIjwl7LULWtS6JCACyInboHirisUUdkBPoTHMOUo= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.0.2/go.mod h1:3hGg3PpiEjHnrkrlasTfxFqUsZ2GCk/fMUn4CbKgSkM= -github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.8.1/go.mod h1:CM+19rL1+4dFWnOQKwDc7H1KwXTz+h61oUSHyhV0b3o= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.0.2/go.mod h1:45MfaXZ0cNbeuT0KQ1XJylq8A6+OpVV2E5kvY/Kq+u8= github.com/aws/aws-sdk-go-v2/service/route53 v1.1.1/go.mod h1:rLiOUrPLW/Er5kRcQ7NkwbjlijluLsrIbu/iyl35RO4= github.com/aws/aws-sdk-go-v2/service/sso v1.1.1/go.mod h1:SuZJxklHxLAXgLTc1iFXbEWkXs7QRTQpCLGaKIprQW0= github.com/aws/aws-sdk-go-v2/service/sts v1.1.1/go.mod h1:Wi0EBZwiz/K44YliU0EKxqTCJGUfYTWXrrBwkq736bM= github.com/aws/smithy-go v1.1.0/go.mod h1:EzMw8dbp/YJL4A5/sbhGddag+NPT7q084agLbB9LgIw= -github.com/aws/smithy-go v1.8.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f h1:ZNv7On9kyUzm7fvRZumSyy/IUiSC7AzL0I1jKKtwooA= github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f/go.mod h1:AuiFmCCPBSrqvVMvuqFuk0qogytodnVFVSN5CeJB8Gc= github.com/bartekn/go-bip39 v0.0.0-20171116152956-a05967ea095d h1:1aAija9gr0Hyv4KfQcRcwlmFIrhkDmIj2dz5bkg/s/8= @@ -193,8 +161,6 @@ github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46f github.com/buger/jsonparser v1.0.0 h1:etJTGF5ESxjI0Ic2UaLQs2LQQpa8G9ykQScukbh4L8A= github.com/buger/jsonparser v1.0.0/go.mod h1:tgcrVJ81GPSF0mz+0nu1Xaz0fazGPrmmJfJtxjbHhUQ= github.com/c-bata/go-prompt v0.2.2/go.mod h1:VzqtzE2ksDBcdln8G7mk2RX9QyGjH+OVqOCSiVIqS34= -github.com/casbin/casbin/v2 v2.37.0/go.mod h1:vByNa/Fchek0KZUgG5wEsl7iFsiviAYKRtgrQfcJqHg= -github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/cp v0.1.0 h1:SE+dxFebS7Iik5LK0tsi1k9ZCxEaFX4AjQmoyA+1dJk= github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= @@ -206,17 +172,12 @@ github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XL github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= -github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= -github.com/clbanning/mxj v1.8.4/go.mod h1:BVjHeAH+rl9rs6f+QIpeRl0tfu10SXn1pUSa5PVGJng= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cloudflare/cloudflare-go v0.14.0/go.mod h1:EnwdgGMaFOruiPZRFSgn+TsQ3hQ7C/YWzIGLeu5c304= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= @@ -229,7 +190,6 @@ github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8Nz github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cosmos/cosmos-proto v1.0.0-alpha7 h1:yqYUOHF2jopwZh4dVQp3xgqwftE5/2hkrwIV6vkUbO0= github.com/cosmos/cosmos-proto v1.0.0-alpha7/go.mod h1:dosO4pSAbJF8zWCzCoTWP7nNsjcvSUBQmniFxDg5daw= @@ -244,7 +204,6 @@ github.com/cosmos/ledger-go v0.9.2/go.mod h1:oZJ2hHAZROdlHiwTg4t7kP+GKIIkBT+o6c9 github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4= github.com/danieljoos/wincred v1.0.2 h1:zf4bhty2iLuwgjgpraD2E9UbvO+fe54XXGJbOwe23fU= github.com/danieljoos/wincred v1.0.2/go.mod h1:SnuYRW9lp1oJrZX/dXJqr0cPK5gYXqx3EJbmjhLdK9U= @@ -290,29 +249,19 @@ github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.m github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/fastly/go-utils v0.0.0-20180712184237-d95a45783239 h1:Ghm4eQYC0nEPnSJdVkTrXpu9KtoVCSo1hg7mtI7G9KU= github.com/fastly/go-utils v0.0.0-20180712184237-d95a45783239/go.mod h1:Gdwt2ce0yfBxPvZrHkprdPPTTS3N5rwmLE8T22KBXlw= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= -github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= -github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5 h1:FtmdgXiUlNeRsoNMFlKLDt+S+6hbjVMEW6RGQ7aUf7c= github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= -github.com/franela/goblin v0.0.0-20210519012713-85d372ac71e2/go.mod h1:VzmDKDJVZI3aJmnRI9VjAn9nJ8qPPsN1fqzr9dqInIo= -github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= -github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/garyburd/redigo v1.6.0/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= @@ -358,17 +307,14 @@ github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LB github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= -github.com/go-zookeeper/zk v1.0.2/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw= github.com/goccy/go-json v0.9.7 h1:IcB+Aqpx/iMHu5Yooh7jEzJk1JZ7Pjtmys2ukPr7EeM= github.com/goccy/go-json v0.9.7/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 h1:ZpnhV/YsD2/4cESfV5+Hoeu/iUR3ruzNvZ+yQfO03a0= github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofrs/uuid v3.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/gateway v1.1.0 h1:u0SuhL9+Il+UbjM9VIE3ntfRujKbvVpFvNB4HbjeVQ0= github.com/gogo/gateway v1.1.0/go.mod h1:S7rR8FRQyG3QFESeSv4l2WnsyzlCLG0CzBbUUo/mbic= github.com/goji/httpauth v0.0.0-20160601135302-2da839ab0f4d/go.mod h1:nnjvkQ9ptGaCkuDUx6wNykzzlUixGxvkme+H/lnzb+A= -github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/geo v0.0.0-20190916061304-5b978397cfec/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= @@ -376,7 +322,6 @@ github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4er github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= @@ -384,7 +329,6 @@ github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -403,7 +347,6 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= @@ -424,13 +367,10 @@ github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= -github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.1.1-0.20200604201612-c04b05f3adfa h1:Q75Upo5UN4JbPFURXZ8nLKYUvF85dyFRop/vQ0Rv+64= @@ -440,7 +380,6 @@ github.com/google/gops v0.3.23/go.mod h1:7diIdLsqpCihPSX3fQagksT/Ku/y4RL9LHTlKyE github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/orderedcode v0.0.1 h1:UzfcAexk9Vhv8+9pNOgRu41f16lHq725vPwnSeiG/Us= github.com/google/orderedcode v0.0.1/go.mod h1:iVyU4/qPKHY5h/wSd6rZZCDcLJNxiWO6dvsYES2Sb20= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= @@ -453,12 +392,6 @@ github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.5/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -466,17 +399,10 @@ github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= -github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= -github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= -github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= -github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/handlers v1.4.2 h1:0QniY0USkHQ1RGCLfKxeNHK9bkDHGRYGNDFBCS+YARg= github.com/gorilla/handlers v1.4.2/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= -github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= @@ -499,25 +425,13 @@ github.com/gtank/merlin v0.1.1/go.mod h1:T86dnYJhcGOh5BjZFCJWTDeTK7XW8uE+E21Cy/b github.com/gtank/ristretto255 v0.1.2 h1:JEqUCPA1NvLq5DwYtuzigd7ss8fwbYay9fi4/5uMzcc= github.com/gtank/ristretto255 v0.1.2/go.mod h1:Ph5OpO6c7xKUGROZfWVLiJf9icMDwUeIvY4OmlYW69o= github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= -github.com/hashicorp/consul/api v1.10.1/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M= -github.com/hashicorp/consul/api v1.12.0/go.mod h1:6pVBMo0ebnYdt2S3H87XhekM/HHrUoTD2XXb/VrZVy0= github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= -github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= -github.com/hashicorp/go-hclog v0.16.2/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= -github.com/hashicorp/go-hclog v1.2.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= -github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= @@ -525,28 +439,19 @@ github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/b github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d h1:dg1dEPuWpEqDnvIw251EVy4zlP8gWbsGj4BsUKCRpYs= github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/mdns v1.0.1/go.mod h1:4gW7WsVCke5TE7EPeYliwHlRUyBtfCwuFwuMg2DmyNY= -github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/memberlist v0.2.2/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= -github.com/hashicorp/memberlist v0.3.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/hashicorp/serf v0.9.5/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk= -github.com/hashicorp/serf v0.9.6/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= -github.com/hashicorp/serf v0.9.7/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= github.com/holiman/uint256 v1.2.0 h1:gpSYcPLWGv4sG43I2mVLiDZCNDh/EpGjSk8tmtxitHM= github.com/holiman/uint256 v1.2.0/go.mod h1:y4ga/t+u+Xwd7CpDgZESaRcWy0I7XMlTMA25ApIH5Jw= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/hudl/fargo v1.4.0/go.mod h1:9Ai6uvFy5fQNq6VPKtg+Ceq1+eTY4nKUlR2JElEOcDo= github.com/huin/goupnp v1.0.2 h1:RfGLP+h3mvisuWEyybxNq5Eft3NWhHLPeUN72kpKZoI= github.com/huin/goupnp v1.0.2/go.mod h1:0dxJBVBHqTMjIUMkESDTNgOOx/Mw5wYIfyFmdzSamkM= github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o= @@ -558,7 +463,6 @@ github.com/influxdata/flux v0.65.1/go.mod h1:J754/zds0vvpfwuq7Gc2wRdVwEodfpCFM7m github.com/influxdata/influxdb v1.8.3/go.mod h1:JugdFhsvvI8gadxOI6noqNeeBHvWNTbfYGtiAn+2jhI= github.com/influxdata/influxdb-client-go/v2 v2.4.0/go.mod h1:vLNHdxTJkIf2mSLvGrpj8TCcISApPoXkaxP8g9uRlW8= github.com/influxdata/influxdb1-client v0.0.0-20190809212627-fc22c7df067e/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= -github.com/influxdata/influxdb1-client v0.0.0-20200827194710-b269163b24ab/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/influxdata/influxql v1.1.1-0.20200828144457-65d3ef77d385/go.mod h1:gHp9y86a/pxhjJ+zMjNXiQAA197Xk9wLxaz+fGG+kWk= github.com/influxdata/line-protocol v0.0.0-20180522152040-32c6aa80de5e/go.mod h1:4kt73NQhadE3daL3WhR5EJ/J2ocX0PZzwxQ0gXJ7oFE= github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= @@ -594,7 +498,6 @@ github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlT github.com/json-iterator/go v1.1.5/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= @@ -615,11 +518,13 @@ github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+o github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= github.com/kkdai/bstream v1.0.0/go.mod h1:FDnDOHt5Yx4p3FaHcioFT0QjDOtgUpvjeZqAs+NVZZA= github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.13.4/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= +github.com/klauspost/compress v1.13.6 h1:P76CopJELS0TiO2mebmnzgWaajssP/EszplttgQxcgc= github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= +github.com/klauspost/crc32 v0.0.0-20161016154125-cb6bfca970f6 h1:KAZ1BW2TCmT6PRihDPpocIy1QTtsAsrx6TneU/4+CMg= github.com/klauspost/crc32 v0.0.0-20161016154125-cb6bfca970f6/go.mod h1:+ZoRqAPRLkC4NPOvfYeR5KNOrY6TD+/sAC3HXPZgDYg= +github.com/klauspost/pgzip v1.0.2-0.20170402124221-0bf5dcad4ada h1:3L+neHp83cTjegPdCiOxVOJtRIy7/8RldvMTsyPYH10= github.com/klauspost/pgzip v1.0.2-0.20170402124221-0bf5dcad4ada/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/klauspost/reedsolomon v1.9.2/go.mod h1:CwCi+NUr9pqSVktrkN+Ondf06rkhYZ/pcNv7fu+8Un4= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -627,13 +532,10 @@ github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxv github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= -github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/labstack/echo/v4 v4.2.1/go.mod h1:AA49e0DZ8kk5jTOOCKNuPR6oTnBS0dYiM4FW1e6jwpg= github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= @@ -656,21 +558,15 @@ github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN github.com/matryer/moq v0.0.0-20190312154309-6cfb0558e1bd/go.mod h1:9ELz6aaclSIGnZBoaSLZ3NAl1VTufbOrXBPvtcy6WiQ= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= -github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-ieproxy v0.0.0-20190610004146-91bb50d98149/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= github.com/mattn/go-ieproxy v0.0.0-20190702010315-6dee0af9227d/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= -github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= -github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= @@ -682,18 +578,13 @@ github.com/mattn/go-tty v0.0.0-20180907095812-13ff1204f104/go.mod h1:XPvLUNfbS4f github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= -github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= -github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4= github.com/miguelmota/go-ethereum-hdwallet v0.0.0-20210614093730-56a4d342a6ff h1:q1gmbeShV7xEPEDVrjPWFy6OPU5e/b5dIiqzByQtEuw= github.com/miguelmota/go-ethereum-hdwallet v0.0.0-20210614093730-56a4d342a6ff/go.mod h1:KkXi0l/5Yd3k+GL2tKqcHS8LgtLID1rVb37D2pkoTuc= github.com/mimoo/StrobeGo v0.0.0-20181016162300-f8f6d4d2b643 h1:hLDRPB66XQT/8+wG9WsDpiCvZf1yKO7sz7scAjSlBa0= github.com/mimoo/StrobeGo v0.0.0-20181016162300-f8f6d4d2b643/go.mod h1:43+3pMjjKimDBf5Kr4ZFNGbLql1zKkbImw+fZbw3geM= -github.com/minio/highwayhash v1.0.1/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= github.com/minio/highwayhash v1.0.2 h1:Aak5U0nElisjDCfPSG79Tgzkn2gl66NxOMspRrKnA/g= github.com/minio/highwayhash v1.0.2/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= @@ -702,8 +593,6 @@ github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS4 github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.4.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -724,13 +613,6 @@ github.com/nacos-group/nacos-sdk-go v1.0.0 h1:CufUF7DZca2ZzIrJtMMCDih1sA58BWCglA github.com/nacos-group/nacos-sdk-go v1.0.0/go.mod h1:hlAPn3UdzlxIlSILAyOXKxjFSvDJ9oLzTJ9hLAK1KzA= github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0= github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E= -github.com/nats-io/jwt v1.2.2/go.mod h1:/xX356yQA6LuXI9xWW7mZNpxgF2mBmGecH+Fj34sP5Q= -github.com/nats-io/jwt/v2 v2.0.3/go.mod h1:VRP+deawSXyhNjXmxPCHskrR6Mq50BqpEI5SEcNiGlY= -github.com/nats-io/nats-server/v2 v2.5.0/go.mod h1:Kj86UtrXAL6LwYRA6H4RqzkHhK0Vcv2ZnKD5WbQ1t3g= -github.com/nats-io/nats.go v1.12.1/go.mod h1:BPko4oXsySz4aSWeFgOHLZs3G4Jq4ZAyE6/zMCxRT6w= -github.com/nats-io/nkeys v0.2.0/go.mod h1:XdZpAbhgyyODYqjTawOnIOI7VlbKSarI9Gfy1tqEu/s= -github.com/nats-io/nkeys v0.3.0/go.mod h1:gvUNGjVcM2IPr5rCsRsC6Wb3Hr2CQAm08dsxtV6A5y4= -github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= @@ -750,46 +632,35 @@ github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+W github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/ginkgo v1.16.2/go.mod h1:CObGmKUOKaSC0RjmoAK7tKyn4Azo5P2IWuoMnvwxz1E= github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= -github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.13.0/go.mod h1:lRk9szgn8TxENtWd0Tp4c3wjlRfMTMH27I+3Je41yGY= github.com/onsi/gomega v1.16.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= -github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw= github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= -github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= github.com/openconfig/gnmi v0.0.0-20190823184014-89b2bf29312c/go.mod h1:t+O9It+LKzfOAhKTT5O0ehDix+MTqbtT0T9t+7zzOvc= github.com/openconfig/reference v0.0.0-20190727015836-8dfd928c9696/go.mod h1:ym2A+zigScwkSEb/cVQB0/ZMpU3rqiH6X7WRRsxgOGw= github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/opentracing/opentracing-go v1.0.3-0.20180606204148-bd9c31933947/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= -github.com/openzipkin/zipkin-go v0.2.5/go.mod h1:KpXfKdgRDnnhsxw4pNIH9Md5lyFqKUa4YDFlwRYAMyE= github.com/orcaman/concurrent-map v1.0.0 h1:I/2A2XPCb4IuQWcQhBhSwGfiuybl/J0ev9HDbW65HOY= github.com/orcaman/concurrent-map v1.0.0/go.mod h1:Lu3tH6HLW3feq74c2GC+jIMS/K2CFcDWnWD9XkenwhI= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/paulbellamy/ratecounter v0.2.0/go.mod h1:Hfx1hDpSGoqxkVVpBi/IlYD7kChlfo5C6hzIHwPqfFE= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pelletier/go-toml/v2 v2.0.1/go.mod h1:r9LEWfGN8R5k0VXJ+0BkIe7MYkRdwZOjgMj2KwnJFUo= github.com/pelletier/go-toml/v2 v2.0.2 h1:+jQXlF3scKIcSEKkdHzXhCTDLPFi5r1wnK6yPS+49Gw= github.com/pelletier/go-toml/v2 v2.0.2/go.mod h1:MovirKjgVRESsAvNZlAjtFwV867yGuwRkXbG66OzopI= -github.com/performancecopilot/speed/v4 v4.0.0/go.mod h1:qxrSyuDGrTOWfV+uKRFhfxw6h/4HXRGUiZiufxo49BM= github.com/peterh/liner v1.0.1-0.20180619022028-8c1271fcf47f/go.mod h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc= github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0= github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= github.com/philhofer/fwd v1.1.1/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= github.com/pierrec/lz4 v0.0.0-20190327172049-315a67e90e41/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= -github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= github.com/pierrec/lz4 v2.0.5+incompatible h1:2xWsjqPFWcplujydGg4WmhC/6fZqK42wMM8aXeqhl0I= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= @@ -803,17 +674,14 @@ github.com/pkg/term v0.0.0-20180730021639-bffc007b7fd5/go.mod h1:eCbImbZ95eXtAUI github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= github.com/pquerna/ffjson v0.0.0-20190930134022-aa0246cd15f7 h1:xoIK0ctDddBMnc74udxJYBqlo9Ylnsp1waqjLsnef20= github.com/pquerna/ffjson v0.0.0-20190930134022-aa0246cd15f7/go.mod h1:YARuvh7BUWHNhzDq2OM5tzR2RiCcN2D7sapiKyCel/M= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= -github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= github.com/prometheus/client_golang v1.12.2 h1:51L9cDoUHVrXx4zWYlcLQIZ+d+VXHgqnYKkIuq4g/34= github.com/prometheus/client_golang v1.12.2/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= @@ -825,17 +693,14 @@ github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7q github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= -github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.30.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4= github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= -github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= @@ -857,7 +722,6 @@ github.com/rjeczalik/notify v0.9.1/go.mod h1:rKwnCoCGeuQnwBtTSPL9Dad03Vh2n40ePRr github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.8.1 h1:geMPLpDpQOgVyCg5z5GoRwLHepNdb71NXb67XFkP+Eg= github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= @@ -867,7 +731,6 @@ github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/sagikazarmark/crypt v0.6.0/go.mod h1:U8+INwJo3nBv1m6A/8OBXAq7Jnpspk5AxSgDyEQcea8= github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= @@ -884,14 +747,12 @@ github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeV github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/snikch/goodman v0.0.0-20171125024755-10e37e294daa h1:YJfZp12Z3AFhSBeXOlv4BO55RMwPn2NoQeDsrdWnBtY= github.com/snikch/goodman v0.0.0-20171125024755-10e37e294daa/go.mod h1:oJyF+mSPHbB5mVY2iO9KV3pTt/QbIkGaO8gQ2WrDbP4= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= @@ -920,9 +781,6 @@ github.com/status-im/keycard-go v0.0.0-20190424133014-d95853db0f48 h1:ju5UTwk5Od github.com/status-im/keycard-go v0.0.0-20190424133014-d95853db0f48/go.mod h1:RZLeN1LMWmRsyYjvAu+I6Dm9QmlDaIIt+Y+4Kd7Tp+Q= github.com/steakknife/bloomfilter v0.0.0-20180922174646-6819c0d2a570/go.mod h1:8OR4w3TdeIHIh1g6EMY5p0gVNOovcWC+1vpc7naMuAw= github.com/steakknife/hamming v0.0.0-20180906055917-c99c65617cd3/go.mod h1:hpGUWaI9xL8pRQCTXQgocU38Qw1g0Us7n5PxxTwTCYU= -github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= -github.com/streadway/amqp v1.0.0/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= -github.com/streadway/handy v0.0.0-20200128134331-0f66f006fb2e/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= @@ -940,11 +798,9 @@ github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1F github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/subosito/gotenv v1.3.0/go.mod h1:YzJjq/33h7nrwdY+iHMhEOEEbW0ovIz0tB6t6PwAXzs= github.com/subosito/gotenv v1.4.0 h1:yAzM1+SmVcz5R4tXGsNMu1jUl2aOJXoiWUCEwwnGrvs= github.com/subosito/gotenv v1.4.0/go.mod h1:mZd6rFysKEcUhUHXJk0C/08wAgyDBFuwEYL7vWWGaGo= github.com/syndtr/goleveldb v0.0.0-20180621010148-0d5a0ceb10cf/go.mod h1:Z4AUp2Km+PwemOoO/VB5AOx9XSsIItzFjoJlOSiYmn0= -github.com/syndtr/goleveldb v1.0.1-0.20200815110645-5c35d600f0ca/go.mod h1:u2MKkTVTVJWe5D1rCvame8WqhBd88EuIwODJZ1VHCPM= github.com/syndtr/goleveldb v1.0.1-0.20210305035536-64b5b1c73954 h1:xQdMZ1WLrgkkvOZ/LDQxjVxMLdby7osSh4ZEVa5sIjs= github.com/syndtr/goleveldb v1.0.1-0.20210305035536-64b5b1c73954/go.mod h1:u2MKkTVTVJWe5D1rCvame8WqhBd88EuIwODJZ1VHCPM= github.com/tebeka/strftime v0.1.3 h1:5HQXOqWKYRFfNyBMNVc9z5+QzuBtIXy03psIhtdJYto= @@ -974,7 +830,6 @@ github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1 github.com/toolkits/concurrent v0.0.0-20150624120057-a4371d70e3e3 h1:kF/7m/ZU+0D4Jj5eZ41Zm3IH/J8OElK1Qtd7tVKAwLk= github.com/toolkits/concurrent v0.0.0-20150624120057-a4371d70e3e3/go.mod h1:QDlpd3qS71vYtakd2hmdpqhJ9nwv6mD6A30bQ1BPBFE= github.com/ttacon/chalk v0.0.0-20160626202418-22c06c80ed31/go.mod h1:onvgF043R+lC5RZ8IT9rBXDaEDnpnw/Cl+HFiw+v/7Q= -github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/tyler-smith/go-bip39 v0.0.0-20180618194314-52158e4697b8/go.mod h1:sJ5fKU0s6JVwZjjcUEX2zFOnvq0ASQ2K9Zr6cf67kNs= github.com/tyler-smith/go-bip39 v1.0.1-0.20181017060643-dbb3b84ba2ef h1:wHSqTBrZW24CsNJDfeh9Ex6Pm0Rcpc7qrgKBiL44vF4= github.com/tyler-smith/go-bip39 v1.0.1-0.20181017060643-dbb3b84ba2ef/go.mod h1:sJ5fKU0s6JVwZjjcUEX2zFOnvq0ASQ2K9Zr6cf67kNs= @@ -1008,21 +863,12 @@ github.com/zondax/hid v0.9.0/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWp go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.6 h1:/ecaJf0sk1l4l6V4awd65v2C3ILy7MSj+s/x1ADCIMU= go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= -go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/api/v3 v3.5.4/go.mod h1:5GB2vv4A4AOn3yk7MftYGHkUfGtDHnEraIjym4dYz5A= -go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/pkg/v3 v3.5.4/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= -go.etcd.io/etcd/client/v2 v2.305.4/go.mod h1:Ud+VUwIi9/uQHOMA+4ekToJ12lTxlv0zB/+DHwTGEbU= -go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0= -go.etcd.io/etcd/client/v3 v3.5.4/go.mod h1:ZaRkVgBZC+L+dLCjTcF1hRXpgZXQPOvnA/Ak/gq3kiY= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= @@ -1030,21 +876,17 @@ go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI= go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/multierr v1.7.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= go.uber.org/multierr v1.8.0 h1:dg6GjLku4EH+249NNmoIciG9N/jURbDG+pFlTkhzIC8= go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.15.0/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= -go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= -go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= go.uber.org/zap v1.21.0 h1:WefMeulhovoZ2sYXz7st6K0sLj7bBhpiFaud4r4zST8= go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -1057,24 +899,18 @@ golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190909091759-094676da4a83/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200115085410-6d4e4cb37c7d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200709230013-948cd5f35899/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20210314154223-e6e6c4f2bb5b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20210915214749-c084706c2272/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e h1:T8NU3HyQ8ClP4SEE+KbFlg6n0NhuTsN4MyznaarGsZM= golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1104,7 +940,6 @@ golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRu golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= @@ -1137,7 +972,6 @@ golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190912160710-24e19bdeb0f2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190921015927-1a5e07d1ff72/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -1156,28 +990,15 @@ golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81R golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210220033124-5f55cee0dc0d/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= -golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210917221730-978cfadd31cf/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220520000938-2e3eb7b945c2/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220617184016-355a448f1bc9 h1:Yqz/iviulwKwAREEeUd3nbBFn0XuyJqkoft2IlrvOhc= golang.org/x/net v0.0.0-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -1189,17 +1010,7 @@ golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1211,7 +1022,6 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220513210516-0976fa681c29/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f h1:Ax0t5p6N38Ga0dThY21weqDEyz2oklo4IvDkpigvkD8= golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1242,11 +1052,8 @@ golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190912141932-bc967efca4b8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1256,7 +1063,6 @@ golang.org/x/sys v0.0.0-20200107162124-548cf772de50/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1282,52 +1088,27 @@ golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210316164454-77fc1eacc6aa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210420205809-ac73e9fd8988/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210816074244-15123e1e1f71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210902050250-f475640dd07b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210910150752-751e447fb3d0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956 h1:XeJjHH1KiLpKGb6lvMiksZ9l0fVUh+AmGcm0nOMEBOY= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.0.0-20220526004731-065cf7ba2467 h1:CBpWXWQpIRjzmkkA+M7q9Fqnwd2mZr3AFqexg8YTfoM= golang.org/x/term v0.0.0-20220526004731-065cf7ba2467/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1343,7 +1124,6 @@ golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac h1:7zkz7BUtwNFFqcowJ+RIgu2MaV/MapERkDIy+mwPyjs= @@ -1364,7 +1144,6 @@ golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgw golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190912185636-87d9f09c5d89/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -1409,20 +1188,14 @@ golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= gonum.org/v1/gonum v0.0.0-20181121035319-3f7ecaa7e8ca/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= gonum.org/v1/gonum v0.6.0/go.mod h1:9mxDZsDKxgMAuccQkewq682L+0eCu4dCN2yonUJTCLU= -gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= gonum.org/v1/netlib v0.0.0-20181029234149-ec6d1f5cefe6/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= @@ -1445,26 +1218,6 @@ google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz513 google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= -google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= -google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= -google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= -google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= -google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= -google.golang.org/api v0.59.0/go.mod h1:sT2boj7M9YJxZzgeZqXogmhfmRWDtPzT31xkieUbuZU= -google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= -google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= -google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= -google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= -google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= -google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= -google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= -google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= -google.golang.org/api v0.81.0/go.mod h1:FA6Mb/bZxj706H2j+j2d6mHEEaHBmbbWnkfvmorOCko= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -1513,48 +1266,7 @@ google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= -google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210917145530-b395a37504d4/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211008145708-270636b82663/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211028162531-8db9c33dc351/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= -google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= google.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd h1:e0TwkXOdbnH/1x5rc5MZ/VYyiZ4v+RdVfrGMqEwT68I= google.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= @@ -1577,21 +1289,9 @@ google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= google.golang.org/grpc v1.47.0 h1:9n77onPX5F3qfFCqjy9dhn8PbNQsIKeVU04J9G7umt8= google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -1612,15 +1312,12 @@ gopkg.in/bsm/ratelimit.v1 v1.0.0-20160220154919-db14e161995a/go.mod h1:KF9sEfUPA gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b h1:QRR6H1YWRnHb4Y/HeNFCTJLFVxaq6wH4YuVdsUOr75U= gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= gopkg.in/ini.v1 v1.42.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.66.4/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.66.6 h1:LATuAqN/shcYAOkv3wl2L4rkaKqkcgTBQjOyYDvcPKI= gopkg.in/ini.v1 v1.66.6/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/jcmturner/aescts.v1 v1.0.1/go.mod h1:nsR8qBOg+OucoIW+WMhB3GspUQXq9XorLnQb9XtvcOo= @@ -1638,7 +1335,6 @@ gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkep gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/urfave/cli.v1 v1.20.0 h1:NdAVW6RYxDif9DhDHaAortIu956m2c0v+09AZBPTbE0= gopkg.in/urfave/cli.v1 v1.20.0/go.mod h1:vuBzUtMdQeixQj8LVd+/98pzhxNGQoyuPBlsXHOQNO0= -gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -1651,7 +1347,6 @@ gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gorm.io/driver/mysql v1.3.3 h1:jXG9ANrwBc4+bMvBcSl8zCfPBaVoPyBEBshA8dA93X8= diff --git a/libs/cosmos-sdk/baseapp/abci.go b/libs/cosmos-sdk/baseapp/abci.go index 079ccdd004..0a3bfa5e80 100644 --- a/libs/cosmos-sdk/baseapp/abci.go +++ b/libs/cosmos-sdk/baseapp/abci.go @@ -14,6 +14,7 @@ import ( "github.com/okex/exchain/app/rpc/simulator" "github.com/okex/exchain/libs/cosmos-sdk/codec" "github.com/okex/exchain/libs/cosmos-sdk/store/mpt" + stypes "github.com/okex/exchain/libs/cosmos-sdk/store/types" "github.com/okex/exchain/libs/cosmos-sdk/types" sdk "github.com/okex/exchain/libs/cosmos-sdk/types" sdkerrors "github.com/okex/exchain/libs/cosmos-sdk/types/errors" @@ -158,6 +159,10 @@ func (app *BaseApp) BeginBlock(req abci.RequestBeginBlock) (res abci.ResponseBeg gasMeter = sdk.NewInfiniteGasMeter() } + if app.getGasConfigHandler != nil { + app.UpdateGlobalGasConfig(app.deliverState.ctx) + } + app.deliverState.ctx.SetBlockGasMeter(gasMeter) if app.beginBlocker != nil { @@ -169,28 +174,22 @@ func (app *BaseApp) BeginBlock(req abci.RequestBeginBlock) (res abci.ResponseBeg app.anteTracer = trace.NewTracer(trace.AnteChainDetail) - app.feeCollector = sdk.Coins{} - app.feeChanged = false + app.feeCollector = nil // clean FeeSplitCollector app.FeeSplitCollector = make([]*sdk.FeeSplitInfo, 0) return res } -func (app *BaseApp) UpdateFeeCollector(fee sdk.Coins, add bool) { - if fee.IsZero() { +func (app *BaseApp) UpdateGlobalGasConfig(ctx sdk.Context) { + if ctx.IsCheckTx() || ctx.IsTraceTx() { return } - app.feeChanged = true - if add { - app.feeCollector = app.feeCollector.Add(fee...) - } else { - app.feeCollector = app.feeCollector.Sub(fee) - } + stypes.UpdateGlobalGasConfig(app.getGasConfigHandler(ctx)) } func (app *BaseApp) updateFeeCollectorAccount(isEndBlock bool) { - if app.updateFeeCollectorAccHandler == nil || !app.feeChanged { + if app.updateFeeCollectorAccHandler == nil { return } diff --git a/libs/cosmos-sdk/baseapp/baseapp.go b/libs/cosmos-sdk/baseapp/baseapp.go index fd58ef5359..fc7c7a0600 100644 --- a/libs/cosmos-sdk/baseapp/baseapp.go +++ b/libs/cosmos-sdk/baseapp/baseapp.go @@ -151,12 +151,14 @@ type BaseApp struct { // nolint: maligned fauxMerkleMode bool // if true, IAVL MountStores uses MountStoresDB for simulation speed. updateFeeCollectorAccHandler sdk.UpdateFeeCollectorAccHandler + getFeeCollectorInfoHandler sdk.GetFeeCollectorInfo logFix sdk.LogFix updateCosmosTxCount sdk.UpdateCosmosTxCount getTxFeeAndFromHandler sdk.GetTxFeeAndFromHandler getTxFeeHandler sdk.GetTxFeeHandler updateCMTxNonceHandler sdk.UpdateCMTxNonceHandler + getGasConfigHandler sdk.GetGasConfigHandler // volatile states: // @@ -205,7 +207,6 @@ type BaseApp struct { // nolint: maligned customizeModuleOnStop []sdk.CustomizeOnStop mptCommitHandler sdk.MptCommitHandler // handler for mpt trie commit feeCollector sdk.Coins - feeChanged bool // used to judge whether should update the fee-collector account FeeSplitCollector []*sdk.FeeSplitInfo chainCache *sdk.Cache @@ -696,16 +697,22 @@ func (app *BaseApp) getContextForTx(mode runTxMode, txBytes []byte) sdk.Context ctx.SetGasMeter(sdk.NewInfiniteGasMeter()) } if app.parallelTxManage.isAsyncDeliverTx && mode == runTxModeDeliverInAsync { + app.parallelTxManage.txByteMpCMIndexLock.RLock() ctx.SetParaMsg(&sdk.ParaMsg{ - HaveCosmosTxInBlock: app.parallelTxManage.haveCosmosTxInBlock, + // Concurrency security issues need to be considered here, + // and there is a small probability that NeedUpdateTXCounter() will be wrong + // due to concurrent reading and writing of pm.txIndexMpUpdateTXCounter (slice), + // but such tx will be rerun, so this case can be ignored. + HaveCosmosTxInBlock: app.parallelTxManage.NeedUpdateTXCounter(), CosmosIndexInBlock: app.parallelTxManage.txByteMpCosmosIndex[string(txBytes)], }) + app.parallelTxManage.txByteMpCMIndexLock.RUnlock() ctx.SetTxBytes(txBytes) ctx.ResetWatcher() } if mode == runTxModeDeliver { - ctx.SetDeliver() + ctx.SetDeliverSerial() } ctx.SetFeeSplitInfo(&sdk.FeeSplitInfo{}) diff --git a/libs/cosmos-sdk/baseapp/baseapp_mode_deliver.go b/libs/cosmos-sdk/baseapp/baseapp_mode_deliver.go index 03528459f7..1152429704 100644 --- a/libs/cosmos-sdk/baseapp/baseapp_mode_deliver.go +++ b/libs/cosmos-sdk/baseapp/baseapp_mode_deliver.go @@ -30,8 +30,8 @@ func (m *modeHandlerDeliver) handleRunMsg(info *runTxInfo) (err error) { type CacheTxContextFunc func(ctx sdk.Context, txBytes []byte) (sdk.Context, sdk.CacheMultiStore) -//this handleGasRefund func is also called by modeHandlerTrace.handleDeferRefund -//in this func, edit any member in BaseApp is prohibited +// this handleGasRefund func is also called by modeHandlerTrace.handleDeferRefund +// in this func, edit any member in BaseApp is prohibited func handleGasRefund(info *runTxInfo, cacheTxCtxFunc CacheTxContextFunc, gasRefundHandler sdk.GasRefundHandler) sdk.DecCoins { var gasRefundCtx sdk.Context info.ctx.Cache().Write(false) @@ -57,8 +57,7 @@ func (m *modeHandlerDeliver) handleDeferRefund(info *runTxInfo) { if m.app.GasRefundHandler == nil { return } - refund := handleGasRefund(info, m.app.cacheTxContext, m.app.GasRefundHandler) - m.app.UpdateFeeCollector(refund, false) + handleGasRefund(info, m.app.cacheTxContext, m.app.GasRefundHandler) if info.ctx.GetFeeSplitInfo().HasFee { m.app.FeeSplitCollector = append(m.app.FeeSplitCollector, info.ctx.GetFeeSplitInfo()) } diff --git a/libs/cosmos-sdk/baseapp/baseapp_parallel.go b/libs/cosmos-sdk/baseapp/baseapp_parallel.go index 59a9e347de..2baeb56d8b 100644 --- a/libs/cosmos-sdk/baseapp/baseapp_parallel.go +++ b/libs/cosmos-sdk/baseapp/baseapp_parallel.go @@ -19,16 +19,19 @@ var ( maxTxResultInChan = 200000 maxGoroutineNumberInParaTx = runtime.NumCPU() multiCacheListClearInterval = int64(100) + + feeAccountKeyInStore = make([]byte, 0) ) type extraDataForTx struct { - supportPara bool - fee sdk.Coins - isEvm bool - from string - to string - stdTx sdk.Tx - decodeErr error + supportPara bool + fee sdk.Coins + isEvm bool + needUpdateTXCounter bool + from string + to string + stdTx sdk.Tx + decodeErr error } type txWithIndex struct { @@ -68,14 +71,15 @@ func (app *BaseApp) getExtraDataByTxs(txs [][]byte) { app.blockDataCache.SetTx(txBytes, tx) } - coin, isEvm, s, toAddr, _, supportPara := app.getTxFeeAndFromHandler(app.getContextForTx(runTxModeDeliver, txBytes), tx) + coin, isEvm, needUpdateTXCounter, s, toAddr, _, supportPara := app.getTxFeeAndFromHandler(app.getContextForTx(runTxModeDeliver, txBytes), tx) para.extraTxsInfo[index] = &extraDataForTx{ - supportPara: supportPara, - fee: coin, - isEvm: isEvm, - from: s, - to: toAddr, - stdTx: tx, + supportPara: supportPara, + fee: coin, + isEvm: isEvm, + needUpdateTXCounter: needUpdateTXCounter, + from: s, + to: toAddr, + stdTx: tx, } wg.Done() } @@ -125,44 +129,45 @@ func Union(x string, yString string) { // calGroup cal group by txs func (app *BaseApp) calGroup() { - para := app.parallelTxManage + pm := app.parallelTxManage rootAddr = make(map[string]string, 0) - para.cosmosTxIndexInBlock = 0 - for index, tx := range para.extraTxsInfo { + pm.cosmosTxIndexInBlock = 0 + for index, tx := range pm.extraTxsInfo { if tx.supportPara { //evmTx & wasmTx Union(tx.from, tx.to) } else { - para.haveCosmosTxInBlock = true app.parallelTxManage.putResult(index, &executeResult{paraMsg: &sdk.ParaMsg{}, msIsNil: true}) } - if !tx.isEvm { - para.txByteMpCosmosIndex[string(para.txs[index])] = para.cosmosTxIndexInBlock - para.cosmosTxIndexInBlock++ + if tx.needUpdateTXCounter { + pm.txIndexMpUpdateTXCounter[index] = true + pm.txByteMpCosmosIndex[string(pm.txs[index])] = pm.cosmosTxIndexInBlock + pm.cosmosTxIndexInBlock++ } + } addrToID := make(map[string]int, 0) - for index, txInfo := range para.extraTxsInfo { + for index, txInfo := range pm.extraTxsInfo { if !txInfo.supportPara { continue } rootAddr := Find(txInfo.from) id, exist := addrToID[rootAddr] if !exist { - id = len(para.groupList) + id = len(pm.groupList) addrToID[rootAddr] = id } - para.groupList[id] = append(para.groupList[id], index) - para.txIndexWithGroup[index] = id + pm.groupList[id] = append(pm.groupList[id], index) + pm.txIndexWithGroup[index] = id } - groupSize := len(para.groupList) + groupSize := len(pm.groupList) for groupIndex := 0; groupIndex < groupSize; groupIndex++ { - list := para.groupList[groupIndex] + list := pm.groupList[groupIndex] for index := 0; index < len(list); index++ { if index+1 <= len(list)-1 { app.parallelTxManage.nextTxInGroup[list[index]] = list[index+1] @@ -182,6 +187,10 @@ func (app *BaseApp) ParallelTxs(txs [][]byte, onlyCalSender bool) []*abci.Respon return make([]*abci.ResponseDeliverTx, 0) } + if len(feeAccountKeyInStore) == 0 { + _, feeAccountKeyInStore = app.getFeeCollectorInfoHandler(app.deliverState.ctx, true) + } + pm := app.parallelTxManage pm.init(txs, app.deliverState.ctx.BlockHeight(), app.deliverState.ms) @@ -234,7 +243,7 @@ func (app *BaseApp) runTxs() []*abci.ResponseDeliverTx { break } isReRun := false - if pm.isConflict(res) || overFlow(currentGas, res.resp.GasUsed, maxGas) { + if pm.isConflict(res) || overFlow(currentGas, res.resp.GasUsed, maxGas) || pm.haveAnteErrTx { rerunIdx++ isReRun = true // conflict rerun tx @@ -243,8 +252,10 @@ func (app *BaseApp) runTxs() []*abci.ResponseDeliverTx { } res = app.deliverTxWithCache(pm.upComingTxIndex) } + if res.paraMsg.AnteErr != nil { res.msIsNil = true + pm.handleAnteErrTx(pm.txIndexMpUpdateTXCounter[pm.upComingTxIndex]) } pm.deliverTxs[pm.upComingTxIndex] = &res.resp @@ -255,7 +266,12 @@ func (app *BaseApp) runTxs() []*abci.ResponseDeliverTx { app.deliverState.ctx.BlockGasMeter().ConsumeGas(sdk.Gas(res.resp.GasUsed), "unexpected error") pm.blockGasMeterMu.Unlock() - pm.SetCurrentIndex(pm.upComingTxIndex, res) + pm.SetCurrentIndexRes(pm.upComingTxIndex, res) + + if !res.msIsNil { + pm.currTxFee = pm.currTxFee.Add(pm.extraTxsInfo[pm.upComingTxIndex].fee.Sub(pm.finalResult[pm.upComingTxIndex].paraMsg.RefundFee)...) + } + currentGas += uint64(res.resp.GasUsed) if isReRun { @@ -293,15 +309,19 @@ func (app *BaseApp) runTxs() []*abci.ResponseDeliverTx { pm.alreadyEnd = true pm.stop <- struct{}{} - // fix logs - app.feeChanged = true + // update fee collector balance app.feeCollector = app.parallelTxManage.currTxFee + + // fix logs receiptsLogs := app.endParallelTxs(pm.txSize) ctx, _ := app.cacheTxContext(app.getContextForTx(runTxModeDeliver, []byte{}), []byte{}) ctx.SetMultiStore(app.parallelTxManage.cms) - app.updateCosmosTxCount(ctx, app.parallelTxManage.cosmosTxIndexInBlock-1) + if app.parallelTxManage.NeedUpdateTXCounter() { + app.updateCosmosTxCount(ctx, app.parallelTxManage.cosmosTxIndexInBlock-1) + } + for index, v := range receiptsLogs { if len(v) != 0 { // only update evm tx result pm.deliverTxs[index].Data = v @@ -432,16 +452,19 @@ func newExecuteResult(r abci.ResponseDeliverTx, ms sdk.CacheMultiStore, counter } type parallelTxManager struct { - blockHeight int64 - groupTasks []*groupTask - blockGasMeterMu sync.Mutex - haveCosmosTxInBlock bool - isAsyncDeliverTx bool - txs [][]byte - txSize int - alreadyEnd bool - cosmosTxIndexInBlock int - txByteMpCosmosIndex map[string]int + blockHeight int64 + groupTasks []*groupTask + blockGasMeterMu sync.Mutex + isAsyncDeliverTx bool + txs [][]byte + txSize int + alreadyEnd bool + + cosmosTxIndexInBlock int + txByteMpCMIndexLock sync.RWMutex + txByteMpCosmosIndex map[string]int + txIndexMpUpdateTXCounter []bool + haveAnteErrTx bool resultCh chan int resultCb func(data int) @@ -612,6 +635,8 @@ func newParallelTxManager() *parallelTxManager { txIndexWithGroup: make(map[int]int), resultCh: make(chan int, maxTxResultInChan), + txByteMpCMIndexLock: sync.RWMutex{}, + blockMpCache: newCacheRWSetList(), chainMpCache: newCacheRWSetList(), blockMultiStores: newCacheMultiStoreList(), @@ -685,7 +710,6 @@ func (pm *parallelTxManager) addBlockCacheToChainCache() { } var ( - feeAccountKey, _ = hex.DecodeString("01f1829676db577682e944fc3493d451b67ff3e29f") wasmTxCountKey, _ = hex.DecodeString("08") ) @@ -693,8 +717,13 @@ func (pm *parallelTxManager) isConflict(e *executeResult) bool { if e.msIsNil { return true //TODO fix later } + + if e.paraMsg.InvalidExecute { + return true + } + for storeKey, rw := range e.rwSet { - delete(rw.Read, string(feeAccountKey)) + delete(rw.Read, string(feeAccountKeyInStore)) delete(rw.Read, string(wasmTxCountKey)) for key, value := range rw.Read { @@ -738,7 +767,6 @@ func (pm *parallelTxManager) init(txs [][]byte, blockHeight int64, deliverStateM txSize := len(txs) pm.blockHeight = blockHeight pm.groupTasks = make([]*groupTask, 0) - pm.haveCosmosTxInBlock = false pm.isAsyncDeliverTx = true pm.txs = txs pm.txSize = txSize @@ -762,6 +790,8 @@ func (pm *parallelTxManager) init(txs [][]byte, blockHeight int64, deliverStateM pm.txByteMpCosmosIndex = make(map[string]int, 0) pm.nextTxInGroup = make(map[int]int) + pm.haveAnteErrTx = false + pm.txIndexMpUpdateTXCounter = make([]bool, txSize) pm.extraTxsInfo = make([]*extraDataForTx, txSize) pm.txReps = make([]*executeResult, txSize) pm.finalResult = make([]*executeResult, txSize) @@ -789,7 +819,7 @@ func (pm *parallelTxManager) getParentMsByTxIndex(txIndex int) (sdk.CacheMultiSt return ms, useCurrent } -func (pm *parallelTxManager) SetCurrentIndex(txIndex int, res *executeResult) { +func (pm *parallelTxManager) SetCurrentIndexRes(txIndex int, res *executeResult) { if res.msIsNil { return } @@ -809,5 +839,31 @@ func (pm *parallelTxManager) SetCurrentIndex(txIndex int, res *executeResult) { pm.conflictCheck[storeKey].Write[key] = value } } - pm.currTxFee = pm.currTxFee.Add(pm.extraTxsInfo[txIndex].fee.Sub(pm.finalResult[txIndex].paraMsg.RefundFee)...) + +} + +func (pm *parallelTxManager) NeedUpdateTXCounter() bool { + res := false + for _, v := range pm.txIndexMpUpdateTXCounter { + res = res || v + } + return res +} + +// When an AnteErr tx is encountered, this tx will be discarded, +// and the cosmosIndex of the remaining tx needs to be corrected. +func (pm *parallelTxManager) handleAnteErrTx(curTxNeedUpdateTXCounter bool) { + pm.haveAnteErrTx = true + pm.txIndexMpUpdateTXCounter[pm.upComingTxIndex] = false + + if curTxNeedUpdateTXCounter { + pm.cosmosTxIndexInBlock-- + pm.txByteMpCMIndexLock.Lock() + for index, tx := range pm.txs { + if _, ok := pm.txByteMpCosmosIndex[string(tx)]; ok && index > pm.upComingTxIndex { + pm.txByteMpCosmosIndex[string(tx)]-- + } + } + pm.txByteMpCMIndexLock.Unlock() + } } diff --git a/libs/cosmos-sdk/baseapp/baseapp_runtx.go b/libs/cosmos-sdk/baseapp/baseapp_runtx.go index 47a44f1367..6d4f3db1a6 100644 --- a/libs/cosmos-sdk/baseapp/baseapp_runtx.go +++ b/libs/cosmos-sdk/baseapp/baseapp_runtx.go @@ -90,12 +90,6 @@ func (app *BaseApp) runtxWithInfo(info *runTxInfo, mode runTxMode, txBytes []byt handler := info.handler app.pin(trace.ValTxMsgs, true, mode) - if tx.GetType() != sdk.EvmTxType && mode == runTxModeDeliver { - // should update the balance of FeeCollector's account when run non-evm tx - // which uses non-infiniteGasMeter during AnteHandleChain - app.updateFeeCollectorAccount(false) - } - //init info context err = handler.handleStartHeight(info, height) if err != nil { @@ -196,11 +190,6 @@ func (app *BaseApp) runtxWithInfo(info *runTxInfo, mode runTxMode, txBytes []byt } app.pin(trace.RunAnte, false, mode) - if app.getTxFeeHandler != nil && mode == runTxModeDeliver { - fee := app.getTxFeeHandler(tx) - app.UpdateFeeCollector(fee, true) - } - isAnteSucceed = true app.pin(trace.RunMsg, true, mode) err = handler.handleRunMsg(info) diff --git a/libs/cosmos-sdk/baseapp/options.go b/libs/cosmos-sdk/baseapp/options.go index a62b1146c1..88652faf4f 100644 --- a/libs/cosmos-sdk/baseapp/options.go +++ b/libs/cosmos-sdk/baseapp/options.go @@ -170,6 +170,13 @@ func (app *BaseApp) SetUpdateFeeCollectorAccHandler(handler sdk.UpdateFeeCollect app.updateFeeCollectorAccHandler = handler } +func (app *BaseApp) SetGetFeeCollectorInfo(handle sdk.GetFeeCollectorInfo) { + if app.sealed { + panic("SetGetFeeCollectorBalance() on sealed BaseApp") + } + app.getFeeCollectorInfoHandler = handle +} + func (app *BaseApp) SetParallelTxLogHandlers(fixLog sdk.LogFix) { if app.sealed { panic("SetPallTxLogHandler() on sealed BaseApp") @@ -233,3 +240,10 @@ func (app *BaseApp) SetUpdateCMTxNonceHandler(handler sdk.UpdateCMTxNonceHandler } app.updateCMTxNonceHandler = handler } + +func (app *BaseApp) SetGetGasConfigHandler(handler sdk.GetGasConfigHandler) { + if app.sealed { + panic("SetGetGasConfigHandler() on sealed BaseApp") + } + app.getGasConfigHandler = handler +} diff --git a/libs/cosmos-sdk/client/flags/flags.go b/libs/cosmos-sdk/client/flags/flags.go index 7eb9435615..e716f0c821 100644 --- a/libs/cosmos-sdk/client/flags/flags.go +++ b/libs/cosmos-sdk/client/flags/flags.go @@ -62,6 +62,7 @@ const ( FlagMaxOpenConnections = "max-open" FlagRPCReadTimeout = "read-timeout" FlagRPCWriteTimeout = "write-timeout" + FlagMaxBodyBytes = "max-body-bytes" FlagOutputDocument = "output-document" // inspired by wget -O FlagSkipConfirmation = "yes" FlagProve = "prove" @@ -80,6 +81,8 @@ const ( FlagOffset = "offset" FlagTimeoutHeight = "timeout-height" FlagCountTotal = "count-total" + + DefaultMaxBodyBytes = 1000 * 1000 ) // LineBreak can be included in a command list to provide a blank line @@ -151,6 +154,7 @@ func RegisterRestServerFlags(cmd *cobra.Command) *cobra.Command { cmd = GetCommands(cmd)[0] cmd.Flags().String(FlagListenAddr, "tcp://localhost:1317", "The address for the server to listen on") cmd.Flags().Uint(FlagMaxOpenConnections, 1000, "The number of maximum open connections") + cmd.Flags().Int64(FlagMaxBodyBytes, DefaultMaxBodyBytes, "The RPC maximum size of request body, in bytes") cmd.Flags().Uint(FlagRPCReadTimeout, 10, "The RPC read timeout (in seconds)") cmd.Flags().Uint(FlagRPCWriteTimeout, 10, "The RPC write timeout (in seconds)") cmd.Flags().Bool(FlagUnsafeCORS, false, "Allows CORS requests from all domains. For development purposes only, use it at your own risk.") diff --git a/libs/cosmos-sdk/client/lcd/root.go b/libs/cosmos-sdk/client/lcd/root.go index e8b9fc6ed7..c77b3564d5 100644 --- a/libs/cosmos-sdk/client/lcd/root.go +++ b/libs/cosmos-sdk/client/lcd/root.go @@ -106,7 +106,7 @@ func (rs *RestServer) Logger() log.Logger { } // Start starts the rest server -func (rs *RestServer) Start(listenAddr string, maxOpen int, readTimeout, writeTimeout uint, cors bool) (err error) { +func (rs *RestServer) Start(listenAddr string, maxOpen int, readTimeout, writeTimeout uint, maxBodyBytes int64, cors bool) (err error) { //trapSignal(func() { // err := rs.listener.Close() // rs.log.Error("error closing listener", "err", err) @@ -116,6 +116,9 @@ func (rs *RestServer) Start(listenAddr string, maxOpen int, readTimeout, writeTi cfg.MaxOpenConnections = maxOpen cfg.ReadTimeout = time.Duration(readTimeout) * time.Second cfg.WriteTimeout = time.Duration(writeTimeout) * time.Second + if maxBodyBytes > 0 { + cfg.MaxBodyBytes = maxBodyBytes + } rs.listener, err = tmrpcserver.Listen(listenAddr, cfg) if err != nil { @@ -163,6 +166,7 @@ func ServeCommand(cdc *codec.CodecProxy, interfaceReg jsonpb.AnyResolver, regist viper.GetInt(flags.FlagMaxOpenConnections), uint(viper.GetInt(flags.FlagRPCReadTimeout)), uint(viper.GetInt(flags.FlagRPCWriteTimeout)), + viper.GetInt64(flags.FlagMaxBodyBytes), viper.GetBool(flags.FlagUnsafeCORS), ) @@ -177,7 +181,7 @@ func StartRestServer(cdc *codec.CodecProxy, interfaceReg jsonpb.AnyResolver, reg rs := NewRestServer(cdc, interfaceReg, tmNode) registerRoutesFn(rs) - //rs.registerSwaggerUI() + //rs.registerSwaggerUI() rs.log.Info("start rest server") // Start the rest server and return error if one exists return rs.Start( @@ -185,6 +189,7 @@ func StartRestServer(cdc *codec.CodecProxy, interfaceReg jsonpb.AnyResolver, reg viper.GetInt(flags.FlagMaxOpenConnections), uint(viper.GetInt(flags.FlagRPCReadTimeout)), uint(viper.GetInt(flags.FlagRPCWriteTimeout)), + viper.GetInt64(flags.FlagMaxBodyBytes), viper.GetBool(flags.FlagUnsafeCORS), ) } diff --git a/libs/cosmos-sdk/server/start.go b/libs/cosmos-sdk/server/start.go index ee63cd74fb..055e4f84e0 100644 --- a/libs/cosmos-sdk/server/start.go +++ b/libs/cosmos-sdk/server/start.go @@ -72,7 +72,8 @@ const ( FlagFastSyncGap = "fastsync-gap" - FlagEventBlockTime = "event-block-time" + FlagEventBlockTime = "event-block-time" + FlagStartFromSnapshot = "start-from-snapshot" ) // StartCmd runs the service passed in, either stand-alone or in-process with diff --git a/libs/cosmos-sdk/server/start_okchain.go b/libs/cosmos-sdk/server/start_okchain.go index 286e2240a9..e6e7d33db8 100644 --- a/libs/cosmos-sdk/server/start_okchain.go +++ b/libs/cosmos-sdk/server/start_okchain.go @@ -247,6 +247,7 @@ func RegisterServerFlags(cmd *cobra.Command) *cobra.Command { viper.BindPFlag(FlagEvmImportMode, cmd.Flags().Lookup(FlagEvmImportMode)) viper.BindPFlag(FlagEvmImportPath, cmd.Flags().Lookup(FlagEvmImportPath)) viper.BindPFlag(FlagGoroutineNum, cmd.Flags().Lookup(FlagGoroutineNum)) + viper.BindPFlag(FlagStartFromSnapshot, cmd.Flags().Lookup(FlagStartFromSnapshot)) cmd.Flags().Int(state.FlagDeliverTxsExecMode, 0, "Execution mode for deliver txs, (0:serial[default], 1:deprecated, 2:parallel)") cmd.Flags().Bool(state.FlagEnableConcurrency, false, "Enable concurrency for deliver txs") @@ -258,6 +259,7 @@ func RegisterServerFlags(cmd *cobra.Command) *cobra.Command { cmd.Flags().String(flags.FlagKeyringBackend, flags.DefaultKeyringBackend, "Select keyring's backend (os|file|test)") cmd.Flags().String(FlagCORS, "", "Set the rest-server domains that can make CORS requests (* for all)") cmd.Flags().Int(FlagMaxOpenConnections, 1000, "The number of maximum open connections of rest-server") + cmd.Flags().Int64(flags.FlagMaxBodyBytes, flags.DefaultMaxBodyBytes, "The RPC maximum size of request body, in bytes") cmd.Flags().Int(FlagWsMaxConnections, 20000, "the max capacity number of websocket client connections") cmd.Flags().Int(FlagWsSubChannelLength, 100, "the length of subscription channel") cmd.Flags().String(flags.FlagChainID, ChainID, "Chain ID of tendermint node for web3") @@ -274,6 +276,8 @@ func RegisterServerFlags(cmd *cobra.Command) *cobra.Command { cmd.Flags().Int64(FlagCommitGapHeight, 100, "Block interval to commit cached data into db, affects iavl & mpt") cmd.Flags().Int64(FlagFastSyncGap, 20, "Block height interval to switch fast-sync mode") + cmd.Flags().String(FlagStartFromSnapshot, "", "Snapshot URL which uses to start node") + cmd.Flags().MarkHidden(FlagStartFromSnapshot) return cmd } diff --git a/libs/cosmos-sdk/store/types/gas.go b/libs/cosmos-sdk/store/types/gas.go index 882c2ec14d..38c4a7538c 100644 --- a/libs/cosmos-sdk/store/types/gas.go +++ b/libs/cosmos-sdk/store/types/gas.go @@ -2,6 +2,7 @@ package types import ( "math" + "sync" ) // Gas consumption descriptors. @@ -14,6 +15,27 @@ const ( GasReadCostFlatDesc = "ReadFlat" GasHasDesc = "Has" GasDeleteDesc = "Delete" + + defaultHasCost = 1000 + defaultDeleteCost = 1000 + defaultReadCostFlat = 1000 + defaultReadCostPerByte = 3 + defaultWriteCostFlat = 2000 + defaultWriteCostPerByte = 30 + defaultIterNextCostFlat = 30 +) + +var ( + gGasConfig = &GasConfig{ + HasCost: defaultHasCost, + DeleteCost: defaultDeleteCost, + ReadCostFlat: defaultReadCostFlat, + ReadCostPerByte: defaultReadCostPerByte, + WriteCostFlat: defaultWriteCostFlat, + WriteCostPerByte: defaultWriteCostPerByte, + IterNextCostFlat: defaultIterNextCostFlat, + } + mut = &sync.RWMutex{} ) // Gas measured by the SDK @@ -167,26 +189,18 @@ func (g *infiniteGasMeter) IsOutOfGas() bool { // GasConfig defines gas cost for each operation on KVStores type GasConfig struct { - HasCost Gas - DeleteCost Gas - ReadCostFlat Gas - ReadCostPerByte Gas - WriteCostFlat Gas - WriteCostPerByte Gas - IterNextCostFlat Gas + HasCost Gas `json:"hasCost"` + DeleteCost Gas `json:"deleteCost"` + ReadCostFlat Gas `json:"readCostFlat"` + ReadCostPerByte Gas `json:"readCostPerByte"` + WriteCostFlat Gas `json:"writeCostFlat"` + WriteCostPerByte Gas `json:"writeCostPerByte"` + IterNextCostFlat Gas `json:"iterNextCostFlat"` } // KVGasConfig returns a default gas config for KVStores. func KVGasConfig() GasConfig { - return GasConfig{ - HasCost: 1000, - DeleteCost: 1000, - ReadCostFlat: 1000, - ReadCostPerByte: 3, - WriteCostFlat: 2000, - WriteCostPerByte: 30, - IterNextCostFlat: 30, - } + return GetGlobalGasConfig() } // TransientGasConfig returns a default gas config for TransientStores. @@ -194,3 +208,51 @@ func TransientGasConfig() GasConfig { // TODO: define gasconfig for transient stores return KVGasConfig() } + +func UpdateGlobalGasConfig(gc *GasConfig) { + mut.Lock() + defer mut.Unlock() + gGasConfig = gc +} + +func AsDefaultGasConfig(gc *GasConfig) { + if gc.HasCost == 0 { + gc.HasCost = defaultHasCost + } + if gc.DeleteCost == 0 { + gc.DeleteCost = defaultDeleteCost + } + if gc.ReadCostFlat == 0 { + gc.ReadCostFlat = defaultReadCostFlat + } + if gc.ReadCostPerByte == 0 { + gc.ReadCostPerByte = defaultReadCostPerByte + } + if gc.WriteCostFlat == 0 { + gc.WriteCostFlat = defaultWriteCostFlat + } + if gc.WriteCostPerByte == 0 { + gc.WriteCostPerByte = defaultWriteCostPerByte + } + if gc.IterNextCostFlat == 0 { + gc.IterNextCostFlat = defaultIterNextCostFlat + } +} + +func GetGlobalGasConfig() GasConfig { + mut.RLock() + defer mut.RUnlock() + return *gGasConfig +} + +func GetDefaultGasConfig() *GasConfig { + return &GasConfig{ + HasCost: defaultHasCost, + DeleteCost: defaultDeleteCost, + ReadCostFlat: defaultReadCostFlat, + ReadCostPerByte: defaultReadCostPerByte, + WriteCostFlat: defaultWriteCostFlat, + WriteCostPerByte: defaultWriteCostPerByte, + IterNextCostFlat: defaultIterNextCostFlat, + } +} diff --git a/libs/cosmos-sdk/types/context.go b/libs/cosmos-sdk/types/context.go index b069d05b76..69ad5af29f 100644 --- a/libs/cosmos-sdk/types/context.go +++ b/libs/cosmos-sdk/types/context.go @@ -2,17 +2,17 @@ package types import ( "context" - "github.com/ethereum/go-ethereum/core/vm" "sync" "time" + "github.com/ethereum/go-ethereum/core/vm" "github.com/gogo/protobuf/proto" - "github.com/okex/exchain/libs/system/trace" - abci "github.com/okex/exchain/libs/tendermint/abci/types" - "github.com/okex/exchain/libs/tendermint/libs/log" "github.com/okex/exchain/libs/cosmos-sdk/store/gaskv" stypes "github.com/okex/exchain/libs/cosmos-sdk/store/types" + "github.com/okex/exchain/libs/system/trace" + abci "github.com/okex/exchain/libs/tendermint/abci/types" + "github.com/okex/exchain/libs/tendermint/libs/log" ) /* @@ -24,41 +24,41 @@ but please do not over-use it. We try to keep all data structured and standard additions here would be better just to add to the Context struct */ type Context struct { - ctx context.Context - ms MultiStore - header *abci.Header - chainID string - from string - txBytes []byte - logger log.Logger - voteInfo []abci.VoteInfo - gasMeter GasMeter - blockGasMeter GasMeter - isDeliver bool - checkTx bool - recheckTx bool // if recheckTx == true, then checkTx must also be true - wrappedCheckTx bool // if wrappedCheckTx == true, then checkTx must also be true - traceTx bool // traceTx is set true for trace tx and its predesessors , traceTx was set in app.beginBlockForTrace() - traceTxLog bool // traceTxLog is used to create trace logger for evm , traceTxLog is set to true when only tracing target tx (its predesessors will set false), traceTxLog is set before runtx - traceTxConfigBytes []byte // traceTxConfigBytes is used to save traceTxConfig, passed from api to x/evm - minGasPrice DecCoins - consParams *abci.ConsensusParams - eventManager *EventManager - accountNonce uint64 - cache *Cache - trc *trace.Tracer - accountCache *AccountCache - paraMsg *ParaMsg + ctx context.Context + ms MultiStore + header *abci.Header + chainID string + from string + txBytes []byte + logger log.Logger + voteInfo []abci.VoteInfo + gasMeter GasMeter + blockGasMeter GasMeter + isDeliverWithSerial bool + checkTx bool + recheckTx bool // if recheckTx == true, then checkTx must also be true + wrappedCheckTx bool // if wrappedCheckTx == true, then checkTx must also be true + traceTx bool // traceTx is set true for trace tx and its predesessors , traceTx was set in app.beginBlockForTrace() + traceTxLog bool // traceTxLog is used to create trace logger for evm , traceTxLog is set to true when only tracing target tx (its predesessors will set false), traceTxLog is set before runtx + traceTxConfigBytes []byte // traceTxConfigBytes is used to save traceTxConfig, passed from api to x/evm + minGasPrice DecCoins + consParams *abci.ConsensusParams + eventManager *EventManager + accountNonce uint64 + cache *Cache + trc *trace.Tracer + accountCache *AccountCache + paraMsg *ParaMsg // txCount uint32 - wasmKvStoreForSimulate *KVStore - overridesBytes []byte // overridesBytes is used to save overrides info, passed from ethCall to x/evm - watcher *TxWatcher - feesplitInfo *FeeSplitInfo + wasmSimulateCache map[string][]byte + overridesBytes []byte // overridesBytes is used to save overrides info, passed from ethCall to x/evm + watcher *TxWatcher + feesplitInfo *FeeSplitInfo - statedb vm.StateDB - outOfGas bool - mempoolSimulate bool // if mempoolSimulate = true, then is mempool simulate tx + statedb vm.StateDB + outOfGas bool + mempoolSimulate bool // if mempoolSimulate = true, then is mempool simulate tx } // Proposed rename, not done to avoid API breakage @@ -87,12 +87,13 @@ func (c *Context) VoteInfos() []abci.VoteInfo { return c.voteInfo } func (c *Context) GasMeter() GasMeter { return c.gasMeter } func (c *Context) BlockGasMeter() GasMeter { return c.blockGasMeter } -func (c *Context) IsDeliver() bool { - return c.isDeliver +func (c *Context) IsDeliverWithSerial() bool { + return c.isDeliverWithSerial } func (c *Context) UseParamCache() bool { - return c.isDeliver || (c.paraMsg != nil && !c.paraMsg.HaveCosmosTxInBlock) || c.checkTx + // c.paraMsg.HaveCosmosTxInBlock is also true when there are only E2C txs in a block + return c.isDeliverWithSerial || (c.paraMsg != nil && !c.paraMsg.HaveCosmosTxInBlock) || c.checkTx } func (c *Context) IsCheckTx() bool { return c.checkTx } @@ -109,9 +110,6 @@ func (c *Context) Cache() *Cache { return c.cache } -func (c *Context) WasmKvStoreForSimulate() KVStore { - return *c.wasmKvStoreForSimulate -} func (c Context) ParaMsg() *ParaMsg { return c.paraMsg } @@ -192,36 +190,26 @@ func (c *Context) ConsensusParams() *abci.ConsensusParams { return proto.Clone(c.consParams).(*abci.ConsensusParams) } -// //TxCount -// -// func (c *Context) TxCount() uint32 { -// return c.txCount -// } -var ( - nilKvStore = KVStore(nil) -) - // NewContext create a new context func NewContext(ms MultiStore, header abci.Header, isCheckTx bool, logger log.Logger) Context { // https://github.com/gogo/protobuf/issues/519 header.Time = header.Time.UTC() return Context{ - ctx: context.Background(), - ms: ms, - header: &header, - chainID: header.ChainID, - checkTx: isCheckTx, - logger: logger, - gasMeter: stypes.NewInfiniteGasMeter(), - minGasPrice: DecCoins{}, - eventManager: NewEventManager(), - watcher: &TxWatcher{EmptyWatcher{}}, - wasmKvStoreForSimulate: &nilKvStore, + ctx: context.Background(), + ms: ms, + header: &header, + chainID: header.ChainID, + checkTx: isCheckTx, + logger: logger, + gasMeter: stypes.NewInfiniteGasMeter(), + minGasPrice: DecCoins{}, + eventManager: NewEventManager(), + watcher: &TxWatcher{EmptyWatcher{}}, } } -func (c *Context) SetDeliver() *Context { - c.isDeliver = true +func (c *Context) SetDeliverSerial() *Context { + c.isDeliverWithSerial = true return c } @@ -317,8 +305,8 @@ func (c *Context) SetIsCheckTx(isCheckTx bool) *Context { return c } -func (c *Context) SetIsDeliverTx(isDeliverTx bool) *Context { - c.isDeliver = isDeliverTx +func (c *Context) SetIsDeliverTxSerial(isDeliverWithSerial bool) *Context { + c.isDeliverWithSerial = isDeliverWithSerial return c } @@ -414,12 +402,22 @@ func (c *Context) SetWatcher(w IWatcher) { c.watcher.IWatcher = w } -func (c *Context) SetWasmKvStoreForSimulate(k KVStore) { - *c.wasmKvStoreForSimulate = k +func (c *Context) SetWasmSimulateCache() { + c.wasmSimulateCache = getWasmCacheMap() +} +func (c *Context) GetWasmSimulateCache() map[string][]byte { + if c.wasmSimulateCache == nil { + c.wasmSimulateCache = getWasmCacheMap() + return c.wasmSimulateCache + } + return c.wasmSimulateCache } -func (c *Context) ResetWasmKvStoreForSimulate() { - *c.wasmKvStoreForSimulate = KVStore(nil) +func (c *Context) MoveWasmSimulateCacheToPool() { + for k, _ := range c.wasmSimulateCache { + delete(c.wasmSimulateCache, k) + } + putBackWasmCacheMap(c.wasmSimulateCache) } func (c *Context) GetWatcher() IWatcher { diff --git a/libs/cosmos-sdk/types/handler.go b/libs/cosmos-sdk/types/handler.go index 3f4599f074..07bcd80b28 100644 --- a/libs/cosmos-sdk/types/handler.go +++ b/libs/cosmos-sdk/types/handler.go @@ -3,6 +3,7 @@ package types import ( "github.com/ethereum/go-ethereum/common" + stypes "github.com/okex/exchain/libs/cosmos-sdk/store/types" abci "github.com/okex/exchain/libs/tendermint/abci/types" ) @@ -26,9 +27,13 @@ type UpdateCMTxNonceHandler func(tx Tx, nonce uint64) type UpdateFeeCollectorAccHandler func(ctx Context, balance Coins, txFeesplit []*FeeSplitInfo) error type UpdateCosmosTxCount func(ctx Context, txCount int) +type GetFeeCollectorInfo func(ctx Context, onlyGetFeeCollectorStoreKey bool) (Coins, []byte) + +type GetGasConfigHandler func(ctx Context) *stypes.GasConfig + type LogFix func(tx []Tx, logIndex []int, hasEnterEvmTx []bool, errs []error, resp []abci.ResponseDeliverTx) (logs [][]byte) type UpdateFeeSplitHandler func(txHash common.Hash, addr AccAddress, fee Coins, isDelete bool) -type GetTxFeeAndFromHandler func(ctx Context, tx Tx) (Coins, bool, string, string, error, bool) +type GetTxFeeAndFromHandler func(ctx Context, tx Tx) (Coins, bool, bool, string, string, error, bool) type GetTxFeeHandler func(tx Tx) Coins type CustomizeOnStop func(ctx Context) error @@ -75,21 +80,22 @@ func ChainAnteDecorators(chain ...AnteDecorator) AnteHandler { // Terminator AnteDecorator will get added to the chain to simplify decorator code // Don't need to check if next == nil further up the chain -// ______ -// <((((((\\\ -// / . }\ -// ;--..--._|} -// (\ '--/\--' ) -// \\ | '-' :'| -// \\ . -==- .-| -// \\ \.__.' \--._ -// [\\ __.--| // _/'--. -// \ \\ .'-._ ('-----'/ __/ \ -// \ \\ / __>| | '--. | -// \ \\ | \ | / / / -// \ '\ / \ | | _/ / -// \ \ \ | | / / -// snd \ \ \ / +// +// ______ +// <((((((\\\ +// / . }\ +// ;--..--._|} +// (\ '--/\--' ) +// \\ | '-' :'| +// \\ . -==- .-| +// \\ \.__.' \--._ +// [\\ __.--| // _/'--. +// \ \\ .'-._ ('-----'/ __/ \ +// \ \\ / __>| | '--. | +// \ \\ | \ | / / / +// \ '\ / \ | | _/ / +// \ \ \ | | / / +// snd \ \ \ / type Terminator struct{} const AnteTerminatorTag = "ante-terminator" diff --git a/libs/cosmos-sdk/types/tx_msg.go b/libs/cosmos-sdk/types/tx_msg.go index 5f275fcdc8..5640b10e3d 100644 --- a/libs/cosmos-sdk/types/tx_msg.go +++ b/libs/cosmos-sdk/types/tx_msg.go @@ -54,6 +54,7 @@ type Tx interface { GetRaw() []byte GetFrom() string + GetEthAddr() string GetSender(ctx Context) string GetNonce() uint64 TxHash() []byte @@ -86,6 +87,7 @@ func (tx *BaseTx) GetSigners() []AccAddress { return nil } func (tx *BaseTx) GetGas() uint64 { return 0 } func (tx *BaseTx) GetNonce() uint64 { return tx.Nonce } func (tx *BaseTx) GetFrom() string { return tx.From } +func (tx *BaseTx) GetEthAddr() string { return tx.GetFrom() } func (tx *BaseTx) GetRaw() []byte { return tx.Raw } func (tx *BaseTx) TxHash() []byte { return tx.Hash } func (tx *BaseTx) SetRaw(raw []byte) { tx.Raw = raw } diff --git a/libs/cosmos-sdk/types/uint.go b/libs/cosmos-sdk/types/uint.go index 976b6414a9..42d312c725 100644 --- a/libs/cosmos-sdk/types/uint.go +++ b/libs/cosmos-sdk/types/uint.go @@ -4,6 +4,7 @@ import ( "errors" "fmt" "math/big" + "sync" ) // Uint wraps integer with 256 bit range bound @@ -227,3 +228,19 @@ func RelativePow(x Uint, n Uint, b Uint) (z Uint) { } return z } + +var ( + storePool = sync.Pool{ + New: func() interface{} { + return make(map[string][]byte) + }, + } +) + +func putBackWasmCacheMap(d map[string][]byte) { + storePool.Put(d) +} + +func getWasmCacheMap() map[string][]byte { + return storePool.Get().(map[string][]byte) +} diff --git a/libs/cosmos-sdk/types/utils.go b/libs/cosmos-sdk/types/utils.go index 6da6e1e2e8..dca8183929 100644 --- a/libs/cosmos-sdk/types/utils.go +++ b/libs/cosmos-sdk/types/utils.go @@ -102,6 +102,7 @@ type ParaMsg struct { LogIndex int HasRunEvmTx bool CosmosIndexInBlock int + InvalidExecute bool } type FeeSplitInfo struct { diff --git a/libs/cosmos-sdk/x/auth/ante/sigverify.go b/libs/cosmos-sdk/x/auth/ante/sigverify.go index 361ab327b9..4aaf0e6da0 100644 --- a/libs/cosmos-sdk/x/auth/ante/sigverify.go +++ b/libs/cosmos-sdk/x/auth/ante/sigverify.go @@ -3,6 +3,8 @@ package ante import ( "bytes" "encoding/hex" + + ethcmn "github.com/ethereum/go-ethereum/common" "github.com/okex/exchain/app/crypto/ethsecp256k1" "github.com/okex/exchain/libs/cosmos-sdk/codec" sdk "github.com/okex/exchain/libs/cosmos-sdk/types" @@ -242,13 +244,13 @@ func (svd SigVerificationDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simul } if ctx.IsCheckTx() { if txNonce != 0 { // txNonce first - err := nonceVerification(ctx, signerAccs[i].GetSequence(), txNonce, signerAddrs[i].String(), simulate) + err := nonceVerification(ctx, signerAccs[i].GetSequence(), txNonce, ethcmn.BytesToAddress(signerAddrs[i]).String(), simulate) if err != nil { return ctx, err } signerAccs[i].SetSequence(txNonce) } else { // for adaptive pending tx in mempool just in checkTx but not deliverTx - pendingNonce := getCheckTxNonceFromMempool(signerAddrs[i].String()) + pendingNonce := getCheckTxNonceFromMempool(ethcmn.BytesToAddress(signerAddrs[i]).String()) if pendingNonce != 0 { signerAccs[i].SetSequence(pendingNonce) } @@ -327,7 +329,7 @@ func (isd IncrementSequenceDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, sim acc := isd.ak.GetAccount(ctx, addr) // for adaptive pending tx in mempool just in checkTx but not deliverTx if ctx.IsCheckTx() && !ctx.IsReCheckTx() { - pendingNonce := getCheckTxNonceFromMempool(addr.String()) + pendingNonce := getCheckTxNonceFromMempool(ethcmn.BytesToAddress(addr).String()) if pendingNonce != 0 { acc.SetSequence(pendingNonce) } diff --git a/libs/cosmos-sdk/x/auth/exported/utils.go b/libs/cosmos-sdk/x/auth/exported/utils.go index a30578b1b5..2c704c1377 100644 --- a/libs/cosmos-sdk/x/auth/exported/utils.go +++ b/libs/cosmos-sdk/x/auth/exported/utils.go @@ -5,12 +5,6 @@ import ( sdk "github.com/okex/exchain/libs/cosmos-sdk/types" ) -var kvGasConfig storetypes.GasConfig - -func init() { - kvGasConfig = storetypes.KVGasConfig() -} - type SizerAccountKeeper interface { GetEncodedAccountSize(acc Account) int } @@ -27,6 +21,7 @@ func TryAddGetAccountGas(gasMeter sdk.GasMeter, ak SizerAccountKeeper, acc Accou if size == 0 { return false, 0 } + kvGasConfig := storetypes.KVGasConfig() gas := kvGasConfig.ReadCostFlat + storetypes.Gas(size)*kvGasConfig.ReadCostPerByte gasMeter.ConsumeGas(gas, "x/bank/internal/keeper/keeper.BaseSendKeeper") return true, gas @@ -40,6 +35,7 @@ func GetAccountGas(ak SizerAccountKeeper, acc Account) (sdk.Gas, bool) { if size == 0 { return 0, false } + kvGasConfig := storetypes.KVGasConfig() gas := kvGasConfig.ReadCostFlat + storetypes.Gas(size)*kvGasConfig.ReadCostPerByte return gas, true } diff --git a/libs/cosmos-sdk/x/auth/keeper/account.go b/libs/cosmos-sdk/x/auth/keeper/account.go index d4f45f22ed..bebe5b509a 100644 --- a/libs/cosmos-sdk/x/auth/keeper/account.go +++ b/libs/cosmos-sdk/x/auth/keeper/account.go @@ -138,7 +138,7 @@ func (ak AccountKeeper) SetAccount(ctx sdk.Context, acc exported.Account) { ctx.Cache().UpdateAccount(addr, acc.Copy(), len(bz), true) } - if ctx.IsDeliver() && (tmtypes.HigherThanMars(ctx.BlockHeight()) || mpt.TrieWriteAhead) { + if ctx.IsDeliverWithSerial() && (tmtypes.HigherThanMars(ctx.BlockHeight()) || mpt.TrieWriteAhead) { mpt.GAccToPrefetchChannel <- [][]byte{storeAccKey} } @@ -189,7 +189,7 @@ func (ak AccountKeeper) RemoveAccount(ctx sdk.Context, acc exported.Account) { ctx.MultiStore().GetKVStore(ak.mptKey).Delete(storeAccKey) } - if ctx.IsDeliver() && (tmtypes.HigherThanMars(ctx.BlockHeight()) || mpt.TrieWriteAhead) { + if ctx.IsDeliverWithSerial() && (tmtypes.HigherThanMars(ctx.BlockHeight()) || mpt.TrieWriteAhead) { mpt.GAccToPrefetchChannel <- [][]byte{storeAccKey} } diff --git a/libs/cosmos-sdk/x/auth/types/stdtx.go b/libs/cosmos-sdk/x/auth/types/stdtx.go index 2a2b8dd88d..a0bdd0f36d 100644 --- a/libs/cosmos-sdk/x/auth/types/stdtx.go +++ b/libs/cosmos-sdk/x/auth/types/stdtx.go @@ -5,10 +5,8 @@ import ( "fmt" "math/big" + ethcmn "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/rlp" - "github.com/tendermint/go-amino" - yaml "gopkg.in/yaml.v2" - "github.com/okex/exchain/libs/cosmos-sdk/codec" sdk "github.com/okex/exchain/libs/cosmos-sdk/types" sdkerrors "github.com/okex/exchain/libs/cosmos-sdk/types/errors" @@ -16,6 +14,8 @@ import ( "github.com/okex/exchain/libs/tendermint/crypto" cryptoamino "github.com/okex/exchain/libs/tendermint/crypto/encoding/amino" "github.com/okex/exchain/libs/tendermint/crypto/multisig" + "github.com/tendermint/go-amino" + yaml "gopkg.in/yaml.v2" ) var ( @@ -305,6 +305,14 @@ func (tx *StdTx) GetFrom() string { return signers[0].String() } +func (tx *StdTx) GetEthAddr() string { + signers := tx.GetSigners() + if len(signers) == 0 { + return "" + } + return ethcmn.BytesToAddress(signers[0]).String() +} + func (tx *StdTx) GetSender(_ sdk.Context) string { return tx.GetFrom() } diff --git a/libs/ibc-go/modules/core/04-channel/keeper/grpc_query.go b/libs/ibc-go/modules/core/04-channel/keeper/grpc_query.go index cc5540099e..da0b1647e7 100644 --- a/libs/ibc-go/modules/core/04-channel/keeper/grpc_query.go +++ b/libs/ibc-go/modules/core/04-channel/keeper/grpc_query.go @@ -400,18 +400,55 @@ func (q Keeper) UnreceivedPackets(c context.Context, req *types.QueryUnreceivedP ctx := sdk.UnwrapSDKContext(c) - var unreceivedSequences = []uint64{} + channel, found := q.GetChannel(sdk.UnwrapSDKContext(c), req.PortId, req.ChannelId) + if !found { + return nil, status.Error( + codes.NotFound, + sdkerrors.Wrapf(types.ErrChannelNotFound, "port-id: %s, channel-id %s", req.PortId, req.ChannelId).Error(), + ) + } - for i, seq := range req.PacketCommitmentSequences { - if seq == 0 { - return nil, status.Errorf(codes.InvalidArgument, "packet sequence %d cannot be 0", i) - } + var unreceivedSequences []uint64 + switch channel.Ordering { + case types.UNORDERED: + for i, seq := range req.PacketCommitmentSequences { + // filter for invalid sequences to ensure they are not included in the response value. + if seq == 0 { + return nil, status.Errorf(codes.InvalidArgument, "packet sequence %d cannot be 0", i) + } - // if packet receipt exists on the receiving chain, then packet has already been received - if _, found := q.GetPacketReceipt(ctx, req.PortId, req.ChannelId, seq); !found { - unreceivedSequences = append(unreceivedSequences, seq) + // if the packet receipt does not exist, then it is unreceived + if _, found := q.GetPacketReceipt(ctx, req.PortId, req.ChannelId, seq); !found { + unreceivedSequences = append(unreceivedSequences, seq) + } + } + case types.ORDERED: + nextSequenceRecv, found := q.GetNextSequenceRecv(ctx, req.PortId, req.ChannelId) + if !found { + return nil, status.Error( + codes.NotFound, + sdkerrors.Wrapf( + types.ErrSequenceReceiveNotFound, + "destination port: %s, destination channel: %s", req.PortId, req.ChannelId, + ).Error(), + ) } + for i, seq := range req.PacketCommitmentSequences { + // filter for invalid sequences to ensure they are not included in the response value. + if seq == 0 { + return nil, status.Errorf(codes.InvalidArgument, "packet sequence %d cannot be 0", i) + } + + // Any sequence greater than or equal to the next sequence to be received is not received. + if seq >= nextSequenceRecv { + unreceivedSequences = append(unreceivedSequences, seq) + } + } + default: + return nil, status.Error( + codes.InvalidArgument, + sdkerrors.Wrapf(types.ErrInvalidChannelOrdering, "channel order %s is not supported", channel.Ordering.String()).Error()) } selfHeight := clienttypes.GetSelfHeight(ctx) diff --git a/libs/ibc-go/modules/core/04-channel/keeper/grpc_query_test.go b/libs/ibc-go/modules/core/04-channel/keeper/grpc_query_test.go new file mode 100644 index 0000000000..24abd1bcc8 --- /dev/null +++ b/libs/ibc-go/modules/core/04-channel/keeper/grpc_query_test.go @@ -0,0 +1,1548 @@ +package keeper_test + +import ( + "fmt" + + sdk "github.com/okex/exchain/libs/cosmos-sdk/types" + clienttypes "github.com/okex/exchain/libs/ibc-go/modules/core/02-client/types" + connectiontypes "github.com/okex/exchain/libs/ibc-go/modules/core/03-connection/types" + + "github.com/okex/exchain/libs/cosmos-sdk/types/query" + "github.com/okex/exchain/libs/ibc-go/modules/core/04-channel/types" + "github.com/okex/exchain/libs/ibc-go/modules/core/exported" + ibctesting "github.com/okex/exchain/libs/ibc-go/testing" +) + +func (suite *KeeperTestSuite) TestQueryChannel() { + var ( + req *types.QueryChannelRequest + expChannel types.Channel + ) + + testCases := []struct { + msg string + malleate func() + expPass bool + }{ + { + "empty request", + func() { + req = nil + }, + false, + }, + { + "invalid port ID", + func() { + req = &types.QueryChannelRequest{ + PortId: "", + ChannelId: "test-channel-id", + } + }, + false, + }, + { + "invalid channel ID", + func() { + req = &types.QueryChannelRequest{ + PortId: "test-port-id", + ChannelId: "", + } + }, + false, + }, + { + "channel not found", + func() { + req = &types.QueryChannelRequest{ + PortId: "test-port-id", + ChannelId: "test-channel-id", + } + }, + false, + }, + { + "success", + func() { + path := ibctesting.NewPath(suite.chainA, suite.chainB) + suite.coordinator.SetupConnections(path) + path.SetChannelOrdered() + + // init channel + err := path.EndpointA.ChanOpenInit() + suite.Require().NoError(err) + + expChannel = path.EndpointA.GetChannel() + + req = &types.QueryChannelRequest{ + PortId: path.EndpointA.ChannelConfig.PortID, + ChannelId: path.EndpointA.ChannelID, + } + }, + true, + }, + } + + for _, tc := range testCases { + suite.Run(fmt.Sprintf("Case %s", tc.msg), func() { + suite.SetupTest() // reset + + tc.malleate() + ctx := sdk.WrapSDKContext(suite.chainA.GetContext()) + + res, err := suite.chainA.QueryServer().Channel(ctx, req) + + if tc.expPass { + suite.Require().NoError(err) + suite.Require().NotNil(res) + suite.Require().Equal(&expChannel, res.Channel) + } else { + suite.Require().Error(err) + } + }) + } +} + +func (suite *KeeperTestSuite) TestQueryChannels() { + var ( + req *types.QueryChannelsRequest + expChannels = []*types.IdentifiedChannel{} + ) + + testCases := []struct { + msg string + malleate func() + expPass bool + }{ + { + "empty request", + func() { + req = nil + }, + false, + }, + { + "empty pagination", + func() { + req = &types.QueryChannelsRequest{} + }, + true, + }, + { + "success", + func() { + path := ibctesting.NewPath(suite.chainA, suite.chainB) + suite.coordinator.Setup(path) + // channel0 on first connection on chainA + counterparty0 := types.Counterparty{ + PortId: path.EndpointB.ChannelConfig.PortID, + ChannelId: path.EndpointB.ChannelID, + } + + // path1 creates a second channel on first connection on chainA + path1 := ibctesting.NewPath(suite.chainA, suite.chainB) + path1.SetChannelOrdered() + path1.EndpointA.ClientID = path.EndpointA.ClientID + path1.EndpointB.ClientID = path.EndpointB.ClientID + path1.EndpointA.ConnectionID = path.EndpointA.ConnectionID + path1.EndpointB.ConnectionID = path.EndpointB.ConnectionID + + suite.coordinator.CreateMockChannels(path1) + counterparty1 := types.Counterparty{ + PortId: path1.EndpointB.ChannelConfig.PortID, + ChannelId: path1.EndpointB.ChannelID, + } + + channel0 := types.NewChannel( + types.OPEN, types.UNORDERED, + counterparty0, []string{path.EndpointA.ConnectionID}, path.EndpointA.ChannelConfig.Version, + ) + channel1 := types.NewChannel( + types.OPEN, types.ORDERED, + counterparty1, []string{path.EndpointA.ConnectionID}, path1.EndpointA.ChannelConfig.Version, + ) + + idCh0 := types.NewIdentifiedChannel(path.EndpointA.ChannelConfig.PortID, path.EndpointA.ChannelID, channel0) + idCh1 := types.NewIdentifiedChannel(path1.EndpointA.ChannelConfig.PortID, path1.EndpointA.ChannelID, channel1) + + expChannels = []*types.IdentifiedChannel{&idCh0, &idCh1} + + req = &types.QueryChannelsRequest{ + Pagination: &query.PageRequest{ + Key: nil, + Limit: 2, + CountTotal: true, + }, + } + }, + true, + }, + } + + for _, tc := range testCases { + suite.Run(fmt.Sprintf("Case %s", tc.msg), func() { + suite.SetupTest() // reset + + tc.malleate() + ctx := sdk.WrapSDKContext(suite.chainA.GetContext()) + + res, err := suite.chainA.QueryServer().Channels(ctx, req) + + if tc.expPass { + suite.Require().NoError(err) + suite.Require().NotNil(res) + suite.Require().Equal(expChannels, res.Channels) + suite.Require().Equal(len(expChannels), int(res.Pagination.Total)) + } else { + suite.Require().Error(err) + } + }) + } +} + +func (suite *KeeperTestSuite) TestQueryConnectionChannels() { + var ( + req *types.QueryConnectionChannelsRequest + expChannels = []*types.IdentifiedChannel{} + ) + + testCases := []struct { + msg string + malleate func() + expPass bool + }{ + { + "empty request", + func() { + req = nil + }, + false, + }, + { + "invalid connection ID", + func() { + req = &types.QueryConnectionChannelsRequest{ + Connection: "", + } + }, + false, + }, + { + "success", + func() { + path := ibctesting.NewPath(suite.chainA, suite.chainB) + suite.coordinator.Setup(path) + // channel0 on first connection on chainA + counterparty0 := types.Counterparty{ + PortId: path.EndpointB.ChannelConfig.PortID, + ChannelId: path.EndpointB.ChannelID, + } + + // path1 creates a second channel on first connection on chainA + path1 := ibctesting.NewPath(suite.chainA, suite.chainB) + path1.SetChannelOrdered() + path1.EndpointA.ClientID = path.EndpointA.ClientID + path1.EndpointB.ClientID = path.EndpointB.ClientID + path1.EndpointA.ConnectionID = path.EndpointA.ConnectionID + path1.EndpointB.ConnectionID = path.EndpointB.ConnectionID + + suite.coordinator.CreateMockChannels(path1) + counterparty1 := types.Counterparty{ + PortId: path1.EndpointB.ChannelConfig.PortID, + ChannelId: path1.EndpointB.ChannelID, + } + + channel0 := types.NewChannel( + types.OPEN, types.UNORDERED, + counterparty0, []string{path.EndpointA.ConnectionID}, path.EndpointA.ChannelConfig.Version, + ) + channel1 := types.NewChannel( + types.OPEN, types.ORDERED, + counterparty1, []string{path.EndpointA.ConnectionID}, path.EndpointA.ChannelConfig.Version, + ) + + idCh0 := types.NewIdentifiedChannel(path.EndpointA.ChannelConfig.PortID, path.EndpointA.ChannelID, channel0) + idCh1 := types.NewIdentifiedChannel(path1.EndpointA.ChannelConfig.PortID, path1.EndpointA.ChannelID, channel1) + + expChannels = []*types.IdentifiedChannel{&idCh0, &idCh1} + + req = &types.QueryConnectionChannelsRequest{ + Connection: path.EndpointA.ConnectionID, + Pagination: &query.PageRequest{ + Key: nil, + Limit: 2, + CountTotal: true, + }, + } + }, + true, + }, + { + "success, empty response", + func() { + path := ibctesting.NewPath(suite.chainA, suite.chainB) + suite.coordinator.Setup(path) + expChannels = []*types.IdentifiedChannel{} + req = &types.QueryConnectionChannelsRequest{ + Connection: "externalConnID", + Pagination: &query.PageRequest{ + Key: nil, + Limit: 2, + CountTotal: false, + }, + } + }, + true, + }, + } + + for _, tc := range testCases { + suite.Run(fmt.Sprintf("Case %s", tc.msg), func() { + suite.SetupTest() // reset + + tc.malleate() + ctx := sdk.WrapSDKContext(suite.chainA.GetContext()) + + res, err := suite.chainA.QueryServer().ConnectionChannels(ctx, req) + + if tc.expPass { + suite.Require().NoError(err) + suite.Require().NotNil(res) + suite.Require().Equal(expChannels, res.Channels) + } else { + suite.Require().Error(err) + } + }) + } +} + +func (suite *KeeperTestSuite) TestQueryChannelClientState() { + var ( + req *types.QueryChannelClientStateRequest + expIdentifiedClientState clienttypes.IdentifiedClientState + ) + + testCases := []struct { + msg string + malleate func() + expPass bool + }{ + { + "empty request", + func() { + req = nil + }, + false, + }, + { + "invalid port ID", + func() { + req = &types.QueryChannelClientStateRequest{ + PortId: "", + ChannelId: "test-channel-id", + } + }, + false, + }, + { + "invalid channel ID", + func() { + req = &types.QueryChannelClientStateRequest{ + PortId: "test-port-id", + ChannelId: "", + } + }, + false, + }, + { + "channel not found", + func() { + req = &types.QueryChannelClientStateRequest{ + PortId: "test-port-id", + ChannelId: "test-channel-id", + } + }, + false, + }, + { + "connection not found", + func() { + path := ibctesting.NewPath(suite.chainA, suite.chainB) + suite.coordinator.Setup(path) + + channel := path.EndpointA.GetChannel() + // update channel to reference a connection that does not exist + channel.ConnectionHops[0] = "doesnotexist" + + // set connection hops to wrong connection ID + suite.chainA.App().GetIBCKeeper().ChannelKeeper.SetChannel(suite.chainA.GetContext(), path.EndpointA.ChannelConfig.PortID, path.EndpointA.ChannelID, channel) + + req = &types.QueryChannelClientStateRequest{ + PortId: path.EndpointA.ChannelConfig.PortID, + ChannelId: path.EndpointA.ChannelID, + } + }, false, + }, + { + "client state for channel's connection not found", + func() { + path := ibctesting.NewPath(suite.chainA, suite.chainB) + suite.coordinator.Setup(path) + + // set connection to empty so clientID is empty + suite.chainA.App().GetIBCKeeper().ConnectionKeeper.SetConnection(suite.chainA.GetContext(), path.EndpointA.ConnectionID, connectiontypes.ConnectionEnd{}) + + req = &types.QueryChannelClientStateRequest{ + PortId: path.EndpointA.ChannelConfig.PortID, + ChannelId: path.EndpointA.ChannelID, + } + }, false, + }, + { + "success", + func() { + path := ibctesting.NewPath(suite.chainA, suite.chainB) + suite.coordinator.SetupConnections(path) + path.SetChannelOrdered() + + // init channel + err := path.EndpointA.ChanOpenInit() + suite.Require().NoError(err) + + expClientState := suite.chainA.GetClientState(path.EndpointA.ClientID) + expIdentifiedClientState = clienttypes.NewIdentifiedClientState(path.EndpointA.ClientID, expClientState) + + req = &types.QueryChannelClientStateRequest{ + PortId: path.EndpointA.ChannelConfig.PortID, + ChannelId: path.EndpointA.ChannelID, + } + }, + true, + }, + } + + for _, tc := range testCases { + suite.Run(fmt.Sprintf("Case %s", tc.msg), func() { + suite.SetupTest() // reset + + tc.malleate() + ctx := sdk.WrapSDKContext(suite.chainA.GetContext()) + + res, err := suite.chainA.QueryServer().ChannelClientState(ctx, req) + + if tc.expPass { + suite.Require().NoError(err) + suite.Require().NotNil(res) + suite.Require().Equal(&expIdentifiedClientState, res.IdentifiedClientState) + + // ensure UnpackInterfaces is defined + cachedValue := res.IdentifiedClientState.ClientState.GetCachedValue() + suite.Require().NotNil(cachedValue) + } else { + suite.Require().Error(err) + } + }) + } +} + +func (suite *KeeperTestSuite) TestQueryChannelConsensusState() { + var ( + req *types.QueryChannelConsensusStateRequest + expConsensusState exported.ConsensusState + expClientID string + ) + + testCases := []struct { + msg string + malleate func() + expPass bool + }{ + { + "empty request", + func() { + req = nil + }, + false, + }, + { + "invalid port ID", + func() { + req = &types.QueryChannelConsensusStateRequest{ + PortId: "", + ChannelId: "test-channel-id", + RevisionNumber: 0, + RevisionHeight: 1, + } + }, + false, + }, + { + "invalid channel ID", + func() { + req = &types.QueryChannelConsensusStateRequest{ + PortId: "test-port-id", + ChannelId: "", + RevisionNumber: 0, + RevisionHeight: 1, + } + }, + false, + }, + { + "channel not found", + func() { + req = &types.QueryChannelConsensusStateRequest{ + PortId: "test-port-id", + ChannelId: "test-channel-id", + RevisionNumber: 0, + RevisionHeight: 1, + } + }, + false, + }, + { + "connection not found", + func() { + path := ibctesting.NewPath(suite.chainA, suite.chainB) + suite.coordinator.Setup(path) + + channel := path.EndpointA.GetChannel() + // update channel to reference a connection that does not exist + channel.ConnectionHops[0] = "doesnotexist" + + // set connection hops to wrong connection ID + suite.chainA.App().GetIBCKeeper().ChannelKeeper.SetChannel(suite.chainA.GetContext(), path.EndpointA.ChannelConfig.PortID, path.EndpointA.ChannelID, channel) + + req = &types.QueryChannelConsensusStateRequest{ + PortId: path.EndpointA.ChannelConfig.PortID, + ChannelId: path.EndpointA.ChannelID, + RevisionNumber: 0, + RevisionHeight: 1, + } + }, false, + }, + { + "consensus state for channel's connection not found", + func() { + path := ibctesting.NewPath(suite.chainA, suite.chainB) + suite.coordinator.Setup(path) + ctx := suite.chainA.GetContext() + req = &types.QueryChannelConsensusStateRequest{ + PortId: path.EndpointA.ChannelConfig.PortID, + ChannelId: path.EndpointA.ChannelID, + RevisionNumber: 0, + RevisionHeight: uint64(ctx.BlockHeight()), // use current height + } + }, false, + }, + { + "success", + func() { + path := ibctesting.NewPath(suite.chainA, suite.chainB) + suite.coordinator.SetupConnections(path) + path.SetChannelOrdered() + + // init channel + err := path.EndpointA.ChanOpenInit() + suite.Require().NoError(err) + + clientState := suite.chainA.GetClientState(path.EndpointA.ClientID) + expConsensusState, _ = suite.chainA.GetConsensusState(path.EndpointA.ClientID, clientState.GetLatestHeight()) + suite.Require().NotNil(expConsensusState) + expClientID = path.EndpointA.ClientID + + req = &types.QueryChannelConsensusStateRequest{ + PortId: path.EndpointA.ChannelConfig.PortID, + ChannelId: path.EndpointA.ChannelID, + RevisionNumber: clientState.GetLatestHeight().GetRevisionNumber(), + RevisionHeight: clientState.GetLatestHeight().GetRevisionHeight(), + } + }, + true, + }, + } + + for _, tc := range testCases { + suite.Run(fmt.Sprintf("Case %s", tc.msg), func() { + suite.SetupTest() // reset + + tc.malleate() + ctx := sdk.WrapSDKContext(suite.chainA.GetContext()) + + res, err := suite.chainA.QueryServer().ChannelConsensusState(ctx, req) + + if tc.expPass { + suite.Require().NoError(err) + suite.Require().NotNil(res) + consensusState, err := clienttypes.UnpackConsensusState(res.ConsensusState) + suite.Require().NoError(err) + suite.Require().Equal(expConsensusState, consensusState) + suite.Require().Equal(expClientID, res.ClientId) + + // ensure UnpackInterfaces is defined + cachedValue := res.ConsensusState.GetCachedValue() + suite.Require().NotNil(cachedValue) + } else { + suite.Require().Error(err) + } + }) + } +} + +func (suite *KeeperTestSuite) TestQueryPacketCommitment() { + var ( + req *types.QueryPacketCommitmentRequest + expCommitment []byte + ) + + testCases := []struct { + msg string + malleate func() + expPass bool + }{ + { + "empty request", + func() { + req = nil + }, + false, + }, + { + "invalid port ID", + func() { + req = &types.QueryPacketCommitmentRequest{ + PortId: "", + ChannelId: "test-channel-id", + Sequence: 0, + } + }, + false, + }, + { + "invalid channel ID", + func() { + req = &types.QueryPacketCommitmentRequest{ + PortId: "test-port-id", + ChannelId: "", + Sequence: 0, + } + }, + false, + }, + { + "invalid sequence", + func() { + req = &types.QueryPacketCommitmentRequest{ + PortId: "test-port-id", + ChannelId: "test-channel-id", + Sequence: 0, + } + }, + false, + }, + { + "channel not found", + func() { + req = &types.QueryPacketCommitmentRequest{ + PortId: "test-port-id", + ChannelId: "test-channel-id", + Sequence: 1, + } + }, + false, + }, + { + "success", + func() { + path := ibctesting.NewPath(suite.chainA, suite.chainB) + suite.coordinator.Setup(path) + expCommitment = []byte("hash") + suite.chainA.App().GetIBCKeeper().ChannelKeeper.SetPacketCommitment(suite.chainA.GetContext(), path.EndpointA.ChannelConfig.PortID, path.EndpointA.ChannelID, 1, expCommitment) + + req = &types.QueryPacketCommitmentRequest{ + PortId: path.EndpointA.ChannelConfig.PortID, + ChannelId: path.EndpointA.ChannelID, + Sequence: 1, + } + }, + true, + }, + } + + for _, tc := range testCases { + suite.Run(fmt.Sprintf("Case %s", tc.msg), func() { + suite.SetupTest() // reset + + tc.malleate() + ctx := sdk.WrapSDKContext(suite.chainA.GetContext()) + + res, err := suite.chainA.QueryServer().PacketCommitment(ctx, req) + + if tc.expPass { + suite.Require().NoError(err) + suite.Require().NotNil(res) + suite.Require().Equal(expCommitment, res.Commitment) + } else { + suite.Require().Error(err) + } + }) + } +} + +func (suite *KeeperTestSuite) TestQueryPacketCommitments() { + var ( + req *types.QueryPacketCommitmentsRequest + expCommitments = []*types.PacketState{} + ) + + testCases := []struct { + msg string + malleate func() + expPass bool + }{ + { + "empty request", + func() { + req = nil + }, + false, + }, + { + "invalid ID", + func() { + req = &types.QueryPacketCommitmentsRequest{ + PortId: "", + ChannelId: "test-channel-id", + } + }, + false, + }, + { + "success, empty res", + func() { + expCommitments = []*types.PacketState{} + + req = &types.QueryPacketCommitmentsRequest{ + PortId: "test-port-id", + ChannelId: "test-channel-id", + Pagination: &query.PageRequest{ + Key: nil, + Limit: 2, + CountTotal: true, + }, + } + }, + true, + }, + { + "success", + func() { + path := ibctesting.NewPath(suite.chainA, suite.chainB) + suite.coordinator.Setup(path) + + expCommitments = make([]*types.PacketState, 9) + + for i := uint64(0); i < 9; i++ { + commitment := types.NewPacketState(path.EndpointA.ChannelConfig.PortID, path.EndpointA.ChannelID, i, []byte(fmt.Sprintf("hash_%d", i))) + suite.chainA.App().GetIBCKeeper().ChannelKeeper.SetPacketCommitment(suite.chainA.GetContext(), commitment.PortId, commitment.ChannelId, commitment.Sequence, commitment.Data) + expCommitments[i] = &commitment + } + + req = &types.QueryPacketCommitmentsRequest{ + PortId: path.EndpointA.ChannelConfig.PortID, + ChannelId: path.EndpointA.ChannelID, + Pagination: &query.PageRequest{ + Key: nil, + Limit: 11, + CountTotal: true, + }, + } + }, + true, + }, + } + + for _, tc := range testCases { + suite.Run(fmt.Sprintf("Case %s", tc.msg), func() { + suite.SetupTest() // reset + + tc.malleate() + ctx := sdk.WrapSDKContext(suite.chainA.GetContext()) + + res, err := suite.chainA.QueryServer().PacketCommitments(ctx, req) + + if tc.expPass { + suite.Require().NoError(err) + suite.Require().NotNil(res) + suite.Require().Equal(expCommitments, res.Commitments) + } else { + suite.Require().Error(err) + } + }) + } +} + +func (suite *KeeperTestSuite) TestQueryPacketReceipt() { + var ( + req *types.QueryPacketReceiptRequest + expReceived bool + ) + + testCases := []struct { + msg string + malleate func() + expPass bool + }{ + { + "empty request", + func() { + req = nil + }, + false, + }, + { + "invalid port ID", + func() { + req = &types.QueryPacketReceiptRequest{ + PortId: "", + ChannelId: "test-channel-id", + Sequence: 1, + } + }, + false, + }, + { + "invalid channel ID", + func() { + req = &types.QueryPacketReceiptRequest{ + PortId: "test-port-id", + ChannelId: "", + Sequence: 1, + } + }, + false, + }, + { + "invalid sequence", + func() { + req = &types.QueryPacketReceiptRequest{ + PortId: "test-port-id", + ChannelId: "test-channel-id", + Sequence: 0, + } + }, + false, + }, + { + "success: receipt not found", + func() { + path := ibctesting.NewPath(suite.chainA, suite.chainB) + suite.coordinator.Setup(path) + suite.chainA.App().GetIBCKeeper().ChannelKeeper.SetPacketReceipt(suite.chainA.GetContext(), path.EndpointA.ChannelConfig.PortID, path.EndpointA.ChannelID, 1) + + req = &types.QueryPacketReceiptRequest{ + PortId: path.EndpointA.ChannelConfig.PortID, + ChannelId: path.EndpointA.ChannelID, + Sequence: 3, + } + expReceived = false + }, + true, + }, + { + "success: receipt found", + func() { + path := ibctesting.NewPath(suite.chainA, suite.chainB) + suite.coordinator.Setup(path) + suite.chainA.App().GetIBCKeeper().ChannelKeeper.SetPacketReceipt(suite.chainA.GetContext(), path.EndpointA.ChannelConfig.PortID, path.EndpointA.ChannelID, 1) + + req = &types.QueryPacketReceiptRequest{ + PortId: path.EndpointA.ChannelConfig.PortID, + ChannelId: path.EndpointA.ChannelID, + Sequence: 1, + } + expReceived = true + }, + true, + }, + } + + for _, tc := range testCases { + suite.Run(fmt.Sprintf("Case %s", tc.msg), func() { + suite.SetupTest() // reset + + tc.malleate() + ctx := sdk.WrapSDKContext(suite.chainA.GetContext()) + + res, err := suite.chainA.QueryServer().PacketReceipt(ctx, req) + + if tc.expPass { + suite.Require().NoError(err) + suite.Require().NotNil(res) + suite.Require().Equal(expReceived, res.Received) + } else { + suite.Require().Error(err) + } + }) + } +} + +func (suite *KeeperTestSuite) TestQueryPacketAcknowledgement() { + var ( + req *types.QueryPacketAcknowledgementRequest + expAck []byte + ) + + testCases := []struct { + msg string + malleate func() + expPass bool + }{ + { + "empty request", + func() { + req = nil + }, + false, + }, + { + "invalid port ID", + func() { + req = &types.QueryPacketAcknowledgementRequest{ + PortId: "", + ChannelId: "test-channel-id", + Sequence: 0, + } + }, + false, + }, + { + "invalid channel ID", + func() { + req = &types.QueryPacketAcknowledgementRequest{ + PortId: "test-port-id", + ChannelId: "", + Sequence: 0, + } + }, + false, + }, + { + "invalid sequence", + func() { + req = &types.QueryPacketAcknowledgementRequest{ + PortId: "test-port-id", + ChannelId: "test-channel-id", + Sequence: 0, + } + }, + false, + }, + { + "channel not found", + func() { + req = &types.QueryPacketAcknowledgementRequest{ + PortId: "test-port-id", + ChannelId: "test-channel-id", + Sequence: 1, + } + }, + false, + }, + { + "success", + func() { + path := ibctesting.NewPath(suite.chainA, suite.chainB) + suite.coordinator.Setup(path) + expAck = []byte("hash") + suite.chainA.App().GetIBCKeeper().ChannelKeeper.SetPacketAcknowledgement(suite.chainA.GetContext(), path.EndpointA.ChannelConfig.PortID, path.EndpointA.ChannelID, 1, expAck) + + req = &types.QueryPacketAcknowledgementRequest{ + PortId: path.EndpointA.ChannelConfig.PortID, + ChannelId: path.EndpointA.ChannelID, + Sequence: 1, + } + }, + true, + }, + } + + for _, tc := range testCases { + suite.Run(fmt.Sprintf("Case %s", tc.msg), func() { + suite.SetupTest() // reset + + tc.malleate() + ctx := sdk.WrapSDKContext(suite.chainA.GetContext()) + + res, err := suite.chainA.QueryServer().PacketAcknowledgement(ctx, req) + + if tc.expPass { + suite.Require().NoError(err) + suite.Require().NotNil(res) + suite.Require().Equal(expAck, res.Acknowledgement) + } else { + suite.Require().Error(err) + } + }) + } +} + +func (suite *KeeperTestSuite) TestQueryPacketAcknowledgements() { + var ( + req *types.QueryPacketAcknowledgementsRequest + expAcknowledgements = []*types.PacketState{} + ) + + testCases := []struct { + msg string + malleate func() + expPass bool + }{ + { + "empty request", + func() { + req = nil + }, + false, + }, + { + "invalid ID", + func() { + req = &types.QueryPacketAcknowledgementsRequest{ + PortId: "", + ChannelId: "test-channel-id", + } + }, + false, + }, + { + "success, empty res", + func() { + expAcknowledgements = []*types.PacketState{} + + req = &types.QueryPacketAcknowledgementsRequest{ + PortId: "test-port-id", + ChannelId: "test-channel-id", + Pagination: &query.PageRequest{ + Key: nil, + Limit: 2, + CountTotal: true, + }, + } + }, + true, + }, + { + "success, filtered res", + func() { + path := ibctesting.NewPath(suite.chainA, suite.chainB) + suite.coordinator.Setup(path) + + var commitments []uint64 + + for i := uint64(0); i < 100; i++ { + ack := types.NewPacketState(path.EndpointA.ChannelConfig.PortID, path.EndpointA.ChannelID, i, []byte(fmt.Sprintf("hash_%d", i))) + suite.chainA.App().GetIBCKeeper().ChannelKeeper.SetPacketAcknowledgement(suite.chainA.GetContext(), ack.PortId, ack.ChannelId, ack.Sequence, ack.Data) + + if i < 10 { // populate the store with 100 and query for 10 specific acks + expAcknowledgements = append(expAcknowledgements, &ack) + commitments = append(commitments, ack.Sequence) + } + } + + req = &types.QueryPacketAcknowledgementsRequest{ + PortId: path.EndpointA.ChannelConfig.PortID, + ChannelId: path.EndpointA.ChannelID, + PacketCommitmentSequences: commitments, + Pagination: nil, + } + }, + true, + }, + { + "success", + func() { + path := ibctesting.NewPath(suite.chainA, suite.chainB) + suite.coordinator.Setup(path) + + expAcknowledgements = make([]*types.PacketState, 9) + + for i := uint64(0); i < 9; i++ { + ack := types.NewPacketState(path.EndpointA.ChannelConfig.PortID, path.EndpointA.ChannelID, i, []byte(fmt.Sprintf("hash_%d", i))) + suite.chainA.App().GetIBCKeeper().ChannelKeeper.SetPacketAcknowledgement(suite.chainA.GetContext(), ack.PortId, ack.ChannelId, ack.Sequence, ack.Data) + expAcknowledgements[i] = &ack + } + + req = &types.QueryPacketAcknowledgementsRequest{ + PortId: path.EndpointA.ChannelConfig.PortID, + ChannelId: path.EndpointA.ChannelID, + Pagination: &query.PageRequest{ + Key: nil, + Limit: 11, + CountTotal: true, + }, + } + }, + true, + }, + } + + for _, tc := range testCases { + suite.Run(fmt.Sprintf("Case %s", tc.msg), func() { + suite.SetupTest() // reset + + tc.malleate() + ctx := sdk.WrapSDKContext(suite.chainA.GetContext()) + + res, err := suite.chainA.QueryServer().PacketAcknowledgements(ctx, req) + + if tc.expPass { + suite.Require().NoError(err) + suite.Require().NotNil(res) + suite.Require().Equal(expAcknowledgements, res.Acknowledgements) + } else { + suite.Require().Error(err) + } + }) + } +} + +func (suite *KeeperTestSuite) TestQueryUnreceivedPackets() { + var ( + req *types.QueryUnreceivedPacketsRequest + expSeq = []uint64(nil) + ) + + testCases := []struct { + msg string + malleate func() + expPass bool + }{ + { + "empty request", + func() { + req = nil + }, + false, + }, + { + "invalid port ID", + func() { + req = &types.QueryUnreceivedPacketsRequest{ + PortId: "", + ChannelId: "test-channel-id", + } + }, + false, + }, + { + "invalid channel ID", + func() { + req = &types.QueryUnreceivedPacketsRequest{ + PortId: "test-port-id", + ChannelId: "", + } + }, + false, + }, + { + "invalid seq", + func() { + req = &types.QueryUnreceivedPacketsRequest{ + PortId: "test-port-id", + ChannelId: "test-channel-id", + PacketCommitmentSequences: []uint64{0}, + } + }, + false, + }, + { + "invalid seq, ordered channel", + func() { + path := ibctesting.NewPath(suite.chainA, suite.chainB) + path.SetChannelOrdered() + suite.coordinator.Setup(path) + + req = &types.QueryUnreceivedPacketsRequest{ + PortId: path.EndpointA.ChannelConfig.PortID, + ChannelId: path.EndpointA.ChannelID, + PacketCommitmentSequences: []uint64{0}, + } + }, + false, + }, + { + "channel not found", + func() { + req = &types.QueryUnreceivedPacketsRequest{ + PortId: "invalid-port-id", + ChannelId: "invalid-channel-id", + } + }, + false, + }, + { + "basic success empty packet commitments", + func() { + path := ibctesting.NewPath(suite.chainA, suite.chainB) + suite.coordinator.Setup(path) + + expSeq = []uint64(nil) + req = &types.QueryUnreceivedPacketsRequest{ + PortId: path.EndpointA.ChannelConfig.PortID, + ChannelId: path.EndpointA.ChannelID, + PacketCommitmentSequences: []uint64{}, + } + }, + true, + }, + { + "basic success unreceived packet commitments", + func() { + path := ibctesting.NewPath(suite.chainA, suite.chainB) + suite.coordinator.Setup(path) + + // no ack exists + + expSeq = []uint64{1} + req = &types.QueryUnreceivedPacketsRequest{ + PortId: path.EndpointA.ChannelConfig.PortID, + ChannelId: path.EndpointA.ChannelID, + PacketCommitmentSequences: []uint64{1}, + } + }, + true, + }, + { + "basic success unreceived packet commitments, nothing to relay", + func() { + path := ibctesting.NewPath(suite.chainA, suite.chainB) + suite.coordinator.Setup(path) + + suite.chainA.App().GetIBCKeeper().ChannelKeeper.SetPacketReceipt(suite.chainA.GetContext(), path.EndpointA.ChannelConfig.PortID, path.EndpointA.ChannelID, 1) + + expSeq = []uint64(nil) + req = &types.QueryUnreceivedPacketsRequest{ + PortId: path.EndpointA.ChannelConfig.PortID, + ChannelId: path.EndpointA.ChannelID, + PacketCommitmentSequences: []uint64{1}, + } + }, + true, + }, + { + "success multiple unreceived packet commitments", + func() { + path := ibctesting.NewPath(suite.chainA, suite.chainB) + suite.coordinator.Setup(path) + expSeq = []uint64(nil) // reset + packetCommitments := []uint64{} + + // set packet receipt for every other sequence + for seq := uint64(1); seq < 10; seq++ { + packetCommitments = append(packetCommitments, seq) + + if seq%2 == 0 { + suite.chainA.App().GetIBCKeeper().ChannelKeeper.SetPacketReceipt(suite.chainA.GetContext(), path.EndpointA.ChannelConfig.PortID, path.EndpointA.ChannelID, seq) + } else { + expSeq = append(expSeq, seq) + } + } + + req = &types.QueryUnreceivedPacketsRequest{ + PortId: path.EndpointA.ChannelConfig.PortID, + ChannelId: path.EndpointA.ChannelID, + PacketCommitmentSequences: packetCommitments, + } + }, + true, + }, + { + "basic success empty packet commitments, ordered channel", + func() { + path := ibctesting.NewPath(suite.chainA, suite.chainB) + path.SetChannelOrdered() + suite.coordinator.Setup(path) + + expSeq = []uint64(nil) + req = &types.QueryUnreceivedPacketsRequest{ + PortId: path.EndpointA.ChannelConfig.PortID, + ChannelId: path.EndpointA.ChannelID, + PacketCommitmentSequences: []uint64{}, + } + }, + true, + }, + { + "basic success unreceived packet commitments, ordered channel", + func() { + path := ibctesting.NewPath(suite.chainA, suite.chainB) + path.SetChannelOrdered() + suite.coordinator.Setup(path) + + // Note: NextSequenceRecv is set to 1 on channel creation. + expSeq = []uint64{1} + req = &types.QueryUnreceivedPacketsRequest{ + PortId: path.EndpointA.ChannelConfig.PortID, + ChannelId: path.EndpointA.ChannelID, + PacketCommitmentSequences: []uint64{1}, + } + }, + true, + }, + { + "basic success multiple unreceived packet commitments, ordered channel", + func() { + path := ibctesting.NewPath(suite.chainA, suite.chainB) + path.SetChannelOrdered() + suite.coordinator.Setup(path) + + // Exercise scenario from issue #1532. NextSequenceRecv is 5, packet commitments provided are 2, 7, 9, 10. + // Packet sequence 2 is already received so only sequences 7, 9, 10 should be considered unreceived. + expSeq = []uint64{7, 9, 10} + packetCommitments := []uint64{2, 7, 9, 10} + suite.chainA.App().GetIBCKeeper().ChannelKeeper.SetNextSequenceRecv(suite.chainA.GetContext(), path.EndpointA.ChannelConfig.PortID, path.EndpointA.ChannelID, 5) + + req = &types.QueryUnreceivedPacketsRequest{ + PortId: path.EndpointA.ChannelConfig.PortID, + ChannelId: path.EndpointA.ChannelID, + PacketCommitmentSequences: packetCommitments, + } + }, + true, + }, + } + + for _, tc := range testCases { + suite.Run(fmt.Sprintf("Case %s", tc.msg), func() { + suite.SetupTest() // reset + + tc.malleate() + ctx := sdk.WrapSDKContext(suite.chainA.GetContext()) + + res, err := suite.chainA.QueryServer().UnreceivedPackets(ctx, req) + + if tc.expPass { + suite.Require().NoError(err) + suite.Require().NotNil(res) + suite.Require().Equal(expSeq, res.Sequences) + } else { + suite.Require().Error(err) + } + }) + } +} + +func (suite *KeeperTestSuite) TestQueryUnreceivedAcks() { + var ( + req *types.QueryUnreceivedAcksRequest + expSeq = []uint64{} + ) + + testCases := []struct { + msg string + malleate func() + expPass bool + }{ + { + "empty request", + func() { + req = nil + }, + false, + }, + { + "invalid port ID", + func() { + req = &types.QueryUnreceivedAcksRequest{ + PortId: "", + ChannelId: "test-channel-id", + } + }, + false, + }, + { + "invalid channel ID", + func() { + req = &types.QueryUnreceivedAcksRequest{ + PortId: "test-port-id", + ChannelId: "", + } + }, + false, + }, + { + "invalid seq", + func() { + req = &types.QueryUnreceivedAcksRequest{ + PortId: "test-port-id", + ChannelId: "test-channel-id", + PacketAckSequences: []uint64{0}, + } + }, + false, + }, + { + "basic success unreceived packet acks", + func() { + path := ibctesting.NewPath(suite.chainA, suite.chainB) + suite.coordinator.Setup(path) + + suite.chainA.App().GetIBCKeeper().ChannelKeeper.SetPacketCommitment(suite.chainA.GetContext(), path.EndpointA.ChannelConfig.PortID, path.EndpointA.ChannelID, 1, []byte("commitment")) + + expSeq = []uint64{1} + req = &types.QueryUnreceivedAcksRequest{ + PortId: path.EndpointA.ChannelConfig.PortID, + ChannelId: path.EndpointA.ChannelID, + PacketAckSequences: []uint64{1}, + } + }, + true, + }, + { + "basic success unreceived packet acknowledgements, nothing to relay", + func() { + path := ibctesting.NewPath(suite.chainA, suite.chainB) + suite.coordinator.Setup(path) + + expSeq = []uint64{} + req = &types.QueryUnreceivedAcksRequest{ + PortId: path.EndpointA.ChannelConfig.PortID, + ChannelId: path.EndpointA.ChannelID, + PacketAckSequences: []uint64{1}, + } + }, + true, + }, + { + "success multiple unreceived packet acknowledgements", + func() { + path := ibctesting.NewPath(suite.chainA, suite.chainB) + suite.coordinator.Setup(path) + expSeq = []uint64{} // reset + packetAcks := []uint64{} + + // set packet commitment for every other sequence + for seq := uint64(1); seq < 10; seq++ { + packetAcks = append(packetAcks, seq) + + if seq%2 == 0 { + suite.chainA.App().GetIBCKeeper().ChannelKeeper.SetPacketCommitment(suite.chainA.GetContext(), path.EndpointA.ChannelConfig.PortID, path.EndpointA.ChannelID, seq, []byte("commitement")) + expSeq = append(expSeq, seq) + } + } + + req = &types.QueryUnreceivedAcksRequest{ + PortId: path.EndpointA.ChannelConfig.PortID, + ChannelId: path.EndpointA.ChannelID, + PacketAckSequences: packetAcks, + } + }, + true, + }, + } + + for _, tc := range testCases { + suite.Run(fmt.Sprintf("Case %s", tc.msg), func() { + suite.SetupTest() // reset + + tc.malleate() + ctx := sdk.WrapSDKContext(suite.chainA.GetContext()) + + res, err := suite.chainA.QueryServer().UnreceivedAcks(ctx, req) + + if tc.expPass { + suite.Require().NoError(err) + suite.Require().NotNil(res) + suite.Require().Equal(expSeq, res.Sequences) + } else { + suite.Require().Error(err) + } + }) + } +} + +func (suite *KeeperTestSuite) TestQueryNextSequenceReceive() { + var ( + req *types.QueryNextSequenceReceiveRequest + expSeq uint64 + ) + + testCases := []struct { + msg string + malleate func() + expPass bool + }{ + { + "empty request", + func() { + req = nil + }, + false, + }, + { + "invalid port ID", + func() { + req = &types.QueryNextSequenceReceiveRequest{ + PortId: "", + ChannelId: "test-channel-id", + } + }, + false, + }, + { + "invalid channel ID", + func() { + req = &types.QueryNextSequenceReceiveRequest{ + PortId: "test-port-id", + ChannelId: "", + } + }, + false, + }, + { + "channel not found", + func() { + req = &types.QueryNextSequenceReceiveRequest{ + PortId: "test-port-id", + ChannelId: "test-channel-id", + } + }, + false, + }, + { + "success", + func() { + path := ibctesting.NewPath(suite.chainA, suite.chainB) + suite.coordinator.Setup(path) + expSeq = 1 + suite.chainA.App().GetIBCKeeper().ChannelKeeper.SetNextSequenceRecv(suite.chainA.GetContext(), path.EndpointA.ChannelConfig.PortID, path.EndpointA.ChannelID, expSeq) + + req = &types.QueryNextSequenceReceiveRequest{ + PortId: path.EndpointA.ChannelConfig.PortID, + ChannelId: path.EndpointA.ChannelID, + } + }, + true, + }, + } + + for _, tc := range testCases { + suite.Run(fmt.Sprintf("Case %s", tc.msg), func() { + suite.SetupTest() // reset + + tc.malleate() + ctx := sdk.WrapSDKContext(suite.chainA.GetContext()) + + res, err := suite.chainA.QueryServer().NextSequenceReceive(ctx, req) + + if tc.expPass { + suite.Require().NoError(err) + suite.Require().NotNil(res) + suite.Require().Equal(expSeq, res.NextSequenceReceive) + } else { + suite.Require().Error(err) + } + }) + } +} diff --git a/libs/ibc-go/testing/simapp/app.go b/libs/ibc-go/testing/simapp/app.go index 5634696fe9..b17b053aef 100644 --- a/libs/ibc-go/testing/simapp/app.go +++ b/libs/ibc-go/testing/simapp/app.go @@ -2,9 +2,6 @@ package simapp import ( "fmt" - - evm2 "github.com/okex/exchain/libs/ibc-go/testing/simapp/adapter/evm" - "io" "math/big" "os" @@ -13,50 +10,10 @@ import ( "strings" "sync" - ibctransfer "github.com/okex/exchain/libs/ibc-go/modules/apps/transfer" - - "github.com/okex/exchain/libs/ibc-go/testing/simapp/adapter/fee" - - ica2 "github.com/okex/exchain/libs/ibc-go/testing/simapp/adapter/ica" - - "github.com/okex/exchain/libs/ibc-go/modules/apps/common" - - "github.com/okex/exchain/libs/tendermint/libs/cli" - - icahost "github.com/okex/exchain/libs/ibc-go/modules/apps/27-interchain-accounts/host" - - icacontroller "github.com/okex/exchain/libs/ibc-go/modules/apps/27-interchain-accounts/controller" - - ibcclienttypes "github.com/okex/exchain/libs/ibc-go/modules/core/02-client/types" - - ibccommon "github.com/okex/exchain/libs/ibc-go/modules/core/common" - - icamauthtypes "github.com/okex/exchain/x/icamauth/types" - - icacontrollertypes "github.com/okex/exchain/libs/ibc-go/modules/apps/27-interchain-accounts/controller/types" - icahosttypes "github.com/okex/exchain/libs/ibc-go/modules/apps/27-interchain-accounts/host/types" - "github.com/spf13/viper" - - icatypes "github.com/okex/exchain/libs/ibc-go/modules/apps/27-interchain-accounts/types" - - ibckeeper "github.com/okex/exchain/libs/ibc-go/modules/core/keeper" - "google.golang.org/grpc/encoding" "google.golang.org/grpc/encoding/proto" - authante "github.com/okex/exchain/libs/cosmos-sdk/x/auth/ante" - icacontrollerkeeper "github.com/okex/exchain/libs/ibc-go/modules/apps/27-interchain-accounts/controller/keeper" - icahostkeeper "github.com/okex/exchain/libs/ibc-go/modules/apps/27-interchain-accounts/host/keeper" - ibcfee "github.com/okex/exchain/libs/ibc-go/modules/apps/29-fee" - ibcfeekeeper "github.com/okex/exchain/libs/ibc-go/modules/apps/29-fee/keeper" - ibcfeetypes "github.com/okex/exchain/libs/ibc-go/modules/apps/29-fee/types" - "github.com/okex/exchain/libs/system/trace" - "github.com/okex/exchain/x/icamauth" - icamauthkeeper "github.com/okex/exchain/x/icamauth/keeper" - "github.com/okex/exchain/x/wasm" - wasmkeeper "github.com/okex/exchain/x/wasm/keeper" - "github.com/okex/exchain/app/ante" okexchaincodec "github.com/okex/exchain/app/codec" appconfig "github.com/okex/exchain/app/config" @@ -64,6 +21,7 @@ import ( ethermint "github.com/okex/exchain/app/types" okexchain "github.com/okex/exchain/app/types" "github.com/okex/exchain/app/utils/sanity" + "github.com/okex/exchain/libs/cosmos-sdk/baseapp" bam "github.com/okex/exchain/libs/cosmos-sdk/baseapp" "github.com/okex/exchain/libs/cosmos-sdk/client" "github.com/okex/exchain/libs/cosmos-sdk/codec" @@ -76,6 +34,7 @@ import ( upgradetypes "github.com/okex/exchain/libs/cosmos-sdk/types/upgrade" "github.com/okex/exchain/libs/cosmos-sdk/version" "github.com/okex/exchain/libs/cosmos-sdk/x/auth" + authante "github.com/okex/exchain/libs/cosmos-sdk/x/auth/ante" authtypes "github.com/okex/exchain/libs/cosmos-sdk/x/auth/types" "github.com/okex/exchain/libs/cosmos-sdk/x/bank" capabilityModule "github.com/okex/exchain/libs/cosmos-sdk/x/capability" @@ -87,18 +46,38 @@ import ( "github.com/okex/exchain/libs/cosmos-sdk/x/params/subspace" "github.com/okex/exchain/libs/cosmos-sdk/x/supply" "github.com/okex/exchain/libs/cosmos-sdk/x/upgrade" + icacontroller "github.com/okex/exchain/libs/ibc-go/modules/apps/27-interchain-accounts/controller" + icacontrollerkeeper "github.com/okex/exchain/libs/ibc-go/modules/apps/27-interchain-accounts/controller/keeper" + icacontrollertypes "github.com/okex/exchain/libs/ibc-go/modules/apps/27-interchain-accounts/controller/types" + icahost "github.com/okex/exchain/libs/ibc-go/modules/apps/27-interchain-accounts/host" + icahostkeeper "github.com/okex/exchain/libs/ibc-go/modules/apps/27-interchain-accounts/host/keeper" + icahosttypes "github.com/okex/exchain/libs/ibc-go/modules/apps/27-interchain-accounts/host/types" + icatypes "github.com/okex/exchain/libs/ibc-go/modules/apps/27-interchain-accounts/types" + ibcfee "github.com/okex/exchain/libs/ibc-go/modules/apps/29-fee" + ibcfeekeeper "github.com/okex/exchain/libs/ibc-go/modules/apps/29-fee/keeper" + ibcfeetypes "github.com/okex/exchain/libs/ibc-go/modules/apps/29-fee/types" + "github.com/okex/exchain/libs/ibc-go/modules/apps/common" + ibctransfer "github.com/okex/exchain/libs/ibc-go/modules/apps/transfer" ibctransferkeeper "github.com/okex/exchain/libs/ibc-go/modules/apps/transfer/keeper" ibctransfertypes "github.com/okex/exchain/libs/ibc-go/modules/apps/transfer/types" ibc "github.com/okex/exchain/libs/ibc-go/modules/core" ibcclient "github.com/okex/exchain/libs/ibc-go/modules/core/02-client" + ibcclienttypes "github.com/okex/exchain/libs/ibc-go/modules/core/02-client/types" ibcporttypes "github.com/okex/exchain/libs/ibc-go/modules/core/05-port/types" ibchost "github.com/okex/exchain/libs/ibc-go/modules/core/24-host" + ibccommon "github.com/okex/exchain/libs/ibc-go/modules/core/common" + ibckeeper "github.com/okex/exchain/libs/ibc-go/modules/core/keeper" "github.com/okex/exchain/libs/ibc-go/testing/mock" "github.com/okex/exchain/libs/ibc-go/testing/simapp/adapter/capability" "github.com/okex/exchain/libs/ibc-go/testing/simapp/adapter/core" + evm2 "github.com/okex/exchain/libs/ibc-go/testing/simapp/adapter/evm" + "github.com/okex/exchain/libs/ibc-go/testing/simapp/adapter/fee" + ica2 "github.com/okex/exchain/libs/ibc-go/testing/simapp/adapter/ica" staking2 "github.com/okex/exchain/libs/ibc-go/testing/simapp/adapter/staking" "github.com/okex/exchain/libs/ibc-go/testing/simapp/adapter/transfer" + "github.com/okex/exchain/libs/system/trace" abci "github.com/okex/exchain/libs/tendermint/abci/types" + "github.com/okex/exchain/libs/tendermint/libs/cli" "github.com/okex/exchain/libs/tendermint/libs/log" tmos "github.com/okex/exchain/libs/tendermint/libs/os" tmtypes "github.com/okex/exchain/libs/tendermint/types" @@ -120,13 +99,18 @@ import ( "github.com/okex/exchain/x/genutil" "github.com/okex/exchain/x/gov" "github.com/okex/exchain/x/gov/keeper" + "github.com/okex/exchain/x/icamauth" + icamauthkeeper "github.com/okex/exchain/x/icamauth/keeper" + icamauthtypes "github.com/okex/exchain/x/icamauth/types" "github.com/okex/exchain/x/order" "github.com/okex/exchain/x/params" paramsclient "github.com/okex/exchain/x/params/client" "github.com/okex/exchain/x/slashing" "github.com/okex/exchain/x/staking" "github.com/okex/exchain/x/token" + "github.com/okex/exchain/x/wasm" wasmclient "github.com/okex/exchain/x/wasm/client" + wasmkeeper "github.com/okex/exchain/x/wasm/keeper" ) func init() { @@ -765,8 +749,9 @@ func NewSimApp( app.SetAccNonceHandler(NewAccHandler(app.AccountKeeper)) app.SetUpdateWasmTxCount(fixCosmosTxCountInWasmForParallelTx(app.WasmHandler.TXCounterStoreKey)) app.SetUpdateFeeCollectorAccHandler(updateFeeCollectorHandler(app.BankKeeper, app.SupplyKeeper.Keeper)) + app.SetGetFeeCollectorInfo(getFeeCollectorInfo(app.BankKeeper, app.SupplyKeeper.Keeper)) app.SetParallelTxLogHandlers(fixLogForParallelTxHandler(app.EvmKeeper)) - app.SetPartialConcurrentHandlers(getTxFeeAndFromHandler(app.AccountKeeper)) + app.SetPartialConcurrentHandlers(getTxFeeAndFromHandler(app.EvmKeeper)) app.SetGetTxFeeHandler(getTxFeeHandler()) app.SetEvmSysContractAddressHandler(NewEvmSysContractAddressHandler(app.EvmKeeper)) app.SetEvmWatcherCollector(func(...sdk.IWatcher) {}) @@ -792,7 +777,19 @@ func NewSimApp( func updateFeeCollectorHandler(bk bank.Keeper, sk supply.Keeper) sdk.UpdateFeeCollectorAccHandler { return func(ctx sdk.Context, balance sdk.Coins, txFeesplit []*sdk.FeeSplitInfo) error { - return bk.SetCoins(ctx, sk.GetModuleAccount(ctx, auth.FeeCollectorName).GetAddress(), balance) + if !balance.Empty() { + return bk.SetCoins(ctx, sk.GetModuleAccount(ctx, auth.FeeCollectorName).GetAddress(), balance) + } + return nil + } +} + +func getFeeCollectorInfo(bk bank.Keeper, sk supply.Keeper) sdk.GetFeeCollectorInfo { + return func(ctx sdk.Context, onlyGetFeeCollectorStoreKey bool) (sdk.Coins, []byte) { + if onlyGetFeeCollectorStoreKey { + return sdk.Coins{}, auth.AddressStoreKey(sk.GetModuleAddress(auth.FeeCollectorName)) + } + return bk.GetCoins(ctx, sk.GetModuleAddress(auth.FeeCollectorName)), nil } } @@ -812,10 +809,20 @@ func evmTxVerifySigHandler(chainID string, blockHeight int64, evmTx *evmtypes.Ms } return nil } -func getTxFeeAndFromHandler(ak auth.AccountKeeper) sdk.GetTxFeeAndFromHandler { - return func(ctx sdk.Context, tx sdk.Tx) (fee sdk.Coins, isEvm bool, from string, to string, err error, supportPara bool) { + +func getTxFeeAndFromHandler(ek ante.EVMKeeper) sdk.GetTxFeeAndFromHandler { + return func(ctx sdk.Context, tx sdk.Tx) (fee sdk.Coins, isEvm bool, isE2C bool, from string, to string, err error, supportPara bool) { if evmTx, ok := tx.(*evmtypes.MsgEthereumTx); ok { isEvm = true + supportPara = true + if ante.IsE2CTx(ek, &ctx, evmTx) { + isE2C = true + // E2C will include cosmos Msg in the Payload. + // Sometimes, this Msg do not support parallel execution. + if !isParaSupportedE2CMsg(evmTx.Data.Payload) { + supportPara = false + } + } err = evmTxVerifySigHandler(ctx.ChainID(), ctx.BlockHeight(), evmTx) if err != nil { return @@ -854,6 +861,28 @@ func getTxFeeHandler() sdk.GetTxFeeHandler { } } +func isParaSupportedE2CMsg(payload []byte) bool { + // Here, payload must be E2C's Data.Payload + p, err := evm.ParseContractParam(payload) + if err != nil { + return false + } + mw, err := baseapp.ParseMsgWrapper(p) + if err != nil { + return false + } + switch mw.Name { + case "wasm/MsgInstantiateContract": + return false + case "wasm/MsgMigrateContract": + return false + case "wasm/MsgUpdateAdmin": + return false + default: + return true + } +} + func (app *SimApp) SetOption(req abci.RequestSetOption) (res abci.ResponseSetOption) { if req.Key == "CheckChainID" { if err := okexchain.IsValidateChainIdWithGenesisHeight(req.Value); err != nil { diff --git a/libs/rocksdb/install.sh b/libs/rocksdb/install.sh index 45d4883287..80a210b3ad 100755 --- a/libs/rocksdb/install.sh +++ b/libs/rocksdb/install.sh @@ -54,7 +54,7 @@ install_linux() { $sh_c "cd rocksdb && make uninstall" $sh_c "cd rocksdb && make clean PREFIX=/usr LIBDIR=/usr/lib" $sh_c "cd rocksdb && make uninstall PREFIX=/usr LIBDIR=/usr/lib" - $sh_c "cd rocksdb && make -j${num_proc} DISABLE_JEMALLOC=1 shared_lib PREFIX=/usr LIBDIR=/usr/lib" + $sh_c "cd rocksdb && ROCKSDB_DISABLE_TCMALLOC=1 make -j${num_proc} DISABLE_JEMALLOC=1 shared_lib PREFIX=/usr LIBDIR=/usr/lib" $sh_c "cd rocksdb && make install-shared PREFIX=/usr LIBDIR=/usr/lib" $sh_c "ldconfig" } @@ -64,7 +64,7 @@ install_macos(){ $sh_c "cd rocksdb && git checkout ${VERSION}" $sh_c "cd rocksdb && make clean" $sh_c "cd rocksdb && make uninstall DEBUG_LEVEL=0" - $sh_c "cd rocksdb && make -j${num_proc} shared_lib EXTRA_CXXFLAGS='-Wno-deprecated-copy -Wno-unused-but-set-variable'" + $sh_c "cd rocksdb && ROCKSDB_DISABLE_TCMALLOC=1 make -j${num_proc} DISABLE_JEMALLOC=1 shared_lib EXTRA_CXXFLAGS='-Wno-deprecated-copy -Wno-unused-but-set-variable'" $sh_c "cd rocksdb && make install-shared" } diff --git a/libs/scripts/system.sh b/libs/scripts/system.sh new file mode 100755 index 0000000000..a4846face0 --- /dev/null +++ b/libs/scripts/system.sh @@ -0,0 +1,56 @@ +#!/bin/sh +#set -e + +get_distribution() { + lsb_dist="" + # Every system that we officially support has /etc/os-release + if [ -r /etc/os-release ]; then + lsb_dist="$(. /etc/os-release && echo "$ID")" + fi + # Returning an empty string here should be alright since the + # case statements don't act unless you provide an actual value + echo "$lsb_dist" +} + +is_darwin() { + case "$(uname -s)" in + *darwin*) true ;; + *Darwin*) true ;; + *) false ;; + esac +} + +get_system_version() { + lsb_dist=$(get_distribution) + lsb_dist="$(echo "$lsb_dist" | tr '[:upper:]' '[:lower:]')" + system_version= + case "$lsb_dist" in + ubuntu) + system_version="ubuntu" + ;; + centos) + system_version="centos" + ;; + alpine) + system_version="alpine" + ;; + *) + if [ -z "$lsb_dist" ]; then + if is_darwin; then + system_version="macos" + fi + else + echo + echo "ERROR: Unsupported system '$lsb_dist', only support centos,ubuntu,alpine,macos" + echo + exit 1 + fi + ;; + esac + + # checkout go version + + echo "$system_version" +} + +echo $(get_system_version) diff --git a/libs/scripts/wasm_static_install.sh b/libs/scripts/wasm_static_install.sh new file mode 100755 index 0000000000..abd8a528d3 --- /dev/null +++ b/libs/scripts/wasm_static_install.sh @@ -0,0 +1,18 @@ +#!/bin/sh +#set -e + +echo "install wasm static lib with sudo" +installWasmLib() { + if [ -r /usr/local/lib/libwasmvm_muslc.a ]; then + exit 0 + elif [ -r /lib/libwasmvm_muslc.a ]; then + exit 0 + fi + wget --no-check-certificate "https://github.com/CosmWasm/wasmvm/releases/download/v1.0.0/libwasmvm_muslc.x86_64.a" -O /usr/local/lib/libwasmvm_muslc.x86_64.a + cp /usr/local/lib/libwasmvm_muslc.x86_64.a /usr/local/lib/libwasmvm_muslc.a + echo "install wasm static lib success" +} + +installWasmLib + + diff --git a/libs/tendermint/abci/types/tx.go b/libs/tendermint/abci/types/tx.go index 739fee4ad6..90f0d451e8 100644 --- a/libs/tendermint/abci/types/tx.go +++ b/libs/tendermint/abci/types/tx.go @@ -5,7 +5,7 @@ import "math/big" type TxEssentials interface { GetRaw() []byte TxHash() []byte - GetFrom() string + GetEthAddr() string GetNonce() uint64 GetGasPrice() *big.Int } @@ -26,7 +26,7 @@ func (tx MockTx) TxHash() []byte { return tx.Hash } -func (tx MockTx) GetFrom() string { +func (tx MockTx) GetEthAddr() string { return tx.From } diff --git a/libs/tendermint/blockchain/v0/reactor.go b/libs/tendermint/blockchain/v0/reactor.go index d0b8914531..7c4c438451 100644 --- a/libs/tendermint/blockchain/v0/reactor.go +++ b/libs/tendermint/blockchain/v0/reactor.go @@ -383,6 +383,7 @@ FOR_LOOP: // TODO: same thing for app - but we would need a way to // get the hash without persisting the state var err error + bcR.curState, _, err = bcR.blockExec.ApplyBlockWithTrace(bcR.curState, firstID, first) // rpc if err != nil { // TODO This is bad, are we zombie? diff --git a/libs/tendermint/cmd/tendermint/commands/run_node.go b/libs/tendermint/cmd/tendermint/commands/run_node.go index 579b9d792b..a576e84763 100644 --- a/libs/tendermint/cmd/tendermint/commands/run_node.go +++ b/libs/tendermint/cmd/tendermint/commands/run_node.go @@ -121,6 +121,11 @@ func AddNodeFlags(cmd *cobra.Command) { config.Mempool.EnableDeleteMinGPTx, "Enable delete the minimum gas price tx from mempool when mempool is full", ) + cmd.Flags().String( + "mempool.pending-pool-blacklist", + "", + "Set the address blacklist of the pending pool, separated by commas", + ) cmd.Flags().Int64( "mempool.max_gas_used_per_block", config.Mempool.MaxGasUsedPerBlock, diff --git a/libs/tendermint/config/dynamic_config_okchain.go b/libs/tendermint/config/dynamic_config_okchain.go index 470cdc2d0f..a7ae0d9da7 100644 --- a/libs/tendermint/config/dynamic_config_okchain.go +++ b/libs/tendermint/config/dynamic_config_okchain.go @@ -39,6 +39,7 @@ type IDynamicConfig interface { GetGasLimitBuffer() uint64 GetEnableMempoolSimGuFactor() bool GetMaxSubscriptionClients() int + GetPendingPoolBlacklist() string } var DynamicConfig IDynamicConfig = MockDynamicConfig{} @@ -223,3 +224,7 @@ func (d *MockDynamicConfig) SetMaxSubscriptionClients(value int) { } d.maxSubscriptionClients = value } + +func (d MockDynamicConfig) GetPendingPoolBlacklist() string { + return "" +} diff --git a/libs/tendermint/mempool/clist_mempool.go b/libs/tendermint/mempool/clist_mempool.go index 4de4878011..e0ca25b8db 100644 --- a/libs/tendermint/mempool/clist_mempool.go +++ b/libs/tendermint/mempool/clist_mempool.go @@ -710,7 +710,7 @@ func (mem *CListMempool) resCbFirstTime( realTx: r.CheckTx.Tx, nodeKey: txInfo.wtx.GetNodeKey(), signature: txInfo.wtx.GetSignature(), - from: r.CheckTx.Tx.GetFrom(), + from: r.CheckTx.Tx.GetEthAddr(), senderNonce: r.CheckTx.SenderNonce, } if txInfo.isGasPrecise { @@ -791,7 +791,7 @@ func (mem *CListMempool) resCbRecheck(req *abci.Request, res *abci.Response) { if mem.config.PendingRemoveEvent { mem.rmPendingTxChan <- types.EventDataRmPendingTx{ memTx.realTx.TxHash(), - memTx.realTx.GetFrom(), + memTx.realTx.GetEthAddr(), memTx.realTx.GetNonce(), types.Recheck, } @@ -1278,6 +1278,23 @@ func (memTx *mempoolTx) Height() int64 { return atomic.LoadInt64(&memTx.height) } +func (memTx *mempoolTx) ToWrappedMempoolTx() types.WrappedMempoolTx { + return types.WrappedMempoolTx{ + Height: memTx.height, + GasWanted: memTx.gasWanted, + GasLimit: memTx.gasLimit, + Tx: memTx.tx, + NodeKey: memTx.nodeKey, + Signature: memTx.signature, + From: memTx.from, + SenderNonce: memTx.senderNonce, + Outdated: memTx.isOutdated, + IsSim: memTx.isSim, + IsWrapCMTx: memTx.isWrapCMTx, + WrapCMNonce: memTx.wrapCMNonce, + } +} + //-------------------------------------------------------------------------------- type txCache interface { @@ -1485,7 +1502,7 @@ func (mem *CListMempool) deleteMinGPTxOnlyFull() { mem.cache.RemoveKey(txOrTxHashToKey(removeMemTx.tx, removeMemTxHash, removeMemTx.Height())) if mem.config.PendingRemoveEvent { - mem.rmPendingTxChan <- types.EventDataRmPendingTx{removeMemTxHash, removeMemTx.realTx.GetFrom(), removeMemTx.realTx.GetNonce(), types.MinGasPrice} + mem.rmPendingTxChan <- types.EventDataRmPendingTx{removeMemTxHash, removeMemTx.realTx.GetEthAddr(), removeMemTx.realTx.GetNonce(), types.MinGasPrice} } } } @@ -1493,3 +1510,7 @@ func (mem *CListMempool) deleteMinGPTxOnlyFull() { func (mem *CListMempool) GetEnableDeleteMinGPTx() bool { return cfg.DynamicConfig.GetEnableDeleteMinGPTx() } + +func (mem *CListMempool) GetPendingPoolTxsBytes() map[string]map[string]types.WrappedMempoolTx { + return mem.pendingPool.GetWrappedAddressTxsMap() +} diff --git a/libs/tendermint/mempool/exchain_pending_pool.go b/libs/tendermint/mempool/exchain_pending_pool.go index 5d587b91b0..5f409e5816 100644 --- a/libs/tendermint/mempool/exchain_pending_pool.go +++ b/libs/tendermint/mempool/exchain_pending_pool.go @@ -1,8 +1,11 @@ package mempool import ( + "strconv" + "strings" "sync" + cfg "github.com/okex/exchain/libs/tendermint/config" "github.com/okex/exchain/libs/tendermint/types" ) @@ -39,6 +42,21 @@ func (p *PendingPool) Size() int { return len(p.txsMap) } +func (p *PendingPool) GetWrappedAddressTxsMap() map[string]map[string]types.WrappedMempoolTx { + p.mtx.RLock() + defer p.mtx.RUnlock() + wrappedAddressTxsMap := make(map[string]map[string]types.WrappedMempoolTx) + for address, subMap := range p.addressTxsMap { + nonceTxsMap := make(map[string]types.WrappedMempoolTx) + for nonce, memTxPtr := range subMap { + nonceStr := strconv.Itoa(int(nonce)) + nonceTxsMap[nonceStr] = memTxPtr.ToWrappedMempoolTx() + } + wrappedAddressTxsMap[address] = nonceTxsMap + } + return wrappedAddressTxsMap +} + func (p *PendingPool) txCount(address string) int { p.mtx.RLock() defer p.mtx.RUnlock() @@ -67,6 +85,14 @@ func (p *PendingPool) hasTx(tx types.Tx, height int64) bool { func (p *PendingPool) addTx(pendingTx *mempoolTx) { p.mtx.Lock() defer p.mtx.Unlock() + blacklist := strings.Split(cfg.DynamicConfig.GetPendingPoolBlacklist(), ",") + // When cfg.DynamicConfig.GetPendingPoolBlacklist() == "", blacklist == []string{""} and len(blacklist) == 1. + // Above case should be avoided. + for _, address := range blacklist { + if address != "" && pendingTx.from == address { + return + } + } if _, ok := p.addressTxsMap[pendingTx.from]; !ok { p.addressTxsMap[pendingTx.from] = make(map[uint64]*mempoolTx) } diff --git a/libs/tendermint/mempool/mempool.go b/libs/tendermint/mempool/mempool.go index 63e71eb121..53d41feda3 100644 --- a/libs/tendermint/mempool/mempool.go +++ b/libs/tendermint/mempool/mempool.go @@ -3,6 +3,7 @@ package mempool import ( "crypto/sha256" "fmt" + abci "github.com/okex/exchain/libs/tendermint/abci/types" cfg "github.com/okex/exchain/libs/tendermint/config" "github.com/okex/exchain/libs/tendermint/p2p" @@ -92,6 +93,8 @@ type Mempool interface { GetTxSimulateGas(txHash string) int64 GetEnableDeleteMinGPTx() bool + + GetPendingPoolTxsBytes() map[string]map[string]types.WrappedMempoolTx } //-------------------------------------------------------------------------------- diff --git a/libs/tendermint/mock/mempool.go b/libs/tendermint/mock/mempool.go index cfe11a1dfd..1530c5c123 100644 --- a/libs/tendermint/mock/mempool.go +++ b/libs/tendermint/mock/mempool.go @@ -3,6 +3,7 @@ package mock import ( "crypto/sha256" "fmt" + "github.com/okex/exchain/libs/system/trace" abci "github.com/okex/exchain/libs/tendermint/abci/types" @@ -85,3 +86,7 @@ func (Mempool) SetEnableDeleteMinGPTx(enable bool) { func (Mempool) GetEnableDeleteMinGPTx() bool { return false } + +func (Mempool) GetPendingPoolTxsBytes() map[string]map[string]types.WrappedMempoolTx { + return make(map[string]map[string]types.WrappedMempoolTx) +} diff --git a/libs/tendermint/rpc/core/mempool.go b/libs/tendermint/rpc/core/mempool.go index cd26774c4b..a0c3f8c1a6 100644 --- a/libs/tendermint/rpc/core/mempool.go +++ b/libs/tendermint/rpc/core/mempool.go @@ -8,6 +8,7 @@ import ( "github.com/pkg/errors" + "github.com/okex/exchain/libs/cosmos-sdk/baseapp" abci "github.com/okex/exchain/libs/tendermint/abci/types" "github.com/okex/exchain/libs/tendermint/config" mempl "github.com/okex/exchain/libs/tendermint/mempool" @@ -171,12 +172,20 @@ func UserUnconfirmedTxs(address string, limit int) (*ctypes.ResultUserUnconfirme Txs: txs}, nil } +func TmUserUnconfirmedTxs(ctx *rpctypes.Context, address string, limit int) (*ctypes.ResultUserUnconfirmedTxs, error) { + return UserUnconfirmedTxs(address, limit) +} + func UserNumUnconfirmedTxs(address string) (*ctypes.ResultUserUnconfirmedTxs, error) { nums := env.Mempool.ReapUserTxsCnt(address) return &ctypes.ResultUserUnconfirmedTxs{ Count: nums}, nil } +func TmUserNumUnconfirmedTxs(ctx *rpctypes.Context, address string) (*ctypes.ResultUserUnconfirmedTxs, error) { + return UserNumUnconfirmedTxs(address) +} + func GetUnconfirmedTxByHash(hash [sha256.Size]byte) (types.Tx, error) { return env.Mempool.GetTxByHash(hash) } @@ -188,6 +197,10 @@ func GetAddressList() (*ctypes.ResultUnconfirmedAddresses, error) { }, nil } +func TmGetAddressList(ctx *rpctypes.Context) (*ctypes.ResultUnconfirmedAddresses, error) { + return GetAddressList() +} + func GetPendingNonce(address string) (*ctypes.ResultPendingNonce, bool) { nonce, ok := env.Mempool.GetPendingNonce(address) if !ok { @@ -202,3 +215,11 @@ func GetEnableDeleteMinGPTx(ctx *rpctypes.Context) (*ctypes.ResultEnableDeleteMi status := env.Mempool.GetEnableDeleteMinGPTx() return &ctypes.ResultEnableDeleteMinGPTx{Enable: status}, nil } + +func GetPendingTxs(ctx *rpctypes.Context) (*ctypes.ResultPendingTxs, error) { + pendingTx := make(map[string]map[string]types.WrappedMempoolTx) + if baseapp.IsMempoolEnablePendingPool() { + pendingTx = env.Mempool.GetPendingPoolTxsBytes() + } + return &ctypes.ResultPendingTxs{Txs: pendingTx}, nil +} diff --git a/libs/tendermint/rpc/core/routes.go b/libs/tendermint/rpc/core/routes.go index efb6610ed1..02f3fb5ab7 100644 --- a/libs/tendermint/rpc/core/routes.go +++ b/libs/tendermint/rpc/core/routes.go @@ -33,9 +33,9 @@ var Routes = map[string]*rpc.RPCFunc{ "consensus_params": rpc.NewRPCFunc(ConsensusParams, "height"), "unconfirmed_txs": rpc.NewRPCFunc(UnconfirmedTxs, "limit"), "num_unconfirmed_txs": rpc.NewRPCFunc(NumUnconfirmedTxs, ""), - "user_unconfirmed_txs": rpc.NewRPCFunc(UserUnconfirmedTxs, "address,limit"), - "user_num_unconfirmed_txs": rpc.NewRPCFunc(UserNumUnconfirmedTxs, "address"), - "get_address_list": rpc.NewRPCFunc(GetAddressList, ""), + "user_unconfirmed_txs": rpc.NewRPCFunc(TmUserUnconfirmedTxs, "address,limit"), + "user_num_unconfirmed_txs": rpc.NewRPCFunc(TmUserNumUnconfirmedTxs, "address"), + "get_address_list": rpc.NewRPCFunc(TmGetAddressList, ""), "block_search": rpc.NewRPCFunc(BlockSearch, "query,page,per_page,order_by"), // tx broadcast API @@ -53,6 +53,8 @@ var Routes = map[string]*rpc.RPCFunc{ "tx_simulate_gas": rpc.NewRPCFunc(TxSimulateGasCost, "hash"), "get_enable_delete_min_gp_tx": rpc.NewRPCFunc(GetEnableDeleteMinGPTx, ""), + + "pending_txs": rpc.NewRPCFunc(GetPendingTxs, ""), } func AddUnsafeRoutes() { diff --git a/libs/tendermint/rpc/core/types/responses.go b/libs/tendermint/rpc/core/types/responses.go index f5835d7e7a..4cfbe43bb2 100644 --- a/libs/tendermint/rpc/core/types/responses.go +++ b/libs/tendermint/rpc/core/types/responses.go @@ -237,6 +237,10 @@ type ResultEnableDeleteMinGPTx struct { Enable bool `json:"enable"` } +type ResultPendingTxs struct { + Txs map[string]map[string]types.WrappedMempoolTx `json:"pending_txs"` +} + // empty results type ( ResultUnsafeFlushMempool struct{} diff --git a/libs/tendermint/state/execution.go b/libs/tendermint/state/execution.go index a162076caa..808601bf58 100644 --- a/libs/tendermint/state/execution.go +++ b/libs/tendermint/state/execution.go @@ -208,6 +208,7 @@ func (blockExec *BlockExecutor) ApplyBlock( f, t := PprofStart() defer PprofEnd(int(block.Height), f, t) } + trc := trace.NewTracer(trace.ApplyBlock) trc.EnableSummary() trc.SetWorkloadStatistic(trace.GetApplyBlockWorkloadSttistic()) @@ -224,6 +225,7 @@ func (blockExec *BlockExecutor) ApplyBlock( now := time.Now().UnixNano() blockExec.metrics.IntervalTime.Set(float64(now-blockExec.metrics.lastBlockTime) / 1e6) blockExec.metrics.lastBlockTime = now + blockExec.metrics.CommittedHeight.Set(float64(block.Height)) }() if err := blockExec.ValidateBlock(state, block); err != nil { diff --git a/libs/tendermint/state/execution_dds.go b/libs/tendermint/state/execution_dds.go index f9bb79ca66..6df9e8cad2 100644 --- a/libs/tendermint/state/execution_dds.go +++ b/libs/tendermint/state/execution_dds.go @@ -191,14 +191,14 @@ func (dc *DeltaContext) postApplyBlock(height int64, deltaInfo *DeltaInfo, } // delta producer - if dc.uploadDelta { + if dc.uploadDelta && !types.WasmStoreCode { trace.GetElapsedInfo().AddInfo(trace.Delta, fmt.Sprintf("ratio<%.2f>", dc.hitRatio())) wdFunc := evmWatchDataManager.CreateWatchDataGenerator() wasmWdFunc := wasmWatchDataManager.CreateWatchDataGenerator() go dc.uploadData(height, abciResponses, deltaMap, wdFunc, wasmWdFunc) - } + types.WasmStoreCode = false } func (dc *DeltaContext) uploadData(height int64, abciResponses *ABCIResponses, deltaMap interface{}, wdFunc, wasmWdFunc func() ([]byte, error)) { diff --git a/libs/tendermint/state/metrics.go b/libs/tendermint/state/metrics.go index ffa55c4c10..4133727381 100644 --- a/libs/tendermint/state/metrics.go +++ b/libs/tendermint/state/metrics.go @@ -27,6 +27,8 @@ type Metrics struct { AbciTime metrics.Gauge // Time during commiting app state CommitTime metrics.Gauge + + CommittedHeight metrics.Gauge } // PrometheusMetrics returns Metrics build using Prometheus client library. @@ -64,6 +66,12 @@ func PrometheusMetrics(namespace string, labelsAndValues ...string) *Metrics { Name: "block_commit_time", Help: "Time during commiting app state in ms.", }, labels).With(labelsAndValues...), + CommittedHeight: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{ + Namespace: namespace, + Subsystem: MetricsSubsystem, + Name: "monitor_block_height", + Help: "The block height.", + }, labels).With(labelsAndValues...), } } @@ -75,5 +83,6 @@ func NopMetrics() *Metrics { lastBlockTime: time.Now().UnixNano(), AbciTime: discard.NewGauge(), CommitTime: discard.NewGauge(), + CommittedHeight: discard.NewGauge(), } } diff --git a/libs/tendermint/types/deltas.go b/libs/tendermint/types/deltas.go index 6694c86458..4718895edb 100644 --- a/libs/tendermint/types/deltas.go +++ b/libs/tendermint/types/deltas.go @@ -42,6 +42,7 @@ var ( FastQuery = false DownloadDelta = false UploadDelta = false + WasmStoreCode = false ) type DeltasMessage struct { diff --git a/libs/tendermint/types/tx.go b/libs/tendermint/types/tx.go index 53481ed137..e809fb1298 100644 --- a/libs/tendermint/types/tx.go +++ b/libs/tendermint/types/tx.go @@ -4,14 +4,16 @@ import ( "bytes" "errors" "fmt" + ethcmn "github.com/ethereum/go-ethereum/common" + "github.com/tendermint/go-amino" + abci "github.com/okex/exchain/libs/tendermint/abci/types" "github.com/okex/exchain/libs/tendermint/crypto/etherhash" "github.com/okex/exchain/libs/tendermint/crypto/merkle" "github.com/okex/exchain/libs/tendermint/crypto/tmhash" tmbytes "github.com/okex/exchain/libs/tendermint/libs/bytes" - "github.com/tendermint/go-amino" ) // Tx is an arbitrary byte array. @@ -210,3 +212,18 @@ func ComputeAminoOverhead(tx Tx, fieldNum int) int64 { typ3AndFieldNum := (fnum << 3) | uint64(amino.Typ3_ByteLength) return int64(amino.UvarintSize(typ3AndFieldNum)) + int64(amino.UvarintSize(uint64(len(tx)))) } + +type WrappedMempoolTx struct { + Height int64 `json:"height"` + GasWanted int64 `json:"gas_wanted"` + GasLimit int64 `json:"gas_limit"` + Tx Tx `json:"tx"` + NodeKey []byte `json:"node_key"` + Signature []byte `json:"signature"` + From string `json:"from"` + SenderNonce uint64 `json:"sender_nonce"` + Outdated uint32 `json:"outdated"` + IsSim uint32 `json:"is_sim"` + IsWrapCMTx bool `json:"is_wrap_cm_tx"` + WrapCMNonce uint64 `json:"wrap_cm_nonce"` +} diff --git a/networks/local/node/Dockerfile b/networks/local/node/Dockerfile index 4a963361fc..c76ed35a5b 100644 --- a/networks/local/node/Dockerfile +++ b/networks/local/node/Dockerfile @@ -13,7 +13,7 @@ COPY . . RUN make build-linux # Final image -FROM golang:1.17 as final +FROM golang:1.20 as final WORKDIR /exchaind # Copy over binaries from the build-env diff --git a/x/evm/handler.go b/x/evm/handler.go index c15e23dcc3..04097ca072 100644 --- a/x/evm/handler.go +++ b/x/evm/handler.go @@ -16,7 +16,7 @@ func NewHandler(k *Keeper) sdk.Handler { return func(ctx sdk.Context, msg sdk.Msg) (result *sdk.Result, err error) { ctx.SetEventManager(sdk.NewEventManager()) - if ctx.IsDeliver() { + if ctx.IsDeliverWithSerial() { k.EvmStateDb.WithContext(ctx).MarkUpdatedAcc(k.UpdatedAccount) k.UpdatedAccount = k.UpdatedAccount[:0] } @@ -42,7 +42,7 @@ func updateHGU(ctx sdk.Context, msg sdk.Msg) { if cfg.DynamicConfig.GetMaxGasUsedPerBlock() <= 0 { return } - + msgFnSignature, toDeployContractSize := getMsgCallFnSignature(msg) if msgFnSignature == nil { diff --git a/x/evm/handler_test.go b/x/evm/handler_test.go index 59ac45807f..e607ec4e6c 100644 --- a/x/evm/handler_test.go +++ b/x/evm/handler_test.go @@ -29,7 +29,8 @@ import ( ) // erc20 contract with params: -// initial_supply:1000000000, token_name:btc, token_symbol:btc +// +// initial_supply:1000000000, token_name:btc, token_symbol:btc const hexPayloadContractDeployment = "0x60806040526012600260006101000a81548160ff021916908360ff1602179055503480156200002d57600080fd5b506040516200129738038062001297833981018060405281019080805190602001909291908051820192919060200180518201929190505050600260009054906101000a900460ff1660ff16600a0a8302600381905550600354600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160009080519060200190620000e292919062000105565b508060019080519060200190620000fb92919062000105565b50505050620001b4565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200014857805160ff191683800117855562000179565b8280016001018555821562000179579182015b82811115620001785782518255916020019190600101906200015b565b5b5090506200018891906200018c565b5090565b620001b191905b80821115620001ad57600081600090555060010162000193565b5090565b90565b6110d380620001c46000396000f3006080604052600436106100ba576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde03146100bf578063095ea7b31461014f57806318160ddd146101b457806323b872dd146101df578063313ce5671461026457806342966c681461029557806370a08231146102da57806379cc67901461033157806395d89b4114610396578063a9059cbb14610426578063cae9ca5114610473578063dd62ed3e1461051e575b600080fd5b3480156100cb57600080fd5b506100d4610595565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156101145780820151818401526020810190506100f9565b50505050905090810190601f1680156101415780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561015b57600080fd5b5061019a600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610633565b604051808215151515815260200191505060405180910390f35b3480156101c057600080fd5b506101c96106c0565b6040518082815260200191505060405180910390f35b3480156101eb57600080fd5b5061024a600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506106c6565b604051808215151515815260200191505060405180910390f35b34801561027057600080fd5b506102796107f3565b604051808260ff1660ff16815260200191505060405180910390f35b3480156102a157600080fd5b506102c060048036038101908080359060200190929190505050610806565b604051808215151515815260200191505060405180910390f35b3480156102e657600080fd5b5061031b600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061090a565b6040518082815260200191505060405180910390f35b34801561033d57600080fd5b5061037c600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610922565b604051808215151515815260200191505060405180910390f35b3480156103a257600080fd5b506103ab610b3c565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103eb5780820151818401526020810190506103d0565b50505050905090810190601f1680156104185780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561043257600080fd5b50610471600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610bda565b005b34801561047f57600080fd5b50610504600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290505050610be9565b604051808215151515815260200191505060405180910390f35b34801561052a57600080fd5b5061057f600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610d6c565b6040518082815260200191505060405180910390f35b60008054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561062b5780601f106106005761010080835404028352916020019161062b565b820191906000526020600020905b81548152906001019060200180831161060e57829003601f168201915b505050505081565b600081600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506001905092915050565b60035481565b6000600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054821115151561075357600080fd5b81600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506107e8848484610d91565b600190509392505050565b600260009054906101000a900460ff1681565b600081600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015151561085657600080fd5b81600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540392505081905550816003600082825403925050819055503373ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5836040518082815260200191505060405180910390a260019050919050565b60046020528060005260406000206000915090505481565b600081600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015151561097257600080fd5b600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482111515156109fd57600080fd5b81600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254039250508190555081600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540392505081905550816003600082825403925050819055508273ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5836040518082815260200191505060405180910390a26001905092915050565b60018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610bd25780601f10610ba757610100808354040283529160200191610bd2565b820191906000526020600020905b815481529060010190602001808311610bb557829003601f168201915b505050505081565b610be5338383610d91565b5050565b600080849050610bf98585610633565b15610d63578073ffffffffffffffffffffffffffffffffffffffff16638f4ffcb1338630876040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610cf3578082015181840152602081019050610cd8565b50505050905090810190601f168015610d205780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b158015610d4257600080fd5b505af1158015610d56573d6000803e3d6000fd5b5050505060019150610d64565b5b509392505050565b6005602052816000526040600020602052806000526040600020600091509150505481565b6000808373ffffffffffffffffffffffffffffffffffffffff1614151515610db857600080fd5b81600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410151515610e0657600080fd5b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205401111515610e9457600080fd5b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205401905081600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254039250508190555081600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a380600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054011415156110a157fe5b505050505600a165627a7a72305820ed94dd1ff19d5d05f76d2df0d1cb9002bb293a6fbb55f287f36aff57fba1b0420029000000000000000000000000000000000000000000000000000000003b9aca00000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000003627463000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036274630000000000000000000000000000000000000000000000000000000000" type EvmTestSuite struct { @@ -50,7 +51,7 @@ func (suite *EvmTestSuite) SetupTest() { suite.app = app.Setup(checkTx) suite.ctx = suite.app.BaseApp.NewContext(checkTx, abci.Header{Height: 1, ChainID: chain_id, Time: time.Now().UTC()}) - suite.ctx.SetDeliver() + suite.ctx.SetDeliverSerial() suite.stateDB = types.CreateEmptyCommitStateDB(suite.app.EvmKeeper.GenerateCSDBParams(), suite.ctx) suite.handler = evm.NewHandler(suite.app.EvmKeeper) suite.querier = keeper.NewQuerier(*suite.app.EvmKeeper) @@ -613,12 +614,12 @@ func (suite *EvmTestSuite) TestSimulateConflict() { suite.Require().NoError(err) suite.ctx.SetGasMeter(sdk.NewInfiniteGasMeter()) - suite.ctx.SetIsCheckTx(true).SetIsDeliverTx(false) + suite.ctx.SetIsCheckTx(true).SetIsDeliverTxSerial(false) result, err := suite.handler(suite.ctx, tx) suite.Require().NotNil(result) suite.Require().Nil(err) - suite.ctx.SetIsCheckTx(false).SetIsDeliverTx(true) + suite.ctx.SetIsCheckTx(false).SetIsDeliverTxSerial(true) result, err = suite.handler(suite.ctx, tx) suite.Require().NotNil(result) suite.Require().Nil(err) @@ -798,7 +799,7 @@ func (suite *EvmContractBlockedListTestSuite) SetupTest() { suite.app = app.Setup(checkTx) suite.ctx = suite.app.BaseApp.NewContext(checkTx, abci.Header{Height: 1, ChainID: "ethermint-3", Time: time.Now().UTC()}) - suite.ctx.SetDeliver() + suite.ctx.SetDeliverSerial() suite.stateDB = types.CreateEmptyCommitStateDB(suite.app.EvmKeeper.GenerateCSDBParams(), suite.ctx) suite.handler = evm.NewHandler(suite.app.EvmKeeper) @@ -1037,7 +1038,7 @@ func (suite *EvmContractBlockedListTestSuite) TestEvmParamsAndContractMethodBloc for _, tc := range testCases { suite.Run(tc.msg, func() { - suite.ctx.SetIsDeliverTx(true).SetIsCheckTx(false) + suite.ctx.SetIsDeliverTxSerial(true).SetIsCheckTx(false) // set contract code suite.stateDB.CreateAccount(callEthAcc) diff --git a/x/evm/keeper/params_test.go b/x/evm/keeper/params_test.go index 01ef7a5371..2f72225abf 100644 --- a/x/evm/keeper/params_test.go +++ b/x/evm/keeper/params_test.go @@ -10,9 +10,9 @@ func (suite *KeeperTestSuite) TestParams() { suite.app.EvmKeeper.SetParams(suite.ctx, params) newParams := suite.app.EvmKeeper.GetParams(suite.ctx) suite.Require().Equal(newParams, params) - newParams = suite.app.EvmKeeper.GetParams(*suite.ctx.SetDeliver()) + newParams = suite.app.EvmKeeper.GetParams(*suite.ctx.SetDeliverSerial()) suite.Require().Equal(newParams, params) types.GetEvmParamsCache().UpdateParams(params, false) - newParams = suite.app.EvmKeeper.GetParams(*suite.ctx.SetDeliver()) + newParams = suite.app.EvmKeeper.GetParams(*suite.ctx.SetDeliverSerial()) suite.Require().Equal(newParams, params) } diff --git a/x/evm/txs/base/common.go b/x/evm/txs/base/common.go index 7170002e9c..1889ea7f14 100644 --- a/x/evm/txs/base/common.go +++ b/x/evm/txs/base/common.go @@ -56,7 +56,7 @@ func msg2st(ctx *sdk.Context, k *Keeper, msg *types.MsgEthereumTx, st *types.Sta st.TraceTxLog = ctx.IsTraceTxLog() st.SetCallToCM(k.GetCallToCM()) - if tmtypes.HigherThanMars(ctx.BlockHeight()) && ctx.IsDeliver() { + if tmtypes.HigherThanMars(ctx.BlockHeight()) && ctx.IsDeliverWithSerial() { st.Csdb = k.EvmStateDb.WithContext(*ctx) } else { csdb := getCommitStateDB() diff --git a/x/evm/types/msg_evm.go b/x/evm/types/msg_evm.go index 73479a598f..6803e39c8a 100644 --- a/x/evm/types/msg_evm.go +++ b/x/evm/types/msg_evm.go @@ -76,6 +76,10 @@ func (tx *MsgEthereumTx) GetFrom() string { return from } +func (tx *MsgEthereumTx) GetEthAddr() string { + return tx.GetFrom() +} + func (msg MsgEthereumTx) GetSender(ctx sdk.Context) string { chainID, err := ethermint.ParseChainID(ctx.ChainID()) if err != nil { diff --git a/x/evm/types/state_transition.go b/x/evm/types/state_transition.go index aba1223498..a21354e824 100644 --- a/x/evm/types/state_transition.go +++ b/x/evm/types/state_transition.go @@ -7,9 +7,6 @@ import ( "math/big" "strings" - "github.com/okex/exchain/libs/system/trace" - "github.com/okex/exchain/libs/tendermint/types" - "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" @@ -21,6 +18,8 @@ import ( sdk "github.com/okex/exchain/libs/cosmos-sdk/types" sdkerrors "github.com/okex/exchain/libs/cosmos-sdk/types/errors" "github.com/okex/exchain/libs/cosmos-sdk/types/innertx" + "github.com/okex/exchain/libs/system/trace" + "github.com/okex/exchain/libs/tendermint/types" ) // StateTransition defines data to transitionDB in evm @@ -328,19 +327,20 @@ func (st StateTransition) TransitionDb(ctx sdk.Context, config ChainConfig) (exe // return trace log if tracetxlog no matter err = nil or not nil defer func() { var traceLogs []byte + var traceErr error if st.TraceTxLog { result := &core.ExecutionResult{ UsedGas: gasConsumed, Err: err, ReturnData: ret, } - traceLogs, err = GetTracerResult(tracer, result) - if err != nil { - traceLogs = []byte(err.Error()) + traceLogs, traceErr = GetTracerResult(tracer, result) + if traceErr != nil { + traceLogs = []byte(traceErr.Error()) } else { - traceLogs, err = integratePreimage(csdb, traceLogs) - if err != nil { - traceLogs = []byte(err.Error()) + traceLogs, traceErr = integratePreimage(csdb, traceLogs) + if traceErr != nil { + traceLogs = []byte(traceErr.Error()) } } if exeRes == nil { @@ -384,7 +384,7 @@ func (st StateTransition) TransitionDb(ctx sdk.Context, config ChainConfig) (exe if !st.Simulate { if types.HigherThanMars(ctx.BlockHeight()) { - if ctx.IsDeliver() { + if ctx.IsDeliverWithSerial() { csdb.IntermediateRoot(true) } } else { diff --git a/x/evm/types/statedb_protect_test.go b/x/evm/types/statedb_protect_test.go index c3776f854c..b23869a051 100644 --- a/x/evm/types/statedb_protect_test.go +++ b/x/evm/types/statedb_protect_test.go @@ -43,7 +43,7 @@ func (suite *StateDB_ProtectTestSuite) SetupTest() { suite.app = app.Setup(checkTx) suite.ctx = suite.app.BaseApp.NewContext(checkTx, abci.Header{Height: 1, ChainID: "ethermint-1"}) - suite.ctx.SetDeliver() + suite.ctx.SetDeliverSerial() suite.stateDB = types.CreateEmptyCommitStateDB(suite.app.EvmKeeper.GenerateCSDBParams(), suite.ctx) privkey, err := ethsecp256k1.GenerateKey() diff --git a/x/evm/types/statedb_test.go b/x/evm/types/statedb_test.go index 29850634b0..d1ab0a88ce 100644 --- a/x/evm/types/statedb_test.go +++ b/x/evm/types/statedb_test.go @@ -37,7 +37,7 @@ func (suite *StateDBTestSuite) SetupTest() { suite.app = app.Setup(checkTx) suite.ctx = suite.app.BaseApp.NewContext(checkTx, abci.Header{Height: 1, ChainID: "ethermint-1"}) - suite.ctx.SetDeliver() + suite.ctx.SetDeliverSerial() suite.stateDB = types.CreateEmptyCommitStateDB(suite.app.EvmKeeper.GenerateCSDBParams(), suite.ctx) privkey, err := ethsecp256k1.GenerateKey() diff --git a/x/evm/watcher/watcher_test.go b/x/evm/watcher/watcher_test.go index f9bedcaea2..ba79bf7118 100644 --- a/x/evm/watcher/watcher_test.go +++ b/x/evm/watcher/watcher_test.go @@ -69,7 +69,7 @@ func setupTest() *WatcherTestSt { w.app = app.Setup(checkTx) w.ctx = w.app.BaseApp.NewContext(checkTx, abci.Header{Height: 1, ChainID: chain_id, Time: time.Now().UTC()}) - w.ctx.SetDeliver() + w.ctx.SetDeliverSerial() w.handler = evm.NewHandler(w.app.EvmKeeper) ethermint.SetChainId(chain_id) diff --git a/x/feesplit/keeper/fee_splits.go b/x/feesplit/keeper/fee_splits.go index e3ba8238f0..37a5f81bbb 100644 --- a/x/feesplit/keeper/fee_splits.go +++ b/x/feesplit/keeper/fee_splits.go @@ -94,7 +94,7 @@ func (k Keeper) SetFeeSplit(ctx sdk.Context, feeSplit types.FeeSplit) { store.Set(key.Bytes(), bz) // update cache - if ctx.IsDeliver() || ctx.ParaMsg() != nil { + if ctx.IsDeliverWithSerial() || ctx.ParaMsg() != nil { types.GetParamsCache().UpdateFeeSplit(feeSplit.ContractAddress, feeSplit, ctx.IsCheckTx()) } } @@ -106,7 +106,7 @@ func (k Keeper) DeleteFeeSplit(ctx sdk.Context, feeSplit types.FeeSplit) { store.Delete(key.Bytes()) // update cache - if ctx.IsDeliver() || ctx.ParaMsg() != nil { + if ctx.IsDeliverWithSerial() || ctx.ParaMsg() != nil { types.GetParamsCache().DeleteFeeSplit(feeSplit.ContractAddress, ctx.IsCheckTx()) } } @@ -196,7 +196,7 @@ func (k Keeper) SetContractShare( store.Set(contract.Bytes(), share.Bytes()) // update cache - if ctx.IsDeliver() || ctx.ParaMsg() != nil { + if ctx.IsDeliverWithSerial() || ctx.ParaMsg() != nil { types.GetParamsCache().UpdateShare(contract, share, ctx.IsCheckTx()) } } diff --git a/x/params/client/cli/query.go b/x/params/client/cli/query.go index 02bde8d18e..15b92f56f3 100644 --- a/x/params/client/cli/query.go +++ b/x/params/client/cli/query.go @@ -22,6 +22,7 @@ func GetQueryCmd(queryRoute string, cdc *codec.Codec) *cobra.Command { queryCmd.AddCommand(flags.GetCommands( GetCmdQueryParams(queryRoute, cdc), GetCmdQueryUpgrade(queryRoute, cdc), + GetCmdQueryGasConfig(queryRoute, cdc), )...) return queryCmd @@ -52,3 +53,29 @@ $ exchaincli query params params }, } } + +// GetCmdQueryParams implements the query params command. +func GetCmdQueryGasConfig(queryRoute string, cdc *codec.Codec) *cobra.Command { + return &cobra.Command{ + Use: "gasconfig", + Short: "Query parameters of gasconfig", + Long: strings.TrimSpace(`Query parameters of gasconfig: + +$ exchaincli query params gasconfig +`), + Args: cobra.NoArgs, + RunE: func(_ *cobra.Command, _ []string) error { + cliCtx := context.NewCLIContext().WithCodec(cdc) + + route := fmt.Sprintf("custom/%s/%s", queryRoute, types.QueryGasConfig) + bz, _, err := cliCtx.QueryWithData(route, nil) + if err != nil { + return err + } + + var params types.GasConfig + cdc.MustUnmarshalJSON(bz, ¶ms) + return cliCtx.PrintOutput(params.GasConfig) + }, + } +} diff --git a/x/params/keeper.go b/x/params/keeper.go index 5a414768a2..47a2ffa4e4 100644 --- a/x/params/keeper.go +++ b/x/params/keeper.go @@ -4,6 +4,7 @@ import ( "fmt" "github.com/okex/exchain/libs/cosmos-sdk/codec" + stypes "github.com/okex/exchain/libs/cosmos-sdk/store/types" sdk "github.com/okex/exchain/libs/cosmos-sdk/types" sdkparams "github.com/okex/exchain/libs/cosmos-sdk/x/params" "github.com/okex/exchain/libs/tendermint/libs/log" @@ -71,3 +72,16 @@ func (keeper Keeper) GetParams(ctx sdk.Context) types.Params { keeper.paramSpace.GetParamSet(ctx, ¶ms) return params } + +func (keeper Keeper) GetGasConfig(ctx sdk.Context) *stypes.GasConfig { + params := keeper.getGasConfig(ctx) + return ¶ms.GasConfig +} + +func (keeper Keeper) getGasConfig(ctx sdk.Context) (params types.GasConfig) { + for _, pair := range params.ParamSetPairs() { + keeper.paramSpace.GetIfExists(ctx, pair.Key, pair.Value) + } + stypes.AsDefaultGasConfig(¶ms.GasConfig) + return +} diff --git a/x/params/keeper_test.go b/x/params/keeper_test.go new file mode 100644 index 0000000000..e7dbd08f68 --- /dev/null +++ b/x/params/keeper_test.go @@ -0,0 +1,137 @@ +package params + +import ( + "github.com/okex/exchain/x/params/types" + "testing" + + "github.com/okex/exchain/libs/cosmos-sdk/store" + storetypes "github.com/okex/exchain/libs/cosmos-sdk/store/types" + sdk "github.com/okex/exchain/libs/cosmos-sdk/types" + abci "github.com/okex/exchain/libs/tendermint/abci/types" + "github.com/okex/exchain/libs/tendermint/libs/log" + tmdb "github.com/okex/exchain/libs/tm-db" + "github.com/stretchr/testify/suite" +) + +type KeeperSuite struct { + suite.Suite + ms storetypes.CommitMultiStore + paramsKeeper Keeper +} + +func (suite *KeeperSuite) SetupTest() { + db := tmdb.NewMemDB() + storeKey := sdk.NewKVStoreKey(StoreKey) + tstoreKey := sdk.NewTransientStoreKey(TStoreKey) + + suite.ms = store.NewCommitMultiStore(tmdb.NewMemDB()) + suite.ms.MountStoreWithDB(storeKey, sdk.StoreTypeIAVL, db) + suite.ms.MountStoreWithDB(tstoreKey, sdk.StoreTypeTransient, db) + err := suite.ms.LoadLatestVersion() + suite.NoError(err) + + suite.paramsKeeper = NewKeeper(ModuleCdc, storeKey, tstoreKey, log.NewNopLogger()) +} + +func (suite *KeeperSuite) Context(height int64) sdk.Context { + return sdk.NewContext(suite.ms, abci.Header{Height: height}, false, log.NewNopLogger()) +} + +func TestKeeper(t *testing.T) { + suite.Run(t, new(KeeperSuite)) +} + +func (suite *KeeperSuite) TestGetGasConfig() { + sub := "params" + tests := []struct { + changes []types.ParamChange + fncheck func(res storetypes.GasConfig) + }{ + { + changes: []types.ParamChange{{Subspace: sub, Key: storetypes.GasHasDesc, Value: "\"100\""}}, + fncheck: func(res storetypes.GasConfig) { + gs := storetypes.GetDefaultGasConfig() + gs.HasCost = 100 + suite.Equal(*gs, res) + }, + }, + { + changes: []types.ParamChange{{Subspace: sub, Key: storetypes.GasDeleteDesc, Value: "\"10\""}}, + fncheck: func(res storetypes.GasConfig) { + gs := storetypes.GetDefaultGasConfig() + gs.HasCost = 100 + gs.DeleteCost = 10 + suite.Equal(*gs, res) + }, + }, + { + changes: []types.ParamChange{{Subspace: sub, Key: storetypes.GasReadCostFlatDesc, Value: "\"10\""}}, + fncheck: func(res storetypes.GasConfig) { + gs := storetypes.GetDefaultGasConfig() + gs.HasCost = 100 + gs.DeleteCost = 10 + gs.ReadCostFlat = 10 + suite.Equal(*gs, res) + }, + }, + { + changes: []types.ParamChange{{Subspace: sub, Key: storetypes.GasReadPerByteDesc, Value: "\"10\""}}, + fncheck: func(res storetypes.GasConfig) { + gs := storetypes.GetDefaultGasConfig() + gs.HasCost = 100 + gs.DeleteCost = 10 + gs.ReadCostFlat = 10 + gs.ReadCostPerByte = 10 + suite.Equal(*gs, res) + }, + }, + { + changes: []types.ParamChange{{Subspace: sub, Key: storetypes.GasWriteCostFlatDesc, Value: "\"10\""}}, + fncheck: func(res storetypes.GasConfig) { + gs := storetypes.GetDefaultGasConfig() + gs.HasCost = 100 + gs.DeleteCost = 10 + gs.ReadCostFlat = 10 + gs.ReadCostPerByte = 10 + gs.WriteCostFlat = 10 + suite.Equal(*gs, res) + }, + }, + { + changes: []types.ParamChange{{Subspace: sub, Key: storetypes.GasWritePerByteDesc, Value: "\"10\""}}, + fncheck: func(res storetypes.GasConfig) { + gs := storetypes.GetDefaultGasConfig() + gs.HasCost = 100 + gs.DeleteCost = 10 + gs.ReadCostFlat = 10 + gs.ReadCostPerByte = 10 + gs.WriteCostFlat = 10 + gs.WriteCostPerByte = 10 + suite.Equal(*gs, res) + }, + }, + { + changes: []types.ParamChange{{Subspace: sub, Key: storetypes.GasIterNextCostFlatDesc, Value: "\"10\""}}, + fncheck: func(res storetypes.GasConfig) { + gs := storetypes.GetDefaultGasConfig() + gs.HasCost = 100 + gs.DeleteCost = 10 + gs.ReadCostFlat = 10 + gs.ReadCostPerByte = 10 + gs.WriteCostFlat = 10 + gs.WriteCostPerByte = 10 + gs.IterNextCostFlat = 10 + suite.Equal(*gs, res) + }, + }, + } + + for _, tt := range tests { + ctx := suite.Context(0) + + changeParams(ctx, &suite.paramsKeeper, types.NewParameterChangeProposal("hello", "word", tt.changes, 1)) + + res := suite.paramsKeeper.GetGasConfig(ctx) + tt.fncheck(*res) + } +} diff --git a/x/params/querier.go b/x/params/querier.go index 46458b116a..346835df16 100644 --- a/x/params/querier.go +++ b/x/params/querier.go @@ -21,6 +21,8 @@ func NewQuerier(keeper Keeper) sdk.Querier { keeper.Logger(ctx).Error("invalid query path", "path", path) } return queryUpgrade(ctx, path[1], keeper) + case types.QueryGasConfig: + return queryGasConfig(ctx, req, keeper) default: return nil, sdk.ErrUnknownRequest("unknown params query endpoint") } @@ -61,3 +63,11 @@ func queryUpgrade(ctx sdk.Context, name string, keeper Keeper) ([]byte, sdk.Erro } return bz, nil } + +func queryGasConfig(ctx sdk.Context, _ abci.RequestQuery, keeper Keeper) ([]byte, sdk.Error) { + bz, err := codec.MarshalJSONIndent(keeper.cdc, keeper.getGasConfig(ctx)) + if err != nil { + return nil, sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, fmt.Sprintf("could not marshal result to JSON %s", err.Error())) + } + return bz, nil +} diff --git a/x/params/types/params.go b/x/params/types/params.go index cf5042368e..a477b247c8 100644 --- a/x/params/types/params.go +++ b/x/params/types/params.go @@ -17,7 +17,10 @@ const ( // ParamKeyTable returns the key declaration for parameters func ParamKeyTable() sdkparams.KeyTable { - return sdkparams.NewKeyTable().RegisterParamSet(&Params{}) + kt := sdkparams.NewKeyTable() + kt.RegisterParamSet(&Params{}) + kt.RegisterParamSet(&GasConfig{}) + return kt } // Params is the struct of the parameters in this module diff --git a/x/params/types/params_gas.go b/x/params/types/params_gas.go new file mode 100644 index 0000000000..1287f50a6c --- /dev/null +++ b/x/params/types/params_gas.go @@ -0,0 +1,45 @@ +package types + +import ( + "fmt" + "github.com/okex/exchain/libs/cosmos-sdk/x/params/subspace" + "github.com/okex/exchain/x/common" + + stypes "github.com/okex/exchain/libs/cosmos-sdk/store/types" +) + +const ( + QueryGasConfig = "gasconfig" +) + +// GasConfig is the struct of the parameters in this module +type GasConfig struct { + stypes.GasConfig +} + +func (p GasConfig) String() string { + return fmt.Sprintf(` +HasCost: %d, +DeleteCost: %d, +ReadCostFlat: %d, +ReadCostPerByte: %d, +WriteCostFlat: %d, +WriteCostPerByte: %d, +IterNextCostFlat: %d, +`, p.HasCost, p.DeleteCost, p.ReadCostFlat, p.ReadCostPerByte, p.WriteCostFlat, p.WriteCostPerByte, p.IterNextCostFlat) +} + +// ParamSetPairs implements the ParamSet interface and returns all the key/value pairs +// pairs of auth module's parameters. +// nolint +func (p *GasConfig) ParamSetPairs() subspace.ParamSetPairs { + return subspace.ParamSetPairs{ + {[]byte(stypes.GasHasDesc), &p.HasCost, common.ValidateUint64Positive("gas has")}, + {[]byte(stypes.GasDeleteDesc), &p.DeleteCost, common.ValidateUint64Positive("gas delete")}, + {[]byte(stypes.GasReadCostFlatDesc), &p.ReadCostFlat, common.ValidateUint64Positive("gas read cost flat")}, + {[]byte(stypes.GasReadPerByteDesc), &p.ReadCostPerByte, common.ValidateUint64Positive("gas read per byte")}, + {[]byte(stypes.GasWriteCostFlatDesc), &p.WriteCostFlat, common.ValidateUint64Positive("gas write cost flat")}, + {[]byte(stypes.GasWritePerByteDesc), &p.WriteCostPerByte, common.ValidateUint64Positive("gas write cost per byte")}, + {[]byte(stypes.GasIterNextCostFlatDesc), &p.IterNextCostFlat, common.ValidateUint64Positive("gas iter next cost flat")}, + } +} diff --git a/x/params/types/upgrade_cache_test.go b/x/params/types/upgrade_cache_test.go index 083f047198..a07f2cd593 100644 --- a/x/params/types/upgrade_cache_test.go +++ b/x/params/types/upgrade_cache_test.go @@ -42,7 +42,7 @@ func (suite *UpgradeKeeperSuite) SetupTest() { func (suite *UpgradeKeeperSuite) Context(height int64) sdk.Context { ctx := sdk.NewContext(suite.ms, abci.Header{Height: height}, false, suite.logger) - ctx.SetDeliver() + ctx.SetDeliverSerial() return ctx } diff --git a/x/vmbridge/keeper/evm_test.go b/x/vmbridge/keeper/evm_test.go index 174d822980..a843fcebed 100644 --- a/x/vmbridge/keeper/evm_test.go +++ b/x/vmbridge/keeper/evm_test.go @@ -216,25 +216,25 @@ func (suite *KeeperTestSuite) TestSendToWasmEventHandler_Handle() { data = input }, func() { - queryAddr := sdk.AccAddress(ethAddr.Bytes()) - result, err := suite.app.WasmKeeper.QuerySmart(suite.ctx, sdk.AccToAWasmddress(suite.wasmContract), []byte(fmt.Sprintf("{\"balance\":{\"address\":\"%s\"}}", queryAddr.String()))) + queryAddr := sdk.WasmAddress(ethAddr.Bytes()) + result, err := suite.app.WasmKeeper.QuerySmart(suite.ctx, suite.wasmContract, []byte(fmt.Sprintf("{\"balance\":{\"address\":\"%s\"}}", queryAddr.String()))) suite.Require().NoError(err) suite.Require().Equal("{\"balance\":\"1\"}", string(result)) }, - types.ErrIsNotOKCAddr, + nil, }, { "normal topic,recipient is ex", func() { wasmAddrStr := suite.wasmContract.String() - queryAddr := sdk.AccAddress(ethAddr.Bytes()) + queryAddr := sdk.WasmAddress(ethAddr.Bytes()) input, err := getSendToWasmEventData(wasmAddrStr, queryAddr.String(), big.NewInt(1)) suite.Require().NoError(err) data = input }, func() { queryAddr := sdk.WasmAddress(ethAddr.Bytes()) - result, err := suite.app.WasmKeeper.QuerySmart(suite.ctx, sdk.AccToAWasmddress(suite.wasmContract), []byte(fmt.Sprintf("{\"balance\":{\"address\":\"%s\"}}", queryAddr.String()))) + result, err := suite.app.WasmKeeper.QuerySmart(suite.ctx, suite.wasmContract, []byte(fmt.Sprintf("{\"balance\":{\"address\":\"%s\"}}", queryAddr.String()))) suite.Require().NoError(err) suite.Require().Equal("{\"balance\":\"1\"}", string(result)) }, @@ -244,14 +244,14 @@ func (suite *KeeperTestSuite) TestSendToWasmEventHandler_Handle() { "normal topic,amount is zero", func() { wasmAddrStr := suite.wasmContract.String() - queryAddr := sdk.AccAddress(ethAddr.Bytes()) + queryAddr := sdk.WasmAddress(ethAddr.Bytes()) input, err := getSendToWasmEventData(wasmAddrStr, queryAddr.String(), big.NewInt(0)) suite.Require().NoError(err) data = input }, func() { queryAddr := sdk.WasmAddress(ethAddr.Bytes()) - result, err := suite.app.WasmKeeper.QuerySmart(suite.ctx, sdk.AccToAWasmddress(suite.wasmContract), []byte(fmt.Sprintf("{\"balance\":{\"address\":\"%s\"}}", queryAddr.String()))) + result, err := suite.app.WasmKeeper.QuerySmart(suite.ctx, suite.wasmContract, []byte(fmt.Sprintf("{\"balance\":{\"address\":\"%s\"}}", queryAddr.String()))) suite.Require().NoError(err) suite.Require().Equal("{\"balance\":\"0\"}", string(result)) }, diff --git a/x/vmbridge/keeper/keeper_test.go b/x/vmbridge/keeper/keeper_test.go index 5bae132cfd..a8c6f021c0 100644 --- a/x/vmbridge/keeper/keeper_test.go +++ b/x/vmbridge/keeper/keeper_test.go @@ -37,7 +37,7 @@ type KeeperTestSuite struct { keeper *keeper.Keeper addr sdk.AccAddress - wasmContract sdk.AccAddress + wasmContract sdk.WasmAddress codeId uint64 evmContract common.Address @@ -87,8 +87,7 @@ func (suite *KeeperTestSuite) SetupTest() { suite.Require().NoError(err) initMsg := []byte(fmt.Sprintf("{\"decimals\":10,\"initial_balances\":[{\"address\":\"%s\",\"amount\":\"100000000\"}],\"name\":\"my test token\", \"symbol\":\"MTT\"}", suite.addr.String())) - temp, _, err := suite.app.WasmPermissionKeeper.Instantiate(suite.ctx, suite.codeId, sdk.AccToAWasmddress(suite.addr), sdk.AccToAWasmddress(suite.addr), initMsg, "label", sdk.Coins{sdk.NewInt64Coin(sdk.DefaultBondDenom, 0)}) - suite.wasmContract = sdk.WasmToAccAddress(temp) + suite.wasmContract, _, err = suite.app.WasmPermissionKeeper.Instantiate(suite.ctx, suite.codeId, sdk.AccToAWasmddress(suite.addr), sdk.AccToAWasmddress(suite.addr), initMsg, "label", sdk.Coins{sdk.NewInt64Coin(sdk.DefaultBondDenom, 0)}) suite.Require().NoError(err) palyload := "60806040526040518060600160405280603d815260200162002355603d913960079080519060200190620000359291906200004a565b503480156200004357600080fd5b506200015f565b8280546200005890620000fa565b90600052602060002090601f0160209004810192826200007c5760008555620000c8565b82601f106200009757805160ff1916838001178555620000c8565b82800160010185558215620000c8579182015b82811115620000c7578251825591602001919060010190620000aa565b5b509050620000d79190620000db565b5090565b5b80821115620000f6576000816000905550600101620000dc565b5090565b600060028204905060018216806200011357607f821691505b602082108114156200012a576200012962000130565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6121e6806200016f6000396000f3fe608060405234801561001057600080fd5b50600436106101215760003560e01c806370a08231116100ad578063cc1207c011610071578063cc1207c014610330578063d069cf761461034c578063d241877c1461037c578063dd62ed3e1461039a578063ee366654146103ca57610121565b806370a08231146102665780638e155cee1461029657806395d89b41146102b2578063a457c2d7146102d0578063a9059cbb1461030057610121565b8063313ce567116100f4578063313ce567146101c257806335b2bd2d146101e057806339509351146101fe5780633a0c76ea1461022e57806340c10f191461024a57610121565b806306fdde0314610126578063095ea7b31461014457806318160ddd1461017457806323b872dd14610192575b600080fd5b61012e6103e8565b60405161013b91906119a9565b60405180910390f35b61015e600480360381019061015991906114c5565b61047a565b60405161016b919061198e565b60405180910390f35b61017c610496565b6040516101899190611b70565b60405180910390f35b6101ac60048036038101906101a79190611472565b6104a0565b6040516101b9919061198e565b60405180910390f35b6101ca6104c8565b6040516101d79190611b8b565b60405180910390f35b6101e86104df565b6040516101f59190611973565b60405180910390f35b610218600480360381019061021391906114c5565b6104f7565b604051610225919061198e565b60405180910390f35b610248600480360381019061024391906115c2565b61059a565b005b610264600480360381019061025f91906114c5565b6105e4565b005b610280600480360381019061027b9190611405565b6105f2565b60405161028d9190611b70565b60405180910390f35b6102b060048036038101906102ab9190611579565b61063b565b005b6102ba610655565b6040516102c791906119a9565b60405180910390f35b6102ea60048036038101906102e591906114c5565b6106e7565b6040516102f7919061198e565b60405180910390f35b61031a600480360381019061031591906114c5565b6107ca565b604051610327919061198e565b60405180910390f35b61034a6004803603810190610345919061164d565b6107e6565b005b61036660048036038101906103619190611505565b6107f5565b604051610373919061198e565b60405180910390f35b6103846108b4565b60405161039191906119a9565b60405180910390f35b6103b460048036038101906103af9190611432565b610942565b6040516103c19190611b70565b60405180910390f35b6103d26109c9565b6040516103df91906119a9565b60405180910390f35b6060600180546103f790611d59565b80601f016020809104026020016040519081016040528092919081815260200182805461042390611d59565b80156104705780601f1061044557610100808354040283529160200191610470565b820191906000526020600020905b81548152906001019060200180831161045357829003601f168201915b5050505050905090565b60008033905061048b8185856109d8565b600191505092915050565b6000600454905090565b6000803390506104b1858285610ba3565b6104bc858585610c2f565b60019150509392505050565b6000600360009054906101000a900460ff16905090565b73c63cf6c8e1f3df41085e9d8af49584dae1432b4f81565b60008033905061058f818585600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461058a9190611c38565b6109d8565b600191505092915050565b6105a43382610e9d565b7f41e4c36823b869e11ae85a7e623a332d31d961ba9ed670a3c9cb71c973c53caa8284836040516105d7939291906119cb565b60405180910390a1505050565b6105ee828261105e565b5050565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b806007908051906020019061065192919061125d565b5050565b60606002805461066490611d59565b80601f016020809104026020016040519081016040528092919081815260200182805461069090611d59565b80156106dd5780601f106106b2576101008083540402835291602001916106dd565b820191906000526020600020905b8154815290600101906020018083116106c057829003601f168201915b5050505050905090565b6000803390506000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050838110156107b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107a890611b30565b60405180910390fd5b6107be82868684036109d8565b60019250505092915050565b6000803390506107db818585610c2f565b600191505092915050565b6107f18283836111a7565b5050565b600073c63cf6c8e1f3df41085e9d8af49584dae1432b4f73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461084357600080fd5b6007604051602001610855919061195c565b60405160208183030381529060405280519060200120858560405160200161087e929190611943565b604051602081830303815290604052805190602001201461089e57600080fd5b6108a8838361105e565b60019050949350505050565b600780546108c190611d59565b80601f01602080910402602001604051908101604052809291908181526020018280546108ed90611d59565b801561093a5780601f1061090f5761010080835404028352916020019161093a565b820191906000526020600020905b81548152906001019060200180831161091d57829003601f168201915b505050505081565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60606109d3610655565b905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3f90611b10565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ab8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aaf90611a50565b60405180910390fd5b80600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051610b969190611b70565b60405180910390a3505050565b6000610baf8484610942565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610c295781811015610c1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1290611a90565b60405180910390fd5b610c2884848484036109d8565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9690611af0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0690611a10565b60405180910390fd5b6000600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015610d96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8d90611ab0565b60405180910390fd5b818103600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610e2b9190611c38565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610e8f9190611b70565b60405180910390a350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0490611ad0565b60405180910390fd5b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015610f94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8b90611a30565b60405180910390fd5b818103600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160046000828254610fec9190611c8e565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516110519190611b70565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c590611b50565b60405180910390fd5b80600460008282546110e09190611c38565b9250508190555080600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546111369190611c38565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161119b9190611b70565b60405180910390a35050565b60008054906101000a900460ff16156111f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ec90611a70565b60405180910390fd5b60016000806101000a81548160ff021916908315150217905550826001908051906020019061122592919061125d565b50816002908051906020019061123c92919061125d565b5080600360006101000a81548160ff021916908360ff160217905550505050565b82805461126990611d59565b90600052602060002090601f01602090048101928261128b57600085556112d2565b82601f106112a457805160ff19168380011785556112d2565b828001600101855582156112d2579182015b828111156112d15782518255916020019190600101906112b6565b5b5090506112df91906112e3565b5090565b5b808211156112fc5760008160009055506001016112e4565b5090565b600061131361130e84611bcb565b611ba6565b90508281526020810184848401111561132f5761132e611e58565b5b61133a848285611d17565b509392505050565b6000813590506113518161216b565b92915050565b60008083601f84011261136d5761136c611e4e565b5b8235905067ffffffffffffffff81111561138a57611389611e49565b5b6020830191508360018202830111156113a6576113a5611e53565b5b9250929050565b600082601f8301126113c2576113c1611e4e565b5b81356113d2848260208601611300565b91505092915050565b6000813590506113ea81612182565b92915050565b6000813590506113ff81612199565b92915050565b60006020828403121561141b5761141a611e62565b5b600061142984828501611342565b91505092915050565b6000806040838503121561144957611448611e62565b5b600061145785828601611342565b925050602061146885828601611342565b9150509250929050565b60008060006060848603121561148b5761148a611e62565b5b600061149986828701611342565b93505060206114aa86828701611342565b92505060406114bb868287016113db565b9150509250925092565b600080604083850312156114dc576114db611e62565b5b60006114ea85828601611342565b92505060206114fb858286016113db565b9150509250929050565b6000806000806060858703121561151f5761151e611e62565b5b600085013567ffffffffffffffff81111561153d5761153c611e5d565b5b61154987828801611357565b9450945050602061155c87828801611342565b925050604061156d878288016113db565b91505092959194509250565b60006020828403121561158f5761158e611e62565b5b600082013567ffffffffffffffff8111156115ad576115ac611e5d565b5b6115b9848285016113ad565b91505092915050565b6000806000606084860312156115db576115da611e62565b5b600084013567ffffffffffffffff8111156115f9576115f8611e5d565b5b611605868287016113ad565b935050602084013567ffffffffffffffff81111561162657611625611e5d565b5b611632868287016113ad565b9250506040611643868287016113db565b9150509250925092565b6000806040838503121561166457611663611e62565b5b600083013567ffffffffffffffff81111561168257611681611e5d565b5b61168e858286016113ad565b925050602061169f858286016113f0565b9150509250929050565b6116b281611cc2565b82525050565b6116c181611cd4565b82525050565b60006116d38385611c2d565b93506116e0838584611d17565b82840190509392505050565b60006116f782611c11565b6117018185611c1c565b9350611711818560208601611d26565b61171a81611e67565b840191505092915050565b6000815461173281611d59565b61173c8186611c2d565b9450600182166000811461175757600181146117685761179b565b60ff1983168652818601935061179b565b61177185611bfc565b60005b8381101561179357815481890152600182019150602081019050611774565b838801955050505b50505092915050565b60006117b1602383611c1c565b91506117bc82611e78565b604082019050919050565b60006117d4602283611c1c565b91506117df82611ec7565b604082019050919050565b60006117f7602283611c1c565b915061180282611f16565b604082019050919050565b600061181a601b83611c1c565b915061182582611f65565b602082019050919050565b600061183d601d83611c1c565b915061184882611f8e565b602082019050919050565b6000611860602683611c1c565b915061186b82611fb7565b604082019050919050565b6000611883602183611c1c565b915061188e82612006565b604082019050919050565b60006118a6602583611c1c565b91506118b182612055565b604082019050919050565b60006118c9602483611c1c565b91506118d4826120a4565b604082019050919050565b60006118ec602583611c1c565b91506118f7826120f3565b604082019050919050565b600061190f601f83611c1c565b915061191a82612142565b602082019050919050565b61192e81611d00565b82525050565b61193d81611d0a565b82525050565b60006119508284866116c7565b91508190509392505050565b60006119688284611725565b915081905092915050565b600060208201905061198860008301846116a9565b92915050565b60006020820190506119a360008301846116b8565b92915050565b600060208201905081810360008301526119c381846116ec565b905092915050565b600060608201905081810360008301526119e581866116ec565b905081810360208301526119f981856116ec565b9050611a086040830184611925565b949350505050565b60006020820190508181036000830152611a29816117a4565b9050919050565b60006020820190508181036000830152611a49816117c7565b9050919050565b60006020820190508181036000830152611a69816117ea565b9050919050565b60006020820190508181036000830152611a898161180d565b9050919050565b60006020820190508181036000830152611aa981611830565b9050919050565b60006020820190508181036000830152611ac981611853565b9050919050565b60006020820190508181036000830152611ae981611876565b9050919050565b60006020820190508181036000830152611b0981611899565b9050919050565b60006020820190508181036000830152611b29816118bc565b9050919050565b60006020820190508181036000830152611b49816118df565b9050919050565b60006020820190508181036000830152611b6981611902565b9050919050565b6000602082019050611b856000830184611925565b92915050565b6000602082019050611ba06000830184611934565b92915050565b6000611bb0611bc1565b9050611bbc8282611d8b565b919050565b6000604051905090565b600067ffffffffffffffff821115611be657611be5611e1a565b5b611bef82611e67565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b6000611c4382611d00565b9150611c4e83611d00565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115611c8357611c82611dbc565b5b828201905092915050565b6000611c9982611d00565b9150611ca483611d00565b925082821015611cb757611cb6611dbc565b5b828203905092915050565b6000611ccd82611ce0565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015611d44578082015181840152602081019050611d29565b83811115611d53576000848401525b50505050565b60006002820490506001821680611d7157607f821691505b60208210811415611d8557611d84611deb565b5b50919050565b611d9482611e67565b810181811067ffffffffffffffff82111715611db357611db2611e1a565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20616c726561647920696e697469616c697a65643b0000000000600082015250565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b61217481611cc2565b811461217f57600080fd5b50565b61218b81611d00565b811461219657600080fd5b50565b6121a281611d0a565b81146121ad57600080fd5b5056fea264697066735822122022151d41dd9654958225e494d6adc336a64e7ff8fe7993ba1764f69906eb984064736f6c6343000807003365783134686a32746176713866706573647778786375343472747933686839307668756a7276636d73746c347a723374786d6676773973366671753237" diff --git a/x/vmbridge/keeper/wasm.go b/x/vmbridge/keeper/wasm.go index bec97e7659..b64cd56ba2 100644 --- a/x/vmbridge/keeper/wasm.go +++ b/x/vmbridge/keeper/wasm.go @@ -14,11 +14,7 @@ import ( ) func (k Keeper) SendToWasm(ctx sdk.Context, caller sdk.AccAddress, wasmContractAddr, recipient string, amount sdk.Int) error { - // must check recipient is ex address - if !sdk.IsOKCAddress(recipient) { - return types.ErrIsNotOKCAddr - } - to, err := sdk.AccAddressFromBech32(recipient) + _, err := sdk.WasmAddressFromBech32(recipient) if err != nil { return err } @@ -26,7 +22,7 @@ func (k Keeper) SendToWasm(ctx sdk.Context, caller sdk.AccAddress, wasmContractA if amount.IsNegative() { return types.ErrAmountNegative } - input, err := types.GetMintCW20Input(amount.String(), sdk.AccToAWasmddress(to).String()) + input, err := types.GetMintCW20Input(amount.String(), recipient) if err != nil { return err } diff --git a/x/vmbridge/keeper/wasm_test.go b/x/vmbridge/keeper/wasm_test.go index 328a3e72be..7afe5ad4c5 100644 --- a/x/vmbridge/keeper/wasm_test.go +++ b/x/vmbridge/keeper/wasm_test.go @@ -27,7 +27,7 @@ func (suite *KeeperTestSuite) TestKeeper_SendToWasm() { reset := func() { caller = sdk.AccAddress(contract.Bytes()) wasmContractAddr = suite.wasmContract.String() - recipient = sdk.AccAddress(ethAddr.Bytes()).String() + recipient = ethAddr.String() amount = sdk.NewInt(1) } testCases := []struct { @@ -42,7 +42,7 @@ func (suite *KeeperTestSuite) TestKeeper_SendToWasm() { }, func() { queryAddr := sdk.WasmAddress(ethAddr.Bytes()) - result, err := suite.app.WasmKeeper.QuerySmart(suite.ctx, sdk.AccToAWasmddress(suite.wasmContract), []byte(fmt.Sprintf("{\"balance\":{\"address\":\"%s\"}}", queryAddr.String()))) + result, err := suite.app.WasmKeeper.QuerySmart(suite.ctx, suite.wasmContract, []byte(fmt.Sprintf("{\"balance\":{\"address\":\"%s\"}}", queryAddr.String()))) suite.Require().NoError(err) suite.Require().Equal("{\"balance\":\"1\"}", string(result)) }, @@ -55,11 +55,11 @@ func (suite *KeeperTestSuite) TestKeeper_SendToWasm() { }, func() { queryAddr := sdk.WasmAddress(ethAddr.Bytes()) - result, err := suite.app.WasmKeeper.QuerySmart(suite.ctx, sdk.AccToAWasmddress(suite.wasmContract), []byte(fmt.Sprintf("{\"balance\":{\"address\":\"%s\"}}", queryAddr.String()))) + result, err := suite.app.WasmKeeper.QuerySmart(suite.ctx, suite.wasmContract, []byte(fmt.Sprintf("{\"balance\":{\"address\":\"%s\"}}", queryAddr.String()))) suite.Require().NoError(err) suite.Require().Equal("{\"balance\":\"1\"}", string(result)) }, - nil, + errors.New("execute wasm contract failed: Generic error: addr_validate errored: Address is not normalized"), }, { "recipient is 0x", @@ -68,11 +68,11 @@ func (suite *KeeperTestSuite) TestKeeper_SendToWasm() { }, func() { queryAddr := sdk.WasmAddress(ethAddr.Bytes()) - result, err := suite.app.WasmKeeper.QuerySmart(suite.ctx, sdk.AccToAWasmddress(suite.wasmContract), []byte(fmt.Sprintf("{\"balance\":{\"address\":\"%s\"}}", queryAddr.String()))) + result, err := suite.app.WasmKeeper.QuerySmart(suite.ctx, suite.wasmContract, []byte(fmt.Sprintf("{\"balance\":{\"address\":\"%s\"}}", queryAddr.String()))) suite.Require().NoError(err) suite.Require().Equal("{\"balance\":\"1\"}", string(result)) }, - types.ErrIsNotOKCAddr, + nil, }, { "recipient is wasmaddr", @@ -81,24 +81,24 @@ func (suite *KeeperTestSuite) TestKeeper_SendToWasm() { }, func() { queryAddr := sdk.WasmAddress(make([]byte, 32)) - result, err := suite.app.WasmKeeper.QuerySmart(suite.ctx, sdk.AccToAWasmddress(suite.wasmContract), []byte(fmt.Sprintf("{\"balance\":{\"address\":\"%s\"}}", queryAddr.String()))) + result, err := suite.app.WasmKeeper.QuerySmart(suite.ctx, suite.wasmContract, []byte(fmt.Sprintf("{\"balance\":{\"address\":\"%s\"}}", queryAddr.String()))) suite.Require().NoError(err) suite.Require().Equal("{\"balance\":\"1\"}", string(result)) }, - nil, + errors.New("execute wasm contract failed: Generic error: addr_validate errored: Address is not normalized"), }, { - "recipient is wasmaddr 0x", + "recipient is 0x 32", func() { recipient = "0x" + hex.EncodeToString(make([]byte, 32)) }, func() { queryAddr := sdk.WasmAddress(make([]byte, 32)) - result, err := suite.app.WasmKeeper.QuerySmart(suite.ctx, sdk.AccToAWasmddress(suite.wasmContract), []byte(fmt.Sprintf("{\"balance\":{\"address\":\"%s\"}}", queryAddr.String()))) + result, err := suite.app.WasmKeeper.QuerySmart(suite.ctx, suite.wasmContract, []byte(fmt.Sprintf("{\"balance\":{\"address\":\"%s\"}}", queryAddr.String()))) suite.Require().NoError(err) suite.Require().Equal("{\"balance\":\"1\"}", string(result)) }, - types.ErrIsNotOKCAddr, + errors.New("incorrect address length"), }, { "normal topic,amount is zero", @@ -107,7 +107,7 @@ func (suite *KeeperTestSuite) TestKeeper_SendToWasm() { }, func() { queryAddr := sdk.WasmAddress(ethAddr.Bytes()) - result, err := suite.app.WasmKeeper.QuerySmart(suite.ctx, sdk.AccToAWasmddress(suite.wasmContract), []byte(fmt.Sprintf("{\"balance\":{\"address\":\"%s\"}}", queryAddr.String()))) + result, err := suite.app.WasmKeeper.QuerySmart(suite.ctx, suite.wasmContract, []byte(fmt.Sprintf("{\"balance\":{\"address\":\"%s\"}}", queryAddr.String()))) suite.Require().NoError(err) suite.Require().Equal("{\"balance\":\"0\"}", string(result)) }, diff --git a/x/wasm/client/rest/query.go b/x/wasm/client/rest/query.go index 76f2ce5f5c..b698f2ef1d 100644 --- a/x/wasm/client/rest/query.go +++ b/x/wasm/client/rest/query.go @@ -114,7 +114,7 @@ func listCodesHandlerFn(cliCtx clientCtx.CLIContext) http.HandlerFunc { queryClient := types.NewQueryClient(cliCtx) pageReq, err := rest.ParseGRPCWasmPageRequest(r) if err != nil { - rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) + rest.WriteErrorResponse(w, http.StatusBadRequest, err.Error()) return } var reverse bool @@ -124,7 +124,7 @@ func listCodesHandlerFn(cliCtx clientCtx.CLIContext) http.HandlerFunc { } else { reverse, err = strconv.ParseBool(reverseStr) if err != nil { - rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) + rest.WriteErrorResponse(w, http.StatusBadRequest, err.Error()) return } } @@ -171,12 +171,18 @@ func queryCodeHandlerFn(cliCtx clientCtx.CLIContext) http.HandlerFunc { }, ) + if isErrNotFound(err) { + rest.WriteErrorResponse(w, http.StatusNotFound, "code not found") + return + } + if err != nil { rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) return } + if res == nil { - rest.WriteErrorResponse(w, http.StatusNotFound, "contract not found") + rest.WriteErrorResponse(w, http.StatusNotFound, "code not found") return } @@ -193,7 +199,7 @@ func listContractsByCodeHandlerFn(cliCtx clientCtx.CLIContext) http.HandlerFunc return func(w http.ResponseWriter, r *http.Request) { codeID, err := strconv.ParseUint(mux.Vars(r)["codeID"], 10, 64) if err != nil { - rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) + rest.WriteErrorResponse(w, http.StatusBadRequest, err.Error()) return } cliCtx, ok := rest.ParseQueryHeightOrReturnBadRequest(w, cliCtx, r) @@ -204,7 +210,7 @@ func listContractsByCodeHandlerFn(cliCtx clientCtx.CLIContext) http.HandlerFunc queryClient := types.NewQueryClient(cliCtx) pageReq, err := rest.ParseGRPCWasmPageRequest(r) if err != nil { - rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) + rest.WriteErrorResponse(w, http.StatusBadRequest, err.Error()) return } var reverse bool @@ -256,6 +262,12 @@ func queryContractHandlerFn(cliCtx clientCtx.CLIContext) http.HandlerFunc { Address: mux.Vars(r)["contractAddr"], }, ) + + if isErrNotFound(err) { + rest.WriteErrorResponse(w, http.StatusNotFound, "contract not found") + return + } + if err != nil { rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) return @@ -283,6 +295,12 @@ func queryCodeContractHandlerFn(cliCtx clientCtx.CLIContext) http.HandlerFunc { Address: mux.Vars(r)["contractAddr"], }, ) + + if isErrNotFound(err) { + rest.WriteErrorResponse(w, http.StatusNotFound, "contract not found") + return + } + if err != nil { rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) return @@ -297,10 +315,16 @@ func queryCodeContractHandlerFn(cliCtx clientCtx.CLIContext) http.HandlerFunc { }, ) + if isErrNotFound(err) { + rest.WriteErrorResponse(w, http.StatusNotFound, "code not found") + return + } + if err != nil { rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) return } + if codeRes == nil { rest.WriteErrorResponse(w, http.StatusNotFound, "contract not found") return @@ -319,7 +343,7 @@ func queryContractBlockedMethodsHandlerFn(cliCtx clientCtx.CLIContext) http.Hand return func(w http.ResponseWriter, r *http.Request) { addr, err := sdk.WasmAddressFromBech32(mux.Vars(r)["contractAddr"]) if err != nil { - rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) + rest.WriteErrorResponse(w, http.StatusBadRequest, err.Error()) return } cliCtx, ok := rest.ParseQueryHeightOrReturnBadRequest(w, cliCtx, r) @@ -329,6 +353,12 @@ func queryContractBlockedMethodsHandlerFn(cliCtx clientCtx.CLIContext) http.Hand route := fmt.Sprintf("custom/%s/%s/%s", types.QuerierRoute, keeper.QueryListContractBlockedMethod, addr.String()) res, height, err := cliCtx.Query(route) + + if isErrNotFound(err) { + rest.WriteErrorResponse(w, http.StatusNotFound, "methods not found") + return + } + if err != nil { rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) return @@ -351,7 +381,7 @@ func queryContractStateAllHandlerFn(cliCtx clientCtx.CLIContext) http.HandlerFun queryClient := types.NewQueryClient(cliCtx) pageReq, err := rest.ParseGRPCWasmPageRequest(r) if err != nil { - rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) + rest.WriteErrorResponse(w, http.StatusBadRequest, err.Error()) return } var reverse bool @@ -361,7 +391,7 @@ func queryContractStateAllHandlerFn(cliCtx clientCtx.CLIContext) http.HandlerFun } else { reverse, err = strconv.ParseBool(reverseStr) if err != nil { - rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) + rest.WriteErrorResponse(w, http.StatusBadRequest, err.Error()) return } } @@ -380,6 +410,11 @@ func queryContractStateAllHandlerFn(cliCtx clientCtx.CLIContext) http.HandlerFun } } + if isErrNotFound(err) { + rest.WriteErrorResponse(w, http.StatusNotFound, "state not found") + return + } + if err != nil { rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) return @@ -395,7 +430,7 @@ func queryContractStateRawHandlerFn(cliCtx clientCtx.CLIContext) http.HandlerFun decoder.encoding = mux.Vars(r)["encoding"] queryData, err := decoder.DecodeString(mux.Vars(r)["key"]) if err != nil { - rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) + rest.WriteErrorResponse(w, http.StatusBadRequest, err.Error()) return } cliCtx, ok := rest.ParseQueryHeightOrReturnBadRequest(w, cliCtx, r) @@ -411,6 +446,11 @@ func queryContractStateRawHandlerFn(cliCtx clientCtx.CLIContext) http.HandlerFun }, ) + if isErrNotFound(err) { + rest.WriteErrorResponse(w, http.StatusNotFound, "state not found") + return + } + if err != nil { rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) return @@ -435,7 +475,7 @@ func queryContractStateSmartHandlerFn(cliCtx clientCtx.CLIContext) http.HandlerF decoder.encoding = mux.Vars(r)["encoding"] queryData, err := decoder.DecodeString(mux.Vars(r)["query"]) if err != nil { - rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) + rest.WriteErrorResponse(w, http.StatusBadRequest, err.Error()) return } @@ -448,6 +488,11 @@ func queryContractStateSmartHandlerFn(cliCtx clientCtx.CLIContext) http.HandlerF }, ) + if isErrNotFound(err) { + rest.WriteErrorResponse(w, http.StatusNotFound, "state not found") + return + } + if err != nil { rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) return @@ -474,7 +519,7 @@ func queryContractHistoryFn(cliCtx clientCtx.CLIContext) http.HandlerFunc { queryClient := types.NewQueryClient(cliCtx) pageReq, err := rest.ParseGRPCWasmPageRequest(r) if err != nil { - rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) + rest.WriteErrorResponse(w, http.StatusBadRequest, err.Error()) return } var reverse bool @@ -484,7 +529,7 @@ func queryContractHistoryFn(cliCtx clientCtx.CLIContext) http.HandlerFunc { } else { reverse, err = strconv.ParseBool(reverseStr) if err != nil { - rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) + rest.WriteErrorResponse(w, http.StatusBadRequest, err.Error()) return } } @@ -532,3 +577,10 @@ func (a *argumentDecoder) DecodeString(s string) ([]byte, error) { return a.dec(s) } } + +func isErrNotFound(err error) bool { + if err == nil { + return false + } + return strings.Contains(err.Error(), "not found") +} diff --git a/x/wasm/handler.go b/x/wasm/handler.go index 1f786ed4ed..f4b5d48a4f 100644 --- a/x/wasm/handler.go +++ b/x/wasm/handler.go @@ -35,7 +35,7 @@ func NewHandler(k types.ContractOpsKeeper) sdk.Handler { // update watcher defer func() { // update watchDB when delivering tx - if ctx.IsDeliver() || ctx.ParaMsg() != nil { + if ctx.IsDeliverWithSerial() || ctx.ParaMsg() != nil { watcher.Save(err) } @@ -46,6 +46,9 @@ func NewHandler(k types.ContractOpsKeeper) sdk.Handler { switch msg := msg.(type) { case *MsgStoreCode: //nolint:typecheck + if !ctx.IsCheckTx() { + types2.WasmStoreCode = true + } res, err = msgServer.StoreCode(sdk.WrapSDKContext(ctx), msg) case *MsgInstantiateContract: res, err = msgServer.InstantiateContract(sdk.WrapSDKContext(ctx), msg) diff --git a/x/wasm/keeper/ante.go b/x/wasm/keeper/ante.go index a38077d69d..e3aca72ce3 100644 --- a/x/wasm/keeper/ante.go +++ b/x/wasm/keeper/ante.go @@ -3,10 +3,8 @@ package keeper import ( "encoding/binary" - types2 "github.com/okex/exchain/libs/tendermint/types" - sdk "github.com/okex/exchain/libs/cosmos-sdk/types" - + tmtypes "github.com/okex/exchain/libs/tendermint/types" "github.com/okex/exchain/x/wasm/types" ) @@ -30,7 +28,7 @@ func NewCountTXDecorator(storeKey sdk.StoreKey) *CountTXDecorator { // The ante handler passes the counter value via sdk.Context upstream. See `types.TXCounter(ctx)` to read the value. // Simulations don't get a tx counter value assigned. func (a CountTXDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulate bool, next sdk.AnteHandler) (sdk.Context, error) { - if simulate || !types2.HigherThanEarth(ctx.BlockHeight()) { + if simulate || !tmtypes.HigherThanEarth(ctx.BlockHeight()) { return next(ctx, tx, simulate) } currentGasmeter := ctx.GasMeter() @@ -108,7 +106,9 @@ func (d LimitSimulationGasDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simu } func UpdateTxCount(ctx sdk.Context, storeKey sdk.StoreKey, txCount int) { - store := ctx.KVStore(storeKey) - currentHeight := ctx.BlockHeight() - store.Set(types.TXCounterPrefix, encodeHeightCounter(currentHeight, uint32(txCount+1))) + if tmtypes.HigherThanEarth(ctx.BlockHeight()) { + store := ctx.KVStore(storeKey) + currentHeight := ctx.BlockHeight() + store.Set(types.TXCounterPrefix, encodeHeightCounter(currentHeight, uint32(txCount+1))) + } } diff --git a/x/wasm/keeper/keeper.go b/x/wasm/keeper/keeper.go index f25c668e20..6c9fffb549 100644 --- a/x/wasm/keeper/keeper.go +++ b/x/wasm/keeper/keeper.go @@ -6,9 +6,15 @@ import ( "encoding/binary" "encoding/json" "fmt" + "math" + "path/filepath" + "strconv" + "strings" + wasmvm "github.com/CosmWasm/wasmvm" wasmvmtypes "github.com/CosmWasm/wasmvm/types" "github.com/gogo/protobuf/proto" + "github.com/okex/exchain/libs/cosmos-sdk/codec" "github.com/okex/exchain/libs/cosmos-sdk/store/prefix" sdk "github.com/okex/exchain/libs/cosmos-sdk/types" @@ -20,15 +26,11 @@ import ( "github.com/okex/exchain/x/wasm/ioutils" "github.com/okex/exchain/x/wasm/types" "github.com/okex/exchain/x/wasm/watcher" - "math" - "path/filepath" - "strconv" - "strings" ) // contractMemoryLimit is the memory limit of each contract execution (in MiB) // constant value so all nodes run with the same limit. -const contractMemoryLimit = 32 +const ContractMemoryLimit = 32 const SupportedFeatures = "iterator,staking,stargate" type contextKey int @@ -125,14 +127,23 @@ func NewKeeper( } watcher.SetWatchDataManager() wasmStorageKey = storeKey + *wasmAccountKeeper = accountKeeper + *WasmbankKeeper = bankKeeper k := newKeeper(cdc, storeKey, paramSpace, accountKeeper, bankKeeper, channelKeeper, portKeeper, capabilityKeeper, portSource, router, queryRouter, homeDir, wasmConfig, supportedFeatures, defaultAdapter{}, opts...) + *wasmGasRegister = k.gasRegister accountKeeper.SetObserverKeeper(k) return k } var ( - wasmStorageKey = sdk.StoreKey(sdk.NewKVStoreKey("wasm")) // need reset by NewKeeper + nilwasmGasRegister = GasRegister(nil) + nilAccountKeeper = types.AccountKeeper(nil) + nilBankKeeper = types.BankKeeper(nil) + wasmStorageKey = sdk.StoreKey(sdk.NewKVStoreKey("wasm")) // need reset by NewKeeper + wasmAccountKeeper = &nilAccountKeeper //need reset by NewKeeper + WasmbankKeeper = &nilBankKeeper + wasmGasRegister = &nilwasmGasRegister ) func NewSimulateKeeper( @@ -151,7 +162,9 @@ func NewSimulateKeeper( supportedFeatures string, opts ...Option, ) Keeper { - return newKeeper(cdc, wasmStorageKey, paramSpace, accountKeeper, bankKeeper, channelKeeper, portKeeper, capabilityKeeper, portSource, router, queryRouter, homeDir, wasmConfig, supportedFeatures, watcher.Adapter{}, opts...) + k := newKeeper(cdc, wasmStorageKey, paramSpace, *wasmAccountKeeper, *WasmbankKeeper, channelKeeper, portKeeper, capabilityKeeper, portSource, router, queryRouter, homeDir, wasmConfig, supportedFeatures, watcher.Adapter{}, opts...) + k.gasRegister = *wasmGasRegister + return k } func newKeeper(cdc *codec.CodecProxy, @@ -171,7 +184,8 @@ func newKeeper(cdc *codec.CodecProxy, ada types.DBAdapter, opts ...Option, ) Keeper { - wasmer, err := wasmvm.NewVM(filepath.Join(homeDir, "wasm"), supportedFeatures, contractMemoryLimit, wasmConfig.ContractDebugMode, wasmConfig.MemoryCacheSize) + + wasmer, err := wasmvm.NewVM(filepath.Join(homeDir, "wasm"), supportedFeatures, ContractMemoryLimit, wasmConfig.ContractDebugMode, wasmConfig.MemoryCacheSize) if err != nil { panic(err) } @@ -438,6 +452,10 @@ func (k Keeper) importCode(ctx sdk.Context, codeID uint64, codeInfo types.CodeIn func (k Keeper) instantiate(ctx sdk.Context, codeID uint64, creator, admin sdk.WasmAddress, initMsg []byte, label string, deposit sdk.Coins, authZ AuthorizationPolicy) (sdk.WasmAddress, []byte, error) { //defer telemetry.MeasureSince(time.Now(), "wasm", "contract", "instantiate") + // This method does not support parallel execution. + if ctx.ParaMsg() != nil { + ctx.ParaMsg().InvalidExecute = true + } instanceCosts := k.gasRegister.NewContractInstanceCosts(k.IsPinnedCode(ctx, codeID), len(initMsg)) ctx.GasMeter().ConsumeGas(instanceCosts, "Loading CosmWasm module: instantiate") // create contract address @@ -594,6 +612,10 @@ func (k Keeper) execute(ctx sdk.Context, contractAddress sdk.WasmAddress, caller func (k Keeper) migrate(ctx sdk.Context, contractAddress sdk.WasmAddress, caller sdk.WasmAddress, newCodeID uint64, msg []byte, authZ AuthorizationPolicy) ([]byte, error) { //defer telemetry.MeasureSince(time.Now(), "wasm", "contract", "migrate") + // This method does not support parallel execution. + if ctx.ParaMsg() != nil { + ctx.ParaMsg().InvalidExecute = true + } migrateSetupCosts := k.gasRegister.InstantiateContractCosts(k.IsPinnedCode(ctx, newCodeID), len(msg)) ctx.GasMeter().ConsumeGas(migrateSetupCosts, "Loading CosmWasm module: migrate") @@ -766,6 +788,10 @@ func (k Keeper) IterateContractsByCode(ctx sdk.Context, codeID uint64, cb func(a } func (k Keeper) setContractAdmin(ctx sdk.Context, contractAddress, caller, newAdmin sdk.WasmAddress, authZ AuthorizationPolicy) (err error) { + // This method does not support parallel execution. + if ctx.ParaMsg() != nil { + ctx.ParaMsg().InvalidExecute = true + } gas := ctx.GasMeter().GasConsumed() defer func() { if !ctx.IsCheckTx() && k.innertxKeeper != nil { diff --git a/x/wasm/keeper/querier.go b/x/wasm/keeper/querier.go index 02eb5b7b40..27a2f2f18b 100644 --- a/x/wasm/keeper/querier.go +++ b/x/wasm/keeper/querier.go @@ -331,17 +331,14 @@ func (q grpcQuerier) PinnedCodes(c context.Context, req *types.QueryPinnedCodesR } func (q grpcQuerier) UnwrapSDKContext(c context.Context) sdk.Context { - if watcher.Enable() { - return proxy.MakeContext(q.storeKey) - } return sdk.UnwrapSDKContext(c) } func (q grpcQuerier) PrefixStore(c context.Context, pre []byte) sdk.KVStore { + ctx := sdk.UnwrapSDKContext(c) if watcher.Enable() { - return watcher.NewReadStore(pre, nil) + return watcher.NewReadStore(ctx.GetWasmSimulateCache(), prefix.NewStore(ctx.KVStore(q.storeKey), pre)) } - ctx := sdk.UnwrapSDKContext(c) return prefix.NewStore(ctx.KVStore(q.storeKey), pre) } diff --git a/x/wasm/proxy/keeper_proxy.go b/x/wasm/proxy/keeper_proxy.go index e0387636e7..4c69dd2ec2 100644 --- a/x/wasm/proxy/keeper_proxy.go +++ b/x/wasm/proxy/keeper_proxy.go @@ -32,8 +32,6 @@ const ( accountBytesLen = 80 ) -var gasConfig = types2.KVGasConfig() - // AccountKeeperProxy defines the expected account keeper interface type AccountKeeperProxy struct { cachedAcc map[string]*apptypes.EthAccount @@ -63,6 +61,7 @@ func (a AccountKeeperProxy) IterateAccounts(ctx sdk.Context, cb func(account aut } func (a AccountKeeperProxy) GetAccount(ctx sdk.Context, addr sdk.AccAddress) authexported.Account { + gasConfig := types2.KVGasConfig() ctx.GasMeter().ConsumeGas(gasConfig.ReadCostFlat, types2.GasReadCostFlatDesc) ctx.GasMeter().ConsumeGas(gasConfig.ReadCostPerByte*accountBytesLen, types2.GasReadPerByteDesc) acc, ok := a.cachedAcc[addr.String()] @@ -82,6 +81,7 @@ func (a AccountKeeperProxy) SetAccount(ctx sdk.Context, account authexported.Acc a.cachedAcc = make(map[string]*apptypes.EthAccount) } a.cachedAcc[account.GetAddress().String()] = acc + gasConfig := types2.KVGasConfig() ctx.GasMeter().ConsumeGas(gasConfig.WriteCostFlat, types2.GasWriteCostFlatDesc) ctx.GasMeter().ConsumeGas(gasConfig.WriteCostPerByte*accountBytesLen, types2.GasWritePerByteDesc) return @@ -89,6 +89,7 @@ func (a AccountKeeperProxy) SetAccount(ctx sdk.Context, account authexported.Acc func (a AccountKeeperProxy) RemoveAccount(ctx sdk.Context, account authexported.Account) { delete(a.cachedAcc, account.GetAddress().String()) + gasConfig := types2.KVGasConfig() ctx.GasMeter().ConsumeGas(gasConfig.DeleteCost, types2.GasDeleteDesc) } diff --git a/x/wasm/simulate.go b/x/wasm/simulate.go index a5f6c47e75..c4fc50178a 100644 --- a/x/wasm/simulate.go +++ b/x/wasm/simulate.go @@ -11,6 +11,7 @@ import ( "github.com/okex/exchain/x/wasm/proxy" "github.com/okex/exchain/x/wasm/types" "github.com/okex/exchain/x/wasm/watcher" + "sync" ) type Simulator struct { @@ -31,12 +32,15 @@ func NewWasmSimulator() simulator.Simulator { } func (w *Simulator) Simulate(msgs []sdk.Msg, ms sdk.CacheMultiStore) (*sdk.Result, error) { + defer func() { + w.ctx.MoveWasmSimulateCacheToPool() + }() + w.ctx.SetWasmSimulateCache() //wasm Result has no Logs data := make([]byte, 0, len(msgs)) events := sdk.EmptyEvents() for _, msg := range msgs { - w.ctx.ResetWasmKvStoreForSimulate() w.ctx.SetMultiStore(ms) res, err := w.handler(w.ctx, msg) if err != nil { @@ -60,33 +64,41 @@ func (w *Simulator) Release() { return } proxy.PutBackStorePool(w.ctx.MultiStore().(sdk.CacheMultiStore)) - w.k.Cleanup() } +var ( + wasmKeeperCache keeper.Keeper + initwasmKeeper sync.Once +) + func NewProxyKeeper() keeper.Keeper { - cdc := codec.New() - RegisterCodec(cdc) - bank.RegisterCodec(cdc) - interfaceReg := types2.NewInterfaceRegistry() - RegisterInterfaces(interfaceReg) - bank.RegisterInterface(interfaceReg) - protoCdc := codec.NewProtoCodec(interfaceReg) + initwasmKeeper.Do(func() { + cdc := codec.New() + RegisterCodec(cdc) + bank.RegisterCodec(cdc) + interfaceReg := types2.NewInterfaceRegistry() + RegisterInterfaces(interfaceReg) + bank.RegisterInterface(interfaceReg) + protoCdc := codec.NewProtoCodec(interfaceReg) + + ss := proxy.SubspaceProxy{} + akp := proxy.NewAccountKeeperProxy() + bkp := proxy.NewBankKeeperProxy(akp) + pkp := proxy.PortKeeperProxy{} + ckp := proxy.CapabilityKeeperProxy{} + skp := proxy.SupplyKeeperProxy{} + msgRouter := baseapp.NewMsgServiceRouter() + msgRouter.SetInterfaceRegistry(interfaceReg) + queryRouter := baseapp.NewGRPCQueryRouter() + queryRouter.SetInterfaceRegistry(interfaceReg) - ss := proxy.SubspaceProxy{} - akp := proxy.NewAccountKeeperProxy() - bkp := proxy.NewBankKeeperProxy(akp) - pkp := proxy.PortKeeperProxy{} - ckp := proxy.CapabilityKeeperProxy{} - skp := proxy.SupplyKeeperProxy{} - msgRouter := baseapp.NewMsgServiceRouter() - msgRouter.SetInterfaceRegistry(interfaceReg) - queryRouter := baseapp.NewGRPCQueryRouter() - queryRouter.SetInterfaceRegistry(interfaceReg) + k := keeper.NewSimulateKeeper(codec.NewCodecProxy(protoCdc, cdc), ss, akp, bkp, nil, pkp, ckp, nil, msgRouter, queryRouter, WasmDir(), WasmConfig(), SupportedFeatures) + types.RegisterMsgServer(msgRouter, keeper.NewMsgServerImpl(keeper.NewDefaultPermissionKeeper(k))) + types.RegisterQueryServer(queryRouter, NewQuerier(&k)) + bank.RegisterBankMsgServer(msgRouter, bank.NewMsgServerImpl(bkp)) + bank.RegisterQueryServer(queryRouter, bank.NewBankQueryServer(bkp, skp)) + wasmKeeperCache = k + }) - k := keeper.NewSimulateKeeper(codec.NewCodecProxy(protoCdc, cdc), ss, akp, bkp, nil, pkp, ckp, nil, msgRouter, queryRouter, WasmDir(), WasmConfig(), SupportedFeatures) - types.RegisterMsgServer(msgRouter, keeper.NewMsgServerImpl(keeper.NewDefaultPermissionKeeper(k))) - types.RegisterQueryServer(queryRouter, NewQuerier(&k)) - bank.RegisterBankMsgServer(msgRouter, bank.NewMsgServerImpl(bkp)) - bank.RegisterQueryServer(queryRouter, bank.NewBankQueryServer(bkp, skp)) - return k + return wasmKeeperCache } diff --git a/x/wasm/types/tx.go b/x/wasm/types/tx.go index e02b6842fe..b04515e809 100644 --- a/x/wasm/types/tx.go +++ b/x/wasm/types/tx.go @@ -354,22 +354,6 @@ func (m *MsgStoreCode) CalFromAndToForPara() (string, string) { return strings.ToLower(ethcmm.BytesToAddress(m.GetSigners()[0]).String()[2:]), "" } -func (m *MsgInstantiateContract) CalFromAndToForPara() (string, string) { - return strings.ToLower(ethcmm.BytesToAddress(m.GetSigners()[0]).String()[2:]), "" -} - func (m *MsgExecuteContract) CalFromAndToForPara() (string, string) { return strings.ToLower(ethcmm.BytesToAddress(m.GetSigners()[0]).String()[2:]), m.Contract } - -func (m *MsgMigrateContract) CalFromAndToForPara() (string, string) { - return strings.ToLower(ethcmm.BytesToAddress(m.GetSigners()[0]).String()[2:]), m.Contract -} - -func (m *MsgUpdateAdmin) CalFromAndToForPara() (string, string) { - return strings.ToLower(ethcmm.BytesToAddress(m.GetSigners()[0]).String()[2:]), m.Contract -} - -func (m *MsgClearAdmin) CalFromAndToForPara() (string, string) { - return strings.ToLower(ethcmm.BytesToAddress(m.GetSigners()[0]).String()[2:]), m.Contract -} diff --git a/x/wasm/types/types.go b/x/wasm/types/types.go index 164909b70f..3f5bf17e51 100644 --- a/x/wasm/types/types.go +++ b/x/wasm/types/types.go @@ -11,6 +11,7 @@ import ( codectypes "github.com/okex/exchain/libs/cosmos-sdk/codec/types" sdk "github.com/okex/exchain/libs/cosmos-sdk/types" sdkerrors "github.com/okex/exchain/libs/cosmos-sdk/types/errors" + "github.com/okex/exchain/libs/tendermint/types" ) const ( @@ -280,6 +281,10 @@ func NewEnv(ctx sdk.Context, contractAddr sdk.WasmAddress) wasmvmtypes.Env { } else { if txCounter, ok := TXCounter(ctx); ok { env.Transaction = &wasmvmtypes.TransactionInfo{Index: txCounter} + } else if types.HigherThanVenus6(ctx.BlockHeight()) { + // fix smb caused by vm-bridge tx + // more detail see https://github.com/okx/oec/issues/2190 + env.Transaction = &wasmvmtypes.TransactionInfo{Index: 0} } } return env diff --git a/x/wasm/watcher/store.go b/x/wasm/watcher/store.go index 56fbe25d9a..60a471f20c 100644 --- a/x/wasm/watcher/store.go +++ b/x/wasm/watcher/store.go @@ -3,6 +3,7 @@ package watcher import ( "encoding/json" "github.com/okex/exchain/libs/cosmos-sdk/store/dbadapter" + "github.com/okex/exchain/libs/cosmos-sdk/store/prefix" cosmost "github.com/okex/exchain/libs/cosmos-sdk/store/types" "io" "log" @@ -11,7 +12,6 @@ import ( "github.com/okex/exchain/app/types" "github.com/okex/exchain/libs/cosmos-sdk/client/flags" - "github.com/okex/exchain/libs/cosmos-sdk/store/prefix" sdk "github.com/okex/exchain/libs/cosmos-sdk/types" dbm "github.com/okex/exchain/libs/tm-db" "github.com/okex/exchain/x/evm/watcher" @@ -106,25 +106,22 @@ func DeleteAccount(addr sdk.WasmAddress) { } } -func NewReadStore(pre []byte, store sdk.KVStore) sdk.KVStore { +func NewReadStore(mp map[string][]byte, store sdk.KVStore) sdk.KVStore { rs := &readStore{ - mp: make(map[string][]byte, 0), + mp: mp, kv: store, } - if len(pre) != 0 { - return prefix.NewStore(rs, pre) - } return rs } type Adapter struct{} func (a Adapter) NewStore(ctx sdk.Context, storeKey sdk.StoreKey, pre []byte) sdk.KVStore { - if ctx.WasmKvStoreForSimulate() != nil { - return ctx.WasmKvStoreForSimulate() + s := NewReadStore(ctx.GetWasmSimulateCache(), ctx.KVStore(storeKey)) + if len(pre) != 0 { + s = prefix.NewStore(s, pre) } - s := NewReadStore(pre, ctx.KVStore(storeKey)) - ctx.SetWasmKvStoreForSimulate(s) + return s }