Compound.js
A JavaScript SDK for Ethereum and the Compound Protocol. Wraps around Ethers.js. Works in the web browser and Node.js.
Compound.js Documentation
This SDK is in open beta, and is constantly under development. USE AT YOUR OWN RISK.
Ethereum Read & Write
JSON RPC based Ethereum read and write.
Read
const Compound = require('@compound-finance/compound-js');
const cUsdtAddress = Compound.util.getAddress(Compound.cUSDT);
(async function() {
let supplyRatePerBlock = await Compound.eth.read(
cUsdtAddress,
'function supplyRatePerBlock() returns (uint)',
[],
{}
);
console.log('USDT supplyRatePerBlock:', supplyRatePerBlock.toString());
})().catch(console.error);
Write
const toAddress = '0xa0df350d2637096571F7A701CBc1C5fdE30dF76A';
(async function() {
const trx = await Compound.eth.trx(
toAddress,
'function send() external payable',
[],
{
value: Compound._ethers.utils.parseEther('1.0'),
provider: window.ethereum,
}
);
const toAddressEthBalance = await Compound.eth.getBalance(toAddress);
})().catch(console.error);
Compound Protocol
Simple methods for using the Compound protocol.
const compound = new Compound(window.ethereum);
(async function() {
console.log('Supplying ETH to the Compound protocol...');
const trx = await compound.supply(Compound.ETH, 1);
console.log('Ethers.js transaction object', trx);
})().catch(console.error);
Install / Import
Web Browser
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/@compound-finance/compound-js@latest/dist/browser/compound.min.js"></script>
<script type="text/javascript">
window.Compound;
</script>
Node.js
npm install ethers @compound-finance/compound-js
const Compound = require('@compound-finance/compound-js');
import Compound from '@compound-finance/compound-js';
More Code Examples
See the docblock comments above each function definition or the official Compound.js Documentation.
Instance Creation
The following are valid Ethereum providers for initialization of the SDK (v2 and Comet instance).
var compound = new Compound(window.ethereum);
var compound = new Compound('http://127.0.0.1:8545');
var compound = new Compound();
var compound = new Compound('goerli');
var compound = new Compound('https://mainnet.infura.io/v3/_your_project_id_', {
privateKey: '0x_your_private_key_',
});
var compound = new Compound('mainnet' {
mnemonic: 'clutch captain shoe...',
});
Comet
Compound III (Comet) object initialization. The constructor accepts the same parameters as the Compound
constructor. An error will be thrown initially and whenever a method is called if the provider does not match the network of the specific Comet deployment. The SDK constants as well as a method in the Comet documentation note the Comet deployments that Compound.js supports.
var compound = new Compound(window.ethereum);
var comet = compound.comet.MAINNET_USDC();
Constants and Contract Addresses
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.
console.log(Compound.DAI, Compound.ETH, Compound.cETH);
const cUsdtAddress = Compound.util.getAddress(Compound.cUSDT);
Mantissas
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.
await compound.borrow(Compound.DAI, '1000000000000000000', { mantissa: true });
await compound.borrow(Compound.DAI, 1, { mantissa: false });
Transaction Options
Each method that interacts with the blockchain accepts a final optional parameter for overrides, much like Ethers.js overrides.
const trxOptions = {
mantissa,
abi,
provider,
network,
from,
gasPrice,
gasLimit,
value,
data,
chainId,
nonce,
privateKey,
mnemonic,
};
Test
Tests are available in ./test/*.test.js
. The tests are configured in ./test/index.js
. Methods are tested using a forked chain using ganache-core. A JSON RPC provider URL needs to be configured as an environment variable before running the tests (MAINNET_PROVIDER_URL
). Archive state must be available to run the tests. For free archive node access, get a provider URL from Alchemy.
## Run all tests
npm test
## Run a single test (Mocha JS grep option)
npm test -- -g 'runs eth.getBalance'
Build for Node.js & Web Browser
git clone git@github.com:compound-finance/compound-js.git
cd compound-js/
npm install
npm run build
Web Browser Build
<script type="text/javascript" src="./dist/browser/compound.min.js"></script>
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/@compound-finance/compound-js@latest/dist/browser/compound.min.js"></script>
Node.js Build
const Compound = require('./dist/nodejs/index.js');
const Compound = require('@compound-finance/compound-js');