diff --git a/.circleci/config.yml b/.circleci/config.yml index b1d12e77..2db2007b 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -136,6 +136,7 @@ jobs: - run: environment: WASMD_ENABLED: 1 + ERC20_ENABLED: 1 SIMAPP_ENABLED: 1 TENDERMINT_ENABLED: 1 SOCKETSERVER_ENABLED: 1 @@ -244,6 +245,7 @@ jobs: - run: environment: WASMD_ENABLED: 1 + ERC20_ENABLED: 1 SIMAPP_ENABLED: 1 TENDERMINT_ENABLED: 1 SOCKETSERVER_ENABLED: 1 @@ -333,6 +335,7 @@ jobs: - run: environment: WASMD_ENABLED: 1 + ERC20_ENABLED: 1 SIMAPP_ENABLED: 1 TENDERMINT_ENABLED: 1 SOCKETSERVER_ENABLED: 1 diff --git a/HACKING.md b/HACKING.md index 3dcba19a..58995b74 100644 --- a/HACKING.md +++ b/HACKING.md @@ -41,7 +41,7 @@ yarn test To run the entire test suite, you need to run some local blockchain to test against. We use [wasmd](https://github.com/CosmWasm/wasmd) for both CosmWasm -tests and as a generic Cosmos SDK 0.38 blockchain. We also spawn multiple +tests and as a generic Cosmos SDK 0.39 blockchain. We also spawn multiple versions of raw Tendermint and a basic WebSocket server. ```sh @@ -49,6 +49,7 @@ versions of raw Tendermint and a basic WebSocket server. ./scripts/wasmd/start.sh ./scripts/wasmd/init.sh export WASMD_ENABLED=1 +export ERC20_ENABLED=1 # Start Tendermint ./scripts/tendermint/all_start.sh @@ -64,6 +65,7 @@ yarn test # And at the end of the day unset SOCKETSERVER_ENABLED unset TENDERMINT_ENABLED +unset ERC20_ENABLED unset WASMD_ENABLED ./scripts/socketserver/stop.sh ./scripts/tendermint/all_stop.sh diff --git a/packages/cosmwasm/src/cosmwasmclient.searchtx.spec.ts b/packages/cosmwasm/src/cosmwasmclient.searchtx.spec.ts index aa15c45b..987993a4 100644 --- a/packages/cosmwasm/src/cosmwasmclient.searchtx.spec.ts +++ b/packages/cosmwasm/src/cosmwasmclient.searchtx.spec.ts @@ -19,8 +19,10 @@ import { SigningCosmWasmClient } from "./signingcosmwasmclient"; import { alice, deployedErc20, + erc20Enabled, fromOneElementArray, makeRandomAddress, + pendingWithoutErc20, pendingWithoutWasmd, wasmd, wasmdEnabled, @@ -49,7 +51,7 @@ describe("CosmWasmClient.searchTx", () => { let execute: TestTxExecute | undefined; beforeAll(async () => { - if (wasmdEnabled()) { + if (wasmdEnabled() && erc20Enabled()) { const wallet = await Secp256k1HdWallet.fromMnemonic(alice.mnemonic); const client = new SigningCosmWasmClient(wasmd.endpoint, alice.address0, wallet); @@ -148,6 +150,7 @@ describe("CosmWasmClient.searchTx", () => { describe("with SearchByIdQuery", () => { it("can search successful tx by ID", async () => { pendingWithoutWasmd(); + pendingWithoutErc20(); assert(sendSuccessful, "value must be set in beforeAll()"); const client = new CosmWasmClient(wasmd.endpoint); const result = await client.searchTx({ id: sendSuccessful.hash }); @@ -164,6 +167,7 @@ describe("CosmWasmClient.searchTx", () => { it("can search unsuccessful tx by ID", async () => { pendingWithoutWasmd(); + pendingWithoutErc20(); assert(sendUnsuccessful, "value must be set in beforeAll()"); const client = new CosmWasmClient(wasmd.endpoint); const result = await client.searchTx({ id: sendUnsuccessful.hash }); @@ -180,6 +184,7 @@ describe("CosmWasmClient.searchTx", () => { it("can search by ID (non existent)", async () => { pendingWithoutWasmd(); + pendingWithoutErc20(); const client = new CosmWasmClient(wasmd.endpoint); const nonExistentId = "0000000000000000000000000000000000000000000000000000000000000000"; const result = await client.searchTx({ id: nonExistentId }); @@ -188,6 +193,7 @@ describe("CosmWasmClient.searchTx", () => { it("can search by ID and filter by minHeight", async () => { pendingWithoutWasmd(); + pendingWithoutErc20(); assert(sendSuccessful); const client = new CosmWasmClient(wasmd.endpoint); const query = { id: sendSuccessful.hash }; @@ -217,6 +223,7 @@ describe("CosmWasmClient.searchTx", () => { describe("with SearchByHeightQuery", () => { it("can search successful tx by height", async () => { pendingWithoutWasmd(); + pendingWithoutErc20(); assert(sendSuccessful, "value must be set in beforeAll()"); const client = new CosmWasmClient(wasmd.endpoint); const result = await client.searchTx({ height: sendSuccessful.height }); @@ -233,6 +240,7 @@ describe("CosmWasmClient.searchTx", () => { it("can search unsuccessful tx by height", async () => { pendingWithoutWasmd(); + pendingWithoutErc20(); assert(sendUnsuccessful, "value must be set in beforeAll()"); const client = new CosmWasmClient(wasmd.endpoint); const result = await client.searchTx({ height: sendUnsuccessful.height }); @@ -251,6 +259,7 @@ describe("CosmWasmClient.searchTx", () => { describe("with SearchBySentFromOrToQuery", () => { it("can search by sender", async () => { pendingWithoutWasmd(); + pendingWithoutErc20(); assert(sendSuccessful, "value must be set in beforeAll()"); const client = new CosmWasmClient(wasmd.endpoint); const results = await client.searchTx({ sentFromOrTo: sendSuccessful.sender }); @@ -279,6 +288,7 @@ describe("CosmWasmClient.searchTx", () => { it("can search by recipient", async () => { pendingWithoutWasmd(); + pendingWithoutErc20(); assert(sendSuccessful, "value must be set in beforeAll()"); const client = new CosmWasmClient(wasmd.endpoint); const results = await client.searchTx({ sentFromOrTo: sendSuccessful.recipient }); @@ -306,6 +316,7 @@ describe("CosmWasmClient.searchTx", () => { it("can search by sender or recipient (sorted and deduplicated)", async () => { pendingWithoutWasmd(); + pendingWithoutErc20(); assert(sendSelfSuccessful, "value must be set in beforeAll()"); const txhash = sendSelfSuccessful.hash; const client = new CosmWasmClient(wasmd.endpoint); @@ -317,6 +328,7 @@ describe("CosmWasmClient.searchTx", () => { it("can search by recipient and filter by minHeight", async () => { pendingWithoutWasmd(); + pendingWithoutErc20(); assert(sendSuccessful); const client = new CosmWasmClient(wasmd.endpoint); const query = { sentFromOrTo: sendSuccessful.recipient }; @@ -344,6 +356,7 @@ describe("CosmWasmClient.searchTx", () => { it("can search by recipient and filter by maxHeight", async () => { pendingWithoutWasmd(); + pendingWithoutErc20(); assert(sendSuccessful); const client = new CosmWasmClient(wasmd.endpoint); const query = { sentFromOrTo: sendSuccessful.recipient }; @@ -373,6 +386,7 @@ describe("CosmWasmClient.searchTx", () => { describe("with SearchByTagsQuery", () => { it("can search by transfer.recipient", async () => { pendingWithoutWasmd(); + pendingWithoutErc20(); assert(sendSuccessful, "value must be set in beforeAll()"); const client = new CosmWasmClient(wasmd.endpoint); const results = await client.searchTx({ @@ -399,6 +413,7 @@ describe("CosmWasmClient.searchTx", () => { it("can search by message.contract_address", async () => { pendingWithoutWasmd(); + pendingWithoutErc20(); assert(execute, "value must be set in beforeAll()"); const client = new CosmWasmClient(wasmd.endpoint); const results = await client.searchTx({ @@ -441,6 +456,7 @@ describe("CosmWasmClient.searchTx", () => { it("can search by message.contract_address + message.action", async () => { pendingWithoutWasmd(); + pendingWithoutErc20(); assert(execute, "value must be set in beforeAll()"); const client = new CosmWasmClient(wasmd.endpoint); const results = await client.searchTx({ diff --git a/packages/cosmwasm/src/cosmwasmclient.spec.ts b/packages/cosmwasm/src/cosmwasmclient.spec.ts index e5e079a0..146eea78 100644 --- a/packages/cosmwasm/src/cosmwasmclient.spec.ts +++ b/packages/cosmwasm/src/cosmwasmclient.spec.ts @@ -22,6 +22,7 @@ import { deployedErc20, getHackatom, makeRandomAddress, + pendingWithoutErc20, pendingWithoutWasmd, tendermintIdMatcher, unused, @@ -254,6 +255,7 @@ describe("CosmWasmClient", () => { describe("getCodes", () => { it("works", async () => { pendingWithoutWasmd(); + pendingWithoutErc20(); // TODO: Adapt test to use hackatom instead const client = new CosmWasmClient(wasmd.endpoint); const result = await client.getCodes(); expect(result.length).toBeGreaterThanOrEqual(1); @@ -271,6 +273,7 @@ describe("CosmWasmClient", () => { describe("getCodeDetails", () => { it("works", async () => { pendingWithoutWasmd(); + pendingWithoutErc20(); // TODO: Adapt test to use hackatom instead const client = new CosmWasmClient(wasmd.endpoint); const result = await client.getCodeDetails(1); @@ -290,6 +293,7 @@ describe("CosmWasmClient", () => { it("caches downloads", async () => { pendingWithoutWasmd(); + pendingWithoutErc20(); // TODO: Adapt test to use hackatom instead const client = new CosmWasmClient(wasmd.endpoint); const openedClient = (client as unknown) as PrivateCosmWasmClient; const getCodeSpy = spyOn(openedClient.lcdClient.wasm, "getCode").and.callThrough(); @@ -305,6 +309,7 @@ describe("CosmWasmClient", () => { describe("getContracts", () => { it("works", async () => { pendingWithoutWasmd(); + pendingWithoutErc20(); // TODO: Adapt test to use hackatom instead const client = new CosmWasmClient(wasmd.endpoint); const result = await client.getContracts(1); expect(result.length).toBeGreaterThanOrEqual(3); @@ -336,6 +341,7 @@ describe("CosmWasmClient", () => { describe("getContract", () => { it("works for instance without admin", async () => { pendingWithoutWasmd(); + pendingWithoutErc20(); // TODO: Adapt test to use hackatom instead const client = new CosmWasmClient(wasmd.endpoint); const hash = await client.getContract("cosmos18vd8fpwxzck93qlwghaj6arh4p7c5n89uzcee5"); expect(hash).toEqual({ @@ -349,6 +355,7 @@ describe("CosmWasmClient", () => { it("works for instance with admin", async () => { pendingWithoutWasmd(); + pendingWithoutErc20(); // TODO: Adapt test to use hackatom instead const client = new CosmWasmClient(wasmd.endpoint); const jade = await client.getContract("cosmos18r5szma8hm93pvx6lwpjwyxruw27e0k5uw835c"); expect(jade).toEqual( diff --git a/packages/cosmwasm/src/lcdapi/wasm.spec.ts b/packages/cosmwasm/src/lcdapi/wasm.spec.ts index 3ce269cf..2d02ef25 100644 --- a/packages/cosmwasm/src/lcdapi/wasm.spec.ts +++ b/packages/cosmwasm/src/lcdapi/wasm.spec.ts @@ -37,6 +37,7 @@ import { fromOneElementArray, getHackatom, makeRandomAddress, + pendingWithoutErc20, pendingWithoutWasmd, wasmd, wasmdEnabled, @@ -368,6 +369,7 @@ describe("WasmExtension", () => { describe("txsQuery", () => { it("can query by tags (module + code_id)", async () => { pendingWithoutWasmd(); + pendingWithoutErc20(); const client = makeWasmClient(wasmd.endpoint); const result = await client.txsQuery(`message.module=wasm&message.code_id=${deployedErc20.codeId}`); expect(parseInt(result.count, 10)).toBeGreaterThanOrEqual(4); @@ -414,6 +416,7 @@ describe("WasmExtension", () => { // Like previous test but filtered by message.action=store-code and message.action=instantiate it("can query by tags (module + code_id + action)", async () => { pendingWithoutWasmd(); + pendingWithoutErc20(); const client = makeWasmClient(wasmd.endpoint); { diff --git a/packages/cosmwasm/src/testutils.spec.ts b/packages/cosmwasm/src/testutils.spec.ts index fd780bf6..2895aa80 100644 --- a/packages/cosmwasm/src/testutils.spec.ts +++ b/packages/cosmwasm/src/testutils.spec.ts @@ -83,6 +83,16 @@ export function pendingWithoutWasmd(): void { } } +export function erc20Enabled(): boolean { + return !!process.env.ERC20_ENABLED; +} + +export function pendingWithoutErc20(): void { + if (!erc20Enabled()) { + return pending("Set ERC20_ENABLED to enable Wasmd based tests"); + } +} + /** Returns first element. Throws if array has a different length than 1. */ export function fromOneElementArray(elements: ArrayLike): T { if (elements.length !== 1) throw new Error(`Expected exactly one element but got ${elements.length}`); diff --git a/packages/cosmwasm/webpack.web.config.js b/packages/cosmwasm/webpack.web.config.js index 7373cace..ced780a8 100644 --- a/packages/cosmwasm/webpack.web.config.js +++ b/packages/cosmwasm/webpack.web.config.js @@ -14,6 +14,6 @@ module.exports = [ path: distdir, filename: "tests.js", }, - plugins: [new webpack.EnvironmentPlugin(["WASMD_ENABLED"])], + plugins: [new webpack.EnvironmentPlugin(["WASMD_ENABLED", "ERC20_ENABLED"])], }, ];