decimal-js-sdk

0.4.2 • Public • Published

Decimal JS SDK

For detailed explanation on how things work, checkout the:

Install

$ npm install decimal-js-sdk

Usage

Connecting

You can provide your own Decimal node address to send transactions to the network, or you can use our gateways to do this and much more. Gateway URLs are provided below.

MAINNET - https://mainnet-gate.decimalchain.com/api/

TESTNET - https://testnet-gate.decimalchain.com/api/

Depending on what you wish to use provide either gateUrl or restURL (your node rest service url) in config object passed to the Decimal instance

const decimalOptions = {
  gateUrl: 'https://testnet-gate.decimalchain.com/api/',
  // restURL: 'https://your-node.example.com/rest' if you want to use your own Decimal node instance
}
// baseURL option used in old versions is now deprecated
const decimal = new Decimal(decimalOptions);

The following code can be used to generate mnemonic or use your mnemonic

const bip39 = require("bip39");
const mnemonic = bip39.generateMnemonic();

Get generated user wallets from DB

// add oprions to wallet object and call method synchronize
const options = {
  gateUrl: 'https://testnet-gate.decimalchain.com/api/',
}

const wallet = new Wallet(/*your mnemonic*/, options)

// get saved wallet ids from DB

wallet.getAndUseGeneratedWallets()

// save new generated wallet in DB
// before save it, use method wallet.getAndUseGeneratedWallets()

wallet.sendAndSaveGeneratedWallets()

Send coins

CommonJS

const { Wallet, Decimal } = require('decimal-js-sdk'); // For server use 'decimal-js-sdk/dist/decimal-sdk-node'

const wallet = new Wallet( /*your mnemonic*/);


const decimalOptions = {
  restURL: 'https://your-node.example.com/rest' if you want to use your own Decimal node instance
}
// baseURL option used in old versions is now deprecated
const decimal = new Decimal(decimalOptions);

const data = {
  to: 'dx13ykakvugqwzqqmqdj2j2hgqauxmftdn3kqy69g',
  coin: 'tdel',
  amount: '1',
};

const txResult = await decimal.sendCoins(data, [options]); // see options for details
// => {hash: '4C0A408B6EBC33AD...', success: true, error: null}

ES6

import { Wallet, Decimal } from 'decimal-js-sdk';

const wallet = new Wallet(/*your mnemonic*/);
const decimal = new Decimal({gateUrl: 'https://testnet-gate.decimalchain.com/api/', wallet})

const data = {
  to: 'dx13ykakvugqwzqqmqdj2j2hgqauxmftdn3kqy69g',
  coin: 'tdel',
  amount: '1',
};

const txResult = await decimal.sendCoins(data); // see sendCoins for details
// => {hash: '4C0A408B6EBC33AD...', success: true, error: null}

Wallet API

Generate wallet

import { Wallet } from 'decimal-js-sdk';

const wallet = new Wallet();

Generate wallet from mnemonic

import { Wallet } from 'decimal-js-sdk';

const wallet = new Wallet('erase august mask elevator sand picture north there apple equal anchor target');

Use wallet with Ledger

import { Wallet } from 'decimal-js-sdk';
// you can use one of three mods: emulator, usb, bluetooth
const wallet = await Wallet.initLedger('emulator');

Wallet methods

getPrivateKeyString Return the private key string of 64 hex characters

wallet.getPrivateKeyString();
// 8f7370936a728ff3d2306cbf2422382a4297f9059aecb5703fe83eef49d3e828

getPublicKeyString Return the public key string of 64 hex characters

wallet.getPublicKeyString();
// 02f85bb9b5d87cda4197b09d0cd0ef5a1fb97f74f261f508f48a26d7dba2d0ed12

switchAccount(id) Switches to wallet from list of wallets, generated with Master key, updates wallet to picked, wallet id picked, private key, public key, address. Only to generated wallets.

wallet.switchAccount(id);
// switched to another early generated wallet.privateKey, wallet.publicKey, wallet.address

generateAccount Generates new wallet with Master key, updates wallet to new generated, account's depth, wallet id to new generated, list of wallets, private key, public key, address. Maximum to 20 wallets with current Master key.

wallet.generateAccount();
// new wallet.privateKey, wallet.publicKey, wallet.address

generateAndSwitchAccount Generates new wallets with Master key and switches to wallet with provided id or the last wallet. Maximum to 20 wallets with current Master key.

wallet.generateAndSwitchAccount(depth, id);
// new wallets to depth, switched to wallet with provided id

SDK instance

Network

Additionally, you can pass network parameter to enable network specific features:

const decimal = new Decimal({
  gateUrl: 'https://testnet-gate.decimalchain.com/api/',
  network: 'testnet', // Enable testnet only txs types
  wallet,
  meta
})

Available networks: ['mainnet', 'testnet', 'devnet'] If omitted defaults to 'mainnet', which is fine in most cases.

Utilities

verifyAddress

decimal.verifyAddress(address, prefix = 'dx')
  • examples:
const decimal = new Decimal(...)

const isValid = await decimal.verifyAddress('dx13wv0w5w6uzkqceevtcefgc3sk0gg33vjuew2wy') // true

