@swipewallet/venus-js
Version:
A JavaScript SDK for Ethereum and the Venus Protocol.
244 lines (173 loc) • 7.25 kB
Markdown
A JavaScript SDK for Binance Smart Chain and the Venus Protocol. Wraps around [Ethers.js](https://github.com/ethers-io/ethers.js/). Works in the **web browser** and **Node.js**.
[](https://docs.venus.io/docs/venus-js)
This SDK is in **open beta**, and is constantly under development. **USE AT YOUR OWN RISK**.
JSON RPC based Binance Smart Chain **read** and **write**.
```js
const Venus = require('@swipewallet/venus-js'); // in Node.js
const vUsdtAddress = Venus.util.getAddress(Venus.vUSDT);
(async function() {
let supplyRatePerBlock = await Venus.eth.read(
vUsdtAddress,
'function supplyRatePerBlock() returns (uint)',
[], // [optional] parameters
{} // [optional] call options, provider, network, ethers.js "overrides"
);
console.log('USDT supplyRatePerBlock:', supplyRatePerBlock.toString());
})().catch(console.error);
```
```js
const toAddress = '0xa0df350d2637096571F7A701CBc1C5fdE30dF76A';
(async function() {
const trx = await Venus.eth.trx(
toAddress,
'function send() external payable',
[],
{
value: Venus._ethers.utils.parseEther('1.0'), // 1 ETH
provider: window.ethereum, // in a web browser
}
);
const toAddressEthBalance = await Venus.eth.getBalance(toAddress);
})().catch(console.error);
```
Simple methods for using the Venus protocol.
```js
const venus = new Venus(window.ethereum); // in a web browser
// Ethers.js overrides are an optional 3rd parameter for `supply`
// const trxOptions = { gasLimit: 250000, mantissa: false };
(async function() {
console.log('Supplying ETH to the Venus protocol...');
const trx = await venus.supply(Venus.ETH, 1);
console.log('Ethers.js transaction object', trx);
})().catch(console.error);
```
Web Browser
```html
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/@swipewallet/venus-js@latest/dist/browser/venus.min.js"></script>
<script type="text/javascript">
window.Venus; // or `Venus`
</script>
```
Node.js
```
npm install @swipewallet/venus-js
```
```js
const Venus = require('@swipewallet/venus-js');
// or, when using ES6
import Venus from '@swipewallet/venus-js';
```
- [Node.js](https://github.com/venusprotocol/venus-js/tree/master/examples)
- [Web Browser](https://github.com/venusprotocol/venus-js/examples/web/)
[](https://github.com/venusprotocol/venus-js/tree/master/examples)
The following are valid Binance Smart Chain providers for initialization of the SDK.
```js
var venus = new Venus(window.ethereum); // web browser
var venus = new Venus('http://127.0.0.1:8545'); // HTTP provider
var venus = new Venus(); // Uses Ethers.js fallback mainnet (for testing only)
var venus = new Venus('testnet'); // Uses Ethers.js fallback (for testing only)
// Init with private key (server side)
var venus = new Venus('http://127.0.0.1:8545', {
privateKey: '0x_your_private_key_', // preferably with environment variable
});
// Init with HD mnemonic (server side)
var venus = new Venus('mainnet' {
mnemonic: 'clutch captain shoe...', // preferably with environment variable
});
```
Names of contracts, their addresses, ABIs, token decimals, and more can be found in `/src/constants.ts`. Addresses, for all networks, can be easily fetched using the `getAddress` function, combined with contract name constants.
```js
console.log(Venus.BUSD, Venus.BNB, Venus.vSXP);
// BUSD, BNB, vSXP
const vUsdtAddress = Venus.util.getAddress(Venus.vUSDT);
// Mainnet vUSDT address. Second parameter can be a network like 'testnet'.
```
Parameters of number values can be plain numbers or their scaled up mantissa values. There is a transaction option boolean to tell the SDK what the developer is passing.
```js
// 1 BUSD
await venus.borrow(Venus.BUSD, '1000000000000000000', { mantissa: true });
// `mantissa` defaults to false if it is not specified or if an options object is not passed
await venus.borrow(Venus.BUSD, 1, { mantissa: false });
```
Each method that interacts with the blockchain accepts a final optional parameter for overrides, much like [Ethers.js overrides](https://docs.ethers.io/ethers.js/v5-beta/api-contract.html#overrides).
```js
// The options object itself and all options are optional
const trxOptions = {
mantissa, // Boolean, parameters array arg of 1 ETH would be '1000000000000000000' (true) vs 1 (false)
abi, // Definition string or an ABI array from a solc build
provider, // JSON RPC string, Web3 object, or Ethers.js fallback network (string)
network, // Ethers.js fallback network provider, "provider" has precedence over "network"
from, // Address that the Binance Smart Chain transaction is send from
gasPrice, // Ethers.js override `Venus._ethers.utils.parseUnits('10.0', 'gwei')`
gasLimit, // Ethers.js override - see https://docs.ethers.io/ethers.js/v5-beta/api-contract.html#overrides
value, // Number or string
data, // Number or string
chainId, // Number
nonce, // Number
privateKey, // String, meant to be used with `Venus.eth.trx` (server side)
mnemonic, // String, meant to be used with `Venus.eth.trx` (server side)
};
```
The [Venus API](https://docs.venus.io/docs/api) is accessible from Venus.js. The corresponding services are defined in the `api` namespace on the class.
- `Venus.api.account`
- `Venus.api.vToken`
- `Venus.api.marketHistory`
- `Venus.api.governance`
The governance method requires a second parameter (string) for the corresponding endpoint shown in the [documentation](https://docs.venus.io/docs/api#GovernanceService).
- `proposals`
- `voteReceipts`
- `accounts`
Here is an example for using the `account` endpoint. The `network` parameter in the request body is optional and defaults to `mainnet`.
```js
const main = async () => {
const account = await Venus.api.account({
"addresses": "0xB61C5971d9c0472befceFfbE662555B78284c307",
"network": "testnet"
});
let sxpBorrowBalance = 0;
if (Object.isExtensible(account) && account.accounts) {
account.accounts.forEach((acc) => {
acc.tokens.forEach((tok) => {
if (tok.symbol === Venus.vSXP) {
sxpBorrowBalance = +tok.borrow_balance_underlying.value;
}
});
});
}
console.log('sxpBorrowBalance', sxpBorrowBalance);
}
main().catch(console.error);
```
```
git clone git@github.com:venusprotocol/venus-js.git
cd venus-js/
npm install
npm run build
```
```html
<!-- Local build (do `npm install` first) -->
<script type="text/javascript" src="./dist/browser/venus.min.js"></script>
<!-- Public NPM -> jsdeliver build -->
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/@swipewallet/venus-js@latest/dist/browser/venus.min.js"></script>
```
```js
// Local build (do `npm install` first)
const Venus = require('./dist/nodejs/index.js');
// Public NPM build
const Venus = require('@swipewallet/venus-js');
```