From 305e47790cf35646ba893fc0ded712e95606b960 Mon Sep 17 00:00:00 2001 From: srdtrk <59252793+srdtrk@users.noreply.github.com> Date: Sat, 30 Dec 2023 10:41:48 +0300 Subject: [PATCH] imp: tested more of SendCosmosMsgs (#32) * imp: added Distribution cosmos messages * fix: changed VoteWeighted from v1beta1 to v1 * tests: added TestSendCosmosMsgs * ci: added the new cosmos_msg tests * style: ran 'cargo fmt' * imp: added wasm tests * imp: removed 'CosmosMsg::Wasm' from proto3json * imp: removed proto3json test for WasmMsg * deps: ran 'go mod tidy' * deps: bump wasmd to 0.45.0 * style: renamed counter.go -> counter_msg.go --- .github/workflows/e2e.yml | 3 + e2e/interchaintest/contract_test.go | 215 +++++++++++++ e2e/interchaintest/go.mod | 6 +- e2e/interchaintest/go.sum | 12 +- .../test_data/migrate_counter.wasm | Bin 0 -> 142052 bytes .../test_data/simple_counter.wasm | Bin 0 -> 140496 bytes e2e/interchaintest/types/contract.go | 15 + e2e/interchaintest/types/cosmos_msg.go | 82 ++++- e2e/interchaintest/types/counter_msg.go | 20 ++ e2e/interchaintest/types/ica_contract.go | 6 +- e2e/interchaintest/types/ica_msg.go | 4 +- e2e/interchaintest/types/types_test.go | 56 +--- e2e/interchaintest/wasm_msg_test.go | 283 ++++++++++++++++++ src/types/cosmos_msg.rs | 181 +++-------- src/types/msg.rs | 30 +- 15 files changed, 687 insertions(+), 226 deletions(-) create mode 100644 e2e/interchaintest/test_data/migrate_counter.wasm create mode 100644 e2e/interchaintest/test_data/simple_counter.wasm create mode 100644 e2e/interchaintest/types/counter_msg.go create mode 100644 e2e/interchaintest/wasm_msg_test.go diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml index 02b74cd2..43283383 100644 --- a/.github/workflows/e2e.yml +++ b/.github/workflows/e2e.yml @@ -32,6 +32,9 @@ jobs: - TestIcaContractTimeoutPacket - TestOwnerCreateIcaContract - TestOwnerPredefinedAction + - TestSendCosmosMsgsProto3JsonEncoding + - TestSendCosmosMsgsProtobufEncoding + - TestSendWasmMsgsProtobufEncoding name: ${{ matrix.test }} runs-on: ubuntu-latest steps: diff --git a/e2e/interchaintest/contract_test.go b/e2e/interchaintest/contract_test.go index 19c41aeb..0e28f805 100644 --- a/e2e/interchaintest/contract_test.go +++ b/e2e/interchaintest/contract_test.go @@ -477,6 +477,221 @@ func (s *ContractTestSuite) IcaContractExecutionTestWithEncoding(encoding string }) } +func (s *ContractTestSuite) TestSendCosmosMsgsProto3JsonEncoding() { + s.SendCosmosMsgsTestWithEncoding(icatypes.EncodingProto3JSON) +} + +func (s *ContractTestSuite) TestSendCosmosMsgsProtobufEncoding() { + s.SendCosmosMsgsTestWithEncoding(icatypes.EncodingProtobuf) +} + +// SendCosmosMsgsTestWithEncoding tests some more CosmosMsgs that are not covered by the IcaContractExecutionTestWithEncoding. +// The following CosmosMsgs are tested here: +// +// - Bank::Send +// - Stargate +// - VoteWeighted +// - SetWithdrawAddress +func (s *ContractTestSuite) SendCosmosMsgsTestWithEncoding(encoding string) { + ctx := context.Background() + + // This starts the chains, relayer, creates the user accounts, creates the ibc clients and connections, + // sets up the contract and does the channel handshake for the contract test suite. + s.SetupContractTestSuite(ctx, encoding) + wasmd, simd := s.ChainA, s.ChainB + wasmdUser := s.UserA + simdUser := s.UserB + + // Fund the ICA address: + s.FundAddressChainB(ctx, s.IcaAddress) + + s.Run(fmt.Sprintf("TestStargate-%s", encoding), func() { + // Send custom ICA messages through the contract: + // Let's create a governance proposal on simd and deposit some funds to it. + testProposal := govtypes.TextProposal{ + Title: "IBC Gov Proposal", + Description: "tokens for all!", + } + protoAny, err := codectypes.NewAnyWithValue(&testProposal) + s.Require().NoError(err) + proposalMsg := &govtypes.MsgSubmitProposal{ + Content: protoAny, + InitialDeposit: sdk.NewCoins(sdk.NewCoin(simd.Config().Denom, sdkmath.NewInt(5_000))), + Proposer: s.IcaAddress, + } + + // Create deposit message: + depositMsg := &govtypes.MsgDeposit{ + ProposalId: 1, + Depositor: s.IcaAddress, + Amount: sdk.NewCoins(sdk.NewCoin(simd.Config().Denom, sdkmath.NewInt(10_000_000))), + } + + initialBalance, err := simd.GetBalance(ctx, s.IcaAddress, simd.Config().Denom) + s.Require().NoError(err) + + if encoding == icatypes.EncodingProtobuf { + // Execute the contract: + err = s.Contract.ExecSendStargateMsgs(ctx, wasmdUser.KeyName(), []proto.Message{proposalMsg, depositMsg}, nil, nil) + s.Require().NoError(err) + } else if encoding == icatypes.EncodingProto3JSON { + err = s.Contract.ExecCustomIcaMessages(ctx, wasmdUser.KeyName(), []proto.Message{proposalMsg, depositMsg}, icatypes.EncodingProto3JSON, nil, nil) + s.Require().NoError(err) + } + + err = testutil.WaitForBlocks(ctx, 5, wasmd, simd) + s.Require().NoError(err) + + // Check if contract callbacks were executed: + callbackCounter, err := s.Contract.QueryCallbackCounter(ctx) + s.Require().NoError(err) + + s.Require().Equal(uint64(1), callbackCounter.Success) + s.Require().Equal(uint64(0), callbackCounter.Error) + + // Check if the proposal was created: + proposal, err := simd.QueryProposal(ctx, "1") + s.Require().NoError(err) + s.Require().Equal(simd.Config().Denom, proposal.TotalDeposit[0].Denom) + s.Require().Equal(fmt.Sprint(10_000_000+5_000), proposal.TotalDeposit[0].Amount) + // We do not check title and description of the proposal because this is a legacy proposal. + + postBalance, err := simd.GetBalance(ctx, s.IcaAddress, simd.Config().Denom) + s.Require().NoError(err) + s.Require().Equal(initialBalance.Sub(sdkmath.NewInt(10_000_000+5_000)), postBalance) + }) + + s.Run(fmt.Sprintf("TestDelegateAndVoteWeighted-%s", encoding), func() { + intialBalance, err := simd.GetBalance(ctx, s.IcaAddress, simd.Config().Denom) + s.Require().NoError(err) + + validator, err := simd.Validators[0].KeyBech32(ctx, "validator", "val") + s.Require().NoError(err) + + // Stake some tokens through CosmosMsgs: + stakeCosmosMsg := types.ContractCosmosMsg{ + Staking: &types.StakingCosmosMsg{ + Delegate: &types.StakingDelegateCosmosMsg{ + Validator: validator, + Amount: types.Coin{ + Denom: simd.Config().Denom, + Amount: "10000000", + }, + }, + }, + } + // Vote on the proposal through CosmosMsgs: + voteCosmosMsg := types.ContractCosmosMsg{ + Gov: &types.GovCosmosMsg{ + VoteWeighted: &types.GovVoteWeightedCosmosMsg{ + ProposalID: 1, + Options: []types.GovVoteWeightedOption{ + { + Option: "yes", + Weight: "0.5", + }, + { + Option: "abstain", + Weight: "0.5", + }, + }, + }, + }, + } + + // Execute the contract: + err = s.Contract.ExecSendCosmosMsgs(ctx, wasmdUser.KeyName(), []types.ContractCosmosMsg{stakeCosmosMsg, voteCosmosMsg}, nil, nil) + s.Require().NoError(err) + + err = testutil.WaitForBlocks(ctx, 5, wasmd, simd) + s.Require().NoError(err) + + callbackCounter, err := s.Contract.QueryCallbackCounter(ctx) + s.Require().NoError(err) + + s.Require().Equal(uint64(2), callbackCounter.Success) + s.Require().Equal(uint64(0), callbackCounter.Error) + + // Check if the delegation was successful: + postBalance, err := simd.GetBalance(ctx, s.IcaAddress, simd.Config().Denom) + s.Require().NoError(err) + s.Require().Equal(intialBalance.Sub(sdkmath.NewInt(10_000_000)), postBalance) + + delegationsQuerier := mysuite.NewGRPCQuerier[stakingtypes.QueryDelegationResponse](s.T(), simd, "/cosmos.staking.v1beta1.Query/Delegation") + + delRequest := stakingtypes.QueryDelegationRequest{ + DelegatorAddr: s.IcaAddress, + ValidatorAddr: validator, + } + delResp, err := delegationsQuerier.GRPCQuery(ctx, &delRequest) + s.Require().NoError(err) + s.Require().Equal(sdkmath.NewInt(10_000_000), delResp.DelegationResponse.Balance.Amount) + + // Check if the vote was successful: + votesQuerier := mysuite.NewGRPCQuerier[govtypes.QueryVoteResponse](s.T(), simd, "/cosmos.gov.v1beta1.Query/Vote") + + voteRequest := govtypes.QueryVoteRequest{ + ProposalId: 1, + Voter: s.IcaAddress, + } + voteResp, err := votesQuerier.GRPCQuery(ctx, &voteRequest) + s.Require().NoError(err) + s.Require().Len(voteResp.Vote.Options, 2) + s.Require().Equal(govtypes.OptionYes, voteResp.Vote.Options[0].Option) + expWeight, err := sdkmath.LegacyNewDecFromStr("0.5") + s.Require().NoError(err) + s.Require().Equal(expWeight, voteResp.Vote.Options[0].Weight) + s.Require().Equal(govtypes.OptionAbstain, voteResp.Vote.Options[1].Option) + s.Require().Equal(expWeight, voteResp.Vote.Options[1].Weight) + }) + + s.Run(fmt.Sprintf("TestSendAndSetWithdrawAddress-%s", encoding), func() { + initialBalance, err := simd.GetBalance(ctx, s.IcaAddress, simd.Config().Denom) + s.Require().NoError(err) + + // Send some tokens to the simdUser from the ICA address + sendMsg := types.ContractCosmosMsg{ + Bank: &types.BankCosmosMsg{ + Send: &types.BankSendCosmosMsg{ + ToAddress: simdUser.FormattedAddress(), + Amount: []types.Coin{ + { + Denom: simd.Config().Denom, + Amount: "1000000", + }, + }, + }, + }, + } + + // Set the withdraw address to the simdUser + setWithdrawAddressMsg := types.ContractCosmosMsg{ + Distribution: &types.DistributionCosmosMsg{ + SetWithdrawAddress: &types.DistributionSetWithdrawAddressCosmosMsg{ + Address: simdUser.FormattedAddress(), + }, + }, + } + + // Execute the contract: + err = s.Contract.ExecSendCosmosMsgs(ctx, wasmdUser.KeyName(), []types.ContractCosmosMsg{sendMsg, setWithdrawAddressMsg}, nil, nil) + s.Require().NoError(err) + + err = testutil.WaitForBlocks(ctx, 5, wasmd, simd) + s.Require().NoError(err) + + callbackCounter, err := s.Contract.QueryCallbackCounter(ctx) + s.Require().NoError(err) + s.Require().Equal(uint64(3), callbackCounter.Success) + s.Require().Equal(uint64(0), callbackCounter.Error) + + // Check if the send was successful: + postBalance, err := simd.GetBalance(ctx, s.IcaAddress, simd.Config().Denom) + s.Require().NoError(err) + s.Require().Equal(sdkmath.NewInt(1_000_000), initialBalance.Sub(postBalance)) + }) +} + func (s *ContractTestSuite) TestIcaContractTimeoutPacket() { ctx := context.Background() diff --git a/e2e/interchaintest/go.mod b/e2e/interchaintest/go.mod index 665c6ee0..f74a7b35 100644 --- a/e2e/interchaintest/go.mod +++ b/e2e/interchaintest/go.mod @@ -4,6 +4,7 @@ go 1.20 require ( cosmossdk.io/math v1.1.2 + github.com/CosmWasm/wasmd v0.45.0 github.com/cosmos/cosmos-sdk v0.47.5 github.com/cosmos/gogoproto v1.4.10 github.com/cosmos/ibc-go/v7 v7.3.0 @@ -33,8 +34,7 @@ require ( github.com/ChainSafe/go-schnorrkel v1.0.0 // indirect github.com/ChainSafe/go-schnorrkel/1 v0.0.0-00010101000000-000000000000 // indirect github.com/ComposableFi/go-subkey/v2 v2.0.0-tm03420 // indirect - github.com/CosmWasm/wasmd v0.41.0 // indirect - github.com/CosmWasm/wasmvm v1.3.0 // indirect + github.com/CosmWasm/wasmvm v1.5.0 // indirect github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e // indirect github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec // indirect github.com/Microsoft/go-winio v0.6.0 // indirect @@ -61,7 +61,7 @@ require ( github.com/cosmos/cosmos-proto v1.0.0-beta.3 // indirect github.com/cosmos/go-bip39 v1.0.0 // indirect github.com/cosmos/gogogateway v1.2.0 // indirect - github.com/cosmos/iavl v0.20.0 // indirect + github.com/cosmos/iavl v0.20.1 // indirect github.com/cosmos/ibc-go/modules/capability v1.0.0-rc1 // indirect github.com/cosmos/ics23/go v0.10.0 // indirect github.com/cosmos/ledger-cosmos-go v0.13.0 // indirect diff --git a/e2e/interchaintest/go.sum b/e2e/interchaintest/go.sum index 82faf589..e411be47 100644 --- a/e2e/interchaintest/go.sum +++ b/e2e/interchaintest/go.sum @@ -219,10 +219,10 @@ github.com/ChainSafe/go-schnorrkel v1.0.0 h1:3aDA67lAykLaG1y3AOjs88dMxC88PgUuHRr github.com/ChainSafe/go-schnorrkel v1.0.0/go.mod h1:dpzHYVxLZcp8pjlV+O+UR8K0Hp/z7vcchBSbMBEhCw4= github.com/ComposableFi/go-subkey/v2 v2.0.0-tm03420 h1:oknQF/iIhf5lVjbwjsVDzDByupRhga8nhA3NAmwyHDA= github.com/ComposableFi/go-subkey/v2 v2.0.0-tm03420/go.mod h1:KYkiMX5AbOlXXYfxkrYPrRPV6EbVUALTQh5ptUOJzu8= -github.com/CosmWasm/wasmd v0.41.0 h1:fmwxSbwb50zZDcBaayYFRLIaSFca+EFld1WOaQi49jg= -github.com/CosmWasm/wasmd v0.41.0/go.mod h1:0Sds1q2IsPaTN1gHa3BNOYcUFgtGvxH7CXEXPgoihns= -github.com/CosmWasm/wasmvm v1.3.0 h1:x12X4bKlUPS7TT9QQP45+fJo2sp30GEbiSSgb9jsec8= -github.com/CosmWasm/wasmvm v1.3.0/go.mod h1:vW/E3h8j9xBQs9bCoijDuawKo9kCtxOaS8N8J7KFtkc= +github.com/CosmWasm/wasmd v0.45.0 h1:9zBqrturKJwC2kVsfHvbrA++EN0PS7UTXCffCGbg6JI= +github.com/CosmWasm/wasmd v0.45.0/go.mod h1:RnSAiqbNIZu4QhO+0pd7qGZgnYAMBPGmXpzTADag944= +github.com/CosmWasm/wasmvm v1.5.0 h1:3hKeT9SfwfLhxTGKH3vXaKFzBz1yuvP8SlfwfQXbQfw= +github.com/CosmWasm/wasmvm v1.5.0/go.mod h1:fXB+m2gyh4v9839zlIXdMZGeLAxqUdYdFQqYsTha2hc= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e h1:ahyvB3q25YnZWly5Gq1ekg6jcmWaGj/vG/MhF4aisoc= github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e/go.mod h1:kGUqhHd//musdITWjFvNTHn90WG9bMLBEPQZ17Cmlpw= @@ -357,8 +357,8 @@ github.com/cosmos/gogogateway v1.2.0/go.mod h1:iQpLkGWxYcnCdz5iAdLcRBSw3h7NXeOkZ github.com/cosmos/gogoproto v1.4.2/go.mod h1:cLxOsn1ljAHSV527CHOtaIP91kK6cCrZETRBrkzItWU= github.com/cosmos/gogoproto v1.4.10 h1:QH/yT8X+c0F4ZDacDv3z+xE3WU1P1Z3wQoLMBRJoKuI= github.com/cosmos/gogoproto v1.4.10/go.mod h1:3aAZzeRWpAwr+SS/LLkICX2/kDFyaYVzckBDzygIxek= -github.com/cosmos/iavl v0.20.0 h1:fTVznVlepH0KK8NyKq8w+U7c2L6jofa27aFX6YGlm38= -github.com/cosmos/iavl v0.20.0/go.mod h1:WO7FyvaZJoH65+HFOsDir7xU9FWk2w9cHXNW1XHcl7A= +github.com/cosmos/iavl v0.20.1 h1:rM1kqeG3/HBT85vsZdoSNsehciqUQPWrR4BYmqE2+zg= +github.com/cosmos/iavl v0.20.1/go.mod h1:WO7FyvaZJoH65+HFOsDir7xU9FWk2w9cHXNW1XHcl7A= github.com/cosmos/ibc-go/modules/capability v1.0.0-rc1 h1:BvSKnPFKxL+TTSLxGKwJN4x0ndCZj0yfXhSvmsQztSA= github.com/cosmos/ibc-go/modules/capability v1.0.0-rc1/go.mod h1:A+CxAQdn2j6ihDTbClpEEBdHthWgAUAcHbRAQPY8sl4= github.com/cosmos/ibc-go/v7 v7.0.0-20230709121739-15b0fe103b52 h1:e6cYP9fum6kZPoXfQnyWWN7nO6wj21kllE/cDm3f1yo= diff --git a/e2e/interchaintest/test_data/migrate_counter.wasm b/e2e/interchaintest/test_data/migrate_counter.wasm new file mode 100644 index 0000000000000000000000000000000000000000..068d7e1e73f25e652607ab251e505bd19dcb1a3a GIT binary patch literal 142052 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

>$5Juo1D1bNFX19dVQ}MwYic%hQ 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 literal 0 HcmV?d00001 diff --git a/e2e/interchaintest/test_data/simple_counter.wasm b/e2e/interchaintest/test_data/simple_counter.wasm new file mode 100644 index 0000000000000000000000000000000000000000..723a0129dd9bf94bea491eddbb616fd748e87493 GIT binary patch literal 140496 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 jE{n7RGn7AwZ0e8YpMmRfSZmo-kNV1Q(?Z6{_P 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 Vjy1!l@MR0(w*(MYA`DkM{u_bO!hHY$ literal 0 HcmV?d00001 diff --git a/e2e/interchaintest/types/contract.go b/e2e/interchaintest/types/contract.go index 48298cb2..14e2882a 100644 --- a/e2e/interchaintest/types/contract.go +++ b/e2e/interchaintest/types/contract.go @@ -29,3 +29,18 @@ func (c *Contract) Execute(ctx context.Context, callerKeyName string, execMsg st _, err := c.chain.ExecuteContract(ctx, callerKeyName, c.Address, execMsg, extraExecTxArgs...) return err } + +func QueryContract[T any](ctx context.Context, chain *cosmos.CosmosChain, contractAddr string, queryMsg string) (*T, error) { + queryResp := QueryResponse[T]{} + err := chain.QueryContract(ctx, contractAddr, queryMsg, &queryResp) + if err != nil { + return nil, err + } + + resp, err := queryResp.GetResp() + if err != nil { + return nil, err + } + + return &resp, nil +} diff --git a/e2e/interchaintest/types/cosmos_msg.go b/e2e/interchaintest/types/cosmos_msg.go index 97712f72..b701ce62 100644 --- a/e2e/interchaintest/types/cosmos_msg.go +++ b/e2e/interchaintest/types/cosmos_msg.go @@ -3,11 +3,13 @@ package types import "encoding/base64" type ContractCosmosMsg struct { - Stargate *StargateCosmosMsg `json:"stargate,omitempty"` - Bank *BankCosmosMsg `json:"bank,omitempty"` - IBC *IbcCosmosMsg `json:"ibc,omitempty"` - Staking *StakingCosmosMsg `json:"staking,omitempty"` - Gov *GovCosmosMsg `json:"gov,omitempty"` + Stargate *StargateCosmosMsg `json:"stargate,omitempty"` + Bank *BankCosmosMsg `json:"bank,omitempty"` + IBC *IbcCosmosMsg `json:"ibc,omitempty"` + Staking *StakingCosmosMsg `json:"staking,omitempty"` + Distribution *DistributionCosmosMsg `json:"distribution,omitempty"` + Gov *GovCosmosMsg `json:"gov,omitempty"` + Wasm *WasmCosmosMsg `json:"wasm,omitempty"` } type StargateCosmosMsg struct { @@ -36,6 +38,76 @@ type StakingCosmosMsg struct { Redelegate *StakingRedelegateCosmosMsg `json:"redelegate,omitempty"` } +type DistributionCosmosMsg struct { + SetWithdrawAddress *DistributionSetWithdrawAddressCosmosMsg `json:"set_withdraw_address,omitempty"` + WithdrawDelegatorReward *DistributionWithdrawDelegatorRewardCosmosMsg `json:"withdraw_delegator_reward,omitempty"` + FundCommunityPool *DistributionFundCommunityPoolCosmosMsg `json:"fund_community_pool,omitempty"` +} + +type WasmCosmosMsg struct { + Execute *WasmExecuteCosmosMsg `json:"execute,omitempty"` + Instantiate *WasmInstantiateCosmosMsg `json:"instantiate,omitempty"` + Instantiate2 *WasmInstantiate2CosmosMsg `json:"instantiate2,omitempty"` + Migrate *WasmMigrateCosmosMsg `json:"migrate,omitempty"` + UpdateAdmin *WasmUpdateAdminCosmosMsg `json:"update_admin,omitempty"` + ClearAdmin *WasmClearAdminCosmosMsg `json:"clear_admin,omitempty"` +} + +type WasmExecuteCosmosMsg struct { + ContractAddr string `json:"contract_addr"` + // base64 encoded bytes + Msg string `json:"msg"` + Funds []Coin `json:"funds"` +} + +type WasmInstantiateCosmosMsg struct { + Admin string `json:"admin"` + CodeID uint64 `json:"code_id"` + // base64 encoded bytes + Msg string `json:"msg"` + Funds []Coin `json:"funds"` + Label string `json:"label"` +} + +type WasmInstantiate2CosmosMsg struct { + Admin string `json:"admin"` + CodeID uint64 `json:"code_id"` + // base64 encoded bytes + Msg string `json:"msg"` + Funds []Coin `json:"funds"` + Label string `json:"label"` + // base64 encoded bytes + Salt string `json:"salt"` +} + +type WasmMigrateCosmosMsg struct { + ContractAddr string `json:"contract_addr"` + NewCodeID uint64 `json:"new_code_id"` + // base64 encoded bytes + Msg string `json:"msg"` +} + +type WasmUpdateAdminCosmosMsg struct { + ContractAddr string `json:"contract_addr"` + Admin string `json:"admin"` +} + +type WasmClearAdminCosmosMsg struct { + ContractAddr string `json:"contract_addr"` +} + +type DistributionSetWithdrawAddressCosmosMsg struct { + Address string `json:"address"` +} + +type DistributionWithdrawDelegatorRewardCosmosMsg struct { + Validator string `json:"validator"` +} + +type DistributionFundCommunityPoolCosmosMsg struct { + Amount []Coin `json:"amount"` +} + type StakingDelegateCosmosMsg struct { Validator string `json:"validator"` Amount Coin `json:"amount"` diff --git a/e2e/interchaintest/types/counter_msg.go b/e2e/interchaintest/types/counter_msg.go new file mode 100644 index 00000000..3b12f8ed --- /dev/null +++ b/e2e/interchaintest/types/counter_msg.go @@ -0,0 +1,20 @@ +package types + +type CounterExecuteMsg struct { + Increment *CounterIncrementMsg `json:"increment,omitempty"` + Reset *CounterResetMsg `json:"reset,omitempty"` +} + +type CounterQueryMsg struct { + GetCount *struct{} `json:"get_count,omitempty"` +} + +type GetCountResponse struct { + Count int64 `json:"count"` +} + +type CounterIncrementMsg struct{} + +type CounterResetMsg struct { + Count int64 `json:"count"` +} diff --git a/e2e/interchaintest/types/ica_contract.go b/e2e/interchaintest/types/ica_contract.go index 1687ea19..2900f4b5 100644 --- a/e2e/interchaintest/types/ica_contract.go +++ b/e2e/interchaintest/types/ica_contract.go @@ -80,11 +80,11 @@ func (c *IcaContract) ExecCustomIcaMessages( // ExecSendCosmosMsgs invokes the contract's `SendCosmosMsgsAsIcaTx` message as the caller func (c *IcaContract) ExecSendCosmosMsgs( - ctx context.Context, callerKeyName string, - cosmosMsgs []ContractCosmosMsg, memo *string, timeout *uint64, + ctx context.Context, callerKeyName string, cosmosMsgs []ContractCosmosMsg, + memo *string, timeout *uint64, extraExecTxArgs ...string, ) error { cosmosMsg := newSendCosmosMsgsMsg(cosmosMsgs, memo, timeout) - err := c.Execute(ctx, callerKeyName, cosmosMsg) + err := c.Execute(ctx, callerKeyName, cosmosMsg, extraExecTxArgs...) return err } diff --git a/e2e/interchaintest/types/ica_msg.go b/e2e/interchaintest/types/ica_msg.go index 26c36b13..f444ecb2 100644 --- a/e2e/interchaintest/types/ica_msg.go +++ b/e2e/interchaintest/types/ica_msg.go @@ -176,7 +176,7 @@ func newSendCosmosMsgsMsgFromProto(msgs []proto.Message, memo *string, timeout * } type SendCosmosMsgsAsIcaTxMsgWrapper struct { - SendCosmosMsgsAsIcaTxMsg SendCosmosMsgsAsIcaTxMsg `json:"send_cosmos_msgs_as_ica_tx"` + SendCosmosMsgsMsg SendCosmosMsgsAsIcaTxMsg `json:"send_cosmos_msgs"` } cosmosMsgs := make([]ContractCosmosMsg, len(msgs)) @@ -200,7 +200,7 @@ func newSendCosmosMsgsMsgFromProto(msgs []proto.Message, memo *string, timeout * } msg := SendCosmosMsgsAsIcaTxMsgWrapper{ - SendCosmosMsgsAsIcaTxMsg: SendCosmosMsgsAsIcaTxMsg{ + SendCosmosMsgsMsg: SendCosmosMsgsAsIcaTxMsg{ Messages: cosmosMsgs, PacketMemo: memo, TimeoutSeconds: timeout, diff --git a/e2e/interchaintest/types/types_test.go b/e2e/interchaintest/types/types_test.go index 526ac548..3ade1a50 100644 --- a/e2e/interchaintest/types/types_test.go +++ b/e2e/interchaintest/types/types_test.go @@ -1,7 +1,6 @@ package types_test import ( - "encoding/base64" "encoding/json" "testing" @@ -10,10 +9,11 @@ import ( sdkmath "cosmossdk.io/math" - codectypes "github.com/cosmos/cosmos-sdk/codec/types" sdk "github.com/cosmos/cosmos-sdk/types" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" + icatypes "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/types" + "github.com/strangelove-ventures/interchaintest/v7/chain/cosmos/wasm" "github.com/srdtrk/cw-ica-controller/interchaintest/v2/types" @@ -35,40 +35,6 @@ func TestExecuteMsgs(t *testing.T) { t.Parallel() - // Basic tests: - sendCustomIcaMessagesMsg := types.NewSendCustomIcaMessagesMsg(nil, nil, "", nil, nil) - require.Equal(t, `{"send_custom_ica_messages":{"messages":[]}}`, sendCustomIcaMessagesMsg) - memo := "test" - sendCustomIcaMessagesMsg = types.NewSendCustomIcaMessagesMsg(nil, nil, "", &memo, nil) - require.Equal(t, `{"send_custom_ica_messages":{"messages":[],"packet_memo":"test"}}`, sendCustomIcaMessagesMsg) - timeout := uint64(150) - sendCustomIcaMessagesMsg = types.NewSendCustomIcaMessagesMsg(nil, nil, "", nil, &timeout) - require.Equal(t, `{"send_custom_ica_messages":{"messages":[],"timeout_seconds":150}}`, sendCustomIcaMessagesMsg) - - // Test with custom messages: - - type SendCustomIcaMessagesMsg struct { - Messages []string `json:"messages"` - PacketMemo *string `json:"packet_memo,omitempty"` - TimeoutSeconds *uint64 `json:"timeout_seconds,omitempty"` - } - - type SendCustomIcaMessagesMsgWrapper struct { - SendCustomIcaMessagesMsg SendCustomIcaMessagesMsg `json:"send_custom_ica_messages"` - } - - testProposal := &govtypes.TextProposal{ - Title: "IBC Gov Proposal", - Description: "tokens for all!", - } - protoAny, err := codectypes.NewAnyWithValue(testProposal) - require.NoError(t, err) - proposalMsg := &govtypes.MsgSubmitProposal{ - Content: protoAny, - InitialDeposit: sdk.NewCoins(sdk.NewCoin("stake", sdkmath.NewInt(5000))), - Proposer: testAddress, - } - // Create deposit message: depositMsg := &govtypes.MsgDeposit{ ProposalId: 1, @@ -76,24 +42,8 @@ func TestExecuteMsgs(t *testing.T) { Amount: sdk.NewCoins(sdk.NewCoin("stake", sdkmath.NewInt(10000000))), } - customMsg := types.NewSendCustomIcaMessagesMsg(wasm.WasmEncoding().Codec, []proto.Message{proposalMsg, depositMsg}, "proto3json", nil, nil) - unmarshaledCustomMsg := SendCustomIcaMessagesMsgWrapper{} - err = json.Unmarshal([]byte(customMsg), &unmarshaledCustomMsg) + _, err := icatypes.SerializeCosmosTxWithEncoding(wasm.WasmEncoding().Codec, []proto.Message{depositMsg}, icatypes.EncodingProto3JSON) require.NoError(t, err) - base64Msgs := unmarshaledCustomMsg.SendCustomIcaMessagesMsg.Messages - require.Len(t, base64Msgs, 2) - stringMsgs := make([]string, len(base64Msgs)) - for i, base64Msg := range base64Msgs { - msg, err := base64.StdEncoding.DecodeString(base64Msg) - require.NoError(t, err) - stringMsgs[i] = string(msg) - } - - expectedMsg1 := `{"@type":"/cosmos.gov.v1beta1.MsgSubmitProposal","content":{"@type":"/cosmos.gov.v1beta1.TextProposal","title":"IBC Gov Proposal","description":"tokens for all!"},"initial_deposit":[{"denom":"stake","amount":"5000"}],"proposer":"srdtrk"}` - expectedMsg2 := `{"@type":"/cosmos.gov.v1beta1.MsgDeposit","proposal_id":"1","depositor":"srdtrk","amount":[{"denom":"stake","amount":"10000000"}]}` - expectedMsgs := []string{expectedMsg1, expectedMsg2} - - require.Equal(t, expectedMsgs, stringMsgs) } func TestQueries(t *testing.T) { diff --git a/e2e/interchaintest/wasm_msg_test.go b/e2e/interchaintest/wasm_msg_test.go new file mode 100644 index 00000000..3bfedc8f --- /dev/null +++ b/e2e/interchaintest/wasm_msg_test.go @@ -0,0 +1,283 @@ +package main + +import ( + "context" + "encoding/base64" + "fmt" + "strconv" + + wasmtypes "github.com/CosmWasm/wasmd/x/wasm/types" + + icatypes "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/types" + + interchaintest "github.com/strangelove-ventures/interchaintest/v7" + "github.com/strangelove-ventures/interchaintest/v7/chain/cosmos/wasm" + "github.com/strangelove-ventures/interchaintest/v7/ibc" + "github.com/strangelove-ventures/interchaintest/v7/testutil" + + mysuite "github.com/srdtrk/cw-ica-controller/interchaintest/v2/testsuite" + "github.com/srdtrk/cw-ica-controller/interchaintest/v2/types" +) + +func (s *ContractTestSuite) SetupWasmTestSuite(ctx context.Context, encoding string) uint64 { + wasmChainSpecs := []*interchaintest.ChainSpec{ + chainSpecs[0], + { + ChainConfig: ibc.ChainConfig{ + Type: "cosmos", + Name: "wasmd2", + ChainID: "wasmd-2", + Images: []ibc.DockerImage{ + { + Repository: "cosmwasm/wasmd", // FOR LOCAL IMAGE USE: Docker Image Name + Version: "v0.45.0", // FOR LOCAL IMAGE USE: Docker Image Tag + }, + }, + Bin: "wasmd", + Bech32Prefix: "wasm", + Denom: "stake", + GasPrices: "0.00stake", + GasAdjustment: 1.3, + // cannot run wasmd commands without wasm encoding + EncodingConfig: wasm.WasmEncoding(), + TrustingPeriod: "508h", + NoHostMount: false, + }, + }, + } + s.SetupSuite(ctx, wasmChainSpecs) + + codeId, err := s.ChainA.StoreContract(ctx, s.UserA.KeyName(), "../../artifacts/cw_ica_controller.wasm") + s.Require().NoError(err) + + // Instantiate the contract with channel: + instantiateMsg := types.NewInstantiateMsgWithChannelInitOptions(nil, s.ChainAConnID, s.ChainBConnID, nil, &encoding) + + contractAddr, err := s.ChainA.InstantiateContract(ctx, s.UserA.KeyName(), codeId, instantiateMsg, true, "--gas", "500000") + s.Require().NoError(err) + + s.Contract = types.NewIcaContract(types.NewContract(contractAddr, codeId, s.ChainA)) + + // Wait for the channel to get set up + err = testutil.WaitForBlocks(ctx, 5, s.ChainA, s.ChainB) + s.Require().NoError(err) + + contractState, err := s.Contract.QueryContractState(ctx) + s.Require().NoError(err) + + ownershipResponse, err := s.Contract.QueryOwnership(ctx) + s.Require().NoError(err) + + s.IcaAddress = contractState.IcaInfo.IcaAddress + s.Contract.SetIcaAddress(s.IcaAddress) + + s.Require().Equal(s.UserA.FormattedAddress(), ownershipResponse.Owner) + s.Require().Nil(ownershipResponse.PendingOwner) + s.Require().Nil(ownershipResponse.PendingExpiry) + + counterCodeId, err := s.ChainB.StoreContract(ctx, s.UserB.KeyName(), "./test_data/simple_counter.wasm") + s.Require().NoError(err) + + _, err = s.ChainB.StoreContract(ctx, s.UserB.KeyName(), "./test_data/migrate_counter.wasm") + s.Require().NoError(err) + + counterCodeID, err := strconv.ParseUint(counterCodeId, 10, 64) + s.Require().NoError(err) + + return counterCodeID +} + +func (s *ContractTestSuite) TestSendWasmMsgsProtobufEncoding() { + s.SendWasmMsgsTestWithEncoding(icatypes.EncodingProtobuf) +} + +// currently, Wasm is only supported with protobuf encoding +func (s *ContractTestSuite) SendWasmMsgsTestWithEncoding(encoding string) { + ctx := context.Background() + + // This starts the chains, relayer, creates the user accounts, creates the ibc clients and connections, + // sets up the contract and does the channel handshake for the contract test suite. + counterCodeID := s.SetupWasmTestSuite(ctx, encoding) + wasmd, wasmd2 := s.ChainA, s.ChainB + wasmdUser, wasmd2User := s.UserA, s.UserB + + // Fund the ICA address: + s.FundAddressChainB(ctx, s.IcaAddress) + + var counterAddress string + s.Run(fmt.Sprintf("TestInstantiate-%s", encoding), func() { + // Instantiate the contract: + instantiateMsg := types.ContractCosmosMsg{ + Wasm: &types.WasmCosmosMsg{ + Instantiate: &types.WasmInstantiateCosmosMsg{ + Admin: s.IcaAddress, + CodeID: counterCodeID, + Label: "counter", + Msg: toBase64(`{"count": 0}`), + Funds: []types.Coin{}, + }, + }, + } + + // Execute the contract: + err := s.Contract.ExecSendCosmosMsgs(ctx, wasmdUser.KeyName(), []types.ContractCosmosMsg{instantiateMsg}, nil, nil) + s.Require().NoError(err) + + err = testutil.WaitForBlocks(ctx, 5, wasmd, wasmd2) + s.Require().NoError(err) + + // Check if contract callbacks were executed: + callbackCounter, err := s.Contract.QueryCallbackCounter(ctx) + s.Require().NoError(err) + + s.Require().Equal(uint64(1), callbackCounter.Success) + s.Require().Equal(uint64(0), callbackCounter.Error) + + contractByCodeQuerier := mysuite.NewGRPCQuerier[wasmtypes.QueryContractsByCodeResponse](s.T(), wasmd2, "/cosmwasm.wasm.v1.Query/ContractsByCode") + + contractByCodeRequest := wasmtypes.QueryContractsByCodeRequest{ + CodeId: counterCodeID, + } + contractByCodeResp, err := contractByCodeQuerier.GRPCQuery(ctx, &contractByCodeRequest) + s.Require().NoError(err) + s.Require().Len(contractByCodeResp.Contracts, 1) + + counterAddress = contractByCodeResp.Contracts[0] + + counterState, err := types.QueryContract[types.GetCountResponse](ctx, wasmd2, counterAddress, `{"get_count": {}}`) + s.Require().NoError(err) + + s.Require().Equal(int64(0), counterState.Count) + }) + + var counter2Address string + s.Run(fmt.Sprintf("TestExecuteAndInstantiate2AndClearAdminMsg-%s", encoding), func() { + // Execute the contract: + executeMsg := types.ContractCosmosMsg{ + Wasm: &types.WasmCosmosMsg{ + Execute: &types.WasmExecuteCosmosMsg{ + ContractAddr: counterAddress, + Msg: toBase64(`{"increment": {}}`), + Funds: []types.Coin{}, + }, + }, + } + + clearAdminMsg := types.ContractCosmosMsg{ + Wasm: &types.WasmCosmosMsg{ + ClearAdmin: &types.WasmClearAdminCosmosMsg{ + ContractAddr: counterAddress, + }, + }, + } + + instantiate2Msg := types.ContractCosmosMsg{ + Wasm: &types.WasmCosmosMsg{ + Instantiate2: &types.WasmInstantiate2CosmosMsg{ + Admin: s.IcaAddress, + CodeID: counterCodeID, + Label: "counter2", + Msg: toBase64(`{"count": 0}`), + Funds: []types.Coin{}, + Salt: toBase64("salt"), + }, + }, + } + + // Execute the contract: + err := s.Contract.ExecSendCosmosMsgs(ctx, wasmdUser.KeyName(), []types.ContractCosmosMsg{executeMsg, clearAdminMsg, instantiate2Msg}, nil, nil) + s.Require().NoError(err) + + err = testutil.WaitForBlocks(ctx, 5, wasmd, wasmd2) + s.Require().NoError(err) + + // Check if contract callbacks were executed: + callbackCounter, err := s.Contract.QueryCallbackCounter(ctx) + s.Require().NoError(err) + + s.Require().Equal(uint64(2), callbackCounter.Success) + s.Require().Equal(uint64(0), callbackCounter.Error) + + counterState, err := types.QueryContract[types.GetCountResponse](ctx, wasmd2, counterAddress, `{"get_count": {}}`) + s.Require().NoError(err) + + s.Require().Equal(int64(1), counterState.Count) + + contractInfoQuerier := mysuite.NewGRPCQuerier[wasmtypes.QueryContractInfoResponse](s.T(), wasmd2, "/cosmwasm.wasm.v1.Query/ContractInfo") + + contractInfoRequest := wasmtypes.QueryContractInfoRequest{ + Address: counterAddress, + } + contractInfoResp, err := contractInfoQuerier.GRPCQuery(ctx, &contractInfoRequest) + s.Require().NoError(err) + + s.Require().Equal("", contractInfoResp.ContractInfo.Admin) + + contractByCodeQuerier := mysuite.NewGRPCQuerier[wasmtypes.QueryContractsByCodeResponse](s.T(), wasmd2, "/cosmwasm.wasm.v1.Query/ContractsByCode") + + contractByCodeRequest := wasmtypes.QueryContractsByCodeRequest{ + CodeId: counterCodeID, + } + contractByCodeResp, err := contractByCodeQuerier.GRPCQuery(ctx, &contractByCodeRequest) + s.Require().NoError(err) + s.Require().Len(contractByCodeResp.Contracts, 2) + + counter2Address = contractByCodeResp.Contracts[1] + }) + + s.Run(fmt.Sprintf("TestMigrateAndUpdateAdmin-%s", encoding), func() { + migrateMsg := types.ContractCosmosMsg{ + Wasm: &types.WasmCosmosMsg{ + Migrate: &types.WasmMigrateCosmosMsg{ + ContractAddr: counter2Address, + NewCodeID: counterCodeID + 1, + Msg: toBase64(`{}`), + }, + }, + } + + updateAdminMsg := types.ContractCosmosMsg{ + Wasm: &types.WasmCosmosMsg{ + UpdateAdmin: &types.WasmUpdateAdminCosmosMsg{ + ContractAddr: counter2Address, + Admin: wasmd2User.FormattedAddress(), + }, + }, + } + + // Execute the contract: + err := s.Contract.ExecSendCosmosMsgs(ctx, wasmdUser.KeyName(), []types.ContractCosmosMsg{migrateMsg, updateAdminMsg}, nil, nil) + s.Require().NoError(err) + + err = testutil.WaitForBlocks(ctx, 5, wasmd, wasmd2) + s.Require().NoError(err) + + // Check if contract callbacks were executed: + callbackCounter, err := s.Contract.QueryCallbackCounter(ctx) + s.Require().NoError(err) + + // s.Require().Equal(uint64(1), callbackCounter.Error) + s.Require().Equal(uint64(3), callbackCounter.Success) + s.Require().Equal(uint64(0), callbackCounter.Error) + + counterState, err := types.QueryContract[types.GetCountResponse](ctx, wasmd2, counter2Address, `{"get_count": {}}`) + s.Require().NoError(err) + + s.Require().Equal(int64(0), counterState.Count) + + contractInfoQuerier := mysuite.NewGRPCQuerier[wasmtypes.QueryContractInfoResponse](s.T(), wasmd2, "/cosmwasm.wasm.v1.Query/ContractInfo") + + contractInfoRequest := wasmtypes.QueryContractInfoRequest{ + Address: counter2Address, + } + contractInfoResp, err := contractInfoQuerier.GRPCQuery(ctx, &contractInfoRequest) + s.Require().NoError(err) + + s.Require().Equal(counterCodeID+1, contractInfoResp.ContractInfo.CodeID) + s.Require().Equal(wasmd2User.FormattedAddress(), contractInfoResp.ContractInfo.Admin) + }) +} + +func toBase64(msg string) string { + return base64.StdEncoding.EncodeToString([]byte(msg)) +} diff --git a/src/types/cosmos_msg.rs b/src/types/cosmos_msg.rs index 07c4b816..374a7e04 100644 --- a/src/types/cosmos_msg.rs +++ b/src/types/cosmos_msg.rs @@ -58,10 +58,8 @@ mod convert_to_any { cosmos::{ bank::v1beta1::MsgSend, base::v1beta1::Coin as ProtoCoin, - gov::v1beta1::{ - MsgVote, MsgVoteWeighted, VoteOption as ProtoVoteOption, - WeightedVoteOption as ProtoWeightedVoteOption, - }, + gov::v1::{MsgVoteWeighted, WeightedVoteOption as ProtoWeightedVoteOption}, + gov::v1beta1::{MsgVote, VoteOption as ProtoVoteOption}, }, cosmwasm::wasm::v1::{ MsgClearAdmin, MsgExecuteContract, MsgInstantiateContract, MsgInstantiateContract2, @@ -243,7 +241,7 @@ mod convert_to_any { proposal_id, options, } => { - let options = options + let options: Vec = options .into_iter() .map(|weighted_option| -> ProtoWeightedVoteOption { ProtoWeightedVoteOption { @@ -257,10 +255,11 @@ mod convert_to_any { proposal_id, voter, options, + metadata: String::new(), }; Any { - type_url: "/cosmos.gov.v1beta1.MsgVoteWeighted".to_string(), + type_url: "/cosmos.gov.v1.MsgVoteWeighted".to_string(), value: value.encode_to_vec(), } } @@ -268,14 +267,14 @@ mod convert_to_any { } #[cfg(feature = "staking")] - pub fn staking(msg: StakingMsg, from_address: String) -> Result { + pub fn staking(msg: StakingMsg, delegator_address: String) -> Result { use cosmos_sdk_proto::cosmos::staking::v1beta1::{ MsgBeginRedelegate, MsgDelegate, MsgUndelegate, }; match msg { StakingMsg::Delegate { validator, amount } => Any::from_msg(&MsgDelegate { - delegator_address: from_address, + delegator_address, validator_address: validator, amount: Some(ProtoCoin { denom: amount.denom, @@ -283,7 +282,7 @@ mod convert_to_any { }), }), StakingMsg::Undelegate { validator, amount } => Any::from_msg(&MsgUndelegate { - delegator_address: from_address, + delegator_address, validator_address: validator, amount: Some(ProtoCoin { denom: amount.denom, @@ -295,7 +294,7 @@ mod convert_to_any { dst_validator, amount, } => Any::from_msg(&MsgBeginRedelegate { - delegator_address: from_address, + delegator_address, validator_src_address: src_validator, validator_dst_address: dst_validator, amount: Some(ProtoCoin { @@ -308,7 +307,10 @@ mod convert_to_any { } #[cfg(feature = "staking")] - pub fn distribution(msg: DistributionMsg, from_address: String) -> Result { + pub fn distribution( + msg: DistributionMsg, + delegator_address: String, + ) -> Result { use cosmos_sdk_proto::cosmos::distribution::v1beta1::{ MsgSetWithdrawAddress, MsgWithdrawDelegatorReward, }; @@ -316,13 +318,13 @@ mod convert_to_any { match msg { DistributionMsg::WithdrawDelegatorReward { validator } => { Any::from_msg(&MsgWithdrawDelegatorReward { - delegator_address: from_address, + delegator_address, validator_address: validator, }) } DistributionMsg::SetWithdrawAddress { address } => { Any::from_msg(&MsgSetWithdrawAddress { - delegator_address: from_address, + delegator_address, withdraw_address: address, }) } @@ -335,18 +337,13 @@ mod convert_to_any { /// [`proto3json`](crate::ibc::types::metadata::TxEncoding::Proto3Json) encoding format. /// /// # Panics -/// Panics if the [`CosmosMsg`] is not supported. Notably, [`CosmosMsg::Stargate`] is not supported. +/// Panics if the [`CosmosMsg`] is not supported. +/// Notably, [`CosmosMsg::Stargate`] and [`CosmosMsg::Wasm`] are not supported. /// /// ## List of supported [`CosmosMsg`] /// /// - [`CosmosMsg::Bank`] with [`BankMsg::Send`] /// - [`CosmosMsg::Ibc`] with [`IbcMsg::Transfer`] -/// - [`CosmosMsg::Wasm`] with [`cosmwasm_std::WasmMsg::Execute`] -/// - [`CosmosMsg::Wasm`] with [`cosmwasm_std::WasmMsg::Instantiate`] -/// - [`CosmosMsg::Wasm`] with [`cosmwasm_std::WasmMsg::Instantiate2`] -/// - [`CosmosMsg::Wasm`] with [`cosmwasm_std::WasmMsg::Migrate`] -/// - [`CosmosMsg::Wasm`] with [`cosmwasm_std::WasmMsg::UpdateAdmin`] -/// - [`CosmosMsg::Wasm`] with [`cosmwasm_std::WasmMsg::ClearAdmin`] /// - [`CosmosMsg::Gov`] with [`cosmwasm_std::GovMsg::Vote`] /// - [`CosmosMsg::Gov`] with [`cosmwasm_std::GovMsg::VoteWeighted`] /// - [`CosmosMsg::Staking`] with [`cosmwasm_std::StakingMsg::Delegate`] @@ -359,7 +356,6 @@ pub fn convert_to_proto3json(msg: CosmosMsg, from_address: String) -> String { match msg { CosmosMsg::Bank(msg) => convert_to_json::bank(msg, from_address), CosmosMsg::Ibc(msg) => convert_to_json::ibc(msg, from_address), - CosmosMsg::Wasm(msg) => convert_to_json::wasm(msg, from_address), CosmosMsg::Gov(msg) => convert_to_json::gov(msg, from_address), #[cfg(feature = "staking")] CosmosMsg::Staking(msg) => convert_to_json::staking(msg, from_address), @@ -372,7 +368,7 @@ pub fn convert_to_proto3json(msg: CosmosMsg, from_address: String) -> String { mod convert_to_json { #[cfg(feature = "staking")] use cosmwasm_std::{DistributionMsg, StakingMsg}; - use cosmwasm_std::{GovMsg, VoteOption, WasmMsg}; + use cosmwasm_std::{GovMsg, VoteOption}; use super::{BankMsg, Coin, IbcMsg}; @@ -419,76 +415,6 @@ mod convert_to_json { .to_string() } - pub fn wasm(msg: WasmMsg, sender: String) -> String { - match msg { - WasmMsg::Execute { - contract_addr, - msg, - funds, - } => CosmosMsgProto3JsonSerializer::ExecuteContract { - sender, - contract: contract_addr, - msg: msg.to_vec(), - funds, - }, - WasmMsg::Instantiate { - admin, - code_id, - msg, - funds, - label, - } => CosmosMsgProto3JsonSerializer::InstantiateContract { - admin: admin.unwrap_or_default(), - sender, - code_id, - msg: msg.to_vec(), - funds, - label, - }, - WasmMsg::Migrate { - contract_addr, - new_code_id, - msg, - } => CosmosMsgProto3JsonSerializer::MigrateContract { - sender, - contract: contract_addr, - code_id: new_code_id, - msg: msg.to_vec(), - }, - WasmMsg::UpdateAdmin { - contract_addr, - admin, - } => CosmosMsgProto3JsonSerializer::UpdateAdmin { - sender, - new_admin: admin, - contract: contract_addr, - }, - WasmMsg::ClearAdmin { contract_addr } => CosmosMsgProto3JsonSerializer::ClearAdmin { - sender, - contract: contract_addr, - }, - WasmMsg::Instantiate2 { - admin, - code_id, - label, - msg, - funds, - salt, - } => CosmosMsgProto3JsonSerializer::InstantiateContract2 { - admin: admin.unwrap_or_default(), - sender, - code_id, - label, - msg: msg.to_vec(), - funds, - salt: salt.to_vec(), - fix_msg: false, - }, - _ => panic!("Unsupported WasmMsg"), - } - .to_string() - } - pub fn gov(msg: GovMsg, voter: String) -> String { const fn convert_to_u64(option: &VoteOption) -> u64 { match option { @@ -620,54 +546,6 @@ mod convert_to_json { #[serde(skip_serializing_if = "Option::is_none")] memo: Option, }, - /// This is a Cosmos message to execute a smart contract. - #[serde(rename = "/cosmwasm.wasm.v1.MsgExecuteContract")] - ExecuteContract { - sender: String, - contract: String, - msg: Vec, - funds: Vec, - }, - /// This is a Cosmos message to instantiate a smart contract. - #[serde(rename = "/cosmwasm.wasm.v1.MsgInstantiateContract")] - InstantiateContract { - admin: String, - sender: String, - code_id: u64, - msg: Vec, - funds: Vec, - label: String, - }, - /// This is a Cosmos message to migrate a smart contract. - #[serde(rename = "/cosmwasm.wasm.v1.MsgMigrateContract")] - MigrateContract { - sender: String, - contract: String, - code_id: u64, - msg: Vec, - }, - /// This is a Cosmos message to update the admin of a smart contract. - #[serde(rename = "/cosmwasm.wasm.v1.MsgUpdateAdmin")] - UpdateAdmin { - sender: String, - new_admin: String, - contract: String, - }, - /// This is a Cosmos message to clear the admin of a smart contract. - #[serde(rename = "/cosmwasm.wasm.v1.MsgClearAdmin")] - ClearAdmin { sender: String, contract: String }, - /// This is a Cosmos message to instantiate2 a smart contract with a salt. - #[serde(rename = "/cosmwasm.wasm.v1.MsgInstantiateContract2")] - InstantiateContract2 { - admin: String, - sender: String, - code_id: u64, - label: String, - msg: Vec, - funds: Vec, - salt: Vec, - fix_msg: bool, - }, /// This is a Cosmos message to vote on a governance proposal. #[serde(rename = "/cosmos.gov.v1beta1.MsgVote")] Vote { @@ -746,7 +624,9 @@ mod convert_to_json { #[cfg(test)] mod tests { - use cosmwasm_std::{coins, from_json}; + use std::str::FromStr; + + use cosmwasm_std::{coins, from_json, Decimal, Uint128, VoteOption, WeightedVoteOption}; use crate::ibc::types::packet::IcaPacketData; @@ -773,4 +653,23 @@ mod tests { assert_eq!(expected, cosmos_tx.messages[0]); } + + #[test] + fn test_weighted_vote_option() { + let test_msg = r#"{"option":"yes","weight":"0.5"}"#; + + let vote_option = serde_json_wasm::from_str::(test_msg).unwrap(); + + assert_eq!( + vote_option, + WeightedVoteOption { + option: VoteOption::Yes, + weight: Decimal::from_ratio( + Uint128::from_str("1").unwrap(), + Uint128::from_str("2").unwrap() + ), + } + ); + assert_eq!("0.5".to_string(), vote_option.weight.to_string()); + } } diff --git a/src/types/msg.rs b/src/types/msg.rs index 93ab41cd..c1b4d0de 100644 --- a/src/types/msg.rs +++ b/src/types/msg.rs @@ -36,7 +36,24 @@ pub enum ExecuteMsg { #[serde(skip_serializing_if = "Option::is_none")] channel_open_init_options: Option, }, + /// `SendCosmosMsgs` converts the provided array of [`CosmosMsg`] to an ICA tx and sends them to the ICA host. + /// [`CosmosMsg::Stargate`] and [`CosmosMsg::Wasm`] are only supported if the [`TxEncoding`](crate::ibc::types::metadata::TxEncoding) is [`TxEncoding::Protobuf`](crate::ibc::types::metadata::TxEncoding). + /// + /// **This is the recommended way to send messages to the ICA host.** + SendCosmosMsgs { + /// The stargate messages to convert and send to the ICA host. + messages: Vec, + /// Optional memo to include in the ibc packet. + #[serde(skip_serializing_if = "Option::is_none")] + packet_memo: Option, + /// Optional timeout in seconds to include with the ibc packet. + /// If not specified, the [default timeout](crate::ibc::types::packet::DEFAULT_TIMEOUT_SECONDS) is used. + #[serde(skip_serializing_if = "Option::is_none")] + timeout_seconds: Option, + }, /// `SendCustomIcaMessages` sends custom messages from the ICA controller to the ICA host. + /// + /// **Use this only if you know what you are doing.** SendCustomIcaMessages { /// Base64-encoded json or proto messages to send to the ICA host. /// @@ -71,19 +88,6 @@ pub enum ExecuteMsg { #[serde(skip_serializing_if = "Option::is_none")] timeout_seconds: Option, }, - /// `SendCosmosMsgs` converts the provided array of [`CosmosMsg`] to an ICA tx and sends them to the ICA host. - /// [`CosmosMsg::Stargate`] is only supported if the [`TxEncoding`](crate::ibc::types::metadata::TxEncoding) is [`TxEncoding::Protobuf`](crate::ibc::types::metadata::TxEncoding). - SendCosmosMsgs { - /// The stargate messages to convert and send to the ICA host. - messages: Vec, - /// Optional memo to include in the ibc packet. - #[serde(skip_serializing_if = "Option::is_none")] - packet_memo: Option, - /// Optional timeout in seconds to include with the ibc packet. - /// If not specified, the [default timeout](crate::ibc::types::packet::DEFAULT_TIMEOUT_SECONDS) is used. - #[serde(skip_serializing_if = "Option::is_none")] - timeout_seconds: Option, - }, /// `UpdateCallbackAddress` updates the contract callback address. UpdateCallbackAddress { /// The new callback address.