const isValidatorAddress = await decimal.verifyAddress('dxvaloper13wv0w5w6uzkqceevtcefgc3sk0gg33vjuew2wy', 'dxvaloper') // true

Types

  import {TX_TYPE} from 'decimal-js-sdk'
  • TX_TYPE.COIN_BUY
  • TX_TYPE.COIN_CREATE
  • TX_TYPE.COIN_SELL
  • TX_TYPE.COIN_SEND
  • TX_TYPE.COIN_MULTISEND
  • TX_TYPE.COIN_SELL_ALL
  • TX_TYPE.COIN_REDEEM_CHECK
  • TX_TYPE.COIN_ISSUE_CHECK
  • TX_TYPE.VALIDATOR_CANDIDATE
  • TX_TYPE.VALIDATOR_DELEGATE
  • TX_TYPE.VALIDATOR_SET_ONLINE
  • TX_TYPE.VALIDATOR_SET_OFFLINE
  • TX_TYPE.VALIDATOR_UNBOND
  • TX_TYPE.VALIDATOR_CANDIDATE_EDIT
  • TX_TYPE.MULTISIG_CREATE_WALLET
  • TX_TYPE.MULTISIG_CREATE_TX
  • TX_TYPE.MULTISIG_SIGN_TX

Meta

Used for generating offline transactions. This is an optional parameter!

const meta = {
  account_number: "10",
  chain_id: "decimal-testnet-06-30-15-30",
  sequence: "198"
}

Options

Each transaction method consists of input data (data) and options. This is an optional parameter!

const options = {
  gasLimit: '9000000000000000000', // The maximum amount of gas you are willing to pay for a transaction
  feeCoin: 'BTC', // The coin that pays commission
  feeAmount: '4000', // Fee pay amount
  message: 'my message', // Any additional information about the transaction
  txBroadcastMode: 'sync', // Broadcast tx mode {sync | async | block}
  accountInfoMode: 'blockchain-with-mempool', // Method of obtaining nonce, receive nonce with unconfirmed transactions in a mempool or not {blockchain | blockchain-with-mempool}
  setNonceAutomatically: true, // Automatically calculate nonce within a small transaction pool, after getting the first one from blockchain {true | false}
  nonce: '100', // Custom nonce for the transaction {valid number string}
};

Tx utils

getTransaction()

import {TX_TYPE} from 'decimal-js-sdk';

const broadcastTx = await decimal.getTransaction(TX_TYPE.COIN_SEND, data, options);
/*
{
  txBroadcastMode: "sync"
  tx: {
    fee: {amount: Array(0), gas: "9000000000000000000"},
    memo: "sdk test",
    msg: [{…}],
    signatures: [{…}]
  }
}
*/

postTx()

import {TX_TYPE} from 'decimal-js-sdk';

const broadcastTx = await decimal.getTransaction(TX_TYPE.COIN_SEND, data, options);
const result = await decimal.postTx(broadcastTx);

/*
{
  error: null
  hash: "244AA816B881BDA43704867574114D905631EFA3B6AFD0E401C7B603D8264DF8"
  success: true
}
*/

estimateTxFee()

const fee = await decimal.estimateTxFee(TX_TYPE.COIN_SEND, data, options);
console.log(fee); // 0.44

getTransactionByHash()

await decimal.getTransactionByHash(hash);

API

Please note, that these methods require gateUrl to be provided

getCoinsList()

const limit = 10;
const offset = 0;
const query = ''; // search
await decimal.getCoinsList(limit, offset, query);

/*
{
  "count": 5,
  "coins": [
    {
      "symbol": "mycoin",
      "title": "MYCOIN",
      "volume": "1023454326378015905553",
      "reserve": "12609116636032889229477",
      "crr": 10,
      "limitVolume": "2000000000000000000000",
      "creator": "dx1vkn4lje42gjmyghc3vneg0yqa39wfgqvh4f8zg",
      "txHash": "93AC6D86FF12BD9594889FEF4092542CBA6FEFA09F5E4A710D9E6CF12C1006A7",
      "blockId": 1529,
      "avatar": "data:image/png;base64...",
      "createdAt": "2020-07-28T14:09:38.852Z",
      "updatedAt": "2020-07-29T12:25:56.512Z"
    },
    // ...
  ]
}
*/

getCoin()

const coinTicker = 'MYCOIN'
await decimal.getCoin(coinTicker);

/*
{
  "symbol": "mycoin",
  "title": "MYCOIN",
  "volume": "1022451550064246238748",
  "reserve": "12486116326032889229477",
  "crr": 10,
  "limitVolume": "2000000000000000000000",
  "creator": "dx1vkn4lje42gjmyghc3vneg0yqa39wfgqvh4f8zg",
  "txHash": "93AC6D86FF12BD9594889FEF4092542CBA6FEFA09F5E4A710D9E6CF12C1006A7",
  "blockId": 1529,
  "avatar": "data:image/png;base64..."
  "createdAt": "2020-07-28T14:09:38.852Z",
  "updatedAt": "2020-07-29T08:09:44.203Z"
}
*/

getAddress()

