diff --git a/tests/e2e/testdata/cw721_base.wasm.gz b/tests/e2e/testdata/cw721_base.wasm.gz new file mode 100644 index 0000000000..b8dc3cd8d2 Binary files /dev/null and b/tests/e2e/testdata/cw721_base.wasm.gz differ diff --git a/tests/e2e/testdata/cw721_receiver.wasm.gz b/tests/e2e/testdata/cw721_receiver.wasm.gz new file mode 100644 index 0000000000..381ad675a0 Binary files /dev/null and b/tests/e2e/testdata/cw721_receiver.wasm.gz differ diff --git a/tests/e2e/testdata/version.txt b/tests/e2e/testdata/version.txt new file mode 100644 index 0000000000..3501468686 --- /dev/null +++ b/tests/e2e/testdata/version.txt @@ -0,0 +1,2 @@ +cw721_base - https://github.com/CosmWasm/cw-nfts/releases/download/v0.17.0/cw721_base.wasm +cw721-receiver - https://github.com/CosmWasm/cw-nfts/pull/144 diff --git a/tests/e2e/wasm_test.go b/tests/e2e/wasm_test.go new file mode 100644 index 0000000000..aac0d830f7 --- /dev/null +++ b/tests/e2e/wasm_test.go @@ -0,0 +1,68 @@ +package e2e + +import ( + "encoding/base64" + "fmt" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/CosmWasm/wasmd/x/wasm/types" + + "github.com/CosmWasm/wasmd/x/wasm/ibctesting" +) + +func TestNFTSubmessages(t *testing.T) { + // Given a cw721_base contract and a compatible contract as receiver + // and a nft minted + // when a send_nft is executed on the base contract, a submessage is emitted + // and handled by the receiver contract + specs := map[string]struct { + submsgPayload string + expErr bool + }{ + "succeed": { + submsgPayload: `"succeed"`, + }, + "fail": { + submsgPayload: `"fail"`, + expErr: true, + }, + } + for name, spec := range specs { + t.Run(name, func(t *testing.T) { + coord := ibctesting.NewCoordinator(t, 1) + chain := coord.GetChain(ibctesting.GetChainID(1)) + minterAddress := chain.SenderAccount.GetAddress() + + codeID := chain.StoreCodeFile("testdata/cw721_base.wasm.gz").CodeID + senderContractAddr := chain.InstantiateContract(codeID, []byte(fmt.Sprintf(`{"name":"Reece #00001", "symbol":"juno-reece-test-#00001", "minter":"%s"}`, minterAddress.String()))) + + codeID = chain.StoreCodeFile("testdata/cw721_receiver.wasm.gz").CodeID + receiverContractAddr := chain.InstantiateContract(codeID, []byte(`{}`)) + + // and token minted + execMsg := types.MsgExecuteContract{ + Sender: minterAddress.String(), + Contract: senderContractAddr.String(), + Msg: []byte(fmt.Sprintf(`{"mint":{"token_id":"00000", "owner":"%s"}}`, minterAddress.String())), + } + _, err := chain.SendMsgs(&execMsg) + require.NoError(t, err) + + // when submessages is emitted + execMsg = types.MsgExecuteContract{ + Sender: minterAddress.String(), + Contract: senderContractAddr.String(), + Msg: []byte(fmt.Sprintf(`{"send_nft": { "contract": "%s", "token_id": "00000", "msg": "%s" }}`, receiverContractAddr.String(), base64.RawStdEncoding.EncodeToString([]byte(spec.submsgPayload)))), + } + _, gotErr := chain.SendMsgs(&execMsg) + // then + if spec.expErr { + require.Error(t, gotErr) + return + } + require.NoError(t, err) + }) + } +} diff --git a/tests/system/.gitignore b/tests/system/.gitignore index 73423081ac..22873da42d 100644 --- a/tests/system/.gitignore +++ b/tests/system/.gitignore @@ -1 +1,2 @@ /testnet +/binaries diff --git a/tests/system/basic_test.go b/tests/system/basic_test.go index 1fba127648..e2a2b15c4b 100644 --- a/tests/system/basic_test.go +++ b/tests/system/basic_test.go @@ -122,3 +122,38 @@ func TestMultiContract(t *testing.T) { assert.Equal(t, int64(0), cli.QueryBalance(hackatomContractAddr, "stake")) assert.Equal(t, int64(70), cli.QueryBalance(bobAddr, "stake")) } + +func TestNFTSubmessages(t *testing.T) { + // Given a cw721_base contract and a compatible contract as receiver + // and a nft minted + // when a send_nft is executed on the base contract, a submessage is emitted + // and handled by the receiver contract + + sut.ResetChain(t) + sut.StartChain(t) + + cli := NewWasmdCLI(t, sut, verbose) + + minterAddress := cli.GetKeyAddr(defaultSrcAddr) + + t.Log("Upload cw721-base code") + codeID := cli.WasmStore("../e2e/testdata/cw721_base.wasm.gz", "--from=node0", "--gas=auto", "--gas-adjustment=1.4", "--fees=4stake") + t.Log("Instantiate cw721-base code") + msg := fmt.Sprintf(`{"name":"Reece #00001", "symbol":"juno-reece-test-#00001", "minter":"%s"}`, minterAddress) + senderContractAddr := cli.WasmInstantiate(codeID, msg, "--admin="+defaultSrcAddr, "--label=reflect_contract", "--from="+defaultSrcAddr, "--amount=100stake") + + t.Log("Upload cw721-receiver code") + codeID = cli.WasmStore("../e2e/testdata/cw721_receiver.wasm.gz", "--from=node0", "--gas=auto", "--gas-adjustment=1.4", "--fees=4stake") + t.Log("Instantiate cw721-receiver code") + receiverContractAddr := cli.WasmInstantiate(codeID, "{}", "--admin="+defaultSrcAddr, "--label=reflect_contract", "--from="+defaultSrcAddr, "--amount=100stake") + + // and token minted + msg = fmt.Sprintf(`{"mint":{"token_id":"00000", "owner":"%s"}}`, minterAddress) + rsp := cli.WasmExecute(senderContractAddr, msg, defaultSrcAddr, "--gas=auto", "--gas-adjustment=1.4", "--fees=4stake") + RequireTxSuccess(t, rsp) + + // when submessages is emitted + msg = fmt.Sprintf(`{"send_nft": { "contract": "%s", "token_id": "00000", "msg": "%s" }}`, receiverContractAddr, base64.RawStdEncoding.EncodeToString([]byte(`"succeed"`))) + rsp = cli.WasmExecute(senderContractAddr, msg, defaultSrcAddr, "--gas=auto", "--gas-adjustment=1.4", "--fees=4stake") + RequireTxSuccess(t, rsp) +}