From c7b0b2c74d07661ad4a0c5167d5ea7aed5ed9ba3 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 12 Mar 2020 17:50:19 +0100 Subject: [PATCH 1/4] Pull out and generalize semverMatcher --- packages/sdk/src/restclient.spec.ts | 3 ++- packages/sdk/src/testutils.spec.ts | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/sdk/src/restclient.spec.ts b/packages/sdk/src/restclient.spec.ts index 36b6c1ce..f5a96f91 100644 --- a/packages/sdk/src/restclient.spec.ts +++ b/packages/sdk/src/restclient.spec.ts @@ -19,6 +19,7 @@ import { getRandomizedHackatom, makeRandomAddress, pendingWithoutWasmd, + semverMatcher, tendermintAddressMatcher, tendermintHeightMatcher, tendermintIdMatcher, @@ -315,7 +316,7 @@ describe("RestClient", () => { name: "wasm", server_name: "wasmd", client_name: "wasmcli", - version: jasmine.stringMatching(/^0\.7\.[0-9]+(-[a-zA-Z0-9._]+)?$/), + version: jasmine.stringMatching(semverMatcher), commit: jasmine.stringMatching(tendermintShortHashMatcher), build_tags: "netgo,ledger", go: jasmine.stringMatching(/^go version go1\.[0-9]+\.[0-9]+ linux\/amd64$/), diff --git a/packages/sdk/src/testutils.spec.ts b/packages/sdk/src/testutils.spec.ts index ce680689..be72bc0f 100644 --- a/packages/sdk/src/testutils.spec.ts +++ b/packages/sdk/src/testutils.spec.ts @@ -61,6 +61,7 @@ export const tendermintIdMatcher = /^[0-9A-F]{64}$/; export const tendermintOptionalIdMatcher = /^([0-9A-F]{64}|)$/; export const tendermintAddressMatcher = /^[0-9A-F]{40}$/; export const tendermintShortHashMatcher = /^[0-9a-f]{40}$/; +export const semverMatcher = /^[0-9]+\.[0-9]+\.[0-9]+(-[0-9A-Za-z-]+(\.[0-9A-Za-z-]+)*)?$/; // https://github.com/bitcoin/bips/blob/master/bip-0173.mediawiki#bech32 export const bech32AddressMatcher = /^[\x21-\x7e]{1,83}1[02-9ac-hj-np-z]{38}$/; From 8e031e51f38ca5d0f438173836cf59ad85061470 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 12 Mar 2020 17:52:29 +0100 Subject: [PATCH 2/4] Don't randomize hackatom --- packages/sdk/src/cosmwasmclient.spec.ts | 6 ++--- packages/sdk/src/restclient.spec.ts | 6 ++--- .../sdk/src/signingcosmwasmclient.spec.ts | 12 ++++----- packages/sdk/src/testutils.spec.ts | 27 ++----------------- 4 files changed, 14 insertions(+), 37 deletions(-) diff --git a/packages/sdk/src/cosmwasmclient.spec.ts b/packages/sdk/src/cosmwasmclient.spec.ts index 6050d99c..7e2ddb80 100644 --- a/packages/sdk/src/cosmwasmclient.spec.ts +++ b/packages/sdk/src/cosmwasmclient.spec.ts @@ -13,7 +13,7 @@ import cosmoshub from "./testdata/cosmoshub.json"; import { deployedErc20, faucet, - getRandomizedHackatom, + getHackatom, makeRandomAddress, pendingWithoutWasmd, tendermintIdMatcher, @@ -376,7 +376,7 @@ describe("CosmWasmClient", () => { const client = new SigningCosmWasmClient(wasmd.endpoint, faucet.address, signBytes => pen.sign(signBytes), ); - const { codeId } = await client.upload(getRandomizedHackatom()); + const { codeId } = await client.upload(getHackatom()); const initMsg = { verifier: makeRandomAddress(), beneficiary: makeRandomAddress() }; const { contractAddress } = await client.instantiate(codeId, initMsg, "random hackatom"); contract = { initMsg: initMsg, address: contractAddress }; @@ -429,7 +429,7 @@ describe("CosmWasmClient", () => { const client = new SigningCosmWasmClient(wasmd.endpoint, faucet.address, signBytes => pen.sign(signBytes), ); - const { codeId } = await client.upload(getRandomizedHackatom()); + const { codeId } = await client.upload(getHackatom()); const initMsg = { verifier: makeRandomAddress(), beneficiary: makeRandomAddress() }; const { contractAddress } = await client.instantiate(codeId, initMsg, "a different hackatom"); contract = { initMsg: initMsg, address: contractAddress }; diff --git a/packages/sdk/src/restclient.spec.ts b/packages/sdk/src/restclient.spec.ts index f5a96f91..194a5204 100644 --- a/packages/sdk/src/restclient.spec.ts +++ b/packages/sdk/src/restclient.spec.ts @@ -16,7 +16,7 @@ import { deployedErc20, faucet, fromOneElementArray, - getRandomizedHackatom, + getHackatom, makeRandomAddress, pendingWithoutWasmd, semverMatcher, @@ -92,7 +92,7 @@ async function uploadCustomContract( } async function uploadContract(client: RestClient, pen: Pen): Promise { - return uploadCustomContract(client, pen, getRandomizedHackatom()); + return uploadCustomContract(client, pen, getHackatom()); } async function instantiateContract( @@ -738,7 +738,7 @@ describe("RestClient", () => { const numExisting = existingInfos.length; // upload data - const wasmCode = getRandomizedHackatom(); + const wasmCode = getHackatom(); const result = await uploadCustomContract(client, pen, wasmCode); expect(result.code).toBeFalsy(); const logs = parseLogs(result.logs); diff --git a/packages/sdk/src/signingcosmwasmclient.spec.ts b/packages/sdk/src/signingcosmwasmclient.spec.ts index 28730f8a..0eaa522c 100644 --- a/packages/sdk/src/signingcosmwasmclient.spec.ts +++ b/packages/sdk/src/signingcosmwasmclient.spec.ts @@ -6,7 +6,7 @@ import { PrivateCosmWasmClient } from "./cosmwasmclient"; import { Secp256k1Pen } from "./pen"; import { RestClient } from "./restclient"; import { SigningCosmWasmClient, UploadMeta } from "./signingcosmwasmclient"; -import { getRandomizedHackatom, makeRandomAddress, pendingWithoutWasmd } from "./testutils.spec"; +import { getHackatom, makeRandomAddress, pendingWithoutWasmd } from "./testutils.spec"; import { Coin } from "./types"; const { toHex } = Encoding; @@ -55,7 +55,7 @@ describe("SigningCosmWasmClient", () => { pendingWithoutWasmd(); const pen = await Secp256k1Pen.fromMnemonic(faucet.mnemonic); const client = new SigningCosmWasmClient(httpUrl, faucet.address, signBytes => pen.sign(signBytes)); - const wasm = getRandomizedHackatom(); + const wasm = getHackatom(); const { codeId, originalChecksum, @@ -74,7 +74,7 @@ describe("SigningCosmWasmClient", () => { pendingWithoutWasmd(); const pen = await Secp256k1Pen.fromMnemonic(faucet.mnemonic); const client = new SigningCosmWasmClient(httpUrl, faucet.address, signBytes => pen.sign(signBytes)); - const wasm = getRandomizedHackatom(); + const wasm = getHackatom(); const meta: UploadMeta = { source: "https://crates.io/api/v1/crates/cw-nameservice/0.1.0/download", @@ -93,7 +93,7 @@ describe("SigningCosmWasmClient", () => { pendingWithoutWasmd(); const pen = await Secp256k1Pen.fromMnemonic(faucet.mnemonic); const client = new SigningCosmWasmClient(httpUrl, faucet.address, signBytes => pen.sign(signBytes)); - const { codeId } = await client.upload(getRandomizedHackatom()); + const { codeId } = await client.upload(getHackatom()); const transferAmount: readonly Coin[] = [ { @@ -126,7 +126,7 @@ describe("SigningCosmWasmClient", () => { pendingWithoutWasmd(); const pen = await Secp256k1Pen.fromMnemonic(faucet.mnemonic); const client = new SigningCosmWasmClient(httpUrl, faucet.address, signBytes => pen.sign(signBytes)); - const { codeId } = await client.upload(getRandomizedHackatom()); + const { codeId } = await client.upload(getHackatom()); const contractAddress1 = await client.instantiate( codeId, @@ -153,7 +153,7 @@ describe("SigningCosmWasmClient", () => { pendingWithoutWasmd(); const pen = await Secp256k1Pen.fromMnemonic(faucet.mnemonic); const client = new SigningCosmWasmClient(httpUrl, faucet.address, signBytes => pen.sign(signBytes)); - const { codeId } = await client.upload(getRandomizedHackatom()); + const { codeId } = await client.upload(getHackatom()); // instantiate const transferAmount: readonly Coin[] = [ diff --git a/packages/sdk/src/testutils.spec.ts b/packages/sdk/src/testutils.spec.ts index be72bc0f..e3bd6188 100644 --- a/packages/sdk/src/testutils.spec.ts +++ b/packages/sdk/src/testutils.spec.ts @@ -25,31 +25,8 @@ export function leb128Encode(uint: number): Uint8Array { return new Uint8Array(out); } -export function getRandomizedHackatom(): Uint8Array { - const data = Encoding.fromBase64(hackatom.data); - - // The return value of the export function cosmwasm_api_0_6 is unused and - // can be randomized for testing. - // - // Find position of mutable bytes as follows: - // $ wasm-objdump -d contract.wasm | grep -F "cosmwasm_api_0_6" -A 1 - // 0136d2 func[198] : - // 0136d3: 41 83 0c | i32.const 1539 - // - // In the last line, the addresses [0136d3, 0136d3+1, 0136d3+2] hold a one byte instruction - // and a two byte value (leb128 encoded 1539). See also - // https://github.com/WebAssembly/design/blob/master/BinaryEncoding.md#constants-described-here. - - // Any unsigned integer from 128 to 16383 is encoded to two leb128 bytes - const min = 128; - const max = 16383; - const random = Math.floor(Math.random() * (max - min)) + min; - const bytes = leb128Encode(random); - - data[0x0136d3 + 1] = bytes[0]; - data[0x0136d3 + 2] = bytes[1]; - - return data; +export function getHackatom(): Uint8Array { + return Encoding.fromBase64(hackatom.data); } export function makeRandomAddress(): string { From f52838fd15e8db77801c3248ebae6ae3e1a3db57 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 12 Mar 2020 17:53:25 +0100 Subject: [PATCH 3/4] Remove unused leb128Encode --- packages/sdk/src/testutils.spec.ts | 39 ------------------------------ 1 file changed, 39 deletions(-) diff --git a/packages/sdk/src/testutils.spec.ts b/packages/sdk/src/testutils.spec.ts index e3bd6188..a204f5c5 100644 --- a/packages/sdk/src/testutils.spec.ts +++ b/packages/sdk/src/testutils.spec.ts @@ -3,28 +3,6 @@ import { Bech32, Encoding } from "@iov/encoding"; import hackatom from "./testdata/contract.json"; -const { fromHex } = Encoding; - -export function leb128Encode(uint: number): Uint8Array { - if (uint < 0) throw new Error("Only non-negative values supported"); - if (uint > 0x7fffffff) throw new Error("Only values in signed int32 range allowed"); - const out = new Array(); - let value = uint; - do { - // eslint-disable-next-line no-bitwise - let byte = value & 0b01111111; - // eslint-disable-next-line no-bitwise - value >>= 7; - - // more bytes to come: set high order bit of byte - // eslint-disable-next-line no-bitwise - if (value !== 0) byte ^= 0b10000000; - - out.push(byte); - } while (value !== 0); - return new Uint8Array(out); -} - export function getHackatom(): Uint8Array { return Encoding.fromBase64(hackatom.data); } @@ -86,20 +64,3 @@ export function fromOneElementArray(elements: ArrayLike): T { if (elements.length !== 1) throw new Error(`Expected exactly one element but got ${elements.length}`); return elements[0]; } - -describe("leb128", () => { - describe("leb128Encode", () => { - it("works for single byte values", () => { - // Values in 7 bit range are encoded as one byte - expect(leb128Encode(0)).toEqual(fromHex("00")); - expect(leb128Encode(20)).toEqual(fromHex("14")); - expect(leb128Encode(127)).toEqual(fromHex("7f")); - }); - - it("works for multi byte values", () => { - // from external souce (wasm-objdump) - expect(leb128Encode(145)).toEqual(fromHex("9101")); - expect(leb128Encode(1539)).toEqual(fromHex("830c")); - }); - }); -}); From c6d0a3aff4b38bffb6ea641bfa2fb59e33b826a9 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 12 Mar 2020 19:01:11 +0100 Subject: [PATCH 4/4] Set wasmd-demo to v0.7.1 --- scripts/wasmd/env | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/wasmd/env b/scripts/wasmd/env index 018575df..d491eaad 100644 --- a/scripts/wasmd/env +++ b/scripts/wasmd/env @@ -1,5 +1,5 @@ # Choose from https://hub.docker.com/r/cosmwasm/wasmd-demo/tags REPOSITORY="cosmwasm/wasmd-demo" -VERSION="v0.7.0" +VERSION="v0.7.1" CONTAINER_NAME="wasmd"