From 758e94041e8972afd8e713fb2fbe73a54a7fc9e5 Mon Sep 17 00:00:00 2001 From: Artur Troian Date: Mon, 3 Nov 2025 12:17:55 -0600 Subject: [PATCH 1/6] feat: cosmwasm Signed-off-by: Artur Troian --- app/app.go | 20 +++++++++++ app/modules.go | 10 ++++++ app/types/app.go | 94 +++++++++++++++++++++++++++++++++++++++++++----- go.mod | 43 +++++++++++++--------- go.sum | 78 ++++++++++++++++++++++++---------------- 5 files changed, 189 insertions(+), 56 deletions(-) diff --git a/app/app.go b/app/app.go index 9d5af9848c..729fd64e46 100644 --- a/app/app.go +++ b/app/app.go @@ -8,6 +8,7 @@ import ( "path/filepath" "time" + wasmtypes "github.com/CosmWasm/wasmd/x/wasm/types" "github.com/gorilla/mux" "github.com/rakyll/statik/fs" "github.com/spf13/cast" @@ -27,6 +28,7 @@ import ( evidencetypes "cosmossdk.io/x/evidence/types" "cosmossdk.io/x/feegrant" upgradetypes "cosmossdk.io/x/upgrade/types" + "github.com/CosmWasm/wasmd/x/wasm" dbm "github.com/cosmos/cosmos-db" "github.com/cosmos/cosmos-sdk/baseapp" "github.com/cosmos/cosmos-sdk/client" @@ -56,6 +58,7 @@ import ( paramstypes "github.com/cosmos/cosmos-sdk/x/params/types" slashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" + ibcwasmtypes "github.com/cosmos/ibc-go/modules/light-clients/08-wasm/types" transfertypes "github.com/cosmos/ibc-go/v10/modules/apps/transfer/types" ibchost "github.com/cosmos/ibc-go/v10/modules/core/exported" ibctm "github.com/cosmos/ibc-go/v10/modules/light-clients/07-tendermint" @@ -142,6 +145,19 @@ func NewApp( invCheckPeriod: invCheckPeriod, } + wasmDir := filepath.Join(homePath, "wasm") + ibcWasmConfig := ibcwasmtypes.WasmConfig{ + DataDir: filepath.Join(homePath, "ibc_08-wasm"), + SupportedCapabilities: []string{"iterator", "stargate", "abort"}, + ContractDebugMode: false, + } + wasmConfig, err := wasm.ReadNodeConfig(appOpts) + // Uncomment this for debugging contracts. In the future this could be made into a param passed by the tests + // wasmConfig.ContractDebugMode = true + if err != nil { + panic(fmt.Sprintf("error while reading wasm config: %s", err)) + } + app.InitSpecialKeepers( app.cdc, aminoCdc, @@ -288,6 +304,8 @@ func orderBeginBlockers(_ []string) []string { ibctm.ModuleName, ibchost.ModuleName, feegrant.ModuleName, + // wasm after ibc transfer + wasmtypes.ModuleName, } } @@ -317,6 +335,8 @@ func OrderEndBlockers(_ []string) []string { transfertypes.ModuleName, ibchost.ModuleName, feegrant.ModuleName, + // wasm after ibc transfer + wasmtypes.ModuleName, } } diff --git a/app/modules.go b/app/modules.go index a2287bf49a..11c6044833 100644 --- a/app/modules.go +++ b/app/modules.go @@ -4,6 +4,7 @@ import ( "cosmossdk.io/x/evidence" feegrantmodule "cosmossdk.io/x/feegrant/module" "cosmossdk.io/x/upgrade" + "github.com/CosmWasm/wasmd/x/wasm" addresscodec "github.com/cosmos/cosmos-sdk/codec/address" "github.com/cosmos/cosmos-sdk/types/module" "github.com/cosmos/cosmos-sdk/x/auth" @@ -190,6 +191,15 @@ func appModules( app.cdc, app.Keepers.Akash.Cert, ), + wasm.NewAppModule( + app.cdc, + app.Keepers.External.Wasm, + app.Keepers.Cosmos.Staking, + app.Keepers.Cosmos.Acct, + app.Keepers.Cosmos.Bank, + app.MsgServiceRouter(), + nil, + ), } } diff --git a/app/types/app.go b/app/types/app.go index b07a4739bf..b13fc0ad5d 100644 --- a/app/types/app.go +++ b/app/types/app.go @@ -14,6 +14,9 @@ import ( feegrantkeeper "cosmossdk.io/x/feegrant/keeper" upgradekeeper "cosmossdk.io/x/upgrade/keeper" upgradetypes "cosmossdk.io/x/upgrade/types" + "github.com/CosmWasm/wasmd/x/wasm" + wasmkeeper "github.com/CosmWasm/wasmd/x/wasm/keeper" + wasmtypes "github.com/CosmWasm/wasmd/x/wasm/types" "github.com/cosmos/cosmos-sdk/baseapp" "github.com/cosmos/cosmos-sdk/codec" addresscodec "github.com/cosmos/cosmos-sdk/codec/address" @@ -45,23 +48,29 @@ import ( slashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types" stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" + icacontroller "github.com/cosmos/ibc-go/v10/modules/apps/27-interchain-accounts/controller" + icacontrollerkeeper "github.com/cosmos/ibc-go/v10/modules/apps/27-interchain-accounts/controller/keeper" icacontrollertypes "github.com/cosmos/ibc-go/v10/modules/apps/27-interchain-accounts/controller/types" + icahostkeeper "github.com/cosmos/ibc-go/v10/modules/apps/27-interchain-accounts/host/keeper" icahosttypes "github.com/cosmos/ibc-go/v10/modules/apps/27-interchain-accounts/host/types" + ibccallbacks "github.com/cosmos/ibc-go/v10/modules/apps/callbacks" "github.com/cosmos/ibc-go/v10/modules/apps/transfer" ibctransferkeeper "github.com/cosmos/ibc-go/v10/modules/apps/transfer/keeper" ibctransfertypes "github.com/cosmos/ibc-go/v10/modules/apps/transfer/types" + transferv2 "github.com/cosmos/ibc-go/v10/modules/apps/transfer/v2" ibcclienttypes "github.com/cosmos/ibc-go/v10/modules/core/02-client/types" ibcconnectiontypes "github.com/cosmos/ibc-go/v10/modules/core/03-connection/types" porttypes "github.com/cosmos/ibc-go/v10/modules/core/05-port/types" + ibcapi "github.com/cosmos/ibc-go/v10/modules/core/api" ibcexported "github.com/cosmos/ibc-go/v10/modules/core/exported" ibckeeper "github.com/cosmos/ibc-go/v10/modules/core/keeper" ibctm "github.com/cosmos/ibc-go/v10/modules/light-clients/07-tendermint" - emodule "pkg.akt.dev/go/node/escrow/module" atypes "pkg.akt.dev/go/node/audit/v1" ctypes "pkg.akt.dev/go/node/cert/v1" dtypes "pkg.akt.dev/go/node/deployment/v1" dv1beta "pkg.akt.dev/go/node/deployment/v1beta3" + emodule "pkg.akt.dev/go/node/escrow/module" agovtypes "pkg.akt.dev/go/node/gov/v1beta3" mtypes "pkg.akt.dev/go/node/market/v1beta4" ptypes "pkg.akt.dev/go/node/provider/v1beta4" @@ -103,6 +112,8 @@ type AppKeepers struct { IBC *ibckeeper.Keeper Evidence *evidencekeeper.Keeper Transfer ibctransferkeeper.Keeper + ICAController icacontrollerkeeper.Keeper + ICAHost icahostkeeper.Keeper } Akash struct { @@ -115,6 +126,10 @@ type AppKeepers struct { Cert ckeeper.Keeper } + External struct { + Wasm *wasmkeeper.Keeper + } + Modules struct { TMLight ibctm.LightClientModule } @@ -238,6 +253,9 @@ func (app *App) InitNormalKeepers( encodingConfig sdkutil.EncodingConfig, bApp *baseapp.BaseApp, maccPerms map[string][]string, + wasmDir string, + wasmConfig wasmtypes.NodeConfig, + wasmOpts []wasmkeeper.Option, blockedAddresses map[string]bool, invCheckPeriod uint, ) { @@ -386,14 +404,6 @@ func (app *App) InitNormalKeepers( authtypes.NewModuleAddress(govtypes.ModuleName).String(), ) - transferIBCModule := transfer.NewIBCModule(app.Keepers.Cosmos.Transfer) - - // Create static IBC router, add transfer route, then set and seal it - ibcRouter := porttypes.NewRouter() - ibcRouter.AddRoute(ibctransfertypes.ModuleName, transferIBCModule) - - app.Keepers.Cosmos.IBC.SetRouter(ibcRouter) - /// Light client modules clientKeeper := app.Keepers.Cosmos.IBC.ClientKeeper storeProvider := app.Keepers.Cosmos.IBC.ClientKeeper.GetStoreProvider() @@ -444,6 +454,70 @@ func (app *App) InitNormalKeepers( cdc, app.keys[ctypes.StoreKey], ) + + // The last arguments can contain custom message handlers, and custom query handlers, + // if we want to allow any custom callbacks + // The last arguments can contain custom message handlers, and custom query handlers, + // if we want to allow any custom callbacks + wasmCapabilities := wasmkeeper.BuiltInCapabilities() + wasmCapabilities = append(wasmCapabilities, "akash") + + wasmKeeper := wasmkeeper.NewKeeper( + cdc, + runtime.NewKVStoreService(app.keys[wasmtypes.StoreKey]), + app.Keepers.Cosmos.Acct, + app.Keepers.Cosmos.Bank, + *app.Keepers.Cosmos.Staking, + distrkeeper.NewQuerier(app.Keepers.Cosmos.Distr), + app.Keepers.Cosmos.IBC.ChannelKeeper, + app.Keepers.Cosmos.IBC.ChannelKeeper, + app.Keepers.Cosmos.IBC.ChannelKeeperV2, + app.Keepers.Cosmos.Transfer, + bApp.MsgServiceRouter(), + bApp.GRPCQueryRouter(), + wasmDir, + wasmConfig, + wasmtypes.VMConfig{}, + wasmCapabilities, + authtypes.NewModuleAddress(govtypes.ModuleName).String(), + wasmOpts..., + ) + app.Keepers.External.Wasm = &wasmKeeper + + // Create fee enabled wasm ibc Stack + wasmStackIBCHandler := wasm.NewIBCHandler(app.Keepers.External.Wasm, app.Keepers.Cosmos.IBC.ChannelKeeper, app.Keepers.Cosmos.Transfer, app.Keepers.Cosmos.IBC.ChannelKeeper) + + // Create Interchain Accounts Stack + // SendPacket, since it is originating from the application to core IBC: + // icaAuthModuleKeeper.SendTx -> icaController.SendPacket -> fee.SendPacket -> channel.SendPacket + var icaControllerStack porttypes.IBCModule + // integration point for custom authentication modules + // sees https://medium.com/the-interchain-foundation/ibc-go-v6-changes-to-interchain-accounts-and-how-it-impacts-your-chain-806c185300d7 + var noAuthzModule porttypes.IBCModule + icaControllerStack = icacontroller.NewIBCMiddlewareWithAuth(noAuthzModule, app.Keepers.Cosmos.ICAController) + // app.ICAAuthModule = icaControllerStack.(ibcmock.IBCModule) + icaControllerStack = icacontroller.NewIBCMiddlewareWithAuth(icaControllerStack, app.Keepers.Cosmos.ICAController) + icaControllerStack = ibccallbacks.NewIBCMiddleware(icaControllerStack, app.Keepers.Cosmos.IBC.ChannelKeeper, wasmStackIBCHandler, wasm.DefaultMaxIBCCallbackGas) + icaICS4Wrapper := icaControllerStack.(porttypes.ICS4Wrapper) + // Since the callback middleware itself is an ics4wrapper, it needs to be passed to the ica controller keeper + app.Keepers.Cosmos.ICAController.WithICS4Wrapper(icaICS4Wrapper) + + transferIBCModule := transfer.NewIBCModule(app.Keepers.Cosmos.Transfer) + + // Create static IBC router, add transfer route, then set and seal it + ibcRouter := porttypes.NewRouter() + ibcRouter.AddRoute(ibctransfertypes.ModuleName, transferIBCModule) + ibcRouter.AddRoute(wasmtypes.ModuleName, wasmStackIBCHandler) + + app.Keepers.Cosmos.IBC.SetRouter(ibcRouter) + + ibcRouterV2 := ibcapi.NewRouter() + ibcRouterV2 = ibcRouterV2. + AddRoute(ibctransfertypes.PortID, transferv2.NewIBCModule(app.Keepers.Cosmos.Transfer)). + AddPrefixRoute(wasmkeeper.PortIDPrefixV2, wasmkeeper.NewIBC2Handler(app.Keepers.External.Wasm)) + + app.Keepers.Cosmos.IBC.SetRouterV2(ibcRouterV2) + } func (app *App) SetupHooks() { @@ -517,6 +591,8 @@ func kvStoreKeys() []string { upgradetypes.StoreKey, evidencetypes.StoreKey, ibctransfertypes.StoreKey, + // wasm after ibc transfer + wasmtypes.ModuleName, } keys = append(keys, akashKVStoreKeys()...) diff --git a/go.mod b/go.mod index 339852b4a9..0e44efdb2d 100644 --- a/go.mod +++ b/go.mod @@ -4,21 +4,23 @@ go 1.25.2 require ( cosmossdk.io/api v0.9.2 - cosmossdk.io/collections v1.2.1 + cosmossdk.io/collections v1.3.1 cosmossdk.io/core v0.11.3 cosmossdk.io/depinject v1.2.1 cosmossdk.io/errors v1.0.2 - cosmossdk.io/log v1.6.0 + cosmossdk.io/log v1.6.1 cosmossdk.io/math v1.5.3 cosmossdk.io/store v1.1.2 cosmossdk.io/x/evidence v0.2.0 cosmossdk.io/x/feegrant v0.2.0 cosmossdk.io/x/upgrade v0.2.0 + github.com/CosmWasm/wasmd v0.61.4 github.com/boz/go-lifecycle v0.1.1 github.com/cometbft/cometbft v0.38.17 - github.com/cosmos/cosmos-db v1.1.1 - github.com/cosmos/cosmos-sdk v0.53.3 + github.com/cosmos/cosmos-db v1.1.3 + github.com/cosmos/cosmos-sdk v0.53.4 github.com/cosmos/gogoproto v1.7.0 + github.com/cosmos/ibc-go/modules/light-clients/08-wasm v0.4.2-0.20240730185033-ccd4dc278e72 github.com/cosmos/ibc-go/v10 v10.3.0 github.com/cosmos/rosetta v0.50.12 github.com/golang-jwt/jwt/v5 v5.2.3 @@ -29,7 +31,7 @@ require ( github.com/grpc-ecosystem/grpc-gateway v1.16.0 github.com/ianlancetaylor/cgosymbolizer v0.0.0-20250410214317-b8ecc8b6bbe6 github.com/pkg/errors v0.9.1 - github.com/prometheus/client_golang v1.22.0 + github.com/prometheus/client_golang v1.23.0 github.com/rakyll/statik v0.1.7 github.com/regen-network/cosmos-proto v0.3.1 github.com/rs/zerolog v1.34.0 @@ -37,7 +39,7 @@ require ( github.com/spf13/cobra v1.9.1 github.com/spf13/pflag v1.0.7 github.com/spf13/viper v1.20.1 - github.com/stretchr/testify v1.10.0 + github.com/stretchr/testify v1.11.0 go.step.sm/crypto v0.45.1 golang.org/x/mod v0.25.0 golang.org/x/oauth2 v0.30.0 @@ -90,6 +92,8 @@ require ( filippo.io/edwards25519 v1.1.0 // indirect github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 // indirect github.com/99designs/keyring v1.2.2 // indirect + github.com/CosmWasm/wasmvm/v2 v2.1.4 // indirect + github.com/CosmWasm/wasmvm/v3 v3.0.2 // indirect github.com/DataDog/datadog-go v4.8.3+incompatible // indirect github.com/DataDog/zstd v1.5.7 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.27.0 // indirect @@ -105,7 +109,7 @@ require ( github.com/bits-and-blooms/bitset v1.22.0 // indirect github.com/blang/semver/v4 v4.0.0 // indirect github.com/bytedance/gopkg v0.1.3 // indirect - github.com/bytedance/sonic v1.13.2 // indirect + github.com/bytedance/sonic v1.14.0 // indirect github.com/bytedance/sonic/loader v0.3.0 // indirect github.com/cenkalti/backoff/v4 v4.3.0 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect @@ -125,7 +129,9 @@ require ( github.com/cosmos/cosmos-proto v1.0.0-beta.5 // indirect github.com/cosmos/go-bip39 v1.0.0 // indirect github.com/cosmos/gogogateway v1.2.0 // indirect - github.com/cosmos/iavl v1.2.2 // indirect + github.com/cosmos/iavl v1.2.4 // indirect + github.com/cosmos/ibc-go/modules/capability v1.0.1 // indirect + github.com/cosmos/ibc-go/v8 v8.4.0 // indirect github.com/cosmos/ics23/go v0.11.0 // indirect github.com/cosmos/ledger-cosmos-go v0.14.0 // indirect github.com/cosmos/rosetta-sdk-go v0.10.0 // indirect @@ -136,6 +142,7 @@ require ( github.com/desertbit/timer v1.0.1 // indirect github.com/dgraph-io/badger/v4 v4.6.0 // indirect github.com/dgraph-io/ristretto/v2 v2.1.0 // indirect + github.com/distribution/reference v0.5.0 // indirect github.com/dustin/go-humanize v1.0.1 // indirect github.com/dvsekhvalnov/jose2go v1.8.0 // indirect github.com/edwingeng/deque/v2 v2.1.1 // indirect @@ -147,7 +154,7 @@ require ( github.com/felixge/httpsnoop v1.0.4 // indirect github.com/fsnotify/fsnotify v1.9.0 // indirect github.com/fxamacker/cbor/v2 v2.7.0 // indirect - github.com/getsentry/sentry-go v0.32.0 // indirect + github.com/getsentry/sentry-go v0.33.0 // indirect github.com/go-errors/errors v1.5.1 // indirect github.com/go-jose/go-jose/v4 v4.0.5 // indirect github.com/go-kit/kit v0.13.0 // indirect @@ -165,6 +172,7 @@ require ( github.com/google/flatbuffers v25.2.10+incompatible // indirect github.com/google/go-cmp v0.7.0 // indirect github.com/google/go-querystring v1.1.0 // indirect + github.com/google/gofuzz v1.2.0 // indirect github.com/google/orderedcode v0.0.1 // indirect github.com/google/s2a-go v0.1.9 // indirect github.com/google/uuid v1.6.0 // indirect @@ -175,7 +183,7 @@ require ( github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 // indirect github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect - github.com/hashicorp/go-getter v1.7.8 // indirect + github.com/hashicorp/go-getter v1.7.9 // indirect github.com/hashicorp/go-hclog v1.6.3 // indirect github.com/hashicorp/go-immutable-radix v1.3.1 // indirect github.com/hashicorp/go-metrics v0.5.4 // indirect @@ -206,7 +214,6 @@ require ( github.com/mdp/qrterminal/v3 v3.2.1 // indirect github.com/minio/highwayhash v1.0.3 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect - github.com/mitchellh/go-testing-interface v1.14.1 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect @@ -214,19 +221,21 @@ require ( github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/oasisprotocol/curve25519-voi v0.0.0-20230904125328-1f23a7beb09a // indirect github.com/oklog/run v1.1.0 // indirect + github.com/opencontainers/go-digest v1.0.0 // indirect github.com/pelletier/go-toml/v2 v2.2.4 // indirect github.com/petermattis/goid v0.0.0-20240813172612-4fcff4a6cae7 // indirect github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.63.0 // indirect - github.com/prometheus/procfs v0.15.1 // indirect + github.com/prometheus/client_model v0.6.2 // indirect + github.com/prometheus/common v0.65.0 // indirect + github.com/prometheus/procfs v0.16.1 // indirect github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect github.com/rogpeppe/go-internal v1.14.1 // indirect github.com/rs/cors v1.11.1 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/sagikazarmark/locafero v0.7.0 // indirect github.com/sasha-s/go-deadlock v0.3.5 // indirect + github.com/shamaton/msgpack/v2 v2.2.3 // indirect github.com/sourcegraph/conc v0.3.0 // indirect github.com/spf13/afero v1.12.0 // indirect github.com/spiffe/go-spiffe/v2 v2.5.0 // indirect @@ -236,7 +245,7 @@ require ( github.com/tendermint/go-amino v0.16.0 // indirect github.com/tidwall/btree v1.7.0 // indirect github.com/twitchyliquid64/golang-asm v0.15.1 // indirect - github.com/ulikunitz/xz v0.5.11 // indirect + github.com/ulikunitz/xz v0.5.14 // indirect github.com/x448/float16 v0.8.4 // indirect github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f // indirect github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect @@ -257,7 +266,7 @@ require ( go.uber.org/mock v0.5.2 // indirect go.uber.org/multierr v1.11.0 // indirect go.yaml.in/yaml/v2 v2.4.2 // indirect - golang.org/x/arch v0.15.0 // indirect + golang.org/x/arch v0.17.0 // indirect golang.org/x/crypto v0.40.0 // indirect golang.org/x/exp v0.0.0-20250305212735-054e65f0b394 // indirect golang.org/x/net v0.42.0 // indirect @@ -276,7 +285,7 @@ require ( k8s.io/apimachinery v0.33.3 // indirect k8s.io/klog/v2 v2.130.1 // indirect k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 // indirect - nhooyr.io/websocket v1.8.11 // indirect + nhooyr.io/websocket v1.8.17 // indirect pgregory.net/rapid v1.2.0 // indirect pkg.akt.dev/specs v0.0.1 // indirect rsc.io/qr v0.2.0 // indirect diff --git a/go.sum b/go.sum index 617a7731c5..240e7292ad 100644 --- a/go.sum +++ b/go.sum @@ -1209,22 +1209,26 @@ cloud.google.com/go/workflows v1.12.2/go.mod h1:+OmBIgNqYJPVggnMo9nqmizW0qEXHhmn cloud.google.com/go/workflows v1.12.3/go.mod h1:fmOUeeqEwPzIU81foMjTRQIdwQHADi/vEr1cx9R1m5g= cosmossdk.io/api v0.9.2 h1:9i9ptOBdmoIEVEVWLtYYHjxZonlF/aOVODLFaxpmNtg= cosmossdk.io/api v0.9.2/go.mod h1:CWt31nVohvoPMTlPv+mMNCtC0a7BqRdESjCsstHcTkU= -cosmossdk.io/collections v1.2.1 h1:mAlNMs5vJwkda4TA+k5q/43p24RVAQ/qyDrjANu3BXE= -cosmossdk.io/collections v1.2.1/go.mod h1:PSsEJ/fqny0VPsHLFT6gXDj/2C1tBOTS9eByK0+PBFU= +cosmossdk.io/client/v2 v2.0.0-beta.3 h1:+TTuH0DwQYsUq2JFAl3fDZzKq5gQG7nt3dAattkjFDU= +cosmossdk.io/client/v2 v2.0.0-beta.3/go.mod h1:CZcL41HpJPOOayTCO28j8weNBQprG+SRiKX39votypo= +cosmossdk.io/collections v1.3.1 h1:09e+DUId2brWsNOQ4nrk+bprVmMUaDH9xvtZkeqIjVw= +cosmossdk.io/collections v1.3.1/go.mod h1:ynvkP0r5ruAjbmedE+vQ07MT6OtJ0ZIDKrtJHK7Q/4c= cosmossdk.io/core v0.11.3 h1:mei+MVDJOwIjIniaKelE3jPDqShCc/F4LkNNHh+4yfo= cosmossdk.io/core v0.11.3/go.mod h1:9rL4RE1uDt5AJ4Tg55sYyHWXA16VmpHgbe0PbJc6N2Y= cosmossdk.io/depinject v1.2.1 h1:eD6FxkIjlVaNZT+dXTQuwQTKZrFZ4UrfCq1RKgzyhMw= cosmossdk.io/depinject v1.2.1/go.mod h1:lqQEycz0H2JXqvOgVwTsjEdMI0plswI7p6KX+MVqFOM= cosmossdk.io/errors v1.0.2 h1:wcYiJz08HThbWxd/L4jObeLaLySopyyuUFB5w4AGpCo= cosmossdk.io/errors v1.0.2/go.mod h1:0rjgiHkftRYPj//3DrD6y8hcm40HcPv/dR4R/4efr0k= -cosmossdk.io/log v1.6.0 h1:SJIOmJ059wi1piyRgNRXKXhlDXGqnB5eQwhcZKv2tOk= -cosmossdk.io/log v1.6.0/go.mod h1:5cXXBvfBkR2/BcXmosdCSLXllvgSjphrrDVdfVRmBGM= +cosmossdk.io/log v1.6.1 h1:YXNwAgbDwMEKwDlCdH8vPcoggma48MgZrTQXCfmMBeI= +cosmossdk.io/log v1.6.1/go.mod h1:gMwsWyyDBjpdG9u2avCFdysXqxq28WJapJvu+vF1y+E= cosmossdk.io/math v1.5.3 h1:WH6tu6Z3AUCeHbeOSHg2mt9rnoiUWVWaQ2t6Gkll96U= cosmossdk.io/math v1.5.3/go.mod h1:uqcZv7vexnhMFJF+6zh9EWdm/+Ylyln34IvPnBauPCQ= cosmossdk.io/schema v1.1.0 h1:mmpuz3dzouCoyjjcMcA/xHBEmMChN+EHh8EHxHRHhzE= cosmossdk.io/schema v1.1.0/go.mod h1:Gb7pqO+tpR+jLW5qDcNOSv0KtppYs7881kfzakguhhI= cosmossdk.io/store v1.1.2 h1:3HOZG8+CuThREKv6cn3WSohAc6yccxO3hLzwK6rBC7o= cosmossdk.io/store v1.1.2/go.mod h1:60rAGzTHevGm592kFhiUVkNC9w7gooSEn5iUBPzHQ6A= +cosmossdk.io/x/circuit v0.1.1 h1:KPJCnLChWrxD4jLwUiuQaf5mFD/1m7Omyo7oooefBVQ= +cosmossdk.io/x/circuit v0.1.1/go.mod h1:B6f/urRuQH8gjt4eLIXfZJucrbreuYrKh5CSjaOxr+Q= cosmossdk.io/x/evidence v0.2.0 h1:o72zbmgCM7U0v7z7b0XnMB+NqX0tFamqb1HHkQbhrZ0= cosmossdk.io/x/evidence v0.2.0/go.mod h1:zx/Xqy+hnGVzkqVuVuvmP9KsO6YCl4SfbAetYi+k+sE= cosmossdk.io/x/feegrant v0.2.0 h1:oq3WVpoJdxko/XgWmpib63V1mYy9ZQN/1qxDajwGzJ8= @@ -1244,6 +1248,12 @@ github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4/go.mod h1:hN github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/CosmWasm/wasmd v0.61.4 h1:4NzvRyZ49+3t21BGeWP7FUZliC4+pNZSmezJDWrQ83s= +github.com/CosmWasm/wasmd v0.61.4/go.mod h1:nRS0sxWUXeeFBAw5Jo7FXU4YwnkaqdLUq38HrDjjWn0= +github.com/CosmWasm/wasmvm/v2 v2.1.4 h1:7EUVQjBxXHkVjL2AqqXD7hMEe0dmoNn2li9E4PWRAnA= +github.com/CosmWasm/wasmvm/v2 v2.1.4/go.mod h1:bMhLQL4Yp9CzJi9A83aR7VO9wockOsSlZbT4ztOl6bg= +github.com/CosmWasm/wasmvm/v3 v3.0.2 h1:+MLkOX+IdklITLqfG26PCFv5OXdZvNb8z5Wq5JFXTRM= +github.com/CosmWasm/wasmvm/v3 v3.0.2/go.mod h1:oknpb1bFERvvKcY7vHRp1F/Y/z66xVrsl7n9uWkOAlM= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/DataDog/datadog-go v4.8.3+incompatible h1:fNGaYSuObuQb5nzeTQqowRAd9bpDIRRV4/gUtIBjh8Q= github.com/DataDog/datadog-go v4.8.3+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= @@ -1418,18 +1428,24 @@ github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSV github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cosmos/btcutil v1.0.5 h1:t+ZFcX77LpKtDBhjucvnOH8C2l2ioGsBNEQ3jef8xFk= github.com/cosmos/btcutil v1.0.5/go.mod h1:IyB7iuqZMJlthe2tkIFL33xPyzbFYP0XVdS8P5lUPis= -github.com/cosmos/cosmos-db v1.1.1 h1:FezFSU37AlBC8S98NlSagL76oqBRWq/prTPvFcEJNCM= -github.com/cosmos/cosmos-db v1.1.1/go.mod h1:AghjcIPqdhSLP/2Z0yha5xPH3nLnskz81pBx3tcVSAw= +github.com/cosmos/cosmos-db v1.1.3 h1:7QNT77+vkefostcKkhrzDK9uoIEryzFrU9eoMeaQOPY= +github.com/cosmos/cosmos-db v1.1.3/go.mod h1:kN+wGsnwUJZYn8Sy5Q2O0vCYA99MJllkKASbs6Unb9U= github.com/cosmos/cosmos-proto v1.0.0-beta.5 h1:eNcayDLpip+zVLRLYafhzLvQlSmyab+RC5W7ZfmxJLA= github.com/cosmos/cosmos-proto v1.0.0-beta.5/go.mod h1:hQGLpiIUloJBMdQMMWb/4wRApmI9hjHH05nefC0Ojec= github.com/cosmos/go-bip39 v1.0.0 h1:pcomnQdrdH22njcAatO0yWojsUnCO3y2tNoV1cb6hHY= github.com/cosmos/go-bip39 v1.0.0/go.mod h1:RNJv0H/pOIVgxw6KS7QeX2a0Uo0aKUlfhZ4xuwvCdJw= github.com/cosmos/gogogateway v1.2.0 h1:Ae/OivNhp8DqBi/sh2A8a1D0y638GpL3tkmLQAiKxTE= github.com/cosmos/gogogateway v1.2.0/go.mod h1:iQpLkGWxYcnCdz5iAdLcRBSw3h7NXeOkZ4GUkT+tbFI= -github.com/cosmos/iavl v1.2.2 h1:qHhKW3I70w+04g5KdsdVSHRbFLgt3yY3qTMd4Xa4rC8= -github.com/cosmos/iavl v1.2.2/go.mod h1:GiM43q0pB+uG53mLxLDzimxM9l/5N9UuSY3/D0huuVw= +github.com/cosmos/iavl v1.2.4 h1:IHUrG8dkyueKEY72y92jajrizbkZKPZbMmG14QzsEkw= +github.com/cosmos/iavl v1.2.4/go.mod h1:GiM43q0pB+uG53mLxLDzimxM9l/5N9UuSY3/D0huuVw= +github.com/cosmos/ibc-go/modules/capability v1.0.1 h1:ibwhrpJ3SftEEZRxCRkH0fQZ9svjthrX2+oXdZvzgGI= +github.com/cosmos/ibc-go/modules/capability v1.0.1/go.mod h1:rquyOV262nGJplkumH+/LeYs04P3eV8oB7ZM4Ygqk4E= +github.com/cosmos/ibc-go/modules/light-clients/08-wasm v0.4.2-0.20240730185033-ccd4dc278e72 h1:QjCi4bJoy9AXLL1e4jqi+4rHYN0gGZAQxf937cdWhw4= +github.com/cosmos/ibc-go/modules/light-clients/08-wasm v0.4.2-0.20240730185033-ccd4dc278e72/go.mod h1:yiulzyQAZ+Ci802z/kVQqTA3lGiSJOmDpTq7kZxOUNE= github.com/cosmos/ibc-go/v10 v10.3.0 h1:w5DkHih8qn15deAeFoTk778WJU+xC1krJ5kDnicfUBc= github.com/cosmos/ibc-go/v10 v10.3.0/go.mod h1:CthaR7n4d23PJJ7wZHegmNgbVcLXCQql7EwHrAXnMtw= +github.com/cosmos/ibc-go/v8 v8.4.0 h1:K2PfX0AZ+1XKZytHGEMuSjQXG/MZshPb83RSTQt2+cE= +github.com/cosmos/ibc-go/v8 v8.4.0/go.mod h1:zh6x1osR0hNvEcFrC/lhGD08sMfQmr9wHVvZ/mRWMCs= github.com/cosmos/ics23/go v0.11.0 h1:jk5skjT0TqX5e5QJbEnwXIS2yI2vnmLOgpQPeM5RtnU= github.com/cosmos/ics23/go v0.11.0/go.mod h1:A8OjxPE67hHST4Icw94hOxxFEJMBG031xIGF/JHNIY0= github.com/cosmos/keyring v1.2.0 h1:8C1lBP9xhImmIabyXW4c3vFjjLiBdGCmfLUfeZlV1Yo= @@ -1465,6 +1481,8 @@ github.com/dgraph-io/ristretto/v2 v2.1.0/go.mod h1:uejeqfYXpUomfse0+lO+13ATz4Typ github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WAFKLNi6ZS0675eEUC9y3AlwSbQu1Y= github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/distribution/reference v0.5.0 h1:/FUIFXtfc/x2gpa5/VGfiGLuOIdYa1t65IKK2OFGvA0= +github.com/distribution/reference v0.5.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= @@ -1537,8 +1555,8 @@ github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E= github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ= -github.com/getsentry/sentry-go v0.32.0 h1:YKs+//QmwE3DcYtfKRH8/KyOOF/I6Qnx7qYGNHCGmCY= -github.com/getsentry/sentry-go v0.32.0/go.mod h1:CYNcMMz73YigoHljQRG+qPF+eMq8gG72XcGN/p71BAY= +github.com/getsentry/sentry-go v0.33.0 h1:YWyDii0KGVov3xOaamOnF0mjOrqSjBqwv48UEzn7QFg= +github.com/getsentry/sentry-go v0.33.0/go.mod h1:C55omcY9ChRQIUcVcGcs+Zdy4ZpQGvNJ7JYHIoSWOtE= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= @@ -1783,8 +1801,8 @@ github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtng github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= -github.com/hashicorp/go-getter v1.7.8 h1:mshVHx1Fto0/MydBekWan5zUipGq7jO0novchgMmSiY= -github.com/hashicorp/go-getter v1.7.8/go.mod h1:2c6CboOEb9jG6YvmC9xdD+tyAFsrUaJPedwXDGr0TM4= +github.com/hashicorp/go-getter v1.7.9 h1:G9gcjrDixz7glqJ+ll5IWvggSBR+R0B54DSRt4qfdC4= +github.com/hashicorp/go-getter v1.7.9/go.mod h1:dyFCmT1AQkDfOIt9NH8pw9XBDqNrIKJT5ylbpi7zPNE= github.com/hashicorp/go-hclog v1.6.3 h1:Qr2kF+eVWjTiYmU7Y31tYlP1h0q/X3Nl3tPGdaB11/k= github.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= @@ -1947,8 +1965,6 @@ github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrk github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/go-testing-interface v1.14.1 h1:jrgshOhYAUVNMAJiKbEu7EqAwgJJ2JqpQmpLJOu07cU= -github.com/mitchellh/go-testing-interface v1.14.1/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8= github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= @@ -2055,8 +2071,8 @@ github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeD 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.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.22.0 h1:rb93p9lokFEsctTys46VnV1kLCDpVZ0a/Y92Vm0Zc6Q= -github.com/prometheus/client_golang v1.22.0/go.mod h1:R7ljNsLXhuQXYZYtw6GAE9AZg8Y7vEW5scdCXrWRXC0= +github.com/prometheus/client_golang v1.23.0 h1:ust4zpdl9r4trLY/gSjlm07PuiBq2ynaXXlptpfy8Uc= +github.com/prometheus/client_golang v1.23.0/go.mod h1:i/o0R9ByOnHX0McrTMTyhYvKE4haaf2mW08I+jGAjEE= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= @@ -2066,8 +2082,8 @@ github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6T github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= +github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= +github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= @@ -2075,8 +2091,8 @@ github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8b github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.63.0 h1:YR/EIY1o3mEFP/kZCD7iDMnLPlGyuU2Gb3HIcXnA98k= -github.com/prometheus/common v0.63.0/go.mod h1:VVFF/fBIoToEnWRVkYoXEkq3R3paCoxG9PXP74SnV18= +github.com/prometheus/common v0.65.0 h1:QDwzd+G1twt//Kwj/Ww6E9FQq1iVMmODnILtW1t2VzE= +github.com/prometheus/common v0.65.0/go.mod h1:0gZns+BLRQ3V6NdaerOhMbwwRbNh9hkGINtQAsP5GS8= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= @@ -2084,8 +2100,8 @@ github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+Gx github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.3.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= -github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= +github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzMyRg= +github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is= github.com/rakyll/statik v0.1.7 h1:OF3QCZUuyPxuGEP7B4ypUa7sB/iHtqOTDYZXGM8KOdQ= github.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= @@ -2122,6 +2138,8 @@ github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0 github.com/sasha-s/go-deadlock v0.3.5 h1:tNCOEEDG6tBqrNDOX35j/7hL5FcFViG6awUGROb2NsU= github.com/sasha-s/go-deadlock v0.3.5/go.mod h1:bugP6EGbdGYObIlx7pUZtWqlvo8k9H6vCBBsiChJQ5U= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/shamaton/msgpack/v2 v2.2.3 h1:uDOHmxQySlvlUYfQwdjxyybAOzjlQsD1Vjy+4jmO9NM= +github.com/shamaton/msgpack/v2 v2.2.3/go.mod h1:6khjYnkx73f7VQU7wjcFS9DFjs+59naVWJv1TB7qdOI= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= @@ -2180,8 +2198,8 @@ github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= -github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.11.0 h1:ib4sjIrwZKxE5u/Japgo/7SJV3PvgjGiRNAvTVGqQl8= +github.com/stretchr/testify v1.11.0/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= @@ -2197,8 +2215,8 @@ github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2 github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= github.com/ulikunitz/xz v0.5.10/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= -github.com/ulikunitz/xz v0.5.11 h1:kpFauv27b6ynzBNT/Xy+1k+fK4WswhN/6PN5WhFAGw8= -github.com/ulikunitz/xz v0.5.11/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= +github.com/ulikunitz/xz v0.5.14 h1:uv/0Bq533iFdnMHZdRBTOlaNMdb1+ZxXIlHDZHIHcvg= +github.com/ulikunitz/xz v0.5.14/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= @@ -2297,8 +2315,8 @@ go.yaml.in/yaml/v2 v2.4.2 h1:DzmwEr2rDGHl7lsFgAHxmNz/1NlQ7xLIrlN2h5d1eGI= go.yaml.in/yaml/v2 v2.4.2/go.mod h1:081UH+NErpNdqlCXm3TtEran0rJZGxAYx9hb/ELlsPU= go.yaml.in/yaml/v3 v3.0.3 h1:bXOww4E/J3f66rav3pX3m8w6jDE4knZjGOw8b5Y6iNE= go.yaml.in/yaml/v3 v3.0.3/go.mod h1:tBHosrYAkRZjRAOREWbDnBXUf08JOwYq++0QNwQiWzI= -golang.org/x/arch v0.15.0 h1:QtOrQd0bTUnhNVNndMpLHNWrDmYzZ2KDqSrEymqInZw= -golang.org/x/arch v0.15.0/go.mod h1:JmwW7aLIoRUKgaTzhkiEFxvcEiQGyOg9BMonBJUS7EE= +golang.org/x/arch v0.17.0 h1:4O3dfLzd+lQewptAHqjewQZQDyEdejz3VwgeYwkZneU= +golang.org/x/arch v0.17.0/go.mod h1:bdwinDaKcfZUGpH09BB7ZmOfhalA8lQdzl62l8gGWsk= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= @@ -3272,8 +3290,8 @@ modernc.org/token v1.0.1/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= modernc.org/z v1.5.1/go.mod h1:eWFB510QWW5Th9YGZT81s+LwvaAs3Q2yr4sP0rmLkv8= nhooyr.io/websocket v1.8.6/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= -nhooyr.io/websocket v1.8.11 h1:f/qXNc2/3DpoSZkHt1DQu6rj4zGC8JmkkLkWss0MgN0= -nhooyr.io/websocket v1.8.11/go.mod h1:rN9OFWIUwuxg4fR5tELlYC04bXYowCP9GX47ivo2l+c= +nhooyr.io/websocket v1.8.17 h1:KEVeLJkUywCKVsnLIDlD/5gtayKp8VoCkksHCGGfT9Y= +nhooyr.io/websocket v1.8.17/go.mod h1:rN9OFWIUwuxg4fR5tELlYC04bXYowCP9GX47ivo2l+c= pgregory.net/rapid v0.5.5 h1:jkgx1TjbQPD/feRoK+S/mXw9e1uj6WilpHrXJowi6oA= pgregory.net/rapid v0.5.5/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04= pkg.akt.dev/go v0.1.5 h1:UdhU70YOzfJzzd1mT6dpnK7/5RWwV7N1zr1HRNmqtaw= From a42de2beac00395692cdb69a756429103f0e3669 Mon Sep 17 00:00:00 2001 From: Artur Troian Date: Tue, 4 Nov 2025 10:43:13 -0600 Subject: [PATCH 2/6] feat(x/wasm): enable smart contracts on akash Signed-off-by: Artur Troian --- app/app.go | 50 +++- app/app_configure.go | 19 +- app/config.go | 2 + app/modules.go | 37 ++- app/sim/sim_utils.go | 2 +- app/sim_test.go | 118 +++++--- app/testnet.go | 2 +- app/types/app.go | 42 ++- app/upgrades.go | 4 +- cmd/akash/cmd/app_creator.go | 2 +- cmd/akash/cmd/root.go | 4 +- cmd/akash/cmd/testnetify/config.go | 2 +- cmd/akash/cmd/testnetify/testnetify.go | 4 +- cmd/akash/cmd/testnetify/utils.go | 2 +- cmd/akash/main.go | 2 +- docgen/main.go | 2 +- go.mod | 10 +- go.sum | 16 +- pubsub/bus_test.go | 2 +- tests/e2e/certs_cli_test.go | 2 +- tests/e2e/certs_grpc_test.go | 2 +- tests/e2e/cli_test.go | 2 +- tests/e2e/deployment_cli_test.go | 2 +- tests/e2e/deployment_grpc_test.go | 2 +- tests/e2e/grpc_test.go | 2 +- tests/e2e/market_cli_test.go | 2 +- tests/e2e/market_grpc_test.go | 2 +- tests/e2e/provider_cli_test.go | 2 +- tests/e2e/provider_grpc_test.go | 2 +- tests/upgrade/upgrade_test.go | 6 +- tests/upgrade/workers_test.go | 4 +- testutil/network/network.go | 2 +- testutil/network_suite.go | 2 +- testutil/state/suite.go | 19 +- testutil/types.go | 4 +- tools/upgrade-info/main.go | 2 +- upgrades/software/v1.0.0/audit.go | 56 ---- upgrades/software/v1.0.0/cert.go | 54 ---- upgrades/software/v1.0.0/deployment.go | 123 -------- upgrades/software/v1.0.0/escrow.go | 120 -------- upgrades/software/v1.0.0/init.go | 27 -- upgrades/software/v1.0.0/market.go | 198 ------------- upgrades/software/v1.0.0/provider.go | 65 ----- upgrades/software/v1.0.0/take.go | 27 -- upgrades/software/v1.0.0/upgrade.go | 346 ----------------------- upgrades/software/v2.0.0/init.go | 11 + upgrades/software/v2.0.0/upgrade.go | 87 ++++++ upgrades/types/types.go | 2 +- upgrades/upgrades.go | 2 +- upgrades/upgrades_test.go | 2 +- util/partialord/internal/dag/dag_test.go | 2 +- util/partialord/partialord.go | 2 +- util/partialord/partialord_test.go | 2 +- util/query/pagination.go | 2 +- x/audit/alias.go | 2 +- x/audit/genesis.go | 2 +- x/audit/handler/handler.go | 2 +- x/audit/handler/handler_test.go | 4 +- x/audit/handler/msg_server.go | 2 +- x/audit/keeper/grpc_query_test.go | 6 +- x/audit/keeper/keeper_test.go | 2 +- x/audit/keeper/key.go | 2 +- x/audit/module.go | 4 +- x/cert/alias.go | 2 +- x/cert/genesis.go | 2 +- x/cert/handler/handler.go | 2 +- x/cert/handler/handler_test.go | 4 +- x/cert/handler/msg_server.go | 2 +- x/cert/keeper/grpc_query.go | 2 +- x/cert/keeper/grpc_query_test.go | 4 +- x/cert/keeper/keeper_test.go | 2 +- x/cert/keeper/key.go | 2 +- x/cert/module.go | 6 +- x/cert/utils/key_pair_manager.go | 2 +- x/cert/utils/utils.go | 2 +- x/deployment/alias.go | 2 +- x/deployment/genesis.go | 2 +- x/deployment/handler/handler.go | 2 +- x/deployment/handler/handler_test.go | 12 +- x/deployment/handler/server.go | 2 +- x/deployment/keeper/grpc_query.go | 2 +- x/deployment/keeper/grpc_query_test.go | 8 +- x/deployment/keeper/keeper_test.go | 4 +- x/deployment/module.go | 6 +- x/deployment/simulation/operations.go | 6 +- x/escrow/genesis.go | 2 +- x/escrow/handler/handler.go | 2 +- x/escrow/handler/server.go | 2 +- x/escrow/keeper/grpc_query.go | 2 +- x/escrow/keeper/grpc_query_test.go | 6 +- x/escrow/keeper/keeper_test.go | 6 +- x/escrow/module.go | 6 +- x/escrow/query/querier.go | 2 +- x/market/alias.go | 2 +- x/market/client/rest/params.go | 2 +- x/market/client/rest/rest.go | 2 +- x/market/genesis.go | 4 +- x/market/handler/handler_test.go | 4 +- x/market/handler/keepers.go | 2 +- x/market/keeper/grpc_query.go | 4 +- x/market/keeper/grpc_query_test.go | 4 +- x/market/keeper/keeper.go | 2 +- x/market/keeper/keeper_test.go | 4 +- x/market/module.go | 10 +- x/market/query/path.go | 2 +- x/market/simulation/operations.go | 6 +- x/market/simulation/utils.go | 2 +- x/provider/alias.go | 2 +- x/provider/genesis.go | 2 +- x/provider/handler/handler.go | 4 +- x/provider/handler/handler_test.go | 8 +- x/provider/handler/server.go | 4 +- x/provider/keeper/grpc_query_test.go | 6 +- x/provider/keeper/keeper_test.go | 4 +- x/provider/module.go | 8 +- x/provider/simulation/operations.go | 8 +- x/take/genesis.go | 2 +- x/take/handler/server.go | 2 +- x/take/module.go | 6 +- x/wasm/alias.go | 12 + x/wasm/genesis.go | 49 ++++ x/wasm/handler/server.go | 39 +++ x/wasm/keeper/grpc_query.go | 30 ++ x/wasm/keeper/keeper.go | 102 +++++++ x/wasm/keeper/msg_filter.go | 193 +++++++++++++ x/wasm/module.go | 183 ++++++++++++ x/wasm/simulation/decoder.go | 17 ++ x/wasm/simulation/genesis.go | 16 ++ x/wasm/simulation/proposals.go | 56 ++++ 129 files changed, 1151 insertions(+), 1293 deletions(-) delete mode 100644 upgrades/software/v1.0.0/audit.go delete mode 100644 upgrades/software/v1.0.0/cert.go delete mode 100644 upgrades/software/v1.0.0/deployment.go delete mode 100644 upgrades/software/v1.0.0/escrow.go delete mode 100644 upgrades/software/v1.0.0/init.go delete mode 100644 upgrades/software/v1.0.0/market.go delete mode 100644 upgrades/software/v1.0.0/provider.go delete mode 100644 upgrades/software/v1.0.0/take.go delete mode 100644 upgrades/software/v1.0.0/upgrade.go create mode 100644 upgrades/software/v2.0.0/init.go create mode 100644 upgrades/software/v2.0.0/upgrade.go create mode 100644 x/wasm/alias.go create mode 100644 x/wasm/genesis.go create mode 100644 x/wasm/handler/server.go create mode 100644 x/wasm/keeper/grpc_query.go create mode 100644 x/wasm/keeper/keeper.go create mode 100644 x/wasm/keeper/msg_filter.go create mode 100644 x/wasm/module.go create mode 100644 x/wasm/simulation/decoder.go create mode 100644 x/wasm/simulation/genesis.go create mode 100644 x/wasm/simulation/proposals.go diff --git a/app/app.go b/app/app.go index 729fd64e46..d0a754bf79 100644 --- a/app/app.go +++ b/app/app.go @@ -6,8 +6,10 @@ import ( "net/http" "os" "path/filepath" + "reflect" "time" + wasmkeeper "github.com/CosmWasm/wasmd/x/wasm/keeper" wasmtypes "github.com/CosmWasm/wasmd/x/wasm/types" "github.com/gorilla/mux" "github.com/rakyll/statik/fs" @@ -58,7 +60,6 @@ import ( paramstypes "github.com/cosmos/cosmos-sdk/x/params/types" slashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - ibcwasmtypes "github.com/cosmos/ibc-go/modules/light-clients/08-wasm/types" transfertypes "github.com/cosmos/ibc-go/v10/modules/apps/transfer/types" ibchost "github.com/cosmos/ibc-go/v10/modules/core/exported" ibctm "github.com/cosmos/ibc-go/v10/modules/light-clients/07-tendermint" @@ -71,10 +72,11 @@ import ( providertypes "pkg.akt.dev/go/node/provider/v1beta4" taketypes "pkg.akt.dev/go/node/take/v1" - apptypes "pkg.akt.dev/node/app/types" - utypes "pkg.akt.dev/node/upgrades/types" + apptypes "pkg.akt.dev/node/v2/app/types" + utypes "pkg.akt.dev/node/v2/upgrades/types" + awasm "pkg.akt.dev/node/v2/x/wasm" // unnamed import of statik for swagger UI support - _ "pkg.akt.dev/node/client/docs/statik" + _ "pkg.akt.dev/node/v2/client/docs/statik" ) const ( @@ -133,6 +135,16 @@ func NewApp( homePath = DefaultHome } + var wasmOpts []wasmkeeper.Option + + if val := appOpts.Get("wasm"); val != nil { + if vl, valid := val.([]wasmkeeper.Option); valid { + wasmOpts = append(wasmOpts, vl...) + } else { + panic(fmt.Sprintf("invalid type for aptOpts.Get(\"wasmh\"). expected %s, actual %s", reflect.TypeOf(wasmOpts).String(), reflect.TypeOf(vl).String())) + } + } + app := &AkashApp{ BaseApp: bapp, App: &apptypes.App{ @@ -146,18 +158,25 @@ func NewApp( } wasmDir := filepath.Join(homePath, "wasm") - ibcWasmConfig := ibcwasmtypes.WasmConfig{ - DataDir: filepath.Join(homePath, "ibc_08-wasm"), - SupportedCapabilities: []string{"iterator", "stargate", "abort"}, - ContractDebugMode: false, - } + //ibcWasmConfig := ibcwasmtypes.WasmConfig{ + // DataDir: filepath.Join(homePath, "ibc_08-wasm"), + // SupportedCapabilities: []string{"iterator", "stargate", "abort"}, + // ContractDebugMode: false, + //} wasmConfig, err := wasm.ReadNodeConfig(appOpts) - // Uncomment this for debugging contracts. In the future this could be made into a param passed by the tests - // wasmConfig.ContractDebugMode = true if err != nil { panic(fmt.Sprintf("error while reading wasm config: %s", err)) } + wasmConfig.ContractDebugMode = false + // Memory limits - prevent DoS + wasmConfig.MemoryCacheSize = 100 // 100 MB max + // Query gas limit - prevent expensive queries + wasmConfig.SmartQueryGasLimit = 3_000_000 + // Debug mode - MUST be false in production + // Uncomment this for debugging contracts. In the future this could be made into a param passed by the tests + wasmConfig.ContractDebugMode = false + app.InitSpecialKeepers( app.cdc, aminoCdc, @@ -171,6 +190,9 @@ func NewApp( encodingConfig, app.BaseApp, ModuleAccountPerms(), + wasmDir, + wasmConfig, + wasmOpts, app.BlockedAddrs(), invCheckPeriod, ) @@ -212,7 +234,7 @@ func NewApp( app.MM.SetOrderInitGenesis(OrderInitGenesis(app.MM.ModuleNames())...) app.Configurator = module.NewConfigurator(app.AppCodec(), app.MsgServiceRouter(), app.GRPCQueryRouter()) - err := app.MM.RegisterServices(app.Configurator) + err = app.MM.RegisterServices(app.Configurator) if err != nil { panic(err) } @@ -304,6 +326,8 @@ func orderBeginBlockers(_ []string) []string { ibctm.ModuleName, ibchost.ModuleName, feegrant.ModuleName, + // akash wasm module must be prior wasm + awasm.ModuleName, // wasm after ibc transfer wasmtypes.ModuleName, } @@ -335,6 +359,8 @@ func OrderEndBlockers(_ []string) []string { transfertypes.ModuleName, ibchost.ModuleName, feegrant.ModuleName, + // akash wasm module must be prior wasm + awasm.ModuleName, // wasm after ibc transfer wasmtypes.ModuleName, } diff --git a/app/app_configure.go b/app/app_configure.go index f59ebcabde..d16cba00f7 100644 --- a/app/app_configure.go +++ b/app/app_configure.go @@ -4,6 +4,7 @@ import ( evidencetypes "cosmossdk.io/x/evidence/types" "cosmossdk.io/x/feegrant" upgradetypes "cosmossdk.io/x/upgrade/types" + wasmtypes "github.com/CosmWasm/wasmd/x/wasm/types" "github.com/cosmos/cosmos-sdk/types/module" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" vestingtypes "github.com/cosmos/cosmos-sdk/x/auth/vesting/types" @@ -24,13 +25,14 @@ import ( audittypes "pkg.akt.dev/go/node/audit/v1" taketypes "pkg.akt.dev/go/node/take/v1" - "pkg.akt.dev/node/x/audit" - "pkg.akt.dev/node/x/cert" - "pkg.akt.dev/node/x/deployment" - "pkg.akt.dev/node/x/escrow" - "pkg.akt.dev/node/x/market" - "pkg.akt.dev/node/x/provider" - "pkg.akt.dev/node/x/take" + "pkg.akt.dev/node/v2/x/audit" + "pkg.akt.dev/node/v2/x/cert" + "pkg.akt.dev/node/v2/x/deployment" + "pkg.akt.dev/node/v2/x/escrow" + "pkg.akt.dev/node/v2/x/market" + "pkg.akt.dev/node/v2/x/provider" + "pkg.akt.dev/node/v2/x/take" + awasm "pkg.akt.dev/node/v2/x/wasm" ) func akashModuleBasics() []module.AppModuleBasic { @@ -42,6 +44,7 @@ func akashModuleBasics() []module.AppModuleBasic { provider.AppModuleBasic{}, audit.AppModuleBasic{}, cert.AppModuleBasic{}, + awasm.AppModuleBasic{}, } } @@ -78,5 +81,7 @@ func OrderInitGenesis(_ []string) []string { provider.ModuleName, market.ModuleName, genutiltypes.ModuleName, + awasm.ModuleName, + wasmtypes.ModuleName, } } diff --git a/app/config.go b/app/config.go index 527ff0aa96..3784d9fc48 100644 --- a/app/config.go +++ b/app/config.go @@ -4,6 +4,7 @@ import ( "cosmossdk.io/x/evidence" feegrantmodule "cosmossdk.io/x/feegrant/module" "cosmossdk.io/x/upgrade" + "github.com/CosmWasm/wasmd/x/wasm" "github.com/cosmos/cosmos-sdk/types/module" "github.com/cosmos/cosmos-sdk/x/auth" "github.com/cosmos/cosmos-sdk/x/auth/vesting" @@ -60,6 +61,7 @@ var mbasics = module.NewBasicManager( transfer.AppModuleBasic{}, vesting.AppModuleBasic{}, feegrantmodule.AppModuleBasic{}, + wasm.AppModuleBasic{}, }, // akash akashModuleBasics()..., diff --git a/app/modules.go b/app/modules.go index 11c6044833..7b2b7302a4 100644 --- a/app/modules.go +++ b/app/modules.go @@ -5,6 +5,7 @@ import ( feegrantmodule "cosmossdk.io/x/feegrant/module" "cosmossdk.io/x/upgrade" "github.com/CosmWasm/wasmd/x/wasm" + wasmtypes "github.com/CosmWasm/wasmd/x/wasm/types" addresscodec "github.com/cosmos/cosmos-sdk/codec/address" "github.com/cosmos/cosmos-sdk/types/module" "github.com/cosmos/cosmos-sdk/x/auth" @@ -33,13 +34,14 @@ import ( "pkg.akt.dev/go/sdkutil" - "pkg.akt.dev/node/x/audit" - "pkg.akt.dev/node/x/cert" - "pkg.akt.dev/node/x/deployment" - "pkg.akt.dev/node/x/escrow" - "pkg.akt.dev/node/x/market" - "pkg.akt.dev/node/x/provider" - "pkg.akt.dev/node/x/take" + "pkg.akt.dev/node/v2/x/audit" + "pkg.akt.dev/node/v2/x/cert" + "pkg.akt.dev/node/v2/x/deployment" + "pkg.akt.dev/node/v2/x/escrow" + "pkg.akt.dev/node/v2/x/market" + "pkg.akt.dev/node/v2/x/provider" + "pkg.akt.dev/node/v2/x/take" + awasm "pkg.akt.dev/node/v2/x/wasm" ) func appModules( @@ -191,6 +193,10 @@ func appModules( app.cdc, app.Keepers.Akash.Cert, ), + awasm.NewAppModule( + app.cdc, + app.Keepers.Akash.Wasm, + ), wasm.NewAppModule( app.cdc, app.Keepers.External.Wasm, @@ -198,7 +204,7 @@ func appModules( app.Keepers.Cosmos.Acct, app.Keepers.Cosmos.Bank, app.MsgServiceRouter(), - nil, + app.GetSubspace(wasmtypes.ModuleName), ), } } @@ -331,5 +337,20 @@ func appSimModules( app.cdc, app.Keepers.Akash.Cert, ), + + awasm.NewAppModule( + app.cdc, + app.Keepers.Akash.Wasm, + ), + + wasm.NewAppModule( + app.cdc, + app.Keepers.External.Wasm, + app.Keepers.Cosmos.Staking, + app.Keepers.Cosmos.Acct, + app.Keepers.Cosmos.Bank, + app.MsgServiceRouter(), + app.GetSubspace(wasmtypes.ModuleName), + ), } } diff --git a/app/sim/sim_utils.go b/app/sim/sim_utils.go index 92baa1d74d..85e6927a99 100644 --- a/app/sim/sim_utils.go +++ b/app/sim/sim_utils.go @@ -14,7 +14,7 @@ import ( "github.com/cosmos/cosmos-sdk/runtime" simtypes "github.com/cosmos/cosmos-sdk/types/simulation" - akash "pkg.akt.dev/node/app" + akash "pkg.akt.dev/node/v2/app" ) // SetupSimulation creates the config, db (levelDB), temporary directory and logger for diff --git a/app/sim_test.go b/app/sim_test.go index b51ab4ecef..41d652742f 100644 --- a/app/sim_test.go +++ b/app/sim_test.go @@ -5,12 +5,18 @@ import ( "fmt" "math/rand" "os" + "runtime/debug" + "strings" "testing" "time" + wasmtypes "github.com/CosmWasm/wasmd/x/wasm/types" + cmtproto "github.com/cometbft/cometbft/proto/tendermint/types" + simcli "github.com/cosmos/cosmos-sdk/x/simulation/client/cli" "github.com/spf13/viper" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + cflags "pkg.akt.dev/go/cli/flags" abci "github.com/cometbft/cometbft/abci/types" @@ -23,6 +29,7 @@ import ( dbm "github.com/cosmos/cosmos-db" "github.com/cosmos/cosmos-sdk/baseapp" sdksim "github.com/cosmos/cosmos-sdk/types/simulation" + simtypes "github.com/cosmos/cosmos-sdk/types/simulation" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" authzkeeper "github.com/cosmos/cosmos-sdk/x/authz/keeper" authzkeys "github.com/cosmos/cosmos-sdk/x/authz/keeper/keys" @@ -46,9 +53,9 @@ import ( taketypes "pkg.akt.dev/go/node/take/v1" "pkg.akt.dev/go/sdkutil" - akash "pkg.akt.dev/node/app" - "pkg.akt.dev/node/app/sim" - simtestutil "pkg.akt.dev/node/testutil/sims" + akash "pkg.akt.dev/node/v2/app" + "pkg.akt.dev/node/v2/app/sim" + simtestutil "pkg.akt.dev/node/v2/testutil/sims" ) // AppChainID hardcoded chainID for simulation @@ -141,37 +148,14 @@ func TestFullAppSimulation(t *testing.T) { } func TestAppImportExport(t *testing.T) { - config, db, dir, logger, skip, err := sim.SetupSimulation("leveldb-app-sim", "Simulation") - if skip { - t.Skip("skipping application import/export simulation") - } - require.NoError(t, err, "simulation setup failed") - - defer func() { - _ = db.Close() - require.NoError(t, os.RemoveAll(dir)) - }() - - encodingConfig := sdkutil.MakeEncodingConfig() - - akash.ModuleBasics().RegisterInterfaces(encodingConfig.InterfaceRegistry) - - appOpts := viper.New() - appOpts.Set("home", akash.DefaultHome) - - r := rand.New(rand.NewSource(config.Seed)) // nolint: gosec - genTime := sdksim.RandTimestamp(r) - - appOpts.Set("GenesisTime", genTime) - - appA := akash.NewApp(logger, db, nil, true, sim.FlagPeriodValue, map[int64]bool{}, encodingConfig, appOpts, fauxMerkleModeOpt, baseapp.SetChainID(AppChainID)) - require.Equal(t, akash.AppName, appA.Name()) + config, encodingConfig, db, appOpts, logger, appA := setupSimulationApp(t, "skipping application import/export simulation") // Run randomized simulation _, simParams, simErr := simulateFromSeedFunc(t, appA, config) + require.Equal(t, akash.AppName, appA.Name()) // export state and simParams before the simulation error is checked - err = simtestutil.CheckExportSimulation(appA, config, simParams) + err := simtestutil.CheckExportSimulation(appA, config, simParams) require.NoError(t, err) require.NoError(t, simErr) @@ -179,38 +163,44 @@ func TestAppImportExport(t *testing.T) { sim.PrintStats(db) } - fmt.Printf("exporting genesis...\n") - + t.Log("exporting genesis...\n") exported, err := appA.ExportAppStateAndValidators(false, []string{}, []string{}) require.NoError(t, err) - fmt.Printf("importing genesis...\n") + t.Log("importing genesis...\n") - _, newDB, newDir, _, _, err := sim.SetupSimulation("leveldb-app-sim-2", "Simulation-2") + newDB, newDir, _, _, err := simtestutil.SetupSimulation(config, "leveldb-app-sim-2", "Simulation-2", simcli.FlagVerboseValue, simcli.FlagEnabledValue) require.NoError(t, err, "simulation setup failed") - defer func() { - _ = newDB.Close() + require.NoError(t, newDB.Close()) require.NoError(t, os.RemoveAll(newDir)) }() + appOpts[cflags.FlagHome] = t.TempDir() // ensure a unique folder for the new app appB := akash.NewApp(logger, newDB, nil, true, sim.FlagPeriodValue, map[int64]bool{}, encodingConfig, appOpts, fauxMerkleModeOpt, baseapp.SetChainID(AppChainID)) require.Equal(t, akash.AppName, appB.Name()) - var genesisState akash.GenesisState - err = json.Unmarshal(exported.AppState, &genesisState) - require.NoError(t, err) + ctxA := appA.NewContextLegacy(true, cmtproto.Header{Height: appA.LastBlockHeight()}) + ctxB := appB.NewContextLegacy(true, cmtproto.Header{Height: appA.LastBlockHeight()}) - ctxA := appA.NewContext(true) - ctxB := appB.NewContext(true) + initReq := &abci.RequestInitChain{ + AppStateBytes: exported.AppState, + } - _, err = appB.MM.InitGenesis(ctxB, appA.AppCodec(), genesisState) - require.NoError(t, err) + _, err = appB.InitChainer(ctxB, initReq) + if err != nil { + if strings.Contains(err.Error(), "validator set is empty after InitGenesis") { + t.Log("Skipping simulation as all validators have been unbonded") + t.Logf("err: %s stacktrace: %s\n", err, string(debug.Stack())) + return + } + } + require.NoError(t, err) err = appB.StoreConsensusParams(ctxB, exported.ConsensusParams) require.NoError(t, err) - fmt.Printf("comparing stores...\n") + t.Log("comparing stores...") storeKeysPrefixes := []StoreKeysPrefixes{ { @@ -360,6 +350,14 @@ func TestAppImportExport(t *testing.T) { appB, [][]byte{}, }, + { + wasmtypes.StoreKey, + appA, + appB, + [][]byte{ + wasmtypes.TXCounterPrefix, + }, + }, } for _, skp := range storeKeysPrefixes { @@ -399,8 +397,7 @@ func TestAppSimulationAfterImport(t *testing.T) { akash.ModuleBasics().RegisterInterfaces(encodingConfig.InterfaceRegistry) appOpts := viper.New() - - appOpts.Set("home", akash.DefaultHome) + appOpts.Set("home", t.TempDir()) // ensure a unique folder per run r := rand.New(rand.NewSource(config.Seed)) // nolint: gosec genTime := sdksim.RandTimestamp(r) @@ -442,6 +439,7 @@ func TestAppSimulationAfterImport(t *testing.T) { require.NoError(t, os.RemoveAll(newDir)) }() + appOpts.Set("home", t.TempDir()) // ensure a unique folder per run newApp := akash.NewApp(log.NewNopLogger(), newDB, nil, true, sim.FlagPeriodValue, map[int64]bool{}, encodingConfig, appOpts, fauxMerkleModeOpt, baseapp.SetChainID(AppChainID)) require.Equal(t, akash.AppName, newApp.Name()) @@ -487,7 +485,7 @@ func TestAppStateDeterminism(t *testing.T) { db := dbm.NewMemDB() appOpts := viper.New() - appOpts.Set("home", akash.DefaultHome) + appOpts.Set("home", t.TempDir()) // ensure a unique folder per run r := rand.New(rand.NewSource(config.Seed)) // nolint: gosec genTime := sdksim.RandTimestamp(r) @@ -521,3 +519,31 @@ func TestAppStateDeterminism(t *testing.T) { } } } + +func setupSimulationApp(t *testing.T, msg string) (simtypes.Config, sdkutil.EncodingConfig, dbm.DB, simtestutil.AppOptionsMap, log.Logger, *akash.AkashApp) { + config := simcli.NewConfigFromFlags() + config.ChainID = AppChainID + + encodingConfig := sdkutil.MakeEncodingConfig() + + akash.ModuleBasics().RegisterInterfaces(encodingConfig.InterfaceRegistry) + + db, dir, logger, skip, err := simtestutil.SetupSimulation(config, "leveldb-app-sim", "Simulation", simcli.FlagVerboseValue, simcli.FlagEnabledValue) + if skip { + t.Skip(msg) + } + require.NoError(t, err, "simulation setup failed") + + t.Cleanup(func() { + require.NoError(t, db.Close()) + require.NoError(t, os.RemoveAll(dir)) + }) + + appOpts := make(simtestutil.AppOptionsMap, 0) + appOpts[cflags.FlagHome] = dir // ensure a unique folder + appOpts[cflags.FlagInvCheckPeriod] = simcli.FlagPeriodValue + app := akash.NewApp(logger, db, nil, true, sim.FlagPeriodValue, map[int64]bool{}, encodingConfig, appOpts, fauxMerkleModeOpt, baseapp.SetChainID(AppChainID)) + + require.Equal(t, "AkashApp", app.Name()) + return config, encodingConfig, db, appOpts, logger, app +} diff --git a/app/testnet.go b/app/testnet.go index 4b2fe5e6cc..f2f318b15a 100644 --- a/app/testnet.go +++ b/app/testnet.go @@ -24,7 +24,7 @@ import ( "pkg.akt.dev/go/sdkutil" - utypes "pkg.akt.dev/node/upgrades/types" + utypes "pkg.akt.dev/node/v2/upgrades/types" ) type TestnetDelegation struct { diff --git a/app/types/app.go b/app/types/app.go index b13fc0ad5d..5d06327041 100644 --- a/app/types/app.go +++ b/app/types/app.go @@ -76,16 +76,19 @@ import ( ptypes "pkg.akt.dev/go/node/provider/v1beta4" astakingtypes "pkg.akt.dev/go/node/staking/v1beta3" ttypes "pkg.akt.dev/go/node/take/v1" + wtypes "pkg.akt.dev/go/node/wasm/v1" "pkg.akt.dev/go/sdkutil" - akeeper "pkg.akt.dev/node/x/audit/keeper" - ckeeper "pkg.akt.dev/node/x/cert/keeper" - dkeeper "pkg.akt.dev/node/x/deployment/keeper" - ekeeper "pkg.akt.dev/node/x/escrow/keeper" - mhooks "pkg.akt.dev/node/x/market/hooks" - mkeeper "pkg.akt.dev/node/x/market/keeper" - pkeeper "pkg.akt.dev/node/x/provider/keeper" - tkeeper "pkg.akt.dev/node/x/take/keeper" + akeeper "pkg.akt.dev/node/v2/x/audit/keeper" + ckeeper "pkg.akt.dev/node/v2/x/cert/keeper" + dkeeper "pkg.akt.dev/node/v2/x/deployment/keeper" + ekeeper "pkg.akt.dev/node/v2/x/escrow/keeper" + mhooks "pkg.akt.dev/node/v2/x/market/hooks" + mkeeper "pkg.akt.dev/node/v2/x/market/keeper" + pkeeper "pkg.akt.dev/node/v2/x/provider/keeper" + tkeeper "pkg.akt.dev/node/v2/x/take/keeper" + awasm "pkg.akt.dev/node/v2/x/wasm" + wkeeper "pkg.akt.dev/node/v2/x/wasm/keeper" ) const ( @@ -124,6 +127,7 @@ type AppKeepers struct { Provider pkeeper.IKeeper Audit akeeper.Keeper Cert ckeeper.Keeper + Wasm wkeeper.Keeper } External struct { @@ -455,9 +459,21 @@ func (app *App) InitNormalKeepers( app.keys[ctypes.StoreKey], ) - // The last arguments can contain custom message handlers, and custom query handlers, - // if we want to allow any custom callbacks - // The last arguments can contain custom message handlers, and custom query handlers, + app.Keepers.Akash.Wasm = wkeeper.NewKeeper( + cdc, + app.keys[wtypes.StoreKey], + authtypes.NewModuleAddress(govtypes.ModuleName).String(), + ) + + wOpts := make([]wasmkeeper.Option, 0, len(wasmOpts)+1) + + wOpts = append(wOpts, wasmkeeper.WithMessageHandlerDecorator( + app.Keepers.Akash.Wasm.NewMsgFilterDecorator(), + )) + + wOpts = append(wOpts, wasmOpts...) + + // The last arguments can contain custom message handlers and custom query handlers // if we want to allow any custom callbacks wasmCapabilities := wasmkeeper.BuiltInCapabilities() wasmCapabilities = append(wasmCapabilities, "akash") @@ -480,7 +496,7 @@ func (app *App) InitNormalKeepers( wasmtypes.VMConfig{}, wasmCapabilities, authtypes.NewModuleAddress(govtypes.ModuleName).String(), - wasmOpts..., + wOpts..., ) app.Keepers.External.Wasm = &wasmKeeper @@ -517,7 +533,6 @@ func (app *App) InitNormalKeepers( AddPrefixRoute(wasmkeeper.PortIDPrefixV2, wasmkeeper.NewIBC2Handler(app.Keepers.External.Wasm)) app.Keepers.Cosmos.IBC.SetRouterV2(ibcRouterV2) - } func (app *App) SetupHooks() { @@ -609,6 +624,7 @@ func akashKVStoreKeys() []string { ptypes.StoreKey, atypes.StoreKey, ctypes.StoreKey, + awasm.StoreKey, } } diff --git a/app/upgrades.go b/app/upgrades.go index 4ef4974195..d2dec88298 100644 --- a/app/upgrades.go +++ b/app/upgrades.go @@ -5,9 +5,9 @@ import ( upgradetypes "cosmossdk.io/x/upgrade/types" - utypes "pkg.akt.dev/node/upgrades/types" + utypes "pkg.akt.dev/node/v2/upgrades/types" // nolint: revive - _ "pkg.akt.dev/node/upgrades" + _ "pkg.akt.dev/node/v2/upgrades" ) func (app *AkashApp) registerUpgradeHandlers() error { diff --git a/cmd/akash/cmd/app_creator.go b/cmd/akash/cmd/app_creator.go index 8a8f923be4..449b4794c9 100644 --- a/cmd/akash/cmd/app_creator.go +++ b/cmd/akash/cmd/app_creator.go @@ -22,7 +22,7 @@ import ( cflags "pkg.akt.dev/go/cli/flags" "pkg.akt.dev/go/sdkutil" - akash "pkg.akt.dev/node/app" + akash "pkg.akt.dev/node/v2/app" ) type appCreator struct { diff --git a/cmd/akash/cmd/root.go b/cmd/akash/cmd/root.go index bcb9967fef..84c8a665f2 100644 --- a/cmd/akash/cmd/root.go +++ b/cmd/akash/cmd/root.go @@ -22,8 +22,8 @@ import ( cflags "pkg.akt.dev/go/cli/flags" "pkg.akt.dev/go/sdkutil" - "pkg.akt.dev/node/app" - "pkg.akt.dev/node/cmd/akash/cmd/testnetify" + "pkg.akt.dev/node/v2/app" + "pkg.akt.dev/node/v2/cmd/akash/cmd/testnetify" ) // NewRootCmd creates a new root command for akash. It is called once in the diff --git a/cmd/akash/cmd/testnetify/config.go b/cmd/akash/cmd/testnetify/config.go index 251bda818c..3b616e449a 100644 --- a/cmd/akash/cmd/testnetify/config.go +++ b/cmd/akash/cmd/testnetify/config.go @@ -12,7 +12,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - akash "pkg.akt.dev/node/app" + akash "pkg.akt.dev/node/v2/app" ) type PrivValidatorKey struct { diff --git a/cmd/akash/cmd/testnetify/testnetify.go b/cmd/akash/cmd/testnetify/testnetify.go index 0ec2a2ba52..60b3843e68 100644 --- a/cmd/akash/cmd/testnetify/testnetify.go +++ b/cmd/akash/cmd/testnetify/testnetify.go @@ -39,8 +39,8 @@ import ( cflags "pkg.akt.dev/go/cli/flags" - akash "pkg.akt.dev/node/app" - "pkg.akt.dev/node/util/server" + akash "pkg.akt.dev/node/v2/app" + "pkg.akt.dev/node/v2/util/server" ) // GetCmd uses the provided chainID and operatorAddress as well as the local private validator key to diff --git a/cmd/akash/cmd/testnetify/utils.go b/cmd/akash/cmd/testnetify/utils.go index 150256a4fe..ccf332cc4a 100644 --- a/cmd/akash/cmd/testnetify/utils.go +++ b/cmd/akash/cmd/testnetify/utils.go @@ -11,7 +11,7 @@ import ( "golang.org/x/sync/errgroup" cflags "pkg.akt.dev/go/cli/flags" - "pkg.akt.dev/node/util/server" + "pkg.akt.dev/node/v2/util/server" ) func openDB(rootDir string, backendType dbm.BackendType) (dbm.DB, error) { diff --git a/cmd/akash/main.go b/cmd/akash/main.go index 6e6b39237d..67e514a614 100644 --- a/cmd/akash/main.go +++ b/cmd/akash/main.go @@ -5,7 +5,7 @@ import ( _ "pkg.akt.dev/go/sdkutil" - "pkg.akt.dev/node/cmd/akash/cmd" + "pkg.akt.dev/node/v2/cmd/akash/cmd" ) // In main we call the rootCmd diff --git a/docgen/main.go b/docgen/main.go index c6567f060a..05492e9bf7 100644 --- a/docgen/main.go +++ b/docgen/main.go @@ -5,7 +5,7 @@ import ( "os" "github.com/spf13/cobra/doc" - root "pkg.akt.dev/node/cmd/akash/cmd" + root "pkg.akt.dev/node/v2/cmd/akash/cmd" ) func main() { diff --git a/go.mod b/go.mod index 0e44efdb2d..a400b19018 100644 --- a/go.mod +++ b/go.mod @@ -1,4 +1,4 @@ -module pkg.akt.dev/node +module pkg.akt.dev/node/v2 go 1.25.2 @@ -15,12 +15,12 @@ require ( cosmossdk.io/x/feegrant v0.2.0 cosmossdk.io/x/upgrade v0.2.0 github.com/CosmWasm/wasmd v0.61.4 + github.com/CosmWasm/wasmvm/v3 v3.0.2 github.com/boz/go-lifecycle v0.1.1 github.com/cometbft/cometbft v0.38.17 github.com/cosmos/cosmos-db v1.1.3 github.com/cosmos/cosmos-sdk v0.53.4 github.com/cosmos/gogoproto v1.7.0 - github.com/cosmos/ibc-go/modules/light-clients/08-wasm v0.4.2-0.20240730185033-ccd4dc278e72 github.com/cosmos/ibc-go/v10 v10.3.0 github.com/cosmos/rosetta v0.50.12 github.com/golang-jwt/jwt/v5 v5.2.3 @@ -47,7 +47,7 @@ require ( google.golang.org/grpc v1.74.2 gopkg.in/yaml.v3 v3.0.1 gotest.tools/v3 v3.5.2 - pkg.akt.dev/go v0.1.5 + pkg.akt.dev/go v0.1.6-rc0 pkg.akt.dev/go/cli v0.1.4 pkg.akt.dev/go/sdl v0.1.1 ) @@ -92,8 +92,6 @@ require ( filippo.io/edwards25519 v1.1.0 // indirect github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 // indirect github.com/99designs/keyring v1.2.2 // indirect - github.com/CosmWasm/wasmvm/v2 v2.1.4 // indirect - github.com/CosmWasm/wasmvm/v3 v3.0.2 // indirect github.com/DataDog/datadog-go v4.8.3+incompatible // indirect github.com/DataDog/zstd v1.5.7 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.27.0 // indirect @@ -130,8 +128,6 @@ require ( github.com/cosmos/go-bip39 v1.0.0 // indirect github.com/cosmos/gogogateway v1.2.0 // indirect github.com/cosmos/iavl v1.2.4 // indirect - github.com/cosmos/ibc-go/modules/capability v1.0.1 // indirect - github.com/cosmos/ibc-go/v8 v8.4.0 // indirect github.com/cosmos/ics23/go v0.11.0 // indirect github.com/cosmos/ledger-cosmos-go v0.14.0 // indirect github.com/cosmos/rosetta-sdk-go v0.10.0 // indirect diff --git a/go.sum b/go.sum index 240e7292ad..cd4cc1db93 100644 --- a/go.sum +++ b/go.sum @@ -1209,8 +1209,6 @@ cloud.google.com/go/workflows v1.12.2/go.mod h1:+OmBIgNqYJPVggnMo9nqmizW0qEXHhmn cloud.google.com/go/workflows v1.12.3/go.mod h1:fmOUeeqEwPzIU81foMjTRQIdwQHADi/vEr1cx9R1m5g= cosmossdk.io/api v0.9.2 h1:9i9ptOBdmoIEVEVWLtYYHjxZonlF/aOVODLFaxpmNtg= cosmossdk.io/api v0.9.2/go.mod h1:CWt31nVohvoPMTlPv+mMNCtC0a7BqRdESjCsstHcTkU= -cosmossdk.io/client/v2 v2.0.0-beta.3 h1:+TTuH0DwQYsUq2JFAl3fDZzKq5gQG7nt3dAattkjFDU= -cosmossdk.io/client/v2 v2.0.0-beta.3/go.mod h1:CZcL41HpJPOOayTCO28j8weNBQprG+SRiKX39votypo= cosmossdk.io/collections v1.3.1 h1:09e+DUId2brWsNOQ4nrk+bprVmMUaDH9xvtZkeqIjVw= cosmossdk.io/collections v1.3.1/go.mod h1:ynvkP0r5ruAjbmedE+vQ07MT6OtJ0ZIDKrtJHK7Q/4c= cosmossdk.io/core v0.11.3 h1:mei+MVDJOwIjIniaKelE3jPDqShCc/F4LkNNHh+4yfo= @@ -1227,8 +1225,6 @@ cosmossdk.io/schema v1.1.0 h1:mmpuz3dzouCoyjjcMcA/xHBEmMChN+EHh8EHxHRHhzE= cosmossdk.io/schema v1.1.0/go.mod h1:Gb7pqO+tpR+jLW5qDcNOSv0KtppYs7881kfzakguhhI= cosmossdk.io/store v1.1.2 h1:3HOZG8+CuThREKv6cn3WSohAc6yccxO3hLzwK6rBC7o= cosmossdk.io/store v1.1.2/go.mod h1:60rAGzTHevGm592kFhiUVkNC9w7gooSEn5iUBPzHQ6A= -cosmossdk.io/x/circuit v0.1.1 h1:KPJCnLChWrxD4jLwUiuQaf5mFD/1m7Omyo7oooefBVQ= -cosmossdk.io/x/circuit v0.1.1/go.mod h1:B6f/urRuQH8gjt4eLIXfZJucrbreuYrKh5CSjaOxr+Q= cosmossdk.io/x/evidence v0.2.0 h1:o72zbmgCM7U0v7z7b0XnMB+NqX0tFamqb1HHkQbhrZ0= cosmossdk.io/x/evidence v0.2.0/go.mod h1:zx/Xqy+hnGVzkqVuVuvmP9KsO6YCl4SfbAetYi+k+sE= cosmossdk.io/x/feegrant v0.2.0 h1:oq3WVpoJdxko/XgWmpib63V1mYy9ZQN/1qxDajwGzJ8= @@ -1250,8 +1246,6 @@ github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg6 github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/CosmWasm/wasmd v0.61.4 h1:4NzvRyZ49+3t21BGeWP7FUZliC4+pNZSmezJDWrQ83s= github.com/CosmWasm/wasmd v0.61.4/go.mod h1:nRS0sxWUXeeFBAw5Jo7FXU4YwnkaqdLUq38HrDjjWn0= -github.com/CosmWasm/wasmvm/v2 v2.1.4 h1:7EUVQjBxXHkVjL2AqqXD7hMEe0dmoNn2li9E4PWRAnA= -github.com/CosmWasm/wasmvm/v2 v2.1.4/go.mod h1:bMhLQL4Yp9CzJi9A83aR7VO9wockOsSlZbT4ztOl6bg= github.com/CosmWasm/wasmvm/v3 v3.0.2 h1:+MLkOX+IdklITLqfG26PCFv5OXdZvNb8z5Wq5JFXTRM= github.com/CosmWasm/wasmvm/v3 v3.0.2/go.mod h1:oknpb1bFERvvKcY7vHRp1F/Y/z66xVrsl7n9uWkOAlM= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= @@ -1438,14 +1432,8 @@ github.com/cosmos/gogogateway v1.2.0 h1:Ae/OivNhp8DqBi/sh2A8a1D0y638GpL3tkmLQAiK github.com/cosmos/gogogateway v1.2.0/go.mod h1:iQpLkGWxYcnCdz5iAdLcRBSw3h7NXeOkZ4GUkT+tbFI= github.com/cosmos/iavl v1.2.4 h1:IHUrG8dkyueKEY72y92jajrizbkZKPZbMmG14QzsEkw= github.com/cosmos/iavl v1.2.4/go.mod h1:GiM43q0pB+uG53mLxLDzimxM9l/5N9UuSY3/D0huuVw= -github.com/cosmos/ibc-go/modules/capability v1.0.1 h1:ibwhrpJ3SftEEZRxCRkH0fQZ9svjthrX2+oXdZvzgGI= -github.com/cosmos/ibc-go/modules/capability v1.0.1/go.mod h1:rquyOV262nGJplkumH+/LeYs04P3eV8oB7ZM4Ygqk4E= -github.com/cosmos/ibc-go/modules/light-clients/08-wasm v0.4.2-0.20240730185033-ccd4dc278e72 h1:QjCi4bJoy9AXLL1e4jqi+4rHYN0gGZAQxf937cdWhw4= -github.com/cosmos/ibc-go/modules/light-clients/08-wasm v0.4.2-0.20240730185033-ccd4dc278e72/go.mod h1:yiulzyQAZ+Ci802z/kVQqTA3lGiSJOmDpTq7kZxOUNE= github.com/cosmos/ibc-go/v10 v10.3.0 h1:w5DkHih8qn15deAeFoTk778WJU+xC1krJ5kDnicfUBc= github.com/cosmos/ibc-go/v10 v10.3.0/go.mod h1:CthaR7n4d23PJJ7wZHegmNgbVcLXCQql7EwHrAXnMtw= -github.com/cosmos/ibc-go/v8 v8.4.0 h1:K2PfX0AZ+1XKZytHGEMuSjQXG/MZshPb83RSTQt2+cE= -github.com/cosmos/ibc-go/v8 v8.4.0/go.mod h1:zh6x1osR0hNvEcFrC/lhGD08sMfQmr9wHVvZ/mRWMCs= github.com/cosmos/ics23/go v0.11.0 h1:jk5skjT0TqX5e5QJbEnwXIS2yI2vnmLOgpQPeM5RtnU= github.com/cosmos/ics23/go v0.11.0/go.mod h1:A8OjxPE67hHST4Icw94hOxxFEJMBG031xIGF/JHNIY0= github.com/cosmos/keyring v1.2.0 h1:8C1lBP9xhImmIabyXW4c3vFjjLiBdGCmfLUfeZlV1Yo= @@ -3294,8 +3282,8 @@ nhooyr.io/websocket v1.8.17 h1:KEVeLJkUywCKVsnLIDlD/5gtayKp8VoCkksHCGGfT9Y= nhooyr.io/websocket v1.8.17/go.mod h1:rN9OFWIUwuxg4fR5tELlYC04bXYowCP9GX47ivo2l+c= pgregory.net/rapid v0.5.5 h1:jkgx1TjbQPD/feRoK+S/mXw9e1uj6WilpHrXJowi6oA= pgregory.net/rapid v0.5.5/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04= -pkg.akt.dev/go v0.1.5 h1:UdhU70YOzfJzzd1mT6dpnK7/5RWwV7N1zr1HRNmqtaw= -pkg.akt.dev/go v0.1.5/go.mod h1:67LZ0QbZMoCipadLNIR8HzMFcL4A4My7h9aMo516SGk= +pkg.akt.dev/go v0.1.6-rc0 h1:TJ1Xo5pQBPUIO1UsVHtGlPoayuahxQA4uTUvs/CKlEA= +pkg.akt.dev/go v0.1.6-rc0/go.mod h1:noM7YKcw4fAAXmYM9MmProytKQt9P/CxWmc8wi/w35M= pkg.akt.dev/go/cli v0.1.4 h1:wFPegnPwimWHi0v5LN6AnWZnwtwpnD6mb7Dp1HSuzlw= pkg.akt.dev/go/cli v0.1.4/go.mod h1:ZLqHZcq+D/8a27WTPYhmfCm2iGbNicWV1AwOhdspJ4Y= pkg.akt.dev/go/sdl v0.1.1 h1:3CcAqWeKouFlvUSjQMktWLDqftOjn4cBX37TRFT7BRM= diff --git a/pubsub/bus_test.go b/pubsub/bus_test.go index 747c400102..1187d70926 100644 --- a/pubsub/bus_test.go +++ b/pubsub/bus_test.go @@ -6,7 +6,7 @@ import ( "github.com/cometbft/cometbft/crypto/ed25519" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "pkg.akt.dev/node/pubsub" + "pkg.akt.dev/node/v2/pubsub" ) func TestBus(t *testing.T) { diff --git a/tests/e2e/certs_cli_test.go b/tests/e2e/certs_cli_test.go index 57e607159d..c6c017ae97 100644 --- a/tests/e2e/certs_cli_test.go +++ b/tests/e2e/certs_cli_test.go @@ -6,7 +6,7 @@ import ( "github.com/stretchr/testify/require" clitestutil "pkg.akt.dev/go/cli/testutil" - "pkg.akt.dev/node/testutil" + "pkg.akt.dev/node/v2/testutil" "pkg.akt.dev/go/cli" utiltls "pkg.akt.dev/go/util/tls" diff --git a/tests/e2e/certs_grpc_test.go b/tests/e2e/certs_grpc_test.go index 8140092baf..db43d65849 100644 --- a/tests/e2e/certs_grpc_test.go +++ b/tests/e2e/certs_grpc_test.go @@ -13,7 +13,7 @@ import ( "github.com/stretchr/testify/require" types "pkg.akt.dev/go/node/cert/v1" - "pkg.akt.dev/node/testutil" + "pkg.akt.dev/node/v2/testutil" ) type certsGRPCRestTestSuite struct { diff --git a/tests/e2e/cli_test.go b/tests/e2e/cli_test.go index 647769fffa..20bf3e5d0d 100644 --- a/tests/e2e/cli_test.go +++ b/tests/e2e/cli_test.go @@ -8,7 +8,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/stretchr/testify/suite" - "pkg.akt.dev/node/testutil" + "pkg.akt.dev/node/v2/testutil" ) var DefaultDeposit = sdk.NewCoin("uakt", sdk.NewInt(5000000)) diff --git a/tests/e2e/deployment_cli_test.go b/tests/e2e/deployment_cli_test.go index 9f314a992a..6fef619745 100644 --- a/tests/e2e/deployment_cli_test.go +++ b/tests/e2e/deployment_cli_test.go @@ -22,7 +22,7 @@ import ( "pkg.akt.dev/go/cli" clitestutil "pkg.akt.dev/go/cli/testutil" - "pkg.akt.dev/node/testutil" + "pkg.akt.dev/node/v2/testutil" ) type deploymentIntegrationTestSuite struct { diff --git a/tests/e2e/deployment_grpc_test.go b/tests/e2e/deployment_grpc_test.go index 6373d1004c..dcebbd231c 100644 --- a/tests/e2e/deployment_grpc_test.go +++ b/tests/e2e/deployment_grpc_test.go @@ -14,7 +14,7 @@ import ( v1 "pkg.akt.dev/go/node/deployment/v1" "pkg.akt.dev/go/node/deployment/v1beta4" - "pkg.akt.dev/node/testutil" + "pkg.akt.dev/node/v2/testutil" ) type deploymentGRPCRestTestSuite struct { diff --git a/tests/e2e/grpc_test.go b/tests/e2e/grpc_test.go index 57768a574a..0810d5af11 100644 --- a/tests/e2e/grpc_test.go +++ b/tests/e2e/grpc_test.go @@ -7,7 +7,7 @@ import ( "github.com/stretchr/testify/suite" - "pkg.akt.dev/node/testutil" + "pkg.akt.dev/node/v2/testutil" ) func TestIntegrationGRPC(t *testing.T) { diff --git a/tests/e2e/market_cli_test.go b/tests/e2e/market_cli_test.go index 73346ae86d..d799a1d9e1 100644 --- a/tests/e2e/market_cli_test.go +++ b/tests/e2e/market_cli_test.go @@ -17,7 +17,7 @@ import ( "pkg.akt.dev/go/cli" clitestutil "pkg.akt.dev/go/cli/testutil" - "pkg.akt.dev/node/testutil" + "pkg.akt.dev/node/v2/testutil" ) type marketIntegrationTestSuite struct { diff --git a/tests/e2e/market_grpc_test.go b/tests/e2e/market_grpc_test.go index e7009120e0..d75cba641e 100644 --- a/tests/e2e/market_grpc_test.go +++ b/tests/e2e/market_grpc_test.go @@ -19,7 +19,7 @@ import ( "pkg.akt.dev/go/cli" clitestutil "pkg.akt.dev/go/cli/testutil" - "pkg.akt.dev/node/testutil" + "pkg.akt.dev/node/v2/testutil" ) type marketGRPCRestTestSuite struct { diff --git a/tests/e2e/provider_cli_test.go b/tests/e2e/provider_cli_test.go index 93a6b122b9..db32075bbe 100644 --- a/tests/e2e/provider_cli_test.go +++ b/tests/e2e/provider_cli_test.go @@ -11,7 +11,7 @@ import ( types "pkg.akt.dev/go/node/provider/v1beta4" - "pkg.akt.dev/node/testutil" + "pkg.akt.dev/node/v2/testutil" ) type providerIntegrationTestSuite struct { diff --git a/tests/e2e/provider_grpc_test.go b/tests/e2e/provider_grpc_test.go index ef26357ddd..8d595e53eb 100644 --- a/tests/e2e/provider_grpc_test.go +++ b/tests/e2e/provider_grpc_test.go @@ -13,7 +13,7 @@ import ( sdktestutil "github.com/cosmos/cosmos-sdk/testutil" types "pkg.akt.dev/go/node/provider/v1beta4" - "pkg.akt.dev/node/testutil" + "pkg.akt.dev/node/v2/testutil" ) type providerGRPCRestTestSuite struct { diff --git a/tests/upgrade/upgrade_test.go b/tests/upgrade/upgrade_test.go index 8ff059ab5e..5f78b96b22 100644 --- a/tests/upgrade/upgrade_test.go +++ b/tests/upgrade/upgrade_test.go @@ -33,9 +33,9 @@ import ( // init sdk config _ "pkg.akt.dev/go/sdkutil" - "pkg.akt.dev/node/pubsub" - uttypes "pkg.akt.dev/node/tests/upgrade/types" - "pkg.akt.dev/node/util/cli" + "pkg.akt.dev/node/v2/pubsub" + uttypes "pkg.akt.dev/node/v2/tests/upgrade/types" + "pkg.akt.dev/node/v2/util/cli" ) const ( diff --git a/tests/upgrade/workers_test.go b/tests/upgrade/workers_test.go index 171802ba3d..0add097d74 100644 --- a/tests/upgrade/workers_test.go +++ b/tests/upgrade/workers_test.go @@ -22,8 +22,8 @@ import ( "pkg.akt.dev/go/node/client/v1beta3" "pkg.akt.dev/go/sdkutil" - "pkg.akt.dev/node/app" - uttypes "pkg.akt.dev/node/tests/upgrade/types" + "pkg.akt.dev/node/v2/app" + uttypes "pkg.akt.dev/node/v2/tests/upgrade/types" ) func init() { diff --git a/testutil/network/network.go b/testutil/network/network.go index 3c40c510a2..5cd1f9069c 100644 --- a/testutil/network/network.go +++ b/testutil/network/network.go @@ -49,7 +49,7 @@ import ( cflags "pkg.akt.dev/go/cli/flags" "pkg.akt.dev/go/sdkutil" - "pkg.akt.dev/node/app" + "pkg.akt.dev/node/v2/app" ) const ( diff --git a/testutil/network_suite.go b/testutil/network_suite.go index a4052329be..105de40403 100644 --- a/testutil/network_suite.go +++ b/testutil/network_suite.go @@ -26,7 +26,7 @@ import ( cclient "pkg.akt.dev/go/node/client/v1beta3" sdktestutil "pkg.akt.dev/go/testutil" - "pkg.akt.dev/node/testutil/network" + "pkg.akt.dev/node/v2/testutil/network" ) type NetworkTestSuite struct { diff --git a/testutil/state/suite.go b/testutil/state/suite.go index f068097faa..a13fbee607 100644 --- a/testutil/state/suite.go +++ b/testutil/state/suite.go @@ -26,15 +26,15 @@ import ( ptypes "pkg.akt.dev/go/node/provider/v1beta4" ttypes "pkg.akt.dev/go/node/take/v1" - "pkg.akt.dev/node/app" - emocks "pkg.akt.dev/node/testutil/cosmos/mocks" - akeeper "pkg.akt.dev/node/x/audit/keeper" - dkeeper "pkg.akt.dev/node/x/deployment/keeper" - ekeeper "pkg.akt.dev/node/x/escrow/keeper" - mhooks "pkg.akt.dev/node/x/market/hooks" - mkeeper "pkg.akt.dev/node/x/market/keeper" - pkeeper "pkg.akt.dev/node/x/provider/keeper" - tkeeper "pkg.akt.dev/node/x/take/keeper" + "pkg.akt.dev/node/v2/app" + emocks "pkg.akt.dev/node/v2/testutil/cosmos/mocks" + akeeper "pkg.akt.dev/node/v2/x/audit/keeper" + dkeeper "pkg.akt.dev/node/v2/x/deployment/keeper" + ekeeper "pkg.akt.dev/node/v2/x/escrow/keeper" + mhooks "pkg.akt.dev/node/v2/x/market/hooks" + mkeeper "pkg.akt.dev/node/v2/x/market/keeper" + pkeeper "pkg.akt.dev/node/v2/x/provider/keeper" + tkeeper "pkg.akt.dev/node/v2/x/take/keeper" ) // TestSuite encapsulates a functional Akash nodes data stores for @@ -105,7 +105,6 @@ func SetupTestSuiteWithKeepers(t testing.TB, keepers Keepers) *TestSuite { ) ctx := app.NewContext(false) - cdc := app.AppCodec() vals, err := app.Keepers.Cosmos.Staking.GetAllValidators(ctx) diff --git a/testutil/types.go b/testutil/types.go index 440853fd95..3429b5559b 100644 --- a/testutil/types.go +++ b/testutil/types.go @@ -14,8 +14,8 @@ import ( cflags "pkg.akt.dev/go/cli/flags" "pkg.akt.dev/go/sdkutil" - "pkg.akt.dev/node/app" - "pkg.akt.dev/node/testutil/network" + "pkg.akt.dev/node/v2/app" + "pkg.akt.dev/node/v2/testutil/network" ) // NewTestNetworkFixture returns a new simapp AppConstructor for network simulation tests diff --git a/tools/upgrade-info/main.go b/tools/upgrade-info/main.go index 2af65403b8..93776c7c5d 100644 --- a/tools/upgrade-info/main.go +++ b/tools/upgrade-info/main.go @@ -8,7 +8,7 @@ import ( "github.com/spf13/cobra" - utilcli "pkg.akt.dev/node/util/cli" + utilcli "pkg.akt.dev/node/v2/util/cli" ) func main() { diff --git a/upgrades/software/v1.0.0/audit.go b/upgrades/software/v1.0.0/audit.go deleted file mode 100644 index 27608de207..0000000000 --- a/upgrades/software/v1.0.0/audit.go +++ /dev/null @@ -1,56 +0,0 @@ -// Package v1_0_0 -// nolint revive -package v1_0_0 - -import ( - "cosmossdk.io/store/prefix" - sdk "github.com/cosmos/cosmos-sdk/types" - sdkmodule "github.com/cosmos/cosmos-sdk/types/module" - types "pkg.akt.dev/go/node/audit/v1" - - "pkg.akt.dev/go/node/migrate" - - utypes "pkg.akt.dev/node/upgrades/types" - akeeper "pkg.akt.dev/node/x/audit/keeper" -) - -type auditMigrations struct { - utypes.Migrator -} - -func newAuditMigration(m utypes.Migrator) utypes.Migration { - return auditMigrations{Migrator: m} -} - -func (m auditMigrations) GetHandler() sdkmodule.MigrationHandler { - return m.handler -} - -// handler migrates audit store from version 2 to 3. -func (m auditMigrations) handler(ctx sdk.Context) (err error) { - cdc := m.Codec() - - store := ctx.KVStore(m.StoreKey()) - oStore := prefix.NewStore(store, migrate.AuditedAttributesV1beta3Prefix()) - - iter := oStore.Iterator(nil, nil) - defer func() { - err = iter.Close() - }() - - for ; iter.Valid(); iter.Next() { - val := migrate.AuditedProviderFromV1beta3(cdc, iter.Value()) - - owner := sdk.MustAccAddressFromBech32(val.Owner) - auditor := sdk.MustAccAddressFromBech32(val.Auditor) - - key := akeeper.ProviderKey(types.ProviderID{Owner: owner, Auditor: auditor}) - - bz := cdc.MustMarshal(&types.AuditedAttributesStore{Attributes: val.Attributes}) - - oStore.Delete(iter.Key()) - store.Set(key, bz) - } - - return nil -} diff --git a/upgrades/software/v1.0.0/cert.go b/upgrades/software/v1.0.0/cert.go deleted file mode 100644 index b9ec7eafe2..0000000000 --- a/upgrades/software/v1.0.0/cert.go +++ /dev/null @@ -1,54 +0,0 @@ -// Package v1_0_0 -// nolint revive -package v1_0_0 - -import ( - "cosmossdk.io/store/prefix" - sdk "github.com/cosmos/cosmos-sdk/types" - sdkmodule "github.com/cosmos/cosmos-sdk/types/module" - "pkg.akt.dev/go/node/migrate" - - utypes "pkg.akt.dev/node/upgrades/types" - ckeeper "pkg.akt.dev/node/x/cert/keeper" -) - -type certsMigrations struct { - utypes.Migrator -} - -func newCertsMigration(m utypes.Migrator) utypes.Migration { - return certsMigrations{Migrator: m} -} - -func (m certsMigrations) GetHandler() sdkmodule.MigrationHandler { - return m.handler -} - -// handler migrates certificates store from version 2 to 3. -func (m certsMigrations) handler(ctx sdk.Context) (err error) { - cdc := m.Codec() - - store := ctx.KVStore(m.StoreKey()) - oStore := prefix.NewStore(store, migrate.CertV1beta3Prefix()) - - iter := oStore.Iterator(nil, nil) - defer func() { - err = iter.Close() - }() - - for ; iter.Valid(); iter.Next() { - val := migrate.CertFromV1beta3(cdc, iter.Value()) - - id, err := ckeeper.ParseCertID(nil, iter.Key()) - if err != nil { - return err - } - - bz := cdc.MustMarshal(&val) - key := ckeeper.MustCertificateKey(val.State, id) - oStore.Delete(iter.Key()) - store.Set(key, bz) - } - - return nil -} diff --git a/upgrades/software/v1.0.0/deployment.go b/upgrades/software/v1.0.0/deployment.go deleted file mode 100644 index f3085bd6ed..0000000000 --- a/upgrades/software/v1.0.0/deployment.go +++ /dev/null @@ -1,123 +0,0 @@ -// Package v1_0_0 -// nolint revive -package v1_0_0 - -import ( - "fmt" - - "cosmossdk.io/store/prefix" - sdk "github.com/cosmos/cosmos-sdk/types" - sdkmodule "github.com/cosmos/cosmos-sdk/types/module" - dv1 "pkg.akt.dev/go/node/deployment/v1" - dv1beta "pkg.akt.dev/go/node/deployment/v1beta4" - "pkg.akt.dev/go/node/migrate" - - utypes "pkg.akt.dev/node/upgrades/types" - dkeeper "pkg.akt.dev/node/x/deployment/keeper" -) - -type deploymentsMigrations struct { - utypes.Migrator -} - -func newDeploymentsMigration(m utypes.Migrator) utypes.Migration { - return deploymentsMigrations{Migrator: m} -} - -func (m deploymentsMigrations) GetHandler() sdkmodule.MigrationHandler { - return m.handler -} - -// handler migrates deployment store from version 4 to 5 -func (m deploymentsMigrations) handler(ctx sdk.Context) error { - store := ctx.KVStore(m.StoreKey()) - - // deployment prefix does not change in this upgrade - oStore := prefix.NewStore(store, dkeeper.DeploymentPrefix) - - iter := oStore.Iterator(nil, nil) - defer func() { - _ = iter.Close() - }() - - var deploymentsTotal uint64 - var deploymentsActive uint64 - var deploymentsClosed uint64 - - cdc := m.Codec() - - for ; iter.Valid(); iter.Next() { - nVal := migrate.DeploymentFromV1beta3(cdc, iter.Value()) - bz := cdc.MustMarshal(&nVal) - - switch nVal.State { - case dv1.DeploymentActive: - deploymentsActive++ - case dv1.DeploymentClosed: - deploymentsClosed++ - default: - return fmt.Errorf("unknown order state %d", nVal.State) - } - - deploymentsTotal++ - - key := dkeeper.MustDeploymentKey(dkeeper.DeploymentStateToPrefix(nVal.State), nVal.ID) - - oStore.Delete(iter.Key()) - store.Set(key, bz) - } - - // group prefix does not change in this upgrade - oStore = prefix.NewStore(store, dkeeper.GroupPrefix) - - iter = oStore.Iterator(nil, nil) - defer func() { - _ = iter.Close() - }() - - var groupsTotal uint64 - var groupsOpen uint64 - var groupsPaused uint64 - var groupsInsufficientFunds uint64 - var groupsClosed uint64 - - for ; iter.Valid(); iter.Next() { - nVal := migrate.GroupFromV1Beta3(cdc, iter.Value()) - bz := cdc.MustMarshal(&nVal) - - switch nVal.State { - case dv1beta.GroupOpen: - groupsOpen++ - case dv1beta.GroupPaused: - groupsPaused++ - case dv1beta.GroupInsufficientFunds: - groupsInsufficientFunds++ - case dv1beta.GroupClosed: - groupsClosed++ - default: - return fmt.Errorf("unknown order state %d", nVal.State) - } - - groupsTotal++ - - key := dkeeper.MustGroupKey(dkeeper.GroupStateToPrefix(nVal.State), nVal.ID) - - oStore.Delete(iter.Key()) - store.Set(key, bz) - } - - ctx.Logger().Info(fmt.Sprintf("[upgrade %s]: updated x/deployment store keys:"+ - "\n\tdeployments total: %d"+ - "\n\tdeployments active: %d"+ - "\n\tdeployments closed: %d"+ - "\n\tgroups total: %d"+ - "\n\tgroups open: %d"+ - "\n\tgroups paused: %d"+ - "\n\tgroups insufficient funds: %d"+ - "\n\tgroups closed: %d", - UpgradeName, - deploymentsTotal, deploymentsActive, deploymentsClosed, - groupsTotal, groupsOpen, groupsPaused, groupsInsufficientFunds, groupsClosed)) - - return nil -} diff --git a/upgrades/software/v1.0.0/escrow.go b/upgrades/software/v1.0.0/escrow.go deleted file mode 100644 index 60bf5563e8..0000000000 --- a/upgrades/software/v1.0.0/escrow.go +++ /dev/null @@ -1,120 +0,0 @@ -// Package v1_0_0 -// nolint revive -package v1_0_0 - -import ( - "fmt" - - "cosmossdk.io/store/prefix" - sdk "github.com/cosmos/cosmos-sdk/types" - sdkmodule "github.com/cosmos/cosmos-sdk/types/module" - etypes "pkg.akt.dev/go/node/escrow/types/v1" - "pkg.akt.dev/go/node/migrate" - - utypes "pkg.akt.dev/node/upgrades/types" - ekeeper "pkg.akt.dev/node/x/escrow/keeper" -) - -type escrowMigrations struct { - utypes.Migrator -} - -func newEscrowMigration(m utypes.Migrator) utypes.Migration { - return escrowMigrations{Migrator: m} -} - -func (m escrowMigrations) GetHandler() sdkmodule.MigrationHandler { - return m.handler -} - -// handler migrates escrow store from version 2 to 3. -func (m escrowMigrations) handler(ctx sdk.Context) error { - store := ctx.KVStore(m.StoreKey()) - - oStore := prefix.NewStore(store, migrate.AccountV1beta3Prefix()) - - iter := oStore.Iterator(nil, nil) - defer func() { - _ = iter.Close() - }() - - cdc := m.Codec() - - var accountsTotal uint64 - var accountsActive uint64 - var accountsClosed uint64 - var accountsOverdrawn uint64 - - for ; iter.Valid(); iter.Next() { - key := append(migrate.AccountV1beta3Prefix(), iter.Key()...) - - nVal := migrate.AccountFromV1beta3(cdc, key, iter.Value()) - bz := cdc.MustMarshal(&nVal.State) - - switch nVal.State.State { - case etypes.StateOpen: - accountsActive++ - case etypes.StateClosed: - accountsClosed++ - case etypes.StateOverdrawn: - accountsOverdrawn++ - } - - accountsTotal++ - - oStore.Delete(key) - - key = ekeeper.BuildAccountsKey(nVal.State.State, &nVal.ID) - store.Set(key, bz) - } - - oStore = prefix.NewStore(store, migrate.PaymentV1beta3Prefix()) - - iter = oStore.Iterator(nil, nil) - defer func() { - _ = iter.Close() - }() - - var paymentsTotal uint64 - var paymentsActive uint64 - var paymentsClosed uint64 - var paymentsOverdrawn uint64 - - for ; iter.Valid(); iter.Next() { - key := append(migrate.PaymentV1beta3Prefix(), iter.Key()...) - - nVal := migrate.PaymentFromV1beta3(cdc, key, iter.Value()) - bz := cdc.MustMarshal(&nVal.State) - - switch nVal.State.State { - case etypes.StateOpen: - paymentsActive++ - case etypes.StateClosed: - paymentsClosed++ - case etypes.StateOverdrawn: - paymentsOverdrawn++ - } - - paymentsTotal++ - - oStore.Delete(key) - - key = ekeeper.BuildPaymentsKey(nVal.State.State, &nVal.ID) - store.Set(key, bz) - } - - ctx.Logger().Info(fmt.Sprintf("[upgrade %s]: updated x/escrow store keys:"+ - "\n\taccounts total: %d"+ - "\n\taccounts open: %d"+ - "\n\taccounts closed: %d"+ - "\n\taccounts overdrawn: %d"+ - "\n\tpayments total: %d"+ - "\n\tpayments open: %d"+ - "\n\tpayments closed: %d"+ - "\n\tpayments overdrawn: %d", - UpgradeName, - accountsTotal, accountsActive, accountsClosed, accountsOverdrawn, - paymentsTotal, paymentsActive, paymentsClosed, paymentsOverdrawn)) - - return nil -} diff --git a/upgrades/software/v1.0.0/init.go b/upgrades/software/v1.0.0/init.go deleted file mode 100644 index 94567250d0..0000000000 --- a/upgrades/software/v1.0.0/init.go +++ /dev/null @@ -1,27 +0,0 @@ -// Package v1_0_0 -// nolint revive -package v1_0_0 - -import ( - av1 "pkg.akt.dev/go/node/audit/v1" - cv1 "pkg.akt.dev/go/node/cert/v1" - dv1 "pkg.akt.dev/go/node/deployment/v1" - emodule "pkg.akt.dev/go/node/escrow/module" - mv1 "pkg.akt.dev/go/node/market/v1" - pv1 "pkg.akt.dev/go/node/provider/v1beta4" - tv1 "pkg.akt.dev/go/node/take/v1" - - utypes "pkg.akt.dev/node/upgrades/types" -) - -func init() { - utypes.RegisterUpgrade(UpgradeName, initUpgrade) - - utypes.RegisterMigration(av1.ModuleName, 2, newAuditMigration) - utypes.RegisterMigration(cv1.ModuleName, 3, newCertsMigration) - utypes.RegisterMigration(dv1.ModuleName, 4, newDeploymentsMigration) - utypes.RegisterMigration(emodule.ModuleName, 2, newEscrowMigration) - utypes.RegisterMigration(mv1.ModuleName, 6, newMarketMigration) - utypes.RegisterMigration(pv1.ModuleName, 2, newProviderMigration) - utypes.RegisterMigration(tv1.ModuleName, 2, newTakeMigration) -} diff --git a/upgrades/software/v1.0.0/market.go b/upgrades/software/v1.0.0/market.go deleted file mode 100644 index 6274f2caf0..0000000000 --- a/upgrades/software/v1.0.0/market.go +++ /dev/null @@ -1,198 +0,0 @@ -// Package v1_0_0 -// nolint revive -package v1_0_0 - -import ( - "fmt" - - storetypes "cosmossdk.io/store/types" - sdk "github.com/cosmos/cosmos-sdk/types" - sdkmodule "github.com/cosmos/cosmos-sdk/types/module" - mv1 "pkg.akt.dev/go/node/market/v1" - mv1beta "pkg.akt.dev/go/node/market/v1beta5" - - "pkg.akt.dev/go/node/migrate" - - utypes "pkg.akt.dev/node/upgrades/types" - mkeys "pkg.akt.dev/node/x/market/keeper/keys" -) - -type marketMigrations struct { - utypes.Migrator -} - -func newMarketMigration(m utypes.Migrator) utypes.Migration { - return marketMigrations{Migrator: m} -} - -func (m marketMigrations) GetHandler() sdkmodule.MigrationHandler { - return m.handler -} - -// handler migrates market from version 6 to 7. -func (m marketMigrations) handler(ctx sdk.Context) error { - store := ctx.KVStore(m.StoreKey()) - - cdc := m.Codec() - - // order prefix does not change in this upgrade - oiter := storetypes.KVStorePrefixIterator(store, mkeys.OrderPrefix) - defer func() { - _ = oiter.Close() - }() - - var ordersTotal uint64 - var ordersOpen uint64 - var ordersActive uint64 - var ordersClosed uint64 - - for ; oiter.Valid(); oiter.Next() { - nVal := migrate.OrderFromV1beta4(cdc, oiter.Value()) - - switch nVal.State { - case mv1beta.OrderOpen: - ordersOpen++ - case mv1beta.OrderActive: - ordersActive++ - case mv1beta.OrderClosed: - ordersClosed++ - default: - return fmt.Errorf("unknown order state %d", nVal.State) - } - - ordersTotal++ - - bz := cdc.MustMarshal(&nVal) - - store.Delete(oiter.Key()) - - key := mkeys.MustOrderKey(mkeys.OrderStateToPrefix(nVal.State), nVal.ID) - store.Set(key, bz) - } - - // bid prefixes do not change in this upgrade - store.Delete(mkeys.BidPrefixReverse) - biter := storetypes.KVStorePrefixIterator(store, mkeys.BidPrefix) - defer func() { - _ = biter.Close() - }() - - var bidsTotal uint64 - var bidsOpen uint64 - var bidsActive uint64 - var bidsLost uint64 - var bidsClosed uint64 - - for ; biter.Valid(); biter.Next() { - nVal := migrate.BidFromV1beta4(cdc, biter.Value()) - - switch nVal.State { - case mv1beta.BidOpen: - bidsOpen++ - case mv1beta.BidActive: - bidsActive++ - case mv1beta.BidLost: - bidsLost++ - case mv1beta.BidClosed: - bidsClosed++ - default: - panic(fmt.Sprintf("unknown order state %d", nVal.State)) - } - - bidsTotal++ - - store.Delete(biter.Key()) - - data, err := m.Codec().Marshal(&nVal) - if err != nil { - return err - } - - state := mkeys.BidStateToPrefix(nVal.State) - key, err := mkeys.BidKey(state, nVal.ID) - if err != nil { - return err - } - - revKey, err := mkeys.BidReverseKey(state, nVal.ID) - if err != nil { - return err - } - - store.Set(key, data) - if len(revKey) > 0 { - store.Set(revKey, data) - } - } - - // lease prefixes do not change in this upgrade - store.Delete(mkeys.LeasePrefixReverse) - liter := storetypes.KVStorePrefixIterator(store, mkeys.LeasePrefix) - defer func() { - _ = liter.Close() - }() - - var leasesTotal uint64 - var leasesActive uint64 - var leasesInsufficientFunds uint64 - var leasesClosed uint64 - - for ; liter.Valid(); liter.Next() { - nVal := migrate.LeaseFromV1beta4(cdc, liter.Value()) - - switch nVal.State { - case mv1.LeaseActive: - leasesActive++ - case mv1.LeaseInsufficientFunds: - leasesInsufficientFunds++ - case mv1.LeaseClosed: - leasesClosed++ - default: - panic(fmt.Sprintf("unknown order state %d", nVal.State)) - } - - leasesTotal++ - store.Delete(liter.Key()) - - data, err := m.Codec().Marshal(&nVal) - if err != nil { - return err - } - - state := mkeys.LeaseStateToPrefix(nVal.State) - key, err := mkeys.LeaseKey(state, nVal.ID) - if err != nil { - return err - } - - revKey, err := mkeys.LeaseReverseKey(state, nVal.ID) - if err != nil { - return err - } - - store.Set(key, data) - if len(revKey) > 0 { - store.Set(revKey, data) - } - } - ctx.Logger().Info(fmt.Sprintf("[upgrade %s]: updated x/market store keys:"+ - "\n\torders total: %d"+ - "\n\torders open: %d"+ - "\n\torders active: %d"+ - "\n\torders closed: %d"+ - "\n\tbids total: %d"+ - "\n\tbids open: %d"+ - "\n\tbids active: %d"+ - "\n\tbids lost: %d"+ - "\n\tbids closed: %d"+ - "\n\tleases total: %d"+ - "\n\tleases active: %d"+ - "\n\tleases insufficient funds: %d"+ - "\n\tleases closed: %d", - UpgradeName, - ordersTotal, ordersOpen, ordersActive, ordersClosed, - bidsTotal, bidsOpen, bidsActive, bidsLost, bidsClosed, - leasesTotal, leasesActive, leasesInsufficientFunds, leasesClosed)) - - return nil -} diff --git a/upgrades/software/v1.0.0/provider.go b/upgrades/software/v1.0.0/provider.go deleted file mode 100644 index 50d2c77920..0000000000 --- a/upgrades/software/v1.0.0/provider.go +++ /dev/null @@ -1,65 +0,0 @@ -// Package v1_0_0 -// nolint revive -package v1_0_0 - -import ( - "fmt" - - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/types/address" - sdkmodule "github.com/cosmos/cosmos-sdk/types/module" - "pkg.akt.dev/go/node/migrate" - "pkg.akt.dev/go/sdkutil" - - utypes "pkg.akt.dev/node/upgrades/types" - pkeeper "pkg.akt.dev/node/x/provider/keeper" -) - -type providerMigrations struct { - utypes.Migrator -} - -func newProviderMigration(m utypes.Migrator) utypes.Migration { - return providerMigrations{Migrator: m} -} - -func (m providerMigrations) GetHandler() sdkmodule.MigrationHandler { - return m.handler -} - -func ProviderKey(id sdk.Address) []byte { - return address.MustLengthPrefix(id.Bytes()) -} - -// handler migrates provider store from version 2 to 3. -func (m providerMigrations) handler(ctx sdk.Context) (err error) { - store := ctx.KVStore(m.StoreKey()) - - iter := store.Iterator(nil, nil) - defer func() { - err = iter.Close() - }() - - cdc := m.Codec() - - var providersTotal uint64 - - for ; iter.Valid(); iter.Next() { - to := migrate.ProviderFromV1beta3(cdc, iter.Value()) - - id := sdkutil.MustAccAddressFromBech32(to.Owner) - bz := cdc.MustMarshal(&to) - - providersTotal++ - - store.Delete(iter.Key()) - store.Set(pkeeper.ProviderKey(id), bz) - } - - ctx.Logger().Info(fmt.Sprintf("[upgrade %s]: updated x/provider store keys:"+ - "\n\tproviders total: %d", - UpgradeName, - providersTotal)) - - return nil -} diff --git a/upgrades/software/v1.0.0/take.go b/upgrades/software/v1.0.0/take.go deleted file mode 100644 index ef06f2e2a4..0000000000 --- a/upgrades/software/v1.0.0/take.go +++ /dev/null @@ -1,27 +0,0 @@ -// Package v1_0_0 -// nolint revive -package v1_0_0 - -import ( - sdk "github.com/cosmos/cosmos-sdk/types" - sdkmodule "github.com/cosmos/cosmos-sdk/types/module" - - utypes "pkg.akt.dev/node/upgrades/types" -) - -type takeMigrations struct { - utypes.Migrator -} - -func newTakeMigration(m utypes.Migrator) utypes.Migration { - return takeMigrations{Migrator: m} -} - -func (m takeMigrations) GetHandler() sdkmodule.MigrationHandler { - return m.handler -} - -// handler migrates provider store from version 2 to 3. -func (m takeMigrations) handler(_ sdk.Context) error { - return nil -} diff --git a/upgrades/software/v1.0.0/upgrade.go b/upgrades/software/v1.0.0/upgrade.go deleted file mode 100644 index 06dc36c2a3..0000000000 --- a/upgrades/software/v1.0.0/upgrade.go +++ /dev/null @@ -1,346 +0,0 @@ -// Package v1_0_0 -// nolint revive -package v1_0_0 - -import ( - "context" - "fmt" - "reflect" - "time" - - "cosmossdk.io/log" - sdkmath "cosmossdk.io/math" - storetypes "cosmossdk.io/store/types" - upgradetypes "cosmossdk.io/x/upgrade/types" - "github.com/cosmos/cosmos-sdk/baseapp" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/types/module" - authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - vestingtypes "github.com/cosmos/cosmos-sdk/x/auth/vesting/types" - "github.com/cosmos/cosmos-sdk/x/authz" - consensustypes "github.com/cosmos/cosmos-sdk/x/consensus/types" - crisistypes "github.com/cosmos/cosmos-sdk/x/crisis/types" - paramstypes "github.com/cosmos/cosmos-sdk/x/params/types" - stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - - dv1 "pkg.akt.dev/go/node/deployment/v1" - dv1beta3 "pkg.akt.dev/go/node/deployment/v1beta3" - dv1beta "pkg.akt.dev/go/node/deployment/v1beta4" - ev1 "pkg.akt.dev/go/node/escrow/v1" - agovtypes "pkg.akt.dev/go/node/gov/v1beta3" - mv1 "pkg.akt.dev/go/node/market/v1" - mv1beta4 "pkg.akt.dev/go/node/market/v1beta4" - mv1beta "pkg.akt.dev/go/node/market/v1beta5" - astakingtypes "pkg.akt.dev/go/node/staking/v1beta3" - taketypes "pkg.akt.dev/go/node/take/v1" - - apptypes "pkg.akt.dev/node/app/types" - utypes "pkg.akt.dev/node/upgrades/types" -) - -const ( - UpgradeName = "v1.0.0" -) - -type upgrade struct { - *apptypes.App - log log.Logger -} - -var _ utypes.IUpgrade = (*upgrade)(nil) - -func initUpgrade(log log.Logger, app *apptypes.App) (utypes.IUpgrade, error) { - up := &upgrade{ - App: app, - log: log.With("module", fmt.Sprintf("upgrade/%s", UpgradeName)), - } - - return up, nil -} - -func (up *upgrade) StoreLoader() *storetypes.StoreUpgrades { - return &storetypes.StoreUpgrades{ - Added: []string{ - // With the migrations of all modules away from x/params, the crisis module now has a store. - // The store must be created during a chain upgrade to v0.53.x. - consensustypes.ModuleName, - }, - Deleted: []string{ - "agov", - "astaking", - crisistypes.ModuleName, - }, - } -} - -type AccountKeeper interface { - NewAccount(sdk.Context, sdk.AccountI) sdk.AccountI - - GetAccount(ctx sdk.Context, addr sdk.AccAddress) sdk.AccountI - SetAccount(ctx sdk.Context, acc sdk.AccountI) -} - -// AkashUtilsExtraAccountTypes is a map of extra account types that can be overridden. -// This is defined as a global variable, so it can be modified in the chain's app.go and used here without -// having to import the chain. Specifically, this is used for compatibility with Akash' Cosmos SDK fork -var AkashUtilsExtraAccountTypes map[reflect.Type]struct{} - -// CanCreateModuleAccountAtAddr tells us if we can safely make a module account at -// a given address. By collision resistance of the address (given API safe construction), -// the only way for an account to be already be at this address is if its claimed by the same -// pre-image from the correct module, -// or some SDK command breaks assumptions and creates an account at designated address. -// This function checks if there is an account at that address, and runs some safety checks -// to be extra-sure its not a user account (e.g. non-zero sequence, pubkey, of fore-seen account types). -// If there is no account, or if we believe its not a user-spendable account, we allow module account -// creation at the address. -// else, we do not. -// -// TODO: This is generally from an SDK design flaw -// code based off wasmd code: https://github.com/CosmWasm/wasmd/pull/996 -// Its _mandatory_ that the caller do the API safe construction to generate a module account addr, -// namely, address.Module(ModuleName, {key}) -func CanCreateModuleAccountAtAddr(ctx sdk.Context, ak AccountKeeper, addr sdk.AccAddress) error { - existingAcct := ak.GetAccount(ctx, addr) - if existingAcct == nil { - return nil - } - if existingAcct.GetSequence() != 0 || existingAcct.GetPubKey() != nil { - return fmt.Errorf("cannot create module account %s, "+ - "due to an account at that address already existing & having sent txs", addr) - } - overrideAccountTypes := map[reflect.Type]struct{}{ - reflect.TypeOf(&authtypes.BaseAccount{}): {}, - reflect.TypeOf(&vestingtypes.DelayedVestingAccount{}): {}, - reflect.TypeOf(&vestingtypes.ContinuousVestingAccount{}): {}, - reflect.TypeOf(&vestingtypes.BaseVestingAccount{}): {}, - reflect.TypeOf(&vestingtypes.PeriodicVestingAccount{}): {}, - reflect.TypeOf(&vestingtypes.PermanentLockedAccount{}): {}, - } - for extraAccountType := range AkashUtilsExtraAccountTypes { - overrideAccountTypes[extraAccountType] = struct{}{} - } - - if _, isClear := overrideAccountTypes[reflect.TypeOf(existingAcct)]; isClear { - return nil - } - - return fmt.Errorf("cannot create module account %s, "+ - "due to an account at that address already existing & not being an overridable type", existingAcct) -} - -// CreateModuleAccountByName creates a module account at the provided name -func CreateModuleAccountByName(ctx sdk.Context, ak AccountKeeper, name string) error { - addr := authtypes.NewModuleAddress(name) - err := CanCreateModuleAccountAtAddr(ctx, ak, addr) - if err != nil { - return err - } - - acc := ak.NewAccount( - ctx, - authtypes.NewModuleAccount( - authtypes.NewBaseAccountWithAddress(addr), - name, - ), - ) - ak.SetAccount(ctx, acc) - return nil -} - -func (up *upgrade) UpgradeHandler() upgradetypes.UpgradeHandler { - baseAppLegacySS := up.Keepers.Cosmos.Params.Subspace(baseapp.Paramspace).WithKeyTable(paramstypes.ConsensusParamsKeyTable()) - - return func(ctx context.Context, plan upgradetypes.Plan, fromVM module.VersionMap) (module.VersionMap, error) { - // Migrate Tendermint consensus parameters from x/params module to a - // dedicated x/consensus module. - sctx := sdk.UnwrapSDKContext(ctx) - - err := baseapp.MigrateParams(sctx, baseAppLegacySS, up.Keepers.Cosmos.ConsensusParams.ParamsStore) - if err != nil { - return nil, err - } - sspace, exists := up.Keepers.Cosmos.Params.GetSubspace(stakingtypes.ModuleName) - if !exists { - return nil, fmt.Errorf("params subspace \"%s\" not found", stakingtypes.ModuleName) - } - - up.log.Info("migrating x/take to self-managed params") - sspace, exists = up.Keepers.Cosmos.Params.GetSubspace(taketypes.ModuleName) - if !exists { - return nil, fmt.Errorf("params subspace \"%s\" not found", taketypes.ModuleName) - } - - tparams := taketypes.Params{} - sspace.Get(sctx, taketypes.KeyDefaultTakeRate, &tparams.DefaultTakeRate) - sspace.Get(sctx, taketypes.KeyDenomTakeRates, &tparams.DenomTakeRates) - - err = up.Keepers.Akash.Take.SetParams(sctx, tparams) - if err != nil { - return nil, err - } - - up.log.Info("migrating x/deployment to self-managed params") - sspace, exists = up.Keepers.Cosmos.Params.GetSubspace(dv1.ModuleName) - if !exists { - return nil, fmt.Errorf("params subspace \"%s\" not found", dv1.ModuleName) - } - - deplParams := &dv1beta3.Params{} - sspace.GetParamSet(sctx, deplParams) - - nDeplParams := dv1beta.Params{ - MinDeposits: make(sdk.Coins, 0, len(deplParams.MinDeposits)), - } - - for _, coin := range deplParams.MinDeposits { - nDeplParams.MinDeposits = append(nDeplParams.MinDeposits, sdk.Coin{ - Denom: coin.Denom, - Amount: sdkmath.NewIntFromBigInt(coin.Amount.BigInt()), - }) - } - err = up.Keepers.Akash.Deployment.SetParams(sctx, nDeplParams) - if err != nil { - return nil, err - } - - up.log.Info("migrating x/market to self-managed params") - sspace, exists = up.Keepers.Cosmos.Params.GetSubspace(mv1.ModuleName) - if !exists { - return nil, fmt.Errorf("params subspace \"%s\" not found", mv1.ModuleName) - } - - mParams := &mv1beta4.Params{} - sspace.GetParamSet(sctx, mParams) - - err = up.Keepers.Akash.Market.SetParams(sctx, mv1beta.Params{ - BidMinDeposit: mParams.BidMinDeposit, - OrderMaxBids: mParams.OrderMaxBids, - }) - if err != nil { - return nil, err - } - - sspace, exists = up.Keepers.Cosmos.Params.GetSubspace("agov") - if !exists { - return nil, fmt.Errorf("params subspace \"%s\" not found", "agov") - } - - dparams := agovtypes.DepositParams{} - sspace.Get(sctx, agovtypes.KeyDepositParams, &dparams) - - sspace, exists = up.Keepers.Cosmos.Params.GetSubspace(astakingtypes.ModuleName) - if !exists { - return nil, fmt.Errorf("params subspace \"%s\" not found", astakingtypes.ModuleName) - } - - sparam := sdkmath.LegacyDec{} - sspace.Get(sctx, astakingtypes.KeyMinCommissionRate, &sparam) - - toVM, err := up.MM.RunMigrations(ctx, up.Configurator, fromVM) - if err != nil { - return nil, err - } - - // patch deposit authorizations after authz store upgrade - err = up.patchDepositAuthorizations(sctx) - if err != nil { - return nil, err - } - - up.log.Info(fmt.Sprintf("migrating param agov.MinInitialDepositRate to gov.MinInitialDepositRatio")) - up.log.Info(fmt.Sprintf("setting gov.ExpeditedMinDeposit to 2000akt")) - up.log.Info(fmt.Sprintf("setting gov.ExpeditedThreshold to 67%%")) - - // Migrate governance min deposit parameter to builtin gov params - gparams, err := up.Keepers.Cosmos.Gov.Params.Get(ctx) - if err != nil { - return nil, err - } - - gparams.MinInitialDepositRatio = dparams.MinInitialDepositRate.String() - - // min deposit for an expedited proposal is set to 2000AKT - gparams.ExpeditedMinDeposit = sdk.NewCoins(sdk.NewCoin("uakt", sdkmath.NewInt(2000000000))) - gparams.ExpeditedThreshold = sdkmath.LegacyNewDecWithPrec(667, 3).String() - - eVotePeriod := time.Hour * 24 - gparams.ExpeditedVotingPeriod = &eVotePeriod - - err = up.Keepers.Cosmos.Gov.Params.Set(ctx, gparams) - if err != nil { - return nil, err - } - - up.log.Info(fmt.Sprintf("migrating param astaking.MinCommissionRate to staking.MinCommissionRate")) - sparams, err := up.Keepers.Cosmos.Staking.GetParams(sctx) - if err != nil { - return nil, err - } - sparams.MinCommissionRate = sparam - - err = up.Keepers.Cosmos.Staking.SetParams(ctx, sparams) - if err != nil { - return nil, err - } - - up.log.Info(fmt.Sprintf("all migrations have been completed")) - - return toVM, err - } -} - -func (up *upgrade) patchDepositAuthorizations(ctx sdk.Context) error { - msgUrlOld := "/akash.deployment.v1beta3.MsgDepositDeployment" - - var err error - up.log.Info(fmt.Sprintf("migrating \"%s\" to \"%s\"", msgUrlOld, (&ev1.DepositAuthorization{}).MsgTypeURL())) - up.Keepers.Cosmos.Authz.IterateGrants(ctx, func(granterAddr sdk.AccAddress, granteeAddr sdk.AccAddress, grant authz.Grant) bool { - var authorization authz.Authorization - authorization, err = grant.GetAuthorization() - if err != nil { - up.log.Error(fmt.Sprintf("unable to get authorization. err=%s", err.Error())) - return false - } - - var nAuthz authz.Authorization - - switch authorization.MsgTypeURL() { - case msgUrlOld: - authzOld, valid := authorization.(*dv1beta3.DepositDeploymentAuthorization) - if !valid { - up.log.Error(fmt.Sprintf("invalid authorization type %s", reflect.TypeOf(authorization).String())) - return false - } - nAuthz = ev1.NewDepositAuthorization(ev1.DepositAuthorizationScopes{ev1.DepositScopeDeployment}, authzOld.SpendLimit) - default: - return false - } - - err = up.Keepers.Cosmos.Authz.DeleteGrant(ctx, granteeAddr, granterAddr, authorization.MsgTypeURL()) - if err != nil { - up.log.Error(fmt.Sprintf("unable to delete autorization. err=%s", err.Error())) - return false - } - - err = up.Keepers.Cosmos.Authz.SaveGrant(ctx, granteeAddr, granterAddr, nAuthz, grant.Expiration) - if err != nil { - up.log.Error(fmt.Sprintf("unable to save autorization. err=%s", err.Error())) - return true - } - - return false - }) - if err != nil { - return err - } - - up.log.Info("cleaning expired grants") - err = up.Keepers.Cosmos.Authz.DequeueAndDeleteExpiredGrants(ctx) - if err != nil { - return err - } - up.log.Info("cleaning expired grants - DONE") - - return nil -} diff --git a/upgrades/software/v2.0.0/init.go b/upgrades/software/v2.0.0/init.go new file mode 100644 index 0000000000..d19b34204d --- /dev/null +++ b/upgrades/software/v2.0.0/init.go @@ -0,0 +1,11 @@ +// Package v2_0_0 +// nolint revive +package v2_0_0 + +import ( + utypes "pkg.akt.dev/node/v2/upgrades/types" +) + +func init() { + utypes.RegisterUpgrade(UpgradeName, initUpgrade) +} diff --git a/upgrades/software/v2.0.0/upgrade.go b/upgrades/software/v2.0.0/upgrade.go new file mode 100644 index 0000000000..99c935e2e6 --- /dev/null +++ b/upgrades/software/v2.0.0/upgrade.go @@ -0,0 +1,87 @@ +// Package v2_0_0 +// nolint revive +package v2_0_0 + +import ( + "context" + "fmt" + + "cosmossdk.io/log" + storetypes "cosmossdk.io/store/types" + upgradetypes "cosmossdk.io/x/upgrade/types" + "github.com/CosmWasm/wasmd/x/wasm" + wasmtypes "github.com/CosmWasm/wasmd/x/wasm/types" + "github.com/cosmos/cosmos-sdk/types/module" + + apptypes "pkg.akt.dev/node/v2/app/types" + utypes "pkg.akt.dev/node/v2/upgrades/types" + awasm "pkg.akt.dev/node/v2/x/wasm" +) + +const ( + UpgradeName = "v2.0.0" +) + +type upgrade struct { + *apptypes.App + log log.Logger +} + +var _ utypes.IUpgrade = (*upgrade)(nil) + +func initUpgrade(log log.Logger, app *apptypes.App) (utypes.IUpgrade, error) { + up := &upgrade{ + App: app, + log: log.With("module", fmt.Sprintf("upgrade/%s", UpgradeName)), + } + + return up, nil +} + +func (up *upgrade) StoreLoader() *storetypes.StoreUpgrades { + return &storetypes.StoreUpgrades{ + Added: []string{ + awasm.ModuleName, + // With the migrations of all modules away from x/params, the crisis module now has a store. + // The store must be created during a chain upgrade to v0.53.x. + wasmtypes.ModuleName, + }, + Deleted: []string{}, + } +} + +func (up *upgrade) UpgradeHandler() upgradetypes.UpgradeHandler { + return func(ctx context.Context, plan upgradetypes.Plan, fromVM module.VersionMap) (module.VersionMap, error) { + // Set wasm old version to 1 if we want to call wasm's InitGenesis ourselves + // in this upgrade logic ourselves. + // + // vm[wasm.ModuleName] = wasm.ConsensusVersion + // + // Otherwise we run this, which will run wasm.InitGenesis(wasm.DefaultGenesis()) + // and then override it after. + + // Set the initial wasm module version + fromVM[wasmtypes.ModuleName] = wasm.AppModule{}.ConsensusVersion() + + // Set default wasm params + params := wasmtypes.DefaultParams() + + // Configure code upload access - RESTRICTED TO GOVERNANCE ONLY + // Only governance proposals can upload contract code + // This provides maximum security for mainnet deployment + params.CodeUploadAccess = wasmtypes.AccessConfig{ + Permission: wasmtypes.AccessTypeNobody, + } + + params.CodeUploadAccess = wasmtypes.AllowNobody + // Configure instantiate default permission + params.InstantiateDefaultPermission = wasmtypes.AccessTypeEverybody + + err := up.Keepers.External.Wasm.SetParams(ctx, params) + if err != nil { + return fromVM, err + } + + return up.MM.RunMigrations(ctx, up.Configurator, fromVM) + } +} diff --git a/upgrades/types/types.go b/upgrades/types/types.go index cbd69bca1d..ca2be6bd4e 100644 --- a/upgrades/types/types.go +++ b/upgrades/types/types.go @@ -10,7 +10,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" sdkmodule "github.com/cosmos/cosmos-sdk/types/module" - apptypes "pkg.akt.dev/node/app/types" + apptypes "pkg.akt.dev/node/v2/app/types" ) var ( diff --git a/upgrades/upgrades.go b/upgrades/upgrades.go index ea143ded18..b04dad889f 100644 --- a/upgrades/upgrades.go +++ b/upgrades/upgrades.go @@ -2,5 +2,5 @@ package upgrades import ( // nolint: revive - _ "pkg.akt.dev/node/upgrades/software/v1.0.0" + _ "pkg.akt.dev/node/v2/upgrades/software/v2.0.0" ) diff --git a/upgrades/upgrades_test.go b/upgrades/upgrades_test.go index fc379aa757..b0496c7e09 100644 --- a/upgrades/upgrades_test.go +++ b/upgrades/upgrades_test.go @@ -8,7 +8,7 @@ import ( "github.com/stretchr/testify/require" "golang.org/x/mod/semver" - utypes "pkg.akt.dev/node/upgrades/types" + utypes "pkg.akt.dev/node/v2/upgrades/types" ) func TestUpgradesName(t *testing.T) { diff --git a/util/partialord/internal/dag/dag_test.go b/util/partialord/internal/dag/dag_test.go index 7a7cbf4551..ffee61b490 100644 --- a/util/partialord/internal/dag/dag_test.go +++ b/util/partialord/internal/dag/dag_test.go @@ -5,7 +5,7 @@ import ( "github.com/stretchr/testify/require" - "pkg.akt.dev/node/util/partialord/internal/dag" + "pkg.akt.dev/node/v2/util/partialord/internal/dag" ) type edge struct { diff --git a/util/partialord/partialord.go b/util/partialord/partialord.go index d1d4387e5f..aa81843964 100644 --- a/util/partialord/partialord.go +++ b/util/partialord/partialord.go @@ -3,7 +3,7 @@ package partialord import ( "sort" - "pkg.akt.dev/node/util/partialord/internal/dag" + "pkg.akt.dev/node/v2/util/partialord/internal/dag" ) type PartialOrdering struct { diff --git a/util/partialord/partialord_test.go b/util/partialord/partialord_test.go index 451cf29718..c2cf7d8253 100644 --- a/util/partialord/partialord_test.go +++ b/util/partialord/partialord_test.go @@ -5,7 +5,7 @@ import ( "github.com/stretchr/testify/require" - "pkg.akt.dev/node/util/partialord" + "pkg.akt.dev/node/v2/util/partialord" ) func TestAPI(t *testing.T) { diff --git a/util/query/pagination.go b/util/query/pagination.go index 9138469a60..85b097f8a2 100644 --- a/util/query/pagination.go +++ b/util/query/pagination.go @@ -5,7 +5,7 @@ import ( "fmt" "hash/crc32" - "pkg.akt.dev/node/util/validation" + "pkg.akt.dev/node/v2/util/validation" ) var ( diff --git a/x/audit/alias.go b/x/audit/alias.go index 4500cd1be4..c00657554c 100644 --- a/x/audit/alias.go +++ b/x/audit/alias.go @@ -3,7 +3,7 @@ package audit import ( types "pkg.akt.dev/go/node/audit/v1" - "pkg.akt.dev/node/x/audit/keeper" + "pkg.akt.dev/node/v2/x/audit/keeper" ) const ( diff --git a/x/audit/genesis.go b/x/audit/genesis.go index 0ffcffadf8..918f40a141 100644 --- a/x/audit/genesis.go +++ b/x/audit/genesis.go @@ -10,7 +10,7 @@ import ( sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" types "pkg.akt.dev/go/node/audit/v1" - "pkg.akt.dev/node/x/audit/keeper" + "pkg.akt.dev/node/v2/x/audit/keeper" ) // ValidateGenesis does validation check of the Genesis and returns error in-case of failure diff --git a/x/audit/handler/handler.go b/x/audit/handler/handler.go index 112323a8e8..715ee040b8 100644 --- a/x/audit/handler/handler.go +++ b/x/audit/handler/handler.go @@ -9,7 +9,7 @@ import ( types "pkg.akt.dev/go/node/audit/v1" - "pkg.akt.dev/node/x/audit/keeper" + "pkg.akt.dev/node/v2/x/audit/keeper" ) // NewHandler returns a handler for "provider" type messages. diff --git a/x/audit/handler/handler_test.go b/x/audit/handler/handler_test.go index b1fecf6232..1c85a47028 100644 --- a/x/audit/handler/handler_test.go +++ b/x/audit/handler/handler_test.go @@ -23,8 +23,8 @@ import ( "pkg.akt.dev/go/testutil" - "pkg.akt.dev/node/x/audit/handler" - "pkg.akt.dev/node/x/audit/keeper" + "pkg.akt.dev/node/v2/x/audit/handler" + "pkg.akt.dev/node/v2/x/audit/keeper" ) type testSuite struct { diff --git a/x/audit/handler/msg_server.go b/x/audit/handler/msg_server.go index f5aac32c55..5628df5293 100644 --- a/x/audit/handler/msg_server.go +++ b/x/audit/handler/msg_server.go @@ -7,7 +7,7 @@ import ( types "pkg.akt.dev/go/node/audit/v1" - "pkg.akt.dev/node/x/audit/keeper" + "pkg.akt.dev/node/v2/x/audit/keeper" ) type msgServer struct { diff --git a/x/audit/keeper/grpc_query_test.go b/x/audit/keeper/grpc_query_test.go index f267e7ff7c..069b2b796e 100644 --- a/x/audit/keeper/grpc_query_test.go +++ b/x/audit/keeper/grpc_query_test.go @@ -13,8 +13,8 @@ import ( types "pkg.akt.dev/go/node/audit/v1" "pkg.akt.dev/go/testutil" - "pkg.akt.dev/node/app" - "pkg.akt.dev/node/x/audit/keeper" + "pkg.akt.dev/node/v2/app" + "pkg.akt.dev/node/v2/x/audit/keeper" ) type grpcTestSuite struct { @@ -31,7 +31,7 @@ func setupTest(t *testing.T) *grpcTestSuite { t: t, } - suite.app = app.Setup(app.WithGenesis(app.GenesisStateWithValSet)) + suite.app = app.Setup(app.WithHome(t.TempDir()), app.WithGenesis(app.GenesisStateWithValSet)) suite.ctx, suite.keeper = setupKeeper(t) querier := keeper.Querier{Keeper: suite.keeper} diff --git a/x/audit/keeper/keeper_test.go b/x/audit/keeper/keeper_test.go index 23f1f05215..4b2b17a83c 100644 --- a/x/audit/keeper/keeper_test.go +++ b/x/audit/keeper/keeper_test.go @@ -21,7 +21,7 @@ import ( types "pkg.akt.dev/go/node/audit/v1" "pkg.akt.dev/go/testutil" - "pkg.akt.dev/node/x/audit/keeper" + "pkg.akt.dev/node/v2/x/audit/keeper" ) func TestProviderCreate(t *testing.T) { diff --git a/x/audit/keeper/key.go b/x/audit/keeper/key.go index 75cf186c2f..e0e03dd5a9 100644 --- a/x/audit/keeper/key.go +++ b/x/audit/keeper/key.go @@ -10,7 +10,7 @@ import ( types "pkg.akt.dev/go/node/audit/v1" - "pkg.akt.dev/node/util/validation" + "pkg.akt.dev/node/v2/util/validation" ) func ProviderKey(id types.ProviderID) []byte { diff --git a/x/audit/module.go b/x/audit/module.go index b4d0078e2e..a8b6c73a67 100644 --- a/x/audit/module.go +++ b/x/audit/module.go @@ -19,8 +19,8 @@ import ( types "pkg.akt.dev/go/node/audit/v1" - "pkg.akt.dev/node/x/audit/handler" - "pkg.akt.dev/node/x/audit/keeper" + "pkg.akt.dev/node/v2/x/audit/handler" + "pkg.akt.dev/node/v2/x/audit/keeper" ) var ( diff --git a/x/cert/alias.go b/x/cert/alias.go index 97dc00d932..e146a74674 100644 --- a/x/cert/alias.go +++ b/x/cert/alias.go @@ -3,7 +3,7 @@ package cert import ( types "pkg.akt.dev/go/node/cert/v1" - "pkg.akt.dev/node/x/cert/keeper" + "pkg.akt.dev/node/v2/x/cert/keeper" ) const ( diff --git a/x/cert/genesis.go b/x/cert/genesis.go index 5e902d4f24..0e5cd4c01c 100644 --- a/x/cert/genesis.go +++ b/x/cert/genesis.go @@ -9,7 +9,7 @@ import ( "github.com/cosmos/cosmos-sdk/codec" sdk "github.com/cosmos/cosmos-sdk/types" - "pkg.akt.dev/node/x/cert/keeper" + "pkg.akt.dev/node/v2/x/cert/keeper" types "pkg.akt.dev/go/node/cert/v1" ) diff --git a/x/cert/handler/handler.go b/x/cert/handler/handler.go index e80a034e42..e8761292f3 100644 --- a/x/cert/handler/handler.go +++ b/x/cert/handler/handler.go @@ -7,7 +7,7 @@ import ( types "pkg.akt.dev/go/node/cert/v1" - "pkg.akt.dev/node/x/cert/keeper" + "pkg.akt.dev/node/v2/x/cert/keeper" ) // NewHandler returns a handler for "provider" type messages. diff --git a/x/cert/handler/handler_test.go b/x/cert/handler/handler_test.go index 73345eef06..ee5535d7e8 100644 --- a/x/cert/handler/handler_test.go +++ b/x/cert/handler/handler_test.go @@ -22,8 +22,8 @@ import ( types "pkg.akt.dev/go/node/cert/v1" "pkg.akt.dev/go/testutil" - "pkg.akt.dev/node/x/cert/handler" - "pkg.akt.dev/node/x/cert/keeper" + "pkg.akt.dev/node/v2/x/cert/handler" + "pkg.akt.dev/node/v2/x/cert/keeper" ) type testSuite struct { diff --git a/x/cert/handler/msg_server.go b/x/cert/handler/msg_server.go index b92685765e..39201cdd51 100644 --- a/x/cert/handler/msg_server.go +++ b/x/cert/handler/msg_server.go @@ -7,7 +7,7 @@ import ( types "pkg.akt.dev/go/node/cert/v1" - "pkg.akt.dev/node/x/cert/keeper" + "pkg.akt.dev/node/v2/x/cert/keeper" ) type msgServer struct { diff --git a/x/cert/keeper/grpc_query.go b/x/cert/keeper/grpc_query.go index 9826cb2ba2..1b61a0e01b 100644 --- a/x/cert/keeper/grpc_query.go +++ b/x/cert/keeper/grpc_query.go @@ -12,7 +12,7 @@ import ( types "pkg.akt.dev/go/node/cert/v1" - "pkg.akt.dev/node/util/query" + "pkg.akt.dev/node/v2/util/query" ) // Querier is used as Keeper will have duplicate methods if used directly, and gRPC names take precedence over keeper diff --git a/x/cert/keeper/grpc_query_test.go b/x/cert/keeper/grpc_query_test.go index 44ee036d71..6eb3bfb95a 100644 --- a/x/cert/keeper/grpc_query_test.go +++ b/x/cert/keeper/grpc_query_test.go @@ -14,8 +14,8 @@ import ( types "pkg.akt.dev/go/node/cert/v1" "pkg.akt.dev/go/testutil" - "pkg.akt.dev/node/app" - "pkg.akt.dev/node/x/cert/keeper" + "pkg.akt.dev/node/v2/app" + "pkg.akt.dev/node/v2/x/cert/keeper" ) type grpcTestSuite struct { diff --git a/x/cert/keeper/keeper_test.go b/x/cert/keeper/keeper_test.go index 83da5c9142..55a5d2dfa3 100644 --- a/x/cert/keeper/keeper_test.go +++ b/x/cert/keeper/keeper_test.go @@ -19,7 +19,7 @@ import ( types "pkg.akt.dev/go/node/cert/v1" "pkg.akt.dev/go/testutil" - "pkg.akt.dev/node/x/cert/keeper" + "pkg.akt.dev/node/v2/x/cert/keeper" ) func TestCertKeeperCreate(t *testing.T) { diff --git a/x/cert/keeper/key.go b/x/cert/keeper/key.go index 87f02a7d35..1e1e8e0573 100644 --- a/x/cert/keeper/key.go +++ b/x/cert/keeper/key.go @@ -13,7 +13,7 @@ import ( types "pkg.akt.dev/go/node/cert/v1" - "pkg.akt.dev/node/util/validation" + "pkg.akt.dev/node/v2/util/validation" ) const ( diff --git a/x/cert/module.go b/x/cert/module.go index 29b5e14259..637e80ade8 100644 --- a/x/cert/module.go +++ b/x/cert/module.go @@ -18,9 +18,9 @@ import ( types "pkg.akt.dev/go/node/cert/v1" - "pkg.akt.dev/node/x/cert/handler" - "pkg.akt.dev/node/x/cert/keeper" - "pkg.akt.dev/node/x/cert/simulation" + "pkg.akt.dev/node/v2/x/cert/handler" + "pkg.akt.dev/node/v2/x/cert/keeper" + "pkg.akt.dev/node/v2/x/cert/simulation" ) var ( diff --git a/x/cert/utils/key_pair_manager.go b/x/cert/utils/key_pair_manager.go index 5ab6776154..8132b92e2a 100644 --- a/x/cert/utils/key_pair_manager.go +++ b/x/cert/utils/key_pair_manager.go @@ -27,7 +27,7 @@ import ( types "pkg.akt.dev/go/node/cert/v1" - certerrors "pkg.akt.dev/node/x/cert/errors" + certerrors "pkg.akt.dev/node/v2/x/cert/errors" ) var ( diff --git a/x/cert/utils/utils.go b/x/cert/utils/utils.go index 19f854e980..66c9806d2a 100644 --- a/x/cert/utils/utils.go +++ b/x/cert/utils/utils.go @@ -7,7 +7,7 @@ import ( "io" "time" - certerrors "pkg.akt.dev/node/x/cert/errors" + certerrors "pkg.akt.dev/node/v2/x/cert/errors" "github.com/cosmos/cosmos-sdk/client" diff --git a/x/deployment/alias.go b/x/deployment/alias.go index 8ffc73a9b0..b38bec9771 100644 --- a/x/deployment/alias.go +++ b/x/deployment/alias.go @@ -3,7 +3,7 @@ package deployment import ( types "pkg.akt.dev/go/node/deployment/v1" - "pkg.akt.dev/node/x/deployment/keeper" + "pkg.akt.dev/node/v2/x/deployment/keeper" ) const ( diff --git a/x/deployment/genesis.go b/x/deployment/genesis.go index e60754a3bb..32fac6183c 100644 --- a/x/deployment/genesis.go +++ b/x/deployment/genesis.go @@ -10,7 +10,7 @@ import ( "pkg.akt.dev/go/node/deployment/v1" "pkg.akt.dev/go/node/deployment/v1beta4" - "pkg.akt.dev/node/x/deployment/keeper" + "pkg.akt.dev/node/v2/x/deployment/keeper" ) // ValidateGenesis does validation check of the Genesis and return error in case of failure diff --git a/x/deployment/handler/handler.go b/x/deployment/handler/handler.go index 865b819961..e788711a6f 100644 --- a/x/deployment/handler/handler.go +++ b/x/deployment/handler/handler.go @@ -7,7 +7,7 @@ import ( types "pkg.akt.dev/go/node/deployment/v1beta4" - "pkg.akt.dev/node/x/deployment/keeper" + "pkg.akt.dev/node/v2/x/deployment/keeper" ) // NewHandler returns a handler for "deployment" type messages diff --git a/x/deployment/handler/handler_test.go b/x/deployment/handler/handler_test.go index f058b32f31..6665aa3fd7 100644 --- a/x/deployment/handler/handler_test.go +++ b/x/deployment/handler/handler_test.go @@ -25,12 +25,12 @@ import ( deposit "pkg.akt.dev/go/node/types/deposit/v1" "pkg.akt.dev/go/testutil" - cmocks "pkg.akt.dev/node/testutil/cosmos/mocks" - "pkg.akt.dev/node/testutil/state" - "pkg.akt.dev/node/x/deployment/handler" - "pkg.akt.dev/node/x/deployment/keeper" - ehandler "pkg.akt.dev/node/x/escrow/handler" - mkeeper "pkg.akt.dev/node/x/market/keeper" + cmocks "pkg.akt.dev/node/v2/testutil/cosmos/mocks" + "pkg.akt.dev/node/v2/testutil/state" + "pkg.akt.dev/node/v2/x/deployment/handler" + "pkg.akt.dev/node/v2/x/deployment/keeper" + ehandler "pkg.akt.dev/node/v2/x/escrow/handler" + mkeeper "pkg.akt.dev/node/v2/x/market/keeper" ) type testSuite struct { diff --git a/x/deployment/handler/server.go b/x/deployment/handler/server.go index 54f6b2a6e4..dace203894 100644 --- a/x/deployment/handler/server.go +++ b/x/deployment/handler/server.go @@ -11,7 +11,7 @@ import ( v1 "pkg.akt.dev/go/node/deployment/v1" types "pkg.akt.dev/go/node/deployment/v1beta4" - "pkg.akt.dev/node/x/deployment/keeper" + "pkg.akt.dev/node/v2/x/deployment/keeper" ) var _ types.MsgServer = msgServer{} diff --git a/x/deployment/keeper/grpc_query.go b/x/deployment/keeper/grpc_query.go index 14d75f97bc..a4bf7964e3 100644 --- a/x/deployment/keeper/grpc_query.go +++ b/x/deployment/keeper/grpc_query.go @@ -14,7 +14,7 @@ import ( "pkg.akt.dev/go/node/deployment/v1" types "pkg.akt.dev/go/node/deployment/v1beta4" - "pkg.akt.dev/node/util/query" + "pkg.akt.dev/node/v2/util/query" ) // Querier is used as Keeper will have duplicate methods if used directly, and gRPC names take precedence over keeper diff --git a/x/deployment/keeper/grpc_query_test.go b/x/deployment/keeper/grpc_query_test.go index f48a4baf7d..95e5b16c29 100644 --- a/x/deployment/keeper/grpc_query_test.go +++ b/x/deployment/keeper/grpc_query_test.go @@ -18,10 +18,10 @@ import ( eid "pkg.akt.dev/go/node/escrow/id/v1" "pkg.akt.dev/go/testutil" - "pkg.akt.dev/node/app" - "pkg.akt.dev/node/testutil/state" - "pkg.akt.dev/node/x/deployment/keeper" - ekeeper "pkg.akt.dev/node/x/escrow/keeper" + "pkg.akt.dev/node/v2/app" + "pkg.akt.dev/node/v2/testutil/state" + "pkg.akt.dev/node/v2/x/deployment/keeper" + ekeeper "pkg.akt.dev/node/v2/x/escrow/keeper" ) type grpcTestSuite struct { diff --git a/x/deployment/keeper/keeper_test.go b/x/deployment/keeper/keeper_test.go index 834edec661..097207ca33 100644 --- a/x/deployment/keeper/keeper_test.go +++ b/x/deployment/keeper/keeper_test.go @@ -11,8 +11,8 @@ import ( types "pkg.akt.dev/go/node/deployment/v1" "pkg.akt.dev/go/testutil" - "pkg.akt.dev/node/testutil/state" - "pkg.akt.dev/node/x/deployment/keeper" + "pkg.akt.dev/node/v2/testutil/state" + "pkg.akt.dev/node/v2/x/deployment/keeper" ) func Test_Create(t *testing.T) { diff --git a/x/deployment/module.go b/x/deployment/module.go index a6a8bcc87a..693ecafa32 100644 --- a/x/deployment/module.go +++ b/x/deployment/module.go @@ -22,9 +22,9 @@ import ( types "pkg.akt.dev/go/node/deployment/v1beta4" "pkg.akt.dev/go/node/migrate" - "pkg.akt.dev/node/x/deployment/handler" - "pkg.akt.dev/node/x/deployment/keeper" - "pkg.akt.dev/node/x/deployment/simulation" + "pkg.akt.dev/node/v2/x/deployment/handler" + "pkg.akt.dev/node/v2/x/deployment/keeper" + "pkg.akt.dev/node/v2/x/deployment/simulation" ) // type check to ensure the interface is properly implemented diff --git a/x/deployment/simulation/operations.go b/x/deployment/simulation/operations.go index c3c87c291b..ab8d5790d8 100644 --- a/x/deployment/simulation/operations.go +++ b/x/deployment/simulation/operations.go @@ -21,9 +21,9 @@ import ( sdlv1 "pkg.akt.dev/go/sdl" - appparams "pkg.akt.dev/node/app/params" - testsim "pkg.akt.dev/node/testutil/sim" - "pkg.akt.dev/node/x/deployment/keeper" + appparams "pkg.akt.dev/node/v2/app/params" + testsim "pkg.akt.dev/node/v2/testutil/sim" + "pkg.akt.dev/node/v2/x/deployment/keeper" ) // Simulation operation weights constants diff --git a/x/escrow/genesis.go b/x/escrow/genesis.go index 4e276d6c4e..9b19543c53 100644 --- a/x/escrow/genesis.go +++ b/x/escrow/genesis.go @@ -11,7 +11,7 @@ import ( emodule "pkg.akt.dev/go/node/escrow/module" etypes "pkg.akt.dev/go/node/escrow/types/v1" - "pkg.akt.dev/node/x/escrow/keeper" + "pkg.akt.dev/node/v2/x/escrow/keeper" types "pkg.akt.dev/go/node/escrow/v1" ) diff --git a/x/escrow/handler/handler.go b/x/escrow/handler/handler.go index a4a227418d..9479c61cff 100644 --- a/x/escrow/handler/handler.go +++ b/x/escrow/handler/handler.go @@ -6,7 +6,7 @@ import ( sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" types "pkg.akt.dev/go/node/escrow/v1" - "pkg.akt.dev/node/x/escrow/keeper" + "pkg.akt.dev/node/v2/x/escrow/keeper" ) // NewHandler returns a handler for "deployment" type messages diff --git a/x/escrow/handler/server.go b/x/escrow/handler/server.go index d86e52bdfd..7798286e30 100644 --- a/x/escrow/handler/server.go +++ b/x/escrow/handler/server.go @@ -6,7 +6,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" types "pkg.akt.dev/go/node/escrow/v1" - "pkg.akt.dev/node/x/escrow/keeper" + "pkg.akt.dev/node/v2/x/escrow/keeper" ) var _ types.MsgServer = msgServer{} diff --git a/x/escrow/keeper/grpc_query.go b/x/escrow/keeper/grpc_query.go index 92233f491f..143a5cb865 100644 --- a/x/escrow/keeper/grpc_query.go +++ b/x/escrow/keeper/grpc_query.go @@ -13,7 +13,7 @@ import ( types "pkg.akt.dev/go/node/escrow/types/v1" "pkg.akt.dev/go/node/escrow/v1" - "pkg.akt.dev/node/util/query" + "pkg.akt.dev/node/v2/util/query" ) // Querier is used as Keeper will have duplicate methods if used directly, and gRPC names take precedence over keeper diff --git a/x/escrow/keeper/grpc_query_test.go b/x/escrow/keeper/grpc_query_test.go index b2b2e8ed4f..58f2a65582 100644 --- a/x/escrow/keeper/grpc_query_test.go +++ b/x/escrow/keeper/grpc_query_test.go @@ -19,9 +19,9 @@ import ( deposit "pkg.akt.dev/go/node/types/deposit/v1" "pkg.akt.dev/go/testutil" - "pkg.akt.dev/node/app" - "pkg.akt.dev/node/testutil/state" - ekeeper "pkg.akt.dev/node/x/escrow/keeper" + "pkg.akt.dev/node/v2/app" + "pkg.akt.dev/node/v2/testutil/state" + ekeeper "pkg.akt.dev/node/v2/x/escrow/keeper" ) type grpcTestSuite struct { diff --git a/x/escrow/keeper/keeper_test.go b/x/escrow/keeper/keeper_test.go index 427dfef6db..180c6b00f9 100644 --- a/x/escrow/keeper/keeper_test.go +++ b/x/escrow/keeper/keeper_test.go @@ -10,9 +10,9 @@ import ( etypes "pkg.akt.dev/go/node/escrow/types/v1" "pkg.akt.dev/go/testutil" - cmocks "pkg.akt.dev/node/testutil/cosmos/mocks" - "pkg.akt.dev/node/testutil/state" - "pkg.akt.dev/node/x/escrow/keeper" + cmocks "pkg.akt.dev/node/v2/testutil/cosmos/mocks" + "pkg.akt.dev/node/v2/testutil/state" + "pkg.akt.dev/node/v2/x/escrow/keeper" ) func Test_AccountCreate(t *testing.T) { diff --git a/x/escrow/module.go b/x/escrow/module.go index 92ffd660d1..8558331705 100644 --- a/x/escrow/module.go +++ b/x/escrow/module.go @@ -20,9 +20,9 @@ import ( "github.com/cosmos/cosmos-sdk/types/module" v1 "pkg.akt.dev/go/node/escrow/v1" - "pkg.akt.dev/node/x/escrow/client/rest" - "pkg.akt.dev/node/x/escrow/handler" - "pkg.akt.dev/node/x/escrow/keeper" + "pkg.akt.dev/node/v2/x/escrow/client/rest" + "pkg.akt.dev/node/v2/x/escrow/handler" + "pkg.akt.dev/node/v2/x/escrow/keeper" ) var ( diff --git a/x/escrow/query/querier.go b/x/escrow/query/querier.go index 8e8e47f68f..76db96d258 100644 --- a/x/escrow/query/querier.go +++ b/x/escrow/query/querier.go @@ -4,7 +4,7 @@ package query // "github.com/cosmos/cosmos-sdk/codec" // sdk "github.com/cosmos/cosmos-sdk/types" // -// "pkg.akt.dev/node/x/escrow/keeper" +// "pkg.akt.dev/node/v2/x/escrow/keeper" // ) // // func NewQuerier(keeper keeper.Keeper, cdc *codec.LegacyAmino) sdk.Querier { diff --git a/x/market/alias.go b/x/market/alias.go index 330e4913e5..322dd0f07e 100644 --- a/x/market/alias.go +++ b/x/market/alias.go @@ -3,7 +3,7 @@ package market import ( v1 "pkg.akt.dev/go/node/market/v1" - "pkg.akt.dev/node/x/market/keeper" + "pkg.akt.dev/node/v2/x/market/keeper" ) const ( diff --git a/x/market/client/rest/params.go b/x/market/client/rest/params.go index a51bb5fe78..eabee87ad5 100644 --- a/x/market/client/rest/params.go +++ b/x/market/client/rest/params.go @@ -8,7 +8,7 @@ package rest // "pkg.akt.dev/go/node/market/v1" // "pkg.akt.dev/go/node/market/v1beta5" // -// drest "pkg.akt.dev/node/x/deployment/client/rest" +// drest "pkg.akt.dev/node/v2/x/deployment/client/rest" // ) // // // OrderIDFromRequest returns OrderID from parsing request diff --git a/x/market/client/rest/rest.go b/x/market/client/rest/rest.go index 3cadc1c21a..7ab1a06606 100644 --- a/x/market/client/rest/rest.go +++ b/x/market/client/rest/rest.go @@ -6,7 +6,7 @@ import ( "github.com/cosmos/cosmos-sdk/client" "github.com/gorilla/mux" - // "pkg.akt.dev/node/x/market/query" + // "pkg.akt.dev/node/v2/x/market/query" ) // RegisterRoutes registers all query routes diff --git a/x/market/genesis.go b/x/market/genesis.go index 99485cd201..6bf8f54bc9 100644 --- a/x/market/genesis.go +++ b/x/market/genesis.go @@ -10,8 +10,8 @@ import ( "pkg.akt.dev/go/node/market/v1" "pkg.akt.dev/go/node/market/v1beta5" - "pkg.akt.dev/node/x/market/keeper" - "pkg.akt.dev/node/x/market/keeper/keys" + "pkg.akt.dev/node/v2/x/market/keeper" + "pkg.akt.dev/node/v2/x/market/keeper/keys" ) // ValidateGenesis does validation check of the Genesis diff --git a/x/market/handler/handler_test.go b/x/market/handler/handler_test.go index 8285dece1a..72eef95e77 100644 --- a/x/market/handler/handler_test.go +++ b/x/market/handler/handler_test.go @@ -24,8 +24,8 @@ import ( deposit "pkg.akt.dev/go/node/types/deposit/v1" "pkg.akt.dev/go/testutil" - "pkg.akt.dev/node/testutil/state" - "pkg.akt.dev/node/x/market/handler" + "pkg.akt.dev/node/v2/testutil/state" + "pkg.akt.dev/node/v2/x/market/handler" ) type testSuite struct { diff --git a/x/market/handler/keepers.go b/x/market/handler/keepers.go index c9a3ca3423..c20d4ea05b 100644 --- a/x/market/handler/keepers.go +++ b/x/market/handler/keepers.go @@ -16,7 +16,7 @@ import ( etypes "pkg.akt.dev/go/node/escrow/types/v1" ptypes "pkg.akt.dev/go/node/provider/v1beta4" - "pkg.akt.dev/node/x/market/keeper" + "pkg.akt.dev/node/v2/x/market/keeper" ) type EscrowKeeper interface { diff --git a/x/market/keeper/grpc_query.go b/x/market/keeper/grpc_query.go index 4eb06ac8ff..bd4d431cf9 100644 --- a/x/market/keeper/grpc_query.go +++ b/x/market/keeper/grpc_query.go @@ -13,8 +13,8 @@ import ( "pkg.akt.dev/go/node/market/v1" types "pkg.akt.dev/go/node/market/v1beta5" - "pkg.akt.dev/node/util/query" - "pkg.akt.dev/node/x/market/keeper/keys" + "pkg.akt.dev/node/v2/util/query" + "pkg.akt.dev/node/v2/x/market/keeper/keys" ) // Querier is used as Keeper will have duplicate methods if used directly, and gRPC names take precedence over keeper diff --git a/x/market/keeper/grpc_query_test.go b/x/market/keeper/grpc_query_test.go index 3b1bfa08a2..b03ad30847 100644 --- a/x/market/keeper/grpc_query_test.go +++ b/x/market/keeper/grpc_query_test.go @@ -16,8 +16,8 @@ import ( "pkg.akt.dev/go/node/market/v1beta5" "pkg.akt.dev/go/testutil" - "pkg.akt.dev/node/testutil/state" - "pkg.akt.dev/node/x/market/keeper" + "pkg.akt.dev/node/v2/testutil/state" + "pkg.akt.dev/node/v2/x/market/keeper" ) type grpcTestSuite struct { diff --git a/x/market/keeper/keeper.go b/x/market/keeper/keeper.go index 107f983046..7dad13c3df 100644 --- a/x/market/keeper/keeper.go +++ b/x/market/keeper/keeper.go @@ -12,7 +12,7 @@ import ( mv1 "pkg.akt.dev/go/node/market/v1" types "pkg.akt.dev/go/node/market/v1beta5" - "pkg.akt.dev/node/x/market/keeper/keys" + "pkg.akt.dev/node/v2/x/market/keeper/keys" ) type IKeeper interface { diff --git a/x/market/keeper/keeper_test.go b/x/market/keeper/keeper_test.go index 09ae00e538..b35fe28ba8 100644 --- a/x/market/keeper/keeper_test.go +++ b/x/market/keeper/keeper_test.go @@ -14,8 +14,8 @@ import ( deposit "pkg.akt.dev/go/node/types/deposit/v1" "pkg.akt.dev/go/testutil" - "pkg.akt.dev/node/testutil/state" - "pkg.akt.dev/node/x/market/keeper" + "pkg.akt.dev/node/v2/testutil/state" + "pkg.akt.dev/node/v2/x/market/keeper" ) func Test_CreateOrder(t *testing.T) { diff --git a/x/market/module.go b/x/market/module.go index cad5c0f872..d0ac7a9542 100644 --- a/x/market/module.go +++ b/x/market/module.go @@ -21,11 +21,11 @@ import ( bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" types "pkg.akt.dev/go/node/market/v1beta5" - akeeper "pkg.akt.dev/node/x/audit/keeper" - ekeeper "pkg.akt.dev/node/x/escrow/keeper" - "pkg.akt.dev/node/x/market/handler" - "pkg.akt.dev/node/x/market/keeper" - "pkg.akt.dev/node/x/market/simulation" + akeeper "pkg.akt.dev/node/v2/x/audit/keeper" + ekeeper "pkg.akt.dev/node/v2/x/escrow/keeper" + "pkg.akt.dev/node/v2/x/market/handler" + "pkg.akt.dev/node/v2/x/market/keeper" + "pkg.akt.dev/node/v2/x/market/simulation" ) // type check to ensure the interface is properly implemented diff --git a/x/market/query/path.go b/x/market/query/path.go index f686237048..161b648218 100644 --- a/x/market/query/path.go +++ b/x/market/query/path.go @@ -8,7 +8,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" v1 "pkg.akt.dev/go/node/market/v1" - dpath "pkg.akt.dev/node/x/deployment/query" + dpath "pkg.akt.dev/node/v2/x/deployment/query" ) const ( diff --git a/x/market/simulation/operations.go b/x/market/simulation/operations.go index 7ee5552472..46870a75d8 100644 --- a/x/market/simulation/operations.go +++ b/x/market/simulation/operations.go @@ -17,9 +17,9 @@ import ( "pkg.akt.dev/go/node/market/v1" types "pkg.akt.dev/go/node/market/v1beta5" - appparams "pkg.akt.dev/node/app/params" - testsim "pkg.akt.dev/node/testutil/sim" - keepers "pkg.akt.dev/node/x/market/handler" + appparams "pkg.akt.dev/node/v2/app/params" + testsim "pkg.akt.dev/node/v2/testutil/sim" + keepers "pkg.akt.dev/node/v2/x/market/handler" ) // Simulation operation weights constants diff --git a/x/market/simulation/utils.go b/x/market/simulation/utils.go index 2b15153407..bfddde1b7f 100644 --- a/x/market/simulation/utils.go +++ b/x/market/simulation/utils.go @@ -6,7 +6,7 @@ import ( ptypes "pkg.akt.dev/go/node/provider/v1beta4" - keepers "pkg.akt.dev/node/x/market/handler" + keepers "pkg.akt.dev/node/v2/x/market/handler" ) func getOrdersWithState(ctx sdk.Context, ks keepers.Keepers, state v1beta5.Order_State) v1beta5.Orders { diff --git a/x/provider/alias.go b/x/provider/alias.go index 90407bcba8..3e64924663 100644 --- a/x/provider/alias.go +++ b/x/provider/alias.go @@ -3,7 +3,7 @@ package provider import ( types "pkg.akt.dev/go/node/provider/v1beta4" - "pkg.akt.dev/node/x/provider/keeper" + "pkg.akt.dev/node/v2/x/provider/keeper" ) const ( diff --git a/x/provider/genesis.go b/x/provider/genesis.go index 3e1c7ac179..1290febb4e 100644 --- a/x/provider/genesis.go +++ b/x/provider/genesis.go @@ -9,7 +9,7 @@ import ( types "pkg.akt.dev/go/node/provider/v1beta4" - "pkg.akt.dev/node/x/provider/keeper" + "pkg.akt.dev/node/v2/x/provider/keeper" ) // ValidateGenesis does validation check of the Genesis and returns error in case of failure diff --git a/x/provider/handler/handler.go b/x/provider/handler/handler.go index 4d2e742c0f..dc47e76ab5 100644 --- a/x/provider/handler/handler.go +++ b/x/provider/handler/handler.go @@ -7,8 +7,8 @@ import ( types "pkg.akt.dev/go/node/provider/v1beta4" - mkeeper "pkg.akt.dev/node/x/market/keeper" - "pkg.akt.dev/node/x/provider/keeper" + mkeeper "pkg.akt.dev/node/v2/x/market/keeper" + "pkg.akt.dev/node/v2/x/provider/keeper" ) // NewHandler returns a handler for "provider" type messages. diff --git a/x/provider/handler/handler_test.go b/x/provider/handler/handler_test.go index bd13daff5c..4438368f97 100644 --- a/x/provider/handler/handler_test.go +++ b/x/provider/handler/handler_test.go @@ -15,10 +15,10 @@ import ( akashtypes "pkg.akt.dev/go/node/types/attributes/v1" "pkg.akt.dev/go/testutil" - "pkg.akt.dev/node/testutil/state" - mkeeper "pkg.akt.dev/node/x/market/keeper" - "pkg.akt.dev/node/x/provider/handler" - "pkg.akt.dev/node/x/provider/keeper" + "pkg.akt.dev/node/v2/testutil/state" + mkeeper "pkg.akt.dev/node/v2/x/market/keeper" + "pkg.akt.dev/node/v2/x/provider/handler" + "pkg.akt.dev/node/v2/x/provider/keeper" ) const ( diff --git a/x/provider/handler/server.go b/x/provider/handler/server.go index d353df7fd2..045d01003a 100644 --- a/x/provider/handler/server.go +++ b/x/provider/handler/server.go @@ -8,8 +8,8 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" types "pkg.akt.dev/go/node/provider/v1beta4" - mkeeper "pkg.akt.dev/node/x/market/keeper" - "pkg.akt.dev/node/x/provider/keeper" + mkeeper "pkg.akt.dev/node/v2/x/market/keeper" + "pkg.akt.dev/node/v2/x/provider/keeper" ) var ( diff --git a/x/provider/keeper/grpc_query_test.go b/x/provider/keeper/grpc_query_test.go index 06891f9c16..0d63ffdd76 100644 --- a/x/provider/keeper/grpc_query_test.go +++ b/x/provider/keeper/grpc_query_test.go @@ -13,9 +13,9 @@ import ( types "pkg.akt.dev/go/node/provider/v1beta4" "pkg.akt.dev/go/testutil" - "pkg.akt.dev/node/app" - "pkg.akt.dev/node/testutil/state" - "pkg.akt.dev/node/x/provider/keeper" + "pkg.akt.dev/node/v2/app" + "pkg.akt.dev/node/v2/testutil/state" + "pkg.akt.dev/node/v2/x/provider/keeper" ) type grpcTestSuite struct { diff --git a/x/provider/keeper/keeper_test.go b/x/provider/keeper/keeper_test.go index a65852bfaf..cb55306c1e 100644 --- a/x/provider/keeper/keeper_test.go +++ b/x/provider/keeper/keeper_test.go @@ -10,8 +10,8 @@ import ( types "pkg.akt.dev/go/node/provider/v1beta4" "pkg.akt.dev/go/testutil" - "pkg.akt.dev/node/testutil/state" - "pkg.akt.dev/node/x/provider/keeper" + "pkg.akt.dev/node/v2/testutil/state" + "pkg.akt.dev/node/v2/x/provider/keeper" ) func TestProviderCreate(t *testing.T) { diff --git a/x/provider/module.go b/x/provider/module.go index 4123e310c1..ecb40fafcb 100644 --- a/x/provider/module.go +++ b/x/provider/module.go @@ -20,10 +20,10 @@ import ( types "pkg.akt.dev/go/node/provider/v1beta4" - mkeeper "pkg.akt.dev/node/x/market/keeper" - "pkg.akt.dev/node/x/provider/handler" - "pkg.akt.dev/node/x/provider/keeper" - "pkg.akt.dev/node/x/provider/simulation" + mkeeper "pkg.akt.dev/node/v2/x/market/keeper" + "pkg.akt.dev/node/v2/x/provider/handler" + "pkg.akt.dev/node/v2/x/provider/keeper" + "pkg.akt.dev/node/v2/x/provider/simulation" ) // type check to ensure the interface is properly implemented diff --git a/x/provider/simulation/operations.go b/x/provider/simulation/operations.go index 7eb0286518..eee7469290 100644 --- a/x/provider/simulation/operations.go +++ b/x/provider/simulation/operations.go @@ -19,10 +19,10 @@ import ( types "pkg.akt.dev/go/node/provider/v1beta4" - appparams "pkg.akt.dev/node/app/params" - testsim "pkg.akt.dev/node/testutil/sim" - "pkg.akt.dev/node/x/provider/config" - "pkg.akt.dev/node/x/provider/keeper" + appparams "pkg.akt.dev/node/v2/app/params" + testsim "pkg.akt.dev/node/v2/testutil/sim" + "pkg.akt.dev/node/v2/x/provider/config" + "pkg.akt.dev/node/v2/x/provider/keeper" ) // Simulation operation weights constants diff --git a/x/take/genesis.go b/x/take/genesis.go index 7391ab625b..02a2713cd8 100644 --- a/x/take/genesis.go +++ b/x/take/genesis.go @@ -5,7 +5,7 @@ import ( types "pkg.akt.dev/go/node/take/v1" - "pkg.akt.dev/node/x/take/keeper" + "pkg.akt.dev/node/v2/x/take/keeper" ) // ValidateGenesis does validation check of the Genesis and return error incase of failure diff --git a/x/take/handler/server.go b/x/take/handler/server.go index 1dcdb75acf..01cd806b3e 100644 --- a/x/take/handler/server.go +++ b/x/take/handler/server.go @@ -8,7 +8,7 @@ import ( types "pkg.akt.dev/go/node/take/v1" - "pkg.akt.dev/node/x/take/keeper" + "pkg.akt.dev/node/v2/x/take/keeper" ) var _ types.MsgServer = msgServer{} diff --git a/x/take/module.go b/x/take/module.go index fb16f4ea61..7aba9ede8a 100644 --- a/x/take/module.go +++ b/x/take/module.go @@ -17,9 +17,9 @@ import ( "github.com/cosmos/cosmos-sdk/types/module" types "pkg.akt.dev/go/node/take/v1" - "pkg.akt.dev/node/x/take/handler" - "pkg.akt.dev/node/x/take/keeper" - "pkg.akt.dev/node/x/take/simulation" + "pkg.akt.dev/node/v2/x/take/handler" + "pkg.akt.dev/node/v2/x/take/keeper" + "pkg.akt.dev/node/v2/x/take/simulation" ) var ( diff --git a/x/wasm/alias.go b/x/wasm/alias.go new file mode 100644 index 0000000000..0a1fa05c61 --- /dev/null +++ b/x/wasm/alias.go @@ -0,0 +1,12 @@ +package wasm + +import ( + types "pkg.akt.dev/go/node/wasm/v1" +) + +const ( + // StoreKey represents storekey of take module + StoreKey = types.StoreKey + // ModuleName represents current module name + ModuleName = types.ModuleName +) diff --git a/x/wasm/genesis.go b/x/wasm/genesis.go new file mode 100644 index 0000000000..f1bffe9d49 --- /dev/null +++ b/x/wasm/genesis.go @@ -0,0 +1,49 @@ +package wasm + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" + distrtypes "github.com/cosmos/cosmos-sdk/x/distribution/types" + govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" + stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" + + types "pkg.akt.dev/go/node/wasm/v1" + + "pkg.akt.dev/node/v2/x/wasm/keeper" +) + +// ValidateGenesis does validation check of the Genesis and return error incase of failure +func ValidateGenesis(data *types.GenesisState) error { + return data.Params.Validate() +} + +// DefaultGenesisState returns default genesis state as raw bytes for the deployment +// module. +func DefaultGenesisState() *types.GenesisState { + return &types.GenesisState{ + Params: types.Params{ + BlockedAddresses: []string{ + authtypes.NewModuleAddress(govtypes.ModuleName).String(), + authtypes.NewModuleAddress(distrtypes.ModuleName).String(), + authtypes.NewModuleAddress(stakingtypes.BondedPoolName).String(), + authtypes.NewModuleAddress(stakingtypes.NotBondedPoolName).String(), + }, + }, + } +} + +// InitGenesis initiate genesis state and return updated validator details +func InitGenesis(ctx sdk.Context, keeper keeper.Keeper, data *types.GenesisState) { + err := keeper.SetParams(ctx, data.Params) + if err != nil { + panic(err.Error()) + } +} + +// ExportGenesis returns genesis state for the deployment module +func ExportGenesis(ctx sdk.Context, k keeper.Keeper) *types.GenesisState { + params := k.GetParams(ctx) + return &types.GenesisState{ + Params: params, + } +} diff --git a/x/wasm/handler/server.go b/x/wasm/handler/server.go new file mode 100644 index 0000000000..d6186a0430 --- /dev/null +++ b/x/wasm/handler/server.go @@ -0,0 +1,39 @@ +package handler + +import ( + "context" + + sdk "github.com/cosmos/cosmos-sdk/types" + govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" + + types "pkg.akt.dev/go/node/wasm/v1" + + "pkg.akt.dev/node/v2/x/wasm/keeper" +) + +var _ types.MsgServer = msgServer{} + +type msgServer struct { + keeper keeper.Keeper +} + +// NewMsgServerImpl returns an implementation of the akash staking MsgServer interface +// for the provided Keeper. +func NewMsgServerImpl(k keeper.Keeper) types.MsgServer { + return &msgServer{ + keeper: k, + } +} + +func (ms msgServer) UpdateParams(goCtx context.Context, req *types.MsgUpdateParams) (*types.MsgUpdateParamsResponse, error) { + if ms.keeper.GetAuthority() != req.Authority { + return nil, govtypes.ErrInvalidSigner.Wrapf("invalid authority; expected %s, got %s", ms.keeper.GetAuthority(), req.Authority) + } + + ctx := sdk.UnwrapSDKContext(goCtx) + if err := ms.keeper.SetParams(ctx, req.Params); err != nil { + return nil, err + } + + return &types.MsgUpdateParamsResponse{}, nil +} diff --git a/x/wasm/keeper/grpc_query.go b/x/wasm/keeper/grpc_query.go new file mode 100644 index 0000000000..643811b736 --- /dev/null +++ b/x/wasm/keeper/grpc_query.go @@ -0,0 +1,30 @@ +package keeper + +import ( + "context" + + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + + sdk "github.com/cosmos/cosmos-sdk/types" + + types "pkg.akt.dev/go/node/wasm/v1" +) + +// Querier is used as Keeper will have duplicate methods if used directly, and gRPC names take precedence over keeper +type Querier struct { + Keeper +} + +var _ types.QueryServer = Querier{} + +func (k Querier) Params(ctx context.Context, req *types.QueryParamsRequest) (*types.QueryParamsResponse, error) { + if req == nil { + return nil, status.Errorf(codes.InvalidArgument, "empty request") + } + + sdkCtx := sdk.UnwrapSDKContext(ctx) + params := k.GetParams(sdkCtx) + + return &types.QueryParamsResponse{Params: params}, nil +} diff --git a/x/wasm/keeper/keeper.go b/x/wasm/keeper/keeper.go new file mode 100644 index 0000000000..4eca06d15f --- /dev/null +++ b/x/wasm/keeper/keeper.go @@ -0,0 +1,102 @@ +package keeper + +import ( + storetypes "cosmossdk.io/store/types" + wasmkeeper "github.com/CosmWasm/wasmd/x/wasm/keeper" + "github.com/cosmos/cosmos-sdk/codec" + sdk "github.com/cosmos/cosmos-sdk/types" + + types "pkg.akt.dev/go/node/wasm/v1" +) + +type SetParamsHook func(sdk.Context, types.Params) + +type Keeper interface { + StoreKey() storetypes.StoreKey + Codec() codec.BinaryCodec + GetParams(ctx sdk.Context) (params types.Params) + SetParams(ctx sdk.Context, params types.Params) error + NewMsgFilterDecorator() func(wasmkeeper.Messenger) wasmkeeper.Messenger + + AddOnSetParamsHook(SetParamsHook) Keeper + + NewQuerier() Querier + GetAuthority() string +} + +// Keeper of the deployment store +type keeper struct { + skey storetypes.StoreKey + cdc codec.BinaryCodec + hooks struct { + onSetParams []SetParamsHook + } + + // The address capable of executing an MsgUpdateParams message. + // This should be the x/gov module account. + authority string +} + +// NewKeeper creates and returns an instance of take keeper +func NewKeeper(cdc codec.BinaryCodec, skey storetypes.StoreKey, authority string) Keeper { + return &keeper{ + skey: skey, + cdc: cdc, + authority: authority, + } +} + +// Codec returns keeper codec +func (k *keeper) Codec() codec.BinaryCodec { + return k.cdc +} + +func (k *keeper) StoreKey() storetypes.StoreKey { + return k.skey +} + +func (k *keeper) NewQuerier() Querier { + return Querier{k} +} + +// GetAuthority returns the x/mint module's authority. +func (k *keeper) GetAuthority() string { + return k.authority +} + +// SetParams sets the x/take module parameters. +func (k *keeper) SetParams(ctx sdk.Context, p types.Params) error { + if err := p.Validate(); err != nil { + return err + } + + store := ctx.KVStore(k.skey) + bz := k.cdc.MustMarshal(&p) + store.Set(types.ParamsPrefix(), bz) + + // call hooks + for _, hook := range k.hooks.onSetParams { + hook(ctx, p) + } + + return nil +} + +// GetParams returns the current x/take module parameters. +func (k *keeper) GetParams(ctx sdk.Context) (p types.Params) { + store := ctx.KVStore(k.skey) + bz := store.Get(types.ParamsPrefix()) + if bz == nil { + return p + } + + k.cdc.MustUnmarshal(bz, &p) + + return p +} + +func (k *keeper) AddOnSetParamsHook(hook SetParamsHook) Keeper { + k.hooks.onSetParams = append(k.hooks.onSetParams, hook) + + return k +} diff --git a/x/wasm/keeper/msg_filter.go b/x/wasm/keeper/msg_filter.go new file mode 100644 index 0000000000..df2c2fc307 --- /dev/null +++ b/x/wasm/keeper/msg_filter.go @@ -0,0 +1,193 @@ +package keeper + +import ( + errorsmod "cosmossdk.io/errors" + codectypes "github.com/cosmos/cosmos-sdk/codec/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + + wasmkeeper "github.com/CosmWasm/wasmd/x/wasm/keeper" + wasmvmtypes "github.com/CosmWasm/wasmvm/v3/types" + + sdk "github.com/cosmos/cosmos-sdk/types" + + wv1 "pkg.akt.dev/go/node/wasm/v1" +) + +// FilterMessenger wraps the default messenger with Phase 1 restrictions +type FilterMessenger struct { + k *keeper + next wasmkeeper.Messenger +} + +// NewMsgFilterDecorator returns the message filter decorator +func (k *keeper) NewMsgFilterDecorator() func(wasmkeeper.Messenger) wasmkeeper.Messenger { + return func(next wasmkeeper.Messenger) wasmkeeper.Messenger { + return &FilterMessenger{ + k: k, + next: next, + } + } +} + +// DispatchMsg applies Phase 1 filtering before dispatching +func (m *FilterMessenger) DispatchMsg( + ctx sdk.Context, + contractAddr sdk.AccAddress, + contractIBCPortID string, + msg wasmvmtypes.CosmosMsg, +) (events []sdk.Event, data [][]byte, msgResponses [][]*codectypes.Any, err error) { + // Apply Phase 1 restrictions + if err := m.k.FilterMessage(ctx, contractAddr, msg); err != nil { + // Emit event for monitoring + _ = ctx.EventManager().EmitTypedEvent( + &wv1.EventMsgBlocked{ + ContractAddress: contractAddr.String(), + MsgType: getMessageType(msg), + Reason: err.Error(), + }, + ) + + ctx.Logger().Info("Phase 1: Message blocked", + "contract", contractAddr.String(), + "type", getMessageType(msg), + "reason", err.Error(), + ) + + return nil, nil, nil, err + } + + // Pass to wrapped messenger + return m.next.DispatchMsg(ctx, contractAddr, contractIBCPortID, msg) +} + +// FilterMessage applies Phase 1 filtering rules +func (k *keeper) FilterMessage(sctx sdk.Context, contractAddr sdk.AccAddress, msg wasmvmtypes.CosmosMsg, +) error { + // ALLOW Bank messages (with restrictions) + if msg.Bank != nil { + return k.filterBankMessage(sctx, msg.Bank) + } + + // BLOCK Staking messages + if msg.Staking != nil { + return errorsmod.Wrap( + sdkerrors.ErrUnauthorized, + "Staking operations not allowed", + ) + } + + // BLOCK Distribution messages + if msg.Distribution != nil { + return errorsmod.Wrap( + sdkerrors.ErrUnauthorized, + "Distribution operations not allowed", + ) + } + + // BLOCK Governance messages + if msg.Gov != nil { + return errorsmod.Wrap( + sdkerrors.ErrUnauthorized, + "Governance operations not allowed", + ) + } + + // ALLOW IBC messages (for DeFi composability) + if msg.IBC != nil { + // IBC allowed in Phase 1 + return nil + } + + // BLOCK Custom messages (no Akash bindings) + if msg.Custom != nil { + return errorsmod.Wrap( + sdkerrors.ErrUnauthorized, + "Custom messages not allowed", + ) + } + + // BLOCK Any messages (no Akash bindings) + if msg.Any != nil { + return errorsmod.Wrap( + sdkerrors.ErrUnauthorized, + "Any messages not allowed", + ) + } + + // ALLOW Wasm messages (contract-to-contract calls) + if msg.Wasm != nil { + // Wasm execute/instantiate allowed + return nil + } + + return nil +} + +// filterBankMessage applies restrictions to bank operations +func (k *keeper) filterBankMessage(sctx sdk.Context, msg *wasmvmtypes.BankMsg) error { + // Allow send with restrictions + if msg.Send != nil { + params := k.GetParams(sctx) + + // Block transfers to critical addresses + for _, addr := range params.BlockedAddresses { + if addr == msg.Send.ToAddress { + return errorsmod.Wrapf( + sdkerrors.ErrUnauthorized, + "Transfers to %s blocked (critical address)", + msg.Send.ToAddress, + ) + } + } + + // Transfers to regular addresses allowed + return nil + } + + // Deny burns + if msg.Burn != nil { + return errorsmod.Wrapf( + sdkerrors.ErrUnauthorized, + "Burn is not allowed", + ) + } + + return nil +} + +// getMessageType returns a human-readable message type +func getMessageType(msg wasmvmtypes.CosmosMsg) string { + if msg.Bank != nil { + if msg.Bank.Send != nil { + return "bank.send" + } + if msg.Bank.Burn != nil { + return "bank.burn" + } + return "bank.unknown" + } + if msg.Staking != nil { + return "staking" + } + if msg.Distribution != nil { + return "distribution" + } + if msg.IBC != nil { + return "ibc" + } + if msg.Wasm != nil { + return "wasm" + } + if msg.Gov != nil { + return "gov" + } + if msg.Custom != nil { + return "custom" + } + + if msg.Any != nil { + return msg.Any.TypeURL + } + + return "unknown" +} diff --git a/x/wasm/module.go b/x/wasm/module.go new file mode 100644 index 0000000000..ef6ae1dc0d --- /dev/null +++ b/x/wasm/module.go @@ -0,0 +1,183 @@ +package wasm + +import ( + "context" + "encoding/json" + "fmt" + + "github.com/grpc-ecosystem/grpc-gateway/runtime" + "github.com/spf13/cobra" + + "cosmossdk.io/core/appmodule" + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/codec" + cdctypes "github.com/cosmos/cosmos-sdk/codec/types" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/module" + simtypes "github.com/cosmos/cosmos-sdk/types/simulation" + + types "pkg.akt.dev/go/node/wasm/v1" + + "pkg.akt.dev/node/v2/x/wasm/handler" + "pkg.akt.dev/node/v2/x/wasm/keeper" + "pkg.akt.dev/node/v2/x/wasm/simulation" +) + +var ( + _ module.AppModuleBasic = AppModuleBasic{} + _ module.HasGenesisBasics = AppModuleBasic{} + + _ appmodule.AppModule = AppModule{} + _ module.HasConsensusVersion = AppModule{} + _ module.HasGenesis = AppModule{} + _ module.HasServices = AppModule{} + + _ module.AppModuleSimulation = AppModule{} +) + +// AppModuleBasic defines the basic application module used by the provider module. +type AppModuleBasic struct { + cdc codec.Codec +} + +// AppModule implements an application module for the take module. +type AppModule struct { + AppModuleBasic + keeper keeper.Keeper +} + +// Name returns provider module's name +func (AppModuleBasic) Name() string { + return types.ModuleName +} + +// RegisterLegacyAminoCodec registers the provider module's types for the given codec. +func (AppModuleBasic) RegisterLegacyAminoCodec(cdc *codec.LegacyAmino) { + types.RegisterLegacyAminoCodec(cdc) // nolint staticcheck +} + +// RegisterInterfaces registers the module's interface types +func (b AppModuleBasic) RegisterInterfaces(registry cdctypes.InterfaceRegistry) { + types.RegisterInterfaces(registry) +} + +// DefaultGenesis returns default genesis state as raw bytes for the provider +// module. +func (AppModuleBasic) DefaultGenesis(cdc codec.JSONCodec) json.RawMessage { + return cdc.MustMarshalJSON(DefaultGenesisState()) +} + +// ValidateGenesis validation check of the Genesis +func (AppModuleBasic) ValidateGenesis(cdc codec.JSONCodec, _ client.TxEncodingConfig, bz json.RawMessage) error { + if bz == nil { + return nil + } + + var data types.GenesisState + + err := cdc.UnmarshalJSON(bz, &data) + if err != nil { + return fmt.Errorf("failed to unmarshal %s genesis state: %v", types.ModuleName, err) + } + + return ValidateGenesis(&data) +} + +// RegisterGRPCGatewayRoutes registers the gRPC Gateway routes for the provider module. +func (AppModuleBasic) RegisterGRPCGatewayRoutes(cctx client.Context, mux *runtime.ServeMux) { + if err := types.RegisterQueryHandlerClient(context.Background(), mux, types.NewQueryClient(cctx)); err != nil { + panic(err) + } +} + +// GetQueryCmd returns the root query command of this module +func (AppModuleBasic) GetQueryCmd() *cobra.Command { + return nil +} + +// GetTxCmd returns the transaction commands for this module +func (AppModuleBasic) GetTxCmd() *cobra.Command { + return nil +} + +// NewAppModule creates a new AppModule object +func NewAppModule(cdc codec.Codec, k keeper.Keeper) AppModule { + return AppModule{ + AppModuleBasic: AppModuleBasic{cdc: cdc}, + keeper: k, + } +} + +// Name returns the provider module name +func (AppModule) Name() string { + return types.ModuleName +} + +// IsOnePerModuleType implements the depinject.OnePerModuleType interface. +func (am AppModule) IsOnePerModuleType() {} + +// IsAppModule implements the appmodule.AppModule interface. +func (am AppModule) IsAppModule() {} + +// QuerierRoute returns the take module's querier route name. +func (am AppModule) QuerierRoute() string { + return types.ModuleName +} + +// RegisterServices registers the module's services +func (am AppModule) RegisterServices(cfg module.Configurator) { + types.RegisterMsgServer(cfg.MsgServer(), handler.NewMsgServerImpl(am.keeper)) + querier := am.keeper.NewQuerier() + types.RegisterQueryServer(cfg.QueryServer(), querier) +} + +// BeginBlock performs no-op +func (am AppModule) BeginBlock(_ context.Context) error { + return nil +} + +// EndBlock returns the end blocker for the deployment module. It returns no validator +// updates. +func (am AppModule) EndBlock(_ context.Context) error { + return nil +} + +// InitGenesis performs genesis initialization for the take module. It returns +// no validator updates. +func (am AppModule) InitGenesis(ctx sdk.Context, cdc codec.JSONCodec, data json.RawMessage) { + var genesisState types.GenesisState + cdc.MustUnmarshalJSON(data, &genesisState) + InitGenesis(ctx, am.keeper, &genesisState) +} + +// ExportGenesis returns the exported genesis state as raw bytes for the take +// module. +func (am AppModule) ExportGenesis(ctx sdk.Context, cdc codec.JSONCodec) json.RawMessage { + gs := ExportGenesis(ctx, am.keeper) + return cdc.MustMarshalJSON(gs) +} + +// ConsensusVersion implements module.AppModule#ConsensusVersion +func (am AppModule) ConsensusVersion() uint64 { + return 1 +} + +// AppModuleSimulation functions + +// GenerateGenesisState creates a randomized GenState of the staking module. +func (AppModule) GenerateGenesisState(simState *module.SimulationState) { + simulation.RandomizedGenState(simState) +} + +// ProposalMsgs returns msgs used for governance proposals for simulations. +func (AppModule) ProposalMsgs(_ module.SimulationState) []simtypes.WeightedProposalMsg { + return simulation.ProposalMsgs() +} + +// RegisterStoreDecoder registers a decoder for take module's types. +func (am AppModule) RegisterStoreDecoder(_ simtypes.StoreDecoderRegistry) {} + +// WeightedOperations doesn't return any take module operation. +func (am AppModule) WeightedOperations(_ module.SimulationState) []simtypes.WeightedOperation { + return nil +} diff --git a/x/wasm/simulation/decoder.go b/x/wasm/simulation/decoder.go new file mode 100644 index 0000000000..c1be5a2b23 --- /dev/null +++ b/x/wasm/simulation/decoder.go @@ -0,0 +1,17 @@ +package simulation + +// NewDecodeStore returns a decoder function closure that unmarshals the KVPair's +// Value to the corresponding mint type. +// func NewDecodeStore(_ codec.Codec) func(kvA, kvB kv.Pair) string { +// return func(kvA, kvB kv.Pair) string { +// switch { +// case bytes.Equal(kvA.Key, types.MinterKey): +// var minterA, minterB types.Minter +// cdc.MustUnmarshal(kvA.Value, &minterA) +// cdc.MustUnmarshal(kvB.Value, &minterB) +// return fmt.Sprintf("%v\n%v", minterA, minterB) +// default: +// panic(fmt.Sprintf("invalid mint key %X", kvA.Key)) +// } +// } +// } diff --git a/x/wasm/simulation/genesis.go b/x/wasm/simulation/genesis.go new file mode 100644 index 0000000000..aa1e5ee055 --- /dev/null +++ b/x/wasm/simulation/genesis.go @@ -0,0 +1,16 @@ +package simulation + +import ( + "github.com/cosmos/cosmos-sdk/types/module" + + types "pkg.akt.dev/go/node/wasm/v1" +) + +// RandomizedGenState generates a random GenesisState for supply +func RandomizedGenState(simState *module.SimulationState) { + takeGenesis := &types.GenesisState{ + Params: types.DefaultParams(), + } + + simState.GenState[types.ModuleName] = simState.Cdc.MustMarshalJSON(takeGenesis) +} diff --git a/x/wasm/simulation/proposals.go b/x/wasm/simulation/proposals.go new file mode 100644 index 0000000000..43898078ce --- /dev/null +++ b/x/wasm/simulation/proposals.go @@ -0,0 +1,56 @@ +package simulation + +import ( + "math/rand" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/address" + simtypes "github.com/cosmos/cosmos-sdk/types/simulation" + "github.com/cosmos/cosmos-sdk/x/simulation" + + types "pkg.akt.dev/go/node/wasm/v1" +) + +// Simulation operation weights constants +const ( + DefaultWeightMsgUpdateParams int = 100 + + OpWeightMsgUpdateParams = "op_weight_msg_update_params" //nolint:gosec +) + +// ProposalMsgs defines the module weighted proposals' contents +func ProposalMsgs() []simtypes.WeightedProposalMsg { + return []simtypes.WeightedProposalMsg{ + simulation.NewWeightedProposalMsg( + OpWeightMsgUpdateParams, + DefaultWeightMsgUpdateParams, + SimulateMsgUpdateParams, + ), + } +} + +func SimulateMsgUpdateParams(r *rand.Rand, _ sdk.Context, _ []simtypes.Account) sdk.Msg { + // use the default gov module account address as authority + var authority sdk.AccAddress = address.Module("gov") + + params := types.DefaultParams() + + coins := simtypes.RandSubsetCoins(r, sdk.Coins{ + sdk.NewInt64Coin("ibc/12C6A0C374171B595A0A9E18B83FA09D295FB1F2D8C6DAA3AC28683471752D84", int64(simtypes.RandIntBetween(r, 500000, 50000000))), + sdk.NewInt64Coin("ibc/12C6A0C374171B595A0A9E18B83FA09D295FB1F2D8C6DAA3AC28683471752D85", int64(simtypes.RandIntBetween(r, 500000, 50000000))), + sdk.NewInt64Coin("ibc/12C6A0C374171B595A0A9E18B83FA09D295FB1F2D8C6DAA3AC28683471752D86", int64(simtypes.RandIntBetween(r, 500000, 50000000))), + sdk.NewInt64Coin("ibc/12C6A0C374171B595A0A9E18B83FA09D295FB1F2D8C6DAA3AC28683471752D87", int64(simtypes.RandIntBetween(r, 500000, 50000000))), + sdk.NewInt64Coin("ibc/12C6A0C374171B595A0A9E18B83FA09D295FB1F2D8C6DAA3AC28683471752D88", int64(simtypes.RandIntBetween(r, 500000, 50000000))), + sdk.NewInt64Coin("ibc/12C6A0C374171B595A0A9E18B83FA09D295FB1F2D8C6DAA3AC28683471752D89", int64(simtypes.RandIntBetween(r, 500000, 50000000))), + sdk.NewInt64Coin("ibc/12C6A0C374171B595A0A9E18B83FA09D295FB1F2D8C6DAA3AC28683471752D8A", int64(simtypes.RandIntBetween(r, 500000, 50000000))), + sdk.NewInt64Coin("ibc/12C6A0C374171B595A0A9E18B83FA09D295FB1F2D8C6DAA3AC28683471752D8B", int64(simtypes.RandIntBetween(r, 500000, 50000000))), + }) + + // uakt must always be present + coins = append(coins, sdk.NewInt64Coin("uakt", int64(simtypes.RandIntBetween(r, 500000, 50000000)))) + + return &types.MsgUpdateParams{ + Authority: authority.String(), + Params: params, + } +} From a6228c36d4262ca1eadc8b2e7a60f420936e64b0 Mon Sep 17 00:00:00 2001 From: Artur Troian Date: Sun, 9 Nov 2025 10:55:52 -0600 Subject: [PATCH 3/6] feat: refactor build system Signed-off-by: Artur Troian --- .env | 1 + .envrc | 2 +- .goreleaser-docker.yaml | 20 +-- .goreleaser-test-bins.yaml | 36 +++-- .goreleaser.yaml | 40 ++--- Makefile | 54 ++++--- _build/{Dockerfile.akash => akash.Dockerfile} | 2 + _build/{Dockerfile.test => test.Dockerfile} | 0 _run/.env | 7 + _run/.envrc | 11 ++ _run/.envrc_run | 8 + _run/common-base.mk | 29 ++++ _run/common-commands.mk | 47 ++++++ _run/common.mk | 142 ++++++++++++++++++ _run/node/.envrc | 1 + _run/node/.gitignore | 1 + _run/node/Makefile | 5 + app/app.go | 13 +- app/modules.go | 5 +- app/types/app.go | 11 +- cmd/akash/cmd/config.go | 31 ++++ cmd/akash/cmd/root.go | 42 ++---- go.mod | 64 ++++---- go.sum | 134 ++++++++--------- make/init.mk | 11 +- make/releasing.mk | 27 ++-- make/setup-cache.mk | 7 + upgrades/software/v2.0.0/upgrade.go | 6 +- 28 files changed, 516 insertions(+), 241 deletions(-) rename _build/{Dockerfile.akash => akash.Dockerfile} (88%) rename _build/{Dockerfile.test => test.Dockerfile} (100%) create mode 100644 _run/.env create mode 100644 _run/.envrc create mode 100644 _run/.envrc_run create mode 100644 _run/common-base.mk create mode 100644 _run/common-commands.mk create mode 100644 _run/common.mk create mode 120000 _run/node/.envrc create mode 100644 _run/node/.gitignore create mode 100644 _run/node/Makefile create mode 100644 cmd/akash/cmd/config.go diff --git a/.env b/.env index da7aa6deaf..399b76c9eb 100644 --- a/.env +++ b/.env @@ -6,6 +6,7 @@ ROOT_DIR=${AKASH_ROOT} AKASH_DEVCACHE_BASE=${AKASH_ROOT}/.cache AKASH_DEVCACHE=${AKASH_DEVCACHE_BASE} AKASH_DEVCACHE_BIN=${AKASH_DEVCACHE}/bin +AKASH_DEVCACHE_LIB=${AKASH_DEVCACHE}/lib AKASH_DEVCACHE_INCLUDE=${AKASH_DEVCACHE}/include AKASH_DEVCACHE_VERSIONS=${AKASH_DEVCACHE}/versions AKASH_DEVCACHE_NODE_MODULES=${AKASH_DEVCACHE} diff --git a/.envrc b/.envrc index 9ea99da26f..32a57a9a33 100644 --- a/.envrc +++ b/.envrc @@ -99,8 +99,8 @@ export GOTOOLCHAIN export GOTOOLCHAIN_SEMVER export GOWORK -PATH_add "$AKASH_DEVCACHE_NODE_BIN" PATH_add "$AKASH_DEVCACHE_BIN" +PATH_add "$AKASH_DEVCACHE_NODE_BIN" AKASH_DIRENV_SET=1 AKASH=$AKASH_DEVCACHE_BIN/akash diff --git a/.goreleaser-docker.yaml b/.goreleaser-docker.yaml index 224fcf3c8a..158b6bab09 100644 --- a/.goreleaser-docker.yaml +++ b/.goreleaser-docker.yaml @@ -20,10 +20,10 @@ builds: - "-tags={{ .Env.BUILD_TAGS }}" - -trimpath ldflags: - - "{{ .Env.BUILD_VARS }}" - - "{{ .Env.STRIP_FLAGS }}" - - "-linkmode={{ .Env.LINKMODE }}" - - -extldflags "-lc -lrt -lpthread --static" + - "{{ .Env.BUILD_LDFLAGS }}" + - -s -w + - -linkmode=external + - -extldflags "-L./.cache/lib -lwasmvm_muslc.x86_64 -Wl,-z,muldefs -lm -lrt -lc -static" - id: akash-linux-arm64 binary: akash main: ./cmd/akash @@ -39,12 +39,12 @@ builds: - "-tags={{ .Env.BUILD_TAGS }}" - -trimpath ldflags: - - "{{ .Env.BUILD_VARS }}" - - "{{ .Env.STRIP_FLAGS }}" - - "-linkmode={{ .Env.LINKMODE }}" - - -extldflags "-lc -lrt -lpthread --static" + - "{{ .Env.BUILD_LDFLAGS }}" + - -s -w + - -linkmode=external + - -extldflags "-L./.cache/lib -lwasmvm_muslc.aarch64 -Wl,-z,muldefs -lm -lrt -lc -static" dockers: - - dockerfile: _build/Dockerfile.akash + - dockerfile: _build/akash.Dockerfile use: buildx goarch: amd64 goos: linux @@ -59,7 +59,7 @@ dockers: - --label=org.opencontainers.image.revision={{ .FullCommit }} image_templates: - '{{ .Env.DOCKER_IMAGE }}:latest-amd64' - - dockerfile: _build/Dockerfile.akash + - dockerfile: _build/akash.Dockerfile use: buildx goarch: arm64 goos: linux diff --git a/.goreleaser-test-bins.yaml b/.goreleaser-test-bins.yaml index 3f484f6513..c67dde02a1 100644 --- a/.goreleaser-test-bins.yaml +++ b/.goreleaser-test-bins.yaml @@ -16,14 +16,16 @@ builds: env: - CC=o64-clang - CXX=o64-clang++ + - CGO_CFLAGS=-mmacosx-version-min=10.12 + - CGO_LDFLAGS=-L./.cache/lib -mmacosx-version-min=10.12 flags: - "-mod={{ .Env.MOD }}" - - "-tags={{ .Env.BUILD_TAGS }}" + - "-tags={{ .Env.BUILD_TAGS }} static_wasm" - -trimpath ldflags: - - "{{ .Env.BUILD_VARS }}" - - "{{ .Env.STRIP_FLAGS }}" - - "-linkmode={{ .Env.LINKMODE }}" + - "{{ .Env.BUILD_LDFLAGS }}" + - -s -w + - -linkmode=external - id: akash-darwin-arm64 binary: akash main: ./cmd/akash @@ -34,14 +36,16 @@ builds: env: - CC=oa64-clang - CXX=oa64-clang++ + - CGO_CFLAGS=-mmacosx-version-min=10.12 + - CGO_LDFLAGS=-L./.cache/lib -mmacosx-version-min=10.12 flags: - "-mod={{ .Env.MOD }}" - - "-tags={{ .Env.BUILD_TAGS }}" + - "-tags={{ .Env.BUILD_TAGS }} static_wasm" - -trimpath ldflags: - - "{{ .Env.BUILD_VARS }}" - - "{{ .Env.STRIP_FLAGS }}" - - "-linkmode={{ .Env.LINKMODE }}" + - "{{ .Env.BUILD_LDFLAGS }}" + - -s -w + - -linkmode=external - id: akash-linux-amd64 binary: akash main: ./cmd/akash @@ -57,10 +61,10 @@ builds: - "-tags={{ .Env.BUILD_TAGS }}" - -trimpath ldflags: - - "{{ .Env.BUILD_VARS }}" - - "{{ .Env.STRIP_FLAGS }}" - - "-linkmode={{ .Env.LINKMODE }}" - - -extldflags "-lc -lrt -lpthread --static" + - "{{ .Env.BUILD_LDFLAGS }}" + - -s -w + - -linkmode=external + - -extldflags "-L./.cache/lib -lwasmvm_muslc.x86_64 -Wl,-z,muldefs -lm -lrt -lc -static" - id: akash-linux-arm64 binary: akash main: ./cmd/akash @@ -76,10 +80,10 @@ builds: - "-tags={{ .Env.BUILD_TAGS }}" - -trimpath ldflags: - - "{{ .Env.BUILD_VARS }}" - - "{{ .Env.STRIP_FLAGS }}" - - "-linkmode={{ .Env.LINKMODE }}" - - -extldflags "-lc -lrt -lpthread --static" + - "{{ .Env.BUILD_LDFLAGS }}" + - -s -w + - -linkmode=external + - -extldflags "-L./.cache/lib -lwasmvm_muslc.aarch64 -Wl,-z,muldefs -lm -lrt -lc -static" universal_binaries: - id: akash-darwin-universal ids: diff --git a/.goreleaser.yaml b/.goreleaser.yaml index a90e84103e..6692f15101 100644 --- a/.goreleaser.yaml +++ b/.goreleaser.yaml @@ -16,14 +16,16 @@ builds: env: - CC=o64-clang - CXX=o64-clang++ + - CGO_CFLAGS=-mmacosx-version-min=10.12 + - CGO_LDFLAGS=-L./.cache/lib -mmacosx-version-min=10.12 flags: - "-mod={{ .Env.MOD }}" - - "-tags={{ .Env.BUILD_TAGS }}" + - "-tags={{ .Env.BUILD_TAGS }} static_wasm" - -trimpath ldflags: - - "{{ .Env.BUILD_VARS }}" - - "{{ .Env.STRIP_FLAGS }}" - - "-linkmode={{ .Env.LINKMODE }}" + - "{{ .Env.BUILD_LDFLAGS }}" + - -s -w + - -linkmode=external - id: akash-darwin-arm64 binary: akash main: ./cmd/akash @@ -34,14 +36,16 @@ builds: env: - CC=oa64-clang - CXX=oa64-clang++ + - CGO_CFLAGS=-mmacosx-version-min=10.12 + - CGO_LDFLAGS=-L./.cache/lib -mmacosx-version-min=10.12 flags: - "-mod={{ .Env.MOD }}" - - "-tags={{ .Env.BUILD_TAGS }}" + - "-tags={{ .Env.BUILD_TAGS }} static_wasm" - -trimpath ldflags: - - "{{ .Env.BUILD_VARS }}" - - "{{ .Env.STRIP_FLAGS }}" - - "-linkmode={{ .Env.LINKMODE }}" + - "{{ .Env.BUILD_LDFLAGS }}" + - -s -w + - -linkmode=external - id: akash-linux-amd64 binary: akash main: ./cmd/akash @@ -57,10 +61,10 @@ builds: - "-tags={{ .Env.BUILD_TAGS }}" - -trimpath ldflags: - - "{{ .Env.BUILD_VARS }}" - - "{{ .Env.STRIP_FLAGS }}" - - "-linkmode={{ .Env.LINKMODE }}" - - -extldflags "-lc -lrt -lpthread --static" + - "{{ .Env.BUILD_LDFLAGS }}" + - -s -w + - -linkmode=external + - -extldflags "-L./.cache/lib -lwasmvm_muslc.x86_64 -Wl,-z,muldefs -lm -lrt -lc -static" - id: akash-linux-arm64 binary: akash main: ./cmd/akash @@ -76,10 +80,10 @@ builds: - "-tags={{ .Env.BUILD_TAGS }}" - -trimpath ldflags: - - "{{ .Env.BUILD_VARS }}" - - "{{ .Env.STRIP_FLAGS }}" - - "-linkmode={{ .Env.LINKMODE }}" - - -extldflags "-lc -lrt -lpthread --static" + - "{{ .Env.BUILD_LDFLAGS }}" + - -s -w + - -linkmode=external + - -extldflags "-L./.cache/lib -lwasmvm_muslc.aarch64 -Wl,-z,muldefs -lm -lrt -lc -static" universal_binaries: - id: akash-darwin-universal ids: @@ -117,7 +121,7 @@ checksum: name_template: "akash_{{ .Version }}_checksums.txt" dockers: - - dockerfile: _build/Dockerfile.akash + - dockerfile: _build/akash.Dockerfile use: buildx goarch: amd64 goos: linux @@ -134,7 +138,7 @@ dockers: - '{{ .Env.DOCKER_IMAGE }}:{{ .ShortCommit }}-amd64' - '{{ .Env.DOCKER_IMAGE }}:{{ replace .Version "+" "-" }}-amd64' - '{{ .Env.DOCKER_IMAGE }}:{{if eq .Env.STABLE "true"}}stable{{else}}latest{{end}}-amd64' - - dockerfile: _build/Dockerfile.akash + - dockerfile: _build/akash.Dockerfile use: buildx goarch: arm64 goos: linux diff --git a/Makefile b/Makefile index f8a0343741..ebe59d85e0 100644 --- a/Makefile +++ b/Makefile @@ -2,10 +2,6 @@ APP_DIR := ./app GOBIN ?= $(shell go env GOPATH)/bin -KIND_APP_IP ?= $(shell make -sC _run/kube kind-k8s-ip) -KIND_APP_PORT ?= $(shell make -sC _run/kube app-http-port) -KIND_VARS ?= KUBE_INGRESS_IP="$(KIND_APP_IP)" KUBE_INGRESS_PORT="$(KIND_APP_PORT)" - include make/init.mk .DEFAULT_GOAL := bins @@ -22,46 +18,56 @@ GIT_HEAD_ABBREV := $(shell git rev-parse --abbrev-ref HEAD) IS_PREREL := $(shell $(ROOT_DIR)/script/is_prerelease.sh "$(RELEASE_TAG)" && echo "true" || echo "false") IS_MAINNET := $(shell $(ROOT_DIR)/script/mainnet-from-tag.sh "$(RELEASE_TAG)" && echo "true" || echo "false") -IS_STABLE ?= false -GO_LINKMODE ?= external GOMOD ?= readonly -BUILD_TAGS ?= osusergo,netgo,ledger +BUILD_OPTIONS ?= static-link +BUILD_TAGS := osusergo netgo ledger muslc gcc +DB_BACKEND := goleveldb +BUILD_FLAGS := + GORELEASER_STRIP_FLAGS ?= -ifeq ($(IS_MAINNET), true) - ifeq ($(IS_PREREL), false) - IS_STABLE := true - endif +ifeq (cleveldb,$(findstring cleveldb,$(BUILD_OPTIONS))) + DB_BACKEND=cleveldb +else ifeq (rocksdb,$(findstring rocksdb,$(BUILD_OPTIONS))) + DB_BACKEND=rocksdb +else ifeq (goleveldb,$(findstring goleveldb,$(BUILD_OPTIONS))) + DB_BACKEND=goleveldb endif ifneq (,$(findstring cgotrace,$(BUILD_OPTIONS))) - BUILD_TAGS := $(BUILD_TAGS),cgotrace + BUILD_TAGS += cgotrace endif -GORELEASER_BUILD_VARS := \ --X github.com/cosmos/cosmos-sdk/version.Name=akash \ --X github.com/cosmos/cosmos-sdk/version.AppName=akash \ --X github.com/cosmos/cosmos-sdk/version.BuildTags=\"$(BUILD_TAGS)\" \ --X github.com/cosmos/cosmos-sdk/version.Version=$(RELEASE_TAG) \ --X github.com/cosmos/cosmos-sdk/version.Commit=$(GIT_HEAD_COMMIT_LONG) +build_tags := $(strip $(BUILD_TAGS)) +build_tags_cs := $(subst $(WHITESPACE),$(COMMA),$(build_tags)) -ldflags = -linkmode=$(GO_LINKMODE) -X github.com/cosmos/cosmos-sdk/version.Name=akash \ +ldflags := -X github.com/cosmos/cosmos-sdk/version.Name=akash \ -X github.com/cosmos/cosmos-sdk/version.AppName=akash \ --X github.com/cosmos/cosmos-sdk/version.BuildTags="$(BUILD_TAGS)" \ +-X github.com/cosmos/cosmos-sdk/version.BuildTags="$(build_tags_cs)" \ -X github.com/cosmos/cosmos-sdk/version.Version=$(shell git describe --tags | sed 's/^v//') \ --X github.com/cosmos/cosmos-sdk/version.Commit=$(GIT_HEAD_COMMIT_LONG) +-X github.com/cosmos/cosmos-sdk/version.Commit=$(GIT_HEAD_COMMIT_LONG) \ +-X github.com/cosmos/cosmos-sdk/types.DBBackend=$(DB_BACKEND) + +GORELEASER_LDFLAGS := $(ldflags) + +ifeq (,$(findstring static-link,$(BUILD_OPTIONS))) + ldflags += -linkmode=external -extldflags "-Wl,-z,muldefs -static" +endif # check for nostrip option ifeq (,$(findstring nostrip,$(BUILD_OPTIONS))) - ldflags += -s -w - GORELEASER_STRIP_FLAGS += -s -w + ldflags += -s -w + BUILD_FLAGS += -trimpath endif ldflags += $(LDFLAGS) ldflags := $(strip $(ldflags)) -BUILD_FLAGS := -mod=$(GOMOD) -tags='$(BUILD_TAGS)' -ldflags '$(ldflags)' +GORELEASER_TAGS := $(BUILD_TAGS) +GORELEASER_FLAGS := $(BUILD_FLAGS) -mod=$(GOMOD) -tags='$(build_tags)' + +BUILD_FLAGS += -mod=$(GOMOD) -tags='$(build_tags_cs)' -ldflags '$(ldflags)' .PHONY: all all: build bins diff --git a/_build/Dockerfile.akash b/_build/akash.Dockerfile similarity index 88% rename from _build/Dockerfile.akash rename to _build/akash.Dockerfile index 4377484a05..b31b006a57 100644 --- a/_build/Dockerfile.akash +++ b/_build/akash.Dockerfile @@ -1,6 +1,8 @@ FROM debian:bullseye LABEL "org.opencontainers.image.source"="https://github.com/akash-network/node" +ARG WASMVM_VERSION + COPY ./akash /bin/ EXPOSE 26656 26657 26658 diff --git a/_build/Dockerfile.test b/_build/test.Dockerfile similarity index 100% rename from _build/Dockerfile.test rename to _build/test.Dockerfile diff --git a/_run/.env b/_run/.env new file mode 100644 index 0000000000..2ce77d5898 --- /dev/null +++ b/_run/.env @@ -0,0 +1,7 @@ +AKASH_KEYRING_BACKEND=test +AKASH_GAS_ADJUSTMENT=2 +AKASH_CHAIN_ID=local +AKASH_YES=true +AKASH_GAS_PRICES=0.025uakt +AKASH_GAS=auto +AKASH_NODE=http://localhost:26657 diff --git a/_run/.envrc b/_run/.envrc new file mode 100644 index 0000000000..5d87c0e683 --- /dev/null +++ b/_run/.envrc @@ -0,0 +1,11 @@ +source_up .envrc + +if ! has grpcurl ; then + echo -e "\033[31mgrpcurl is not installed"; exit 1 +fi + +if ! has tqdm ; then + echo -e "\033[31mtqdm is not installed. https://github.com/tqdm/tqdm"; exit 1 +fi + +dotenv .env diff --git a/_run/.envrc_run b/_run/.envrc_run new file mode 100644 index 0000000000..3c3ace4a66 --- /dev/null +++ b/_run/.envrc_run @@ -0,0 +1,8 @@ +source_up .envrc + +AKASH_RUN_NAME=$(basename "$(pwd)") +AKASH_RUN_DIR="${AKASH_RUN}/${AKASH_RUN_NAME}" + +export AKASH_HOME="${AKASH_RUN_DIR}/.akash" +export AKASH_RUN_NAME +export AKASH_RUN_DIR diff --git a/_run/common-base.mk b/_run/common-base.mk new file mode 100644 index 0000000000..521103c216 --- /dev/null +++ b/_run/common-base.mk @@ -0,0 +1,29 @@ +include $(abspath $(CURDIR)/../../make/init.mk) + +ifeq ($(AKASH_RUN_NAME),) +$(error "AKASH_RUN_NAME is not set") +endif + +ifeq ($(AKASH_RUN_DIR),) +$(error "AKASH_RUN_DIR is not set") +endif + +ifneq ($(AKASH_HOME),) +ifneq ($(DIRENV_FILE),$(CURDIR)/.envrc) +$(error "AKASH_HOME is set by the upper dir (probably in ~/.bashrc|~/.zshrc), \ +but direnv does not seem to be configured. \ +Ensure direnv is installed and hooked to your shell profile. Refer to the documentation for details. \ +") +endif +else +$(error "AKASH_HOME is not set") +endif + +.PHONY: akash +akash: +ifneq ($(SKIP_BUILD), true) + make -C $(AKASH_ROOT) akash +endif + +.PHONY: bins +bins: akash diff --git a/_run/common-commands.mk b/_run/common-commands.mk new file mode 100644 index 0000000000..24a58f23fa --- /dev/null +++ b/_run/common-commands.mk @@ -0,0 +1,47 @@ +KEY_NAME ?= main + +.PHONY: multisig-send +multisig-send: + $(AKASH) tx send \ + "$(shell $(AKASH) $(KEY_OPTS) keys show "$(MULTISIG_KEY)" -a)" \ + "$(shell $(AKASH) $(KEY_OPTS) keys show "$(KEY_NAME)" -a)" \ + 1000000uakt \ + --generate-only \ + > "$(AKASH_HOME)/multisig-tx.json" + $(AKASH) tx sign \ + "$(AKASH_HOME)/multisig-tx.json" \ + --multisig "$(shell $(AKASH) $(KEY_OPTS) keys show "$(MULTISIG_KEY)" -a)" \ + --from "main" \ + > "$(AKASH_HOME)/multisig-sig-main.json" + $(AKASH) tx sign \ + "$(AKASH_HOME)/multisig-tx.json" \ + --multisig "$(shell $(AKASH) $(KEY_OPTS) keys show "$(MULTISIG_KEY)" -a)" \ + --from "other" \ + > "$(AKASH_HOME)/multisig-sig-other.json" + $(AKASH) tx multisign \ + "$(AKASH_HOME)/multisig-tx.json" \ + "$(MULTISIG_KEY)" \ + "$(AKASH_HOME)/multisig-sig-main.json" \ + "$(AKASH_HOME)/multisig-sig-other.json" \ + > "$(AKASH_HOME)/multisig-final.json" + $(AKASH) "$(CHAIN_OPTS)" tx broadcast "$(AKASH_HOME)/multisig-final.json" + +.PHONY: akash-node-ready +akash-node-ready: SHELL=$(BASH_PATH) +akash-node-ready: + @( \ + max_retry=15; \ + counter=0; \ + while [[ counter -lt max_retry ]]; do \ + read block < <(curl -s $(AKASH_NODE)/status | jq -r '.result.sync_info.latest_block_height' 2> /dev/null); \ + if [[ $$? -ne 0 || $$block -lt 1 ]]; then \ + echo "unable to get node status. sleep for 1s"; \ + ((counter++)); \ + sleep 1; \ + else \ + echo "latest block height: $${block}"; \ + exit 0; \ + fi \ + done; \ + exit 1 \ + ) diff --git a/_run/common.mk b/_run/common.mk new file mode 100644 index 0000000000..e7fccf72a5 --- /dev/null +++ b/_run/common.mk @@ -0,0 +1,142 @@ +OPTIONS ?= + +SKIP_BUILD := false + +# check for nostrip option +ifneq (,$(findstring nobuild,$(OPTIONS))) + SKIP_BUILD := true +endif + +include ../common-base.mk + +# https://stackoverflow.com/a/7531247 +# https://www.gnu.org/software/make/manual/make.html#Flavors +null := +space := $(null) # +comma := , + +export AKASH_KEYRING_BACKEND = test +export AKASH_GAS_ADJUSTMENT = 2 +export AKASH_CHAIN_ID = local +export AKASH_YES = true +export AKASH_GAS_PRICES = 0.025uakt +export AKASH_GAS = auto +export AKASH_NODE = http://localhost:26657 + +AKASH_INIT := $(AKASH_RUN_DIR)/.akash-init + +KEY_OPTS := --keyring-backend=$(AKASH_KEYRING_BACKEND) +GENESIS_PATH := $(AKASH_HOME)/config/genesis.json + +CHAIN_MIN_DEPOSIT := 10000000000000 +CHAIN_ACCOUNT_DEPOSIT := $(shell echo $$(($(CHAIN_MIN_DEPOSIT) * 10))) +CHAIN_VALIDATOR_DELEGATE := $(shell echo $$(($(CHAIN_MIN_DEPOSIT) / 2))) +CHAIN_TOKEN_DENOM := uakt + +KEY_NAMES := main provider validator other + +MULTISIG_KEY := msig +MULTISIG_SIGNERS := main other + +GENESIS_ACCOUNTS := $(KEY_NAMES) $(MULTISIG_KEY) + +CLIENT_CERTS := main validator other +SERVER_CERTS := provider + +.PHONY: init +init: bins akash-init + +$(AP_RUN_DIR): + mkdir -p $@ + +$(AKASH_HOME): + mkdir -p $@ + +$(AKASH_INIT): $(AKASH_HOME) client-init node-init + touch $@ + +.INTERMEDIATE: akash-init +akash-init: $(AKASH_INIT) + +.INTERMEDIATE: client-init +client-init: client-init-keys + +.INTERMEDIATE: client-init-keys +client-init-keys: $(patsubst %,client-init-key-%,$(KEY_NAMES)) client-init-key-multisig + +.INTERMEDIATE: $(patsubst %,client-init-key-%,$(KEY_NAMES)) +client-init-key-%: + $(AKASH) keys add "$(@:client-init-key-%=%)" + +.INTERMEDIATE: client-init-key-multisig +client-init-key-multisig: + $(AKASH) keys add \ + "$(MULTISIG_KEY)" \ + --multisig "$(subst $(space),$(comma),$(strip $(MULTISIG_SIGNERS)))" \ + --multisig-threshold 2 + +.INTERMEDIATE: node-init +node-init: node-init-genesis node-init-genesis-accounts node-init-genesis-certs node-init-gentx node-init-finalize + +.INTERMEDIATE: node-init-genesis +node-init-genesis: + $(AKASH) genesis init node0 + cp "$(GENESIS_PATH)" "$(GENESIS_PATH).orig" + cat "$(GENESIS_PATH).orig" | \ + jq -M '.app_state.gov.voting_params.voting_period = "30s"' | \ + jq -rM '(..|objects|select(has("denom"))).denom |= "$(CHAIN_TOKEN_DENOM)"' | \ + jq -rM '(..|objects|select(has("bond_denom"))).bond_denom |= "$(CHAIN_TOKEN_DENOM)"' | \ + jq -rM '(..|objects|select(has("mint_denom"))).mint_denom |= "$(CHAIN_TOKEN_DENOM)"' > \ + "$(GENESIS_PATH)" + +.INTERMEDIATE: node-init-genesis-certs +node-init-genesis-certs: $(patsubst %,node-init-genesis-client-cert-%,$(CLIENT_CERTS)) $(patsubst %,node-init-genesis-server-cert-%,$(SERVER_CERTS)) + +.INTERMEDIATE: $(patsubst %,node-init-genesis-client-cert-%,$(CLIENT_CERTS)) +node-init-genesis-client-cert-%: + $(AKASH) tx cert generate client --from=$* + $(AKASH) tx cert publish client --to-genesis=true --from=$* + +.INTERMEDIATE: $(patsubst %,node-init-genesis-server-cert-%,$(SERVER_CERTS)) +node-init-genesis-server-cert-%: + $(AKASH) tx cert generate server localhost akash-provider.localhost --from=$* + $(AKASH) tx cert publish server --to-genesis=true --from=$* + +.INTERMEDIATE: node-init-genesis-accounts +node-init-genesis-accounts: $(patsubst %,node-init-genesis-account-%,$(GENESIS_ACCOUNTS)) + $(AKASH) genesis validate + +.INTERMEDIATE: $(patsubst %,node-init-genesis-account-%,$(GENESIS_ACCOUNTS)) +node-init-genesis-account-%: + $(AKASH) genesis add-account \ + "$(shell $(AKASH) $(KEY_OPTS) keys show "$(@:node-init-genesis-account-%=%)" -a)" \ + "$(CHAIN_MIN_DEPOSIT)$(CHAIN_TOKEN_DENOM)" + +.INTERMEDIATE: node-init-gentx +node-init-gentx: + $(AKASH) genesis gentx validator "$(CHAIN_VALIDATOR_DELEGATE)$(CHAIN_TOKEN_DENOM)" --min-self-delegation=1 --gas=auto --gas-prices=0.025uakt + +.INTERMEDIATE: node-init-finalize +node-init-finalize: + $(AKASH) genesis collect + $(AKASH) genesis validate + +.PHONY: node-run +node-run: + $(AKASH) start --minimum-gas-prices=$(AKASH_GAS_PRICES) + +.PHONY: node-status +node-status: + $(AKASH) status + +.PHONY: rest-server-run +rest-server-run: + $(AKASH) rest-server + +.PHONY: clean +clean: clean-$(AKASH_RUN_NAME) + rm -rf "$(AKASH_RUN)/$(AKASH_RUN_NAME)" + +.PHONY: rosetta-run +rosetta-run: + $(AKASH) rosetta --addr localhost:8080 --grpc localhost:9090 --network=$(AKASH_CHAIN_ID) --blockchain=akash diff --git a/_run/node/.envrc b/_run/node/.envrc new file mode 120000 index 0000000000..a4526206d7 --- /dev/null +++ b/_run/node/.envrc @@ -0,0 +1 @@ +../.envrc_run \ No newline at end of file diff --git a/_run/node/.gitignore b/_run/node/.gitignore new file mode 100644 index 0000000000..e934adfd1b --- /dev/null +++ b/_run/node/.gitignore @@ -0,0 +1 @@ +cache/ diff --git a/_run/node/Makefile b/_run/node/Makefile new file mode 100644 index 0000000000..bce7e8a5a7 --- /dev/null +++ b/_run/node/Makefile @@ -0,0 +1,5 @@ +include ../common.mk +include ../common-commands.mk + +.PHONY: clean-node +clean-node: diff --git a/app/app.go b/app/app.go index d0a754bf79..6eeef21582 100644 --- a/app/app.go +++ b/app/app.go @@ -9,13 +9,9 @@ import ( "reflect" "time" - wasmkeeper "github.com/CosmWasm/wasmd/x/wasm/keeper" - wasmtypes "github.com/CosmWasm/wasmd/x/wasm/types" "github.com/gorilla/mux" "github.com/rakyll/statik/fs" "github.com/spf13/cast" - emodule "pkg.akt.dev/go/node/escrow/module" - "pkg.akt.dev/go/sdkutil" abci "github.com/cometbft/cometbft/abci/types" tmjson "github.com/cometbft/cometbft/libs/json" @@ -31,6 +27,8 @@ import ( "cosmossdk.io/x/feegrant" upgradetypes "cosmossdk.io/x/upgrade/types" "github.com/CosmWasm/wasmd/x/wasm" + wasmkeeper "github.com/CosmWasm/wasmd/x/wasm/keeper" + wasmtypes "github.com/CosmWasm/wasmd/x/wasm/types" dbm "github.com/cosmos/cosmos-db" "github.com/cosmos/cosmos-sdk/baseapp" "github.com/cosmos/cosmos-sdk/client" @@ -68,9 +66,11 @@ import ( audittypes "pkg.akt.dev/go/node/audit/v1" certtypes "pkg.akt.dev/go/node/cert/v1" deploymenttypes "pkg.akt.dev/go/node/deployment/v1" + emodule "pkg.akt.dev/go/node/escrow/module" markettypes "pkg.akt.dev/go/node/market/v1" providertypes "pkg.akt.dev/go/node/provider/v1beta4" taketypes "pkg.akt.dev/go/node/take/v1" + "pkg.akt.dev/go/sdkutil" apptypes "pkg.akt.dev/node/v2/app/types" utypes "pkg.akt.dev/node/v2/upgrades/types" @@ -158,11 +158,6 @@ func NewApp( } wasmDir := filepath.Join(homePath, "wasm") - //ibcWasmConfig := ibcwasmtypes.WasmConfig{ - // DataDir: filepath.Join(homePath, "ibc_08-wasm"), - // SupportedCapabilities: []string{"iterator", "stargate", "abort"}, - // ContractDebugMode: false, - //} wasmConfig, err := wasm.ReadNodeConfig(appOpts) if err != nil { panic(fmt.Sprintf("error while reading wasm config: %s", err)) diff --git a/app/modules.go b/app/modules.go index 7b2b7302a4..c2f958d31c 100644 --- a/app/modules.go +++ b/app/modules.go @@ -199,7 +199,7 @@ func appModules( ), wasm.NewAppModule( app.cdc, - app.Keepers.External.Wasm, + app.Keepers.Cosmos.Wasm, app.Keepers.Cosmos.Staking, app.Keepers.Cosmos.Acct, app.Keepers.Cosmos.Bank, @@ -302,7 +302,6 @@ func appSimModules( app.cdc, app.Keepers.Akash.Take, ), - deployment.NewAppModule( app.cdc, app.Keepers.Akash.Deployment, @@ -345,7 +344,7 @@ func appSimModules( wasm.NewAppModule( app.cdc, - app.Keepers.External.Wasm, + app.Keepers.Cosmos.Wasm, app.Keepers.Cosmos.Staking, app.Keepers.Cosmos.Acct, app.Keepers.Cosmos.Bank, diff --git a/app/types/app.go b/app/types/app.go index 5d06327041..eead358555 100644 --- a/app/types/app.go +++ b/app/types/app.go @@ -117,6 +117,7 @@ type AppKeepers struct { Transfer ibctransferkeeper.Keeper ICAController icacontrollerkeeper.Keeper ICAHost icahostkeeper.Keeper + Wasm *wasmkeeper.Keeper } Akash struct { @@ -130,10 +131,6 @@ type AppKeepers struct { Wasm wkeeper.Keeper } - External struct { - Wasm *wasmkeeper.Keeper - } - Modules struct { TMLight ibctm.LightClientModule } @@ -498,10 +495,10 @@ func (app *App) InitNormalKeepers( authtypes.NewModuleAddress(govtypes.ModuleName).String(), wOpts..., ) - app.Keepers.External.Wasm = &wasmKeeper + app.Keepers.Cosmos.Wasm = &wasmKeeper // Create fee enabled wasm ibc Stack - wasmStackIBCHandler := wasm.NewIBCHandler(app.Keepers.External.Wasm, app.Keepers.Cosmos.IBC.ChannelKeeper, app.Keepers.Cosmos.Transfer, app.Keepers.Cosmos.IBC.ChannelKeeper) + wasmStackIBCHandler := wasm.NewIBCHandler(app.Keepers.Cosmos.Wasm, app.Keepers.Cosmos.IBC.ChannelKeeper, app.Keepers.Cosmos.Transfer, app.Keepers.Cosmos.IBC.ChannelKeeper) // Create Interchain Accounts Stack // SendPacket, since it is originating from the application to core IBC: @@ -530,7 +527,7 @@ func (app *App) InitNormalKeepers( ibcRouterV2 := ibcapi.NewRouter() ibcRouterV2 = ibcRouterV2. AddRoute(ibctransfertypes.PortID, transferv2.NewIBCModule(app.Keepers.Cosmos.Transfer)). - AddPrefixRoute(wasmkeeper.PortIDPrefixV2, wasmkeeper.NewIBC2Handler(app.Keepers.External.Wasm)) + AddPrefixRoute(wasmkeeper.PortIDPrefixV2, wasmkeeper.NewIBC2Handler(app.Keepers.Cosmos.Wasm)) app.Keepers.Cosmos.IBC.SetRouterV2(ibcRouterV2) } diff --git a/cmd/akash/cmd/config.go b/cmd/akash/cmd/config.go new file mode 100644 index 0000000000..bf50660bfc --- /dev/null +++ b/cmd/akash/cmd/config.go @@ -0,0 +1,31 @@ +package cmd + +import ( + wasmtypes "github.com/CosmWasm/wasmd/x/wasm/types" + serverconfig "github.com/cosmos/cosmos-sdk/server/config" +) + +type AppConfig struct { + serverconfig.Config + + WasmConfig wasmtypes.NodeConfig `mapstructure:"wasm"` +} + +var AppTemplate = serverconfig.DefaultConfigTemplate + ` +############################################################################### +### Wasm Configuration ### +############################################################################### +` + wasmtypes.DefaultConfigTemplate() + +func InitAppConfig() (string, interface{}) { + appCfg := AppConfig{ + Config: *serverconfig.DefaultConfig(), + WasmConfig: wasmtypes.DefaultNodeConfig(), + } + + appCfg.MinGasPrices = "0.0025uakt" + appCfg.API.Enable = true + appCfg.API.Address = "tcp://localhost:1317" + + return AppTemplate, appCfg +} diff --git a/cmd/akash/cmd/root.go b/cmd/akash/cmd/root.go index 84c8a665f2..a6991800f0 100644 --- a/cmd/akash/cmd/root.go +++ b/cmd/akash/cmd/root.go @@ -3,14 +3,12 @@ package cmd import ( "context" + "github.com/CosmWasm/wasmd/x/wasm" "github.com/cosmos/cosmos-sdk/x/crisis" - "github.com/rs/zerolog" "github.com/spf13/cobra" - cmtcfg "github.com/cometbft/cometbft/config" cmtcli "github.com/cometbft/cometbft/libs/cli" - sdkclient "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/debug" "github.com/cosmos/cosmos-sdk/client/pruning" "github.com/cosmos/cosmos-sdk/client/snapshot" @@ -19,7 +17,6 @@ import ( rosettaCmd "github.com/cosmos/rosetta/cmd" "pkg.akt.dev/go/cli" - cflags "pkg.akt.dev/go/cli/flags" "pkg.akt.dev/go/sdkutil" "pkg.akt.dev/node/v2/app" @@ -33,11 +30,15 @@ func NewRootCmd() (*cobra.Command, sdkutil.EncodingConfig) { app.ModuleBasics().RegisterInterfaces(encodingConfig.InterfaceRegistry) rootCmd := &cobra.Command{ - Use: "akash", - Short: "Akash Blockchain Application", - Long: "Akash CLI Utility.\n\nAkash is a peer-to-peer marketplace for computing resources and \na deployment platform for heavily distributed applications. \nFind out more at https://akash.network", + Use: "akash", + Short: "Akash Blockchain Application", + Long: `Akash CLI Utility. + +Akash is a peer-to-peer marketplace for computing resources and +a deployment platform for heavily distributed applications. +Find out more at https://akash.network`, SilenceUsage: true, - PersistentPreRunE: cli.GetPersistentPreRunE(encodingConfig, []string{"AKASH"}, cli.DefaultHome), + PersistentPreRunE: cli.GetPersistentPreRunE(encodingConfig, []string{"AKASH"}, cli.DefaultHome, cli.WithPreRunAppConfig(InitAppConfig())), } initRootCmd(rootCmd, encodingConfig) @@ -54,29 +55,7 @@ func Execute(rootCmd *cobra.Command, envPrefix string) error { // getting and setting the client.Context. Ideally, we utilize // https://github.com/spf13/cobra/pull/1118. - return ExecuteWithCtx(context.Background(), rootCmd, envPrefix) -} - -// ExecuteWithCtx executes the root command. -func ExecuteWithCtx(ctx context.Context, rootCmd *cobra.Command, envPrefix string) error { - // Create and set a client.Context on the command's Context. During the pre-run - // of the root command, a default initialized client.Context is provided to - // seed child command execution with values such as AccountRetriver, Keyring, - // and a Tendermint RPC. This requires the use of a pointer reference when - // getting and setting the client.Context. Ideally, we utilize - // https://github.com/spf13/cobra/pull/1118. - srvCtx := sdkserver.NewDefaultContext() - - ctx = context.WithValue(ctx, sdkclient.ClientContextKey, &sdkclient.Context{}) - ctx = context.WithValue(ctx, sdkserver.ServerContextKey, srvCtx) - - rootCmd.PersistentFlags().String(cflags.FlagLogLevel, zerolog.InfoLevel.String(), "The logging level (trace|debug|info|warn|error|fatal|panic)") - rootCmd.PersistentFlags().String(cflags.FlagLogFormat, cmtcfg.LogFormatPlain, "The logging format (json|plain)") - rootCmd.PersistentFlags().Bool(cflags.FlagLogColor, false, "Pretty logging output. Applied only when log_format=plain") - rootCmd.PersistentFlags().String(cflags.FlagLogTimestamp, "", "Add timestamp prefix to the logs (rfc3339|rfc3339nano|kitchen)") - - executor := cmtcli.PrepareBaseCmd(rootCmd, envPrefix, app.DefaultHome) - return executor.ExecuteContext(ctx) + return cli.ExecuteWithCtx(context.Background(), rootCmd, envPrefix) } func initRootCmd(rootCmd *cobra.Command, encodingConfig sdkutil.EncodingConfig) { @@ -113,6 +92,7 @@ func initRootCmd(rootCmd *cobra.Command, encodingConfig sdkutil.EncodingConfig) func addModuleInitFlags(startCmd *cobra.Command) { crisis.AddModuleInitFlags(startCmd) //nolint: staticcheck + wasm.AddModuleInitFlags(startCmd) } // genesisCommand builds genesis-related `simd genesis` command. Users may provide application specific commands as a parameter diff --git a/go.mod b/go.mod index a400b19018..00e2713afe 100644 --- a/go.mod +++ b/go.mod @@ -14,14 +14,14 @@ require ( cosmossdk.io/x/evidence v0.2.0 cosmossdk.io/x/feegrant v0.2.0 cosmossdk.io/x/upgrade v0.2.0 - github.com/CosmWasm/wasmd v0.61.4 + github.com/CosmWasm/wasmd v0.61.6 github.com/CosmWasm/wasmvm/v3 v3.0.2 github.com/boz/go-lifecycle v0.1.1 github.com/cometbft/cometbft v0.38.17 github.com/cosmos/cosmos-db v1.1.3 github.com/cosmos/cosmos-sdk v0.53.4 github.com/cosmos/gogoproto v1.7.0 - github.com/cosmos/ibc-go/v10 v10.3.0 + github.com/cosmos/ibc-go/v10 v10.4.0 github.com/cosmos/rosetta v0.50.12 github.com/golang-jwt/jwt/v5 v5.2.3 github.com/google/go-github/v62 v62.0.0 @@ -31,24 +31,24 @@ require ( github.com/grpc-ecosystem/grpc-gateway v1.16.0 github.com/ianlancetaylor/cgosymbolizer v0.0.0-20250410214317-b8ecc8b6bbe6 github.com/pkg/errors v0.9.1 - github.com/prometheus/client_golang v1.23.0 + github.com/prometheus/client_golang v1.23.2 github.com/rakyll/statik v0.1.7 github.com/regen-network/cosmos-proto v0.3.1 github.com/rs/zerolog v1.34.0 - github.com/spf13/cast v1.9.2 - github.com/spf13/cobra v1.9.1 - github.com/spf13/pflag v1.0.7 - github.com/spf13/viper v1.20.1 - github.com/stretchr/testify v1.11.0 + github.com/spf13/cast v1.10.0 + github.com/spf13/cobra v1.10.1 + github.com/spf13/pflag v1.0.10 + github.com/spf13/viper v1.21.0 + github.com/stretchr/testify v1.11.1 go.step.sm/crypto v0.45.1 - golang.org/x/mod v0.25.0 + golang.org/x/mod v0.26.0 golang.org/x/oauth2 v0.30.0 - golang.org/x/sync v0.16.0 - google.golang.org/grpc v1.74.2 + golang.org/x/sync v0.17.0 + google.golang.org/grpc v1.75.0 gopkg.in/yaml.v3 v3.0.1 gotest.tools/v3 v3.5.2 - pkg.akt.dev/go v0.1.6-rc0 - pkg.akt.dev/go/cli v0.1.4 + pkg.akt.dev/go v0.1.6-rc1 + pkg.akt.dev/go/cli v0.1.5-rc1 pkg.akt.dev/go/sdl v0.1.1 ) @@ -94,7 +94,7 @@ require ( github.com/99designs/keyring v1.2.2 // indirect github.com/DataDog/datadog-go v4.8.3+incompatible // indirect github.com/DataDog/zstd v1.5.7 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.27.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.29.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.50.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.50.0 // indirect github.com/Microsoft/go-winio v0.6.2 // indirect @@ -127,7 +127,7 @@ require ( github.com/cosmos/cosmos-proto v1.0.0-beta.5 // indirect github.com/cosmos/go-bip39 v1.0.0 // indirect github.com/cosmos/gogogateway v1.2.0 // indirect - github.com/cosmos/iavl v1.2.4 // indirect + github.com/cosmos/iavl v1.2.6 // indirect github.com/cosmos/ics23/go v0.11.0 // indirect github.com/cosmos/ledger-cosmos-go v0.14.0 // indirect github.com/cosmos/rosetta-sdk-go v0.10.0 // indirect @@ -152,7 +152,7 @@ require ( github.com/fxamacker/cbor/v2 v2.7.0 // indirect github.com/getsentry/sentry-go v0.33.0 // indirect github.com/go-errors/errors v1.5.1 // indirect - github.com/go-jose/go-jose/v4 v4.0.5 // indirect + github.com/go-jose/go-jose/v4 v4.1.1 // indirect github.com/go-kit/kit v0.13.0 // indirect github.com/go-kit/log v0.2.1 // indirect github.com/go-logfmt/logfmt v0.6.0 // indirect @@ -223,17 +223,17 @@ require ( github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/prometheus/client_model v0.6.2 // indirect - github.com/prometheus/common v0.65.0 // indirect + github.com/prometheus/common v0.66.1 // indirect github.com/prometheus/procfs v0.16.1 // indirect github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect github.com/rogpeppe/go-internal v1.14.1 // indirect github.com/rs/cors v1.11.1 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect - github.com/sagikazarmark/locafero v0.7.0 // indirect + github.com/sagikazarmark/locafero v0.11.0 // indirect github.com/sasha-s/go-deadlock v0.3.5 // indirect github.com/shamaton/msgpack/v2 v2.2.3 // indirect - github.com/sourcegraph/conc v0.3.0 // indirect - github.com/spf13/afero v1.12.0 // indirect + github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8 // indirect + github.com/spf13/afero v1.15.0 // indirect github.com/spiffe/go-spiffe/v2 v2.5.0 // indirect github.com/stretchr/objx v0.5.2 // indirect github.com/subosito/gotenv v1.6.0 // indirect @@ -254,27 +254,27 @@ require ( go.opentelemetry.io/contrib/detectors/gcp v1.36.0 // indirect go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0 // indirect - go.opentelemetry.io/otel v1.36.0 // indirect - go.opentelemetry.io/otel/metric v1.36.0 // indirect - go.opentelemetry.io/otel/sdk v1.36.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.36.0 // indirect - go.opentelemetry.io/otel/trace v1.36.0 // indirect + go.opentelemetry.io/otel v1.37.0 // indirect + go.opentelemetry.io/otel/metric v1.37.0 // indirect + go.opentelemetry.io/otel/sdk v1.37.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.37.0 // indirect + go.opentelemetry.io/otel/trace v1.37.0 // indirect go.uber.org/mock v0.5.2 // indirect - go.uber.org/multierr v1.11.0 // indirect go.yaml.in/yaml/v2 v2.4.2 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect golang.org/x/arch v0.17.0 // indirect - golang.org/x/crypto v0.40.0 // indirect + golang.org/x/crypto v0.41.0 // indirect golang.org/x/exp v0.0.0-20250305212735-054e65f0b394 // indirect - golang.org/x/net v0.42.0 // indirect - golang.org/x/sys v0.34.0 // indirect - golang.org/x/term v0.33.0 // indirect - golang.org/x/text v0.27.0 // indirect + golang.org/x/net v0.43.0 // indirect + golang.org/x/sys v0.35.0 // indirect + golang.org/x/term v0.34.0 // indirect + golang.org/x/text v0.28.0 // indirect golang.org/x/time v0.11.0 // indirect google.golang.org/api v0.229.0 // indirect google.golang.org/genproto v0.0.0-20250728155136-f173205681a0 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20250728155136-f173205681a0 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20250728155136-f173205681a0 // indirect - google.golang.org/protobuf v1.36.6 // indirect + google.golang.org/protobuf v1.36.8 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect k8s.io/api v0.33.3 // indirect diff --git a/go.sum b/go.sum index cd4cc1db93..0fa7b39d04 100644 --- a/go.sum +++ b/go.sum @@ -1244,8 +1244,8 @@ github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4/go.mod h1:hN github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/CosmWasm/wasmd v0.61.4 h1:4NzvRyZ49+3t21BGeWP7FUZliC4+pNZSmezJDWrQ83s= -github.com/CosmWasm/wasmd v0.61.4/go.mod h1:nRS0sxWUXeeFBAw5Jo7FXU4YwnkaqdLUq38HrDjjWn0= +github.com/CosmWasm/wasmd v0.61.6 h1:wa1rY/mZi8OYnf0f6a02N7o3vBockOfL3P37hSH0XtY= +github.com/CosmWasm/wasmd v0.61.6/go.mod h1:Wg2gfY2qrjjFY8UvpkTCRdy8t67qebOQn7UvRiGRzDw= github.com/CosmWasm/wasmvm/v3 v3.0.2 h1:+MLkOX+IdklITLqfG26PCFv5OXdZvNb8z5Wq5JFXTRM= github.com/CosmWasm/wasmvm/v3 v3.0.2/go.mod h1:oknpb1bFERvvKcY7vHRp1F/Y/z66xVrsl7n9uWkOAlM= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= @@ -1253,8 +1253,8 @@ github.com/DataDog/datadog-go v4.8.3+incompatible h1:fNGaYSuObuQb5nzeTQqowRAd9bp github.com/DataDog/datadog-go v4.8.3+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/DataDog/zstd v1.5.7 h1:ybO8RBeh29qrxIhCA9E8gKY6xfONU9T6G6aP9DTKfLE= github.com/DataDog/zstd v1.5.7/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.27.0 h1:ErKg/3iS1AKcTkf3yixlZ54f9U1rljCkQyEXWUnIUxc= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.27.0/go.mod h1:yAZHSGnqScoU556rBOVkwLze6WP5N+U11RHuWaGVxwY= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.29.0 h1:UQUsRi8WTzhZntp5313l+CHIAT95ojUI2lpP/ExlZa4= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.29.0/go.mod h1:Cz6ft6Dkn3Et6l2v2a9/RpN7epQ1GtDlO6lj8bEcOvw= github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.50.0 h1:5IT7xOdq17MtcdtL/vtl6mGfzhaq4m4vpollPRmlsBQ= github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.50.0/go.mod h1:ZV4VOm0/eHR06JLrXWe09068dHpr3TRpY9Uo7T+anuA= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.50.0 h1:nNMpRpnkWDAaqcpxMJvxa/Ud98gjbYwayJY4/9bdjiU= @@ -1430,10 +1430,10 @@ github.com/cosmos/go-bip39 v1.0.0 h1:pcomnQdrdH22njcAatO0yWojsUnCO3y2tNoV1cb6hHY github.com/cosmos/go-bip39 v1.0.0/go.mod h1:RNJv0H/pOIVgxw6KS7QeX2a0Uo0aKUlfhZ4xuwvCdJw= github.com/cosmos/gogogateway v1.2.0 h1:Ae/OivNhp8DqBi/sh2A8a1D0y638GpL3tkmLQAiKxTE= github.com/cosmos/gogogateway v1.2.0/go.mod h1:iQpLkGWxYcnCdz5iAdLcRBSw3h7NXeOkZ4GUkT+tbFI= -github.com/cosmos/iavl v1.2.4 h1:IHUrG8dkyueKEY72y92jajrizbkZKPZbMmG14QzsEkw= -github.com/cosmos/iavl v1.2.4/go.mod h1:GiM43q0pB+uG53mLxLDzimxM9l/5N9UuSY3/D0huuVw= -github.com/cosmos/ibc-go/v10 v10.3.0 h1:w5DkHih8qn15deAeFoTk778WJU+xC1krJ5kDnicfUBc= -github.com/cosmos/ibc-go/v10 v10.3.0/go.mod h1:CthaR7n4d23PJJ7wZHegmNgbVcLXCQql7EwHrAXnMtw= +github.com/cosmos/iavl v1.2.6 h1:Hs3LndJbkIB+rEvToKJFXZvKo6Vy0Ex1SJ54hhtioIs= +github.com/cosmos/iavl v1.2.6/go.mod h1:GiM43q0pB+uG53mLxLDzimxM9l/5N9UuSY3/D0huuVw= +github.com/cosmos/ibc-go/v10 v10.4.0 h1:dPMtBw1vb/CdXQuiue+JfGwS/BYbbEFJaeSVFx86nMw= +github.com/cosmos/ibc-go/v10 v10.4.0/go.mod h1:a74pAPUSJ7NewvmvELU74hUClJhwnmm5MGbEaiTw/kE= github.com/cosmos/ics23/go v0.11.0 h1:jk5skjT0TqX5e5QJbEnwXIS2yI2vnmLOgpQPeM5RtnU= github.com/cosmos/ics23/go v0.11.0/go.mod h1:A8OjxPE67hHST4Icw94hOxxFEJMBG031xIGF/JHNIY0= github.com/cosmos/keyring v1.2.0 h1:8C1lBP9xhImmIabyXW4c3vFjjLiBdGCmfLUfeZlV1Yo= @@ -1555,8 +1555,8 @@ github.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3 github.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= github.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= github.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY= -github.com/go-jose/go-jose/v4 v4.0.5 h1:M6T8+mKZl/+fNNuFHvGIzDz7BTLQPIounk/b9dw3AaE= -github.com/go-jose/go-jose/v4 v4.0.5/go.mod h1:s3P1lRrkT8igV8D9OjyL4WRyHvjB6a4JSllnOrmmBOA= +github.com/go-jose/go-jose/v4 v4.1.1 h1:JYhSgy4mXXzAdF3nUx3ygx347LRXJRrpgyU3adRmkAI= +github.com/go-jose/go-jose/v4 v4.1.1/go.mod h1:BdsZGqgdO3b6tTc6LSE56wcDbMMLuPsw5d4ZD5f94kA= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= @@ -2059,8 +2059,8 @@ github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeD 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.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.23.0 h1:ust4zpdl9r4trLY/gSjlm07PuiBq2ynaXXlptpfy8Uc= -github.com/prometheus/client_golang v1.23.0/go.mod h1:i/o0R9ByOnHX0McrTMTyhYvKE4haaf2mW08I+jGAjEE= +github.com/prometheus/client_golang v1.23.2 h1:Je96obch5RDVy3FDMndoUsjAhG5Edi49h0RJWRi/o0o= +github.com/prometheus/client_golang v1.23.2/go.mod h1:Tb1a6LWHB3/SPIzCoaDXI4I8UHKeFTEQ1YCr+0Gyqmg= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= @@ -2079,8 +2079,8 @@ github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8b github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.65.0 h1:QDwzd+G1twt//Kwj/Ww6E9FQq1iVMmODnILtW1t2VzE= -github.com/prometheus/common v0.65.0/go.mod h1:0gZns+BLRQ3V6NdaerOhMbwwRbNh9hkGINtQAsP5GS8= +github.com/prometheus/common v0.66.1 h1:h5E0h5/Y8niHc5DlaLlWLArTQI7tMrsfQjHV+d9ZoGs= +github.com/prometheus/common v0.66.1/go.mod h1:gcaUsgf3KfRSwHY4dIMXLPV0K/Wg1oZ8+SbZk/HH/dA= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= @@ -2120,8 +2120,8 @@ github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQD github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w= github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/sagikazarmark/locafero v0.7.0 h1:5MqpDsTGNDhY8sGp0Aowyf0qKsPrhewaLSsFaodPcyo= -github.com/sagikazarmark/locafero v0.7.0/go.mod h1:2za3Cg5rMaTMoG/2Ulr9AwtFaIppKXTRYnozin4aB5k= +github.com/sagikazarmark/locafero v0.11.0 h1:1iurJgmM9G3PA/I+wWYIOw/5SyBtxapeHDcg+AAIFXc= +github.com/sagikazarmark/locafero v0.11.0/go.mod h1:nVIGvgyzw595SUSUE6tvCp3YYTeHs15MvlmU87WwIik= github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= github.com/sasha-s/go-deadlock v0.3.5 h1:tNCOEEDG6tBqrNDOX35j/7hL5FcFViG6awUGROb2NsU= github.com/sasha-s/go-deadlock v0.3.5/go.mod h1:bugP6EGbdGYObIlx7pUZtWqlvo8k9H6vCBBsiChJQ5U= @@ -2141,27 +2141,27 @@ github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1 github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= 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/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= -github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= +github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8 h1:+jumHNA0Wrelhe64i8F6HNlS8pkoyMv5sreGx2Ry5Rw= +github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8/go.mod h1:3n1Cwaq1E1/1lhQhtRK2ts/ZwZEhjcQeJQ1RuC6Q/8U= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4= github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= github.com/spf13/afero v1.10.0/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= -github.com/spf13/afero v1.12.0 h1:UcOPyRBYczmFn6yvphxkn9ZEOY65cpwGKb5mL36mrqs= -github.com/spf13/afero v1.12.0/go.mod h1:ZTlWwG4/ahT8W7T0WQ5uYmjI9duaLQGy3Q2OAl4sk/4= -github.com/spf13/cast v1.9.2 h1:SsGfm7M8QOFtEzumm7UZrZdLLquNdzFYfIbEXntcFbE= -github.com/spf13/cast v1.9.2/go.mod h1:jNfB8QC9IA6ZuY2ZjDp0KtFO2LZZlg4S/7bzP6qqeHo= +github.com/spf13/afero v1.15.0 h1:b/YBCLWAJdFWJTN9cLhiXXcD7mzKn9Dm86dNnfyQw1I= +github.com/spf13/afero v1.15.0/go.mod h1:NC2ByUVxtQs4b3sIUphxK0NioZnmxgyCrfzeuq8lxMg= +github.com/spf13/cast v1.10.0 h1:h2x0u2shc1QuLHfxi+cTJvs30+ZAHOGRic8uyGTDWxY= +github.com/spf13/cast v1.10.0/go.mod h1:jNfB8QC9IA6ZuY2ZjDp0KtFO2LZZlg4S/7bzP6qqeHo= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo= -github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0= +github.com/spf13/cobra v1.10.1 h1:lJeBwCfmrnXthfAupyUTzJ/J4Nc1RsHC/mSRU2dll/s= +github.com/spf13/cobra v1.10.1/go.mod h1:7SmJGaTHFVBY0jW4NXGluQoLvhqFQM+6XSKD+P4XaB0= github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/pflag v1.0.7 h1:vN6T9TfwStFPFM5XzjsvmzZkLuaLX+HS+0SeFLRgU6M= -github.com/spf13/pflag v1.0.7/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.20.1 h1:ZMi+z/lvLyPSCoNtFCpqjy0S4kPbirhpTMwl8BkW9X4= -github.com/spf13/viper v1.20.1/go.mod h1:P9Mdzt1zoHIG8m2eZQinpiBjo6kCmZSKBClNNqjJvu4= +github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk= +github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.21.0 h1:x5S+0EU27Lbphp4UKm1C+1oQO+rKx36vfCoaVebLFSU= +github.com/spf13/viper v1.21.0/go.mod h1:P0lhsswPGWD/1lZJ9ny3fYnVqxiegrlNrEmgLjbTCAY= github.com/spiffe/go-spiffe/v2 v2.5.0 h1:N2I01KCUkv1FAjZXJMwh95KK1ZIQLYbPfhaxw8WS0hE= github.com/spiffe/go-spiffe/v2 v2.5.0/go.mod h1:P+NxobPc6wXhVtINNtFjNWGBTreew1GBUCwT2wPmb7g= github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= @@ -2186,8 +2186,8 @@ github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.11.0 h1:ib4sjIrwZKxE5u/Japgo/7SJV3PvgjGiRNAvTVGqQl8= -github.com/stretchr/testify v1.11.0/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= @@ -2257,24 +2257,24 @@ go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0 h1:sbiXRND go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0/go.mod h1:69uWxva0WgAA/4bu2Yy70SLDBwZXuQ6PbBpbsa5iZrQ= go.opentelemetry.io/otel v1.19.0/go.mod h1:i0QyjOq3UPoTzff0PJB2N66fb4S0+rSbSB15/oyH9fY= go.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo= -go.opentelemetry.io/otel v1.36.0 h1:UumtzIklRBY6cI/lllNZlALOF5nNIzJVb16APdvgTXg= -go.opentelemetry.io/otel v1.36.0/go.mod h1:/TcFMXYjyRNh8khOAO9ybYkqaDBb/70aVwkNML4pP8E= +go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= +go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.29.0 h1:WDdP9acbMYjbKIyJUhTvtzj601sVJOqgWdUxSdR/Ysc= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.29.0/go.mod h1:BLbf7zbNIONBLPwvFnwNHGj4zge8uTCM/UPIVW1Mq2I= go.opentelemetry.io/otel/metric v1.19.0/go.mod h1:L5rUsV9kM1IxCj1MmSdS+JQAcVm319EUrDVLrt7jqt8= go.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM= -go.opentelemetry.io/otel/metric v1.36.0 h1:MoWPKVhQvJ+eeXWHFBOPoBOi20jh6Iq2CcCREuTYufE= -go.opentelemetry.io/otel/metric v1.36.0/go.mod h1:zC7Ks+yeyJt4xig9DEw9kuUFe5C3zLbVjV2PzT6qzbs= +go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= +go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= go.opentelemetry.io/otel/sdk v1.19.0/go.mod h1:NedEbbS4w3C6zElbLdPJKOpJQOrGUJ+GfzpjUvI0v1A= go.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E= -go.opentelemetry.io/otel/sdk v1.36.0 h1:b6SYIuLRs88ztox4EyrvRti80uXIFy+Sqzoh9kFULbs= -go.opentelemetry.io/otel/sdk v1.36.0/go.mod h1:+lC+mTgD+MUWfjJubi2vvXWcVxyr9rmlshZni72pXeY= -go.opentelemetry.io/otel/sdk/metric v1.36.0 h1:r0ntwwGosWGaa0CrSt8cuNuTcccMXERFwHX4dThiPis= -go.opentelemetry.io/otel/sdk/metric v1.36.0/go.mod h1:qTNOhFDfKRwX0yXOqJYegL5WRaW376QbB7P4Pb0qva4= +go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= +go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= +go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= +go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= go.opentelemetry.io/otel/trace v1.19.0/go.mod h1:mfaSyvGyEJEI0nyV2I4qhNQnbBOUUmYZpYojqMnX2vo= go.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ= -go.opentelemetry.io/otel/trace v1.36.0 h1:ahxWNuqZjpdiFAyrIoQ4GIiAIhxAunQR6MUoKrsNd4w= -go.opentelemetry.io/otel/trace v1.36.0/go.mod h1:gQ+OnDZzrybY4k4seLzPAWNwVBBVlF2szhehOBB/tGA= +go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= +go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.opentelemetry.io/proto/otlp v0.15.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= @@ -2293,16 +2293,14 @@ go.uber.org/mock v0.5.2/go.mod h1:wLlUxC2vVTPTaE3UD51E0BGOAElKrILxhVSDYQLld5o= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= -go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= go.yaml.in/yaml/v2 v2.4.2 h1:DzmwEr2rDGHl7lsFgAHxmNz/1NlQ7xLIrlN2h5d1eGI= go.yaml.in/yaml/v2 v2.4.2/go.mod h1:081UH+NErpNdqlCXm3TtEran0rJZGxAYx9hb/ELlsPU= -go.yaml.in/yaml/v3 v3.0.3 h1:bXOww4E/J3f66rav3pX3m8w6jDE4knZjGOw8b5Y6iNE= -go.yaml.in/yaml/v3 v3.0.3/go.mod h1:tBHosrYAkRZjRAOREWbDnBXUf08JOwYq++0QNwQiWzI= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= golang.org/x/arch v0.17.0 h1:4O3dfLzd+lQewptAHqjewQZQDyEdejz3VwgeYwkZneU= golang.org/x/arch v0.17.0/go.mod h1:bdwinDaKcfZUGpH09BB7ZmOfhalA8lQdzl62l8gGWsk= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -2335,8 +2333,8 @@ golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1m golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc= -golang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM= -golang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY= +golang.org/x/crypto v0.41.0 h1:WKYxWedPGCTVVl5+WHSSrOBT0O8lx32+zxmHxijgXp4= +golang.org/x/crypto v0.41.0/go.mod h1:pO5AFd7FA68rFak7rOAGVuygIISepHftHnr8dr6+sUc= golang.org/x/exp v0.0.0-20230711153332-06a737ee72cb h1:xIApU0ow1zwMa2uL1VDNeQlNVFTWMQxZUZCMDy0Q4Us= golang.org/x/exp v0.0.0-20230711153332-06a737ee72cb/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= @@ -2381,8 +2379,8 @@ golang.org/x/mod v0.11.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/mod v0.25.0 h1:n7a+ZbQKQA/Ysbyb0/6IbB1H/X41mKgbhfv7AfG/44w= -golang.org/x/mod v0.25.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww= +golang.org/x/mod v0.26.0 h1:EGMPT//Ezu+ylkCijjPc+f4Aih7sZvaAr+O3EHBxvZg= +golang.org/x/mod v0.26.0/go.mod h1:/j6NAhSk8iQ723BGAUyoAcn7SlD7s15Dp9Nd/SfeaFQ= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -2467,8 +2465,8 @@ golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k= -golang.org/x/net v0.42.0 h1:jzkYrhi3YQWD6MLBJcsklgQsoAcw89EcZbJw8Z614hs= -golang.org/x/net v0.42.0/go.mod h1:FF1RA5d3u7nAYA4z2TkclSCKh68eSXtiFwcWQpPXdt8= +golang.org/x/net v0.43.0 h1:lat02VYK2j4aLzMzecihNvTlJNQUq316m2Mr9rnM6YE= +golang.org/x/net v0.43.0/go.mod h1:vhO1fvI4dGsIjh73sWfUVjj3N7CA9WkKJNQm2svM6Jg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -2529,8 +2527,8 @@ golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw= -golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug= +golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -2646,8 +2644,8 @@ golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA= -golang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI= +golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE= 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= @@ -2670,8 +2668,8 @@ golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= golang.org/x/term v0.28.0/go.mod h1:Sw/lC2IAUZ92udQNf3WodGtn4k/XoLyZoh8v/8uiwek= -golang.org/x/term v0.33.0 h1:NuFncQrRcaRvVmgRkvM3j/F00gWIAlcmlB8ACEKmGIg= -golang.org/x/term v0.33.0/go.mod h1:s18+ql9tYWp1IfpV9DmCtQDDSRBUjKaw9M1eAv5UeF0= +golang.org/x/term v0.34.0 h1:O/2T7POpk0ZZ7MAzMeWFSg6S5IpWd/RXDlM9hgM3DR4= +golang.org/x/term v0.34.0/go.mod h1:5jC53AEywhIVebHgPVeg0mj8OD3VO9OzclacVrqpaAw= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -2695,8 +2693,8 @@ golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= -golang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4= -golang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU= +golang.org/x/text v0.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng= +golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= 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= @@ -2791,6 +2789,8 @@ gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJ gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= gonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0= gonum.org/v1/gonum v0.11.0/go.mod h1:fSG4YDCxxUZQJ7rKsQrj0gMOg00Il0Z96/qMA4bVQhA= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= 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= gonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY= @@ -3150,8 +3150,8 @@ google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9Y google.golang.org/grpc v1.60.0/go.mod h1:OlCHIeLYqSSsLi6i49B5QGdzaMZK9+M7LXN2FKz4eGM= google.golang.org/grpc v1.60.1/go.mod h1:OlCHIeLYqSSsLi6i49B5QGdzaMZK9+M7LXN2FKz4eGM= google.golang.org/grpc v1.62.1/go.mod h1:IWTG0VlJLCh1SkC58F7np9ka9mx/WNkjl4PGJaiq+QE= -google.golang.org/grpc v1.74.2 h1:WoosgB65DlWVC9FqI82dGsZhWFNBSLjQ84bjROOpMu4= -google.golang.org/grpc v1.74.2/go.mod h1:CtQ+BGjaAIXHs/5YS3i473GqwBBa1zGQNevxdeBEXrM= +google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= +google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= 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= @@ -3173,8 +3173,8 @@ google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqw google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= -google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= -google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +google.golang.org/protobuf v1.36.8 h1:xHScyCOEuuwZEc6UtSOvPbAT4zRh0xcNRYekJwfqyMc= +google.golang.org/protobuf v1.36.8/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= 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= @@ -3282,10 +3282,10 @@ nhooyr.io/websocket v1.8.17 h1:KEVeLJkUywCKVsnLIDlD/5gtayKp8VoCkksHCGGfT9Y= nhooyr.io/websocket v1.8.17/go.mod h1:rN9OFWIUwuxg4fR5tELlYC04bXYowCP9GX47ivo2l+c= pgregory.net/rapid v0.5.5 h1:jkgx1TjbQPD/feRoK+S/mXw9e1uj6WilpHrXJowi6oA= pgregory.net/rapid v0.5.5/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04= -pkg.akt.dev/go v0.1.6-rc0 h1:TJ1Xo5pQBPUIO1UsVHtGlPoayuahxQA4uTUvs/CKlEA= -pkg.akt.dev/go v0.1.6-rc0/go.mod h1:noM7YKcw4fAAXmYM9MmProytKQt9P/CxWmc8wi/w35M= -pkg.akt.dev/go/cli v0.1.4 h1:wFPegnPwimWHi0v5LN6AnWZnwtwpnD6mb7Dp1HSuzlw= -pkg.akt.dev/go/cli v0.1.4/go.mod h1:ZLqHZcq+D/8a27WTPYhmfCm2iGbNicWV1AwOhdspJ4Y= +pkg.akt.dev/go v0.1.6-rc1 h1:Bl1/tSPAyUnpPl/rv13pZqAZYp/a5ZNRbIOk6eSFRlw= +pkg.akt.dev/go v0.1.6-rc1/go.mod h1:lKU6b+hR+LAWslGemTYg8raiBHru4K1jolk+LDUU57Y= +pkg.akt.dev/go/cli v0.1.5-rc1 h1:g6AuRfwPZA0FpHo02tSeQvdLhvszRHoGb3VUdpgpoak= +pkg.akt.dev/go/cli v0.1.5-rc1/go.mod h1:G2PaN/gYDVDUuTF0TzQcQgx9Tn1iIx3Ca3kIF61sY2M= pkg.akt.dev/go/sdl v0.1.1 h1:3CcAqWeKouFlvUSjQMktWLDqftOjn4cBX37TRFT7BRM= pkg.akt.dev/go/sdl v0.1.1/go.mod h1:ADsH8/kh61tWTax8nV0utelOaKWfU3qbG+OT3v9nmeY= pkg.akt.dev/specs v0.0.1 h1:OP0zil3Fr4kcCuybFqQ8LWgSlSP2Yn7306meWpu6/S4= diff --git a/make/init.mk b/make/init.mk index 52c0bf4f9c..6e7c8782bb 100644 --- a/make/init.mk +++ b/make/init.mk @@ -25,7 +25,8 @@ $(error "GOTOOLCHAIN is not set") endif NULL := -SPACE := $(NULL) # +SPACE := $(NULL) +WHITESPACE := $(NULL) $(NULL) COMMA := , BINS := $(AKASH) @@ -73,6 +74,9 @@ GIT_CHGLOG_VERSION ?= v0.15.1 MOCKERY_VERSION ?= 3.5.0 COSMOVISOR_VERSION ?= v1.7.1 +WASMVM_MOD := $(shell $(GO) list -m -f '{{ .Path }}' all | grep github.com/CosmWasm/wasmvm) +WASMVM_VERSION := $(shell $(GO) list -mod=readonly -m -f '{{ .Version }}' $(WASMVM_MOD)) + # ==== Build tools version tracking ==== # _VERSION_FILE points to the marker file for the installed version. # If _VERSION_FILE is changed, the binary will be re-downloaded. @@ -92,7 +96,10 @@ STATIK := $(AKASH_DEVCACHE_BIN)/statik COSMOVISOR := $(AKASH_DEVCACHE_BIN)/cosmovisor COSMOVISOR_DEBUG := $(AKASH_RUN_BIN)/cosmovisor +RELEASE_TAG ?= $(shell git describe --tags --abbrev=0) -RELEASE_TAG ?= $(shell git describe --tags --abbrev=0) +WASMVM_LIBS := libwasmvm_muslc.x86_64.a \ +libwasmvm_muslc.aarch64.a \ +libwasmvmstatic_darwin.a include $(AKASH_ROOT)/make/setup-cache.mk diff --git a/make/releasing.mk b/make/releasing.mk index 7a5f8c31c2..3be2976f78 100644 --- a/make/releasing.mk +++ b/make/releasing.mk @@ -38,18 +38,18 @@ bins: $(BINS) .PHONY: build build: - $(GO_BUILD) -a ./... + $(GO_BUILD) -a $(BUILD_FLAGS) ./... .PHONY: $(AKASH) $(AKASH): - $(GO_BUILD) -o $@ $(BUILD_FLAGS) ./cmd/akash + $(GO_BUILD) -v -o $@ $(BUILD_FLAGS) ./cmd/akash .PHONY: akash akash: $(AKASH) .PHONY: akash_docgen akash_docgen: $(AKASH_DEVCACHE) - $(GO_BUILD) -o $(AKASH_DEVCACHE_BIN)/akash_docgen $(BUILD_FLAGS) ./docgen + $(GO_BUILD) $(BUILD_FLAGS) -o $(AKASH_DEVCACHE_BIN)/akash_docgen ./docgen .PHONY: install install: @@ -64,12 +64,9 @@ image-minikube: test-bins: docker run \ --rm \ - -e STABLE=$(IS_STABLE) \ -e MOD="$(GOMOD)" \ - -e BUILD_TAGS="$(BUILD_TAGS)" \ - -e BUILD_VARS="$(GORELEASER_BUILD_VARS)" \ - -e STRIP_FLAGS="$(GORELEASER_STRIP_FLAGS)" \ - -e LINKMODE="$(GO_LINKMODE)" \ + -e BUILD_TAGS="$(GORELEASER_TAGS)" \ + -e BUILD_LDFLAGS="$(GORELEASER_LDFLAGS)" \ -e DOCKER_IMAGE=$(RELEASE_DOCKER_IMAGE) \ -e GOPATH=/go \ -e GOTOOLCHAIN="$(GOTOOLCHAIN)" \ @@ -89,12 +86,9 @@ test-bins: docker-image: docker run \ --rm \ - -e STABLE=$(IS_STABLE) \ -e MOD="$(GOMOD)" \ - -e BUILD_TAGS="$(BUILD_TAGS)" \ - -e BUILD_VARS="$(GORELEASER_BUILD_VARS)" \ - -e STRIP_FLAGS="$(GORELEASER_STRIP_FLAGS)" \ - -e LINKMODE="$(GO_LINKMODE)" \ + -e BUILD_TAGS="$(GORELEASER_TAGS)" \ + -e BUILD_LDFLAGS="$(GORELEASER_LDFLAGS)" \ -e DOCKER_IMAGE=$(RELEASE_DOCKER_IMAGE) \ -e GOPATH=/go \ -e GOTOOLCHAIN="$(GOTOOLCHAIN)" \ @@ -119,12 +113,9 @@ gen-changelog: $(GIT_CHGLOG) release: gen-changelog docker run \ --rm \ - -e STABLE=$(IS_STABLE) \ -e MOD="$(GOMOD)" \ - -e BUILD_TAGS="$(BUILD_TAGS)" \ - -e BUILD_VARS="$(GORELEASER_BUILD_VARS)" \ - -e STRIP_FLAGS="$(GORELEASER_STRIP_FLAGS)" \ - -e LINKMODE="$(GO_LINKMODE)" \ + -e BUILD_TAGS="$(GORELEASER_TAGS)" \ + -e BUILD_LDFLAGS="$(GORELEASER_LDFLAGS)" \ -e GITHUB_TOKEN="$(GITHUB_TOKEN)" \ -e GORELEASER_CURRENT_TAG="$(RELEASE_TAG)" \ -e DOCKER_IMAGE=$(RELEASE_DOCKER_IMAGE) \ diff --git a/make/setup-cache.mk b/make/setup-cache.mk index cfabcd2f31..4def60c02c 100644 --- a/make/setup-cache.mk +++ b/make/setup-cache.mk @@ -2,6 +2,7 @@ $(AKASH_DEVCACHE): @echo "creating .cache dir structure..." mkdir -p $@ mkdir -p $(AKASH_DEVCACHE_BIN) + mkdir -p $(AKASH_DEVCACHE_LIB) mkdir -p $(AKASH_DEVCACHE_INCLUDE) mkdir -p $(AKASH_DEVCACHE_VERSIONS) mkdir -p $(AKASH_DEVCACHE_NODE_MODULES) @@ -57,3 +58,9 @@ $(COSMOVISOR): $(COSMOVISOR_VERSION_FILE) cache-clean: rm -rf $(AKASH_DEVCACHE) + +$(AKASH_DEVCACHE_LIB)/%.a: + wget -q --show-progress https://github.com/CosmWasm/wasmvm/releases/download/$(WASMVM_VERSION)/$*.a -O $(AKASH_DEVCACHE_LIB)/$*.a + +.PHONY: wasmvm-libs +wasmvm-libs: $(AKASH_DEVCACHE) $(patsubst %, $(AKASH_DEVCACHE_LIB)/%,$(WASMVM_LIBS)) diff --git a/upgrades/software/v2.0.0/upgrade.go b/upgrades/software/v2.0.0/upgrade.go index 99c935e2e6..224e86b303 100644 --- a/upgrades/software/v2.0.0/upgrade.go +++ b/upgrades/software/v2.0.0/upgrade.go @@ -41,10 +41,10 @@ func initUpgrade(log log.Logger, app *apptypes.App) (utypes.IUpgrade, error) { func (up *upgrade) StoreLoader() *storetypes.StoreUpgrades { return &storetypes.StoreUpgrades{ Added: []string{ - awasm.ModuleName, + awasm.StoreKey, // With the migrations of all modules away from x/params, the crisis module now has a store. // The store must be created during a chain upgrade to v0.53.x. - wasmtypes.ModuleName, + wasmtypes.StoreKey, }, Deleted: []string{}, } @@ -77,7 +77,7 @@ func (up *upgrade) UpgradeHandler() upgradetypes.UpgradeHandler { // Configure instantiate default permission params.InstantiateDefaultPermission = wasmtypes.AccessTypeEverybody - err := up.Keepers.External.Wasm.SetParams(ctx, params) + err := up.Keepers.Cosmos.Wasm.SetParams(ctx, params) if err != nil { return fromVM, err } From e566877751785ccbfb692a8564d5294aa37210e9 Mon Sep 17 00:00:00 2001 From: Artur Troian Date: Sun, 9 Nov 2025 11:08:52 -0600 Subject: [PATCH 4/6] fix(build): set wasm lib dependencies for release targets Signed-off-by: Artur Troian --- make/releasing.mk | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/make/releasing.mk b/make/releasing.mk index 3be2976f78..634f45299e 100644 --- a/make/releasing.mk +++ b/make/releasing.mk @@ -41,7 +41,7 @@ build: $(GO_BUILD) -a $(BUILD_FLAGS) ./... .PHONY: $(AKASH) -$(AKASH): +$(AKASH): wasmvm-libs $(GO_BUILD) -v -o $@ $(BUILD_FLAGS) ./cmd/akash .PHONY: akash @@ -61,7 +61,7 @@ image-minikube: eval $$(minikube docker-env) && docker-image .PHONY: test-bins -test-bins: +test-bins: wasmvm-libs docker run \ --rm \ -e MOD="$(GOMOD)" \ @@ -83,7 +83,7 @@ test-bins: --snapshot .PHONY: docker-image -docker-image: +docker-image: wasmvm-libs docker run \ --rm \ -e MOD="$(GOMOD)" \ @@ -110,7 +110,7 @@ gen-changelog: $(GIT_CHGLOG) ./script/genchangelog.sh "$(RELEASE_TAG)" .cache/changelog.md .PHONY: release -release: gen-changelog +release: wasmvm-libs gen-changelog docker run \ --rm \ -e MOD="$(GOMOD)" \ From 699555380dbc187c248045423aeb6e4dc5794595 Mon Sep 17 00:00:00 2001 From: Artur Troian Date: Sun, 9 Nov 2025 11:24:11 -0600 Subject: [PATCH 5/6] feat(upgrade): setup upgrade info for v2.0.0 Signed-off-by: Artur Troian --- .github/actions/setup-ubuntu/action.yaml | 2 +- .github/workflows/tests.yaml | 2 +- .goreleaser.yaml | 4 +- Makefile | 19 ++- _build/akash.Dockerfile | 2 - _run/common-commands.mk | 4 +- _run/common.mk | 1 + app/app.go | 3 +- app/sim_test.go | 17 +-- app/types/app.go | 26 ---- app/upgrades.go | 7 +- go.mod | 6 +- go.sum | 12 +- make/init.mk | 11 +- make/releasing.mk | 9 +- make/setup-cache.mk | 20 ++- make/test-integration.mk | 22 ++-- make/test-upgrade.mk | 8 +- meta.json | 5 + script/upgrades.sh | 2 +- tests/upgrade/config-v0.24.0.tmpl.json | 41 ------- tests/upgrade/sdktypes.go | 56 +++++++++ tests/upgrade/test-cases.json | 8 ++ tests/upgrade/test-config.json | 3 +- tests/upgrade/testdata/hackatom.wasm | Bin 0 -> 180690 bytes tests/upgrade/types/types.go | 1 + tests/upgrade/upgrade_test.go | 150 ++++++++++++++--------- tests/upgrade/workers_test.go | 148 +++++++++++----------- testutil/sims/simulation_helpers.go | 8 +- upgrades/software/v2.0.0/upgrade.go | 19 ++- wasmvm.go | 3 + x/audit/module.go | 13 +- x/cert/module.go | 15 ++- x/escrow/module.go | 13 +- x/market/module.go | 2 +- x/provider/module.go | 5 +- x/take/module.go | 13 +- x/wasm/alias.go | 2 +- x/wasm/genesis.go | 17 +-- x/wasm/keeper/msg_filter.go | 24 +++- x/wasm/module.go | 25 ++-- x/wasm/simulation/proposals.go | 14 --- 42 files changed, 414 insertions(+), 348 deletions(-) delete mode 100644 tests/upgrade/config-v0.24.0.tmpl.json create mode 100644 tests/upgrade/sdktypes.go create mode 100644 tests/upgrade/testdata/hackatom.wasm create mode 100644 wasmvm.go diff --git a/.github/actions/setup-ubuntu/action.yaml b/.github/actions/setup-ubuntu/action.yaml index d55423b38c..79f62fdb7d 100644 --- a/.github/actions/setup-ubuntu/action.yaml +++ b/.github/actions/setup-ubuntu/action.yaml @@ -14,7 +14,7 @@ runs: - name: Install dependencies # Shell must explicitly specify the shell for each step. https://github.com/orgs/community/discussions/18597 shell: bash - run: sudo apt install -y make direnv unzip lz4 wget curl npm jq pv coreutils + run: sudo apt install -y make direnv unzip lz4 wget curl npm jq pv coreutils musl-tools - name: Setup npm uses: actions/setup-node@v4 with: diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index 0411e53f7d..dde5530d8e 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -47,7 +47,7 @@ jobs: uses: actions/checkout@v4 - name: Setup environment uses: ./.github/actions/setup-ubuntu - - run: make bins + - run: BUILD_OPTIONS=static-link make bins - run: make docker-image tests: diff --git a/.goreleaser.yaml b/.goreleaser.yaml index 6692f15101..8eeb4580f4 100644 --- a/.goreleaser.yaml +++ b/.goreleaser.yaml @@ -17,7 +17,6 @@ builds: - CC=o64-clang - CXX=o64-clang++ - CGO_CFLAGS=-mmacosx-version-min=10.12 - - CGO_LDFLAGS=-L./.cache/lib -mmacosx-version-min=10.12 flags: - "-mod={{ .Env.MOD }}" - "-tags={{ .Env.BUILD_TAGS }} static_wasm" @@ -26,6 +25,7 @@ builds: - "{{ .Env.BUILD_LDFLAGS }}" - -s -w - -linkmode=external + - -extldflags "-L./.cache/lib -mmacosx-version-min=10.12" - id: akash-darwin-arm64 binary: akash main: ./cmd/akash @@ -37,7 +37,6 @@ builds: - CC=oa64-clang - CXX=oa64-clang++ - CGO_CFLAGS=-mmacosx-version-min=10.12 - - CGO_LDFLAGS=-L./.cache/lib -mmacosx-version-min=10.12 flags: - "-mod={{ .Env.MOD }}" - "-tags={{ .Env.BUILD_TAGS }} static_wasm" @@ -46,6 +45,7 @@ builds: - "{{ .Env.BUILD_LDFLAGS }}" - -s -w - -linkmode=external + - -extldflags "-L./.cache/lib -mmacosx-version-min=10.12" - id: akash-linux-amd64 binary: akash main: ./cmd/akash diff --git a/Makefile b/Makefile index ebe59d85e0..ae9b8925eb 100644 --- a/Makefile +++ b/Makefile @@ -18,9 +18,20 @@ GIT_HEAD_ABBREV := $(shell git rev-parse --abbrev-ref HEAD) IS_PREREL := $(shell $(ROOT_DIR)/script/is_prerelease.sh "$(RELEASE_TAG)" && echo "true" || echo "false") IS_MAINNET := $(shell $(ROOT_DIR)/script/mainnet-from-tag.sh "$(RELEASE_TAG)" && echo "true" || echo "false") +IS_STABLE ?= false + +ifeq ($(IS_MAINNET), true) + ifeq ($(IS_PREREL), false) + IS_STABLE := true + endif +endif GOMOD ?= readonly + +ifneq ($(UNAME_OS),Darwin) BUILD_OPTIONS ?= static-link +endif + BUILD_TAGS := osusergo netgo ledger muslc gcc DB_BACKEND := goleveldb BUILD_FLAGS := @@ -51,8 +62,12 @@ ldflags := -X github.com/cosmos/cosmos-sdk/version.Name=akash \ GORELEASER_LDFLAGS := $(ldflags) -ifeq (,$(findstring static-link,$(BUILD_OPTIONS))) - ldflags += -linkmode=external -extldflags "-Wl,-z,muldefs -static" +ldflags += -linkmode=external + +ifeq (static-link,$(findstring static-link,$(BUILD_OPTIONS))) + ldflags += -extldflags "-L$(AKASH_DEVCACHE_LIB) -lm -Wl,-z,muldefs -static" +else + ldflags += -extldflags "-L$(AKASH_DEVCACHE_LIB)" endif # check for nostrip option diff --git a/_build/akash.Dockerfile b/_build/akash.Dockerfile index b31b006a57..4377484a05 100644 --- a/_build/akash.Dockerfile +++ b/_build/akash.Dockerfile @@ -1,8 +1,6 @@ FROM debian:bullseye LABEL "org.opencontainers.image.source"="https://github.com/akash-network/node" -ARG WASMVM_VERSION - COPY ./akash /bin/ EXPOSE 26656 26657 26658 diff --git a/_run/common-commands.mk b/_run/common-commands.mk index 24a58f23fa..5166f723f5 100644 --- a/_run/common-commands.mk +++ b/_run/common-commands.mk @@ -24,7 +24,7 @@ multisig-send: "$(AKASH_HOME)/multisig-sig-main.json" \ "$(AKASH_HOME)/multisig-sig-other.json" \ > "$(AKASH_HOME)/multisig-final.json" - $(AKASH) "$(CHAIN_OPTS)" tx broadcast "$(AKASH_HOME)/multisig-final.json" + $(AKASH) $(CHAIN_OPTS) tx broadcast "$(AKASH_HOME)/multisig-final.json" .PHONY: akash-node-ready akash-node-ready: SHELL=$(BASH_PATH) @@ -32,7 +32,7 @@ akash-node-ready: @( \ max_retry=15; \ counter=0; \ - while [[ counter -lt max_retry ]]; do \ + while [[ $$counter -lt $$max_retry ]]; do \ read block < <(curl -s $(AKASH_NODE)/status | jq -r '.result.sync_info.latest_block_height' 2> /dev/null); \ if [[ $$? -ne 0 || $$block -lt 1 ]]; then \ echo "unable to get node status. sleep for 1s"; \ diff --git a/_run/common.mk b/_run/common.mk index e7fccf72a5..d7422131fa 100644 --- a/_run/common.mk +++ b/_run/common.mk @@ -75,6 +75,7 @@ client-init-key-multisig: --multisig "$(subst $(space),$(comma),$(strip $(MULTISIG_SIGNERS)))" \ --multisig-threshold 2 +.NOTPARALLEL: node-init .INTERMEDIATE: node-init node-init: node-init-genesis node-init-genesis-accounts node-init-genesis-certs node-init-gentx node-init-finalize diff --git a/app/app.go b/app/app.go index 6eeef21582..9a77025c88 100644 --- a/app/app.go +++ b/app/app.go @@ -141,7 +141,7 @@ func NewApp( if vl, valid := val.([]wasmkeeper.Option); valid { wasmOpts = append(wasmOpts, vl...) } else { - panic(fmt.Sprintf("invalid type for aptOpts.Get(\"wasmh\"). expected %s, actual %s", reflect.TypeOf(wasmOpts).String(), reflect.TypeOf(vl).String())) + panic(fmt.Sprintf("invalid type for aptOpts.Get(\"wasm\"). expected %s, actual %s", reflect.TypeOf(wasmOpts).String(), reflect.TypeOf(val).String())) } } @@ -163,7 +163,6 @@ func NewApp( panic(fmt.Sprintf("error while reading wasm config: %s", err)) } - wasmConfig.ContractDebugMode = false // Memory limits - prevent DoS wasmConfig.MemoryCacheSize = 100 // 100 MB max // Query gas limit - prevent expensive queries diff --git a/app/sim_test.go b/app/sim_test.go index 41d652742f..4a08b34808 100644 --- a/app/sim_test.go +++ b/app/sim_test.go @@ -12,7 +12,6 @@ import ( wasmtypes "github.com/CosmWasm/wasmd/x/wasm/types" cmtproto "github.com/cometbft/cometbft/proto/tendermint/types" - simcli "github.com/cosmos/cosmos-sdk/x/simulation/client/cli" "github.com/spf13/viper" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -169,8 +168,12 @@ func TestAppImportExport(t *testing.T) { t.Log("importing genesis...\n") - newDB, newDir, _, _, err := simtestutil.SetupSimulation(config, "leveldb-app-sim-2", "Simulation-2", simcli.FlagVerboseValue, simcli.FlagEnabledValue) + newDB, newDir, _, skip, err := simtestutil.SetupSimulation(config, "leveldb-app-sim-2", "Simulation-2", sim.FlagVerboseValue, sim.FlagEnabledValue) require.NoError(t, err, "simulation setup failed") + if skip { + t.Skip("skipping application import/export simulation") + } + defer func() { require.NoError(t, newDB.Close()) require.NoError(t, os.RemoveAll(newDir)) @@ -521,14 +524,14 @@ func TestAppStateDeterminism(t *testing.T) { } func setupSimulationApp(t *testing.T, msg string) (simtypes.Config, sdkutil.EncodingConfig, dbm.DB, simtestutil.AppOptionsMap, log.Logger, *akash.AkashApp) { - config := simcli.NewConfigFromFlags() + config := sim.NewConfigFromFlags() config.ChainID = AppChainID encodingConfig := sdkutil.MakeEncodingConfig() akash.ModuleBasics().RegisterInterfaces(encodingConfig.InterfaceRegistry) - db, dir, logger, skip, err := simtestutil.SetupSimulation(config, "leveldb-app-sim", "Simulation", simcli.FlagVerboseValue, simcli.FlagEnabledValue) + db, dir, logger, skip, err := simtestutil.SetupSimulation(config, "leveldb-app-sim", "Simulation", sim.FlagVerboseValue, sim.FlagEnabledValue) if skip { t.Skip(msg) } @@ -539,11 +542,11 @@ func setupSimulationApp(t *testing.T, msg string) (simtypes.Config, sdkutil.Enco require.NoError(t, os.RemoveAll(dir)) }) - appOpts := make(simtestutil.AppOptionsMap, 0) + appOpts := make(simtestutil.AppOptionsMap) appOpts[cflags.FlagHome] = dir // ensure a unique folder - appOpts[cflags.FlagInvCheckPeriod] = simcli.FlagPeriodValue + appOpts[cflags.FlagInvCheckPeriod] = sim.FlagPeriodValue app := akash.NewApp(logger, db, nil, true, sim.FlagPeriodValue, map[int64]bool{}, encodingConfig, appOpts, fauxMerkleModeOpt, baseapp.SetChainID(AppChainID)) - require.Equal(t, "AkashApp", app.Name()) + require.Equal(t, akash.AppName, app.Name()) return config, encodingConfig, db, appOpts, logger, app } diff --git a/app/types/app.go b/app/types/app.go index eead358555..c4f8fbb289 100644 --- a/app/types/app.go +++ b/app/types/app.go @@ -48,12 +48,6 @@ import ( slashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types" stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - icacontroller "github.com/cosmos/ibc-go/v10/modules/apps/27-interchain-accounts/controller" - icacontrollerkeeper "github.com/cosmos/ibc-go/v10/modules/apps/27-interchain-accounts/controller/keeper" - icacontrollertypes "github.com/cosmos/ibc-go/v10/modules/apps/27-interchain-accounts/controller/types" - icahostkeeper "github.com/cosmos/ibc-go/v10/modules/apps/27-interchain-accounts/host/keeper" - icahosttypes "github.com/cosmos/ibc-go/v10/modules/apps/27-interchain-accounts/host/types" - ibccallbacks "github.com/cosmos/ibc-go/v10/modules/apps/callbacks" "github.com/cosmos/ibc-go/v10/modules/apps/transfer" ibctransferkeeper "github.com/cosmos/ibc-go/v10/modules/apps/transfer/keeper" ibctransfertypes "github.com/cosmos/ibc-go/v10/modules/apps/transfer/types" @@ -115,8 +109,6 @@ type AppKeepers struct { IBC *ibckeeper.Keeper Evidence *evidencekeeper.Keeper Transfer ibctransferkeeper.Keeper - ICAController icacontrollerkeeper.Keeper - ICAHost icahostkeeper.Keeper Wasm *wasmkeeper.Keeper } @@ -500,21 +492,6 @@ func (app *App) InitNormalKeepers( // Create fee enabled wasm ibc Stack wasmStackIBCHandler := wasm.NewIBCHandler(app.Keepers.Cosmos.Wasm, app.Keepers.Cosmos.IBC.ChannelKeeper, app.Keepers.Cosmos.Transfer, app.Keepers.Cosmos.IBC.ChannelKeeper) - // Create Interchain Accounts Stack - // SendPacket, since it is originating from the application to core IBC: - // icaAuthModuleKeeper.SendTx -> icaController.SendPacket -> fee.SendPacket -> channel.SendPacket - var icaControllerStack porttypes.IBCModule - // integration point for custom authentication modules - // sees https://medium.com/the-interchain-foundation/ibc-go-v6-changes-to-interchain-accounts-and-how-it-impacts-your-chain-806c185300d7 - var noAuthzModule porttypes.IBCModule - icaControllerStack = icacontroller.NewIBCMiddlewareWithAuth(noAuthzModule, app.Keepers.Cosmos.ICAController) - // app.ICAAuthModule = icaControllerStack.(ibcmock.IBCModule) - icaControllerStack = icacontroller.NewIBCMiddlewareWithAuth(icaControllerStack, app.Keepers.Cosmos.ICAController) - icaControllerStack = ibccallbacks.NewIBCMiddleware(icaControllerStack, app.Keepers.Cosmos.IBC.ChannelKeeper, wasmStackIBCHandler, wasm.DefaultMaxIBCCallbackGas) - icaICS4Wrapper := icaControllerStack.(porttypes.ICS4Wrapper) - // Since the callback middleware itself is an ics4wrapper, it needs to be passed to the ica controller keeper - app.Keepers.Cosmos.ICAController.WithICS4Wrapper(icaICS4Wrapper) - transferIBCModule := transfer.NewIBCModule(app.Keepers.Cosmos.Transfer) // Create static IBC router, add transfer route, then set and seal it @@ -540,7 +517,6 @@ func (app *App) SetupHooks() { app.Keepers.Cosmos.Slashing.Hooks(), ), ) - app.Keepers.Cosmos.Gov.SetHooks( govtypes.NewMultiGovHooks( // insert governance hooks receivers here @@ -573,8 +549,6 @@ func initParamsKeeper(appCodec codec.BinaryCodec, legacyAmino *codec.LegacyAmino paramsKeeper.Subspace(crisistypes.ModuleName).WithKeyTable(crisistypes.ParamKeyTable()) // nolint: staticcheck // SA1019 paramsKeeper.Subspace(ibctransfertypes.ModuleName).WithKeyTable(ibctransfertypes.ParamKeyTable()) paramsKeeper.Subspace(ibcexported.ModuleName).WithKeyTable(ibctable) - paramsKeeper.Subspace(icacontrollertypes.SubModuleName) - paramsKeeper.Subspace(icahosttypes.SubModuleName) // akash params subspaces paramsKeeper.Subspace(dtypes.ModuleName).WithKeyTable(dv1beta.ParamKeyTable()) diff --git a/app/upgrades.go b/app/upgrades.go index d2dec88298..74e23dee1a 100644 --- a/app/upgrades.go +++ b/app/upgrades.go @@ -20,7 +20,12 @@ func (app *AkashApp) registerUpgradeHandlers() error { return nil } - currentHeight := app.CommitMultiStore().LastCommitID().Version + cms := app.CommitMultiStore() + if cms == nil { + return fmt.Errorf("unable to get CommitMultiStore") + } + + currentHeight := cms.LastCommitID().Version if upgradeInfo.Height == currentHeight+1 { app.customPreUpgradeHandler(upgradeInfo) diff --git a/go.mod b/go.mod index 00e2713afe..128f4a817f 100644 --- a/go.mod +++ b/go.mod @@ -47,8 +47,8 @@ require ( google.golang.org/grpc v1.75.0 gopkg.in/yaml.v3 v3.0.1 gotest.tools/v3 v3.5.2 - pkg.akt.dev/go v0.1.6-rc1 - pkg.akt.dev/go/cli v0.1.5-rc1 + pkg.akt.dev/go v0.1.6-rc3 + pkg.akt.dev/go/cli v0.1.5-rc3 pkg.akt.dev/go/sdl v0.1.1 ) @@ -61,7 +61,7 @@ replace ( // use akash fork of cometbft github.com/cometbft/cometbft => github.com/akash-network/cometbft v0.38.19-akash.1 // use akash fork of cosmos sdk - github.com/cosmos/cosmos-sdk => github.com/akash-network/cosmos-sdk v0.53.4-akash.b.10 + github.com/cosmos/cosmos-sdk => github.com/akash-network/cosmos-sdk v0.53.4-akash.10 github.com/cosmos/gogoproto => github.com/akash-network/gogoproto v1.7.0-akash.2 diff --git a/go.sum b/go.sum index 0fa7b39d04..61cedd0959 100644 --- a/go.sum +++ b/go.sum @@ -1285,8 +1285,8 @@ github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3 github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM= github.com/akash-network/cometbft v0.38.19-akash.1 h1:am45M/0vjs1FEwh1WiLv/cp92Yskj2Dls997phjnxso= github.com/akash-network/cometbft v0.38.19-akash.1/go.mod h1:UCu8dlHqvkAsmAFmWDRWNZJPlu6ya2fTWZlDrWsivwo= -github.com/akash-network/cosmos-sdk v0.53.4-akash.b.10 h1:zPQVFSuBQKE3orKGgePPLU6eWn7kTAMCfuqFFa1Gc3Y= -github.com/akash-network/cosmos-sdk v0.53.4-akash.b.10/go.mod h1:gZcyUJu6h94FfxgJbuBpiW7RPCFEV/+GJdy4UAJ3Y1Q= +github.com/akash-network/cosmos-sdk v0.53.4-akash.10 h1:8XyxL+VfqkdVYaDudk4lrNX9vH/n3JxRizcLQlUiC/o= +github.com/akash-network/cosmos-sdk v0.53.4-akash.10/go.mod h1:gZcyUJu6h94FfxgJbuBpiW7RPCFEV/+GJdy4UAJ3Y1Q= github.com/akash-network/gogoproto v1.7.0-akash.2 h1:zY5seM6kBOLMBWn15t8vrY1ao4J1HjrhNaEeO/Soro0= github.com/akash-network/gogoproto v1.7.0-akash.2/go.mod h1:yWChEv5IUEYURQasfyBW5ffkMHR/90hiHgbNgrtp4j0= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= @@ -3282,10 +3282,10 @@ nhooyr.io/websocket v1.8.17 h1:KEVeLJkUywCKVsnLIDlD/5gtayKp8VoCkksHCGGfT9Y= nhooyr.io/websocket v1.8.17/go.mod h1:rN9OFWIUwuxg4fR5tELlYC04bXYowCP9GX47ivo2l+c= pgregory.net/rapid v0.5.5 h1:jkgx1TjbQPD/feRoK+S/mXw9e1uj6WilpHrXJowi6oA= pgregory.net/rapid v0.5.5/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04= -pkg.akt.dev/go v0.1.6-rc1 h1:Bl1/tSPAyUnpPl/rv13pZqAZYp/a5ZNRbIOk6eSFRlw= -pkg.akt.dev/go v0.1.6-rc1/go.mod h1:lKU6b+hR+LAWslGemTYg8raiBHru4K1jolk+LDUU57Y= -pkg.akt.dev/go/cli v0.1.5-rc1 h1:g6AuRfwPZA0FpHo02tSeQvdLhvszRHoGb3VUdpgpoak= -pkg.akt.dev/go/cli v0.1.5-rc1/go.mod h1:G2PaN/gYDVDUuTF0TzQcQgx9Tn1iIx3Ca3kIF61sY2M= +pkg.akt.dev/go v0.1.6-rc3 h1:7w0TyrMLAJH7hOWTHOjCH69Ofh93DYWoSSeZWs1uG7E= +pkg.akt.dev/go v0.1.6-rc3/go.mod h1:XAwgUugjjoSqiUNM3Ph/jZMZxDbo6fhJpZlEk5XRmOk= +pkg.akt.dev/go/cli v0.1.5-rc3 h1:82X7H8LuSTftog1N70Zw4duwLMCGhUZHUsD19LhYcVE= +pkg.akt.dev/go/cli v0.1.5-rc3/go.mod h1:AJinKcxEzo/YTxvEcvQOnCoHeGXQh8FfZePy8Q3aJnc= pkg.akt.dev/go/sdl v0.1.1 h1:3CcAqWeKouFlvUSjQMktWLDqftOjn4cBX37TRFT7BRM= pkg.akt.dev/go/sdl v0.1.1/go.mod h1:ADsH8/kh61tWTax8nV0utelOaKWfU3qbG+OT3v9nmeY= pkg.akt.dev/specs v0.0.1 h1:OP0zil3Fr4kcCuybFqQ8LWgSlSP2Yn7306meWpu6/S4= diff --git a/make/init.mk b/make/init.mk index 6e7c8782bb..0f73f97b56 100644 --- a/make/init.mk +++ b/make/init.mk @@ -37,12 +37,6 @@ else endif ifneq ($(GOWORK),off) -# ifeq ($(shell test -e $(AKASH_ROOT)/go.work && echo -n yes),yes) -# GOWORK=${AKASH_ROOT}/go.work -# else -# GOWORK=off -# endif - ifeq ($(GOMOD),$(filter $(GOMOD),mod "")) $(error '-mod may only be set to readonly or vendor when in workspace mode, but it is set to ""') endif @@ -100,6 +94,9 @@ RELEASE_TAG ?= $(shell git describe --tags --abbrev=0) WASMVM_LIBS := libwasmvm_muslc.x86_64.a \ libwasmvm_muslc.aarch64.a \ -libwasmvmstatic_darwin.a +libwasmvmstatic_darwin.a \ +libwasmvm.aarch64.so \ +libwasmvm.dylib \ +libwasmvm.x86_64.so include $(AKASH_ROOT)/make/setup-cache.mk diff --git a/make/releasing.mk b/make/releasing.mk index 634f45299e..60ba53de7f 100644 --- a/make/releasing.mk +++ b/make/releasing.mk @@ -34,15 +34,15 @@ ifeq ($(GORELEASER_MOUNT_CONFIG),true) endif .PHONY: bins -bins: $(BINS) +bins: $(AKASH) .PHONY: build -build: +build: wasmvm-libs $(GO_BUILD) -a $(BUILD_FLAGS) ./... .PHONY: $(AKASH) $(AKASH): wasmvm-libs - $(GO_BUILD) -v -o $@ $(BUILD_FLAGS) ./cmd/akash + $(GO_BUILD) -v $(BUILD_FLAGS) -o $@ ./cmd/akash .PHONY: akash akash: $(AKASH) @@ -65,6 +65,7 @@ test-bins: wasmvm-libs docker run \ --rm \ -e MOD="$(GOMOD)" \ + -e STABLE=$(IS_STABLE) \ -e BUILD_TAGS="$(GORELEASER_TAGS)" \ -e BUILD_LDFLAGS="$(GORELEASER_LDFLAGS)" \ -e DOCKER_IMAGE=$(RELEASE_DOCKER_IMAGE) \ @@ -87,6 +88,7 @@ docker-image: wasmvm-libs docker run \ --rm \ -e MOD="$(GOMOD)" \ + -e STABLE=$(IS_STABLE) \ -e BUILD_TAGS="$(GORELEASER_TAGS)" \ -e BUILD_LDFLAGS="$(GORELEASER_LDFLAGS)" \ -e DOCKER_IMAGE=$(RELEASE_DOCKER_IMAGE) \ @@ -114,6 +116,7 @@ release: wasmvm-libs gen-changelog docker run \ --rm \ -e MOD="$(GOMOD)" \ + -e STABLE=$(IS_STABLE) \ -e BUILD_TAGS="$(GORELEASER_TAGS)" \ -e BUILD_LDFLAGS="$(GORELEASER_LDFLAGS)" \ -e GITHUB_TOKEN="$(GITHUB_TOKEN)" \ diff --git a/make/setup-cache.mk b/make/setup-cache.mk index 4def60c02c..2a2b019102 100644 --- a/make/setup-cache.mk +++ b/make/setup-cache.mk @@ -59,8 +59,22 @@ $(COSMOVISOR): $(COSMOVISOR_VERSION_FILE) cache-clean: rm -rf $(AKASH_DEVCACHE) -$(AKASH_DEVCACHE_LIB)/%.a: - wget -q --show-progress https://github.com/CosmWasm/wasmvm/releases/download/$(WASMVM_VERSION)/$*.a -O $(AKASH_DEVCACHE_LIB)/$*.a +$(AKASH_DEVCACHE_LIB)/%: + wget -q --show-progress https://github.com/CosmWasm/wasmvm/releases/download/$(WASMVM_VERSION)/$* -O $@ + @rm -f $(AKASH_DEVCACHE_LIB)/.wasmvm_verified +$(AKASH_DEVCACHE_LIB)/wasmvm_checksums.txt: + wget -q --show-progress https://github.com/CosmWasm/wasmvm/releases/download/$(WASMVM_VERSION)/checksums.txt -O $@ + @rm -f $(AKASH_DEVCACHE_LIB)/.wasmvm_verified + +$(AKASH_DEVCACHE_LIB)/.wasmvm_verified: $(patsubst %, $(AKASH_DEVCACHE_LIB)/%,$(WASMVM_LIBS)) $(AKASH_DEVCACHE_LIB)/wasmvm_checksums.txt + cd $(AKASH_DEVCACHE_LIB) && sha256sum -c --ignore-missing wasmvm_checksums.txt + @touch $@ + +.PHONY: wasmvm-libs-verify +wasmvm-libs-verify: + @$(MAKE) -s $(AKASH_DEVCACHE_LIB)/.wasmvm_verified + +.NOTPARALLEL: wasmvm-libs .PHONY: wasmvm-libs -wasmvm-libs: $(AKASH_DEVCACHE) $(patsubst %, $(AKASH_DEVCACHE_LIB)/%,$(WASMVM_LIBS)) +wasmvm-libs: $(AKASH_DEVCACHE) $(patsubst %, $(AKASH_DEVCACHE_LIB)/%,$(WASMVM_LIBS)) $(AKASH_DEVCACHE_LIB)/wasmvm_checksums.txt wasmvm-libs-verify diff --git a/make/test-integration.mk b/make/test-integration.mk index ee4b63bddb..23df9ecac4 100644 --- a/make/test-integration.mk +++ b/make/test-integration.mk @@ -7,28 +7,28 @@ TEST_MODULES ?= $(shell $(GO) list ./... | grep -v '/mocks') ############################################################################### .PHONY: test -test: - $(GO_TEST) -v -timeout 600s $(TEST_MODULES) +test: wasmvm-libs + $(GO_TEST) $(BUILD_FLAGS) -v -timeout 600s $(TEST_MODULES) .PHONY: test-nocache -test-nocache: - $(GO_TEST) -count=1 $(TEST_MODULES) +test-nocache: wasmvm-libs + $(GO_TEST) $(BUILD_FLAGS) -count=1 $(TEST_MODULES) .PHONY: test-full -test-full: - $(GO_TEST) -v -tags=$(BUILD_TAGS) $(TEST_MODULES) +test-full: wasmvm-libs + $(GO_TEST) -v $(BUILD_FLAGS) $(TEST_MODULES) .PHONY: test-integration test-integration: - $(GO_TEST) -v -tags="e2e.integration" $(TEST_MODULES) + $(GO_TEST) -v -tags="e2e.integration" -ldflags '$(ldflags)' $(TEST_MODULES) .PHONY: test-coverage -test-coverage: - $(GO_TEST) -tags=$(BUILD_MAINNET) -coverprofile=coverage.txt \ +test-coverage: wasmvm-libs + $(GO_TEST) $(BUILD_FLAGS) -coverprofile=coverage.txt \ -covermode=count \ -coverpkg="$(COVER_PACKAGES)" \ ./... .PHONY: test-vet -test-vet: - $(GO_VET) ./... +test-vet: wasmvm-libs + $(GO_VET) $(BUILD_FLAGS) ./... diff --git a/make/test-upgrade.mk b/make/test-upgrade.mk index 29fdad29de..04faf20390 100644 --- a/make/test-upgrade.mk +++ b/make/test-upgrade.mk @@ -21,7 +21,7 @@ UPGRADE_FROM := $(shell cat $(ROOT_DIR)/meta.json | jq -r --arg name GENESIS_BINARY_VERSION := $(shell cat $(ROOT_DIR)/meta.json | jq -r --arg name $(UPGRADE_TO) '.upgrades[$$name].from_binary' | tr -d '\n') UPGRADE_BINARY_VERSION ?= local -SNAPSHOT_SOURCE ?= sandbox1 +SNAPSHOT_SOURCE ?= sandbox ifeq ($(SNAPSHOT_SOURCE),mainnet) SNAPSHOT_NETWORK := akashnet-2 @@ -29,9 +29,6 @@ ifeq ($(SNAPSHOT_SOURCE),mainnet) else ifeq ($(SNAPSHOT_SOURCE),sandbox) SNAPSHOT_NETWORK := sandbox-2 CHAIN_METADATA_URL := https://raw.githubusercontent.com/akash-network/net/master/sandbox-2/meta.json -else ifeq ($(SNAPSHOT_SOURCE),sandbox1) - SNAPSHOT_NETWORK := sandbox-01 - CHAIN_METADATA_URL := https://raw.githubusercontent.com/akash-network/net/master/sandbox/meta.json else $(error "invalid snapshot source $(SNAPSHOT_SOURCE)") endif @@ -67,6 +64,7 @@ test: init $(GO_TEST) -run "^\QTestUpgrade\E$$" -tags e2e.upgrade -timeout 180m -v -args \ -cosmovisor=$(COSMOVISOR) \ -workdir=$(AP_RUN_DIR)/validators \ + -sourcesdir=$(AKASH_ROOT) \ -config=$(TEST_CONFIG) \ -upgrade-name=$(UPGRADE_TO) \ -upgrade-version="$(UPGRADE_BINARY_VERSION)" \ @@ -75,7 +73,7 @@ test: init .PHONY: test-reset test-reset: $(ROOT_DIR)/script/upgrades.sh --workdir=$(AP_RUN_DIR) --config="$(PWD)/config.json" --uto=$(UPGRADE_TO) --snapshot-url=$(SNAPSHOT_URL) --chain-meta=$(CHAIN_METADATA_URL) --max-validators=$(MAX_VALIDATORS) clean - #$(ROOT_DIR)/script/upgrades.sh --workdir=$(AP_RUN_DIR) --config="$(PWD)/config.json" --uto=$(UPGRADE_TO) --snapshot-url=$(SNAPSHOT_URL) --gbv=$(GENESIS_BINARY_VERSION) --chain-meta=$(CHAIN_METADATA_URL) bins + $(ROOT_DIR)/script/upgrades.sh --workdir=$(AP_RUN_DIR) --config="$(PWD)/config.json" --uto=$(UPGRADE_TO) --snapshot-url=$(SNAPSHOT_URL) --gbv=$(GENESIS_BINARY_VERSION) --chain-meta=$(CHAIN_METADATA_URL) bins $(ROOT_DIR)/script/upgrades.sh --workdir=$(AP_RUN_DIR) --config="$(PWD)/config.json" --uto=$(UPGRADE_TO) --snapshot-url=$(SNAPSHOT_URL) --chain-meta=$(CHAIN_METADATA_URL) keys $(ROOT_DIR)/script/upgrades.sh --workdir=$(AP_RUN_DIR) --config="$(PWD)/config.json" --state-config=$(STATE_CONFIG) --snapshot-url=$(SNAPSHOT_URL) --chain-meta=$(CHAIN_METADATA_URL) --max-validators=$(MAX_VALIDATORS) prepare-state diff --git a/meta.json b/meta.json index 5dc439ee52..ef73220d59 100644 --- a/meta.json +++ b/meta.json @@ -44,6 +44,11 @@ "skipped": false, "from_binary": "v0.38.6-rc2", "from_version": "v0.38.0" + }, + "v2.0.0": { + "skipped": false, + "from_binary": "v1.0.3-rc4", + "from_version": "v1.0.0" } } } diff --git a/script/upgrades.sh b/script/upgrades.sh index 97f209d606..8d24b51b38 100755 --- a/script/upgrades.sh +++ b/script/upgrades.sh @@ -548,7 +548,7 @@ function prepare_state() { valjson=$(cat "$valdir/validator.json") if [[ $cnt -gt 0 ]]; then if [[ $($semver compare "$akashversion" v1.0.0-rc0) -ge 0 ]]; then - $AKASH tx staking create-validator "$valjson" --home="$rvaldir" --from="validator$cnt" --yes + $AKASH tx staking create-validator "$valdir/validator.json" --home="$rvaldir" --from="validator$cnt" --yes else $AKASH tx staking create-validator \ --home="$rvaldir" \ diff --git a/tests/upgrade/config-v0.24.0.tmpl.json b/tests/upgrade/config-v0.24.0.tmpl.json deleted file mode 100644 index 6a67ae1dbc..0000000000 --- a/tests/upgrade/config-v0.24.0.tmpl.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "chain_id": "localakash", - "accounts": { - "add": [ - { - "address": "{{ (ds "account_address") }}", - "pubkey": {{ (ds "account_pubkey") }}, - "coins": [ - "2000000000000000uakt" - ] - } - ] - }, - "validators": { - "add": [ - { - "name": "upgrade-tester", - "pubkey": {{ (ds "validator_pubkey") }}, - "rates": { - "rate": "0.05", - "maxRate": "0.8", - "maxChangeRate": "0.1" - }, - "bonded": true, - "delegators": [ - { - "address": "{{ (ds "account_address") }}", - "coins": [ - "1950000000000000uakt" - ] - } - ] - } - ] - }, - "gov": { - "voting_params": { - "voting_period": "60s" - } - } -} diff --git a/tests/upgrade/sdktypes.go b/tests/upgrade/sdktypes.go new file mode 100644 index 0000000000..990506122c --- /dev/null +++ b/tests/upgrade/sdktypes.go @@ -0,0 +1,56 @@ +package upgrade + +import ( + "encoding/json" + + upgradetypes "cosmossdk.io/x/upgrade/types" + sdk "github.com/cosmos/cosmos-sdk/types" +) + +// These files defines sdk specific types necessary to perform upgrade simulation. +// we're not using SDK generated types to prevent import of different types of cosmos sdk + +type nodeStatus struct { + SyncInfo struct { + LatestBlockHeight string `json:"latest_block_height"` + CatchingUp bool `json:"catching_up"` + } `json:"sync_info"` +} + +type votingParams struct { + VotingPeriod string `json:"voting_period"` +} + +type depositParams struct { + MinDeposit sdk.Coins `json:"min_deposit"` +} + +type govParams struct { + VotingParams votingParams `json:"voting_params"` + DepositParams depositParams `json:"deposit_params"` +} + +type proposalResp struct { + ID string `json:"id"` + Title string `json:"title"` +} + +type proposalsResp struct { + Proposals []proposalResp `json:"proposals"` +} + +type SoftwareUpgradeProposal struct { + Type string `json:"@type"` + Authority string `json:"authority"` + Plan upgradetypes.Plan `json:"plan"` +} + +type ProposalMsg struct { + // Msgs defines an array of sdk.Msgs proto-JSON-encoded as Anys. + Messages []json.RawMessage `json:"messages,omitempty"` + Metadata string `json:"metadata"` + Deposit string `json:"deposit"` + Title string `json:"title"` + Summary string `json:"summary"` + Expedited bool `json:"expedited"` +} diff --git a/tests/upgrade/test-cases.json b/tests/upgrade/test-cases.json index 9edaacc110..657fe006af 100644 --- a/tests/upgrade/test-cases.json +++ b/tests/upgrade/test-cases.json @@ -1,4 +1,12 @@ { + "v2.0.0": { + "modules": { + "added": [ + "wasm", + "awasm" + ] + } + }, "v1.0.0": { "modules": { "added": [ diff --git a/tests/upgrade/test-config.json b/tests/upgrade/test-config.json index c6f36a4220..a9ec58b481 100644 --- a/tests/upgrade/test-config.json +++ b/tests/upgrade/test-config.json @@ -1,8 +1,7 @@ { "chain-id": "localakash", "validators": [ - ".akash0", - ".akash1" + ".akash0" ], "work": { "home": ".akash0", diff --git a/tests/upgrade/testdata/hackatom.wasm b/tests/upgrade/testdata/hackatom.wasm new file mode 100644 index 0000000000000000000000000000000000000000..5333788263dd98ea1769251ecfe1b9977269713c GIT binary patch literal 180690 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 Mzs3%IczNUh4Rp$Av;Y7A literal 0 HcmV?d00001 diff --git a/tests/upgrade/types/types.go b/tests/upgrade/types/types.go index cfc20f4cd5..5c5741a057 100644 --- a/tests/upgrade/types/types.go +++ b/tests/upgrade/types/types.go @@ -11,6 +11,7 @@ import ( type TestParams struct { Home string Node string + SourceDir string ChainID string KeyringBackend string From string diff --git a/tests/upgrade/upgrade_test.go b/tests/upgrade/upgrade_test.go index 5f78b96b22..a9c4e60e84 100644 --- a/tests/upgrade/upgrade_test.go +++ b/tests/upgrade/upgrade_test.go @@ -22,7 +22,7 @@ import ( "testing" "time" - sdkmath "cosmossdk.io/math" + upgradetypes "cosmossdk.io/x/upgrade/types" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "golang.org/x/mod/semver" @@ -131,42 +131,11 @@ type postUpgradeTestDone struct{} type eventShutdown struct{} -type votingParams struct { - VotingPeriod string `json:"voting_period"` -} - -type depositParams struct { - MinDeposit sdk.Coins `json:"min_deposit"` -} - -type govParams struct { - VotingParams votingParams `json:"voting_params"` - DepositParams depositParams `json:"deposit_params"` -} - -type proposalResp struct { - ProposalID string `json:"proposal_id"` - Content struct { - Title string `json:"title"` - } `json:"content"` -} - -type proposalsResp struct { - Proposals []proposalResp `json:"proposals"` -} - type wdReq struct { event watchdogCtrl resp chan<- struct{} } -type nodeStatus struct { - SyncInfo struct { - LatestBlockHeight string `json:"latest_block_height"` - CatchingUp bool `json:"catching_up"` - } `json:"SyncInfo"` -} - type testMigration struct { From string `json:"from"` To string `json:"to"` @@ -238,6 +207,7 @@ type upgradeTest struct { cancel context.CancelFunc group *errgroup.Group cmdr *commander + cacheDir string upgradeName string upgradeInfo string postUpgradeParams uttypes.TestParams @@ -261,6 +231,7 @@ type nodeInitParams struct { var ( workdir = flag.String("workdir", "", "work directory") + sourcesdir = flag.String("sourcesdir", "", "sources directory") config = flag.String("config", "", "config file") cosmovisor = flag.String("cosmovisor", "", "path to cosmovisor") upgradeVersion = flag.String("upgrade-version", "local", "akash release to download. local if it is built locally") @@ -297,6 +268,7 @@ func TestUpgrade(t *testing.T) { t.Log("detecting arguments") require.NotEqual(t, "", *workdir, "empty workdir flag") + require.NotEqual(t, "", *sourcesdir, "empty sourcesdir flag") require.NotEqual(t, "", *config, "empty config flag") require.NotEqual(t, "", *upgradeVersion, "empty upgrade-version flag") require.NotEqual(t, "", *upgradeName, "empty upgrade-name flag") @@ -312,6 +284,7 @@ func TestUpgrade(t *testing.T) { require.True(t, info.IsDir(), "workdir flag is not a dir") *workdir = strings.TrimSuffix(*workdir, "/") + *sourcesdir = strings.TrimSuffix(*sourcesdir, "/") info, err = os.Stat(*cosmovisor) require.NoError(t, err) @@ -373,9 +346,14 @@ func TestUpgrade(t *testing.T) { postUpgradeParams := uttypes.TestParams{} + var upgradeCache string for idx, name := range cfg.Validators { homedir := fmt.Sprintf("%s/%s", *workdir, name) + if idx == 0 { + upgradeCache = homedir + } + genesisBin := fmt.Sprintf("%s/cosmovisor/genesis/bin/akash", homedir) info, err = os.Stat(genesisBin) @@ -417,6 +395,7 @@ func TestUpgrade(t *testing.T) { t.Logf("validator address: \"%s\"", addr.String()) postUpgradeParams.Home = homedir + postUpgradeParams.SourceDir = *sourcesdir postUpgradeParams.ChainID = cfg.ChainID postUpgradeParams.Node = "tcp://127.0.0.1:26657" postUpgradeParams.KeyringBackend = "test" @@ -533,6 +512,7 @@ func TestUpgrade(t *testing.T) { ctx: ctx, group: group, cmdr: cmdr, + cacheDir: upgradeCache, upgradeName: *upgradeName, upgradeInfo: upgradeInfo, postUpgradeParams: postUpgradeParams, @@ -658,6 +638,18 @@ loop: return err } +type baseAccount struct { + Address string `json:"address"` +} + +type moduleAccount struct { + BaseAccount baseAccount `json:"base_account"` +} + +type accountResp struct { + Account moduleAccount `json:"account"` +} + func (l *upgradeTest) submitUpgradeProposal() error { var err error @@ -688,17 +680,29 @@ func (l *upgradeTest) submitUpgradeProposal() error { } } - tm := time.NewTimer(30 * time.Second) - select { - case <-l.ctx.Done(): - if !tm.Stop() { - <-tm.C - } - err = l.ctx.Err() + cmdRes, err = l.cmdr.execute(l.ctx, "query auth module-account gov") + if err != nil { + l.t.Logf("executing cmd failed: %s\n", string(cmdRes)) return err - case <-tm.C: } + macc := accountResp{} + err = json.Unmarshal(cmdRes, &macc) + if err != nil { + return err + } + + //tm := time.NewTimer(30 * time.Second) + //select { + //case <-l.ctx.Done(): + // if !tm.Stop() { + // <-tm.C + // } + // err = l.ctx.Err() + // return err + //case <-tm.C: + //} + cmdRes, err = l.cmdr.execute(l.ctx, "query gov params") if err != nil { l.t.Logf("executing cmd failed: %s\n", string(cmdRes)) @@ -712,13 +716,11 @@ func (l *upgradeTest) submitUpgradeProposal() error { return err } - votePeriod, valid := sdkmath.NewIntFromString(params.VotingParams.VotingPeriod) - if !valid { + votePeriod, err := time.ParseDuration(params.VotingParams.VotingPeriod) + if err != nil { return fmt.Errorf("invalid vote period value (%s)", params.VotingParams.VotingPeriod) } - votePeriod = votePeriod.QuoRaw(1e9) - cmdRes, err = l.cmdr.execute(l.ctx, "status") if err != nil { l.t.Logf("executing cmd failed: %s\n", string(cmdRes)) @@ -730,27 +732,55 @@ func (l *upgradeTest) submitUpgradeProposal() error { return err } - upgradeHeight, err := strconv.ParseUint(statusResp.SyncInfo.LatestBlockHeight, 10, 64) + upgradeHeight, err := strconv.ParseInt(statusResp.SyncInfo.LatestBlockHeight, 10, 64) + if err != nil { + return err + } + + upgradeHeight += int64(votePeriod/(6*time.Second)) + 10 + + upgradeProp := SoftwareUpgradeProposal{ + Type: "/cosmos.upgrade.v1beta1.MsgSoftwareUpgrade", + Authority: macc.Account.BaseAccount.Address, + Plan: upgradetypes.Plan{ + Name: l.upgradeName, + Height: upgradeHeight, + Info: l.upgradeInfo, + }, + } + + jup, err := json.Marshal(&upgradeProp) + if err != nil { + return err + } + + prop := &ProposalMsg{ + Messages: []json.RawMessage{ + jup, + }, + Deposit: params.DepositParams.MinDeposit[0].String(), + Title: l.upgradeName, + Summary: l.upgradeName, + Expedited: false, + } + + jProp, err := json.Marshal(prop) if err != nil { return err } - upgradeHeight += (votePeriod.Uint64() / 6) + 10 + propFile := fmt.Sprintf("%s/upgrade-prop-%s.json", l.cacheDir, l.upgradeName) + err = os.WriteFile(propFile, jProp, 0644) + if err != nil { + return err + } - l.t.Logf("voting period: %ss, curr height: %s, upgrade height: %d", + l.t.Logf("voting period: %s, curr height: %s, upgrade height: %d", votePeriod, statusResp.SyncInfo.LatestBlockHeight, upgradeHeight) - cmd := fmt.Sprintf(`tx gov submit-proposal software-upgrade %s --title=%[1]s --description="%[1]s" --upgrade-height=%d --deposit=%s`, - l.upgradeName, - upgradeHeight, - params.DepositParams.MinDeposit[0].String(), - ) - - if l.upgradeInfo != "" { - cmd += fmt.Sprintf(` --upgrade-info='%s'`, l.upgradeInfo) - } + cmd := fmt.Sprintf(`tx gov submit-proposal %s`, propFile) cmdRes, err = l.cmdr.execute(l.ctx, cmd) if err != nil { @@ -758,8 +788,8 @@ func (l *upgradeTest) submitUpgradeProposal() error { return err } - // give it two blocks to make sure proposal has been commited - tmctx, cancel := context.WithTimeout(l.ctx, 12*time.Second) + // give it two blocks to make sure a proposal has been commited + tmctx, cancel := context.WithTimeout(l.ctx, 18*time.Second) defer cancel() <-tmctx.Done() @@ -784,8 +814,8 @@ func (l *upgradeTest) submitUpgradeProposal() error { var propID string for i := len(proposals.Proposals) - 1; i >= 0; i-- { - if proposals.Proposals[i].Content.Title == l.upgradeName { - propID = proposals.Proposals[i].ProposalID + if proposals.Proposals[i].Title == l.upgradeName { + propID = proposals.Proposals[i].ID break } } diff --git a/tests/upgrade/workers_test.go b/tests/upgrade/workers_test.go index 0add097d74..a12b1d70da 100644 --- a/tests/upgrade/workers_test.go +++ b/tests/upgrade/workers_test.go @@ -4,141 +4,143 @@ package upgrade import ( "context" + "fmt" + "os" "testing" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + govv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" "github.com/stretchr/testify/require" - sdkmath "cosmossdk.io/math" + "github.com/CosmWasm/wasmd/x/wasm/ioutils" + wasmtypes "github.com/CosmWasm/wasmd/x/wasm/types" sdkclient "github.com/cosmos/cosmos-sdk/client" sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - govtypes "github.com/cosmos/cosmos-sdk/x/gov/types/v1" - stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - "pkg.akt.dev/go/cli/flags" - arpcclient "pkg.akt.dev/go/node/client" - aclient "pkg.akt.dev/go/node/client/discovery" + client "pkg.akt.dev/go/node/client/discovery" cltypes "pkg.akt.dev/go/node/client/types" - "pkg.akt.dev/go/node/client/v1beta3" + clt "pkg.akt.dev/go/node/client/v1beta3" + + cflags "pkg.akt.dev/go/cli/flags" + arpcclient "pkg.akt.dev/go/node/client" "pkg.akt.dev/go/sdkutil" - "pkg.akt.dev/node/v2/app" + akash "pkg.akt.dev/node/v2/app" uttypes "pkg.akt.dev/node/v2/tests/upgrade/types" ) func init() { - uttypes.RegisterPostUpgradeWorker("v1.0.0", &postUpgrade{}) + uttypes.RegisterPostUpgradeWorker("v2.0.0", &postUpgrade{}) } -type postUpgrade struct { - cl v1beta3.Client -} +type postUpgrade struct{} var _ uttypes.TestWorker = (*postUpgrade)(nil) func (pu *postUpgrade) Run(ctx context.Context, t *testing.T, params uttypes.TestParams) { - encodingConfig := sdkutil.MakeEncodingConfig() - app.ModuleBasics().RegisterInterfaces(encodingConfig.InterfaceRegistry) + encCfg := sdkutil.MakeEncodingConfig() + akash.ModuleBasics().RegisterInterfaces(encCfg.InterfaceRegistry) rpcClient, err := arpcclient.NewClient(ctx, params.Node) require.NoError(t, err) cctx := sdkclient.Context{}. - WithCodec(encodingConfig.Codec). - WithInterfaceRegistry(encodingConfig.InterfaceRegistry). - WithTxConfig(encodingConfig.TxConfig). - WithLegacyAmino(encodingConfig.Amino). + WithCodec(encCfg.Codec). + WithInterfaceRegistry(encCfg.InterfaceRegistry). + WithTxConfig(encCfg.TxConfig). + WithLegacyAmino(encCfg.Amino). WithAccountRetriever(authtypes.AccountRetriever{}). - WithBroadcastMode(flags.BroadcastBlock). + WithBroadcastMode(cflags.BroadcastBlock). WithHomeDir(params.Home). WithChainID(params.ChainID). WithNodeURI(params.Node). WithClient(rpcClient). WithSkipConfirmation(true). WithFrom(params.From). - WithFromName(params.From). - WithFromAddress(params.FromAddress). WithKeyringDir(params.Home). - WithSignModeStr(flags.SignModeDirect). - WithSimulation(false) + WithSignModeStr("direct") kr, err := sdkclient.NewKeyringFromBackend(cctx, params.KeyringBackend) require.NoError(t, err) cctx = cctx.WithKeyring(kr) + info, err := kr.Key(params.From) + require.NoError(t, err) + + mainAddr, err := info.GetAddress() + require.NoError(t, err) + + mainCctx := cctx.WithFromName(info.Name). + WithFromAddress(mainAddr) + opts := []cltypes.ClientOption{ cltypes.WithGasPrices("0.025uakt"), cltypes.WithGas(cltypes.GasSetting{Simulate: false, Gas: 1000000}), cltypes.WithGasAdjustment(2), } - pu.cl, err = aclient.DiscoverClient(ctx, cctx, opts...) + mcl, err := client.DiscoverClient(ctx, mainCctx, opts...) require.NoError(t, err) - require.NotNil(t, pu.cl) + require.NotNil(t, mcl) - pu.testGov(ctx, t) - - pu.testStaking(ctx, t) -} - -func (pu *postUpgrade) testGov(ctx context.Context, t *testing.T) { - t.Logf("testing gov module") - cctx := pu.cl.ClientContext() - - paramsResp, err := pu.cl.Query().Gov().Params(ctx, &govtypes.QueryParamsRequest{ParamsType: "deposit"}) + // should not be able to deploy smart contract directly + wasm, err := os.ReadFile(fmt.Sprintf("%s/tests/upgrade/testdata/hackatom.wasm", params.SourceDir)) require.NoError(t, err) - require.NotNil(t, paramsResp) - - // paramsResp.Params.ExpeditedMinDeposit. - require.Equal(t, sdk.Coins{sdk.NewCoin("uakt", sdkmath.NewInt(2000000000))}.String(), sdk.Coins(paramsResp.Params.ExpeditedMinDeposit).String(), "ExpeditedMinDeposit must have 2000AKT") - require.Equal(t, paramsResp.Params.MinInitialDepositRatio, sdkmath.LegacyNewDecWithPrec(40, 2).String(), "MinInitialDepositRatio must be 40%") - opAddr := sdk.ValAddress(cctx.FromAddress) + // gzip the wasm file + if ioutils.IsWasm(wasm) { + wasm, err = ioutils.GzipIt(wasm) + require.NoError(t, err) + } else { + require.True(t, ioutils.IsGzip(wasm)) + } - comVal := sdkmath.LegacyNewDecWithPrec(4, 2) + msg := &wasmtypes.MsgStoreCode{ + Sender: mainAddr.String(), + WASMByteCode: wasm, + InstantiatePermission: &wasmtypes.AllowNobody, + } - valResp, err := pu.cl.Query().Staking().Validator(ctx, &stakingtypes.QueryValidatorRequest{ValidatorAddr: opAddr.String()}) + err = msg.ValidateBasic() require.NoError(t, err) - minSelfDelegation := sdkmath.NewInt(1) - - tx := stakingtypes.NewMsgEditValidator(opAddr.String(), valResp.Validator.Description, &comVal, &minSelfDelegation) - broadcastResp, err := pu.cl.Tx().BroadcastMsgs(ctx, []sdk.Msg{tx}) + resp, err := mcl.Tx().BroadcastMsgs(ctx, []sdk.Msg{msg}) require.Error(t, err) - require.NotNil(t, broadcastResp) - - require.IsType(t, &sdk.TxResponse{}, broadcastResp) - txResp := broadcastResp.(*sdk.TxResponse) - require.NotEqual(t, uint32(0), txResp.Code, "update validator commission should fail if new value is < 5%") -} - -func (pu *postUpgrade) testStaking(ctx context.Context, t *testing.T) { - t.Logf("testing staking module") - - cctx := pu.cl.ClientContext() + require.NotNil(t, resp) + require.IsType(t, &sdk.TxResponse{}, resp) + require.ErrorIs(t, err, sdkerrors.ErrUnauthorized) - paramsResp, err := pu.cl.Query().Staking().Params(ctx, &stakingtypes.QueryParamsRequest{}) + govMsg, err := govv1.NewMsgSubmitProposal([]sdk.Msg{msg}, sdk.Coins{sdk.NewInt64Coin("uakt", 1000000000)}, mainCctx.GetFromAddress().String(), "", "test wasm store", "test wasm store", false) require.NoError(t, err) - require.NotNil(t, paramsResp) - require.True(t, paramsResp.Params.MinCommissionRate.GTE(sdkmath.LegacyNewDecWithPrec(5, 2)), "per upgrade v1.0.0 MinCommissionRate should be 5%") - - opAddr := sdk.ValAddress(cctx.FromAddress) + // sending contract via gov with sender not as the gov module account should fail as well + resp, err = mcl.Tx().BroadcastMsgs(ctx, []sdk.Msg{govMsg}) + require.Error(t, err) + require.NotNil(t, resp) + require.IsType(t, &sdk.TxResponse{}, resp) - comVal := sdkmath.LegacyNewDecWithPrec(4, 2) + qResp, err := mcl.Query().Auth().ModuleAccountByName(ctx, &authtypes.QueryModuleAccountByNameRequest{Name: "gov"}) + require.NoError(t, err) + require.NotNil(t, qResp) - valResp, err := pu.cl.Query().Staking().Validator(ctx, &stakingtypes.QueryValidatorRequest{ValidatorAddr: opAddr.String()}) + var acc sdk.AccountI + err = encCfg.InterfaceRegistry.UnpackAny(qResp.Account, &acc) require.NoError(t, err) + macc, ok := acc.(sdk.ModuleAccountI) + require.True(t, ok) - minSelfDelegation := sdkmath.NewInt(1) + err = encCfg.InterfaceRegistry.UnpackAny(qResp.Account, &macc) + require.NoError(t, err) + msg.Sender = macc.GetAddress().String() - tx := stakingtypes.NewMsgEditValidator(opAddr.String(), valResp.Validator.Description, &comVal, &minSelfDelegation) - broadcastResp, err := pu.cl.Tx().BroadcastMsgs(ctx, []sdk.Msg{tx}) - require.Error(t, err) - require.NotNil(t, broadcastResp) + govMsg, err = govv1.NewMsgSubmitProposal([]sdk.Msg{msg}, sdk.Coins{sdk.NewInt64Coin("uakt", 1000000000)}, mainCctx.GetFromAddress().String(), "", "test wasm store", "test wasm store", false) + require.NoError(t, err) - require.IsType(t, &sdk.TxResponse{}, broadcastResp) - txResp := broadcastResp.(*sdk.TxResponse) - require.NotEqual(t, uint32(0), txResp.Code, "update validator commission should fail if new value is < 5%") + // sending contract via gov with sender as the gov module account shall pass + resp, err = mcl.Tx().BroadcastMsgs(ctx, []sdk.Msg{govMsg}, clt.WithGas(cltypes.GasSetting{Simulate: true})) + require.NoError(t, err) + require.NotNil(t, resp) + require.IsType(t, &sdk.TxResponse{}, resp) } diff --git a/testutil/sims/simulation_helpers.go b/testutil/sims/simulation_helpers.go index 6876fde201..b9614ffaee 100644 --- a/testutil/sims/simulation_helpers.go +++ b/testutil/sims/simulation_helpers.go @@ -21,7 +21,7 @@ import ( ) // SetupSimulation creates the config, db (levelDB), temporary directory and logger for the simulation tests. -// If `skip` is false it skips the current test. `skip` should be set using the `FlagEnabledValue` flag. +// If `skip` is false, it skips the current test. `skip` should be set using the `FlagEnabledValue` flag. // Returns error on an invalid db instantiation or temp dir creation. func SetupSimulation(config simtypes.Config, dirPrefix, dbName string, verbose, skip bool) (dbm.DB, string, log.Logger, bool, error) { if !skip { @@ -56,7 +56,7 @@ func SimulationOperations(app runtime.AppI, cdc codec.JSONCodec, config simtypes } // BuildSimulationOperations retrieves the simulation params from the provided file path -// and returns all the modules weighted operations +// and returns all the module-weighted operations func BuildSimulationOperations(app runtime.AppI, cdc codec.JSONCodec, config simtypes.Config, txConfig client.TxConfig) []simtypes.WeightedOperation { simState := module.SimulationState{ AppParams: make(simtypes.AppParams), @@ -196,8 +196,8 @@ func getDiffFromKVPair(kvAs, kvBs []kv.Pair) (diffA, diffB []kv.Pair) { } index := make(map[string][]byte, len(kvBs)) - for _, kv := range kvBs { - index[string(kv.Key)] = kv.Value + for _, pair := range kvBs { + index[string(pair.Key)] = pair.Value } for _, kvA := range kvAs { diff --git a/upgrades/software/v2.0.0/upgrade.go b/upgrades/software/v2.0.0/upgrade.go index 224e86b303..7df10c36af 100644 --- a/upgrades/software/v2.0.0/upgrade.go +++ b/upgrades/software/v2.0.0/upgrade.go @@ -9,7 +9,6 @@ import ( "cosmossdk.io/log" storetypes "cosmossdk.io/store/types" upgradetypes "cosmossdk.io/x/upgrade/types" - "github.com/CosmWasm/wasmd/x/wasm" wasmtypes "github.com/CosmWasm/wasmd/x/wasm/types" "github.com/cosmos/cosmos-sdk/types/module" @@ -42,8 +41,6 @@ func (up *upgrade) StoreLoader() *storetypes.StoreUpgrades { return &storetypes.StoreUpgrades{ Added: []string{ awasm.StoreKey, - // With the migrations of all modules away from x/params, the crisis module now has a store. - // The store must be created during a chain upgrade to v0.53.x. wasmtypes.StoreKey, }, Deleted: []string{}, @@ -61,11 +58,14 @@ func (up *upgrade) UpgradeHandler() upgradetypes.UpgradeHandler { // and then override it after. // Set the initial wasm module version - fromVM[wasmtypes.ModuleName] = wasm.AppModule{}.ConsensusVersion() + //fromVM[wasmtypes.ModuleName] = wasm.AppModule{}.ConsensusVersion() - // Set default wasm params - params := wasmtypes.DefaultParams() + toVM, err := up.MM.RunMigrations(ctx, up.Configurator, fromVM) + if err != nil { + return toVM, err + } + params := up.Keepers.Cosmos.Wasm.GetParams(ctx) // Configure code upload access - RESTRICTED TO GOVERNANCE ONLY // Only governance proposals can upload contract code // This provides maximum security for mainnet deployment @@ -73,15 +73,14 @@ func (up *upgrade) UpgradeHandler() upgradetypes.UpgradeHandler { Permission: wasmtypes.AccessTypeNobody, } - params.CodeUploadAccess = wasmtypes.AllowNobody // Configure instantiate default permission params.InstantiateDefaultPermission = wasmtypes.AccessTypeEverybody - err := up.Keepers.Cosmos.Wasm.SetParams(ctx, params) + err = up.Keepers.Cosmos.Wasm.SetParams(ctx, params) if err != nil { - return fromVM, err + return toVM, err } - return up.MM.RunMigrations(ctx, up.Configurator, fromVM) + return toVM, err } } diff --git a/wasmvm.go b/wasmvm.go new file mode 100644 index 0000000000..e745e2390e --- /dev/null +++ b/wasmvm.go @@ -0,0 +1,3 @@ +package node + +// #cgo LDFLAGS: -Wl,-rpath,${SRCDIR}/.cache/lib -L${SRCDIR}/.cache/lib diff --git a/x/audit/module.go b/x/audit/module.go index a8b6c73a67..c70f068c21 100644 --- a/x/audit/module.go +++ b/x/audit/module.go @@ -35,17 +35,17 @@ var ( _ module.AppModuleSimulation = AppModule{} ) -// AppModuleBasic defines the basic application module used by the provider module. +// AppModuleBasic defines the basic application module used by the audit module. type AppModuleBasic struct { cdc codec.Codec } -// Name returns provider module's name +// Name returns audit module's name func (AppModuleBasic) Name() string { return types.ModuleName } -// RegisterLegacyAminoCodec registers the provider module's types for the given codec. +// RegisterLegacyAminoCodec registers the audit module's types for the given codec. func (AppModuleBasic) RegisterLegacyAminoCodec(cdc *codec.LegacyAmino) { types.RegisterLegacyAminoCodec(cdc) // nolint: staticcheck } @@ -55,8 +55,7 @@ func (b AppModuleBasic) RegisterInterfaces(registry cdctypes.InterfaceRegistry) types.RegisterInterfaces(registry) } -// DefaultGenesis returns default genesis state as raw bytes for the provider -// module. +// DefaultGenesis returns default genesis state as raw bytes for the audit module. func (AppModuleBasic) DefaultGenesis(cdc codec.JSONCodec) json.RawMessage { return cdc.MustMarshalJSON(DefaultGenesisState()) } @@ -84,7 +83,7 @@ func (AppModuleBasic) ValidateGenesis(cdc codec.JSONCodec, _ client.TxEncodingCo // rest.RegisterRoutes(clientCtx, rtr, StoreKey) // } -// RegisterGRPCGatewayRoutes registers the gRPC Gateway routes for the provider module. +// RegisterGRPCGatewayRoutes registers the gRPC Gateway routes for the audit module. func (AppModuleBasic) RegisterGRPCGatewayRoutes(clientCtx client.Context, mux *runtime.ServeMux) { err := types.RegisterQueryHandlerClient(context.Background(), mux, types.NewQueryClient(clientCtx)) if err != nil { @@ -166,7 +165,7 @@ func (am AppModule) BeginBlock(_ context.Context) error { return nil } -// EndBlock returns the end blocker for the deployment module. It returns no validator +// EndBlock returns the end blocker for the audit module. It returns no validator // updates. func (am AppModule) EndBlock(_ context.Context) error { return nil diff --git a/x/cert/module.go b/x/cert/module.go index 637e80ade8..b4edb9898e 100644 --- a/x/cert/module.go +++ b/x/cert/module.go @@ -35,23 +35,23 @@ var ( _ module.AppModuleSimulation = AppModule{} ) -// AppModuleBasic defines the basic application module used by the provider module. +// AppModuleBasic defines the basic application module used by the cert module. type AppModuleBasic struct { cdc codec.Codec } -// AppModule implements an application module for the audit module. +// AppModule implements an application module for the cert module. type AppModule struct { AppModuleBasic keeper keeper.Keeper } -// Name returns provider module's name +// Name returns cert module's name func (AppModuleBasic) Name() string { return types.ModuleName } -// RegisterLegacyAminoCodec registers the provider module's types for the given codec. +// RegisterLegacyAminoCodec registers the cert module's types for the given codec. func (AppModuleBasic) RegisterLegacyAminoCodec(cdc *codec.LegacyAmino) { types.RegisterLegacyAminoCodec(cdc) // nolint: staticcheck } @@ -61,8 +61,7 @@ func (b AppModuleBasic) RegisterInterfaces(registry cdctypes.InterfaceRegistry) types.RegisterInterfaces(registry) } -// DefaultGenesis returns default genesis state as raw bytes for the provider -// module. +// DefaultGenesis returns default genesis state as raw bytes for the cert module. func (AppModuleBasic) DefaultGenesis(cdc codec.JSONCodec) json.RawMessage { return cdc.MustMarshalJSON(DefaultGenesisState()) } @@ -83,7 +82,7 @@ func (AppModuleBasic) ValidateGenesis(cdc codec.JSONCodec, _ client.TxEncodingCo return ValidateGenesis(&data) } -// RegisterGRPCGatewayRoutes registers the gRPC Gateway routes for the provider module. +// RegisterGRPCGatewayRoutes registers the gRPC Gateway routes for the cert module. func (AppModuleBasic) RegisterGRPCGatewayRoutes(clientCtx client.Context, mux *runtime.ServeMux) { err := types.RegisterQueryHandlerClient(context.Background(), mux, types.NewQueryClient(clientCtx)) if err != nil { @@ -136,7 +135,7 @@ func (am AppModule) BeginBlock(_ context.Context) error { return nil } -// EndBlock returns the end blocker for the deployment module. It returns no validator +// EndBlock returns the end blocker for the cert module. It returns no validator // updates. func (am AppModule) EndBlock(_ context.Context) error { return nil diff --git a/x/escrow/module.go b/x/escrow/module.go index 8558331705..c39faeaa1e 100644 --- a/x/escrow/module.go +++ b/x/escrow/module.go @@ -37,17 +37,17 @@ var ( _ module.AppModuleSimulation = AppModule{} ) -// AppModuleBasic defines the basic application module used by the provider module. +// AppModuleBasic defines the basic application module used by the escrow module. type AppModuleBasic struct { cdc codec.Codec } -// Name returns provider module's name +// Name returns escrow module's name func (AppModuleBasic) Name() string { return emodule.ModuleName } -// RegisterLegacyAminoCodec registers the provider module's types for the given codec. +// RegisterLegacyAminoCodec registers the escrow module's types for the given codec. func (AppModuleBasic) RegisterLegacyAminoCodec(cdc *codec.LegacyAmino) { v1.RegisterLegacyAminoCodec(cdc) } @@ -57,8 +57,7 @@ func (b AppModuleBasic) RegisterInterfaces(registry cdctypes.InterfaceRegistry) v1.RegisterInterfaces(registry) } -// DefaultGenesis returns default genesis state as raw bytes for the provider -// module. +// DefaultGenesis returns default genesis state as raw bytes for the escrow module. func (AppModuleBasic) DefaultGenesis(cdc codec.JSONCodec) json.RawMessage { return cdc.MustMarshalJSON(DefaultGenesisState()) } @@ -84,7 +83,7 @@ func (AppModuleBasic) RegisterRESTRoutes(clientCtx client.Context, rtr *mux.Rout rest.RegisterRoutes(clientCtx, rtr, emodule.StoreKey) } -// RegisterGRPCGatewayRoutes registers the gRPC Gateway routes for the provider module. +// RegisterGRPCGatewayRoutes registers the gRPC Gateway routes for the escrow module. func (AppModuleBasic) RegisterGRPCGatewayRoutes(clientCtx client.Context, mux *runtime.ServeMux) { err := v1.RegisterQueryHandlerClient(context.Background(), mux, v1.NewQueryClient(clientCtx)) if err != nil { @@ -162,7 +161,7 @@ func (am AppModule) BeginBlock(_ context.Context) error { return nil } -// EndBlock returns the end blocker for the deployment module. It returns no validator +// EndBlock returns the end blocker for the escrow module. It returns no validator // updates. func (am AppModule) EndBlock(_ context.Context) error { return nil diff --git a/x/market/module.go b/x/market/module.go index d0ac7a9542..ca360a3fa1 100644 --- a/x/market/module.go +++ b/x/market/module.go @@ -156,7 +156,7 @@ func (am AppModule) BeginBlock(_ context.Context) error { return nil } -// EndBlock returns the end blocker for the deployment module. It returns no validator +// EndBlock returns the end blocker for the market module. It returns no validator // updates. func (am AppModule) EndBlock(_ context.Context) error { return nil diff --git a/x/provider/module.go b/x/provider/module.go index ecb40fafcb..5338be45b4 100644 --- a/x/provider/module.go +++ b/x/provider/module.go @@ -69,8 +69,7 @@ func (b AppModuleBasic) RegisterInterfaces(registry cdctypes.InterfaceRegistry) types.RegisterInterfaces(registry) } -// DefaultGenesis returns default genesis state as raw bytes for the provider -// module. +// DefaultGenesis returns default genesis state as raw bytes for the provider module. func (AppModuleBasic) DefaultGenesis(cdc codec.JSONCodec) json.RawMessage { return cdc.MustMarshalJSON(DefaultGenesisState()) } @@ -143,7 +142,7 @@ func (am AppModule) BeginBlock(_ context.Context) error { return nil } -// EndBlock returns the end blocker for the deployment module. It returns no validator +// EndBlock returns the end blocker for the provider module. It returns no validator // updates. func (am AppModule) EndBlock(_ context.Context) error { return nil diff --git a/x/take/module.go b/x/take/module.go index 7aba9ede8a..62e9130c80 100644 --- a/x/take/module.go +++ b/x/take/module.go @@ -34,7 +34,7 @@ var ( _ module.AppModuleSimulation = AppModule{} ) -// AppModuleBasic defines the basic application module used by the provider module. +// AppModuleBasic defines the basic application module used by the take module. type AppModuleBasic struct { cdc codec.Codec } @@ -45,12 +45,12 @@ type AppModule struct { keeper keeper.IKeeper } -// Name returns provider module's name +// Name returns take module's name func (AppModuleBasic) Name() string { return types.ModuleName } -// RegisterLegacyAminoCodec registers the provider module's types for the given codec. +// RegisterLegacyAminoCodec registers the take module's types for the given codec. func (AppModuleBasic) RegisterLegacyAminoCodec(cdc *codec.LegacyAmino) { types.RegisterLegacyAminoCodec(cdc) // nolint staticcheck } @@ -60,8 +60,7 @@ func (b AppModuleBasic) RegisterInterfaces(registry cdctypes.InterfaceRegistry) types.RegisterInterfaces(registry) } -// DefaultGenesis returns default genesis state as raw bytes for the provider -// module. +// DefaultGenesis returns default genesis state as raw bytes for the take module. func (AppModuleBasic) DefaultGenesis(cdc codec.JSONCodec) json.RawMessage { return cdc.MustMarshalJSON(DefaultGenesisState()) } @@ -82,7 +81,7 @@ func (AppModuleBasic) ValidateGenesis(cdc codec.JSONCodec, _ client.TxEncodingCo return ValidateGenesis(&data) } -// RegisterGRPCGatewayRoutes registers the gRPC Gateway routes for the provider module. +// RegisterGRPCGatewayRoutes registers the gRPC Gateway routes for the take module. func (AppModuleBasic) RegisterGRPCGatewayRoutes(cctx client.Context, mux *runtime.ServeMux) { if err := types.RegisterQueryHandlerClient(context.Background(), mux, types.NewQueryClient(cctx)); err != nil { panic(err) @@ -135,7 +134,7 @@ func (am AppModule) BeginBlock(_ context.Context) error { return nil } -// EndBlock returns the end blocker for the deployment module. It returns no validator +// EndBlock returns the end blocker for the take module. It returns no validator // updates. func (am AppModule) EndBlock(_ context.Context) error { return nil diff --git a/x/wasm/alias.go b/x/wasm/alias.go index 0a1fa05c61..56f36b6779 100644 --- a/x/wasm/alias.go +++ b/x/wasm/alias.go @@ -5,7 +5,7 @@ import ( ) const ( - // StoreKey represents storekey of take module + // StoreKey represents storekey of wasm module StoreKey = types.StoreKey // ModuleName represents current module name ModuleName = types.ModuleName diff --git a/x/wasm/genesis.go b/x/wasm/genesis.go index f1bffe9d49..c08296b14e 100644 --- a/x/wasm/genesis.go +++ b/x/wasm/genesis.go @@ -20,15 +20,16 @@ func ValidateGenesis(data *types.GenesisState) error { // DefaultGenesisState returns default genesis state as raw bytes for the deployment // module. func DefaultGenesisState() *types.GenesisState { + params := types.DefaultParams() + params.BlockedAddresses = []string{ + authtypes.NewModuleAddress(govtypes.ModuleName).String(), + authtypes.NewModuleAddress(distrtypes.ModuleName).String(), + authtypes.NewModuleAddress(stakingtypes.BondedPoolName).String(), + authtypes.NewModuleAddress(stakingtypes.NotBondedPoolName).String(), + } + return &types.GenesisState{ - Params: types.Params{ - BlockedAddresses: []string{ - authtypes.NewModuleAddress(govtypes.ModuleName).String(), - authtypes.NewModuleAddress(distrtypes.ModuleName).String(), - authtypes.NewModuleAddress(stakingtypes.BondedPoolName).String(), - authtypes.NewModuleAddress(stakingtypes.NotBondedPoolName).String(), - }, - }, + Params: params, } } diff --git a/x/wasm/keeper/msg_filter.go b/x/wasm/keeper/msg_filter.go index df2c2fc307..afd8230fa9 100644 --- a/x/wasm/keeper/msg_filter.go +++ b/x/wasm/keeper/msg_filter.go @@ -92,10 +92,19 @@ func (k *keeper) FilterMessage(sctx sdk.Context, contractAddr sdk.AccAddress, ms ) } - // ALLOW IBC messages (for DeFi composability) + // BLOCK IBC messages if msg.IBC != nil { - // IBC allowed in Phase 1 - return nil + return errorsmod.Wrap( + sdkerrors.ErrUnauthorized, + "IBC messages not allowed", + ) + } + + if msg.IBC2 != nil { + return errorsmod.Wrap( + sdkerrors.ErrUnauthorized, + "IBC2 messages not allowed", + ) } // BLOCK Custom messages (no Akash bindings) @@ -120,7 +129,11 @@ func (k *keeper) FilterMessage(sctx sdk.Context, contractAddr sdk.AccAddress, ms return nil } - return nil + // BLOCK unknown/unhandled message types + return errorsmod.Wrap( + sdkerrors.ErrUnauthorized, + "Unknown message type not allowed", + ) } // filterBankMessage applies restrictions to bank operations @@ -175,6 +188,9 @@ func getMessageType(msg wasmvmtypes.CosmosMsg) string { if msg.IBC != nil { return "ibc" } + if msg.IBC2 != nil { + return "ibc2" + } if msg.Wasm != nil { return "wasm" } diff --git a/x/wasm/module.go b/x/wasm/module.go index ef6ae1dc0d..970fcd4c41 100644 --- a/x/wasm/module.go +++ b/x/wasm/module.go @@ -35,23 +35,23 @@ var ( _ module.AppModuleSimulation = AppModule{} ) -// AppModuleBasic defines the basic application module used by the provider module. +// AppModuleBasic defines the basic application module used by the wasm module. type AppModuleBasic struct { cdc codec.Codec } -// AppModule implements an application module for the take module. +// AppModule implements an application module for the wasm module. type AppModule struct { AppModuleBasic keeper keeper.Keeper } -// Name returns provider module's name +// Name returns wasm module's name func (AppModuleBasic) Name() string { return types.ModuleName } -// RegisterLegacyAminoCodec registers the provider module's types for the given codec. +// RegisterLegacyAminoCodec registers the wasm module's types for the given codec. func (AppModuleBasic) RegisterLegacyAminoCodec(cdc *codec.LegacyAmino) { types.RegisterLegacyAminoCodec(cdc) // nolint staticcheck } @@ -61,8 +61,7 @@ func (b AppModuleBasic) RegisterInterfaces(registry cdctypes.InterfaceRegistry) types.RegisterInterfaces(registry) } -// DefaultGenesis returns default genesis state as raw bytes for the provider -// module. +// DefaultGenesis returns default genesis state as raw bytes for the wasm module. func (AppModuleBasic) DefaultGenesis(cdc codec.JSONCodec) json.RawMessage { return cdc.MustMarshalJSON(DefaultGenesisState()) } @@ -83,7 +82,7 @@ func (AppModuleBasic) ValidateGenesis(cdc codec.JSONCodec, _ client.TxEncodingCo return ValidateGenesis(&data) } -// RegisterGRPCGatewayRoutes registers the gRPC Gateway routes for the provider module. +// RegisterGRPCGatewayRoutes registers the gRPC Gateway routes for the wasm module. func (AppModuleBasic) RegisterGRPCGatewayRoutes(cctx client.Context, mux *runtime.ServeMux) { if err := types.RegisterQueryHandlerClient(context.Background(), mux, types.NewQueryClient(cctx)); err != nil { panic(err) @@ -92,12 +91,12 @@ func (AppModuleBasic) RegisterGRPCGatewayRoutes(cctx client.Context, mux *runtim // GetQueryCmd returns the root query command of this module func (AppModuleBasic) GetQueryCmd() *cobra.Command { - return nil + panic("akash modules do not export cli commands via cosmos interface") } // GetTxCmd returns the transaction commands for this module func (AppModuleBasic) GetTxCmd() *cobra.Command { - return nil + panic("akash modules do not export cli commands via cosmos interface") } // NewAppModule creates a new AppModule object @@ -119,7 +118,7 @@ func (am AppModule) IsOnePerModuleType() {} // IsAppModule implements the appmodule.AppModule interface. func (am AppModule) IsAppModule() {} -// QuerierRoute returns the take module's querier route name. +// QuerierRoute returns the wasm module's querier route name. func (am AppModule) QuerierRoute() string { return types.ModuleName } @@ -136,13 +135,13 @@ func (am AppModule) BeginBlock(_ context.Context) error { return nil } -// EndBlock returns the end blocker for the deployment module. It returns no validator +// EndBlock returns the end blocker for the wasm module. It returns no validator // updates. func (am AppModule) EndBlock(_ context.Context) error { return nil } -// InitGenesis performs genesis initialization for the take module. It returns +// InitGenesis performs genesis initialization for the wasm module. It returns // no validator updates. func (am AppModule) InitGenesis(ctx sdk.Context, cdc codec.JSONCodec, data json.RawMessage) { var genesisState types.GenesisState @@ -150,7 +149,7 @@ func (am AppModule) InitGenesis(ctx sdk.Context, cdc codec.JSONCodec, data json. InitGenesis(ctx, am.keeper, &genesisState) } -// ExportGenesis returns the exported genesis state as raw bytes for the take +// ExportGenesis returns the exported genesis state as raw bytes for the wasm // module. func (am AppModule) ExportGenesis(ctx sdk.Context, cdc codec.JSONCodec) json.RawMessage { gs := ExportGenesis(ctx, am.keeper) diff --git a/x/wasm/simulation/proposals.go b/x/wasm/simulation/proposals.go index 43898078ce..bd76c12b01 100644 --- a/x/wasm/simulation/proposals.go +++ b/x/wasm/simulation/proposals.go @@ -35,20 +35,6 @@ func SimulateMsgUpdateParams(r *rand.Rand, _ sdk.Context, _ []simtypes.Account) params := types.DefaultParams() - coins := simtypes.RandSubsetCoins(r, sdk.Coins{ - sdk.NewInt64Coin("ibc/12C6A0C374171B595A0A9E18B83FA09D295FB1F2D8C6DAA3AC28683471752D84", int64(simtypes.RandIntBetween(r, 500000, 50000000))), - sdk.NewInt64Coin("ibc/12C6A0C374171B595A0A9E18B83FA09D295FB1F2D8C6DAA3AC28683471752D85", int64(simtypes.RandIntBetween(r, 500000, 50000000))), - sdk.NewInt64Coin("ibc/12C6A0C374171B595A0A9E18B83FA09D295FB1F2D8C6DAA3AC28683471752D86", int64(simtypes.RandIntBetween(r, 500000, 50000000))), - sdk.NewInt64Coin("ibc/12C6A0C374171B595A0A9E18B83FA09D295FB1F2D8C6DAA3AC28683471752D87", int64(simtypes.RandIntBetween(r, 500000, 50000000))), - sdk.NewInt64Coin("ibc/12C6A0C374171B595A0A9E18B83FA09D295FB1F2D8C6DAA3AC28683471752D88", int64(simtypes.RandIntBetween(r, 500000, 50000000))), - sdk.NewInt64Coin("ibc/12C6A0C374171B595A0A9E18B83FA09D295FB1F2D8C6DAA3AC28683471752D89", int64(simtypes.RandIntBetween(r, 500000, 50000000))), - sdk.NewInt64Coin("ibc/12C6A0C374171B595A0A9E18B83FA09D295FB1F2D8C6DAA3AC28683471752D8A", int64(simtypes.RandIntBetween(r, 500000, 50000000))), - sdk.NewInt64Coin("ibc/12C6A0C374171B595A0A9E18B83FA09D295FB1F2D8C6DAA3AC28683471752D8B", int64(simtypes.RandIntBetween(r, 500000, 50000000))), - }) - - // uakt must always be present - coins = append(coins, sdk.NewInt64Coin("uakt", int64(simtypes.RandIntBetween(r, 500000, 50000000)))) - return &types.MsgUpdateParams{ Authority: authority.String(), Params: params, From 1e1f373a4936847ab474e5e51d462ab60cd27a35 Mon Sep 17 00:00:00 2001 From: Artur Troian Date: Fri, 14 Nov 2025 10:47:00 -0600 Subject: [PATCH 6/6] fix(app): ignore default options returned by appOpts Signed-off-by: Artur Troian --- app/app.go | 3 --- 1 file changed, 3 deletions(-) diff --git a/app/app.go b/app/app.go index 9a77025c88..29c25a32cc 100644 --- a/app/app.go +++ b/app/app.go @@ -6,7 +6,6 @@ import ( "net/http" "os" "path/filepath" - "reflect" "time" "github.com/gorilla/mux" @@ -140,8 +139,6 @@ func NewApp( if val := appOpts.Get("wasm"); val != nil { if vl, valid := val.([]wasmkeeper.Option); valid { wasmOpts = append(wasmOpts, vl...) - } else { - panic(fmt.Sprintf("invalid type for aptOpts.Get(\"wasm\"). expected %s, actual %s", reflect.TypeOf(wasmOpts).String(), reflect.TypeOf(val).String())) } }