Skip to main content

V2-SDK

About

The KoinDX v2-sdk is a node module which can be used to interact with the KoinDX v2 contracts.

NPM Package

Github

Getting Started

Installation

npm install @koindx/v2-sdk
tip

If you want to interact with the chain, you may want to install bignumber.js, dotenv and koilib as well.

npm install bignumber.js koilib dotenv

Import

Import the package in a Javascript or Typescript file.
Harbinger is a KoinDX Testnet. If you want to work on Mainnet, please use ChainId.MAINNET .

ES6 (import syntax)
import { ChainId } from "@koindx/v2-sdk";
console.log(ChainId.HARBINGER);
CommonJs (require syntax)
const SDK = require("@koindx/v2-sdk");
console.log(SDK.ChainId.HARBINGER);

Example

These examples demonstrate the basic usage of the KoinDX v2-sdk.

Fetch Token

Fetch TKOIN from Harbinger
import { ChainId, Fetcher } from "@koindx/v2-sdk";

let token = await Fetcher.fetchTokenData(ChainId.HARBINGER,"1FaSvLjQJsCJKq5ybmGsMMQs8RQYyVv8ju");
console.log(token);

Native Assets

KOIN and VHP are predefined assets in the SDK. You can directly create the currency objects without fetching them from the chain.

Using native assets
import { ChainId, TKOIN } from "@koindx/v2-sdk";

const tkoin = new TKOIN(ChainId.HARBINGER);
console.log(tkoin);

Fetch Pair

Only the chain id and two token currency objects are required to fetch the data a token pair from KoinDX. Some return values will be presented as a BigNumber object. The SDK works with BigNumber.js which you might want to use as well.

Fetching a liquidity pair
import { ChainId, Fetcher, TKOIN, VHP } from "@koindx/v2-sdk";

const tkoin = new TKOIN(ChainId.HARBINGER);
const vhp = new VHP(ChainId.HARBINGER);

let pair = await Fetcher.fetchPairData(ChainId.HARBINGER, tkoin, vhp);
console.log(pair);

Add liquidity

Add liquidity to an existing pool
import { Pool, ChainId, Fetcher, TKOIN, Percent, VHP } from "@koindx/v2-sdk";
import { Signer } from "koilib"
import BigNumber from "bignumber.js";
import 'dotenv/config'

// define slippage
const slippage = new Percent(new BigNumber("10"))
// create assets
const tkoin = new TKOIN(ChainId.HARBINGER);
const vhp = new VHP(ChainId.HARBINGER)
// create signer
const signer = Signer.fromWif(process.env.ACCOPUNT_PK);
// create pair
const PAIR_VHPKOIN = await Fetcher.fetchPairData(ChainId.HARBINGER, tkoin, vhp)
// create pool
let pool = new Pool(PAIR_VHPKOIN);

let result = pool.addLiquidity(tkoin, new BigNumber("100000"), slippage)
let data = {
from: signer.getAddress(),
receiver: signer.getAddress(),
token_a: result.token_a.address,
token_b: result.token_b.address,
amount_a_desired: result.amount_a_desired.toFixed(0, 1),
amount_b_desired: result.amount_b_desired.toFixed(0, 1),
amount_a_min: result.amount_a_min.toFixed(0, 1),
amount_b_min: result.amount_b_min.toFixed(0, 1)
}
console.log(data)

Trade

This example shows how the Router object is used and how Koilib can be configured to execute a trade through the KoinDX Periphery contract. Besides the V2-SDK and koilib this example code uses dotenv and bignumber.js.

Retreive the path for the Router and then execute the transaction
import { ChainId, Fetcher, TKOIN, Percent, CHAIN_TO_PROVIDER_MAP, Router, VHP, PeripheryAbi, CHAIN_TO_ADDRESSES_MAP } from "@koindx/v2-sdk";
import { Signer, Contract, Transaction } from "koilib"
import BigNumber from "bignumber.js";
import 'dotenv/config'

// provider
const provider = CHAIN_TO_PROVIDER_MAP[ChainId.HARBINGER]
// define slippage
const slippage = new Percent(new BigNumber("10"))
// create asset
const tkoin = new TKOIN(ChainId.HARBINGER);
const vhp = new VHP(ChainId.HARBINGER)
// create signer
const signer = Signer.fromWif(process.env.ACCOPUNT_PK);
// set provider
signer.provider = provider
// create pair
const PAIR_VHPKOIN = await Fetcher.fetchPairData(ChainId.HARBINGER, tkoin, vhp)


/**
* TRADE
* */
// create the route by adding the trading pairs and relevant Currencies parameters
// in this example: VHP/KOIN Pair and the input currency VHP
// A route through multiple pairs (vhp to KoinDX token) would look like this:
// let router = new Router([ PAIR_VHPKOIN, PAIR_KOINKOINDX ], vhp, koindx)
let router = new Router([PAIR_VHPKOIN], vhp)
// get the data which will be the parameters for our contract call
let result = router.tradeExactIn(new BigNumber("100000"), slippage)
let data = {
from: signer.getAddress(),
receiver: signer.getAddress(),
amountIn: result.amount_in.toFixed(0, 1),
amountOutMin: result.amount_out_min.toFixed(0, 1),
path: result.path.map(token => token.address)
}
console.log(data)

/**
* FINAL PROCESS
*/
// get the addresses related to the correct chainId
let address = CHAIN_TO_ADDRESSES_MAP[ChainId.HARBINGER]
// setup periphery contract
let periphery = new Contract({
id: address.periphery,
abi: PeripheryAbi,
provider: provider,
})
// set only operation
periphery.options.onlyOperation = true;
// define configs
let configs = { payer: signer.getAddress() };
// create new Transaction
const tx = new Transaction({ signer })
// add a swap_tokens_in operation
tx.pushOperation(periphery.functions.swap_tokens_in(data, configs))
// send the Transaction
const receipt = await tx.send();
await tx.wait();

console.log(receipt)