General purpose library for cosmos-sdk

Usage no npm install needed!

<script type="module">
  import chainapsisCosmosjs from 'https://cdn.skypack.dev/@chainapsis/cosmosjs';


Welcome to cosmosjs 👋

Twitter: Node_Ateam

General purpose library for cosmos-sdk

Our goal is to create a general purpose library for the Cosmos ecosystem. Through this library, blockchains that use cosmos-sdk, as well as Cosmos hub (Gaia), can create their own API for JavaScript client side.

Documentation can be found here.


npm install --save @chainapsis/cosmosjs

How to use

More examples will be provided here soon.

import { GaiaApi } from "../src/gaia/api";
import { LedgerWalletProvider } from "../src/core/ledgerWallet";
import { MsgSend } from "../src/x/bank";
import { AccAddress } from "../src/common/address";
import { Coin } from "../src/common/coin";
import { Int } from "../src/common/int";
import bigInteger from "big-integer";

(async () => {
  // Here you can see the type of transport
  // https://github.com/LedgerHQ/ledgerjs
  const wallet = new LedgerWalletProvider("HID", "cosmos");
    // You should not use local wallet provider in production
    const wallet = new LocalWalletProvider(
    "anger river nuclear pig enlist fish demand dress library obtain concert nasty wolf episode ring bargain rely off vibrant iron cram witness extra enforce"

  const api = new GaiaApi({
    chainId: "cosmoshub-3",
    walletProvider: wallet,
    rpc: "http://localhost:26657",
    rest: "http://localhost:1317"

  // You should sign in before using your wallet
  await api.enable();

  const key = (await api.getKeys())[0];
  const accAddress = new AccAddress(key.address, "cosmos");

  await api.sendMsgs(
      new MsgSend(accAddress, accAddress, [new Coin("uatom", new Int("1"))]),
      new MsgSend(accAddress, accAddress, [new Coin("uatom", new Int("1"))])
      // If account number or sequence is omitted, they are calculated automatically
      gas: bigInteger(60000),
      memo: "test",
      fee: new Coin("uatom", new Int("111"))

Making your own messages

Below is Gaia's basic sending message. More examples are here.

import { Amino, Type } from "ts-amino";
const { Field, Concrete, DefineStruct } = Amino;
import { Msg }  from "../../core/tx";
import { AccAddress } from "../../common/address";
import { Coin } from "../../common/coin";
import { Int } from "../../common/int";

export class MsgSend extends Msg {
  @Field.Defined(0, {
    jsonName:  "from_address"
  public fromAddress: AccAddress;

  @Field.Defined(1, {
    jsonName:  "to_address"
  public toAddress: AccAddress;

    { type: Type.Defined },
      jsonName: "amount"
  public amount: Coin[];

  constructor(fromAddress: AccAddress, toAddress: AccAddress, amount: Coin[]) {
    this.fromAddress = fromAddress;
    this.toAddress = toAddress;
    this.amount = amount;

  public getSigners(): AccAddress[] {
    return [this.fromAddress];

  * ValidateBasic does a simple validation check that
  * doesn't require access to any other information.
  * You can throw error in this when msg is invalid.
  public validateBasic(): void {
    for (const coin of this.amount) {
      if (coin.amount.lte(new  Int(0))) {
        throw new Error("Send amount is invalid");
  * Get the canonical byte representation of the Msg.
  * @return Return sorted by alphabetically amino encoded json by default.
  // public getSignBytes(): Uint8Array {
  //   return Buffer.from(sortJSON(marshalJson(this)), "utf8");
  // }

Making api for your own blockchain

Check out this.

Run tests

npm run test


👤 chainapsis