const address = 'dx13ykakvugqwzqqmqdj2j2hgqauxmftdn3kqy69g' // address of requested user, required property
const txLimit = 10; // optional property

await decimal.getAddress(address, txLimit);

/*
{
  "address": {
    "id": 31,
    "address": "dx13ykakvugqwzqqmqdj2j2hgqauxmftdn3kqy69g",
    "type": "single",
    "balance": {
      "tdel": "14999120000000000000000"
    },
    "balanceNft": [
      {
        amount: "1"
        collection: "testovaya"
        // if user's address then original cover of nft
        // else a placeholder image used for common display
        cover: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAYI
        nftId: "4a482a53b16345bb625a214b2f9c3f2968461cd0"
        nftReserve: [{...}]
        nftStake: [{...}]
      }
    ],
    "nonce": 2,
    "txes": 5,
    "createdAt": "2020-07-29T07:48:15.089Z",
    "updatedAt": "2020-07-29T08:07:36.086Z",
    "totalStake": null,
    "txs": [
      // ...
    ]
  },
  "coins": [
    // ...
  ]
}
*/

getMeta()

await decimal.getMeta();

/*
{
  "account_number": "33",
  "sequence": "2",
  "chain_id": "decimal-testnet-07-28-18-30"
}
*/

getMultisigsByAddress()

const address = 'dx13ykakvugqwzqqmqdj2j2hgqauxmftdn3kqy69g'

await decimal.getMultisigsByAddress(address, txLimit);
/*
{
  "count": 4,
  "wallets": [
    {
      "id": 1,
      "address": "dx13ykakvugqwzqqmqdj2j2hgqauxmftdn3kqy69g",
      "multisig": "dx1q8957kzw3dxvc2gndc0cwqq3v35xfrrl76tdsw",
      "weight": 1,
      "createdAt": "2020-07-29T09:50:47.842Z",
      "updatedAt": "2020-07-29T09:50:47.842Z",
      "wallet": {
        "address": "dx1q8957kzw3dxvc2gndc0cwqq3v35xfrrl76tdsw",
        "threshold": 2,
        "creator": "dx13ykakvugqwzqqmqdj2j2hgqauxmftdn3kqy69g",
        "createdAt": "2020-07-29T09:50:47.839Z",
        "updatedAt": "2020-07-29T09:50:47.839Z"
      }
    },
    {
      // ...
    }
  ]
}
*/

getMultisig()

const multisigAddress = 'dx1q8957kzw3dxvc2gndc0cwqq3v35xfrrl76tdsw';
await decimal.getMultisig(multisigAddress);

/*
{
  "address": "dx1q8957kzw3dxvc2gndc0cwqq3v35xfrrl76tdsw",
  "threshold": 2,
  "creator": "dx13ykakvugqwzqqmqdj2j2hgqauxmftdn3kqy69g",
  "createdAt": "2020-07-29T09:50:47.839Z",
  "updatedAt": "2020-07-29T09:50:47.839Z",
  "owners": [
    {
      "id": 1,
      "address": "dx13ykakvugqwzqqmqdj2j2hgqauxmftdn3kqy69g",
      "multisig": "dx1q8957kzw3dxvc2gndc0cwqq3v35xfrrl76tdsw",
      "weight": 1,
      "createdAt": "2020-07-29T09:50:47.842Z",
      "updatedAt": "2020-07-29T09:50:47.842Z"
    },
    {
      "id": 2,
      "address": "dx1tnqtm4kr9r2584wehzvtvvycq3zvm9s3tp6rdw",
      "multisig": "dx1q8957kzw3dxvc2gndc0cwqq3v35xfrrl76tdsw",
      "weight": 1,
      "createdAt": "2020-07-29T09:50:47.846Z",
      "updatedAt": "2020-07-29T09:50:47.846Z"
    }
  ],
  "txs": [
    {
      "transaction": "dxmstx1mxpwmc7skej00chq4ryzfs3rysz980wtnsdfws",
      "hashTx": "D6F7DAC81F52D9FEE522582D0E77D2F75C4737B3D313B343F01132399F5CDD93",
      "hashSign": null,
      "confirmed": false,
      "confirmations": 1,
      "data": {
        "dx13ykakvugqwzqqmqdj2j2hgqauxmftdn3kqy69g": {
          "timestamp": "2020-07-29T10:34:37.925Z",
          "signer_weight": 1
        },
        "dx1tnqtm4kr9r2584wehzvtvvycq3zvm9s3tp6rdw": {
          "timestamp": null,
          "signer_weight": null
        }
      },
      "coin": [
        {
          "coin": "tdel",
          "amount": "4000000000000000000"
        }
      ],
      "address": "dx1q8957kzw3dxvc2gndc0cwqq3v35xfrrl76tdsw",
      "to": "dx13ykakvugqwzqqmqdj2j2hgqauxmftdn3kqy69g",
      "createdAt": "2020-07-29T10:34:37.926Z",
      "updatedAt": "2020-07-29T10:34:37.926Z"
    }
  ],
  "account": {
    "id": 33,
    "address": "dx1q8957kzw3dxvc2gndc0cwqq3v35xfrrl76tdsw",
    "type": "multisig",
    "balance": {
      "tdel": "14892500000000000000000"
    },
    "nonce": null,
    "txes": 2,
    "createdAt": "2020-07-29T09:50:47.836Z",
    "updatedAt": "2020-07-29T11:43:52.372Z"
  }
}
*/

