From 270ea303b2a706d1d7e03e51c2678cd40385dd50 Mon Sep 17 00:00:00 2001 From: pinosu <95283998+pinosu@users.noreply.github.com> Date: Thu, 6 Jul 2023 13:07:48 +0200 Subject: [PATCH 1/2] Upgrade to wasmvm 1.3.0-rc.0 (#1486) * Upgrade to wasmvm 1.3.0-rc.0 * Fix comments (cherry picked from commit 1a5a2d96e5fa1ae08d03745e1e9ef9c5d6886f52) # Conflicts: # README.md # go.sum # x/wasm/client/cli/gov_tx.go # x/wasm/keeper/genesis_test.go # x/wasm/keeper/snapshotter_integration_test.go --- Dockerfile | 8 +-- README.md | 5 ++ go.mod | 2 +- go.sum | 5 ++ x/wasm/client/cli/gov_tx.go | 12 +++- x/wasm/keeper/genesis_test.go | 17 ++++- x/wasm/keeper/keeper.go | 4 +- x/wasm/keeper/keeper_test.go | 4 +- x/wasm/keeper/msg_server_integration_test.go | 11 +-- x/wasm/keeper/proposal_integration_test.go | 6 +- x/wasm/keeper/snapshotter.go | 2 +- x/wasm/keeper/snapshotter_integration_test.go | 14 +++- x/wasm/keeper/wasmtesting/mock_engine.go | 67 ++++++++++-------- x/wasm/types/test_fixtures.go | 23 +++--- x/wasm/types/testdata/reflect.wasm | Bin 0 -> 257191 bytes x/wasm/types/wasmer_engine.go | 16 +++++ 16 files changed, 138 insertions(+), 58 deletions(-) create mode 100644 x/wasm/types/testdata/reflect.wasm diff --git a/Dockerfile b/Dockerfile index e96b6f638b..2feb3b3285 100644 --- a/Dockerfile +++ b/Dockerfile @@ -15,10 +15,10 @@ RUN apk add git WORKDIR /code COPY . /code/ # See https://github.com/CosmWasm/wasmvm/releases -ADD https://github.com/CosmWasm/wasmvm/releases/download/v1.2.4/libwasmvm_muslc.aarch64.a /lib/libwasmvm_muslc.aarch64.a -ADD https://github.com/CosmWasm/wasmvm/releases/download/v1.2.4/libwasmvm_muslc.x86_64.a /lib/libwasmvm_muslc.x86_64.a -RUN sha256sum /lib/libwasmvm_muslc.aarch64.a | grep 682a54082e131eaff9beec80ba3e5908113916fcb8ddf7c668cb2d97cb94c13c -RUN sha256sum /lib/libwasmvm_muslc.x86_64.a | grep ce3d892377d2523cf563e01120cb1436f9343f80be952c93f66aa94f5737b661 +ADD https://github.com/CosmWasm/wasmvm/releases/download/v1.3.0-rc.0/libwasmvm_muslc.aarch64.a /lib/libwasmvm_muslc.aarch64.a +ADD https://github.com/CosmWasm/wasmvm/releases/download/v1.3.0-rc.0/libwasmvm_muslc.x86_64.a /lib/libwasmvm_muslc.x86_64.a +RUN sha256sum /lib/libwasmvm_muslc.aarch64.a | grep f1d5d58e1699dd63bc81c8ee6950a6092729572ccedebdf122c2bbe838cf74ee +RUN sha256sum /lib/libwasmvm_muslc.x86_64.a | grep 829d6063c64feb05b11e39290de0c52402385226e11f8a19a03deca03c996f63 # Copy the library you want to the final location that will be found by the linker flag `-lwasmvm_muslc` RUN cp /lib/libwasmvm_muslc.${arch}.a /lib/libwasmvm_muslc.a diff --git a/README.md b/README.md index 4c95cbb83d..5ff96eb7ef 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,12 @@ compatibility list: | wasmd | wasmvm | cosmwasm-vm | cosmwasm-std | |-------|--------------|-------------|--------------| +<<<<<<< HEAD | 0.32 | v1.2.3 | | 1.0-1.2 | +======= +| 0.41 | v1.3.0 | | 1.0-1.3 | +| 0.40 | v1.2.3 | | 1.0-1.2 | +>>>>>>> 1a5a2d96 (Upgrade to wasmvm 1.3.0-rc.0 (#1486)) | 0.31 | v1.2.0 | | 1.0-1.2 | | 0.30 | v1.1.0 | | 1.0-1.1 | | 0.29 | v1.1.0 | | 1.0-1.1 | diff --git a/go.mod b/go.mod index 66ca5ff59b..a6f4fc8fec 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/CosmWasm/wasmd go 1.19 require ( - github.com/CosmWasm/wasmvm v1.2.4 + github.com/CosmWasm/wasmvm v1.3.0-rc.0 github.com/cosmos/cosmos-proto v1.0.0-beta.2 github.com/cosmos/cosmos-sdk v0.45.15 github.com/cosmos/gogoproto v1.4.6 diff --git a/go.sum b/go.sum index c232189616..3ea17c38e5 100644 --- a/go.sum +++ b/go.sum @@ -60,6 +60,7 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03 github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d h1:nalkkPQcITbvhmL4+C4cKA87NW0tfm3Kl9VXRoPywFg= github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d/go.mod h1:URdX5+vg25ts3aCh8H5IFZybJYKWhJHYMTnf+ULtoC4= +<<<<<<< HEAD github.com/CloudyKit/fastprinter v0.0.0-20170127035650-74b38d55f37a/go.mod h1:EFZQ978U7x8IRnstaskI3IysnWY5Ao3QgZUKOXlsAdw= github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53/go.mod h1:+3IMCy2vIlbG1XG/0ggNQv0SvxCAIpPM5b1nCz56Xno= github.com/CloudyKit/jet v2.1.3-0.20180809161101-62edd43e4f88+incompatible/go.mod h1:HPYO+50pSWkPoj9Q/eq0aRGByCL6ScRlUmiEX5Zgm+w= @@ -67,6 +68,10 @@ github.com/CloudyKit/jet/v3 v3.0.0/go.mod h1:HKQPgSJmdK8hdoAbKUUWajkHyHo4RaU5rMd github.com/CosmWasm/wasmvm v1.2.4 h1:6OfeZuEcEH/9iqwrg2pkeVtDCkMoj9U6PpKtcrCyVrQ= github.com/CosmWasm/wasmvm v1.2.4/go.mod h1:vW/E3h8j9xBQs9bCoijDuawKo9kCtxOaS8N8J7KFtkc= github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= +======= +github.com/CosmWasm/wasmvm v1.3.0-rc.0 h1:mHSFWM6i5HX/ZVzaFT0CmO0N4nnePJZX/DM4RNCP6uo= +github.com/CosmWasm/wasmvm v1.3.0-rc.0/go.mod h1:vW/E3h8j9xBQs9bCoijDuawKo9kCtxOaS8N8J7KFtkc= +>>>>>>> 1a5a2d96 (Upgrade to wasmvm 1.3.0-rc.0 (#1486)) github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/DataDog/zstd v1.4.5/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= github.com/DataDog/zstd v1.5.0 h1:+K/VEwIAaPcHiMtQvpLD4lqW7f0Gk3xdYZmI1hD+CXo= diff --git a/x/wasm/client/cli/gov_tx.go b/x/wasm/client/cli/gov_tx.go index c516be2932..0c40dccbfb 100644 --- a/x/wasm/client/cli/gov_tx.go +++ b/x/wasm/client/cli/gov_tx.go @@ -2,17 +2,24 @@ package cli import ( "bytes" +<<<<<<< HEAD "crypto/sha256" "encoding/hex" +======= +>>>>>>> 1a5a2d96 (Upgrade to wasmvm 1.3.0-rc.0 (#1486)) "fmt" "net/url" "strconv" "strings" +<<<<<<< HEAD "github.com/CosmWasm/wasmd/x/wasm/ioutils" "github.com/docker/distribution/reference" +======= + wasmvm "github.com/CosmWasm/wasmvm" +>>>>>>> 1a5a2d96 (Upgrade to wasmvm 1.3.0-rc.0 (#1486)) "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/tx" sdk "github.com/cosmos/cosmos-sdk/types" @@ -135,7 +142,10 @@ func parseVerificationFlags(gzippedWasm []byte, flags *flag.FlagSet) (string, st if err != nil { return "", "", nil, fmt.Errorf("invalid zip: %w", err) } - checksum := sha256.Sum256(raw) + checksum, err := wasmvm.CreateChecksum(raw) + if err != nil { + return "", "", nil, fmt.Errorf("checksum: %s", err) + } if !bytes.Equal(checksum[:], codeHash) { return "", "", nil, fmt.Errorf("code-hash mismatch: %X, checksum: %X", codeHash, checksum) } diff --git a/x/wasm/keeper/genesis_test.go b/x/wasm/keeper/genesis_test.go index ddf89f8a29..98996e1d62 100644 --- a/x/wasm/keeper/genesis_test.go +++ b/x/wasm/keeper/genesis_test.go @@ -9,6 +9,20 @@ import ( "testing" "time" +<<<<<<< HEAD +======= + abci "github.com/cometbft/cometbft/abci/types" + + "github.com/cosmos/cosmos-sdk/baseapp" + storetypes "github.com/cosmos/cosmos-sdk/store/types" + govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" + "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" + + wasmvm "github.com/CosmWasm/wasmvm" + dbm "github.com/cometbft/cometbft-db" + "github.com/cometbft/cometbft/libs/log" + tmproto "github.com/cometbft/cometbft/proto/tendermint/types" +>>>>>>> 1a5a2d96 (Upgrade to wasmvm 1.3.0-rc.0 (#1486)) "github.com/cosmos/cosmos-sdk/store" sdk "github.com/cosmos/cosmos-sdk/types" authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper" @@ -539,7 +553,8 @@ func TestImportContractWithCodeHistoryPreserved(t *testing.T) { wasmCode, err := os.ReadFile("./testdata/hackatom.wasm") require.NoError(t, err) - wasmCodeHash := sha256.Sum256(wasmCode) + wasmCodeHash, err := wasmvm.CreateChecksum(wasmCode) + require.NoError(t, err) enc64 := base64.StdEncoding.EncodeToString genesisStr := fmt.Sprintf(genesisTemplate, enc64(wasmCodeHash[:]), enc64(wasmCode)) diff --git a/x/wasm/keeper/keeper.go b/x/wasm/keeper/keeper.go index 508a04d6fa..f1e87366e2 100644 --- a/x/wasm/keeper/keeper.go +++ b/x/wasm/keeper/keeper.go @@ -154,7 +154,7 @@ func (k Keeper) create(ctx sdk.Context, creator sdk.AccAddress, wasmCode []byte, } ctx.GasMeter().ConsumeGas(k.gasRegister.CompileCosts(len(wasmCode)), "Compiling wasm bytecode") - checksum, err = k.wasmVM.Create(wasmCode) + checksum, err = k.wasmVM.StoreCode(wasmCode) if err != nil { return 0, checksum, sdkerrors.Wrap(types.ErrCreateFailed, err.Error()) } @@ -194,7 +194,7 @@ func (k Keeper) importCode(ctx sdk.Context, codeID uint64, codeInfo types.CodeIn return types.ErrCreateFailed.Wrap(sdkerrors.Wrap(err, "uncompress wasm archive").Error()) } } - newCodeHash, err := k.wasmVM.Create(wasmCode) + newCodeHash, err := k.wasmVM.StoreCodeUnchecked(wasmCode) if err != nil { return sdkerrors.Wrap(types.ErrCreateFailed, err.Error()) } diff --git a/x/wasm/keeper/keeper_test.go b/x/wasm/keeper/keeper_test.go index bf25c52284..c673a16fe8 100644 --- a/x/wasm/keeper/keeper_test.go +++ b/x/wasm/keeper/keeper_test.go @@ -711,7 +711,7 @@ func TestInstantiateWithContractDataResponse(t *testing.T) { return &wasmvmtypes.Response{Data: []byte("my-response-data")}, 0, nil }, AnalyzeCodeFn: wasmtesting.WithoutIBCAnalyzeFn, - CreateFn: wasmtesting.NoOpCreateFn, + StoreCodeFn: wasmtesting.NoOpStoreCodeFn, } example := StoreRandomContract(t, ctx, keepers, wasmerMock) @@ -742,7 +742,7 @@ func TestInstantiateWithContractFactoryChildQueriesParent(t *testing.T) { return do(codeID, env, info, initMsg, store, goapi, querier, gasMeter, gasLimit, deserCost) }, AnalyzeCodeFn: wasmtesting.WithoutIBCAnalyzeFn, - CreateFn: wasmtesting.NoOpCreateFn, + StoreCodeFn: wasmtesting.NoOpStoreCodeFn, } // overwrite wasmvm in router diff --git a/x/wasm/keeper/msg_server_integration_test.go b/x/wasm/keeper/msg_server_integration_test.go index dde8ae7744..ba76d8088b 100644 --- a/x/wasm/keeper/msg_server_integration_test.go +++ b/x/wasm/keeper/msg_server_integration_test.go @@ -1,10 +1,11 @@ package keeper_test import ( - "crypto/sha256" _ "embed" "testing" + wasmvm "github.com/CosmWasm/wasmvm" + wasmvmtypes "github.com/CosmWasm/wasmvm/types" "github.com/cosmos/cosmos-sdk/testutil/testdata" "github.com/stretchr/testify/assert" @@ -35,12 +36,14 @@ func TestStoreCode(t *testing.T) { var result types.MsgStoreCodeResponse require.NoError(t, wasmApp.AppCodec().Unmarshal(rsp.Data, &result)) assert.Equal(t, uint64(1), result.CodeID) - expHash := sha256.Sum256(wasmContract) - assert.Equal(t, expHash[:], result.Checksum) + + expHash, err := wasmvm.CreateChecksum(wasmContract) + require.NoError(t, err) + assert.Equal(t, expHash[:], wasmvmtypes.Checksum(result.Checksum)) // and info := wasmApp.WasmKeeper.GetCodeInfo(ctx, 1) assert.NotNil(t, info) - assert.Equal(t, expHash[:], info.CodeHash) + assert.Equal(t, expHash[:], wasmvmtypes.Checksum(info.CodeHash)) assert.Equal(t, sender.String(), info.Creator) assert.Equal(t, types.DefaultParams().InstantiateDefaultPermission.With(sender), info.InstantiateConfig) } diff --git a/x/wasm/keeper/proposal_integration_test.go b/x/wasm/keeper/proposal_integration_test.go index 9f7e49deef..221051da97 100644 --- a/x/wasm/keeper/proposal_integration_test.go +++ b/x/wasm/keeper/proposal_integration_test.go @@ -746,7 +746,7 @@ func TestPinCodesProposal(t *testing.T) { govKeeper, wasmKeeper := keepers.GovKeeper, keepers.WasmKeeper mock := wasmtesting.MockWasmer{ - CreateFn: wasmtesting.NoOpCreateFn, + StoreCodeFn: wasmtesting.NoOpStoreCodeFn, AnalyzeCodeFn: wasmtesting.WithoutIBCAnalyzeFn, } var ( @@ -834,7 +834,7 @@ func TestUnpinCodesProposal(t *testing.T) { govKeeper, wasmKeeper := keepers.GovKeeper, keepers.WasmKeeper mock := wasmtesting.MockWasmer{ - CreateFn: wasmtesting.NoOpCreateFn, + StoreCodeFn: wasmtesting.NoOpStoreCodeFn, AnalyzeCodeFn: wasmtesting.WithoutIBCAnalyzeFn, } var ( @@ -922,7 +922,7 @@ func TestUpdateInstantiateConfigProposal(t *testing.T) { govKeeper, wasmKeeper := keepers.GovKeeper, keepers.WasmKeeper mock := wasmtesting.MockWasmer{ - CreateFn: wasmtesting.NoOpCreateFn, + StoreCodeFn: wasmtesting.NoOpStoreCodeFn, AnalyzeCodeFn: wasmtesting.WithoutIBCAnalyzeFn, } anyAddress, err := sdk.AccAddressFromBech32("cosmos100dejzacpanrldpjjwksjm62shqhyss44jf5xz") diff --git a/x/wasm/keeper/snapshotter.go b/x/wasm/keeper/snapshotter.go index fcece63714..ea8a87ffd3 100644 --- a/x/wasm/keeper/snapshotter.go +++ b/x/wasm/keeper/snapshotter.go @@ -108,7 +108,7 @@ func restoreV1(ctx sdk.Context, k *Keeper, compressedCode []byte) error { } // FIXME: check which codeIDs the checksum matches?? - _, err = k.wasmVM.Create(wasmCode) + _, err = k.wasmVM.StoreCodeUnchecked(wasmCode) if err != nil { return sdkerrors.Wrap(types.ErrCreateFailed, err.Error()) } diff --git a/x/wasm/keeper/snapshotter_integration_test.go b/x/wasm/keeper/snapshotter_integration_test.go index 432d56c79d..ec3157c52d 100644 --- a/x/wasm/keeper/snapshotter_integration_test.go +++ b/x/wasm/keeper/snapshotter_integration_test.go @@ -1,7 +1,6 @@ package keeper_test import ( - "crypto/sha256" "os" "testing" "time" @@ -10,6 +9,13 @@ import ( "github.com/stretchr/testify/assert" +<<<<<<< HEAD +======= + wasmvm "github.com/CosmWasm/wasmvm" + wasmvmtypes "github.com/CosmWasm/wasmvm/types" + tmproto "github.com/cometbft/cometbft/proto/tendermint/types" + tmtypes "github.com/cometbft/cometbft/types" +>>>>>>> 1a5a2d96 (Upgrade to wasmvm 1.3.0-rc.0 (#1486)) cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" sdk "github.com/cosmos/cosmos-sdk/types" @@ -92,9 +98,11 @@ func TestSnapshotter(t *testing.T) { wasmKeeper.IterateCodeInfos(ctx, func(id uint64, info types.CodeInfo) bool { bz, err := wasmKeeper.GetByteCode(ctx, id) require.NoError(t, err) - hash := sha256.Sum256(bz) + + hash, err := wasmvm.CreateChecksum(bz) + require.NoError(t, err) destCodeIDToChecksum[id] = hash[:] - assert.Equal(t, hash[:], info.CodeHash) + assert.Equal(t, hash[:], wasmvmtypes.Checksum(info.CodeHash)) return false }) assert.Equal(t, srcCodeIDToChecksum, destCodeIDToChecksum) diff --git a/x/wasm/keeper/wasmtesting/mock_engine.go b/x/wasm/keeper/wasmtesting/mock_engine.go index 10c7fdfed2..84cbd6aa10 100644 --- a/x/wasm/keeper/wasmtesting/mock_engine.go +++ b/x/wasm/keeper/wasmtesting/mock_engine.go @@ -2,7 +2,6 @@ package wasmtesting import ( "bytes" - "crypto/sha256" wasmvm "github.com/CosmWasm/wasmvm" wasmvmtypes "github.com/CosmWasm/wasmvm/types" @@ -17,25 +16,26 @@ var _ types.WasmerEngine = &MockWasmer{} // MockWasmer implements types.WasmerEngine for testing purpose. One or multiple messages can be stubbed. // Without a stub function a panic is thrown. type MockWasmer struct { - CreateFn func(codeID wasmvm.WasmCode) (wasmvm.Checksum, error) - AnalyzeCodeFn func(codeID wasmvm.Checksum) (*wasmvmtypes.AnalysisReport, error) - InstantiateFn func(codeID wasmvm.Checksum, env wasmvmtypes.Env, info wasmvmtypes.MessageInfo, initMsg []byte, store wasmvm.KVStore, goapi wasmvm.GoAPI, querier wasmvm.Querier, gasMeter wasmvm.GasMeter, gasLimit uint64, deserCost wasmvmtypes.UFraction) (*wasmvmtypes.Response, uint64, error) - ExecuteFn func(codeID wasmvm.Checksum, env wasmvmtypes.Env, info wasmvmtypes.MessageInfo, executeMsg []byte, store wasmvm.KVStore, goapi wasmvm.GoAPI, querier wasmvm.Querier, gasMeter wasmvm.GasMeter, gasLimit uint64, deserCost wasmvmtypes.UFraction) (*wasmvmtypes.Response, uint64, error) - QueryFn func(codeID wasmvm.Checksum, env wasmvmtypes.Env, queryMsg []byte, store wasmvm.KVStore, goapi wasmvm.GoAPI, querier wasmvm.Querier, gasMeter wasmvm.GasMeter, gasLimit uint64, deserCost wasmvmtypes.UFraction) ([]byte, uint64, error) - MigrateFn func(codeID wasmvm.Checksum, env wasmvmtypes.Env, migrateMsg []byte, store wasmvm.KVStore, goapi wasmvm.GoAPI, querier wasmvm.Querier, gasMeter wasmvm.GasMeter, gasLimit uint64, deserCost wasmvmtypes.UFraction) (*wasmvmtypes.Response, uint64, error) - SudoFn func(codeID wasmvm.Checksum, env wasmvmtypes.Env, sudoMsg []byte, store wasmvm.KVStore, goapi wasmvm.GoAPI, querier wasmvm.Querier, gasMeter wasmvm.GasMeter, gasLimit uint64, deserCost wasmvmtypes.UFraction) (*wasmvmtypes.Response, uint64, error) - ReplyFn func(codeID wasmvm.Checksum, env wasmvmtypes.Env, reply wasmvmtypes.Reply, store wasmvm.KVStore, goapi wasmvm.GoAPI, querier wasmvm.Querier, gasMeter wasmvm.GasMeter, gasLimit uint64, deserCost wasmvmtypes.UFraction) (*wasmvmtypes.Response, uint64, error) - GetCodeFn func(codeID wasmvm.Checksum) (wasmvm.WasmCode, error) - CleanupFn func() - IBCChannelOpenFn func(codeID wasmvm.Checksum, env wasmvmtypes.Env, msg wasmvmtypes.IBCChannelOpenMsg, store wasmvm.KVStore, goapi wasmvm.GoAPI, querier wasmvm.Querier, gasMeter wasmvm.GasMeter, gasLimit uint64, deserCost wasmvmtypes.UFraction) (*wasmvmtypes.IBC3ChannelOpenResponse, uint64, error) - IBCChannelConnectFn func(codeID wasmvm.Checksum, env wasmvmtypes.Env, msg wasmvmtypes.IBCChannelConnectMsg, store wasmvm.KVStore, goapi wasmvm.GoAPI, querier wasmvm.Querier, gasMeter wasmvm.GasMeter, gasLimit uint64, deserCost wasmvmtypes.UFraction) (*wasmvmtypes.IBCBasicResponse, uint64, error) - IBCChannelCloseFn func(codeID wasmvm.Checksum, env wasmvmtypes.Env, msg wasmvmtypes.IBCChannelCloseMsg, store wasmvm.KVStore, goapi wasmvm.GoAPI, querier wasmvm.Querier, gasMeter wasmvm.GasMeter, gasLimit uint64, deserCost wasmvmtypes.UFraction) (*wasmvmtypes.IBCBasicResponse, uint64, error) - IBCPacketReceiveFn func(codeID wasmvm.Checksum, env wasmvmtypes.Env, msg wasmvmtypes.IBCPacketReceiveMsg, store wasmvm.KVStore, goapi wasmvm.GoAPI, querier wasmvm.Querier, gasMeter wasmvm.GasMeter, gasLimit uint64, deserCost wasmvmtypes.UFraction) (*wasmvmtypes.IBCReceiveResult, uint64, error) - IBCPacketAckFn func(codeID wasmvm.Checksum, env wasmvmtypes.Env, msg wasmvmtypes.IBCPacketAckMsg, store wasmvm.KVStore, goapi wasmvm.GoAPI, querier wasmvm.Querier, gasMeter wasmvm.GasMeter, gasLimit uint64, deserCost wasmvmtypes.UFraction) (*wasmvmtypes.IBCBasicResponse, uint64, error) - IBCPacketTimeoutFn func(codeID wasmvm.Checksum, env wasmvmtypes.Env, msg wasmvmtypes.IBCPacketTimeoutMsg, store wasmvm.KVStore, goapi wasmvm.GoAPI, querier wasmvm.Querier, gasMeter wasmvm.GasMeter, gasLimit uint64, deserCost wasmvmtypes.UFraction) (*wasmvmtypes.IBCBasicResponse, uint64, error) - PinFn func(checksum wasmvm.Checksum) error - UnpinFn func(checksum wasmvm.Checksum) error - GetMetricsFn func() (*wasmvmtypes.Metrics, error) + StoreCodeFn func(codeID wasmvm.WasmCode) (wasmvm.Checksum, error) + StoreCodeUncheckedFn func(codeID wasmvm.WasmCode) (wasmvm.Checksum, error) + AnalyzeCodeFn func(codeID wasmvm.Checksum) (*wasmvmtypes.AnalysisReport, error) + InstantiateFn func(codeID wasmvm.Checksum, env wasmvmtypes.Env, info wasmvmtypes.MessageInfo, initMsg []byte, store wasmvm.KVStore, goapi wasmvm.GoAPI, querier wasmvm.Querier, gasMeter wasmvm.GasMeter, gasLimit uint64, deserCost wasmvmtypes.UFraction) (*wasmvmtypes.Response, uint64, error) + ExecuteFn func(codeID wasmvm.Checksum, env wasmvmtypes.Env, info wasmvmtypes.MessageInfo, executeMsg []byte, store wasmvm.KVStore, goapi wasmvm.GoAPI, querier wasmvm.Querier, gasMeter wasmvm.GasMeter, gasLimit uint64, deserCost wasmvmtypes.UFraction) (*wasmvmtypes.Response, uint64, error) + QueryFn func(codeID wasmvm.Checksum, env wasmvmtypes.Env, queryMsg []byte, store wasmvm.KVStore, goapi wasmvm.GoAPI, querier wasmvm.Querier, gasMeter wasmvm.GasMeter, gasLimit uint64, deserCost wasmvmtypes.UFraction) ([]byte, uint64, error) + MigrateFn func(codeID wasmvm.Checksum, env wasmvmtypes.Env, migrateMsg []byte, store wasmvm.KVStore, goapi wasmvm.GoAPI, querier wasmvm.Querier, gasMeter wasmvm.GasMeter, gasLimit uint64, deserCost wasmvmtypes.UFraction) (*wasmvmtypes.Response, uint64, error) + SudoFn func(codeID wasmvm.Checksum, env wasmvmtypes.Env, sudoMsg []byte, store wasmvm.KVStore, goapi wasmvm.GoAPI, querier wasmvm.Querier, gasMeter wasmvm.GasMeter, gasLimit uint64, deserCost wasmvmtypes.UFraction) (*wasmvmtypes.Response, uint64, error) + ReplyFn func(codeID wasmvm.Checksum, env wasmvmtypes.Env, reply wasmvmtypes.Reply, store wasmvm.KVStore, goapi wasmvm.GoAPI, querier wasmvm.Querier, gasMeter wasmvm.GasMeter, gasLimit uint64, deserCost wasmvmtypes.UFraction) (*wasmvmtypes.Response, uint64, error) + GetCodeFn func(codeID wasmvm.Checksum) (wasmvm.WasmCode, error) + CleanupFn func() + IBCChannelOpenFn func(codeID wasmvm.Checksum, env wasmvmtypes.Env, msg wasmvmtypes.IBCChannelOpenMsg, store wasmvm.KVStore, goapi wasmvm.GoAPI, querier wasmvm.Querier, gasMeter wasmvm.GasMeter, gasLimit uint64, deserCost wasmvmtypes.UFraction) (*wasmvmtypes.IBC3ChannelOpenResponse, uint64, error) + IBCChannelConnectFn func(codeID wasmvm.Checksum, env wasmvmtypes.Env, msg wasmvmtypes.IBCChannelConnectMsg, store wasmvm.KVStore, goapi wasmvm.GoAPI, querier wasmvm.Querier, gasMeter wasmvm.GasMeter, gasLimit uint64, deserCost wasmvmtypes.UFraction) (*wasmvmtypes.IBCBasicResponse, uint64, error) + IBCChannelCloseFn func(codeID wasmvm.Checksum, env wasmvmtypes.Env, msg wasmvmtypes.IBCChannelCloseMsg, store wasmvm.KVStore, goapi wasmvm.GoAPI, querier wasmvm.Querier, gasMeter wasmvm.GasMeter, gasLimit uint64, deserCost wasmvmtypes.UFraction) (*wasmvmtypes.IBCBasicResponse, uint64, error) + IBCPacketReceiveFn func(codeID wasmvm.Checksum, env wasmvmtypes.Env, msg wasmvmtypes.IBCPacketReceiveMsg, store wasmvm.KVStore, goapi wasmvm.GoAPI, querier wasmvm.Querier, gasMeter wasmvm.GasMeter, gasLimit uint64, deserCost wasmvmtypes.UFraction) (*wasmvmtypes.IBCReceiveResult, uint64, error) + IBCPacketAckFn func(codeID wasmvm.Checksum, env wasmvmtypes.Env, msg wasmvmtypes.IBCPacketAckMsg, store wasmvm.KVStore, goapi wasmvm.GoAPI, querier wasmvm.Querier, gasMeter wasmvm.GasMeter, gasLimit uint64, deserCost wasmvmtypes.UFraction) (*wasmvmtypes.IBCBasicResponse, uint64, error) + IBCPacketTimeoutFn func(codeID wasmvm.Checksum, env wasmvmtypes.Env, msg wasmvmtypes.IBCPacketTimeoutMsg, store wasmvm.KVStore, goapi wasmvm.GoAPI, querier wasmvm.Querier, gasMeter wasmvm.GasMeter, gasLimit uint64, deserCost wasmvmtypes.UFraction) (*wasmvmtypes.IBCBasicResponse, uint64, error) + PinFn func(checksum wasmvm.Checksum) error + UnpinFn func(checksum wasmvm.Checksum) error + GetMetricsFn func() (*wasmvmtypes.Metrics, error) } func (m *MockWasmer) IBCChannelOpen(codeID wasmvm.Checksum, env wasmvmtypes.Env, msg wasmvmtypes.IBCChannelOpenMsg, store wasmvm.KVStore, goapi wasmvm.GoAPI, querier wasmvm.Querier, gasMeter wasmvm.GasMeter, gasLimit uint64, deserCost wasmvmtypes.UFraction) (*wasmvmtypes.IBC3ChannelOpenResponse, uint64, error) { @@ -80,11 +80,23 @@ func (m *MockWasmer) IBCPacketTimeout(codeID wasmvm.Checksum, env wasmvmtypes.En return m.IBCPacketTimeoutFn(codeID, env, msg, store, goapi, querier, gasMeter, gasLimit, deserCost) } +// Deprecated: use StoreCode instead. func (m *MockWasmer) Create(codeID wasmvm.WasmCode) (wasmvm.Checksum, error) { - if m.CreateFn == nil { + panic("Deprecated: use StoreCode instead") +} + +func (m *MockWasmer) StoreCode(codeID wasmvm.WasmCode) (wasmvm.Checksum, error) { + if m.StoreCodeFn == nil { + panic("not supposed to be called!") + } + return m.StoreCodeFn(codeID) +} + +func (m *MockWasmer) StoreCodeUnchecked(codeID wasmvm.WasmCode) (wasmvm.Checksum, error) { + if m.StoreCodeUncheckedFn == nil { panic("not supposed to be called!") } - return m.CreateFn(codeID) + return m.StoreCodeUncheckedFn(codeID) } func (m *MockWasmer) AnalyzeCode(codeID wasmvm.Checksum) (*wasmvmtypes.AnalysisReport, error) { @@ -176,7 +188,7 @@ var AlwaysPanicMockWasmer = &MockWasmer{} // SelfCallingInstMockWasmer prepares a Wasmer mock that calls itself on instantiation. func SelfCallingInstMockWasmer(executeCalled *bool) *MockWasmer { return &MockWasmer{ - CreateFn: func(code wasmvm.WasmCode) (wasmvm.Checksum, error) { + StoreCodeFn: func(code wasmvm.WasmCode) (wasmvm.Checksum, error) { anyCodeID := bytes.Repeat([]byte{0x1}, 32) return anyCodeID, nil }, @@ -290,7 +302,7 @@ type contractExecutable interface { // MakeInstantiable adds some noop functions to not fail when contract is used for instantiation func MakeInstantiable(m *MockWasmer) { - m.CreateFn = HashOnlyCreateFn + m.StoreCodeFn = HashOnlyStoreCodeFn m.InstantiateFn = NoOpInstantiateFn m.AnalyzeCodeFn = WithoutIBCAnalyzeFn } @@ -321,19 +333,18 @@ func NewIBCContractMockWasmer(c IBCContractCallbacks) *MockWasmer { return m } -func HashOnlyCreateFn(code wasmvm.WasmCode) (wasmvm.Checksum, error) { +func HashOnlyStoreCodeFn(code wasmvm.WasmCode) (wasmvm.Checksum, error) { if code == nil { return nil, sdkerrors.Wrap(types.ErrInvalid, "wasm code must not be nil") } - hash := sha256.Sum256(code) - return hash[:], nil + return wasmvm.CreateChecksum(code) } func NoOpInstantiateFn(wasmvm.Checksum, wasmvmtypes.Env, wasmvmtypes.MessageInfo, []byte, wasmvm.KVStore, wasmvm.GoAPI, wasmvm.Querier, wasmvm.GasMeter, uint64, wasmvmtypes.UFraction) (*wasmvmtypes.Response, uint64, error) { return &wasmvmtypes.Response{}, 0, nil } -func NoOpCreateFn(_ wasmvm.WasmCode) (wasmvm.Checksum, error) { +func NoOpStoreCodeFn(_ wasmvm.WasmCode) (wasmvm.Checksum, error) { return rand.Bytes(32), nil } diff --git a/x/wasm/types/test_fixtures.go b/x/wasm/types/test_fixtures.go index e84b61fd7d..1c431dcfc5 100644 --- a/x/wasm/types/test_fixtures.go +++ b/x/wasm/types/test_fixtures.go @@ -2,14 +2,18 @@ package types import ( "bytes" - "crypto/sha256" + _ "embed" "encoding/hex" "encoding/json" "math/rand" + wasmvm "github.com/CosmWasm/wasmvm" sdk "github.com/cosmos/cosmos-sdk/types" ) +//go:embed testdata/reflect.wasm +var reflectWasmCode []byte + func GenesisFixture(mutators ...func(*GenesisState)) GenesisState { const ( numCodes = 2 @@ -50,12 +54,10 @@ func randBytes(n int) []byte { } func CodeFixture(mutators ...func(*Code)) Code { - wasmCode := randBytes(100) - fixture := Code{ CodeID: 1, - CodeInfo: CodeInfoFixture(WithSHA256CodeHash(wasmCode)), - CodeBytes: wasmCode, + CodeInfo: CodeInfoFixture(WithSHA256CodeHash(reflectWasmCode)), + CodeBytes: reflectWasmCode, } for _, m := range mutators { @@ -65,8 +67,10 @@ func CodeFixture(mutators ...func(*Code)) Code { } func CodeInfoFixture(mutators ...func(*CodeInfo)) CodeInfo { - wasmCode := bytes.Repeat([]byte{0x1}, 10) - codeHash := sha256.Sum256(wasmCode) + codeHash, err := wasmvm.CreateChecksum(reflectWasmCode) + if err != nil { + panic(err) + } const anyAddress = "cosmos1qyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqs2m6sx4" fixture := CodeInfo{ CodeHash: codeHash[:], @@ -137,7 +141,10 @@ func ContractCodeHistoryEntryFixture(mutators ...func(*ContractCodeHistoryEntry) func WithSHA256CodeHash(wasmCode []byte) func(info *CodeInfo) { return func(info *CodeInfo) { - codeHash := sha256.Sum256(wasmCode) + codeHash, err := wasmvm.CreateChecksum(wasmCode) + if err != nil { + panic(err) + } info.CodeHash = codeHash[:] } } diff --git a/x/wasm/types/testdata/reflect.wasm b/x/wasm/types/testdata/reflect.wasm new file mode 100644 index 0000000000000000000000000000000000000000..31735645df62f14630ca5f5684bf1b7c4fd82600 GIT binary patch literal 257191 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

)=pW+ZML@mTc@&1}dy^eE+#LiI|Fj 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

