Building with Kyber Network
For better liquidity and enhanced Token utility!
What is the Kyber Network?
There are tons of tokens out there, yet they all strive for maxium liquidity and utility. For example, if you have token ‘X’, then you can use this token on its ‘X’ platform. This limits the token’s usage! The Kyber network solves this by creating a token reserve so you can swap tokens in real-time. So now if a website accepts DAI for payments, but you have only OMG, you can pay with OMG, which will get swapped in real-time to DAI.
The Kyber Protocol brings token inventories and prices on-chain, hence allowing developers to directly embed value exchanges into their smart-contracts without any technical or security overhead.
This allows for:
- Instant confirmation
- Operation certainty (there is no transactional risk, settlement uncertainty or counterparty risk)
- Global and diverse pool of different tokens
Swap Tokens using Kyber Network
We will go through the Kyber network workshop demo and swap tokens using Kyber network smart-contracts.
Set up:
- Install NodeJs
- Install Ganache-Cli
sudo npm install -g ganache-cli
- Install Truffle
sudo npm install -g truffle@latest
Clone Repository:
git clone https://github.com/KyberNetwork/workshop.git
Repository Overview
Let’s see what we’ve got in the repository:
config — Configs used by Kyber contracts for “migrations”. These configs are parameters used by contracts once deployed.
contracts — Kyber network contracts, examples and some mock token and contracts for testing purposes.
examples —This is a key directory which we will use throughout this tutorial. This contains the Kyber network example.
- Truffle — This contains a JS file which we can use with truffle-cli or in a Truffle project.
- Web3 — This contains normal JS files, which you can with
node
command - Solidity — A contract written in Solidity, which we will use with Truffle console.
migrations — Contains migration script to set up and deploy Kyber network contracts.
Kyber network set up and contract migrations:
Now we will set up Kyber network contracts.
We will use a predefined mnemonic, so we don’t need to configure addresses for the contract and for our wallet. Run this command to start Ganache:
ganache-cli --accounts 10 --defaultBalanceEther 1000 --mnemonic 'gesture rather obey video awake genuine patient base soon parrot upset lounge' --networkId 5777 --debug
Run Migration:
Before starting, we need to deploy all of our contracts. For that we need to run the migration:
truffle migrate --network development
This will take some time…
We are using a predefined mnemonic, so you will get the same addresses defined below:
Running Truffle example:
Let's run an example from truffle directory.
truffle exec examples/truffle/getExpectedRate.js
This will give us the exchange rates but with different configured tokens.
Running Web3 example:
Let’s get the exchange rate again — but this time, we will use NodeJs.
cd examples/web3
node getExpectedRate.js
Using solidity contract for swapping token:
Now let’s swap tokens by interacting with Kyber network contracts.
We will swap KNC (Kyber Network Token) with OMG (OmiseGO Token).
Remember, you can do the same with using Web3 and Truffle examples, but running the test with Truffle console is a lot easier and interactive. So let’s get truffle console:
truffle console
Our user address is 0x47a793D7D0AA5727095c3Fe132a6c1A46804c8D2
— this we will use again, so let’s assign it to a variable:
let userWallet = '0x47a793D7D0AA5727095c3Fe132a6c1A46804c8D2'
We have a Trade.sol in our Solidity folder, which we help us in swapping the token. You can check out the code for the contract: examples > solidity > Trade.sol.
Now, we need to get an instance for that Contract:
let tradeInstance = await Trade.at(Trade.address)
Next, as we are going to swap KNC with OMG, let's get the Instance for both contracts. You can find these token contract undercontracts → mockTokens
. These are mock ERC20 tokens. In production, you will need actual contract address for these tokens on ETH MainNet.
let kncInstance = await KyberNetworkCrystal.at(KyberNetworkCrystal.address)let omgInstance = await OmiseGo.at(OmiseGo.address)
Now, let’s get our balance for each token:
let kycBalance1 = (await kncInstance.balanceOf(userWallet)).toString()let omgBalance1 = (await omgInstance.balanceOf(userWallet)).toString()
You can check these balance by running:
kycBalance1
omgBalance1
Now, we need to give Trade contract approval to withdraw tokens from our contract:
await kncInstance.approve(tradeInstance.address , web3.utils.toWei('100000'), {from : userWallet})
We can now swap tokens! Let’s look at the Trade.sol
method, which we will use to swap the tokens:
function execSwap( ERC20 srcToken, uint srcQty, ERC20 destToken, address destAddress, uint maxDestAmount)
Here,
srcToken — source token contract address
srcQty — amount of source tokens
destToken — destination token contract address
destAddress — address to send swapped tokens to
maxDestAmount — address to send swapped tokens to
So let’s call the method accordingly:
tradeInstance.execSwap(kncInstance.address, web3.utils.toWei("100") , omgInstance.address,userWallet, web3.utils.toWei("1000000"), {from: userWallet})
If you have followed the tutorial ‘till now, you have successfully swapped two tokens using Kyber Network protocol!
Let’s verify our token balance again:
let kycBalance2 = (await kncInstance.balanceOf(userWallet)).toString()let omgBalance2 = (await omgInstance.balanceOf(userWallet)).toString()kycBalance2
omgBalance2
You will see the change in balance. Here is a video demo for the above tutorial.
Conclusion
If you faced any problem you can check here or ask questions in Kyber’s network telegram group. Kyber also has good documentation. So, what are you waiting for? Integrate your Dapp with Kyber network!
Let us know what you want to learn about in the comment section.👇
About QuikNode
QuikNode is building infrastructure to support the future of Web3. Since 2017, we’ve worked with hundreds of developers & companies, helping scale dApps and providing high-performance Ethereum nodes. We’re working on something interesting from the past few months and will be launching soon, so subscribe our newsletter for more updates!! 😃