cw-simulateThis package combines cosmwasm-vm-js with additional abstractions and state management to more accurately simulate the effects of CosmWasm contracts on the blockchain environments on which they are hosted.
Import the cw-simulate library from NPM in your package.json.
$ npm install -S @terran-one/cw-simulate
If you're using Yarn:
$ yarn add @terran-one/cw-simulate
CWSimulateApp object - this is a simulation environment describing a single chain.App.wasm.create. This will register a new codeId to reference the uploaded contract code.App.wasm.instantiateContract, passing in the codeId generated in the previous step.contractAddress to refer to the contract instance.execute and query messages against the instance, and they should work as expected.The following example creates a chain, instantiates a contract on it, and performs an execute and query.
import { CWSimulateApp } from '@terran-one/cw-simulate';
import { readFileSync } from 'fs';
const sender = 'terra1hgm0p7khfk85zpz5v0j8wnej3a90w709vhkdfu';
const funds = [];
const wasmBytecode = readFileSync('cw-template.wasm');
const app = new CWSimulateApp({
chainId: 'phoenix-1',
bech32Prefix: 'terra'
});
// import the wasm bytecode
const codeId = app.wasm.create(sender, wasmBytecode);
// instantiate the contract
let result = await app.wasm.instantiateContract(sender, funds, codeId, { count: 0 });
console.log('instantiateContract:', result.constructor.name, JSON.stringify(result, null, 2));
// pull out the contract address
const contractAddress = result.val.events[0].attributes[0].value;
// execute the contract
result = await app.wasm.executeContract(sender, funds, contractAddress, { increment: {} });
console.log('executeContract:', result.constructor.name, JSON.stringify(result, null, 2));
// query the contract
result = await app.wasm.query(contractAddress, { get_count: {} });
console.log('query:', result.constructor.name, JSON.stringify(result, null, 2));
Vite doesn't include shims for Node variables like Webpack 4 does, and cw-simulate currently relies on these. The following workaround exists:
buffer package (npm add buffer)index.html (inside the body tag, before your other js imports):<script>
window.global = window;
</script>
<script type="module">
import {Buffer} from "buffer";
window.Buffer = Buffer;
</script>
See this github issue for more details.