getMultisigTxs()

const multisigAddress = 'dx1q8957kzw3dxvc2gndc0cwqq3v35xfrrl76tdsw';
const limit = 10;
const offset = 0;

await decimal.getMultisigTxs(multisigAddress, limit, offset);

/*
{
  "count": 1,
  "txs": [
    {
      "transaction": "dxmstx1mxpwmc7skej00chq4ryzfs3rysz980wtnsdfws",
      "hashTx": "D6F7DAC81F52D9FEE522582D0E77D2F75C4737B3D313B343F01132399F5CDD93",
      "hashSign": null,
      "confirmed": false,
      "confirmations": 1,
      "data": {
        "dx13ykakvugqwzqqmqdj2j2hgqauxmftdn3kqy69g": {
          "timestamp": "2020-07-29T10:34:37.925Z",
          "signer_weight": 1
        },
        "dx1tnqtm4kr9r2584wehzvtvvycq3zvm9s3tp6rdw": {
          "timestamp": null,
          "signer_weight": null
        }
      },
      "coin": [
        {
          "coin": "tdel",
          "amount": "4000000000000000000"
        }
      ],
      "address": "dx1q8957kzw3dxvc2gndc0cwqq3v35xfrrl76tdsw",
      "to": "dx13ykakvugqwzqqmqdj2j2hgqauxmftdn3kqy69g",
      "createdAt": "2020-07-29T10:34:37.926Z",
      "updatedAt": "2020-07-29T10:34:37.926Z"
    }
  ]
}
*/

getNft()

const id = '2ff8d64694c057777707739910f83f8bda53aa37'; // id of requested nft

await decimal.getNft(id);

/*

common fields for all users 

{
  allowMint: false
  blockId: 17187
  cover: "data:image/png;base64,iVBORw0KGgo..."
  createdAt: "2021-09-28T06:43:48.378Z"
  creator: "dx1wjewzht52hfy3m0rpm8usdmfk764ca4yrwd6q8"
  description: "token"
  headline: "tok"
  id: 422
  misc: {coverHash: '307a3e7ccac8dfbd522805d980e199e5e5dc1541', coverPath: 'cSWF9hjezHlgxCPvAj4DtjpIstBnvHHo_cover_93b28.png', coverExtension: 'png'}
  nftCollection: "tok"
  nftId: "2ff8d64694c057777707739910f83f8bda53aa37"
  nftReserve: (10) [{…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}]
  nonFungible: false
  owners: (3) [{…}, {…}, {…}]
  quantity: "10"
  slug: "cSWF9hjezHlgxCPvAj4DtjpIstBnvHHo"
  startReserve: "100000000000000000000"
  status: "active"
  tokenUri: "https://devnet-nft.decimalchain.com/api/nfts/cSWF9hjezHlgxCPvAj4DtjpIstBnvHHo"
  totalReserve: "1000000000000000000000"
  txHash: "33A41B8C910F7BCB03958448F9F59401EC9D3089F5CF7C621248F2CE2E168063"
  updatedAt: "2021-09-28T06:43:58.071Z
}

if user is owner of requested nft then response is

{
  asset: 'assets/JeqShgz5ySuYgrDr2f5Cz8MrKTSP2pyk_0299a.png',
  ...commonFields,
}

if user is not owner of requested nft then response is

{
  asset: null,
  ...commonFields,
}

*/

getNfts()

const address = 'dx1wjewzht52hfy3m0rpm8usdmfk764ca4yrwd6q8'; // address of requested user with nfts, required property
const limit = 10; // optional property
const offset = 0; // optional property
const query = '2ff8d64694c05777770'; // nft id or nft collection to search, optional property

await decimal.getNfts(address, limit, offset, query);

/*

common fields for all users 

{
  count: 1,
  tokens: [{
    asset: null
    isPrivate: true
    allowMint: false
    blockId: 17187
    createdAt: "2021-09-28T06:43:48.378Z"
    creator: "dx1wjewzht52hfy3m0rpm8usdmfk764ca4yrwd6q8"
    description: "token"
    headline: "tok"
    id: 422
    nftCollection: "tok"
    nftId: "2ff8d64694c057777707739910f83f8bda53aa37"
    nftReserve: (10) [{…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}]
    nonFungible: false
    owners: (3) [{…}, {…}, {…}]
    quantity: "10"
    slug: "cSWF9hjezHlgxCPvAj4DtjpIstBnvHHo"
    startReserve: "100000000000000000000"
    status: "active"
    tokenUri: "https://devnet-nft.decimalchain.com/api/nfts/cSWF9hjezHlgxCPvAj4DtjpIstBnvHHo"
    totalReserve: "1000000000000000000000"
    txHash: "33A41B8C910F7BCB03958448F9F59401EC9D3089F5CF7C621248F2CE2E168063"
    updatedAt: "2021-09-28T06:43:58.071Z
  }]
}

if user's address

{
  cover: "data:image/png;base64,iVBORw0KGgoAAAA...", // original cover of nft
  misc: {coverHash: '307a3e7ccac8dfbd522805d980e199e5e5dc1541', coverPath: 'cSWF9hjezHlgxCPvAj4DtjpIstBnvHHo_cover_93b28.png', coverExtension: 'png'}
  ...commonFields,
}

if not user's address

{
  // predefined data
  cover: "data:image/png;base64,FrrvfwqeyttytyT...", // a placeholder image used for common display
  misc: null,
  ...commonFields,
}

*/

