This 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.
- configure multiple host chain environments with chain-specific settings / state
- multiple simultaneous contract instances can exist per chain
- chain modules can be simulated through custom user code
- extensible for further instrumentation via custom middlewares
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
- Create a
CWSimulateApp
object - this is a simulation environment describing a single chain. - As needed, per chain:
- Upload the WASM bytecode using
App.wasm.create
. This will register a newcodeId
to reference the uploaded contract code. - Create a new contract instance using
App.wasm.instantiateContract
, passing in thecodeId
generated in the previous step. - From the response, retrieve the
contractAddress
to refer to the contract instance.
- Upload the WASM bytecode using
- You can now run
execute
andquery
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:
- Add the
buffer
package (npm add buffer
) - Add the following to your
index.html
(inside thebody
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.