From fa9004b5ea07578adc2c9310415a8d5f0ce6345b Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 12 Oct 2021 11:34:43 +0200 Subject: [PATCH] Fix message encoding in AminoMsgExecuteContract --- .../cosmwasm-stargate/src/aminotypes.spec.ts | 26 ++-------- packages/cosmwasm-stargate/src/aminotypes.ts | 8 +-- .../src/signingcosmwasmclient.spec.ts | 50 +++++++++++++++++++ 3 files changed, 59 insertions(+), 25 deletions(-) diff --git a/packages/cosmwasm-stargate/src/aminotypes.spec.ts b/packages/cosmwasm-stargate/src/aminotypes.spec.ts index 7e193f0a..d6d2de45 100644 --- a/packages/cosmwasm-stargate/src/aminotypes.spec.ts +++ b/packages/cosmwasm-stargate/src/aminotypes.spec.ts @@ -145,11 +145,7 @@ describe("AminoTypes", () => { const msg: MsgExecuteContract = { sender: "cosmos1pkptre7fdkl6gfrzlesjjvhxhlc3r4gmmk8rs6", contract: "cosmos1xy4yqngt0nlkdcenxymg8tenrghmek4nmqm28k", - msg: toUtf8( - JSON.stringify({ - foo: "bar", - }), - ), + msg: toUtf8(`{"foo":"bar"}`), funds: coins(1234, "ucosm"), }; const aminoMsg = new AminoTypes({ additions: cosmWasmTypes }).toAmino({ @@ -161,9 +157,7 @@ describe("AminoTypes", () => { value: { sender: "cosmos1pkptre7fdkl6gfrzlesjjvhxhlc3r4gmmk8rs6", contract: "cosmos1xy4yqngt0nlkdcenxymg8tenrghmek4nmqm28k", - msg: { - foo: "bar", - }, + msg: toBase64(toUtf8(`{"foo":"bar"}`)), funds: coins(1234, "ucosm"), }, }; @@ -175,11 +169,7 @@ describe("AminoTypes", () => { sender: "cosmos1pkptre7fdkl6gfrzlesjjvhxhlc3r4gmmk8rs6", contract: "cosmos1xy4yqngt0nlkdcenxymg8tenrghmek4nmqm28k", codeId: Long.fromString("98765"), - msg: toUtf8( - JSON.stringify({ - foo: "bar", - }), - ), + msg: toUtf8(`{"foo":"bar"}`), }; const aminoMsg = new AminoTypes({ additions: cosmWasmTypes }).toAmino({ typeUrl: "/cosmwasm.wasm.v1.MsgMigrateContract", @@ -324,9 +314,7 @@ describe("AminoTypes", () => { value: { sender: "cosmos1pkptre7fdkl6gfrzlesjjvhxhlc3r4gmmk8rs6", contract: "cosmos1xy4yqngt0nlkdcenxymg8tenrghmek4nmqm28k", - msg: { - foo: "bar", - }, + msg: toBase64(toUtf8(`{"foo":"bar"}`)), funds: coins(1234, "ucosm"), }, }; @@ -334,11 +322,7 @@ describe("AminoTypes", () => { const expectedValue: MsgExecuteContract = { sender: "cosmos1pkptre7fdkl6gfrzlesjjvhxhlc3r4gmmk8rs6", contract: "cosmos1xy4yqngt0nlkdcenxymg8tenrghmek4nmqm28k", - msg: toUtf8( - JSON.stringify({ - foo: "bar", - }), - ), + msg: toUtf8(`{"foo":"bar"}`), funds: coins(1234, "ucosm"), }; expect(msg).toEqual({ diff --git a/packages/cosmwasm-stargate/src/aminotypes.ts b/packages/cosmwasm-stargate/src/aminotypes.ts index 1f9bc306..7b8393a1 100644 --- a/packages/cosmwasm-stargate/src/aminotypes.ts +++ b/packages/cosmwasm-stargate/src/aminotypes.ts @@ -45,8 +45,8 @@ export interface AminoMsgExecuteContract { readonly sender: string; /** Bech32 account address */ readonly contract: string; - /** Handle message as JavaScript object */ - readonly msg: any; + /** Execute message as base64 encoded JSON */ + readonly msg: string; readonly funds: readonly Coin[]; }; } @@ -199,13 +199,13 @@ export const cosmWasmTypes: Record = { toAmino: ({ sender, contract, msg, funds }: MsgExecuteContract): AminoMsgExecuteContract["value"] => ({ sender: sender, contract: contract, - msg: JSON.parse(fromUtf8(msg)), + msg: toBase64(msg), funds: funds, }), fromAmino: ({ sender, contract, msg, funds }: AminoMsgExecuteContract["value"]): MsgExecuteContract => ({ sender: sender, contract: contract, - msg: toUtf8(JSON.stringify(msg)), + msg: fromBase64(msg), funds: [...funds], }), }, diff --git a/packages/cosmwasm-stargate/src/signingcosmwasmclient.spec.ts b/packages/cosmwasm-stargate/src/signingcosmwasmclient.spec.ts index dc66e3a6..7b6cf487 100644 --- a/packages/cosmwasm-stargate/src/signingcosmwasmclient.spec.ts +++ b/packages/cosmwasm-stargate/src/signingcosmwasmclient.spec.ts @@ -377,6 +377,56 @@ describe("SigningCosmWasmClient", () => { client.disconnect(); }); + + it("works with legacy Amino signer", async () => { + pendingWithoutWasmd(); + const wallet = await Secp256k1HdWallet.fromMnemonic(alice.mnemonic, { prefix: wasmd.prefix }); + const options = { ...defaultSigningClientOptions, prefix: wasmd.prefix }; + const client = await SigningCosmWasmClient.connectWithSigner(wasmd.endpoint, wallet, options); + const { codeId } = await client.upload(alice.address0, getHackatom().data, defaultUploadFee); + // instantiate + const funds = [coin(233444, "ucosm"), coin(5454, "ustake")]; + const beneficiaryAddress = makeRandomAddress(); + const { contractAddress } = await client.instantiate( + alice.address0, + codeId, + { + verifier: alice.address0, + beneficiary: beneficiaryAddress, + }, + "amazing random contract", + defaultInstantiateFee, + { + funds: funds, + }, + ); + // execute + const result = await client.execute( + alice.address0, + contractAddress, + { release: {} }, + defaultExecuteFee, + ); + const wasmEvent = result.logs[0].events.find((e) => e.type === "wasm"); + assert(wasmEvent, "Event of type wasm expected"); + expect(wasmEvent.attributes).toContain({ key: "action", value: "release" }); + expect(wasmEvent.attributes).toContain({ + key: "destination", + value: beneficiaryAddress, + }); + // Verify token transfer from contract to beneficiary + const wasmClient = await makeWasmClient(wasmd.endpoint); + const beneficiaryBalanceUcosm = await wasmClient.bank.balance(beneficiaryAddress, "ucosm"); + expect(beneficiaryBalanceUcosm).toEqual(funds[0]); + const beneficiaryBalanceUstake = await wasmClient.bank.balance(beneficiaryAddress, "ustake"); + expect(beneficiaryBalanceUstake).toEqual(funds[1]); + const contractBalanceUcosm = await wasmClient.bank.balance(contractAddress, "ucosm"); + expect(contractBalanceUcosm).toEqual(coin(0, "ucosm")); + const contractBalanceUstake = await wasmClient.bank.balance(contractAddress, "ustake"); + expect(contractBalanceUstake).toEqual(coin(0, "ustake")); + + client.disconnect(); + }); }); describe("sendTokens", () => {