getNftTxes()

const id = '1b2a71cfc20aabab7e9d0151b963732828e155ec'; // nft id of requested nft txes, required property
const limit = 10; // optional property
const offset = 0; // optional property
const order = 'order[createdAt]=DESC'; // sort field and direction in format order[FIELD]=DIRECTION where DIRECTION in (DISC, ASC), optional property

await decimal.getNftTxes(id, limit, offset, order);

/*

common fields for all users 

{
  count: 1,
  txs: [{
    blockId: 648044
    code: 0
    cover: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAUQ
    createdAt: "2021-10-15T04:53:40.411Z"
    creator: "dx1zenxxwspj8rnjstqyst9qvwaptq7jwwjnzul04"
    data: {log: "",…}
    description: "DAY"
    fee: {gas_coin: null, gas_used: "430000000000000000", gas_amount: null, gas_used_number: 430000000000000000}
    from: "dx1wjewzht52hfy3m0rpm8usdmfk764ca4yrwd6q8"
    hash: "7F3BFBBAB54373E7E83EA7ECAF32CB1C42BC5ED4CD37AE3ECBF984D3058E8F00"
    headline: "DAY"
    id: 528
    isPrivate: false
    message: ""
    misc: {coverHash: "6c37327f0e961595787924a89944894cd62d2a83",…}
    nonce: 119
    slug: "ndFK0PT2V1VmrEvd7F9jhzZLbG3b8cfI"
    status: "active"
    timestamp: "2021-11-15T10:15:52.669Z"
    to: null
    type: "delegate_nft"
    updatedAt: "2021-10-15T04:53:48.550Z"
  }]
}

if user's nft

{
  cover: "data:image/png;base64,iVBORw0KGgoAAAA...", // original cover of nft
  misc: {coverHash: '307a3e7ccac8dfbd522805d980e199e5e5dc1541', coverPath: 'cSWF9hjezHlgxCPvAj4DtjpIstBnvHHo_cover_93b28.png', coverExtension: 'png'}
  ...commonFields,
}

if not user's nft

{
  // predefined data
  cover: "data:image/png;base64,FrrvfwqeyttytyT...", // a placeholder image used for common display
  misc: null,
  ...commonFields,
}

*/

getNftsTxes()

const address = 'dx1wjewzht52hfy3m0rpm8usdmfk764ca4yrwd6q8'; // address of requested user with nfts, required property
const limit = 10; // optional property
const offset = 0; // optional property
const order = 'order[createdAt]=DESC'; // sort field and direction in format order[FIELD]=DIRECTION where DIRECTION in (DISC, ASC), optional property

await decimal.getNftsTxes(address, limit, offset, order);

/*

common fields for all users 

{
  count: 1,
  txs: [{
    blockId: 648044
    code: 0
    cover: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAUQ
    createdAt: "2021-10-15T04:53:40.411Z"
    creator: "dx1zenxxwspj8rnjstqyst9qvwaptq7jwwjnzul04"
    data: {log: "",…}
    description: "DAY"
    fee: {gas_coin: null, gas_used: "430000000000000000", gas_amount: null, gas_used_number: 430000000000000000}
    from: "dx1wjewzht52hfy3m0rpm8usdmfk764ca4yrwd6q8"
    hash: "7F3BFBBAB54373E7E83EA7ECAF32CB1C42BC5ED4CD37AE3ECBF984D3058E8F00"
    headline: "DAY"
    id: 528
    isPrivate: false
    message: ""
    misc: {coverHash: "6c37327f0e961595787924a89944894cd62d2a83",…}
    nonce: 119
    slug: "ndFK0PT2V1VmrEvd7F9jhzZLbG3b8cfI"
    status: "active"
    timestamp: "2021-11-15T10:15:52.669Z"
    to: null
    type: "delegate_nft"
    updatedAt: "2021-10-15T04:53:48.550Z"
  }]
}

if user's address

{
  cover: "data:image/png;base64,iVBORw0KGgoAAAA...", // original cover of nft
  misc: {coverHash: '307a3e7ccac8dfbd522805d980e199e5e5dc1541', coverPath: 'cSWF9hjezHlgxCPvAj4DtjpIstBnvHHo_cover_93b28.png', coverExtension: 'png'}
  ...commonFields,
}

if not user's address

{
  // predefined data
  cover: "data:image/png;base64,FrrvfwqeyttytyT...", // a placeholder image used for common display
  misc: null,
  ...commonFields,
}

*/

getStakesByAddress()

const address = 'dx13ykakvugqwzqqmqdj2j2hgqauxmftdn3kqy69g';