6|jX%20)6N&*>_!xv^(4@7Q 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 literal 0 HcmV?d00001 diff --git a/x/wasm/types/wasmer_engine.go b/x/wasm/types/wasmer_engine.go index 9b2efdef50..18d4060a40 100644 --- a/x/wasm/types/wasmer_engine.go +++ b/x/wasm/types/wasmer_engine.go @@ -19,8 +19,24 @@ type WasmerEngine interface { // For example, the code for all ERC-20 contracts should be the same. // This function stores the code for that contract only once, but it can // be instantiated with custom inputs in the future. + // + // Deprecated: use StoreCode instead. Create(code wasmvm.WasmCode) (wasmvm.Checksum, error) + // Create will compile the wasm code, and store the resulting pre-compile + // as well as the original code. Both can be referenced later via checksum + // This must be done one time for given code, after which it can be + // instatitated many times, and each instance called many times. + // It does the same as StoreCodeUnchecked plus the static checks. + StoreCode(code wasmvm.WasmCode) (wasmvm.Checksum, error) + + // Create will compile the wasm code, and store the resulting pre-compile + // as well as the original code. Both can be referenced later via checksum + // This must be done one time for given code, after which it can be + // instatitated many times, and each instance called many times. + // It does the same as StoreCode but without the static checks. + StoreCodeUnchecked(code wasmvm.WasmCode) (wasmvm.Checksum, error) + // AnalyzeCode will statically analyze the code. // Currently just reports if it exposes all IBC entry points. AnalyzeCode(checksum wasmvm.Checksum) (*wasmvmtypes.AnalysisReport, error) From 5c86330fc03ceb52b4fa118ca3f9d6d4434aea9e Mon Sep 17 00:00:00 2001 From: Alex Peters Date: Mon, 17 Jul 2023 15:25:47 +0200 Subject: [PATCH 2/2] Resolve conflicts --- README.md | 6 +----- go.mod | 3 ++- go.sum | 20 +++++++++---------- x/wasm/client/cli/gov_tx.go | 13 ++---------- x/wasm/keeper/genesis_test.go | 13 ------------ x/wasm/keeper/snapshotter_integration_test.go | 11 ++-------- x/wasm/types/proposal.go | 2 +- x/wasm/types/proposal_test.go | 1 - 8 files changed, 18 insertions(+), 51 deletions(-) diff --git a/README.md b/README.md index 5ff96eb7ef..43c1593452 100644 --- a/README.md +++ b/README.md @@ -27,12 +27,8 @@ compatibility list: | wasmd | wasmvm | cosmwasm-vm | cosmwasm-std | |-------|--------------|-------------|--------------| -<<<<<<< HEAD +| 0.33 | v1.3.0 | | 1.0-1.3 | | 0.32 | v1.2.3 | | 1.0-1.2 | -======= -| 0.41 | v1.3.0 | | 1.0-1.3 | -| 0.40 | v1.2.3 | | 1.0-1.2 | ->>>>>>> 1a5a2d96 (Upgrade to wasmvm 1.3.0-rc.0 (#1486)) | 0.31 | v1.2.0 | | 1.0-1.2 | | 0.30 | v1.1.0 | | 1.0-1.1 | | 0.29 | v1.1.0 | | 1.0-1.1 | diff --git a/go.mod b/go.mod index a6f4fc8fec..4aee30bc1b 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.19 require ( github.com/CosmWasm/wasmvm v1.3.0-rc.0 github.com/cosmos/cosmos-proto v1.0.0-beta.2 - github.com/cosmos/cosmos-sdk v0.45.15 + github.com/cosmos/cosmos-sdk v0.45.16 github.com/cosmos/gogoproto v1.4.6 github.com/cosmos/iavl v0.19.5 github.com/cosmos/ibc-go/v4 v4.3.0 @@ -111,6 +111,7 @@ require ( github.com/minio/highwayhash v1.0.2 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/mtibben/percent v0.2.1 // indirect + github.com/onsi/ginkgo v1.16.4 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/pelletier/go-toml v1.9.5 // indirect github.com/pelletier/go-toml/v2 v2.0.5 // indirect diff --git a/go.sum b/go.sum index 3ea17c38e5..ca2d0d9a02 100644 --- a/go.sum +++ b/go.sum @@ -60,18 +60,13 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03 github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d h1:nalkkPQcITbvhmL4+C4cKA87NW0tfm3Kl9VXRoPywFg= github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d/go.mod h1:URdX5+vg25ts3aCh8H5IFZybJYKWhJHYMTnf+ULtoC4= -<<<<<<< HEAD github.com/CloudyKit/fastprinter v0.0.0-20170127035650-74b38d55f37a/go.mod h1:EFZQ978U7x8IRnstaskI3IysnWY5Ao3QgZUKOXlsAdw= github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53/go.mod h1:+3IMCy2vIlbG1XG/0ggNQv0SvxCAIpPM5b1nCz56Xno= github.com/CloudyKit/jet v2.1.3-0.20180809161101-62edd43e4f88+incompatible/go.mod h1:HPYO+50pSWkPoj9Q/eq0aRGByCL6ScRlUmiEX5Zgm+w= github.com/CloudyKit/jet/v3 v3.0.0/go.mod h1:HKQPgSJmdK8hdoAbKUUWajkHyHo4RaU5rMdUywE7VMo= -github.com/CosmWasm/wasmvm v1.2.4 h1:6OfeZuEcEH/9iqwrg2pkeVtDCkMoj9U6PpKtcrCyVrQ= -github.com/CosmWasm/wasmvm v1.2.4/go.mod h1:vW/E3h8j9xBQs9bCoijDuawKo9kCtxOaS8N8J7KFtkc= -github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= -======= github.com/CosmWasm/wasmvm v1.3.0-rc.0 h1:mHSFWM6i5HX/ZVzaFT0CmO0N4nnePJZX/DM4RNCP6uo= github.com/CosmWasm/wasmvm v1.3.0-rc.0/go.mod h1:vW/E3h8j9xBQs9bCoijDuawKo9kCtxOaS8N8J7KFtkc= ->>>>>>> 1a5a2d96 (Upgrade to wasmvm 1.3.0-rc.0 (#1486)) +github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/DataDog/zstd v1.4.5/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= github.com/DataDog/zstd v1.5.0 h1:+K/VEwIAaPcHiMtQvpLD4lqW7f0Gk3xdYZmI1hD+CXo= @@ -231,8 +226,8 @@ github.com/cosmos/cosmos-db v0.0.0-20221226095112-f3c38ecb5e32 h1:zlCp9n3uwQieEL github.com/cosmos/cosmos-db v0.0.0-20221226095112-f3c38ecb5e32/go.mod h1:kwMlEC4wWvB48zAShGKVqboJL6w4zCLesaNQ3YLU2BQ= github.com/cosmos/cosmos-proto v1.0.0-beta.2 h1:X3OKvWgK9Gsejo0F1qs5l8Qn6xJV/AzgIWR2wZ8Nua8= github.com/cosmos/cosmos-proto v1.0.0-beta.2/go.mod h1:+XRCLJ14pr5HFEHIUcn51IKXD1Fy3rkEQqt4WqmN4V0= -github.com/cosmos/cosmos-sdk v0.45.15 h1:yyLZ9PylnR1DADf9FYGxnn8t3+Y5K2mMUXNUN38MI5A= -github.com/cosmos/cosmos-sdk v0.45.15/go.mod h1:bScuNwWAP0TZJpUf+SHXRU3xGoUPp+X9nAzfeIXts40= +github.com/cosmos/cosmos-sdk v0.45.16 h1:5ba/Bh5/LE55IwHQuCU4fiG4eXeDKtSWzehXRpaKDcw= +github.com/cosmos/cosmos-sdk v0.45.16/go.mod h1:bScuNwWAP0TZJpUf+SHXRU3xGoUPp+X9nAzfeIXts40= github.com/cosmos/go-bip39 v0.0.0-20180819234021-555e2067c45d/go.mod h1:tSxLoYXyBmiFeKpvmq4dzayMdCjCnu8uqmCysIGBT2Y= github.com/cosmos/go-bip39 v1.0.0 h1:pcomnQdrdH22njcAatO0yWojsUnCO3y2tNoV1cb6hHY= github.com/cosmos/go-bip39 v1.0.0/go.mod h1:RNJv0H/pOIVgxw6KS7QeX2a0Uo0aKUlfhZ4xuwvCdJw= @@ -383,6 +378,7 @@ github.com/go-sourcemap/sourcemap v2.1.3+incompatible/go.mod h1:F8jJfvm2KbVjc5Nq github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee h1:s+21KNqlpePfkah2I+gwHF8xmJWRjooY+5248k6m4A0= github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= github.com/gobwas/pool v0.2.0 h1:QEmUOlnSjWtnpRGHF3SauEiOsy82Cup83Vf2LcMlnc8= @@ -762,8 +758,9 @@ github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxzi github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/neilotoole/errgroup v0.1.6/go.mod h1:Q2nLGf+594h0CLBs/Mbg6qOr7GtqDK7C2S41udRnToE= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= +github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= @@ -774,8 +771,9 @@ github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+W github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.13.0/go.mod h1:+REjRxOmWfHCjfv9TTWB1jD1Frx4XydAD3zm1lskyM0= -github.com/onsi/ginkgo v1.14.0 h1:2mOpI4JVVPBN+WQRa0WKH2eXR+Ey+uK4n7Zj0aYpIQA= github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= +github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= +github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= @@ -1251,6 +1249,7 @@ golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1351,6 +1350,7 @@ golang.org/x/tools v0.0.0-20201022035929-9cf592e881e9/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= diff --git a/x/wasm/client/cli/gov_tx.go b/x/wasm/client/cli/gov_tx.go index 0c40dccbfb..f5a0a64a4d 100644 --- a/x/wasm/client/cli/gov_tx.go +++ b/x/wasm/client/cli/gov_tx.go @@ -2,34 +2,25 @@ package cli import ( "bytes" -<<<<<<< HEAD - "crypto/sha256" "encoding/hex" -======= ->>>>>>> 1a5a2d96 (Upgrade to wasmvm 1.3.0-rc.0 (#1486)) "fmt" "net/url" "strconv" "strings" -<<<<<<< HEAD - "github.com/CosmWasm/wasmd/x/wasm/ioutils" - - "github.com/docker/distribution/reference" - -======= wasmvm "github.com/CosmWasm/wasmvm" ->>>>>>> 1a5a2d96 (Upgrade to wasmvm 1.3.0-rc.0 (#1486)) "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/tx" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/version" "github.com/cosmos/cosmos-sdk/x/gov/client/cli" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" + "github.com/docker/distribution/reference" "github.com/pkg/errors" "github.com/spf13/cobra" flag "github.com/spf13/pflag" + "github.com/CosmWasm/wasmd/x/wasm/ioutils" "github.com/CosmWasm/wasmd/x/wasm/types" ) diff --git a/x/wasm/keeper/genesis_test.go b/x/wasm/keeper/genesis_test.go index 98996e1d62..b778d75561 100644 --- a/x/wasm/keeper/genesis_test.go +++ b/x/wasm/keeper/genesis_test.go @@ -9,20 +9,7 @@ import ( "testing" "time" -<<<<<<< HEAD -======= - abci "github.com/cometbft/cometbft/abci/types" - - "github.com/cosmos/cosmos-sdk/baseapp" - storetypes "github.com/cosmos/cosmos-sdk/store/types" - govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" - "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" - wasmvm "github.com/CosmWasm/wasmvm" - dbm "github.com/cometbft/cometbft-db" - "github.com/cometbft/cometbft/libs/log" - tmproto "github.com/cometbft/cometbft/proto/tendermint/types" ->>>>>>> 1a5a2d96 (Upgrade to wasmvm 1.3.0-rc.0 (#1486)) "github.com/cosmos/cosmos-sdk/store" sdk "github.com/cosmos/cosmos-sdk/types" authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper" diff --git a/x/wasm/keeper/snapshotter_integration_test.go b/x/wasm/keeper/snapshotter_integration_test.go index ec3157c52d..a2c32e57c2 100644 --- a/x/wasm/keeper/snapshotter_integration_test.go +++ b/x/wasm/keeper/snapshotter_integration_test.go @@ -5,28 +5,21 @@ import ( "testing" "time" - "github.com/CosmWasm/wasmd/x/wasm/types" - - "github.com/stretchr/testify/assert" - -<<<<<<< HEAD -======= wasmvm "github.com/CosmWasm/wasmvm" wasmvmtypes "github.com/CosmWasm/wasmvm/types" - tmproto "github.com/cometbft/cometbft/proto/tendermint/types" - tmtypes "github.com/cometbft/cometbft/types" ->>>>>>> 1a5a2d96 (Upgrade to wasmvm 1.3.0-rc.0 (#1486)) cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" tmproto "github.com/tendermint/tendermint/proto/tendermint/types" tmtypes "github.com/tendermint/tendermint/types" "github.com/CosmWasm/wasmd/app" "github.com/CosmWasm/wasmd/x/wasm/keeper" + "github.com/CosmWasm/wasmd/x/wasm/types" ) func TestSnapshotter(t *testing.T) { diff --git a/x/wasm/types/proposal.go b/x/wasm/types/proposal.go index c717f35493..de69b6be13 100644 --- a/x/wasm/types/proposal.go +++ b/x/wasm/types/proposal.go @@ -997,6 +997,7 @@ func (c AccessConfigUpdate) String() string { AccessConfig: %v `, c.CodeID, c.InstantiatePermission) } + func validateCodeIDs(codeIDs []uint64) error { if len(codeIDs) == 0 { return sdkerrors.Wrap(ErrEmpty, "code ids") @@ -1004,7 +1005,6 @@ func validateCodeIDs(codeIDs []uint64) error { for i, num1 := range codeIDs { if num1 == 0 { return ErrInvalid.Wrap("0 is not accepted") - } for j, num2 := range codeIDs { if i != j && num1 == num2 { diff --git a/x/wasm/types/proposal_test.go b/x/wasm/types/proposal_test.go index 55184eb2c0..304d40cb79 100644 --- a/x/wasm/types/proposal_test.go +++ b/x/wasm/types/proposal_test.go @@ -1145,7 +1145,6 @@ func TestProposalCodeIDs(t *testing.T) { src govtypes.Content expErr bool }{ - "Pin empty code id list": { src: &PinCodesProposal{ Title: "Foo",