The CosmWasm module serves primarily as a user-friendly and convenient wrapper for a set of predefined messages, allowing developers to interact with smart contracts more efficiently. It exposes a few methods to upload, deploy, and execute smart contracts, as well as the query methods subgroup implementing the various low-level queries that CosmWasm supports.

Example

import { Cosmos, LocalSigner, mw } from '@apophis-sdk/cosmos';
import { DefaultCosmWasmMiddlewares, CosmWasm } from '@apophis-sdk/cosmwasm';

mw.use(...DefaultCosmWasmMiddlewares);

const network = await Cosmos.getNetworkFromRegistry('neutrontestnet');
const signer = LocalSigner.fromMnemonic('...');

await Cosmos.ws(network).ready();

const response = await CosmWasm.query.smart({
  network,
  'neutron1...', // contract address
  {
    config: {},
  },
});
console.log(response);

await CosmWasm.execute(
  network,
  signer,
  'neutron1...', // contract address
  {
    increment: {},
  },
  [Cosmos.coin(1_000000n, 'untrn')], // optional native coin "funds" to pass along the call
);
NOTE: Previously, I was under the impression that smart contract messages were JSON-encoded only by convention. This is false. Thus, previously, any smart contract message had to be passed in using CosmWasm.toBinary. This, however, broke Amino support. I thus had to remove it from messages & queries. The CosmWasm.toBinary helper is still useful to encode sub-messages, e.g. for the send message of CW20 tokens.

Outlook

There is still work to be done on the CosmWasm integration. Namely, further abstraction of smart contracts and code generation for your smart contract messages, and AuthZ messages.