- 🟡 client - client that implements Fury transactions and messages.
- 🟡 tx - Highbury transaction types.
- 🟢 msg - Highbury message types.
- 🟡 crypto - core cryptographic functions.
- 🟢 utils - utility functions such as client-side secret generation.
Proceed with Caution
Due to limited resources on our team, some parts of the SDK are better maintained than others.
- 🟡 Modules marked yellow are partially maintained and may be only partially functional.
- 🟢 Modules marked green are best maintained and most reliable. Functionality should be up-to-date and functional in the latest stable or beta release.
We welcome outside contributions to help keep the SDK as useful and up-to-date as possible.
Install the package via npm.
The client requires an address mnemonic and the url of Highbury’s REST api endpoint.
The following selected examples demonstrate basic client usage. Detailed examples can be found in the
examples directory of the repository. It contains complete code examples for transferring funds from Binance Chain to Fury, opening a CDP, and transferring funds back to Binance Chain.
// Import Fury and initialize client... // Load coins and transfer to recipient's address const coins = Fury.utils.formatCoins(1, 'fury'); const recipient = 'fury1c84ezutjcgrsxarjq5mzsxxz2k9znn94zxmqjz'; const txHash = await client.transfer(recipient, coins); // Check the resulting tx hash const txRes = await client.checkTxHash(txHash, 15000); // 15 second timeout console.log('Tx result:', txRes.raw_log);
Collateralized debt positions have a minimum value of 10 USD and must be overcollateralized above a certain percentage threshold.
While USDF has 6 decimals, our example collateral coin BNB has 8. We’ll need to apply each asset’s conversion factor before sending the transaction.
const BNB_CONVERSION_FACTOR = 10 ** 8; const USDF_CONVERSION_FACTOR = 10 ** 6; // Apply conversion factor const principalAmount = 10 * USDF_CONVERSION_FACTOR; const collateralAmount = 2 * BNB_CONVERSION_FACTOR; // Load principal, collateral as formatted coins and set up collateral type const principal = Fury.utils.formatCoin(principalAmount, 'usdf'); const collateral = Fury.utils.formatCoin(collateralAmount, 'bnb'); const collateralType = 'bnb-a'; // Send create CDP tx using Fury client const txHashCDP = await client.createCDP(principal, collateral, collateralType); console.log('Create CDP tx hash (Fury): '.concat(txHashCDP)); // Check the tx hash const txRes = await client.checkTxHash(txHashCDP, 15000); console.log('\nTx result:', txRes);
Transferring funds to Highbury
Highbury supports secure transfers of BNB from Binance Chain to Highbury and back via atomic swaps. The bep3-deputy process sits between the two blockchains and services swaps by relaying information back and forth.
Swaps use a simple secret sharing scheme. A secret random number is generated on the client and hashed with a timestamp in order to create a random number hash that’s stored with the swap. The swap can be securely claimed on the opposite chain using the secret random number. Swaps expire after n blocks, a duration that can be modified via the height span parameter. Once expired, the swap can be refunded.
BEP3 transfer user steps
- Create an atomic swap on Binance Chain (note: atomic swaps are called HTLTs on Binance Chain) The deputy will automatically relay the swap from Highbury to Binance Chain 2a. Claim the atomic swap on Highbury within swap’s height span. Users have about 30 minutes to claim a swap after it is created. 2b. Refund the atomic swap on Highbury after the swap’s height span - this happens if the swap is not claimed in time.
In order for an address to submit a swap on Highbury it must hold pegged bnb tokens. The Binance Chain docs describe how to create a swap on Binance Chain with BNB. When creating the swap on Binance Chain make sure to use the deputy’s Binance Chain address as the swap’s
recipient and the deputy’s Highbury address as the swap’s
senderOtherChain or the deputy will not relay the swap.
Users create outgoing swaps on Highbury by entering the deputy’s Highbury address in the recipient field. The following example is for the testnet. See full code examples for creating and claiming a swap between Fury and Binance Chain, see
outgoing_swap.js in the examples folder.
// Import utils const utils = fury.utils; // Declare addresses involved in the swap const recipient = 'fury1tfvn5t8qwngqd2q427za2mel48pcus3z9u73fl'; // deputy's address on Highbury testnet const recipientOtherChain = 'tbnb1hc0gvpxgw78ky9ay6xfql8jw9lry9ftc5g7ddj'; // user's address on bnbchain testnet const senderOtherChain = 'tbnb1mdvtph9y0agm4nx7dcl86t7nuvt5mtcul8zld6'; // deputy's address on bnbchain testnet // Set up swap parameters const amount = 1000000; const asset = 'bnb'; const coins = utils.formatCoins(amount, asset); const heightSpan = '250'; // Generate random number hash from timestamp and hex-encoded random number const randomNumber = utils.generateRandomNumber(); const timestamp = Math.floor(Date.now() / 1000); const randomNumberHash = utils.calculateRandomNumberHash( randomNumber, timestamp ); console.log('\nSecret random number:', randomNumber.toUpperCase()); // Calculate the expected swap ID on Highbury const furySwapID = utils.calculateSwapID( randomNumberHash, client.wallet.address, senderOtherChain ); console.log('Expected Fury swap ID:', furySwapID); // Calculate the expected swap ID on Bnbchain const bnbchainSwapID = utils.calculateSwapID( randomNumberHash, senderOtherChain, client.wallet.address ); console.log('Expected Bnbchain swap ID:', bnbchainSwapID); // Create the swap console.log('Sending createSwap transaction...'); const txHash = await client.createSwap( recipient, recipientOtherChain, senderOtherChain, randomNumberHash, timestamp, coins, heightSpan ); // Check the claim tx hash const txRes = await client.checkTxHash(txHash, 15000); console.log('\nTx result:', txRes.raw_log);
Only active swaps can be claimed. Anyone can send the claim request, but funds will only be released to the intended recipient if the secret random number matches the random number hash. A successful claim sends funds exclusively to the intended recipient’s address.
// Use the secret random number from swap creation const randomNumber = 'e8eae926261ab77d018202434791a335249b470246a7b02e28c3b2fb6ffad8f3'; const swapID = 'e897e4ee12b4d6ec4776a5d30300a7e3bb1f62b0c49c3e05ad2e6aae1279c940'; const txHash = await client.claimSwap(swapID, randomNumber);
Only expired swaps can be refunded. Anyone can send the refund request, but funds are always returned to the swap’s original creator.
const swapID = 'e897e4ee12b4d6ec4776a5d30300a7e3bb1f62b0c49c3e05ad2e6aae1279c940'; const txHash = await client.refundSwap(swapID);