瀏覽代碼

wormchain: add migrating contracts with vaa

Conor Patrick 2 年之前
父節點
當前提交
aac92a19e7

+ 2 - 2
node/Dockerfile

@@ -25,8 +25,8 @@ ARG GO_BUILD_ARGS=-race
 RUN --mount=type=cache,target=/root/.cache --mount=type=cache,target=/go \
   cd node && \
   go build ${GO_BUILD_ARGS} -gcflags="all=-N -l" --ldflags '-extldflags "-Wl,--allow-multiple-definition" -X "github.com/certusone/wormhole/node/cmd/guardiand.Build=dev"' -mod=readonly -o /guardiand github.com/certusone/wormhole/node && \
-  go get github.com/CosmWasm/wasmvm@v1.0.0 && \
-  cp /go/pkg/mod/github.com/!cosm!wasm/wasmvm@v1.0.0/api/libwasmvm.x86_64.so /usr/lib/  
+  go get github.com/CosmWasm/wasmvm@v1.1.1 && \
+  cp /go/pkg/mod/github.com/!cosm!wasm/wasmvm@v1.1.1/internal/api/libwasmvm.x86_64.so /usr/lib/  
 
 # Only export the final binary (+ shared objects). This reduces the image size
 # from ~1GB to ~150MB.

+ 14 - 0
node/cmd/guardiand/adminserver.go

@@ -210,6 +210,18 @@ func wormchainInstantiateContract(req *nodev1.WormchainInstantiateContract, time
 	return v, nil
 }
 