await decimal.getStakesByAddress(address);

/*
{
  "validators": [
    {
      "validatorId": "dxvaloper1ajytg8jg8ypx0rj9p792x32fuxyezga4dq2uk0",
      "stakesNfts": [
        {
           "baseQuantity": "1000",
           "nftCollection": "denom1",
           "quantity": "10",
           "unbondQuantity": "10"
        }
      ],
      "totalStake": "500000000000000000000",
      "validator": {
        "address": "dxvaloper1ajytg8jg8ypx0rj9p792x32fuxyezga4dq2uk0",
        "consensusAddress": "dxvalcons17ntss5hyuutk5w4a4upptz3xc9f3f0tgwwmfw8",
        "rewardAddress": "dx1ajytg8jg8ypx0rj9p792x32fuxyezga43jd3ry",
        "moniker": "test-node-fra1-02",
        "website": "decimalchain.com",
        "details": "Declaring validator on test-node-fra1-02",
        "identity": null,
        "security_contact": null,
        "blockId": 0,
        "skippedBlocks": 0,
        "delegators": 2,
        "fee": "0.100000000000000000",
        "slots": 2,
        "mins": "0",
        "stake": "40000500000000000000000000",
        "power": "40000500",
        "rating": null,
        "status": "online",
        "kind": "Validator",
        "createdAt": "2020-07-28T11:48:06.658Z",
        "updatedAt": "2020-07-29T12:51:33.002Z"
      }
    }
  ],
  "total": "1000"
}
*/

getNftStakesByAddress()

const address = 'dx13ykakvugqwzqqmqdj2j2hgqauxmftdn3kqy69g';

await decimal.getNftStakesByAddress(address);

/*
{
  "validators": [
    {
      "validatorId": "dxvaloper1ajytg8jg8ypx0rj9p792x32fuxyezga4dq2uk0",
      "stakes": [
        {
          "coin": "tdel",
          "amount": "500000000000000000000",
          "baseAmount": "500000000000000000000",
          "unbondAmount": null
        }
      ],
      "totalStake": "500000000000000000000",
      "validator": {
        "address": "dxvaloper1ajytg8jg8ypx0rj9p792x32fuxyezga4dq2uk0",
        "consensusAddress": "dxvalcons17ntss5hyuutk5w4a4upptz3xc9f3f0tgwwmfw8",
        "rewardAddress": "dx1ajytg8jg8ypx0rj9p792x32fuxyezga43jd3ry",
        "moniker": "test-node-fra1-02",
        "website": "decimalchain.com",
        "details": "Declaring validator on test-node-fra1-02",
        "identity": null,
        "security_contact": null,
        "blockId": 0,
        "skippedBlocks": 0,
        "delegators": 2,
        "fee": "0.100000000000000000",
        "slots": 2,
        "mins": "0",
        "stake": "40000500000000000000000000",
        "power": "40000500",
        "rating": null,
        "status": "online",
        "kind": "Validator",
        "createdAt": "2020-07-28T11:48:06.658Z",
        "updatedAt": "2020-07-29T12:51:33.002Z"
      }
    }
  ],
  "total": "500000000000000000000"
}
*/

getValidator()

const validatorAddress = 'dxvaloper1ajytg8jg8ypx0rj9p792x32fuxyezga4dq2uk0';

await decimal.getValidator(validatorAddress);

/*
{
  "address": "dxvaloper1ajytg8jg8ypx0rj9p792x32fuxyezga4dq2uk0",
  "consensusAddress": "dxvalcons17ntss5hyuutk5w4a4upptz3xc9f3f0tgwwmfw8",
  "rewardAddress": "dx1ajytg8jg8ypx0rj9p792x32fuxyezga43jd3ry",
  "moniker": "test-node-fra1-02",
  "website": "decimalchain.com",
  "details": "Declaring validator on test-node-fra1-02",
  "identity": null,
  "security_contact": null,
  "blockId": 0,
  "skippedBlocks": 0,
  "delegators": 2,
  "fee": "0.100000000000000000",
  "slots": 2,
  "mins": "0",
  "stake": "40000500000000000000000000",
  "power": "40000500",
  "rating": null,
  "status": "online",
  "kind": "Validator",
  "createdAt": "2020-07-28T11:48:06.658Z",
  "updatedAt": "2020-07-29T12:51:33.002Z"
}
*/

getMyTransactions()

const limit = 10;
const offset = 0;
const types = '';

await decimal.getMyTransactions(limit, offset, types);

