Skip to main content

Javascript & Smart Contracts

This guide describes interacting with Osmosis Smart contracts via JavaScript runtimes such as Node.js and the browser.

Prerequisites

  • npm and node.js
  • localosmosis - (Not needed when connecting to mainnet)
  • Keplr browser not used on the guide yet

Start a new project

npm init -y

Install cosmwasm

npm i cosmwasm

Open the package.json file in a code editor and add

"type": "module",.

{
// ...
"type": "module",
// ...
}

Create a new index.ts file

touch index.ts

The class CosmWasmClient is exported from the CosmJS package @cosmjs/cosmwasm-stargate. Learn more in the offical docs.

import { CosmWasmClient } from "cosmwasm";

// This is your rpc endpoint
const rpcEndpoint = "http://localhost:26657/";

async function main() {
const client = await CosmWasmClient.connect(rpcEndpoint);
console.log(client);
}

main();

:: tip You can also connect to the mainnet by replacing rpcEndpoint to https://rpc.osmosis.zone/ ::

Run it

npm index.js

You should see something like:

Other methods

As documented on the official docs.

async function moreExamples() {
const client = await CosmWasmClient.connect(rpcEndpoint);
const chainId = await client.getChainId()
const getHeight = await client.getHeight()
const getAccount = await client.getAccount("osmo1phaxpevm5wecex2jyaqty2a4v02qj7qmlmzk5a")
const getSequence = await client.getSequence("osmo1phaxpevm5wecex2jyaqty2a4v02qj7qmlmzk5a")
const getBlock = await client.getBlock(1)
const getBalance = await client.getBalance("osmo1phaxpevm5wecex2jyaqty2a4v02qj7qmlmzk5a","uosmo")

console.log(chainId);
console.log(client);
console.log(getHeight);
console.log(getAccount);
console.log(getSequence);
console.log(getBlock);
console.log(getBalance);
}

moreExamples();

Transactions

MethodDescriptionParams
.getTx()id: string
.searchTx()query: SearchTxQuery, filter: SearchTxFilter = {}
.txsQuery()query: string

Codes

MethodDescriptionParams
.getCodes()none
.getCodeDetails()codeId: number

Smart Contracts

MethodDescriptionParams
.getContracts()cideId: number
.getContract()address: string
.queryContractRaw()address: string, key: Uint8Array
.queryContractSmart()address: string, queryMsg: Record<string, unknown>

Querying Smart Contracts

danger

Before we query smart contracts in localOsmosis we must deploy one by following this guide.

Once you have deployed the smart contract you can get the <CONTRACT-ID> by running:

osmosisd query wasm list-code

In this particular example there are 7 contracts available. The latest one is 7.

You can now get the contract address by running

osmosisd query wasm list-contract-by-code <CONTRACT-ID>

That's the contract address osmo1zlmaky7753d2fneyhduwz0rn3u9ns8rse3tudhze8rc2g54w9ysq725p3a for code contract id 7.

Get contract

import { CosmWasmClient } from "cosmwasm";

// This is your rpc endpoint
const rpcEndpoint = "http://localhost:26657/";

async function queryContract() {
const client = await CosmWasmClient.connect(rpcEndpoint);

const getContract = await client.getContract("osmo1zlmaky7753d2fneyhduwz0rn3u9ns8rse3tudhze8rc2g54w9ysq725p3a")
console.log(getContract);
}

queryContract();

Run the code

node index.js

The output should look like this:

Get the count from the contract

The contract we are interacting with has a few simple functions. 'get_count', 'increment' and 'reset'. These two functions can be called via by using the queryContractSmart method.

tip

Please note there is a complete guide on how to upload the example contract on localOsmosis here.

async function getCount() {
const client = await CosmWasmClient.connect(rpcEndpoint);

const getCount = await client.queryContractSmart("osmo1zlmaky7753d2fneyhduwz0rn3u9ns8rse3tudhze8rc2g54w9ysq725p3a",{ "get_count": {}})
console.log(getCount);
}
getCount();