Wait to talk about what Band Protocol is, I will go straight to its use, maybe this is the piece that you are always looking for for your Dapp. Band protocol supports contracts that communicate with data from the outside world such as weather, sports, stock value data, exchange rate and of course the indispensable rate of crypto currencies . Band Protocol belongs to Oracle system similar to Chainlink.
Introduce
In this article, I will guide mainly on getting the values of cryptocurrencies and foreign exchange rates and how to integrate them into your applications.
I will guide you to integrate oracle data of Band into Smart Contract through StdReference contract and Frontend through bandchain.js library
Integrated on Smart Contract
Theory
To get price data from Oracle of the band via smart contract, we can use StdReference contract. This contract has 2 functions to support data retrieval, getReferenceData and getReferenceDataBulk.
The function getReferenceData will take 2 input values, base and quote . It will query on the StdReference contract with 2 input parameters and return the value between these two pairs as struct ReferenceData data. This data looks like this:
1 2 3 4 5 6 |
struct ReferenceData <span class="token punctuation">{</span> uint256 rate <span class="token punctuation">;</span> <span class="token comment">// Giá trị tỉ lệ base/quote, đã được nhân với 1e18.</span> uint256 lastUpdatedBase <span class="token punctuation">;</span> <span class="token comment">// Mốc thời gian gần nhất giá trị của base được update theo UNIX time.</span> uint256 lastUpdatedQuote <span class="token punctuation">;</span> <span class="token comment">// Mốc thời gian gần nhất giá trị của quote được update theo UNIX time.</span> <span class="token punctuation">}</span> |
Similar to getReferenceData , the getReferenceDataBulk function will take a bulk of data instead of a pair, it will take the input of an array of bases and a corresponding quote array. For example, input 2 arrays [‘ETH’, ‘BTC’, ‘BNB’] and [‘USD’, ‘KNC’, ‘DAI’], the output will be an array of ReferenceData similar to the pairs:
- ETH / USD
- BTC / KNC
- BNB / DAI
Practice
To practice using the StdReference smart contract, Band Protocol has supported deploying a contract on Kovan testnet , you can test directly on Remix: https://remix.ethereum.org/
StdReference’s address on Kovan : 0xDA7a001b254CD22e46d3eAB04d937489c93174C3
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
pragma solidity <span class="token number">0.6</span> <span class="token number">.11</span> <span class="token punctuation">;</span> pragma experimental ABIEncoderV2 <span class="token punctuation">;</span> <span class="token keyword">interface</span> <span class="token class-name">IStdReference</span> <span class="token punctuation">{</span> <span class="token comment">/// A structure returned whenever someone requests for standard reference data.</span> struct ReferenceData <span class="token punctuation">{</span> uint256 rate <span class="token punctuation">;</span> <span class="token comment">// base/quote exchange rate, multiplied by 1e18.</span> uint256 lastUpdatedBase <span class="token punctuation">;</span> <span class="token comment">// UNIX epoch of the last time when base price gets updated.</span> uint256 lastUpdatedQuote <span class="token punctuation">;</span> <span class="token comment">// UNIX epoch of the last time when quote price gets updated.</span> <span class="token punctuation">}</span> <span class="token comment">/// Returns the price data for the given base/quote pair. Revert if not available.</span> <span class="token keyword">function</span> <span class="token function">getReferenceData</span> <span class="token punctuation">(</span> <span class="token parameter">string memory _base <span class="token punctuation">,</span> string memory _quote</span> <span class="token punctuation">)</span> external view <span class="token function">returns</span> <span class="token punctuation">(</span> ReferenceData memory <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">/// Similar to getReferenceData, but with multiple base/quote pairs at once.</span> <span class="token keyword">function</span> <span class="token function">getReferenceDataBulk</span> <span class="token punctuation">(</span> <span class="token parameter">string <span class="token punctuation">[</span> <span class="token punctuation">]</span> memory _bases <span class="token punctuation">,</span> string <span class="token punctuation">[</span> <span class="token punctuation">]</span> memory _quotes</span> <span class="token punctuation">)</span> external view <span class="token function">returns</span> <span class="token punctuation">(</span> ReferenceData <span class="token punctuation">[</span> <span class="token punctuation">]</span> memory <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> contract DemoOracle <span class="token punctuation">{</span> IStdReference ref <span class="token punctuation">;</span> uint256 <span class="token keyword">public</span> price <span class="token punctuation">;</span> <span class="token function">constructor</span> <span class="token punctuation">(</span> IStdReference _ref <span class="token punctuation">)</span> <span class="token keyword">public</span> <span class="token punctuation">{</span> ref <span class="token operator">=</span> _ref <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">function</span> <span class="token function">getPrice</span> <span class="token punctuation">(</span> <span class="token parameter">string _base <span class="token punctuation">,</span> string _quote</span> <span class="token punctuation">)</span> external view <span class="token function">returns</span> <span class="token punctuation">(</span> <span class="token parameter">uint256</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> IStdReference <span class="token punctuation">.</span> ReferenceData memory data <span class="token operator">=</span> ref <span class="token punctuation">.</span> <span class="token function">getReferenceData</span> <span class="token punctuation">(</span> _base <span class="token punctuation">,</span> _quote <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">return</span> data <span class="token punctuation">.</span> rate <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
Next, you deploy the DemoOracle contract with the constructor’s input argument which is the address of stdReference on Kovan: 0xDA7a001b254CD22e46d3eAB04d937489c93174C3
From there it is possible to test the getPrice function with 2 input arguments as crypto pairs.
Integration on Webapp
Theory
Similar to the integration for smart contracts, for integration on the Webapp we will use the bandchain.js package. However, this package currently supports only bulk pricing, which means the input will receive 2 arrays of pairs you want to get the corresponding rate.
Basically, the bandchain.js package is no different from using the binance or coinbase pricing APIs, but for Dapp applications that have integrated band in smart contracts, you should also recommend using bandchain.js for interface part
Practice
First create a node js file:
index.js :
1 2 3 4 5 6 7 8 9 10 |
<span class="token keyword">const</span> BandChain <span class="token operator">=</span> <span class="token function">require</span> <span class="token punctuation">(</span> <span class="token string">'@bandprotocol/bandchain.js'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">(</span> <span class="token keyword">async</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token keyword">const</span> endpoint <span class="token operator">=</span> <span class="token string">'https://poa-api.bandchain.org'</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> bandchain <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">BandChain</span> <span class="token punctuation">(</span> endpoint <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> price <span class="token operator">=</span> <span class="token keyword">await</span> bandchain <span class="token punctuation">.</span> <span class="token function">getReferenceData</span> <span class="token punctuation">(</span> <span class="token punctuation">[</span> <span class="token string">'BAND/USD'</span> <span class="token punctuation">,</span> <span class="token string">'BTC/ETH'</span> <span class="token punctuation">,</span> <span class="token string">'EUR/USD'</span> <span class="token punctuation">,</span> <span class="token string">'EUR/BTC'</span> <span class="token punctuation">]</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> price <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
The above endpoint will point to a node to query crypto pairs.
Test the code above
1 2 |
node index.js |
The result will be the values of the corresponding pairs:
So this time I want to share how you can quickly integrate the band protocol into blockchain applications related to the value of crypto currencies. In the next article I will explain more about the operating principles of the band protocol.