/*
{
  "count": 27,
  "txs": [
    {
      "id": 101,
      "hash": "E248CD76554521D0FB021E9AC666CC4B3511F974992771CD2AB7904F8ABE608C",
      "timestamp": "2020-07-29T13:26:35.194Z",
      "status": "Success",
      "type": "set_offline",
      "fee": {
        "gas_coin": null,
        "gas_used": "408000000000000000",
        "gas_amount": null,
        "gas_used_number": 408000000000000000
      },
      "data": {
        "log": "",
        "coin": "",
        "check": "",
        "coins": "",
        "proof": "",
        "title": "",
        "amount": "",
        "issuer": "",
        "owners": "",
        "sender": "",
        "symbol": "",
        "wallet": "",
        "weights": "",
        "coin_base": "",
        "confirmed": null,
        "due_block": "",
        "recipient": "",
        "threshold": "",
        "coin_check": "",
        "commission": "",
        "amount_base": "",
        "coin_to_buy": "",
        "nonce_check": null,
        "transaction": "",
        "amount_check": "",
        "coin_to_sell": "",
        "limit_volume": "",
        "amount_to_buy": "",
        "confirmations": null,
        "signer_weight": null,
        "amount_to_sell": "",
        "initial_volume": "",
        "reward_address": "",
        "validator_desc": {
          "details": "",
          "moniker": "",
          "website": "",
          "identity": "",
          "security_contact": ""
        },
        "completion_time": "",
        "initial_reserve": "",
        "delegator_address": "",
        "min_amount_to_buy": "",
        "validator_address": "dxvaloper13ykakvugqwzqqmqdj2j2hgqauxmftdn32jrhsr",
        "max_amount_to_sell": "",
        "multisend_receivers": "",
        "constant_reserve_ratio": null
      },
      "nonce": 23,
      "code": 0,
      "message": "",
      "blockId": 16607,
      "from": "dx13ykakvugqwzqqmqdj2j2hgqauxmftdn3kqy69g",
      "to": null,
      "createdAt": "2020-07-29T13:26:41.244Z",
      "updatedAt": "2020-07-29T13:26:41.244Z"
    }
    // ....
  ]
}
*/

Coins

sendCoins()

const data = {
  to: 'dx13ykakvugqwzqqmqdj2j2hgqauxmftdn3kqy69g',
  coin: 'tDEL',
  amount: '100', // 100 tDEL
}

await decimal.sendCoins(data, options);

burnCoins()

const data = {
  coin: 'tDEL',
  amount: '100', // 100 tDEL
}

await decimal.burnCoins(data, options);

multisendCoins()

const data = [
  {
    to: 'dx13ykakvugqwzqqmqdj2j2hgqauxmftdn3kqy69g',
    coin: 'tDEL',
    amount: '100'
  },
  {
    to: 'dx13m9gxeru45wxlcqk9dxf4vlewslauwr8try0tl',
    coin: 'tDEL',
    amount: '50'
  },
]

await decimal.multisendCoins(data, options);

buyCoins()

const data = {
  buyCoin: 'BTC',
  amount: '10',
  spendCoin: 'DEL',
  maxSpendLimit: '20', // Optionally
}

await decimal.buyCoins(data, options);

sellCoins()

const data = {
  sellCoin: 'DEL',
  amount: '10',
  getCoin: 'ETH',
  minBuyLimit: '2', // Optionally
}

await decimal.sellCoins(data, options);

sellAllCoins()

const data = {
  sellCoin: 'BTC',
  getCoin: 'DEL',
  minBuyLimit: '10', // Optionally
}

await decimal.sellAllCoins(data, options);

createCoin()

const data = {
  title: 'Test coin',
  ticker: 'TESTTT',
  initSupply: '50000',
  maxSupply: '100000',
  reserve: '12000',
  crr: '45',
}

await decimal.createCoin(data, options);

Validators

validatorDelegate()

const data = {
  address: 'dxvaloper1ajytg8jg8ypx0rj9p792x32fuxyezga4dq2uk0',
  coin: 'tdel',
  stake: '10',
}

await decimal.validatorDelegate(data, options);

validatorUnbond()

const data = {
  address: 'dxvaloper1ajytg8jg8ypx0rj9p792x32fuxyezga4dq2uk0',
  coin: 'tdel',
  stake: '10',
}

await decimal.validatorUnbond(data, options);

validatorDeclare()

const data = {
  rewardAddress: 'dx13ykakvugqwzqqmqdj2j2hgqauxmftdn3kqy69g',
  coin: 'tdel',
  stake: '10',
  pubKey: 'JRlv38BXuD1TvWQJ9ic1KHr8PzuOITZH3rD8Zm0Vj3Y=',
  commission: '10',
  description: {
    moniker: 'my-node-123',
    identity: '',
    website: 'hello.ru',
    securityContact: 'test@test.com',
    details: 'details node',
  },
}

await decimal.validatorDeclare(data, options);

validatorEdit()

const data = {
  rewardAddress: 'dx13ykakvugqwzqqmqdj2j2hgqauxmftdn3kqy69g',
  description: {
    moniker: 'my-node-123-edit',
    identity: '321',
    website: 'hello.ru',
    securityContact: 'test@test.com',
    details: 'details node',
  },
}

await decimal.validatorEdit(data, options);

validatorOn()

await decimal.validatorOn(options);

validatorOff

await decimal.validatorOff(options);

Checks

issueCheck()

const data = {
  nonce: '34',
  coin: 'tdel',
  amount: '100',
  password: '123',
  dueBlock: '999999999',
}

await decimal.issueCheck(data, options);

redeemCheck()

const data = {
  check: 'ERp9FR24Vz19XG....',
  password: '123',
}

await decimal.redeemCheck(data, options);

NFTs

nftMint()

import generateNftId from './utils';

