Security News
pnpm 10.0.0 Blocks Lifecycle Scripts by Default
pnpm 10 blocks lifecycle scripts by default to improve security, addressing supply chain attack risks but sparking debate over compatibility and workflow changes.
@compound-finance/compound-js
Advanced tools
A JavaScript SDK for Ethereum and the Compound Protocol. Wraps around Ethers.js. Works in the web browser and Node.js.
This SDK is in open beta, and is constantly under development. USE AT YOUR OWN RISK.
JSON RPC based Ethereum read and write.
const Compound = require('@compound-finance/compound-js'); // in Node.js
const cUsdtAddress = Compound.util.getAddress(Compound.cUSDT);
(async function() {
let supplyRatePerBlock = await Compound.eth.read(
cUsdtAddress,
'function supplyRatePerBlock() returns (uint)',
[], // [optional] parameters
{} // [optional] call options, provider, network, ethers.js "overrides"
);
console.log('USDT supplyRatePerBlock:', supplyRatePerBlock.toString());
})().catch(console.error);
const toAddress = '0xa0df350d2637096571F7A701CBc1C5fdE30dF76A';
(async function() {
const trx = await Compound.eth.trx(
toAddress,
'function send() external payable',
[],
{
value: Compound._ethers.utils.parseEther('1.0'), // 1 ETH
provider: window.ethereum, // in a web browser
}
);
const toAddressEthBalance = await Compound.eth.getBalance(toAddress);
})().catch(console.error);
Simple methods for using the Compound protocol.
const compound = new Compound(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 Compound protocol...');
const trx = await compound.supply(Compound.ETH, 1);
console.log('Ethers.js transaction object', trx);
})().catch(console.error);
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; // or `Compound`
</script>
Node.js
npm install @compound-finance/compound-js
const Compound = require('@compound-finance/compound-js');
To run, boot Ganache fork of mainnet locally
The following are valid Ethereum providers for initialization of the SDK.
var compound = new Compound(window.ethereum); // web browser
var compound = new Compound('http://127.0.0.1:8545'); // HTTP provider
var compound = new Compound(); // Uses Ethers.js fallback mainnet (for testing only)
var compound = new Compound('ropsten'); // Uses Ethers.js fallback (for testing only)
// Init with private key (server side)
var compound = new Compound('https://mainnet.infura.io/v3/_your_project_id_', {
privateKey: '0x_your_private_key_', // preferably with environment variable
});
// Init with HD mnemonic (server side)
var compound = new Compound('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.
console.log(Compound.DAI, Compound.ETH, Compound.cETH);
// DAI, ETH, cETH
const cUsdtAddress = Compound.util.getAddress(Compound.cUSDT);
// Mainnet cUSDT address. Second parameter can be a network like 'ropsten'.
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.
// 1 Dai
await compound.borrow(Compound.DAI, '1000000000000000000', { mantissa: true });
// `mantissa` defaults to false if it is not specified or if an options object is not passed
await compound.borrow(Compound.DAI, 1, { mantissa: false });
Each method that interacts with the blockchain accepts a final optional parameter for overrides, much like Ethers.js overrides.
// 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 Ethereum transaction is send from
gasPrice, // Ethers.js override `Compound_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 `Compound.eth.trx` (server side)
mnemonic, // String, meant to be used with `Compound.eth.trx` (server side)
};
The Compound API is accessible from Compound.js. The corresponding services are defined in the api
namespace on the class.
Compound.api.account
Compound.api.cToken
Compound.api.marketHistory
Compound.api.governance
The governance method requires a second parameter (string) for the corresponding endpoint shown in the documentation.
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
.
const main = async () => {
const account = await Compound.api.account({
"addresses": "0xB61C5971d9c0472befceFfbE662555B78284c307",
"network": "ropsten"
});
let daiBorrowBalance = 0;
if (Object.isExtensible(account) && account.accounts) {
account.accounts.forEach((acc) => {
acc.tokens.forEach((tok) => {
if (tok.symbol === Compound.cDAI) {
daiBorrowBalance = +tok.borrow_balance_underlying.value;
}
});
});
}
console.log('daiBorrowBalance', daiBorrowBalance);
}
main().catch(console.error);
git clone git@github.com:compound-finance/compound-js.git
cd compound-js/
npm install
npm run build
<!-- Local build (do `npm install` first) -->
<script type="text/javascript" src="./dist/browser/compound.min.js"></script>
<!-- Public NPM -> jsdeliver build -->
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/@compound-finance/compound-js@latest/dist/browser/compound.min.js"></script>
// Local build (do `npm install` first)
const Compound = require('./dist/nodejs/index.js');
// Public NPM build
const Compound = require('@compound-finance/compound-js');
FAQs
A JavaScript SDK for Ethereum and the Compound Protocol.
The npm package @compound-finance/compound-js receives a total of 75 weekly downloads. As such, @compound-finance/compound-js popularity was classified as not popular.
We found that @compound-finance/compound-js demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 3 open source maintainers collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
pnpm 10 blocks lifecycle scripts by default to improve security, addressing supply chain attack risks but sparking debate over compatibility and workflow changes.
Product
Socket now supports uv.lock files to ensure consistent, secure dependency resolution for Python projects and enhance supply chain security.
Research
Security News
Socket researchers have discovered multiple malicious npm packages targeting Solana private keys, abusing Gmail to exfiltrate the data and drain Solana wallets.