+// wormchainMigrateContract converts a nodev1.WormchainMigrateContract to its canonical VAA representation
+func wormchainMigrateContract(req *nodev1.WormchainMigrateContract, timestamp time.Time, guardianSetIndex uint32, nonce uint32, sequence uint64) (*vaa.VAA, error) {
+	instantiationParams_hash := vaa.CreateMigrateCosmwasmContractHash(req.CodeId, req.Contract, []byte(req.InstantiationMsg))
+
+	v := vaa.CreateGovernanceVAA(timestamp, nonce, sequence, guardianSetIndex,
+		vaa.BodyWormchainInstantiateContract{
+			InstantiationParamsHash: instantiationParams_hash,
+		}.Serialize())
+
+	return v, nil
+}
+
 func (s *nodePrivilegedService) InjectGovernanceVAA(ctx context.Context, req *nodev1.InjectGovernanceVAARequest) (*nodev1.InjectGovernanceVAAResponse, error) {
 	s.logger.Info("governance VAA injected via admin socket", zap.String("request", req.String()))
 
@@ -236,6 +248,8 @@ func (s *nodePrivilegedService) InjectGovernanceVAA(ctx context.Context, req *no
 			v, err = wormchainStoreCode(payload.WormchainStoreCode, timestamp, req.CurrentSetIndex, message.Nonce, message.Sequence)
 		case *nodev1.GovernanceMessage_WormchainInstantiateContract:
 			v, err = wormchainInstantiateContract(payload.WormchainInstantiateContract, timestamp, req.CurrentSetIndex, message.Nonce, message.Sequence)
+		case *nodev1.GovernanceMessage_WormchainMigrateContract:
+			v, err = wormchainMigrateContract(payload.WormchainMigrateContract, timestamp, req.CurrentSetIndex, message.Nonce, message.Sequence)
 		default:
 			panic(fmt.Sprintf("unsupported VAA type: %T", payload))
 		}

+ 19 - 15
node/go.mod

@@ -27,10 +27,10 @@ require (
 	github.com/mr-tron/base58 v1.2.0
 	github.com/multiformats/go-multiaddr v0.6.0
 	github.com/near/borsh-go v0.3.0
-	github.com/prometheus/client_golang v1.12.2
+	github.com/prometheus/client_golang v1.14.0
 	github.com/spf13/cobra v1.6.0
 	github.com/spf13/pflag v1.0.5
-	github.com/spf13/viper v1.13.0
+	github.com/spf13/viper v1.14.0
 	github.com/status-im/keycard-go v0.0.0-20200402102358-957c09536969
 	github.com/stretchr/testify v1.8.1
 	github.com/tendermint/tendermint v0.34.24
@@ -48,12 +48,12 @@ require (
 require (
 	cloud.google.com/go/logging v1.4.2
 	cloud.google.com/go/pubsub v1.25.1
-	github.com/CosmWasm/wasmd v0.28.0
+	github.com/CosmWasm/wasmd v0.30.0
 	github.com/algorand/go-algorand-sdk v1.23.0
 	github.com/benbjohnson/clock v1.3.0
 	github.com/blendle/zapdriver v1.3.1
 	github.com/btcsuite/btcutil v1.0.3-0.20201208143702-a53e38424cce
-	github.com/cosmos/cosmos-sdk v0.45.9
+	github.com/cosmos/cosmos-sdk v0.45.11
 	github.com/google/uuid v1.3.0
 	github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d
 	github.com/test-go/testify v1.1.4
@@ -61,6 +61,7 @@ require (
 	github.com/wormhole-foundation/wormhole/sdk v0.0.0-20220926172624-4b38dc650bb0
 	golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e
 	golang.org/x/text v0.4.0
+	nhooyr.io/websocket v1.8.7
 )
 
 require (
@@ -74,8 +75,8 @@ require (
 	github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 // indirect
 	github.com/99designs/keyring v1.2.1 // indirect
 	github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d // indirect
-	github.com/CosmWasm/wasmvm v1.0.0 // indirect
-	github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6 // indirect
+	github.com/CosmWasm/wasmvm v1.1.1 // indirect
+	github.com/StackExchange/wmi v1.2.1 // indirect
 	github.com/VictoriaMetrics/fastcache v1.6.0 // indirect
 	github.com/Workiva/go-datastructures v1.0.53 // indirect
 	github.com/algorand/go-codec/codec v1.1.8 // indirect
@@ -96,10 +97,12 @@ require (
 	github.com/containerd/cgroups v1.0.4 // indirect
 	github.com/coreos/go-systemd/v22 v22.3.3-0.20220203105225-a9a7ef127534 // indirect
 	github.com/cosmos/btcutil v1.0.5 // indirect
+	github.com/cosmos/cosmos-proto v1.0.0-alpha8 // indirect
 	github.com/cosmos/go-bip39 v1.0.0 // indirect
+	github.com/cosmos/gogoproto v1.4.3 // indirect
 	github.com/cosmos/gorocksdb v1.2.0 // indirect
-	github.com/cosmos/iavl v0.19.3 // indirect
-	github.com/cosmos/ibc-go/v3 v3.3.0 // indirect
+	github.com/cosmos/iavl v0.19.4 // indirect
+	github.com/cosmos/ibc-go/v4 v4.2.0 // indirect
 	github.com/cosmos/ledger-cosmos-go v0.12.1 // indirect
 	github.com/creachadair/taskgroup v0.3.2 // indirect
 	github.com/danieljoos/wincred v1.1.2 // indirect
@@ -111,6 +114,7 @@ require (
 	github.com/dgraph-io/badger/v2 v2.2007.4 // indirect
 	github.com/dgraph-io/ristretto v0.1.0 // indirect
 	github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 // indirect
+	github.com/docker/distribution v2.8.1+incompatible // indirect
 	github.com/docker/go-units v0.5.0 // indirect
 	github.com/dustin/go-humanize v1.0.0 // indirect
 	github.com/dvsekhvalnov/jose2go v1.5.0 // indirect
@@ -119,7 +123,7 @@ require (
 	github.com/felixge/httpsnoop v1.0.2 // indirect
 	github.com/flynn/noise v1.0.0 // indirect
 	github.com/francoispqt/gojay v1.2.13 // indirect
-	github.com/fsnotify/fsnotify v1.5.4 // indirect
+	github.com/fsnotify/fsnotify v1.6.0 // indirect
 	github.com/gagliardetto/binary v0.7.3 // indirect
 	github.com/gagliardetto/treeout v0.1.4 // indirect
 	github.com/go-kit/kit v0.12.0 // indirect
@@ -136,7 +140,7 @@ require (
 	github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
 	github.com/golang/protobuf v1.5.2 // indirect
 	github.com/golang/snappy v0.0.4 // indirect
-	github.com/google/btree v1.0.1 // indirect
+	github.com/google/btree v1.1.2 // indirect
 	github.com/google/flatbuffers v1.12.0 // indirect
 	github.com/google/go-cmp v0.5.9 // indirect
 	github.com/google/go-querystring v1.0.0 // indirect
@@ -225,7 +229,8 @@ require (
 	github.com/nxadm/tail v1.4.8 // indirect
 	github.com/olekukonko/tablewriter v0.0.5 // indirect
 	github.com/onsi/ginkgo v1.16.5 // indirect
-	github.com/onsi/gomega v1.19.0 // indirect
+	github.com/onsi/gomega v1.20.0 // indirect
+	github.com/opencontainers/go-digest v1.0.0 // indirect
 	github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417 // indirect
 	github.com/opentracing/opentracing-go v1.2.0 // indirect
 	github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 // indirect
@@ -235,7 +240,7 @@ require (
 	github.com/pkg/errors v0.9.1 // indirect
 	github.com/pmezard/go-difflib v1.0.0 // indirect
 	github.com/polydawn/refmt v0.0.0-20190807091052-3d65705ee9f1 // indirect
-	github.com/prometheus/client_model v0.2.0 // indirect
+	github.com/prometheus/client_model v0.3.0 // indirect
 	github.com/prometheus/common v0.37.0 // indirect
 	github.com/prometheus/procfs v0.8.0 // indirect
 	github.com/prometheus/tsdb v0.7.1 // indirect
@@ -250,7 +255,7 @@ require (
 	github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible // indirect
 	github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572 // indirect
 	github.com/spaolacci/murmur3 v1.1.0 // indirect
-	github.com/spf13/afero v1.8.2 // indirect
+	github.com/spf13/afero v1.9.2 // indirect
 	github.com/spf13/cast v1.5.0 // indirect
 	github.com/spf13/jwalterweatherman v1.1.0 // indirect
 	github.com/streamingfast/logging v0.0.0-20220813175024-b4fbb0e893df // indirect
@@ -290,7 +295,6 @@ require (
 	gopkg.in/yaml.v2 v2.4.0 // indirect
 	gopkg.in/yaml.v3 v3.0.1 // indirect
 	lukechampine.com/blake3 v1.1.7 // indirect
-	nhooyr.io/websocket v1.8.7 // indirect
 )
 
 // Needed for cosmos-sdk based chains.  See
@@ -301,6 +305,6 @@ replace github.com/wormhole-foundation/wormhole/sdk => ../sdk
 
 replace github.com/wormhole-foundation/wormchain => ../wormchain
 
-replace github.com/CosmWasm/wasmd v0.28.0 => github.com/wormhole-foundation/wasmd v0.28.0-wormhole-2
+replace github.com/CosmWasm/wasmd v0.30.0 => github.com/wormhole-foundation/wasmd v0.30.0-wormchain-1
 
 replace github.com/cosmos/cosmos-sdk => github.com/wormhole-foundation/cosmos-sdk v0.45.9-wormhole

文件差異過大導致無法顯示
+ 205 - 26
node/go.sum


文件差異過大導致無法顯示
+ 353 - 259
node/pkg/proto/node/v1/node.pb.go


+ 12 - 0
proto/node/v1/node.proto

@@ -88,6 +88,7 @@ message GovernanceMessage {
 
     WormchainStoreCode wormchain_store_code = 14;
     WormchainInstantiateContract wormchain_instantiate_contract = 15;
+    WormchainMigrateContract wormchain_migrate_contract = 16;
   }
 }
 
@@ -166,6 +167,17 @@ message WormchainInstantiateContract {
   string instantiation_msg = 3;
 }
 
+message WormchainMigrateContract {
+  // CodeID is the reference to the stored WASM code that the contract should migrate to.
+  uint64 code_id = 1;
+
+  // The address of the contract being migrated.
+  string contract = 2;
+
+  // Msg json encoded message to be passed to the contract on migration
+  string instantiation_msg = 3;
+}
+
 message FindMissingMessagesRequest {
   // Emitter chain ID to iterate.
   uint32 emitter_chain = 1;

+ 30 - 0
sdk/vaa/governance.go

@@ -57,3 +57,33 @@ func CreateInstatiateCosmwasmContractHash(codeId uint64, label string, msg []byt
 
 	return expected_hash
 }
+
+// Compute the hash for cosmwasm contract migration params.
+// The hash is keccak256 hash(hash(hash(BigEndian(CodeID)), Contract), Msg).
+// We compute the nested hash so there is no chance of bytes leaking between CodeID, Contract, and Msg.
+func CreateMigrateCosmwasmContractHash(codeId uint64, contract string, msg []byte) [32]byte {
+	var expected_hash [32]byte
+
+	// hash(BigEndian(CodeID))
+	var codeId_hash [32]byte
+	keccak := sha3.NewLegacyKeccak256()
+	if err := binary.Write(keccak, binary.BigEndian, codeId); err != nil {
+		panic(fmt.Sprintf("failed to write binary data (%d): %v", codeId, err))
+	}
+	keccak.Sum(codeId_hash[:0])
+	keccak.Reset()
+
+	// hash(hash(BigEndian(CodeID)), Label)
+	var codeIdContract_hash [32]byte
+	keccak.Write(codeId_hash[:])
+	keccak.Write([]byte(contract))
+	keccak.Sum(codeIdContract_hash[:0])
+	keccak.Reset()
+
+	// hash(hash(hash(BigEndian(CodeID)), Label), Msg)
+	keccak.Write(codeIdContract_hash[:])
+	keccak.Write(msg)
+	keccak.Sum(expected_hash[:0])
+
+	return expected_hash
+}

+ 10 - 0
sdk/vaa/payloads.go

@@ -24,6 +24,7 @@ var (
 	// Wormchain cosmwasm governance actions
 	ActionStoreCode           GovernanceAction = 1
 	ActionInstantiateContract GovernanceAction = 2
+	ActionMigrateContract     GovernanceAction = 3
 )
 
 type (
@@ -62,6 +63,11 @@ type (
 	BodyWormchainInstantiateContract struct {
 		InstantiationParamsHash [32]byte
 	}
+
+	// BodyWormchainInstantiateContract is a governance message to migrate a cosmwasm contract on wormchain
+	BodyWormchainMigrateContract struct {
+		MigrationParamsHash [32]byte
+	}
 )
 
 func (b BodyContractUpgrade) Serialize() []byte {
@@ -118,6 +124,10 @@ func (r BodyWormchainInstantiateContract) Serialize() []byte {
 	return serializeBridgeGovernanceVaa(WasmdModuleStr, ActionInstantiateContract, ChainIDWormchain, r.InstantiationParamsHash[:])
 }
 
+func (r BodyWormchainMigrateContract) Serialize() []byte {
+	return serializeBridgeGovernanceVaa(WasmdModuleStr, ActionMigrateContract, ChainIDWormchain, r.MigrationParamsHash[:])
+}
+
 func serializeBridgeGovernanceVaa(module string, actionId GovernanceAction, chainId ChainID, payload []byte) []byte {
 	if len(module) > 32 {
 		panic("module longer than 32 byte")

+ 6 - 0
sdk/vaa/payloads_test.go

@@ -117,3 +117,9 @@ func TestBodyWormchainInstantiateContractSerialize(t *testing.T) {
 	expected := "0000000000000000000000000000000000000000005761736d644d6f64756c65020c200102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20"
 	assert.Equal(t, expected, hex.EncodeToString(actual.Serialize()))
 }
+
+func TestBodyWormchainMigrateContractSerialize(t *testing.T) {
+	actual := BodyWormchainMigrateContract{MigrationParamsHash: dummyBytes}
+	expected := "0000000000000000000000000000000000000000005761736d644d6f64756c65030c200102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20"
+	assert.Equal(t, expected, hex.EncodeToString(actual.Serialize()))
+}

+ 1 - 1
wormchain/Dockerfile

@@ -13,7 +13,7 @@ COPY ./sdk /sdk
 RUN go mod download
 
 # copy over c bindings (libwasmvm.x86_64.so, etc)
-RUN cp -r /go/pkg/mod/github.com/!cosm!wasm/wasmvm@v1.0.0/api/* /usr/lib
+RUN cp -r /go/pkg/mod/github.com/!cosm!wasm/wasmvm@v1.1.1/internal/api/* /usr/lib
 
 COPY ./wormchain .
 

+ 8 - 8
wormchain/app/app.go

@@ -69,14 +69,14 @@ import (
 	upgradeclient "github.com/cosmos/cosmos-sdk/x/upgrade/client"
 	upgradekeeper "github.com/cosmos/cosmos-sdk/x/upgrade/keeper"
 	upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types"
-	"github.com/cosmos/ibc-go/v3/modules/apps/transfer"
-	ibctransferkeeper "github.com/cosmos/ibc-go/v3/modules/apps/transfer/keeper"
-	ibctransfertypes "github.com/cosmos/ibc-go/v3/modules/apps/transfer/types"
-	ibc "github.com/cosmos/ibc-go/v3/modules/core"
-	ibcclient "github.com/cosmos/ibc-go/v3/modules/core/02-client"
-	ibcporttypes "github.com/cosmos/ibc-go/v3/modules/core/05-port/types"
-	ibchost "github.com/cosmos/ibc-go/v3/modules/core/24-host"
-	ibckeeper "github.com/cosmos/ibc-go/v3/modules/core/keeper"
+	transfer "github.com/cosmos/ibc-go/v4/modules/apps/transfer"
+	ibctransferkeeper "github.com/cosmos/ibc-go/v4/modules/apps/transfer/keeper"
+	ibctransfertypes "github.com/cosmos/ibc-go/v4/modules/apps/transfer/types"
+	ibc "github.com/cosmos/ibc-go/v4/modules/core"
+	ibcclient "github.com/cosmos/ibc-go/v4/modules/core/02-client"
+	ibcporttypes "github.com/cosmos/ibc-go/v4/modules/core/05-port/types"
+	ibchost "github.com/cosmos/ibc-go/v4/modules/core/24-host"
+	ibckeeper "github.com/cosmos/ibc-go/v4/modules/core/keeper"
 	"github.com/prometheus/client_golang/prometheus"
 	"github.com/spf13/cast"
 	abci "github.com/tendermint/tendermint/abci/types"

+ 3 - 0
wormchain/app/wasm_handlers/bank.go

@@ -28,6 +28,9 @@ func (b *BankViewKeeperHandler) GetAllBalances(ctx sdk.Context, addr sdk.AccAddr
 func (b *BankViewKeeperHandler) GetBalance(ctx sdk.Context, addr sdk.AccAddress, denom string) sdk.Coin {
 	return b.Keeper.GetBalance(ctx, addr, denom)
 }
+func (b *BankViewKeeperHandler) GetSupply(ctx sdk.Context, denom string) sdk.Coin {
+	return b.Keeper.GetSupply(ctx, denom)
+}
 
 func (b *BurnerHandler) BurnCoins(ctx sdk.Context, moduleName string, amt sdk.Coins) error {
 	return b.Keeper.BurnCoins(ctx, moduleName, amt)

+ 6 - 6
wormchain/app/wasm_handlers/ibc.go

@@ -6,12 +6,12 @@ import (
 	wasmtypes "github.com/CosmWasm/wasmd/x/wasm/types"
 	sdk "github.com/cosmos/cosmos-sdk/types"
 	capabilitytypes "github.com/cosmos/cosmos-sdk/x/capability/types"
-	ibcappkeeper "github.com/cosmos/ibc-go/v3/modules/apps/transfer/keeper"
-	connectiontypes "github.com/cosmos/ibc-go/v3/modules/core/03-connection/types"
-	ibckeeper "github.com/cosmos/ibc-go/v3/modules/core/04-channel/keeper"
-	channeltypes "github.com/cosmos/ibc-go/v3/modules/core/04-channel/types"
-	ibcportkeeper "github.com/cosmos/ibc-go/v3/modules/core/05-port/keeper"
-	ibcexported "github.com/cosmos/ibc-go/v3/modules/core/exported"
+	ibcappkeeper "github.com/cosmos/ibc-go/v4/modules/apps/transfer/keeper"
+	connectiontypes "github.com/cosmos/ibc-go/v4/modules/core/03-connection/types"
+	ibckeeper "github.com/cosmos/ibc-go/v4/modules/core/04-channel/keeper"
+	channeltypes "github.com/cosmos/ibc-go/v4/modules/core/04-channel/types"
+	ibcportkeeper "github.com/cosmos/ibc-go/v4/modules/core/05-port/keeper"
+	ibcexported "github.com/cosmos/ibc-go/v4/modules/core/exported"
 )
 
 // This defines which modules we actually want to expose cosmwasm contracts.

+ 10 - 11
wormchain/go.mod

@@ -3,27 +3,26 @@ module github.com/wormhole-foundation/wormchain
 go 1.16
 
 require (
-	github.com/CosmWasm/wasmd v0.28.0
-	github.com/CosmWasm/wasmvm v1.0.0
-	github.com/cosmos/cosmos-sdk v0.45.9
+	github.com/CosmWasm/wasmd v0.30.0
+	github.com/CosmWasm/wasmvm v1.1.1
+	github.com/cosmos/cosmos-sdk v0.45.11
 	github.com/cosmos/ibc-go/v3 v3.3.0
-	github.com/dgraph-io/ristretto v0.1.0 // indirect
+	github.com/cosmos/ibc-go/v4 v4.2.0
 	github.com/ethereum/go-ethereum v1.10.21
 	github.com/gogo/protobuf v1.3.3
-	github.com/golang/glog v1.0.0 // indirect
 	github.com/golang/protobuf v1.5.2
 	github.com/gorilla/mux v1.8.0
 	github.com/grpc-ecosystem/grpc-gateway v1.16.0
-	github.com/prometheus/client_golang v1.12.2
+	github.com/prometheus/client_golang v1.14.0
 	github.com/spf13/cast v1.5.0
-	github.com/spf13/cobra v1.5.0
-	github.com/stretchr/testify v1.8.0
+	github.com/spf13/cobra v1.6.0
+	github.com/stretchr/testify v1.8.1
 	github.com/tendermint/crypto v0.0.0-20191022145703-50d29ede1e15
 	github.com/tendermint/spm v0.1.9
-	github.com/tendermint/tendermint v0.34.21
+	github.com/tendermint/tendermint v0.34.23
 	github.com/tendermint/tm-db v0.6.7
 	github.com/wormhole-foundation/wormhole/sdk v0.0.0-20220926172624-4b38dc650bb0
-	golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e
+	golang.org/x/crypto v0.1.0
 	golang.org/x/net v0.2.0 // indirect
 	google.golang.org/genproto v0.0.0-20221114212237-e4508ebdbee1
 	google.golang.org/grpc v1.50.1
@@ -32,7 +31,7 @@ require (
 
 replace (
 	github.com/99designs/keyring => github.com/cosmos/keyring v1.1.7-0.20210622111912-ef00f8ac3d76
-	github.com/CosmWasm/wasmd v0.28.0 => github.com/wormhole-foundation/wasmd v0.28.0-wormhole-3
+	github.com/CosmWasm/wasmd v0.30.0 => github.com/wormhole-foundation/wasmd v0.30.0-wormchain-1
 	github.com/cosmos/cosmos-sdk => github.com/wormhole-foundation/cosmos-sdk v0.45.9-wormhole-2
 	github.com/gogo/protobuf => github.com/regen-network/protobuf v1.3.3-alpha.regen.1
 	github.com/wormhole-foundation/wormhole/sdk => ../sdk

文件差異過大導致無法顯示
+ 210 - 43
wormchain/go.sum


+ 27 - 1
wormchain/proto/wormhole/tx.proto

@@ -19,6 +19,9 @@ service Msg {
   //  Instantiate creates a new smart contract instance for the given code id.
   rpc InstantiateContract(MsgInstantiateContract)
       returns (MsgInstantiateContractResponse);
+
+  rpc MigrateContract(MsgMigrateContract)
+    returns (MsgMigrateContractResponse);
 // this line is used by starport scaffolding # proto/tx/rpc
 }
 
@@ -70,6 +73,8 @@ message MsgStoreCode {
 message MsgStoreCodeResponse {
   // CodeID is the reference to the stored WASM code
   uint64 code_id = 1 [ (gogoproto.customname) = "CodeID" ];
+  // Checksum is the sha256 hash of the stored code
+  bytes checksum = 2;
 }
 
 // Same as from x/wasmd but with vaa auth
@@ -82,7 +87,7 @@ message MsgInstantiateContract {
   string label = 4;
   // Msg json encoded message to be passed to the contract on instantiation
   bytes msg = 5;
-  // vaa must be governance msg with payload containing sha3 256 hash of `bigEndian(code_id) || label || msg`
+  // vaa must be governance msg with payload containing keccak256 hash(hash(hash(BigEndian(CodeID)), Label), Msg)
   bytes vaa = 6;
 }
 
@@ -93,4 +98,25 @@ message MsgInstantiateContractResponse {
   bytes data = 2;
 }
 
+// MsgMigrateContract runs a code upgrade/ downgrade for a smart contract
+message MsgMigrateContract {
+  // Sender is the that actor that signed the messages
+  string signer = 1;
+  // Contract is the address of the smart contract
+  string contract = 2;
+  // CodeID references the new WASM code
+  uint64 code_id = 3 [ (gogoproto.customname) = "CodeID" ];
+  // Msg json encoded message to be passed to the contract on migration
+  bytes msg = 4;
+
+  // vaa must be governance msg with payload containing keccak256 hash(hash(hash(BigEndian(CodeID)), Contract), Msg)
+  bytes vaa = 6;
+}
+
+// MsgMigrateContractResponse returns contract migration result data.
+message MsgMigrateContractResponse {
+  // Data contains same raw bytes returned as data from the wasm contract.
+  // (May be empty)
+  bytes data = 1;
+}
 // this line is used by starport scaffolding # proto/tx/message

+ 762 - 852
wormchain/testutil/keeper/example_contract.go

@@ -13,855 +13,765 @@ func init() {
 }
 
 var EXAMPLE_WASM_CONTRACT_GZIP = []byte{}
-var _EXAMPLE_WASM_CONTRACT_B64_GZIP = `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
-9re8+z1f+cY3i03TIGnJS17xyldds6rvTW/5EBT58ld+9PBPjxWbFi5Z1Tey/RP3f+7z//adY/91
-y2vfeNcHP/f5L//zN775ve9ftuuzX/+nb3xzyZXLXvKyV13z+jff/vFPfurzX/inf/5O06TJr3jl
-737/pxMj6wZ/+KOGcwbWt591zWtu/ujHtvzj/ZMmn33OosVXLnvpy1/5qpu3/MOXD/3bg8f+67dD
-G28f3vSOZ8ycdffHPvX5f/7md370rkveuavz9nP+5dA3Tly57OWvyPqN4XmzfvmrgfVdz3pOz8Kd
-b3nhdZsOfOXgtw5/92d/OmFF15S3/cjddqnf5maatt7TMPIR75zc1jZnii/cWe48N+uIbCbblL+q
-cUL2RVnHbc/nHN/JOrh6Cq7nBBnRMNG7MtuWfUnWzkwqXuU+15nhCLcp01hY4J719GuidW7l6SMH
-vG17namZbY87L8tOyrXmWgothUomn5maeVn2Am9RfrpbcIUzO5juTs0Ezsg98GrW7Cuckbv8i51G
-5+Jst3+Bt+1EU6s/q2mGU2osNY7c5m5755Rg4o47vFneM7N2Q2tu5HPl4cLIt6cWvJET3siPCr9+
-j9OV2/rKlpF9/sjXvHzrM518pttf5Bcyw8HZzsvdl+VGbmltz0/KXe6OvCHzkbsKk93Z73O3fu8Z
-2YLnjXww3PrbrIjOz8DbN7kjn3PanMailRECBmd72azt+zk77wV2gxuKJnuC19zUIibak+0pxXbv
-LP9cUXH77Y8599vftL9lHyr8W+7b9nfs74kj3kP2z9yj9i+jY+5xGxBVFM575rOvXHb7e9/7t69+
-49ve8f5PfObWj2eyufnPevaLf3PwW25L6/yuF79ky4c/+rHPXnhkwute/+b3akxERLxy2aq+V37y
-U23tWT8ftEyef9GCPR86/N1c18637Mnmn/nsa9fc/tb113z+l796+YpHHzvxrnfPnHVex4ves/t9
-H7jr7j33fub+/ZmgMPGsBc9Z+PwP3v3A13dnp0wtP/3Zz/nZI7868eV/cqOnPf0ZHXO7F1z2vMuv
-euGLXoxIt3xl37X9G294zZY33PXhj+0dPfjRjw2sf9uryq/2HHeGc60jZs0c2XaWM7ux3T03d7Z3
-gXep23D+yIcz57rnuh3+vODK527tyk3K+63PXHiRs9LPdU7ySk6bJy7pdpd6s9x8Npe9JDrPLeTm
-Owu8qVm3kL1qSdfc4tzsTD+/9RkvuLLDP3/S1Ge0t0zOXQkNXFqcks1nLvPPy20KnhOfn3mml888
-PyO80PFG3rji7Mv8/MgHX1VeGOQzxeYFmfz86e7kkU9fvOqFhcty+UUL2y7zX1hcsjW7KH+Ws3hJ
-l9Pg5zMXZfNb508Z+ZRonFO85d3XbgpG9r/h8pXF7bNu/9a2xe/79LaLsue7r8w8I78o3+E1b9v7
-ir6l7kXZpksQB9553N/+7fNz7//Z1rkznCbX33rb691+r+jksuFbly/ODV888rv8Rn/DxEUj72op
-vCQ3ZeR1Wxc7r+1pnLj9qnNGHrpg5N9mOFNde+sl5zQt8MT2IyO/n3a5m3ftW5ouvfxZI1+8OCPc
-F3lt8+ytDdPdVYUX50c+2n1WcbqbA7zPjLzrlsMw6KIzXHhZFlZRY8HthsF0+OUrt15dmOh4TjZ3
-lhN4mXw+4wNVHfna0/PbM2MSaPl9DVrwMI2+8aKQ7MDxzkeH8Yx7zUnGM+6r0S4GzUdRjjXlp02W
-tEfSGwI2tNi04Zrh9WxyBZJSWubajPzAsaxb3Mh6i7fc+qvm3daEydE5hWj5Ob+avvuC8zuj6es/
-eGS6vWf5jLP/uHym9ado/ntPLJ//uHhovsiXus4tPtT1kYbei2a1vu+izvaHFv/m7NLlxyoPLVu2
-vnTVe+5/31XWN3uf3/et9z3f+l7pBdaRh17Y+VDviz764/e9+ODRh14cWQMvOSZOvASE6Kw1A4QR
-G/4TlwWdE0PRB4TOtoX7NHF22yuCBbmcaHVFDuiCd4FzsX9+q4i6oIDrA0HL5u2zxAIs7vqQJW9P
-FbZ9ERAQF8UPcbbtiACfPcggWuxJQF4WYFuQO+vk7bPFM6FsAUp2QPVQK0ymcLN2QLVil6BRG5/b
-7YvspJWzxGXCFVC58MXzhZ0t+CvQaVzmeXYbSVZdDQJa9AJxbk5c64oMdMqeYrtO6BbhZ0Y0CoC7
-c5Z9Nvx3iS2yvrCDnACyLjbZZbHZce2cyDjfByBAb7NYo+1n8rboPGe22wnPnujIFewIBimcbkEd
-cRb4tr3LEUWRxQYd+58uscSXSpbzJrE8sjJrbMsV+ci+yraQwIoptifeaU+dUBTP8KcEM51OgSA7
-Tzw3g5JbAcY1S8yFWm3bg3Gfb/vilwg2AcJIGOKWSPxYvN2zHBil2+G44u+gfsv+m2C2+2oxv3Ea
-jDLvzIYas+JZzrme8J8tCva8HKw4cY2DgMyI3cLxJxJUhZgkGrKO9yUfBzIZIZrBScIJ+AX0KwPf
-bfaLfEypCCos+hyYUM/KCfu3MB+ADWIntOaKKN+RoVnK2M5MALaVBWCIF0yCjkAtf51xsFaA4GXY
-lIBxAG+zxHPc5+PvmfZkEMod1/N9O3u2e4djdblzfNEgJnmiEWpqolo8wFjxLNfKrstay0eOWSS3
-oU7jGcbn1bAffRV8unFfCh/cT/5/bE4dzHI2AgA=`
+
+// To generate this:
+//
+//  1. pick any cosmwasm contract project and ensure the minimal
+//     & permissive implementations of the entry points: instantiate, execute, migrate.
+//
+//  2. Update `.cargo/config.toml` with these optimizations.
+//     [profile.release]
+//     opt-level = "s"
+//     lto = true
+//     strip = true
+//
+// 3. Compile: `cargo build --target wasm32-unknown-unknown --release`
+// 4. Generate base64 gzip: `cat target/wasm32-unknown-unknown/release/cw_nameservice.wasm|gzip |base64`
+// 5. Copy here.
+var _EXAMPLE_WASM_CONTRACT_B64_GZIP = `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
+4/Lj7BO88fpJesnqMO42P2ncb3zH+K6xK/eDzA+Nh40f67vtXxj/az1m/D7caz1p/N18Ws+dfPpZ
+Fy182wc/+KH/fMs7333rpz5/3ScdN9N85lmv+PPO71p19c0tr3jlho994u4vnrZ75Bvf9NYPxsiI
+uHjRwuXtr/vMZxvGuV7WrxvbPGv2HR995EeZlq1vv8PNnn7WilVve8eIrssf+P0fXrP0iX37L138
+vvdPnnJy42Uf2HbLh7fffsddn79/h+PnRp8w++w5F992+0Pf2uYed3zxpWed/b+P/2H/V79mhS95
+6csap8+cfd75Fyy69LJXIO4tWda+oqP3qtdvePP2j919z+DOT9zd2fWld/578T9t05pkrjD1KZP7
+N51gTq0dZ52UOdE+1T7Xqjml/2POSdZJVqM3w7/o5RtbMmOyXv3pc2aZy7xM0xi7YDbY+jkzrQX2
+FCvrZtxzwpOtXKbZnG0f71o5d9H8lun56e5kL7vxZZcsONU7ZczxLxtXNzZzETRwbv44N+uc552c
+Wee3nnWKc7qddS52dDsw7f63LD3xPC/bf9u/F+f4WSc/araTbZ5oje3/3BnLL82dl8nOndNwnndp
+fr6b7f/r3OwJ5rz5LWaNl3VmudmNzce5p5vjXqHXTstvfv+KdX7/jjdfsCw/0BSMedvHNs275XOb
+ZrmnWK9zXpadm220R22657XtC6xZ7ohzECXe86Q38MNTMrf+78bptfoJTo3lbbz+TVaHnTczbvCO
+JfMyfWf0/zXb660dPfc/cCm8MnNc/xs3zjPf0Fo7emDReMfp/8Gp9lkFfe0k83jL2HjO+BGzbX3j
+zlM2/br/bxMusLKWsXnEuRec2f+VMxzdusxumGFsrJloLc+9Itv/iZkn5CdaGVgRTv/7Nj9ijTDz
+5pXW5Q6sr9qcNRMG1+gVL9q4OHcC9KXZq4GsGbf/my/NDjhD0nDxezkq+gAZD2cGRKvx7HUW/KFK
+KfLxKq+EevF0BogPA6xssW7t5X1drHYFnEqav+pC+m9q2mYr1N5uL9H+bdQ2beTYcHwuXDL+DxO3
+nXpKUzix67bdE407lkw68eklk7V/hM0f3L+k+Rn9F816ttByUv4XLR+vaZs1pf6WWU3j2s7784m3
+XHDOjLZFe0u3XLywq3DJB+6/5RLtO22Xtn/3lku1HxcWa7t/cdknftn2ysf3FF6987FbXh1qv3/1
+Xn3Da7S1mqtNAgbDgP/p5/lNowO9HaibYejWS/QTG17rz85k9HpLzwAxsE81z/BOqdfDFihgeUDF
+3Kxxgj4bi1seZMkax+uGMQuohoUshX6iYeo+vtvoXbPOGAM0ZTa2BbldM2ucqJ8OZXNQshGqh1pN
+G0iOa/hUK3YJGjXwfZwxy0haOUE/T7d0qFz39It1w815S3Uj47vzjQbillpqdGjR9vWTMvoKS3eg
+U8ZxhmUGVh4eHb1WB9ibJxgnwv/OMXTX0w0/owMt19cZRX29aRkZ3TF/AkCA3rpYo+E5WUNvGj/V
+aoJ3W2/M5IwQBqmbM3XqiDnbM4ybTD2vu9igaXztHE3/r4Jm3qAvCTVnlaFZejY0FhkaUlX9OMPW
+32McPzKvv8w7zp9sNukIspP1lzvIjeVgXFP06VCrYdgw7lMMT/89gk0HZiUI8Eik/1J/l62ZMEqr
+0bT0j0D9mrHInOtPtf5Tb66dAOPMmlOhTlc/0zzJ1r2z9JwxIwPLSb/cRFACUPQP6KY3miCr62P0
+Gte0/8vDwYxFqDo4UTgJv4W+OfDbYFzmYUpJp+J6uwmTamsZ3fgLzAlghL4V2rP0MNvo0Ew5hjkZ
+AA6ME+S+ZAx0BWr5D8fEWgGK52FTugazO8O28Ul3ajXY4DT9bOtiSNcmG2OB8TYt2/MM90TrRlNr
+saZ5eo0+xtZrodYRVKO9XN8GZc60AALuGldb0r8XeEWxbs8Wshvk/U4Qv/JvMvB+I+Dvt3DW/Cr8
+fQjOnP8fkFLH7Rs5AgA=`

+ 1 - 0
wormchain/x/wormhole/client/cli/tx.go

@@ -24,6 +24,7 @@ func GetTxCmd() *cobra.Command {
 	cmd.AddCommand(CmdRegisterAccountAsGuardian())
 	cmd.AddCommand(CmdStoreCode())
 	cmd.AddCommand(CmdInstantiateContract())
+	cmd.AddCommand(CmdMigrateContract())
 	cmd.AddCommand(CmdCreateAllowedAddress())
 	cmd.AddCommand(CmdDeleteAllowedAddress())
 	// this line is used by starport scaffolding # 1

+ 57 - 7
wormchain/x/wormhole/client/cli/tx_wasmd.go

@@ -5,7 +5,6 @@ import (
 	"io/ioutil"
 	"strconv"
 
-	"encoding/binary"
 	"encoding/hex"
 
 	"github.com/CosmWasm/wasmd/x/wasm/ioutils"
@@ -16,6 +15,7 @@ import (
 	"github.com/spf13/cast"
 	"github.com/spf13/cobra"
 	"github.com/wormhole-foundation/wormchain/x/wormhole/types"
+	"github.com/wormhole-foundation/wormhole/sdk/vaa"
 	"golang.org/x/crypto/sha3"
 )
 
@@ -132,12 +132,62 @@ func CmdInstantiateContract() *cobra.Command {
 				}
 				return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), &msg)
 			} else {
-				var hash [32]byte
-				keccak := sha3.NewLegacyKeccak256()
-				binary.Write(keccak, binary.BigEndian, msg.CodeID)
-				keccak.Write([]byte(msg.Label))
-				keccak.Write([]byte(msg.Msg))
-				keccak.Sum(hash[:0])
+				hash := vaa.CreateInstatiateCosmwasmContractHash(msg.CodeID, msg.Label, msg.Msg)
+				fmt.Println(hex.EncodeToString(hash[:]))
+				return nil
+			}
+		},
+	}
+
+	cmd.Flags().String("label", "", "A human-readable name for this contract in lists")
+	flags.AddTxFlagsToCmd(cmd)
+
+	return cmd
+}
+
+func CmdMigrateContract() *cobra.Command {
+	cmd := &cobra.Command{
+		Use:   "migrate [contract] [code_id_int64] [json_encoded_init_args] [vaa-hex]",
+		Short: "Migrate a wasmd contract, or just compute the hash for vaa if vaa is omitted",
+		Args:  cobra.RangeArgs(3, 4),
+		RunE: func(cmd *cobra.Command, args []string) (err error) {
+			clientCtx, err := client.GetClientTxContext(cmd)
+			if err != nil {
+				return err
+			}
+			hash_only := len(args) == 3
+
+			contract := args[0]
+
+			codeId, err := cast.ToUint64E(args[1])
+			if err != nil {
+				return err
+			}
+
+			initMsg := args[2]
+
+			vaaBz := []byte{}
+			if !hash_only {
+				vaaBz, err = hex.DecodeString(args[3])
+				if err != nil {
+					return err
+				}
+			}
+
+			msg := types.MsgMigrateContract{
+				Signer:   clientCtx.GetFromAddress().String(),
+				CodeID:   codeId,
+				Contract: contract,
+				Msg:      []byte(initMsg),
+				Vaa:      vaaBz,
+			}
+			if !hash_only {
+				if err := msg.ValidateBasic(); err != nil {
+					return err
+				}
+				return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), &msg)
+			} else {
+				hash := vaa.CreateMigrateCosmwasmContractHash(msg.CodeID, msg.Contract, msg.Msg)
 				fmt.Println(hex.EncodeToString(hash[:]))
 				return nil
 			}

+ 3 - 0
wormchain/x/wormhole/handler.go

@@ -29,6 +29,9 @@ func NewHandler(k keeper.Keeper) sdk.Handler {
 		case *types.MsgInstantiateContract:
 			res, err := msgServer.InstantiateContract(sdk.WrapSDKContext(ctx), msg)
 			return sdk.WrapServiceResult(ctx, res, err)
+		case *types.MsgMigrateContract:
+			res, err := msgServer.MigrateContract(sdk.WrapSDKContext(ctx), msg)
+			return sdk.WrapServiceResult(ctx, res, err)
 		case *types.MsgCreateAllowlistEntryRequest:
 			res, err := msgServer.CreateAllowlistEntry(sdk.WrapSDKContext(ctx), msg)
 			return sdk.WrapServiceResult(ctx, res, err)

+ 58 - 5
wormchain/x/wormhole/keeper/msg_server_wasmd.go

@@ -12,6 +12,8 @@ import (
 	"golang.org/x/crypto/sha3"
 )
 
+var WASMD_CONTRACT_ADMIN = sdk.AccAddress("wormchain")
+
 // Simple wrapper of x/wasmd StoreCode that requires a VAA
 func (k msgServer) StoreCode(goCtx context.Context, msg *types.MsgStoreCode) (*types.MsgStoreCodeResponse, error) {
 	if !k.setWasmd {
@@ -52,12 +54,13 @@ func (k msgServer) StoreCode(goCtx context.Context, msg *types.MsgStoreCode) (*t
 		sdk.NewAttribute(sdk.AttributeKeyModule, types.ModuleName),
 		sdk.NewAttribute(sdk.AttributeKeySender, msg.Signer),
 	))
-	codeID, err := k.wasmdKeeper.Create(ctx, senderAddr, msg.WASMByteCode, &wasmdtypes.DefaultUploadAccess)
+	codeID, chksum, err := k.wasmdKeeper.Create(ctx, senderAddr, msg.WASMByteCode, &wasmdtypes.DefaultUploadAccess)
 	if err != nil {
 		return nil, err
 	}
 	return &types.MsgStoreCodeResponse{
-		CodeID: codeID,
+		CodeID:   codeID,
+		Checksum: chksum,
 	}, nil
 }
 
@@ -84,9 +87,8 @@ func (k msgServer) InstantiateContract(goCtx context.Context, msg *types.MsgInst
 		return nil, types.ErrUnknownGovernanceAction
 	}
 
-	// Need to verify the instatiation arguments
+	// Need to verify the instantiation arguments
 	// The vaa governance payload must contain the hash of the expected args.
-
 	expected_hash := vaa.CreateInstatiateCosmwasmContractHash(msg.CodeID, msg.Label, msg.Msg)
 	if !bytes.Equal(payload, expected_hash[:]) {
 		return nil, types.ErrInvalidHash
@@ -102,7 +104,7 @@ func (k msgServer) InstantiateContract(goCtx context.Context, msg *types.MsgInst
 		sdk.NewAttribute(sdk.AttributeKeyModule, types.ModuleName),
 		sdk.NewAttribute(sdk.AttributeKeySender, msg.Signer),
 	))
-	contract_addr, data, err := k.wasmdKeeper.Instantiate(ctx, msg.CodeID, senderAddr, sdk.AccAddress{}, msg.Msg, msg.Label, sdk.Coins{})
+	contract_addr, data, err := k.wasmdKeeper.Instantiate(ctx, msg.CodeID, senderAddr, WASMD_CONTRACT_ADMIN, msg.Msg, msg.Label, sdk.Coins{})
 	if err != nil {
 		return nil, err
 	}
@@ -111,3 +113,54 @@ func (k msgServer) InstantiateContract(goCtx context.Context, msg *types.MsgInst
 		Data:    data,
 	}, nil
 }
+
+func (k msgServer) MigrateContract(goCtx context.Context, msg *types.MsgMigrateContract) (*types.MsgMigrateContractResponse, error) {
+	ctx := sdk.UnwrapSDKContext(goCtx)
+
+	// Parse VAA
+	v, err := ParseVAA(msg.Vaa)
+	if err != nil {
+		return nil, err
+	}
+
+	// Verify VAA
+	action, payload, err := k.VerifyGovernanceVAA(ctx, v, vaa.WasmdModule)
+	if err != nil {
+		return nil, err
+	}
+
+	if vaa.GovernanceAction(action) != vaa.ActionMigrateContract {
+		return nil, types.ErrUnknownGovernanceAction
+	}
+
+	// Need to verify the instantiation arguments
+	// The vaa governance payload must contain the hash of the expected args.
+	expected_hash := vaa.CreateMigrateCosmwasmContractHash(msg.CodeID, msg.Contract, msg.Msg)
+	if !bytes.Equal(payload, expected_hash[:]) {
+		return nil, types.ErrInvalidHash
+	}
+
+	_, err = sdk.AccAddressFromBech32(msg.Signer)
+	if err != nil {
+		return nil, sdkerrors.Wrap(err, "sender")
+	}
+	contractAddr, err := sdk.AccAddressFromBech32(msg.Contract)
+	if err != nil {
+		return nil, sdkerrors.Wrap(err, "contract")
+	}
+
+	ctx.EventManager().EmitEvent(sdk.NewEvent(
+		sdk.EventTypeMessage,
+		sdk.NewAttribute(sdk.AttributeKeyModule, types.ModuleName),
+		sdk.NewAttribute(sdk.AttributeKeySender, msg.Signer),
+	))
+
+	data, err := k.wasmdKeeper.Migrate(ctx, contractAddr, WASMD_CONTRACT_ADMIN, msg.CodeID, msg.Msg)
+	if err != nil {
+		return nil, err
+	}
+
+	return &types.MsgMigrateContractResponse{
+		Data: data,
+	}, nil
+}

+ 182 - 1
wormchain/x/wormhole/keeper/msg_server_wasmd_test.go

@@ -42,6 +42,22 @@ func createWasmInstantiatePayload(code_id uint64, label string, json_msg string)
 	return payload.Bytes()
 }
 
+func createWasmMigratePayload(code_id uint64, contract string, json_msg string) []byte {
+	// governance message with sha3 of arguments to instantiate
+	// - code_id (big endian)
+	// - label
+	// - json_msg
+	expected_hash := vaa.CreateMigrateCosmwasmContractHash(code_id, contract, []byte(json_msg))
+
+	var payload bytes.Buffer
+	payload.Write(vaa.WasmdModule[:])
+	payload.Write([]byte{byte(vaa.ActionMigrateContract)})
+	binary.Write(&payload, binary.BigEndian, uint16(vaa.ChainIDWormchain))
+	// custom payload
+	payload.Write(expected_hash[:])
+	return payload.Bytes()
+}
+
 func TestWasmdStoreCode(t *testing.T) {
 	k, ctx := keepertest.WormholeKeeper(t)
 	guardians, privateKeys := createNGuardianValidator(k, ctx, 10)
@@ -207,7 +223,7 @@ func TestWasmdInstantiateContract(t *testing.T) {
 	// Bad msg
 	assert.ErrorIs(t, err, types.ErrInvalidHash)
 
-	// Sending to wrong module is error
+	// Sending to wrong module is error (basically test that governance verification is in place)
 	payload_wrong_module := createWasmInstantiatePayload(code_id, "btc", "{}")
 	// tamper with the module id
 	payload_wrong_module[16] = 0xff
@@ -221,4 +237,169 @@ func TestWasmdInstantiateContract(t *testing.T) {
 		Vaa:    vBz,
 	})
 	assert.ErrorIs(t, err, types.ErrUnknownGovernanceModule)
+
+	// test action byte is checked by sending a valid migrate vaa
+	payload = createWasmMigratePayload(code_id, "btc", "{}")
+	v = generateVaa(set.Index, privateKeys, vaa.ChainID(vaa.GovernanceChain), payload)
+	vBz, _ = v.Marshal()
+	_, err = msgServer.InstantiateContract(context, &types.MsgInstantiateContract{
+		Signer: signer.String(),
+		CodeID: code_id,
+		Label:  "btc",
+		Msg:    []byte("{}"),
+		Vaa:    vBz,
+	})
+	assert.ErrorIs(t, err, types.ErrUnknownGovernanceAction)
+}
+
+func TestWasmdMigrateContract(t *testing.T) {
+	k, ctx := keepertest.WormholeKeeper(t)
+	guardians, privateKeys := createNGuardianValidator(k, ctx, 10)
+	_ = privateKeys
+	k.SetConfig(ctx, types.Config{
+		GovernanceEmitter:     vaa.GovernanceEmitter[:],
+		GovernanceChain:       uint32(vaa.GovernanceChain),
+		ChainId:               uint32(vaa.ChainIDWormchain),
+		GuardianSetExpiration: 86400,
+	})
+	signer_bz := [20]byte{}
+	signer := sdk.AccAddress(signer_bz[:])
+
+	set := createNewGuardianSet(k, ctx, guardians)
+
+	context := sdk.WrapSDKContext(ctx)
+	msgServer := keeper.NewMsgServerImpl(*k)
+
+	// First we need to (1) upload some codes and (2) instantiate.
+	// (1) upload
+	payload := createWasmStoreCodePayload(keepertest.EXAMPLE_WASM_CONTRACT_GZIP)
+	code_ids := []uint64{}
+	for i := 0; i < 5; i++ {
+		v := generateVaa(set.Index, privateKeys, vaa.ChainID(vaa.GovernanceChain), payload)
+		vBz, err := v.Marshal()
+		assert.NoError(t, err)
+		res, err := msgServer.StoreCode(context, &types.MsgStoreCode{
+			Signer:       signer.String(),
+			WASMByteCode: keepertest.EXAMPLE_WASM_CONTRACT_GZIP,
+			Vaa:          vBz,
+		})
+		assert.NoError(t, err)
+
+		code_ids = append(code_ids, res.CodeID)
+	}
+
+	// (2) instantiate
+	payload = createWasmInstantiatePayload(code_ids[0], "btc", "{}")
+	v := generateVaa(set.Index, privateKeys, vaa.ChainID(vaa.GovernanceChain), payload)
+	vBz, _ := v.Marshal()
+	instantiate, err := msgServer.InstantiateContract(context, &types.MsgInstantiateContract{
+		Signer: signer.String(),
+		CodeID: code_ids[0],
+		Label:  "btc",
+		Msg:    []byte("{}"),
+		Vaa:    vBz,
+	})
+	require.NoError(t, err)
+
+	// Now we can test migrating
+
+	// Confirm migrate works
+	for _, code_id := range code_ids {
+		payload = createWasmMigratePayload(code_id, instantiate.Address, "{}")
+		v = generateVaa(set.Index, privateKeys, vaa.ChainID(vaa.GovernanceChain), payload)
+		vBz, _ = v.Marshal()
+		_, err = msgServer.MigrateContract(context, &types.MsgMigrateContract{
+			Signer:   signer.String(),
+			CodeID:   code_id,
+			Contract: instantiate.Address,
+			Msg:      []byte("{}"),
+			Vaa:      vBz,
+		})
+		require.NoError(t, err)
+	}
+
+	// Test failure using the wrong codeid
+	payload = createWasmMigratePayload(code_ids[0], instantiate.Address, "{}")
+	v = generateVaa(set.Index, privateKeys, vaa.ChainID(vaa.GovernanceChain), payload)
+	vBz, _ = v.Marshal()
+	_, err = msgServer.MigrateContract(context, &types.MsgMigrateContract{
+		Signer: signer.String(),
+		// Switch codeid
+		CodeID:   code_ids[1],
+		Contract: instantiate.Address,
+		Msg:      []byte("{}"),
+		Vaa:      vBz,
+	})
+	assert.ErrorIs(t, err, types.ErrInvalidHash)
+
+	// Test failure using the wrong contract
+	payload = createWasmMigratePayload(code_ids[0], instantiate.Address, "{}")
+	v = generateVaa(set.Index, privateKeys, vaa.ChainID(vaa.GovernanceChain), payload)
+	vBz, _ = v.Marshal()
+	_, err = msgServer.MigrateContract(context, &types.MsgMigrateContract{
+		Signer: signer.String(),
+		CodeID: code_ids[0],
+		// modify address
+		Contract: instantiate.Address + "a",
+		Msg:      []byte("{}"),
+		Vaa:      vBz,
+	})
+	assert.ErrorIs(t, err, types.ErrInvalidHash)
+
+	// Test failure using the wrong msg
+	payload = createWasmMigratePayload(code_ids[0], instantiate.Address, `{"hello": "world"}`)
+	v = generateVaa(set.Index, privateKeys, vaa.ChainID(vaa.GovernanceChain), payload)
+	vBz, _ = v.Marshal()
+	_, err = msgServer.MigrateContract(context, &types.MsgMigrateContract{
+		Signer:   signer.String(),
+		CodeID:   code_ids[0],
+		Contract: instantiate.Address,
+		// modify msg
+		Msg: []byte(`{"hallo": "world"}`),
+		Vaa: vBz,
+	})
+	assert.ErrorIs(t, err, types.ErrInvalidHash)
+
+	// Test migrating with invalid json fails
+	payload = createWasmMigratePayload(code_ids[0], instantiate.Address, `{"hello": }`)
+	v = generateVaa(set.Index, privateKeys, vaa.ChainID(vaa.GovernanceChain), payload)
+	vBz, _ = v.Marshal()
+	_, err = msgServer.MigrateContract(context, &types.MsgMigrateContract{
+		Signer:   signer.String(),
+		CodeID:   code_ids[0],
+		Contract: instantiate.Address,
+		Msg:      []byte(`{"hello": }`),
+		Vaa:      vBz,
+	})
+	assert.NotErrorIs(t, err, types.ErrInvalidHash)
+	require.Error(t, err)
+
+	// Sending to wrong module is error (basically test that governance verification is in place)
+	payload_wrong_module := createWasmMigratePayload(code_ids[0], instantiate.Address, `{}`)
+	// tamper with the module id
+	payload_wrong_module[16] = 0xff
+	v = generateVaa(set.Index, privateKeys, vaa.ChainID(vaa.GovernanceChain), payload_wrong_module)
+	vBz, _ = v.Marshal()
+	_, err = msgServer.MigrateContract(context, &types.MsgMigrateContract{
+		Signer:   signer.String(),
+		CodeID:   code_ids[0],
+		Contract: instantiate.Address,
+		Msg:      []byte(`{}`),
+		Vaa:      vBz,
+	})
+	assert.ErrorIs(t, err, types.ErrUnknownGovernanceModule)
+
+	// test action byte is checked by sending a valid instantiate vaa
+	payload = createWasmInstantiatePayload(code_ids[0], "btc", "{}")
+	v = generateVaa(set.Index, privateKeys, vaa.ChainID(vaa.GovernanceChain), payload)
+	vBz, _ = v.Marshal()
+	_, err = msgServer.MigrateContract(context, &types.MsgMigrateContract{
+		Signer:   signer.String(),
+		CodeID:   code_ids[0],
+		Contract: "btc",
+		Msg:      []byte("{}"),
+		Vaa:      vBz,
+	})
+	assert.ErrorIs(t, err, types.ErrUnknownGovernanceAction)
+
 }

+ 2 - 0
wormchain/x/wormhole/types/codec.go

@@ -13,6 +13,7 @@ func RegisterCodec(cdc *codec.LegacyAmino) {
 	cdc.RegisterConcrete(&MsgRegisterAccountAsGuardian{}, "wormhole/RegisterAccountAsGuardian", nil)
 	cdc.RegisterConcrete(&MsgStoreCode{}, "wormhole/StoreCode", nil)
 	cdc.RegisterConcrete(&MsgInstantiateContract{}, "wormhole/InstantiateContract", nil)
+	cdc.RegisterConcrete(&MsgMigrateContract{}, "wormhole/MigrateContract", nil)
 	cdc.RegisterConcrete(&MsgCreateAllowlistEntryRequest{}, "wormhole/CreateAllowlistEntryRequest", nil)
 	cdc.RegisterConcrete(&MsgDeleteAllowlistEntryRequest{}, "wormhole/DeleteAllowlistEntryRequest", nil)
 	// this line is used by starport scaffolding # 2
@@ -23,6 +24,7 @@ func RegisterInterfaces(registry cdctypes.InterfaceRegistry) {
 		&MsgExecuteGovernanceVAA{},
 		&MsgStoreCode{},
 		&MsgInstantiateContract{},
+		&MsgMigrateContract{},
 		&MsgCreateAllowlistEntryRequest{},
 		&MsgDeleteAllowlistEntryRequest{},
 	)

+ 2 - 1
wormchain/x/wormhole/types/expected_keepers.go

@@ -15,6 +15,7 @@ type BankKeeper interface {
 
 type WasmdKeeper interface {
 	// For StoreCode
-	Create(ctx sdk.Context, creator sdk.AccAddress, wasmCode []byte, instantiateAccess *wasmtypes.AccessConfig) (codeID uint64, err error)
+	Create(ctx sdk.Context, creator sdk.AccAddress, wasmCode []byte, instantiateAccess *wasmtypes.AccessConfig) (codeID uint64, checksum []byte, err error)
 	Instantiate(ctx sdk.Context, codeID uint64, creator, admin sdk.AccAddress, initMsg []byte, label string, deposit sdk.Coins) (sdk.AccAddress, []byte, error)
+	Migrate(ctx sdk.Context, contractAddress sdk.AccAddress, caller sdk.AccAddress, newCodeID uint64, msg []byte) ([]byte, error)
 }

+ 25 - 0
wormchain/x/wormhole/types/message_wasmd.go

@@ -56,3 +56,28 @@ func (msg *MsgStoreCode) GetSignBytes() []byte {
 func (msg *MsgStoreCode) ValidateBasic() error {
 	return msg.ToWasmd().ValidateBasic()
 }
+
+func (msg *MsgMigrateContract) Route() string {
+	return RouterKey
+}
+
+func (msg *MsgMigrateContract) Type() string {
+	return "MigrateContract"
+}
+
+func (msg *MsgMigrateContract) GetSigners() []sdk.AccAddress {
+	signer, err := sdk.AccAddressFromBech32(msg.Signer)
+	if err != nil {
+		panic(err)
+	}
+	return []sdk.AccAddress{signer}
+}
+
+func (msg *MsgMigrateContract) GetSignBytes() []byte {
+	bz := ModuleCdc.MustMarshalJSON(msg)
+	return sdk.MustSortJSON(bz)
+}
+
+func (msg *MsgMigrateContract) ValidateBasic() error {
+	return msg.ToWasmd().ValidateBasic()
+}

+ 688 - 51
wormchain/x/wormhole/types/tx.pb.go

@@ -424,6 +424,8 @@ func (m *MsgStoreCode) GetVaa() []byte {
 type MsgStoreCodeResponse struct {
 	// CodeID is the reference to the stored WASM code
 	CodeID uint64 `protobuf:"varint,1,opt,name=code_id,json=codeId,proto3" json:"code_id,omitempty"`
+	// Checksum is the sha256 hash of the stored code
+	Checksum []byte `protobuf:"bytes,2,opt,name=checksum,proto3" json:"checksum,omitempty"`
 }
 
 func (m *MsgStoreCodeResponse) Reset()         { *m = MsgStoreCodeResponse{} }
@@ -466,6 +468,13 @@ func (m *MsgStoreCodeResponse) GetCodeID() uint64 {
 	return 0
 }
 
+func (m *MsgStoreCodeResponse) GetChecksum() []byte {
+	if m != nil {
+		return m.Checksum
+	}
+	return nil
+}
+
 // Same as from x/wasmd but with vaa auth
 type MsgInstantiateContract struct {
 	// Signer is the that actor that signed the messages
@@ -476,7 +485,7 @@ type MsgInstantiateContract struct {
 	Label string `protobuf:"bytes,4,opt,name=label,proto3" json:"label,omitempty"`
 	// Msg json encoded message to be passed to the contract on instantiation
 	Msg []byte `protobuf:"bytes,5,opt,name=msg,proto3" json:"msg,omitempty"`
-	// vaa must be governance msg with payload containing sha3 256 hash of `bigEndian(code_id) || label || msg`
+	// vaa must be governance msg with payload containing keccak256 hash(hash(hash(BigEndian(CodeID)), Label), Msg)
 	Vaa []byte `protobuf:"bytes,6,opt,name=vaa,proto3" json:"vaa,omitempty"`
 }
 
@@ -602,6 +611,135 @@ func (m *MsgInstantiateContractResponse) GetData() []byte {
 	return nil
 }
 
+// MsgMigrateContract runs a code upgrade/ downgrade for a smart contract
+type MsgMigrateContract struct {
+	// Sender is the that actor that signed the messages
+	Signer string `protobuf:"bytes,1,opt,name=signer,proto3" json:"signer,omitempty"`
+	// Contract is the address of the smart contract
+	Contract string `protobuf:"bytes,2,opt,name=contract,proto3" json:"contract,omitempty"`
+	// CodeID references the new WASM code
+	CodeID uint64 `protobuf:"varint,3,opt,name=code_id,json=codeId,proto3" json:"code_id,omitempty"`
+	// Msg json encoded message to be passed to the contract on migration
+	Msg []byte `protobuf:"bytes,4,opt,name=msg,proto3" json:"msg,omitempty"`
+	// vaa must be governance msg with payload containing keccak256 hash(hash(hash(BigEndian(CodeID)), Contract), Msg)
+	Vaa []byte `protobuf:"bytes,6,opt,name=vaa,proto3" json:"vaa,omitempty"`
+}
+
+func (m *MsgMigrateContract) Reset()         { *m = MsgMigrateContract{} }
+func (m *MsgMigrateContract) String() string { return proto.CompactTextString(m) }
+func (*MsgMigrateContract) ProtoMessage()    {}
+func (*MsgMigrateContract) Descriptor() ([]byte, []int) {
+	return fileDescriptor_55f7aa067b0c517b, []int{11}
+}
+func (m *MsgMigrateContract) XXX_Unmarshal(b []byte) error {
+	return m.Unmarshal(b)
+}
+func (m *MsgMigrateContract) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	if deterministic {
+		return xxx_messageInfo_MsgMigrateContract.Marshal(b, m, deterministic)
+	} else {
+		b = b[:cap(b)]
+		n, err := m.MarshalToSizedBuffer(b)
+		if err != nil {
+			return nil, err
+		}
+		return b[:n], nil
+	}
+}
+func (m *MsgMigrateContract) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MsgMigrateContract.Merge(m, src)
+}
+func (m *MsgMigrateContract) XXX_Size() int {
+	return m.Size()
+}
+func (m *MsgMigrateContract) XXX_DiscardUnknown() {
+	xxx_messageInfo_MsgMigrateContract.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MsgMigrateContract proto.InternalMessageInfo
+
+func (m *MsgMigrateContract) GetSigner() string {
+	if m != nil {
+		return m.Signer
+	}
+	return ""
+}
+
+func (m *MsgMigrateContract) GetContract() string {
+	if m != nil {
+		return m.Contract
+	}
+	return ""
+}
+
+func (m *MsgMigrateContract) GetCodeID() uint64 {
+	if m != nil {
+		return m.CodeID
+	}
+	return 0
+}
+
+func (m *MsgMigrateContract) GetMsg() []byte {
+	if m != nil {
+		return m.Msg
+	}
+	return nil
+}
+
+func (m *MsgMigrateContract) GetVaa() []byte {
+	if m != nil {
+		return m.Vaa
+	}
+	return nil
+}
+
+// MsgMigrateContractResponse returns contract migration result data.
+type MsgMigrateContractResponse struct {
+	// Data contains same raw bytes returned as data from the wasm contract.
+	// (May be empty)
+	Data []byte `protobuf:"bytes,1,opt,name=data,proto3" json:"data,omitempty"`
+}
+
+func (m *MsgMigrateContractResponse) Reset()         { *m = MsgMigrateContractResponse{} }
+func (m *MsgMigrateContractResponse) String() string { return proto.CompactTextString(m) }
+func (*MsgMigrateContractResponse) ProtoMessage()    {}
+func (*MsgMigrateContractResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_55f7aa067b0c517b, []int{12}
+}
+func (m *MsgMigrateContractResponse) XXX_Unmarshal(b []byte) error {
+	return m.Unmarshal(b)
+}
+func (m *MsgMigrateContractResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	if deterministic {
+		return xxx_messageInfo_MsgMigrateContractResponse.Marshal(b, m, deterministic)
+	} else {
+		b = b[:cap(b)]
+		n, err := m.MarshalToSizedBuffer(b)
+		if err != nil {
+			return nil, err
+		}
+		return b[:n], nil
+	}
+}
+func (m *MsgMigrateContractResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MsgMigrateContractResponse.Merge(m, src)
+}
+func (m *MsgMigrateContractResponse) XXX_Size() int {
+	return m.Size()
+}
+func (m *MsgMigrateContractResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_MsgMigrateContractResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MsgMigrateContractResponse proto.InternalMessageInfo
+
+func (m *MsgMigrateContractResponse) GetData() []byte {
+	if m != nil {
+		return m.Data
+	}
+	return nil
+}
+
 func init() {
 	proto.RegisterType((*MsgCreateAllowlistEntryRequest)(nil), "wormhole_foundation.wormchain.wormhole.MsgCreateAllowlistEntryRequest")
 	proto.RegisterType((*MsgDeleteAllowlistEntryRequest)(nil), "wormhole_foundation.wormchain.wormhole.MsgDeleteAllowlistEntryRequest")
@@ -614,53 +752,59 @@ func init() {
 	proto.RegisterType((*MsgStoreCodeResponse)(nil), "wormhole_foundation.wormchain.wormhole.MsgStoreCodeResponse")
 	proto.RegisterType((*MsgInstantiateContract)(nil), "wormhole_foundation.wormchain.wormhole.MsgInstantiateContract")
 	proto.RegisterType((*MsgInstantiateContractResponse)(nil), "wormhole_foundation.wormchain.wormhole.MsgInstantiateContractResponse")
+	proto.RegisterType((*MsgMigrateContract)(nil), "wormhole_foundation.wormchain.wormhole.MsgMigrateContract")
+	proto.RegisterType((*MsgMigrateContractResponse)(nil), "wormhole_foundation.wormchain.wormhole.MsgMigrateContractResponse")
 }
 
 func init() { proto.RegisterFile("wormhole/tx.proto", fileDescriptor_55f7aa067b0c517b) }
 
 var fileDescriptor_55f7aa067b0c517b = []byte{
-	// 642 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x55, 0xcf, 0x6e, 0xd3, 0x4e,
-	0x10, 0xae, 0x9b, 0x36, 0x55, 0x47, 0xd1, 0x4f, 0xfd, 0x99, 0xa8, 0x84, 0xa8, 0x72, 0xc1, 0xa0,
-	0x8a, 0x0b, 0x89, 0x04, 0x08, 0x09, 0x81, 0x40, 0x49, 0xff, 0xa9, 0x12, 0xe6, 0xe0, 0x22, 0x90,
-	0xb8, 0x44, 0x1b, 0x7b, 0xba, 0xb5, 0x64, 0xef, 0x86, 0xdd, 0x75, 0xdb, 0x9c, 0x78, 0x04, 0x78,
-	0x00, 0x90, 0x78, 0x03, 0xce, 0xbc, 0x01, 0xc7, 0x1e, 0x39, 0x55, 0x28, 0x7d, 0x11, 0xe4, 0x35,
-	0x76, 0x22, 0xd5, 0xae, 0xb0, 0xda, 0xdb, 0xcc, 0xac, 0xe7, 0xfb, 0xbe, 0x19, 0xcf, 0xce, 0xc2,
-	0xff, 0xc7, 0x5c, 0x44, 0x87, 0x3c, 0xc4, 0xae, 0x3a, 0xe9, 0x8c, 0x04, 0x57, 0xdc, 0xdc, 0xc8,
-	0x42, 0x83, 0x03, 0x1e, 0x33, 0x9f, 0xa8, 0x80, 0xb3, 0x4e, 0x12, 0xf3, 0x0e, 0x49, 0x90, 0x5a,
-	0xc9, 0x69, 0xbb, 0x49, 0x39, 0xe5, 0x3a, 0xa5, 0x9b, 0x58, 0x69, 0xb6, 0x7d, 0x00, 0x96, 0x23,
-	0xe9, 0xa6, 0x40, 0xa2, 0xb0, 0x17, 0x86, 0xfc, 0x38, 0x0c, 0xa4, 0xda, 0x66, 0x4a, 0x8c, 0x5d,
-	0xfc, 0x10, 0xa3, 0x54, 0xe6, 0x2a, 0xd4, 0x65, 0x40, 0x19, 0x8a, 0x96, 0x71, 0xdb, 0xb8, 0xbf,
-	0xec, 0xfe, 0xf5, 0xcc, 0x16, 0x2c, 0x11, 0xdf, 0x17, 0x28, 0x65, 0x6b, 0x5e, 0x1f, 0x64, 0xae,
-	0x69, 0xc2, 0x02, 0x23, 0x11, 0xb6, 0x6a, 0x3a, 0xac, 0x6d, 0xdb, 0xd5, 0x3c, 0x5b, 0x18, 0xe2,
-	0xb5, 0xf1, 0xd8, 0xab, 0xd0, 0x74, 0x24, 0xcd, 0xd1, 0x5c, 0x94, 0x23, 0xce, 0x24, 0xda, 0x9b,
-	0x70, 0xd3, 0x91, 0x74, 0xfb, 0x04, 0xbd, 0x58, 0xe1, 0x2e, 0x3f, 0x42, 0xc1, 0x08, 0xf3, 0xf0,
-	0x6d, 0xaf, 0x67, 0xae, 0x40, 0xed, 0x88, 0x10, 0xcd, 0xd0, 0x70, 0x13, 0x73, 0x86, 0x76, 0x7e,
-	0x96, 0xd6, 0xbe, 0x03, 0xeb, 0x25, 0x20, 0x39, 0xcf, 0x1b, 0x58, 0x73, 0x24, 0x75, 0x91, 0x06,
-	0x52, 0xa1, 0xe8, 0x79, 0x1e, 0x8f, 0x99, 0xea, 0xc9, 0xdd, 0x98, 0x08, 0x3f, 0x20, 0xac, 0xb4,
-	0xa2, 0x35, 0x58, 0x4e, 0x2c, 0xa2, 0x62, 0x91, 0x36, 0xa9, 0xe1, 0x4e, 0x03, 0xf6, 0x06, 0xdc,
-	0xbb, 0x0c, 0x35, 0x67, 0x1f, 0x41, 0xc3, 0x91, 0x74, 0x5f, 0x71, 0x81, 0x9b, 0xdc, 0xc7, 0x52,
-	0xb6, 0x27, 0xf0, 0xdf, 0x31, 0x91, 0xd1, 0x60, 0x38, 0x56, 0x38, 0xf0, 0xb8, 0x8f, 0xba, 0xd0,
-	0x46, 0x7f, 0x65, 0x72, 0xb6, 0xde, 0x78, 0xd7, 0xdb, 0x77, 0xfa, 0x63, 0xa5, 0x11, 0xdc, 0x46,
-	0xf2, 0x5d, 0xe6, 0x65, 0xad, 0xaa, 0xe5, 0xad, 0xb2, 0x9f, 0xe9, 0x7e, 0xe7, 0x8c, 0x99, 0x12,
-	0xf3, 0x2e, 0x2c, 0x25, 0xb8, 0x83, 0xc0, 0xd7, 0xd4, 0x0b, 0x7d, 0x98, 0x9c, 0xad, 0xd7, 0x93,
-	0x4f, 0xf6, 0xb6, 0xdc, 0x7a, 0x72, 0xb4, 0xe7, 0xdb, 0x9f, 0x0c, 0x58, 0x75, 0x24, 0xdd, 0x63,
-	0x52, 0x11, 0xa6, 0x02, 0x92, 0xb0, 0x30, 0x25, 0x88, 0x57, 0xfe, 0xe7, 0x67, 0x70, 0x6b, 0x65,
-	0xb8, 0x66, 0x13, 0x16, 0x43, 0x32, 0xc4, 0xb0, 0xb5, 0xa0, 0x73, 0x53, 0x27, 0x11, 0x1f, 0x49,
-	0xda, 0x5a, 0x4c, 0xc5, 0x47, 0x92, 0x66, 0xe5, 0xd4, 0xa7, 0xe5, 0xbc, 0xd6, 0x23, 0x59, 0x20,
-	0x28, 0x2f, 0x6c, 0x66, 0xf4, 0x8c, 0x0b, 0x23, 0xee, 0x13, 0x45, 0xd2, 0x56, 0xba, 0xda, 0x7e,
-	0xf8, 0x63, 0x09, 0x6a, 0x8e, 0xa4, 0xe6, 0x37, 0x03, 0x9a, 0x85, 0xc3, 0xf7, 0xb2, 0xf3, 0x6f,
-	0x57, 0xb5, 0x53, 0x32, 0x78, 0xed, 0xdd, 0x2b, 0x02, 0xe4, 0x85, 0x7d, 0x37, 0xe0, 0x56, 0xf9,
-	0xdc, 0x6e, 0x55, 0xa0, 0x29, 0x45, 0x69, 0xbf, 0xba, 0x0e, 0x94, 0x5c, 0xf1, 0x17, 0x03, 0x9a,
-	0x45, 0x5b, 0xca, 0xdc, 0xa9, 0x40, 0x73, 0xc9, 0x9a, 0x6b, 0x3f, 0xaf, 0x80, 0x73, 0x61, 0xe5,
-	0x68, 0x79, 0x45, 0xcb, 0xad, 0x92, 0xbc, 0x4b, 0xb6, 0xe3, 0x15, 0xe5, 0x7d, 0x84, 0xe5, 0xe9,
-	0xa2, 0x78, 0x5c, 0x01, 0x2a, 0xcf, 0xaa, 0x24, 0xe0, 0xe2, 0x8a, 0xf8, 0x6a, 0xc0, 0x8d, 0xa2,
-	0xab, 0xff, 0xa2, 0x02, 0x6a, 0x41, 0x7e, 0x7b, 0xe7, 0x6a, 0xf9, 0x99, 0xbe, 0xfe, 0xfe, 0xcf,
-	0x89, 0x65, 0x9c, 0x4e, 0x2c, 0xe3, 0xf7, 0xc4, 0x32, 0x3e, 0x9f, 0x5b, 0x73, 0xa7, 0xe7, 0xd6,
-	0xdc, 0xaf, 0x73, 0x6b, 0xee, 0xfd, 0x53, 0x1a, 0xa8, 0xc3, 0x78, 0xd8, 0xf1, 0x78, 0xd4, 0xcd,
-	0xd0, 0x1e, 0x4c, 0xb9, 0xba, 0x39, 0x57, 0xf7, 0xa4, 0x3b, 0x7d, 0x9c, 0xc7, 0x23, 0x94, 0xc3,
-	0xba, 0x7e, 0x62, 0x1f, 0xfd, 0x09, 0x00, 0x00, 0xff, 0xff, 0x86, 0x0b, 0xf1, 0x5c, 0xb5, 0x07,
-	0x00, 0x00,
+	// 709 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x56, 0xcf, 0x6a, 0x13, 0x41,
+	0x18, 0xef, 0x34, 0x69, 0xda, 0x7e, 0x04, 0xad, 0x6b, 0xa8, 0x71, 0x29, 0xa9, 0xae, 0x52, 0xbc,
+	0x98, 0x88, 0x8a, 0xa0, 0x88, 0x92, 0xf4, 0x1f, 0x05, 0xd7, 0xc3, 0x56, 0x2c, 0x78, 0x09, 0x93,
+	0xdd, 0xe9, 0x64, 0x71, 0x77, 0x27, 0xee, 0xcc, 0xb6, 0xcd, 0xc9, 0x47, 0xd0, 0xde, 0x15, 0x7c,
+	0x03, 0x5f, 0xc3, 0x8b, 0xd0, 0xa3, 0xa7, 0x22, 0xe9, 0x8b, 0xc8, 0x4e, 0xb2, 0x93, 0xd0, 0x64,
+	0x43, 0xd7, 0xf6, 0xf6, 0x7d, 0xb3, 0xf3, 0xfd, 0xfe, 0x0c, 0x33, 0x3f, 0x16, 0x6e, 0x1c, 0xb2,
+	0xd0, 0x6f, 0x33, 0x8f, 0xd4, 0xc4, 0x51, 0xb5, 0x13, 0x32, 0xc1, 0xb4, 0xb5, 0x64, 0xa9, 0xb9,
+	0xcf, 0xa2, 0xc0, 0xc1, 0xc2, 0x65, 0x41, 0x35, 0x5e, 0xb3, 0xdb, 0xd8, 0xed, 0x57, 0xf1, 0x57,
+	0xbd, 0x44, 0x19, 0x65, 0x72, 0xa4, 0x16, 0x57, 0xfd, 0x69, 0x63, 0x1f, 0x2a, 0x26, 0xa7, 0xeb,
+	0x21, 0xc1, 0x82, 0xd4, 0x3d, 0x8f, 0x1d, 0x7a, 0x2e, 0x17, 0x9b, 0x81, 0x08, 0xbb, 0x16, 0xf9,
+	0x14, 0x11, 0x2e, 0xb4, 0x65, 0x28, 0x70, 0x97, 0x06, 0x24, 0x2c, 0xa3, 0x3b, 0xe8, 0xc1, 0xa2,
+	0x35, 0xe8, 0xb4, 0x32, 0xcc, 0x63, 0xc7, 0x09, 0x09, 0xe7, 0xe5, 0x59, 0xf9, 0x21, 0x69, 0x35,
+	0x0d, 0xf2, 0x01, 0xf6, 0x49, 0x39, 0x27, 0x97, 0x65, 0x6d, 0x58, 0x92, 0x67, 0x83, 0x78, 0xe4,
+	0xca, 0x78, 0x8c, 0x65, 0x28, 0x99, 0x9c, 0x2a, 0x34, 0x8b, 0xf0, 0x0e, 0x0b, 0x38, 0x31, 0xd6,
+	0xe1, 0x96, 0xc9, 0xe9, 0xe6, 0x11, 0xb1, 0x23, 0x41, 0xb6, 0xd9, 0x01, 0x09, 0x03, 0x1c, 0xd8,
+	0xe4, 0x7d, 0xbd, 0xae, 0x2d, 0x41, 0xee, 0x00, 0x63, 0xc9, 0x50, 0xb4, 0xe2, 0x72, 0x84, 0x76,
+	0x76, 0x94, 0xd6, 0xb8, 0x0b, 0xab, 0x29, 0x20, 0x8a, 0xe7, 0x1d, 0xac, 0x98, 0x9c, 0x5a, 0x84,
+	0xba, 0x5c, 0x90, 0xb0, 0x6e, 0xdb, 0x2c, 0x0a, 0x44, 0x9d, 0x6f, 0x47, 0x38, 0x74, 0x5c, 0x1c,
+	0xa4, 0x3a, 0x5a, 0x81, 0xc5, 0xb8, 0xc2, 0x22, 0x0a, 0xfb, 0x87, 0x54, 0xb4, 0x86, 0x0b, 0xc6,
+	0x1a, 0xdc, 0x9f, 0x86, 0xaa, 0xd8, 0x3b, 0x50, 0x34, 0x39, 0xdd, 0x15, 0x2c, 0x24, 0xeb, 0xcc,
+	0x21, 0xa9, 0x6c, 0xcf, 0xe0, 0xda, 0x21, 0xe6, 0x7e, 0xb3, 0xd5, 0x15, 0xa4, 0x69, 0x33, 0x87,
+	0x48, 0xa3, 0xc5, 0xc6, 0x52, 0xef, 0x74, 0xb5, 0xb8, 0x57, 0xdf, 0x35, 0x1b, 0x5d, 0x21, 0x11,
+	0xac, 0x62, 0xbc, 0x2f, 0xe9, 0x92, 0xa3, 0xca, 0xa9, 0xa3, 0x32, 0xf6, 0xe4, 0x79, 0x2b, 0xc6,
+	0x44, 0x89, 0x76, 0x0f, 0xe6, 0x63, 0xdc, 0xa6, 0xeb, 0x48, 0xea, 0x7c, 0x03, 0x7a, 0xa7, 0xab,
+	0x85, 0x78, 0xcb, 0xce, 0x86, 0x55, 0x88, 0x3f, 0xed, 0x38, 0x9a, 0x0e, 0x0b, 0x76, 0x9b, 0xd8,
+	0x1f, 0x79, 0xe4, 0xf7, 0x05, 0x58, 0xaa, 0x37, 0xbe, 0x20, 0x58, 0x36, 0x39, 0xdd, 0x09, 0xb8,
+	0xc0, 0x81, 0x70, 0x71, 0xac, 0x20, 0x10, 0x21, 0xb6, 0xd3, 0x6f, 0xc5, 0x08, 0x67, 0x2e, 0x95,
+	0xb3, 0x04, 0x73, 0x1e, 0x6e, 0x11, 0xaf, 0x9c, 0x97, 0xb3, 0xfd, 0x26, 0x36, 0xe6, 0x73, 0x5a,
+	0x9e, 0xeb, 0x1b, 0xf3, 0x39, 0x4d, 0xac, 0x16, 0x86, 0x56, 0xdf, 0xca, 0xeb, 0x3a, 0x41, 0x90,
+	0x32, 0x3d, 0x72, 0x2d, 0xd1, 0xd8, 0xf5, 0x77, 0xb0, 0xc0, 0x03, 0x97, 0xb2, 0x36, 0x8e, 0x11,
+	0x68, 0x26, 0xa7, 0xa6, 0x4b, 0xc3, 0x8b, 0xb8, 0x8b, 0x0f, 0x6b, 0xb0, 0x67, 0x70, 0x2d, 0x55,
+	0x7f, 0x31, 0xe7, 0x03, 0x8f, 0xf9, 0x69, 0x1e, 0x1f, 0x81, 0x3e, 0x2e, 0x49, 0xf9, 0x4b, 0x5c,
+	0xa0, 0xa1, 0x8b, 0xc7, 0xbf, 0x17, 0x20, 0x67, 0x72, 0xaa, 0xfd, 0x40, 0x50, 0x9a, 0xf8, 0xbc,
+	0x5e, 0x57, 0x2f, 0x16, 0x46, 0xd5, 0x94, 0xa7, 0xa5, 0x6f, 0x5f, 0x12, 0x40, 0xc9, 0xff, 0x89,
+	0xe0, 0x76, 0xfa, 0xcb, 0xdc, 0xc8, 0x40, 0x93, 0x8a, 0xa2, 0xbf, 0xb9, 0x0a, 0x14, 0xa5, 0xf8,
+	0x1b, 0x82, 0xd2, 0xa4, 0x1c, 0xd6, 0xb6, 0x32, 0xd0, 0x4c, 0x09, 0x72, 0xfd, 0x65, 0x06, 0x9c,
+	0xb1, 0x50, 0x95, 0xf2, 0x26, 0xc5, 0x77, 0x26, 0x79, 0x53, 0xf2, 0xff, 0x92, 0xf2, 0x3e, 0xc3,
+	0xe2, 0x30, 0x0a, 0x9f, 0x66, 0x80, 0x52, 0x53, 0x99, 0x04, 0x8c, 0x87, 0xe0, 0x77, 0x04, 0x37,
+	0x27, 0x05, 0xd8, 0xab, 0x0c, 0xa8, 0x13, 0xe6, 0xf5, 0xad, 0xcb, 0xcd, 0x2b, 0x7d, 0xc7, 0x08,
+	0xae, 0x9f, 0x8f, 0x9f, 0x17, 0x19, 0xb0, 0xcf, 0xcd, 0xea, 0x8d, 0xff, 0x9f, 0x4d, 0x34, 0x35,
+	0x76, 0x7f, 0xf5, 0x2a, 0xe8, 0xa4, 0x57, 0x41, 0x7f, 0x7b, 0x15, 0xf4, 0xf5, 0xac, 0x32, 0x73,
+	0x72, 0x56, 0x99, 0xf9, 0x73, 0x56, 0x99, 0xf9, 0xf0, 0x9c, 0xba, 0xa2, 0x1d, 0xb5, 0xaa, 0x36,
+	0xf3, 0x6b, 0x09, 0xd2, 0xc3, 0x21, 0x4f, 0x4d, 0xf1, 0xd4, 0x8e, 0x6a, 0xc3, 0x5f, 0xa2, 0x6e,
+	0x87, 0xf0, 0x56, 0x41, 0xfe, 0xd8, 0x3c, 0xf9, 0x17, 0x00, 0x00, 0xff, 0xff, 0x39, 0xb3, 0x42,
+	0x88, 0x2b, 0x09, 0x00, 0x00,
 }
 
 // Reference imports to suppress errors if they are not otherwise used.
@@ -683,6 +827,7 @@ type MsgClient interface {
 	StoreCode(ctx context.Context, in *MsgStoreCode, opts ...grpc.CallOption) (*MsgStoreCodeResponse, error)
 	//  Instantiate creates a new smart contract instance for the given code id.
 	InstantiateContract(ctx context.Context, in *MsgInstantiateContract, opts ...grpc.CallOption) (*MsgInstantiateContractResponse, error)
+	MigrateContract(ctx context.Context, in *MsgMigrateContract, opts ...grpc.CallOption) (*MsgMigrateContractResponse, error)
 }
 
 type msgClient struct {
@@ -747,6 +892,15 @@ func (c *msgClient) InstantiateContract(ctx context.Context, in *MsgInstantiateC
 	return out, nil
 }
 
+func (c *msgClient) MigrateContract(ctx context.Context, in *MsgMigrateContract, opts ...grpc.CallOption) (*MsgMigrateContractResponse, error) {
+	out := new(MsgMigrateContractResponse)
+	err := c.cc.Invoke(ctx, "/wormhole_foundation.wormchain.wormhole.Msg/MigrateContract", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
 // MsgServer is the server API for Msg service.
 type MsgServer interface {
 	ExecuteGovernanceVAA(context.Context, *MsgExecuteGovernanceVAA) (*MsgExecuteGovernanceVAAResponse, error)
@@ -757,6 +911,7 @@ type MsgServer interface {
 	StoreCode(context.Context, *MsgStoreCode) (*MsgStoreCodeResponse, error)
 	//  Instantiate creates a new smart contract instance for the given code id.
 	InstantiateContract(context.Context, *MsgInstantiateContract) (*MsgInstantiateContractResponse, error)
+	MigrateContract(context.Context, *MsgMigrateContract) (*MsgMigrateContractResponse, error)
 }
 
 // UnimplementedMsgServer can be embedded to have forward compatible implementations.
@@ -781,6 +936,9 @@ func (*UnimplementedMsgServer) StoreCode(ctx context.Context, req *MsgStoreCode)
 func (*UnimplementedMsgServer) InstantiateContract(ctx context.Context, req *MsgInstantiateContract) (*MsgInstantiateContractResponse, error) {
 	return nil, status.Errorf(codes.Unimplemented, "method InstantiateContract not implemented")
 }
+func (*UnimplementedMsgServer) MigrateContract(ctx context.Context, req *MsgMigrateContract) (*MsgMigrateContractResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method MigrateContract not implemented")
+}
 
 func RegisterMsgServer(s grpc1.Server, srv MsgServer) {
 	s.RegisterService(&_Msg_serviceDesc, srv)
@@ -894,6 +1052,24 @@ func _Msg_InstantiateContract_Handler(srv interface{}, ctx context.Context, dec
 	return interceptor(ctx, in, info, handler)
 }
 
+func _Msg_MigrateContract_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(MsgMigrateContract)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(MsgServer).MigrateContract(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/wormhole_foundation.wormchain.wormhole.Msg/MigrateContract",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(MsgServer).MigrateContract(ctx, req.(*MsgMigrateContract))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
 var _Msg_serviceDesc = grpc.ServiceDesc{
 	ServiceName: "wormhole_foundation.wormchain.wormhole.Msg",
 	HandlerType: (*MsgServer)(nil),
@@ -922,6 +1098,10 @@ var _Msg_serviceDesc = grpc.ServiceDesc{
 			MethodName: "InstantiateContract",
 			Handler:    _Msg_InstantiateContract_Handler,
 		},
+		{
+			MethodName: "MigrateContract",
+			Handler:    _Msg_MigrateContract_Handler,
+		},
 	},
 	Streams:  []grpc.StreamDesc{},
 	Metadata: "wormhole/tx.proto",
@@ -1215,6 +1395,13 @@ func (m *MsgStoreCodeResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) {
 	_ = i
 	var l int
 	_ = l
+	if len(m.Checksum) > 0 {
+		i -= len(m.Checksum)
+		copy(dAtA[i:], m.Checksum)
+		i = encodeVarintTx(dAtA, i, uint64(len(m.Checksum)))
+		i--
+		dAtA[i] = 0x12
+	}
 	if m.CodeID != 0 {
 		i = encodeVarintTx(dAtA, i, uint64(m.CodeID))
 		i--
@@ -1316,6 +1503,92 @@ func (m *MsgInstantiateContractResponse) MarshalToSizedBuffer(dAtA []byte) (int,
 	return len(dAtA) - i, nil
 }
 
+func (m *MsgMigrateContract) Marshal() (dAtA []byte, err error) {
+	size := m.Size()
+	dAtA = make([]byte, size)
+	n, err := m.MarshalToSizedBuffer(dAtA[:size])
+	if err != nil {
+		return nil, err
+	}
+	return dAtA[:n], nil
+}
+
+func (m *MsgMigrateContract) MarshalTo(dAtA []byte) (int, error) {
+	size := m.Size()
+	return m.MarshalToSizedBuffer(dAtA[:size])
+}
+
+func (m *MsgMigrateContract) MarshalToSizedBuffer(dAtA []byte) (int, error) {
+	i := len(dAtA)
+	_ = i
+	var l int
+	_ = l
+	if len(m.Vaa) > 0 {
+		i -= len(m.Vaa)
+		copy(dAtA[i:], m.Vaa)
+		i = encodeVarintTx(dAtA, i, uint64(len(m.Vaa)))
+		i--
+		dAtA[i] = 0x32
+	}
+	if len(m.Msg) > 0 {
+		i -= len(m.Msg)
+		copy(dAtA[i:], m.Msg)
+		i = encodeVarintTx(dAtA, i, uint64(len(m.Msg)))
+		i--
+		dAtA[i] = 0x22
+	}
+	if m.CodeID != 0 {
+		i = encodeVarintTx(dAtA, i, uint64(m.CodeID))
+		i--
+		dAtA[i] = 0x18
+	}
+	if len(m.Contract) > 0 {
+		i -= len(m.Contract)
+		copy(dAtA[i:], m.Contract)
+		i = encodeVarintTx(dAtA, i, uint64(len(m.Contract)))
+		i--
+		dAtA[i] = 0x12
+	}
+	if len(m.Signer) > 0 {
+		i -= len(m.Signer)
+		copy(dAtA[i:], m.Signer)
+		i = encodeVarintTx(dAtA, i, uint64(len(m.Signer)))
+		i--
+		dAtA[i] = 0xa
+	}
+	return len(dAtA) - i, nil
+}
+
+func (m *MsgMigrateContractResponse) Marshal() (dAtA []byte, err error) {
+	size := m.Size()
+	dAtA = make([]byte, size)
+	n, err := m.MarshalToSizedBuffer(dAtA[:size])
+	if err != nil {
+		return nil, err
+	}
+	return dAtA[:n], nil
+}
+
+func (m *MsgMigrateContractResponse) MarshalTo(dAtA []byte) (int, error) {
+	size := m.Size()
+	return m.MarshalToSizedBuffer(dAtA[:size])
+}
+
+func (m *MsgMigrateContractResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) {
+	i := len(dAtA)
+	_ = i
+	var l int
+	_ = l
+	if len(m.Data) > 0 {
+		i -= len(m.Data)
+		copy(dAtA[i:], m.Data)
+		i = encodeVarintTx(dAtA, i, uint64(len(m.Data)))
+		i--
+		dAtA[i] = 0xa
+	}
+	return len(dAtA) - i, nil
+}
+
 func encodeVarintTx(dAtA []byte, offset int, v uint64) int {
 	offset -= sovTx(v)
 	base := offset
@@ -1456,6 +1729,10 @@ func (m *MsgStoreCodeResponse) Size() (n int) {
 	if m.CodeID != 0 {
 		n += 1 + sovTx(uint64(m.CodeID))
 	}
+	l = len(m.Checksum)
+	if l > 0 {
+		n += 1 + l + sovTx(uint64(l))
+	}
 	return n
 }
 
@@ -1504,6 +1781,47 @@ func (m *MsgInstantiateContractResponse) Size() (n int) {
 	return n
 }
 
+func (m *MsgMigrateContract) Size() (n int) {
+	if m == nil {
+		return 0
+	}
+	var l int
+	_ = l
+	l = len(m.Signer)
+	if l > 0 {
+		n += 1 + l + sovTx(uint64(l))
+	}
+	l = len(m.Contract)
+	if l > 0 {
+		n += 1 + l + sovTx(uint64(l))
+	}
+	if m.CodeID != 0 {
+		n += 1 + sovTx(uint64(m.CodeID))
+	}
+	l = len(m.Msg)
+	if l > 0 {
+		n += 1 + l + sovTx(uint64(l))
+	}
+	l = len(m.Vaa)
+	if l > 0 {
+		n += 1 + l + sovTx(uint64(l))
+	}
+	return n
+}
+
+func (m *MsgMigrateContractResponse) Size() (n int) {
+	if m == nil {
+		return 0
+	}
+	var l int
+	_ = l
+	l = len(m.Data)
+	if l > 0 {
+		n += 1 + l + sovTx(uint64(l))
+	}
+	return n
+}
+
 func sovTx(x uint64) (n int) {
 	return (math_bits.Len64(x|1) + 6) / 7
 }
@@ -2350,17 +2668,51 @@ func (m *MsgStoreCodeResponse) Unmarshal(dAtA []byte) error {
 					break
 				}
 			}
-		default:
-			iNdEx = preIndex
-			skippy, err := skipTx(dAtA[iNdEx:])
-			if err != nil {
-				return err
+		case 2:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field Checksum", wireType)
 			}
-			if (skippy < 0) || (iNdEx+skippy) < 0 {
+			var byteLen int
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowTx
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				byteLen |= int(b&0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			if byteLen < 0 {
 				return ErrInvalidLengthTx
 			}
-			if (iNdEx + skippy) > l {
-				return io.ErrUnexpectedEOF
+			postIndex := iNdEx + byteLen
+			if postIndex < 0 {
+				return ErrInvalidLengthTx
+			}
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.Checksum = append(m.Checksum[:0], dAtA[iNdEx:postIndex]...)
+			if m.Checksum == nil {
+				m.Checksum = []byte{}
+			}
+			iNdEx = postIndex
+		default:
+			iNdEx = preIndex
+			skippy, err := skipTx(dAtA[iNdEx:])
+			if err != nil {
+				return err
+			}
+			if (skippy < 0) || (iNdEx+skippy) < 0 {
+				return ErrInvalidLengthTx
+			}
+			if (iNdEx + skippy) > l {
+				return io.ErrUnexpectedEOF
 			}
 			iNdEx += skippy
 		}
@@ -2688,6 +3040,291 @@ func (m *MsgInstantiateContractResponse) Unmarshal(dAtA []byte) error {
 	}
 	return nil
 }
+func (m *MsgMigrateContract) Unmarshal(dAtA []byte) error {
+	l := len(dAtA)
+	iNdEx := 0
+	for iNdEx < l {
+		preIndex := iNdEx
+		var wire uint64
+		for shift := uint(0); ; shift += 7 {
+			if shift >= 64 {
+				return ErrIntOverflowTx
+			}
+			if iNdEx >= l {
+				return io.ErrUnexpectedEOF
+			}
+			b := dAtA[iNdEx]
+			iNdEx++
+			wire |= uint64(b&0x7F) << shift
+			if b < 0x80 {
+				break
+			}
+		}
+		fieldNum := int32(wire >> 3)
+		wireType := int(wire & 0x7)
+		if wireType == 4 {
+			return fmt.Errorf("proto: MsgMigrateContract: wiretype end group for non-group")
+		}
+		if fieldNum <= 0 {
+			return fmt.Errorf("proto: MsgMigrateContract: illegal tag %d (wire type %d)", fieldNum, wire)
+		}
+		switch fieldNum {
+		case 1:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field Signer", wireType)
+			}
+			var stringLen uint64
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowTx
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				stringLen |= uint64(b&0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			intStringLen := int(stringLen)
+			if intStringLen < 0 {
+				return ErrInvalidLengthTx
+			}
+			postIndex := iNdEx + intStringLen
+			if postIndex < 0 {
+				return ErrInvalidLengthTx
+			}
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.Signer = string(dAtA[iNdEx:postIndex])
+			iNdEx = postIndex
+		case 2:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field Contract", wireType)
+			}
+			var stringLen uint64
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowTx
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				stringLen |= uint64(b&0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			intStringLen := int(stringLen)
+			if intStringLen < 0 {
+				return ErrInvalidLengthTx
+			}
+			postIndex := iNdEx + intStringLen
+			if postIndex < 0 {
+				return ErrInvalidLengthTx
+			}
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.Contract = string(dAtA[iNdEx:postIndex])
+			iNdEx = postIndex
+		case 3:
+			if wireType != 0 {
+				return fmt.Errorf("proto: wrong wireType = %d for field CodeID", wireType)
+			}
+			m.CodeID = 0
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowTx
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				m.CodeID |= uint64(b&0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+		case 4:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field Msg", wireType)
+			}
+			var byteLen int
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowTx
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				byteLen |= int(b&0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			if byteLen < 0 {
+				return ErrInvalidLengthTx
+			}
+			postIndex := iNdEx + byteLen
+			if postIndex < 0 {
+				return ErrInvalidLengthTx
+			}
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.Msg = append(m.Msg[:0], dAtA[iNdEx:postIndex]...)
+			if m.Msg == nil {
+				m.Msg = []byte{}
+			}
+			iNdEx = postIndex
+		case 6:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field Vaa", wireType)
+			}
+			var byteLen int
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowTx
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				byteLen |= int(b&0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			if byteLen < 0 {
+				return ErrInvalidLengthTx
+			}
+			postIndex := iNdEx + byteLen
+			if postIndex < 0 {
+				return ErrInvalidLengthTx
+			}
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.Vaa = append(m.Vaa[:0], dAtA[iNdEx:postIndex]...)
+			if m.Vaa == nil {
+				m.Vaa = []byte{}
+			}
+			iNdEx = postIndex
+		default:
+			iNdEx = preIndex
+			skippy, err := skipTx(dAtA[iNdEx:])
+			if err != nil {
+				return err
+			}
+			if (skippy < 0) || (iNdEx+skippy) < 0 {
+				return ErrInvalidLengthTx
+			}
+			if (iNdEx + skippy) > l {
+				return io.ErrUnexpectedEOF
+			}
+			iNdEx += skippy
+		}
+	}
+
+	if iNdEx > l {
+		return io.ErrUnexpectedEOF
+	}
+	return nil
+}
+func (m *MsgMigrateContractResponse) Unmarshal(dAtA []byte) error {
+	l := len(dAtA)
+	iNdEx := 0
+	for iNdEx < l {
+		preIndex := iNdEx
+		var wire uint64
+		for shift := uint(0); ; shift += 7 {
+			if shift >= 64 {
+				return ErrIntOverflowTx
+			}
+			if iNdEx >= l {
+				return io.ErrUnexpectedEOF
+			}
+			b := dAtA[iNdEx]
+			iNdEx++
+			wire |= uint64(b&0x7F) << shift
+			if b < 0x80 {
+				break
+			}
+		}
+		fieldNum := int32(wire >> 3)
+		wireType := int(wire & 0x7)
+		if wireType == 4 {
+			return fmt.Errorf("proto: MsgMigrateContractResponse: wiretype end group for non-group")
+		}
+		if fieldNum <= 0 {
+			return fmt.Errorf("proto: MsgMigrateContractResponse: illegal tag %d (wire type %d)", fieldNum, wire)
+		}
+		switch fieldNum {
+		case 1:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field Data", wireType)
+			}
+			var byteLen int
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowTx
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				byteLen |= int(b&0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			if byteLen < 0 {
+				return ErrInvalidLengthTx
+			}
+			postIndex := iNdEx + byteLen
+			if postIndex < 0 {
+				return ErrInvalidLengthTx
+			}
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.Data = append(m.Data[:0], dAtA[iNdEx:postIndex]...)
+			if m.Data == nil {
+				m.Data = []byte{}
+			}
+			iNdEx = postIndex
+		default:
+			iNdEx = preIndex
+			skippy, err := skipTx(dAtA[iNdEx:])
+			if err != nil {
+				return err
+			}
+			if (skippy < 0) || (iNdEx+skippy) < 0 {
+				return ErrInvalidLengthTx
+			}
+			if (iNdEx + skippy) > l {
+				return io.ErrUnexpectedEOF
+			}
+			iNdEx += skippy
+		}
+	}
+
+	if iNdEx > l {
+		return io.ErrUnexpectedEOF
+	}
+	return nil
+}
 func skipTx(dAtA []byte) (n int, err error) {
 	l := len(dAtA)
 	iNdEx := 0

+ 9 - 0
wormchain/x/wormhole/types/wasmd.go

@@ -19,3 +19,12 @@ func (msg MsgStoreCode) ToWasmd() wasmdtypes.MsgStoreCode {
 		WASMByteCode: msg.WASMByteCode,
 	}
 }
+
+func (msg MsgMigrateContract) ToWasmd() wasmdtypes.MsgMigrateContract {
+	return wasmdtypes.MsgMigrateContract{
+		Sender:   msg.Signer,
+		Msg:      msg.Msg,
+		Contract: msg.Contract,
+		CodeID:   msg.CodeID,
+	}
+}

部分文件因文件數量過多而無法顯示