const id = generateNftId(
  'asdfg',  // nft name string
  'asdfgasdfg', // nft description string
  'CadgWIHKcOkPzn5X0Eji96F7RLiLAxPQ', // nft slug 
  '7446c6522319e02ca5552c257d0c01faa89c41a9', // cover file SHA-1 hash or null
  '7446c6522319e02ca5552c257d0c01faa89c41a9' // asset file SHA-1 hash or null
);

const data = {
  id, // hash string
  denom: 'phone', // nft collection string
  recipient: 'dx1lx4lvt8sjuxj8vw5dcf6knnq0pacre4w6hdh2v',
  token_uri: 'https://develop.nft.decimalchain.com/api/nfts/CadgWIHKcOkPzn5X0Eji96F7RLiLAxPQ',
  quantity: '1',
  reserve: '1',
  allow_mint: true,
}

await decimal.nftMint(data, options);

nftBurn()

const data = {
  denom: 'phone',
  id: 'd6ebb0c3-f075-43f2-ac60-ac0d02858154',
  sub_token_ids: ['1', '2']
}

await decimal.nftBurn(data, options);

nftEditMetadata()

const data = {
  denom: 'phone',
  id: 'd6ebb0c3-f075-43f2-ac60-ac0d02858154',
  token_uri: 'https://develop.nft.decimalchain.com/api/nfts/pepe112',
}

await decimal.nftEditMetadata(data, options);

nftTransfer()

const data = {
  recipient: 'dx1lx4lvt8sjuxj8vw5dcf6knnq0pacre4w6hdh2v',
  denom: 'phone',
  id: 'd6ebb0c3-f075-43f2-ac60-ac0d02858154',
  sub_token_ids: ['1', '2']
}

await decimal.nftTransfer(data, options);

nftDelegate()

const data = {
  denom: 'phone',
  id: 'd6ebb0c3-f075-43f2-ac60-ac0d02858154',
  validator_address: 'dxvaloper1mvqrrrlcd0gdt256jxg7n68e4neppu5tk872z3',
  sub_token_ids: ['1', '2']
}

await decimal.nftDelegate(data, options);

nftUnbond()

const data = {
  denom: 'phone',
  id: 'd6ebb0c3-f075-43f2-ac60-ac0d02858154',
  validator_address: 'dxvaloper1mvqrrrlcd0gdt256jxg7n68e4neppu5tk872z3',
  sub_token_ids: ['1', '2']
}

await decimal.nftUnbond(data, options);

nftUpdateReserve()

const data = {
  denom: 'phone', // nft collection name
  id: 'd6ebb0c3-f075-43f2-ac60-ac0d02858154', // nft id
  sub_token_ids: ['1', '2'], // sub token ids which need to be updated
  reserve: '3' // new nft sub tokens reserve in DELs
               // must be greater than the current nft sub token reserve
               // have to consider user's account balance in DEL, total reserve differences must be less than balance
}

await decimal.nftUpdateReserve(data, options);

Swap

Swap init

const data = {
  recipient: '0x45376AD024c767577714C7B92882578aE8B7f98C',
  amount: '1',
  tokenName: 'decimal',
  tokenSymbol: 'DEL',
  destChain: '2',
}
await decimal.msgSwapInit(data, options)

Swap redeem

const data = {
  from: '0x856F08B12cB844fa05CDF1eBfFd303B091D34d09',
  amount: '2',
  recipient: 'dx1twj64nphm8zl98uxv7gnt6xg4tpkk4gyr3tux9',
  tokenName: 'muh coin',
  transactionNumber: 'qqqqqqqq',
  tokenSymbol: 'coin',
  fromChain: '2',
  v: 0x1c,
  r: '0xb8b3eb4980e649a65b7e136fbcafda4d12e3b11a40d8aaa7d951e13fbe483579',
  s: '0x74de77f4a9f4045992cf6f220cff9be67a2c0332124e60af0a6791c9b0a64c36',
}
await decimal.msgSwapRedeem(data, options)

Multisig

multisigCreateWallet()

const data = {
  owners: ['dx13ykakvugqwzqqmqdj2j2hgqauxmftdn3kqy69g', 'dx1v9macmluxh7rk3zsd69v7dwv9fsjhctn2jfhz9'],
  weights: ['1', '1'],
  threshold: '2',
}

await decimal.multisigCreateWallet(data, options);

multisigCreateTx()

const data = {
  from: 'dx1am6ke3l79kjzdqhwgx37em04mzg686ekf9p3pq',
  to: 'dx13ykakvugqwzqqmqdj2j2hgqauxmftdn3kqy69g',
  coin: 'tdel',
  amount: '10',
}

await decimal.multisigCreateTx(data, options);

multisigSignTx()

const data = {
  txId: 'dxmstx1tqmjch2x5uk9wgnu8zl88rj6h4hy8rm8mtqfft'
}

await decimal.multisigSignTx(data, options);

Readme

Keywords

none

Package Sidebar

Install

npm i decimal-js-sdk

Weekly Downloads

8

Version

0.4.2

License

MIT

Unpacked Size

3.81 MB

Total Files

65

Last publish

Collaborators

  • decimalteam