From cce7ee52e410a8431d0b2b53fe221a7c56495324 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Fri, 7 Feb 2020 16:15:05 +0100 Subject: [PATCH 01/10] Remove unnecessary parseSuccess --- packages/sdk/src/restclient.spec.ts | 21 ++++++++------------- 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/packages/sdk/src/restclient.spec.ts b/packages/sdk/src/restclient.spec.ts index e3f9541b..40413782 100644 --- a/packages/sdk/src/restclient.spec.ts +++ b/packages/sdk/src/restclient.spec.ts @@ -36,11 +36,6 @@ function pendingWithoutCosmos(): void { } } -function parseSuccess(rawLog?: string): readonly Log[] { - if (!rawLog) throw new Error("Log missing"); - return parseLogs(JSON.parse(rawLog)); -} - function makeSignedTx(firstMsg: Msg, fee: StdFee, memo: string, firstSignature: StdSignature): StdTx { return { msg: [firstMsg], @@ -291,7 +286,7 @@ describe("RestClient", () => { // console.log("Raw log:", result.raw_log); const result = await uploadContract(client, pen); expect(result.code).toBeFalsy(); - const logs = parseSuccess(result.raw_log); + const logs = parseLogs(result.logs); const codeIdAttr = findAttribute(logs, "message", "code_id"); codeId = Number.parseInt(codeIdAttr.value, 10); expect(codeId).toBeGreaterThanOrEqual(1); @@ -305,7 +300,7 @@ describe("RestClient", () => { const result = await instantiateContract(client, pen, codeId, beneficiaryAddress, transferAmount); expect(result.code).toBeFalsy(); // console.log("Raw log:", result.raw_log); - const logs = parseSuccess(result.raw_log); + const logs = parseLogs(result.logs); const contractAddressAttr = findAttribute(logs, "message", "contract_address"); contractAddress = contractAddressAttr.value; const amountAttr = findAttribute(logs, "transfer", "amount"); @@ -320,7 +315,7 @@ describe("RestClient", () => { const result = await executeContract(client, pen, contractAddress); expect(result.code).toBeFalsy(); // console.log("Raw log:", result.raw_log); - const [firstLog] = parseSuccess(result.raw_log); + const [firstLog] = parseLogs(result.logs); expect(firstLog.log).toEqual(`released funds to ${beneficiaryAddress}`); // Verify token transfer from contract to beneficiary @@ -346,7 +341,7 @@ describe("RestClient", () => { // upload data const result = await uploadContract(client, pen); expect(result.code).toBeFalsy(); - const logs = parseSuccess(result.raw_log); + const logs = parseLogs(result.logs); const codeIdAttr = findAttribute(logs, "message", "code_id"); const codeId = Number.parseInt(codeIdAttr.value, 10); @@ -381,9 +376,9 @@ describe("RestClient", () => { if (existingInfos.length > 0) { codeId = existingInfos[existingInfos.length - 1].id; } else { - const uploaded = await uploadContract(client, pen); - expect(uploaded.code).toBeFalsy(); - const uploadLogs = parseSuccess(uploaded.raw_log); + const uploadResult = await uploadContract(client, pen); + expect(uploadResult.code).toBeFalsy(); + const uploadLogs = parseLogs(uploadResult.logs); const codeIdAttr = findAttribute(uploadLogs, "message", "code_id"); codeId = Number.parseInt(codeIdAttr.value, 10); } @@ -393,7 +388,7 @@ describe("RestClient", () => { const result = await instantiateContract(client, pen, codeId, beneficiaryAddress, transferAmount); expect(result.code).toBeFalsy(); - const logs = parseSuccess(result.raw_log); + const logs = parseLogs(result.logs); const contractAddressAttr = findAttribute(logs, "message", "contract_address"); const myAddress = contractAddressAttr.value; From 8b382d76d54688ea860d86390dc37958da9ff566 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Fri, 7 Feb 2020 16:19:34 +0100 Subject: [PATCH 02/10] Add findAttribute to logs module --- packages/sdk/src/logs.ts | 23 +++++++++++++++++++++++ packages/sdk/src/restclient.spec.ts | 16 +--------------- packages/sdk/types/logs.d.ts | 11 +++++++++++ 3 files changed, 35 insertions(+), 15 deletions(-) diff --git a/packages/sdk/src/logs.ts b/packages/sdk/src/logs.ts index fd96e3df..79d7b915 100644 --- a/packages/sdk/src/logs.ts +++ b/packages/sdk/src/logs.ts @@ -59,3 +59,26 @@ export function parseLogs(input: unknown): readonly Log[] { if (!Array.isArray(input)) throw new Error("Logs must be an array"); return input.map(parseLog); } + +/** + * Searches in logs for the first event of the given event type and in that event + * for the first first attribute with the given attribute key. + * + * Throws if the attribute was not found. + */ +export function findAttribute( + logs: readonly Log[], + eventType: "message" | "transfer", + attrKey: string, +): Attribute { + const firstLogs = logs.find(() => true); + const out = firstLogs?.events + .find(event => event.type === eventType) + ?.attributes.find(attr => attr.key === attrKey); + if (!out) { + throw new Error( + `Could not find attribute '${attrKey}' in first event of type '${eventType}' in first log.`, + ); + } + return out; +} diff --git a/packages/sdk/src/restclient.spec.ts b/packages/sdk/src/restclient.spec.ts index 40413782..02c6b926 100644 --- a/packages/sdk/src/restclient.spec.ts +++ b/packages/sdk/src/restclient.spec.ts @@ -4,7 +4,7 @@ import { Bech32, Encoding } from "@iov/encoding"; import { encodeSecp256k1Signature, makeSignBytes, marshalTx } from "./encoding"; import { leb128Encode } from "./leb128.spec"; -import { Attribute, Log, parseLogs } from "./logs"; +import { findAttribute, parseLogs } from "./logs"; import { Pen, Secp256k1Pen } from "./pen"; import { PostTxsResponse, RestClient } from "./restclient"; import contract from "./testdata/contract.json"; @@ -75,20 +75,6 @@ function makeRandomAddress(): string { return Bech32.encode("cosmos", Random.getBytes(20)); } -/** Throws if the attribute was not found */ -function findAttribute(logs: readonly Log[], eventType: "message" | "transfer", attrKey: string): Attribute { - const firstLogs = logs.find(() => true); - const out = firstLogs?.events - .find(event => event.type === eventType) - ?.attributes.find(attr => attr.key === attrKey); - if (!out) { - throw new Error( - `Could not find attribute '${attrKey}' in first event of type '${eventType}' in first log.`, - ); - } - return out; -} - async function uploadContract(client: RestClient, pen: Pen): Promise { const memo = "My first contract on chain"; const theMsg: MsgStoreCode = { diff --git a/packages/sdk/types/logs.d.ts b/packages/sdk/types/logs.d.ts index 871c848c..9a9e92c7 100644 --- a/packages/sdk/types/logs.d.ts +++ b/packages/sdk/types/logs.d.ts @@ -15,3 +15,14 @@ export declare function parseAttribute(input: unknown): Attribute; export declare function parseEvent(input: unknown): Event; export declare function parseLog(input: unknown): Log; export declare function parseLogs(input: unknown): readonly Log[]; +/** + * Searches in logs for the first event of the given event type and in that event + * for the first first attribute with the given attribute key. + * + * Throws if the attribute was not found. + */ +export declare function findAttribute( + logs: readonly Log[], + eventType: "message" | "transfer", + attrKey: string, +): Attribute; From c354af68d91317c3bf617e6f24c84da64ca53c89 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Fri, 7 Feb 2020 16:30:09 +0100 Subject: [PATCH 03/10] Export logs module from SDK --- packages/sdk/src/index.ts | 3 ++- packages/sdk/types/index.d.ts | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/sdk/src/index.ts b/packages/sdk/src/index.ts index 8ac4d6f7..271e6a18 100644 --- a/packages/sdk/src/index.ts +++ b/packages/sdk/src/index.ts @@ -1,8 +1,9 @@ +import * as logs from "./logs"; import * as types from "./types"; +export { logs, types }; export { CosmosBech32Prefix, decodeBech32Pubkey, encodeAddress, isValidAddress } from "./address"; export { unmarshalTx } from "./decoding"; export { encodeSecp256k1Signature, makeSignBytes, marshalTx } from "./encoding"; export { RestClient, TxsResponse } from "./restclient"; export { makeCosmoshubPath, Pen, PrehashType, Secp256k1Pen } from "./pen"; -export { types }; diff --git a/packages/sdk/types/index.d.ts b/packages/sdk/types/index.d.ts index a341b70c..084a2cfb 100644 --- a/packages/sdk/types/index.d.ts +++ b/packages/sdk/types/index.d.ts @@ -1,7 +1,8 @@ +import * as logs from "./logs"; import * as types from "./types"; +export { logs, types }; export { CosmosBech32Prefix, decodeBech32Pubkey, encodeAddress, isValidAddress } from "./address"; export { unmarshalTx } from "./decoding"; export { encodeSecp256k1Signature, makeSignBytes, marshalTx } from "./encoding"; export { RestClient, TxsResponse } from "./restclient"; export { makeCosmoshubPath, Pen, PrehashType, Secp256k1Pen } from "./pen"; -export { types }; From 2ecf319ab1491000f2345dd38f845dd0b0f88a0e Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Fri, 7 Feb 2020 16:39:56 +0100 Subject: [PATCH 04/10] Allow unset transferAmount in test code --- packages/sdk/src/restclient.spec.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/sdk/src/restclient.spec.ts b/packages/sdk/src/restclient.spec.ts index 02c6b926..889b5424 100644 --- a/packages/sdk/src/restclient.spec.ts +++ b/packages/sdk/src/restclient.spec.ts @@ -108,7 +108,7 @@ async function instantiateContract( pen: Pen, codeId: number, beneficiaryAddress: string, - transferAmount: readonly Coin[], + transferAmount?: readonly Coin[], ): Promise { const memo = "Create an escrow instance"; const theMsg: MsgInstantiateContract = { @@ -120,7 +120,7 @@ async function instantiateContract( verifier: faucetAddress, beneficiary: beneficiaryAddress, }, - init_funds: transferAmount, + init_funds: transferAmount || [], }, }; const fee: StdFee = { From e7c121cefd7fdd7619add7f6edf7c575129b73dd Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Fri, 7 Feb 2020 16:40:15 +0100 Subject: [PATCH 05/10] Add contract deployment script --- .eslintrc.js | 1 + scripts/cosm/contracts/checksums.sha256 | 1 + scripts/cosm/contracts/cw-erc20.wasm | Bin 0 -> 84463 bytes scripts/cosm/deploy_erc20.js | 120 ++++++++++++++++++++++++ 4 files changed, 122 insertions(+) create mode 100644 scripts/cosm/contracts/checksums.sha256 create mode 100644 scripts/cosm/contracts/cw-erc20.wasm create mode 100644 scripts/cosm/deploy_erc20.js diff --git a/.eslintrc.js b/.eslintrc.js index a1dee715..52a62083 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -41,6 +41,7 @@ module.exports = { files: "**/*.js", rules: { "@typescript-eslint/no-var-requires": "off", + "@typescript-eslint/explicit-function-return-type": "off", }, }, { diff --git a/scripts/cosm/contracts/checksums.sha256 b/scripts/cosm/contracts/checksums.sha256 new file mode 100644 index 00000000..b36dcaa7 --- /dev/null +++ b/scripts/cosm/contracts/checksums.sha256 @@ -0,0 +1 @@ +b26861a6aa9858585ed905a590272735bd4fe8177c708940236224e8c9ff73ca cw-erc20.wasm diff --git a/scripts/cosm/contracts/cw-erc20.wasm b/scripts/cosm/contracts/cw-erc20.wasm new file mode 100644 index 0000000000000000000000000000000000000000..045129323f1dde88dd905aa97f7de6332c4b91e9 GIT binary patch literal 84463 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

pWw^!Oj1Q9#I!T)wq_i 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 { + console.info("All done, let the coins flow."); + process.exit(0); + }, + error => { + console.error(error); + process.exit(1); + }, +); From 7ffd9b578ad284bd8649e9237994adffc609f476 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Fri, 7 Feb 2020 16:48:46 +0100 Subject: [PATCH 06/10] Upload ERC20 in CI --- .circleci/config.yml | 3 +++ scripts/cosm/deploy_erc20.js | 2 ++ 2 files changed, 5 insertions(+) mode change 100644 => 100755 scripts/cosm/deploy_erc20.js diff --git a/.circleci/config.yml b/.circleci/config.yml index b12f1baa..5d85d39f 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -83,6 +83,9 @@ jobs: - run: name: Wait for blockchain and REST server to be ready (started in background) command: timeout 60 bash -c "until curl -s http://localhost:1317/node_info > /dev/null; do sleep 1; done" + - run: + name: Deploy ERC20 contract + command: ./scripts/cosm/deploy_erc20.js - run: environment: COSMOS_ENABLED: 1 diff --git a/scripts/cosm/deploy_erc20.js b/scripts/cosm/deploy_erc20.js old mode 100644 new mode 100755 index 06fe60b9..79e9482c --- a/scripts/cosm/deploy_erc20.js +++ b/scripts/cosm/deploy_erc20.js @@ -1,3 +1,5 @@ +#!/usr/bin/env node + /* eslint-disable @typescript-eslint/camelcase */ const { Encoding } = require("@iov/encoding"); const { From 80b49841a65282425e50b529f08acc8ff0b2ab32 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Fri, 7 Feb 2020 17:10:41 +0100 Subject: [PATCH 07/10] Let getContractAddress return most recent contract --- packages/sdk/src/restclient.spec.ts | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/packages/sdk/src/restclient.spec.ts b/packages/sdk/src/restclient.spec.ts index 889b5424..a093c0f1 100644 --- a/packages/sdk/src/restclient.spec.ts +++ b/packages/sdk/src/restclient.spec.ts @@ -405,13 +405,17 @@ describe("RestClient", () => { const noContract = makeRandomAddress(); const expectedKey = toAscii("config"); - // find an existing contract (created above) - // we assume all contracts on this chain are the same (created by these tests) - const getContractAddress = async (): Promise => { - const contractInfos = await client.listContractAddresses(); - expect(contractInfos.length).toBeGreaterThan(0); - return contractInfos[0]; - }; + /** + * Finds the most recent contract (created above) + * + * We assume the tests above ran, all instantiate the same contract and no other process squeezed in a different contract. + */ + async function getContractAddress(): Promise { + const contracts = Array.from(await client.listContractAddresses()); + const last = contracts.reverse().find(() => true); + if (!last) throw new Error("No contract found"); + return last; + } it("can get all state", async () => { pendingWithoutCosmos(); From 5bcdf286f6e8c331dd7b108e0442317693ac4149 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Fri, 7 Feb 2020 17:32:14 +0100 Subject: [PATCH 08/10] Fix optional types in MsgStoreCode If they are unset, signatures are invalid. --- packages/sdk/src/types.ts | 8 ++++---- packages/sdk/types/types.d.ts | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/sdk/src/types.ts b/packages/sdk/src/types.ts index 56da7b1a..5dfd60aa 100644 --- a/packages/sdk/src/types.ts +++ b/packages/sdk/src/types.ts @@ -51,10 +51,10 @@ export interface MsgStoreCode extends MsgTemplate { readonly sender: string; /** Base64 encoded Wasm */ readonly wasm_byte_code: string; - /** A valid URI reference to the contract's source code, optional */ - readonly source?: string; - /** A docker tag, optional */ - readonly builder?: string; + /** A valid URI reference to the contract's source code. Can be empty. */ + readonly source: string; + /** A docker tag. Can be empty. */ + readonly builder: string; }; } diff --git a/packages/sdk/types/types.d.ts b/packages/sdk/types/types.d.ts index 2d26a1b3..c2d760a3 100644 --- a/packages/sdk/types/types.d.ts +++ b/packages/sdk/types/types.d.ts @@ -39,10 +39,10 @@ export interface MsgStoreCode extends MsgTemplate { readonly sender: string; /** Base64 encoded Wasm */ readonly wasm_byte_code: string; - /** A valid URI reference to the contract's source code, optional */ - readonly source?: string; - /** A docker tag, optional */ - readonly builder?: string; + /** A valid URI reference to the contract's source code. Can be empty. */ + readonly source: string; + /** A docker tag. Can be empty. */ + readonly builder: string; }; } /** From a0a4fbc555100cf64bffef07aaf8bfaa8ffaa55b Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Fri, 7 Feb 2020 17:32:43 +0100 Subject: [PATCH 09/10] Remove hardcoded source/builder values --- scripts/cosm/deploy_erc20.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/cosm/deploy_erc20.js b/scripts/cosm/deploy_erc20.js index 79e9482c..04ad5f20 100755 --- a/scripts/cosm/deploy_erc20.js +++ b/scripts/cosm/deploy_erc20.js @@ -34,8 +34,8 @@ async function uploadContract(client, pen, wasm) { value: { sender: faucetAddress, wasm_byte_code: Encoding.toBase64(wasm), - source: "https://github.com/confio/cosmwasm/raw/0.7/lib/vm/testdata/contract_0.6.wasm", - builder: "cosmwasm-opt:0.6.2", + source: "", + builder: "", }, }; From 007b2304ac61483f4decd82ed1bc81f852be5255 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Fri, 7 Feb 2020 17:33:54 +0100 Subject: [PATCH 10/10] Fix memo --- scripts/cosm/deploy_erc20.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/cosm/deploy_erc20.js b/scripts/cosm/deploy_erc20.js index 04ad5f20..9a6791d6 100755 --- a/scripts/cosm/deploy_erc20.js +++ b/scripts/cosm/deploy_erc20.js @@ -28,7 +28,7 @@ const faucetMnemonic = const faucetAddress = "cosmos1pkptre7fdkl6gfrzlesjjvhxhlc3r4gmmk8rs6"; async function uploadContract(client, pen, wasm) { - const memo = "My first contract on chain"; + const memo = "Upload ERC20 contract"; const storeCodeMsg = { type: "wasm/store-code", value: {