Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/curvefi/curve-lending-js
JavaScript library for Curve Lending
https://github.com/curvefi/curve-lending-js
Last synced: about 2 months ago
JSON representation
JavaScript library for Curve Lending
- Host: GitHub
- URL: https://github.com/curvefi/curve-lending-js
- Owner: curvefi
- License: mit
- Created: 2024-01-25T18:13:37.000Z (12 months ago)
- Default Branch: master
- Last Pushed: 2024-11-05T17:37:16.000Z (2 months ago)
- Last Synced: 2024-11-11T07:07:42.774Z (about 2 months ago)
- Language: TypeScript
- Size: 506 KB
- Stars: 1
- Watchers: 3
- Forks: 3
- Open Issues: 3
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# CURVE LENDING JS
## Setup
Install from npm:
`npm install @curvefi/lending-api`
## Init
```ts
import lending from "@curvefi/lending-api";(async () => {
// 1. Dev
await lending.init('JsonRpc', {url: 'http://localhost:8545/', privateKey: ''}, { gasPrice: 0, maxFeePerGas: 0, maxPriorityFeePerGas: 0, chainId: 1 });
// OR
await lending.init('JsonRpc', {}, {}); // In this case JsonRpc url, privateKey, fee data and chainId will be specified automatically// 2. Infura
lending.init("Infura", { network: "homestead", apiKey: }, { chainId: 1 });
// 3. Web3 provider
lending.init('Web3', { externalProvider: }, { chainId: 1 });
})()
```
**Note 1.** ```chainId``` parameter is optional, but you must specify it in the case you use Metamask on localhost network, because Metamask has that [bug](https://hardhat.org/metamask-issue.html)**Note 2.** Web3 init requires the address. Therefore, it can be initialized only after receiving the address.
**Wrong ❌️**
```tsx
import type { FunctionComponent } from 'react'
import { useState, useMemo } from 'react'
import { providers } from 'ethers'
import Onboard from 'bnc-onboard'
import type { Wallet } from 'bnc-onboard/dist/src/interfaces'
import lending from '@curvefi/lending-api'...
const WalletProvider: FunctionComponent = ({ children }) => {
const [wallet, setWallet] = useState()
const [provider, setProvider] = useState()
const [address, setAddress] = useState()const networkId = 1
const onboard = useMemo(
() =>
Onboard({
dappId: DAPP_ID,
networkId,subscriptions: {
address: (address) => {
setAddress(address)
},wallet: (wallet) => {
setWallet(wallet)
if (wallet.provider) {
lending.init("Web3", { externalProvider: wallet.provider }, { chainId: networkId })
}
},
},
walletSelect: {
wallets: wallets,
},
}),
[]
)...
```**Right ✔️**
```tsx
import type { FunctionComponent } from 'react'
import { useState, useMemo, useEffect } from 'react'
import { providers } from 'ethers'
import Onboard from 'bnc-onboard'
import type { Wallet } from 'bnc-onboard/dist/src/interfaces'
import lending from '@curvefi/lending-api'...
const WalletProvider: FunctionComponent = ({ children }) => {
const [wallet, setWallet] = useState()
const [provider, setProvider] = useState()
const [address, setAddress] = useState()const networkId = 1
const onboard = useMemo(
() =>
Onboard({
dappId: DAPP_ID,
networkId,subscriptions: {
address: (address) => {
setAddress(address)
},wallet: (wallet) => {
setWallet(wallet)
},
},
walletSelect: {
wallets: wallets,
},
}),
[]
)useEffect(() => {
if (address && wallet?.provider) {
lending.init("Web3", { externalProvider: wallet.provider }, { chainId: networkId })
}
}, [address, wallet?.provider]);...
```## Notes
- 1 Amounts can be passed in args either as numbers or strings.
- 2 oneWayMarket.swap**PriceImpact** method returns %, e. g. 0 < priceImpact <= 100.
- 3 Slippage arg should be passed as %, e. g. 0 < slippage <= 100.## General methods
```ts
import lending from "@curvefi/lending-api";(async () => {
await lending.init('JsonRpc', {});const balances1 = await lending.getBalances(['sdt', 'weth']);
// OR const balances1 = await lending.getBalances(['0x361a5a4993493ce00f61c32d4ecca5512b82ce90', '0x7ceb23fd6bc0add59e62ac25578270cff1b9f619']);
//['80980.0', '99.0']// You can specify address
const balances2 = await lending.getBalances(['sdt', 'weth'], "0x0063046686E46Dc6F15918b61AE2B121458534a5");
// OR const balances2 = await lending.getBalances(['0x361a5a4993493ce00f61c32d4ecca5512b82ce90', '0x7ceb23fd6bc0add59e62ac25578270cff1b9f619'], '0x0063046686E46Dc6F15918b61AE2B121458534a5');
//['0.0', '0.0']const spender = "0x136e783846ef68C8Bd00a3369F787dF8d683a696"
await lending.getAllowance(['sdt', 'weth'], lending.signerAddress, spender);
//['0.0', '0.0']
await lending.hasAllowance(['sdt', 'weth'], ['1000', '1000'], lending.signerAddress, spender);
//false
await lending.ensureAllowance(['sdt', 'weth'], ['1000', '1000'], spender);
//['0xab21975af93c403fff91ac50e3e0df6a55b59c3003b34e9900821f5fa19e5454', '0xb6e10a2975adbde7dfb4263c0957dcce6c28cbe7a862f285bb4bda43cca8d62d']await lending.getUsdRate('0x7ceb23fd6bc0add59e62ac25578270cff1b9f619');
//2637.61
})()
```## oneWayMarket
### oneWayMarket fields
```ts
import lending from "@curvefi/lending-api";(async () => {
await lending.init('JsonRpc', {});const oneWayMarket = lending.getOneWayMarket('one-way-market-0');
oneWayMarket.id
// "one-way-market-0"
oneWayMarket.name
// "market-0"
oneWayMarket.addresses
// {
// amm: "0x78f7f91dce40269df106a189e47f27bab561332b"
// borrowed_token: "0x361a5a4993493ce00f61c32d4ecca5512b82ce90"
// collateral_token: "0x7ceb23fd6bc0add59e62ac25578270cff1b9f619"
// controller: "0xe27dda8e706f41ca0b496e6cf1b7f1e8308e6732"
// gauge: "0x0000000000000000000000000000000000000000"
// monetary_policy: "0xa845d0688745db0f377a6c5bf5fcde0a3a1a6aeb"
// vault: "0x42526886adb3b20a23a5a19c04e4bf81e9febb2b"
// }
oneWayMarket.borrowed_token
// {
// address: "0x361a5a4993493ce00f61c32d4ecca5512b82ce90"
// decimals: 18
// name: "Stake DAO Token (PoS)"
// symbol: "SDT"
// }
oneWayMarket.collateral_token
// {
// address: "0x7ceb23fd6bc0add59e62ac25578270cff1b9f619"
// decimals: 18
// name: "Wrapped Ether"
// symbol: "WETH"
// }
oneWayMarket.coinAddresses
// ["0x361a5a4993493ce00f61c32d4ecca5512b82ce90", "0x7ceb23fd6bc0add59e62ac25578270cff1b9f619"]
oneWayMarket.coinDecimals
// [18,18]
oneWayMarket.defaultBands
// 10
oneWayMarket.maxBands
// 50
oneWayMarket.minBands
// 4
})()
````### Wallet balances for oneWayMarket
```ts
import lending from "@curvefi/lending-api";(async () => {
await lending.init('JsonRpc', {});
await lending.oneWayfactory.fetchMarkets();const oneWayMarket = lending.getOneWayMarket('one-way-market-0');
// 1. Current address (signer) balances
console.log(await oneWayMarket.wallet.balances());
//
{
borrowed: "100000.0"
collateral: "100.0"
vaultShares: "0.0"
}
//// 2. You can specify the address
console.log(await oneWayMarket.wallet.balances("0x0063046686E46Dc6F15918b61AE2B121458534a5"));
//
{
borrowed: "0.0"
collateral: "0.0"
vaultShares: "0.0"
}
//
})()
```### Stats
```ts
import lending from "@curvefi/lending-api";(async () => {
await lending.init('JsonRpc', {});await lending.oneWayfactory.fetchMarkets();
const oneWayMarket = lending.getOneWayMarket('one-way-market-0');
await oneWayMarket.stats.parameters();
// {
// A: "100"
// admin_fee: "0.0"
// base_price: "8595.062092132517715849"
// fee: "0.6"
// liquidation_discount: "6.0"
// loan_discount: "9.0"
// }
await oneWayMarket.stats.rates();
// {
// borrowApr: '17.8208613727056',
// lendApr: '13.829407727114368717',
// borrowApy: '19.507460419926105',
// lendApy: '15.138248271258824725'
// }
await oneWayMarket.stats.futureRates(10000, 0); // dReserves = 10000, dDebt = 0
// {
// borrowApr: '14.7869386793856',
// lendApr: '10.875115183120530145',
// borrowApy: '15.936145855611583',
// lendApy: '11.720304351866410822'
// }
await oneWayMarket.stats.futureRates(0, 10000); // dReserves = 0, dDebt = 10000
// {
// borrowApr: '22.979565109512',
// lendApr: '19.100290524367724358',
// borrowApy: '25.834284267258045',
// lendApy: '21.473092838884015799'
// }
await oneWayMarket.stats.balances();
const { activeBand, maxBand, minBand, liquidationBand } = await oneWayMarket.stats.bandsInfo();
// { activeBand: 0, maxBand: 15, minBand: 0, liquidationBand: null }
await oneWayMarket.stats.bandBalances(liquidatingBand ?? 0);
// {
// borrowed: "0.0"
// collateral: "0.0"
// }
await oneWayMarket.stats.bandsBalances();
// {
// '0': { borrowed: '0.0', collateral: '0.0' },
// '1': { borrowed: '0.0', collateral: '0.0' },
// '2': { borrowed: '0.0', collateral: '0.0' },
// '3': { borrowed: '0.0', collateral: '0.0' },
// '4': { borrowed: '0.0', collateral: '0.0' },
// '5': { borrowed: '0.0', collateral: '0.0' },
// '6': { borrowed: '0.0', collateral: '0.0' },
// '7': { borrowed: '0.0', collateral: '0.0' },
// '8': { borrowed: '0.0', collateral: '0.0' },
// '9': { borrowed: '0.0', collateral: '0.0' },
// '10': { borrowed: '0.0', collateral: '0.0' },
// '11': { borrowed: '0.0', collateral: '0.0' },
// '12': { borrowed: '0.0', collateral: '0.1' },
// '13': { borrowed: '0.0', collateral: '0.1' },
// '14': { borrowed: '0.0', collateral: '0.1' },
// '15': { borrowed: '0.0', collateral: '0.1' }
// }
await oneWayMarket.stats.totalDebt();
// 1000.0
await oneWayMarket.stats.ammBalances();
// {
// borrowed: "0"
// collateral: "0"
// }
await oneWayMarket.stats.capAndAvailable();
// {
// available: "0.0"
// cap: "0.0"
// }
})()
````### Vault: deposit, mint, stake, unstake, withdraw, redeem
```ts
await lending.init('JsonRpc', {});
await lending.oneWayfactory.fetchMarkets();const oneWayMarket = lending.getOneWayMarket('one-way-market-1');
await oneWayMarket.wallet.balances();
// {
// collateral: '100000.0',
// borrowed: '1000000.0',
// vaultShares: '0.0',
// gauge: '0.0'
// }
// ------------ DEPOSIT ------------await oneWayMarket.vault.maxDeposit();
// 1000000.0
await oneWayMarket.vault.previewDeposit(20000); // Shares to receive
// 19957279.880161894212096572
await oneWayMarket.vault.depositIsApproved(20000);
// false
await oneWayMarket.vault.depositApprove(20000);
// [
// '0xb4a9da37381d6a7b36d89c977c6974d6f7d0aa7b82564b7bdef7b06b2fbd58ae'
// ]
await oneWayMarket.vault.deposit(20000);
// 0x2670db285b6ac1d1e4fc63455554303b583ea0278ee7d75624be4573e018aa2eawait oneWayMarket.wallet.balances();
// {
// collateral: '100000.0',
// borrowed: '980000.0',
// vaultShares: '19957272.526619469933528807',
// gauge: '0.0'
// }// ------------ MINT ------------
await oneWayMarket.vault.maxMint();
// 977906353.804354026742911543
await oneWayMarket.vault.previewMint(20000); // Assets to send
// 20.042818950659253842
await oneWayMarket.vault.mintIsApproved(20000);
// true
await oneWayMarket.vault.mintApprove(20000);
// []
await oneWayMarket.vault.mint(20000);
// 0x9e34e201edaeacd27cb3013e003d415c110f562ad105e587f7c8fb0c3b974142let balances = await oneWayMarket.wallet.balances();
// {
// collateral: '100000.0',
// borrowed: '979979.95718098845915171',
// vaultShares: '19977272.526619469933528807',
// gauge: '0.0'
// }// ------------ UTILS ------------
await oneWayMarket.vault.convertToAssets(100000);
// 100.0
await oneWayMarket.vault.convertToShares(100);
// 100000.0// ------------ STAKE ------------
await oneWayMarket.vault.stakeIsApproved(balances.vaultShares);
// false
await oneWayMarket.vault.stakeApprove(balances.vaultShares);
// [
// '0xf3009825dfed3352d99b7d45b72d99b9a9b1773fae2abeabdb39d9880a3266d6'
// ]
await oneWayMarket.vault.stake(balances.vaultShares);
// 0x3572dfa980b98091061df4b27ea8f05dee8b49384cc781dbcd7b8cf099610426
balances = await oneWayMarket.wallet.balances();
// {
// collateral: '100000.0',
// borrowed: '979979.95718098845915171',
// vaultShares: '0.0',
// gauge: '19977272.526619469933528807'
// }// ------------ UNSTAKE ------------
await oneWayMarket.vault.unstake(balances.gauge);
// 0x30216703c444705598b10b3b510d05a19b44ad84699d8e2f3f0198a4573def99await oneWayMarket.wallet.balances();
// {
// collateral: '100000.0',
// borrowed: '979979.95718098845915171',
// vaultShares: '19977272.526619469933528807',
// gauge: '0.0'
// }// ------------ WITHDRAW ------------
await oneWayMarket.vault.maxWithdraw();
// 20020.043244481699203505
await oneWayMarket.vault.previewWithdraw(10000); // Shares to send
// 9978636.051211318667087166
await oneWayMarket.vault.withdraw(10000);
//0xa8df19e420040dc21e60f1a25eedec01fead748e2d654100ca3e2d0e369a7ae0await oneWayMarket.wallet.balances();
// {
// collateral: '100000.0',
// borrowed: '989979.95718098845915171',
// vaultShares: '9998636.505706074967248914',
// gauge: '0.0'
// }// ------------ REDEEM ------------
await oneWayMarket.vault.maxRedeem();
// 9998636.505706074967248914
await oneWayMarket.vault.previewRedeem(10000); // Assets to receive
// 10.021409718764999588
await oneWayMarket.vault.redeem(10000);
// 0x391721baa517170c23819b070532a3429ab3c7a306042615bf8e1983d035e363await oneWayMarket.wallet.balances();
// {
// collateral: '100000.0',
// borrowed: '989989.978590745251091246',
// vaultShares: '9988636.505706074967248914',
// gauge: '0.0'
// }// ------------ REWARDS ------------
oneWayMarket.vault.rewardsOnly();
// false
await oneWayMarket.vault.totalLiquidity();
// 180638.919172
await oneWayMarket.vault.crvApr();
// [0, 0]
await oneWayMarket.vault.rewardTokens();
// []
await oneWayMarket.vault.rewardsApr();
// []
await oneWayMarket.vault.claimableCrv();
// 0.0
await oneWayMarket.vault.claimCrv();
// 0x8325bada809340d681c165ffc5bac0ba490f8350872b5d0aa82f3fe6c01205aa
await oneWayMarket.vault.claimableRewards();
// []
await oneWayMarket.vault.claimRewards();
// 0xb0906c3a2dea66d1ab6f280833f7205f46af7374f8cf9baa5429f881094140ba
````### Create loan, add collateral, borrow more, repay
```ts
(async () => {
await lending.init('JsonRpc', {});await lending.oneWayfactory.fetchMarkets();
const oneWayMarket = lending.getOneWayMarket('one-way-market-0');
// --- CREATE LOAN ---await oneWayMarket.oraclePrice();
// 3000.0
await oneWayMarket.price();
// 3045.569137149127502965
await oneWayMarket.basePrice();
// '3000.0'
await oneWayMarket.wallet.balances();
// { borrowed: '0.0', collateral: '1.0' }
await oneWayMarket.createLoanMaxRecv(0.5, 5);
// 1375.74670276529114147
await oneWayMarket.createLoanBands(0.5, 1000, 5);
// [ 36, 32 ]
await oneWayMarket.createLoanPrices(0.5, 1000, 5);
// [ '2068.347257607234777', '2174.941007873561634' ]
await oneWayMarket.createLoanHealth(0.5, 1000, 5); // FULL
// 45.191203147616155
await oneWayMarket.createLoanHealth(0.5, 1000, 5, false); // NOT FULL
// 3.9382535412942367
await oneWayMarket.createLoanIsApproved(0.5);
// false
await oneWayMarketa.createLoanApprove(0.5);
// [
// '0xc111e471715ae6f5437e12d3b94868a5b6542cd7304efca18b5782d315760ae5'
// ]
await oneWayMarket.createLoan(0.5, 1000, 5);console.log(await oneWayMarket.userLoanExists());
//true
console.log(await oneWayMarket.userState());
//
{
N: "5"
borrowed: "0.0"
collateral: "1.0"
debt: "1000.0"
}
//
console.log(await oneWayMarket.userHealth()); // FULL
//722.5902543890457276
console.log(await oneWayMarket.userHealth(false)); // NOT FULL
//3.4708541149110123
console.log(await oneWayMarket.userRange());
//5
console.log(await oneWayMarket.userBands());
//[206,,202]
console.log(await oneWayMarket.userPrices());
//["1073.332550295331639435","1128.647508360591547283]
console.log(await oneWayMarket.userBandsBalances());
//
// {
// 202: {collateral: '0.2', borrowed: '0.0'},
// 203: {collateral: '0.2', borrowed: '0.0'},
// 204: {collateral: '0.2', borrowed: '0.0'},
// 205: {collateral: '0.2', borrowed: '0.0'},
// 206: {collateral: '0.2', borrowed: '0.0'},
// }
//
// --- BORROW MORE ---
await oneWayMarket.borrowMoreMaxRecv(0.1);
// 650.896043318349376298
await oneWayMarket.borrowMoreBands(0.1, 500);
// [ 14, 10 ]
await oneWayMarket.borrowMorePrices(0.1, 500);
// [ '2580.175063923865968', '2713.146225026413746' ]
await oneWayMarket.borrowMoreHealth(0.1, 500); // FULL
// 15.200984677843693 %
await oneWayMarket.borrowMoreHealth(0.1, 500, false); // NOT FULL
// 3.7268336789002429 %
await oneWayMarket.borrowMoreIsApproved(0.1);
// true
await oneWayMarket.borrowMoreApprove(0.1);
// []
await oneWayMarket.borrowMore(0.1, 500);// Full health: 15.200984677843694 %
// Not full health: 3.7268336789002439 %
// Bands: [ 14, 10 ]
// Prices: [ '2580.175063923865968', '2713.146225026413746' ]
// State: { collateral: '0.6', borrowed: '0.0', debt: '1500.0' }// --- ADD COLLATERAL ---
await oneWayMarket.addCollateralBands(0.2);
// [ 43, 39 ]
await oneWayMarket.addCollateralPrices(0.2);
// [ '1927.834806254156043', '2027.187147180850842' ]
await oneWayMarket.addCollateralHealth(0.2); // FULL
// 55.2190795613534006
await oneWayMarket.addCollateralHealth(0.2, false); // NOT FULL
// 3.3357274109987789
await oneWayMarket.addCollateralIsApproved(0.2);
// true
await oneWayMarket.addCollateralApprove(0.2);
// []
await oneWayMarket.addCollateral(0.2); // OR await oneWayMarket.addCollateral(0.2, forAddress);// Full health: 55.2190795613534014 %
// Not full health: 3.3357274109987797 %
// Bands: [ 43, 39 ]
// Prices: [ '1927.834806254156043', '2027.187147180850842' ]
// State: { collateral: '0.8', borrowed: '0.0', debt: '1500.0' }// --- REMOVE COLLATERAL ---
await oneWayMarket.maxRemovable()
// 0.254841506439755199
await oneWayMarket.removeCollateralBands(0.1);
// [ 29, 25 ]
await oneWayMarket.removeCollateralPrices(0.1);
// [ '2219.101120164841944', '2333.46407819744091' ]
await oneWayMarket.removeCollateralHealth(0.1); // FULL
// 35.1846612411492316
await oneWayMarket.removeCollateralHealth(0.1, false); // NOT FULL
// 4.0796515570298074
await oneWayMarket.removeCollateral(0.1);// Full health: 35.1846612411492326 %
// Not full health: 4.0796515570298084 %
// Bands: [ 29, 25 ]
// Prices: [ '2219.101120164841944', '2333.46407819744091', ]
// State: { collateral: '0.7', borrowed: '0.0', debt: '1500.0' }// --- REPAY ---
await oneWayMarket.wallet.balances();
// { borrowed: '1500.0', collateral: '0.3' }await oneWayMarket.repayBands(1000);
// [ 139, 135 ]
await oneWayMarket.repayPrices(1000);
// [ '734.595897104762463', '772.453820291837448' ]
await oneWayMarket.repayHealth(1000); // FULL
// 315.2178906180373138
await oneWayMarket.repayHealth(1000, false); // NOT FULL
// 3.3614254588945566
await oneWayMarket.repayIsApproved(1000);
// true
await oneWayMarket.repayApprove(1000);
// []
await oneWayMarket.repay(1000);// Full health: 315.2178906180373149 %
// Not full health: 3.3614254588945577 %
// Bands: [ 139, 135 ]
// Prices: [ '734.595897104762463', '772.453820291837448' ]
// State: { collateral: '0.7', borrowed: '0.0', debt: '500.0' }// --- FULL REPAY ---
await oneWayMarket.fullRepayIsApproved();
// true
await oneWayMarket.fullRepayApprove();
// []
await oneWayMarket.fullRepay();// Loan exists: false
// State: { collateral: '0.0', borrowed: '0.0', debt: '0.0' }
})()
```### Create loan all ranges methods
```ts
await lending.init('JsonRpc', {});const oneWayMarket = lending.getOneWayMarket('one-way-market-0');
await oneWayMarket.createLoanMaxRecvAllRanges(1);
// {
// '5': '2751.493405530582454486',
// '6': '2737.828112577888632315',
// '7': '2724.253615257658154585',
// '8': '2710.76923397831492797',
// '9': '2697.374294577689210021',
// '10': '2684.068128277815937982',
// '11': '2670.850071640120547429',
// '12': '2657.719466520988458715',
// '13': '2644.675660027714709155',
// '14': '2631.718004474831209682',
// '15': '2618.845857340807263461',
// '16': '2606.058581225120973696',
// '17': '2593.355543805697908653',
// '18': '2580.736117796713531552',
// '19': '2568.199680906757040338',
// '20': '2555.745615797352299399',
//
// ...
//
// '50': '2217.556229455652339229'
// }await oneWayMarket.createLoanBandsAllRanges(1, 2600);
// {
// '5': [ 10, 6 ],
// '6': [ 11, 6 ],
// '7': [ 11, 5 ],
// '8': [ 12, 5 ],
// '9': [ 12, 4 ],
// '10': [ 13, 4 ],
// '11': [ 13, 3 ],
// '12': [ 14, 3 ],
// '13': [ 14, 2 ],
// '14': [ 15, 2 ],
// '15': [ 15, 1 ],
// '16': [ 16, 1 ],
// '17': null,
// '18': null,
// '19': null,
// '20': null,
//
// ...
//
// '50': null
// }await oneWayMarket.createLoanPricesAllRanges(1, 2600);
// {
// '5': [ '2686.01476277614933533', '2824.440448203' ],
// '6': [ '2659.154615148387841976', '2824.440448203' ],
// '7': [ '2659.154615148387841976', '2852.9701497' ],
// '8': [ '2632.563068996903963557', '2852.9701497' ],
// '9': [ '2632.563068996903963557', '2881.78803' ],
// '10': [ '2606.237438306934923921', '2881.78803' ],
// '11': [ '2606.237438306934923921', '2910.897' ],
// '12': [ '2580.175063923865574682', '2910.897' ],
// '13': [ '2580.175063923865574682', '2940.3' ],
// '14': [ '2554.373313284626918935', '2940.3' ],
// '15': [ '2554.373313284626918935', '2970' ],
// '16': [ '2528.829580151780649746', '2970' ],
// '17': null,
// '18': null,
// '19': null,
// '20': null,
//
// ...
//
// '50': null
// }
```### Swap
```ts
(async () => {
await lending.init('JsonRpc', {});const oneWayMarket = lending.getOneWayMarket('one-way-market-0');
await oneWayMarket.wallet.balances();
// {
// borrowed: '301.533523886491869218',
// collateral: '0.860611976623971606'
// }await oneWayMarket.maxSwappable(0, 1);
// 380.672763174593107707
await oneWayMarket.swapExpected(0, 1, 100); // 100 - in_amount
// 0.03679356627103543 (out_amount)
await oneWayMarket.swapRequired(0, 1, 0.03679356627103543); // 0.03679356627103543 - out_amount
// 100.000000000000000558 (in_amount)
await oneWayMarket.swapPriceImpact(0, 1, 100);
// 0.170826
await oneWayMarket.swapIsApproved(0, 100);
// true
await oneWayMarket.swapApprove(0, 100);
// []
await oneWayMarket.swap(0, 1, 100, 0.1);await oneWayMarket.wallet.balances();
// {
// borrowed: '201.533523886491869218',
// collateral: '0.897405542895007036'
// }
})()
```### Self-liquidation
```ts
(async () => {
await lending.init('JsonRpc', {});const oneWayMarket = lending.getOneWayMarket('one-way-market-0');
// Wallet balances: {
// borrowed: '301.533523886491869218',
// collateral: '0.860611976623971606'
// }
// State: {
// collateral: '0.139388023376028394',
// borrowed: '2751.493405530582315609',
// debt: '3053.026929417074184827'
// }
await oneWayMarket.tokensToLiquidate();
// 301.533523886491869218
await oneWayMarket.selfLiquidateIsApproved();
// true
await oneWayMarket.selfLiquidateApprove();
// []
await oneWayMarket.selfLiquidate(0.1); // slippage = 0.1 %// Wallet balances: { borrowed: '0.0', collateral: '1.0' }
// State: { collateral: '0.0', borrowed: '0.0', debt: '0.0' }
})()
```### Liquidation
```ts
(async () => {
await lending.init('JsonRpc', {});const oneWayMarket = lending.getOneWayMarket('one-way-market-0');
const addressToLiquidate = "0x66aB6D9362d4F35596279692F0251Db635165871";await oneWayMarket.wallet.balances();
// Liquidator wallet balances: {
// borrowed: '301.533523886491869218',
// collateral: '0.860611976623971606'
// }
await oneWayMarket.userState(addressToLiquidate);
// State of the account we are goning to liquidate: {
// collateral: '0.139388023376028394',
// borrowed: '2751.493405530582315609',
// debt: '3053.026929417074184827'
// }
await oneWayMarket.currentLeverage()
//0.94083266399502623316
await oneWayMarket.currentPosition()
// {
// currentPosition: "95777.510614373750083"
// deposited: "219533.5105208847"
// percentage: "-56.372259347958530763"
// }
await oneWayMarket.tokensToLiquidate(addressToLiquidate);
// 301.533523886491869218
await oneWayMarket.liquidateIsApproved();
// true
await oneWayMarket.liquidateApprove();
// []
await oneWayMarket.liquidate(addressToLiquidate, 0.1); // slippage = 0.1 %// Liquidator wallet balances: { borrowed: '0.0', collateral: '1.0' }
// State of liquidated account: { collateral: '0.0', borrowed: '0.0', debt: '0.0' }
})()
```### User loss
```ts
(async () => {
await lending.init('JsonRpc', {});const oneWayMarket = lending.getoneWayMarket('sfrxeth');
console.log(await oneWayMarket.userLoss("0x0063046686E46Dc6F15918b61AE2B121458534a5"));
// {
// deposited_collateral: '929.933909709140155529',
// current_collateral_estimation: '883.035865972092328038',
// loss: '46.898043737047827491',
// loss_pct: '5.043158793049750311'
// }
})()
```### Leverage (createLoan, borrowMore, repay)
```ts
(async () => {
await lending.init('JsonRpc', {}, {}, API_KEY_1INCH);
await lending.oneWayfactory.fetchMarkets();const oneWayMarket = lending.getOneWayMarket('one-way-market-0');
console.log(oneWayMarket.collateral_token, oneWayMarket.borrowed_token);
// {
// address: '0x82af49447d8a07e3bd95bd0d56f35241523fbab1',
// decimals: 18,
// name: 'Wrapped Ether',
// symbol: 'WETH'
// }
//
// {
// address: '0x498bf2b1e120fed3ad3d42ea2165e9b73f99c1e5',
// decimals: 18,
// name: 'Curve.Fi USD Stablecoin',
// symbol: 'crvUSD'
// }
console.log(await oneWayMarket.wallet.balances());
// {
// collateral: '100.0',
// borrowed: '2000000.0',
// vaultShares: '0.0',
// gauge: '0'
// }
// - Create Loan -// Creates leveraged position (userCollateral + collateralFromUserBorrowed + leverage_collateral)
// ^
// |
// userCollateral | debt debt + userBorrowed
// user ---> controller ----> leverage_zap ----> router
// | ^ | ^ ^ |
// | |__________________| | |___________________|
// | leverageCollateral + collateralFromUserBorrowed
// |_____________________________________|
// userBorrowed
let userCollateral = 1;
let userBorrowed = 1000;
let debt = 2000;
const range = 10;
const slippage = 0.5; // %
await oneWayMarket.leverage.maxLeverage(range);
// 7.4728229145282742179
await oneWayMarket.leverage.createLoanMaxRecv(userCollateral, userBorrowed, range);
// {
// maxDebt: '26089.494406081862861214',
// maxTotalCollateral: '9.539182089833411347',
// userCollateral: '1',
// collateralFromUserBorrowed: '0.315221168834966496',
// collateralFromMaxDebt: '8.223960920998444851',
// maxLeverage: '7.25291100528992828612',
// avgPrice: '3172.3757757003568790858'
// }
await oneWayMarket.leverage.createLoanExpectedCollateral(userCollateral, userBorrowed, debt, slippage);
// {
// totalCollateral: '1.946422996710829',
// userCollateral: '1.0',
// collateralFromUserBorrowed: '0.315474332236942984',
// collateralFromDebt: '0.630948664473886',
// leverage: '1.4796358613861877'
// avgPrice: '3169.8299919022623523421'
// }
await oneWayMarket.leverage.createLoanPriceImpact(userCollateral, userBorrowed, debt);
// 0.08944411854377342 %
await oneWayMarket.leverage.createLoanMaxRange(userCollateral, userBorrowed, debt);
// 50
await oneWayMarket.leverage.createLoanBands(userCollateral, userBorrowed, debt, range);
// [ 76, 67 ]
await oneWayMarket.leverage.createLoanPrices(userCollateral, userBorrowed, debt, range);
// [ '1027.977701011670136614', '1187.061409925215211173' ]
await oneWayMarket.leverage.createLoanHealth(userCollateral, userBorrowed, debt, range);
// 195.8994783042570637
await oneWayMarket.leverage.createLoanHealth(userCollateral, userBorrowed, debt, range, false);
// 3.2780908310686365
await oneWayMarket.leverage.createLoanIsApproved(userCollateral, userBorrowed);
// false
await oneWayMarket.leverage.createLoanApprove(userCollateral, userBorrowed);
// [
// '0xd5491d9f1e9d8ac84b03867494e35b25efad151c597d2fa4211d7bf5d540c98e',
// '0x93565f37ec5be902a824714a30bddc25cf9cd9ed39b4c0e8de61fab44af5bc8c'
// ]
await oneWayMarket.leverage.createLoanRoute(userBorrowed, debt);
// [
// {
// part: 100,
// hops: [
// [
// {
// name: 'ARBITRUM_CURVE_STABLE_NG',
// part: 100,
// fromTokenAddress: '0x498bf2b1e120fed3ad3d42ea2165e9b73f99c1e5',
// toTokenAddress: '0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9'
// }
// ],
// [
// {
// name: 'ARBITRUM_UNISWAP_V3',
// part: 100,
// fromTokenAddress: '0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9',
// toTokenAddress: '0x82af49447d8a07e3bd95bd0d56f35241523fbab1'
// }
// ]
// ]
// }
// ]
// You must call oneWayMarket.leverage.createLoanExpectedCollateral() with the same args before
await oneWayMarket.leverage.createLoan(userCollateral, userBorrowed, debt, range);
// 0xeb1b7a92bcb02598f00dc8bbfe8fa3a554e7a2b1ca764e0ee45e2bf583edf731await oneWayMarket.wallet.balances();
// {
// collateral: '99.0',
// borrowed: '599000.0',
// vaultShares: '1400000000.0',
// gauge: '0'
// }
await oneWayMarket.userState();
// {
// collateral: '1.945616160868693648',
// borrowed: '0.0',
// debt: '2000.0',
// N: '10'
// }
await oneWayMarket.userBands();
// [ 76, 67 ]
await oneWayMarket.userPrices();
// [ '1027.977718614028011906', '1187.061430251609195098' ]
await oneWayMarket.userHealth();
// 195.8372633833293605
await oneWayMarket.userHealth(false);
// 3.2518122092914609
// - Borrow More -// Updates leveraged position (dCollateral = userCollateral + collateralFromUserBorrowed + leverageCollateral)
// ^
// |
// userCollateral | dDebt dDebt + userBorrowed
// user ---> controller ----> leverage_zap ----> router
// | ^ | ^ ^ |
// | |__________________| | |___________________|
// | leverageCollateral + collateralFromUSerBorrowed
// |_____________________________________|
// userBorrowed
userCollateral = 2;
userBorrowed = 2000;
debt = 10000;
await oneWayMarket.leverage.borrowMoreMaxRecv(userCollateral, userBorrowed);
// {
// maxDebt: '76182.8497941193262889',
// maxTotalCollateral: '26.639775583730298462',
// userCollateral: '2',
// collateralFromUserBorrowed: '1.677318306610359627',
// collateralFromMaxDebt: '22.962457277119938834',
// avgPrice: '3172.55402418338331369083'
// }
await oneWayMarket.leverage.borrowMoreExpectedCollateral(userCollateral, userBorrowed, debt, slippage);
// {
// totalCollateral: '5.783452104143246413',
// userCollateral: '2.0',
// collateralFromUserBorrowed: '0.630575350690541071',
// collateralFromDebt: '3.152876753452705342'
// avgPrice: '3171.70659749038129067231'
// }
await oneWayMarket.leverage.borrowMorePriceImpact(userCollateral, userBorrowed, debt);
// 0.010784277354269765 %
await oneWayMarket.leverage.borrowMoreBands(userCollateral, userBorrowed, debt);
// [ 47, 38 ]
await oneWayMarket.leverage.borrowMorePrices(userCollateral, userBorrowed, debt);
// [ '1560.282474721398939216', '1801.742501325928269008' ]
await oneWayMarket.leverage.borrowMoreHealth(userCollateral, userBorrowed, debt, true);
// 91.6798951784708552
await oneWayMarket.leverage.borrowMoreHealth(userCollateral, userBorrowed, debt, false);
// 3.7614279042995641
await oneWayMarket.leverage.borrowMoreIsApproved(userCollateral, userBorrowed);
// true
await oneWayMarket.leverage.borrowMoreApprove(userCollateral, userBorrowed);
// []
await oneWayMarket.leverage.borrowMoreRoute(userBorrowed, debt);
// [
// {
// part: 50,
// hops: [
// [
// {
// name: 'ARBITRUM_CURVE_STABLE_NG',
// part: 100,
// fromTokenAddress: '0x498bf2b1e120fed3ad3d42ea2165e9b73f99c1e5',
// toTokenAddress: '0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9'
// }
// ],
// [
// {
// name: 'ARBITRUM_PANCAKESWAP_V3',
// part: 12,
// fromTokenAddress: '0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9',
// toTokenAddress: '0x82af49447d8a07e3bd95bd0d56f35241523fbab1'
// },
// {
// name: 'ARBITRUM_PANCAKESWAP_V3',
// part: 42,
// fromTokenAddress: '0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9',
// toTokenAddress: '0x82af49447d8a07e3bd95bd0d56f35241523fbab1'
// },
// {
// name: 'ARBITRUM_UNISWAP_V3',
// part: 46,
// fromTokenAddress: '0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9',
// toTokenAddress: '0x82af49447d8a07e3bd95bd0d56f35241523fbab1'
// }
// ]
// ]
// },
// {
// part: 50,
// hops: [
// [
// {
// name: 'ARBITRUM_CURVE_STABLE_NG',
// part: 100,
// fromTokenAddress: '0x498bf2b1e120fed3ad3d42ea2165e9b73f99c1e5',
// toTokenAddress: '0xaf88d065e77c8cc2239327c5edb3a432268e5831'
// }
// ],
// [
// {
// name: 'ARBITRUM_PANCAKESWAP_V3',
// part: 10,
// fromTokenAddress: '0xaf88d065e77c8cc2239327c5edb3a432268e5831',
// toTokenAddress: '0x82af49447d8a07e3bd95bd0d56f35241523fbab1'
// },
// {
// name: 'ARBITRUM_UNISWAP_V3',
// part: 90,
// fromTokenAddress: '0xaf88d065e77c8cc2239327c5edb3a432268e5831',
// toTokenAddress: '0x82af49447d8a07e3bd95bd0d56f35241523fbab1'
// }
// ]
// ]
// }
// ]// You must call oneWayMarket.leverage.borrowMoreExpectedCollateral() with the same args before
await oneWayMarket.leverage.borrowMore(userCollateral, userBorrowed, debt, slippage);
// 0x6357dd6ea7250d7adb2344cd9295f8255fd8fbbe85f00120fbcd1ebf139e057cawait oneWayMarket.wallet.balances();
// {
// collateral: '97.0',
// borrowed: '597000.0',
// vaultShares: '1400000000.0',
// gauge: '0'
// }
await oneWayMarket.userState();
// {
// collateral: '7.727839965845165558',
// borrowed: '0.0',
// debt: '12000.000010193901375446',
// N: '10'
// }
await oneWayMarket.userBands();
// [ 47, 38 ]
await oneWayMarket.userPrices();
// [ '1560.28248267408177179', '1801.742510509320950242' ]
await oneWayMarket.userHealth();
// 91.6519475547753288
await oneWayMarket.userHealth(false);
// 3.7449386373872907
// - Repay -
// Deleveraged position (-dDebt = borrowedFromStateCollateral + borrowedFromUSerCollateral + userBorrowed)
// ^
// | userCollateral
// user ___|__________________________
// | |
// | | stateCollateral ↓ userCollateral + stateCollateral
// | controller --> leverage_zap --> router
// | ^ | ^ ^ |
// | |______________________| | |___________________|
// | | borrowedFromStateCollateral
// |________________________________| +
// userBorrowed borrowedFromUSerCollateral
const stateCollateral = 2;
userCollateral = 1;
userBorrowed = 1500;
await oneWayMarket.leverage.repayExpectedBorrowed(stateCollateral, userCollateral, userBorrowed, slippage);
// {
// totalBorrowed: '10998.882838599741571472',
// borrowedFromStateCollateral: '6332.588559066494374648',
// borrowedFromUserCollateral: '3166.294279533247196824',
// userBorrowed: '1500'
// avgPrice: '3166.29427953324743125312'
// }await oneWayMarket.leverage.repayPriceImpact(stateCollateral, userCollateral, userBorrowed);
// 0.013150142802201724 %
await oneWayMarket.leverage.repayIsFull(stateCollateral, userCollateral, userBorrowed);
// false
await oneWayMarket.leverage.repayIsAvailable(stateCollateral, userCollateral, userBorrowed);
// true
await oneWayMarket.leverage.repayBands(stateCollateral, userCollateral, userBorrowed);
// [ 199, 190 ]
await oneWayMarket.leverage.repayPrices(stateCollateral, userCollateral, userBorrowed);
// [ '175.130965754280721633', '202.233191367561902757' ]
await oneWayMarket.leverage.repayHealth(stateCollateral, userCollateral, userBorrowed, true);
// 1699.6097751079226865
await oneWayMarket.leverage.repayHealth(stateCollateral, userCollateral, userBorrowed, false);
// 3.4560086962806991
await oneWayMarket.leverage.repayIsApproved(userCollateral, userBorrowed);
// false
await oneWayMarket.leverage.repayApprove(userCollateral, userBorrowed);
// ['0xd8a8d3b3f67395e1a4f4d4f95b041edcaf1c9f7bab5eb8a8a767467678295498']
await oneWayMarket.leverage.repayRoute(stateCollateral, userCollateral);
// [
// {
// part: 10,
// hops: [
// [
// {
// name: 'ARBITRUM_CURVE_V2',
// part: 32,
// fromTokenAddress: '0x82af49447d8a07e3bd95bd0d56f35241523fbab1',
// toTokenAddress: '0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9'
// },
// {
// name: 'ARBITRUM_PANCAKESWAP_V3',
// part: 68,
// fromTokenAddress: '0x82af49447d8a07e3bd95bd0d56f35241523fbab1',
// toTokenAddress: '0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9'
// }
// ],
// [
// {
// name: 'ARBITRUM_CURVE_STABLE_NG',
// part: 100,
// fromTokenAddress: '0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9',
// toTokenAddress: '0x498bf2b1e120fed3ad3d42ea2165e9b73f99c1e5'
// }
// ]
// ]
// },
// {
// part: 90,
// hops: [
// [
// {
// name: 'ARBITRUM_UNISWAP_V3',
// part: 8,
// fromTokenAddress: '0x82af49447d8a07e3bd95bd0d56f35241523fbab1',
// toTokenAddress: '0xaf88d065e77c8cc2239327c5edb3a432268e5831'
// },
// {
// name: 'ARBITRUM_INTEGRAL',
// part: 92,
// fromTokenAddress: '0x82af49447d8a07e3bd95bd0d56f35241523fbab1',
// toTokenAddress: '0xaf88d065e77c8cc2239327c5edb3a432268e5831'
// }
// ],
// [
// {
// name: 'ARBITRUM_CAMELOT_V3',
// part: 100,
// fromTokenAddress: '0xaf88d065e77c8cc2239327c5edb3a432268e5831',
// toTokenAddress: '0xff970a61a04b1ca14834a43f5de4533ebddb5cc8'
// }
// ],
// [
// {
// name: 'ARBITRUM_CURVE_STABLE_NG',
// part: 100,
// fromTokenAddress: '0xff970a61a04b1ca14834a43f5de4533ebddb5cc8',
// toTokenAddress: '0x498bf2b1e120fed3ad3d42ea2165e9b73f99c1e5'
// }
// ]
// ]
// }
// ]// You must call oneWayMarket.leverage.repayExpectedBorrowed() with the same args before
await oneWayMarket.leverage.repay(stateCollateral, userCollateral, userBorrowed, slippage);
// 0xe48a97fef1c54180a2c7d104d210a95ac1a516fdd22109682179f1582da23a82await oneWayMarket.wallet.balances();
// {
// collateral: '96.0',
// borrowed: '595500.0',
// vaultShares: '1400000000.0',
// gauge: '0'
// }
await oneWayMarket.userState();
// {
// collateral: '5.727839965845165558',
// borrowed: '0.0',
// debt: '992.083214663467727334',
// N: '10'
// }
await oneWayMarket.userBands();
// [ 199, 190 ]
await oneWayMarket.userPrices();
// [ '175.13096689602455189', '202.233192685995210783' ]
await oneWayMarket.userHealth();
// 1716.0249924305707883
await oneWayMarket.userHealth(false);
// 3.6389352509210336
})()
```### Leverage createLoan all ranges methods
```ts
await lending.init('JsonRpc', {}, {}, API_KEY_1INCH);
await lending.oneWayfactory.fetchMarkets();
const oneWayMarket = lending.getOneWayMarket('one-way-market-0');
const userCollateral = 1;
const userBorrowed = 1000;
const debt = 2000;
await oneWayMarket.leverage.createLoanMaxRecvAllRanges(userCollateral, userBorrowed);
// {
// '4': {
// maxDebt: '37916.338071504823875251',
// maxTotalCollateral: '13.286983617364703479',
// userCollateral: '1',
// collateralFromUserBorrowed: '0.315728154966395280',
// collateralFromMaxDebt: '11.971255462398308199',
// maxLeverage: '10.09857816541446843865',
// avgPrice: '3167.28167656266072703689'
// },
// '5': {
// maxDebt: '35363.440522143354729759',
// maxTotalCollateral: '12.480961984286574804',
// userCollateral: '1',
// collateralFromUserBorrowed: '0.315728154966395280',
// collateralFromMaxDebt: '11.165233829320179524',
// maxLeverage: '9.48597317551918486951',
// avgPrice: '3167.28167656266072703689'
// },
// '6': {
// maxDebt: '33122.824118147617102062',
// maxTotalCollateral: '11.773536301065561222',
// userCollateral: '1',
// collateralFromUserBorrowed: '0.315728154966395280',
// collateralFromMaxDebt: '10.457808146099165942',
// maxLeverage: '8.94830459971897955699',
// avgPrice: '3167.28167656266072703689'
// },
// '7': {
// maxDebt: '31140.555201395785060968',
// maxTotalCollateral: '11.147678193332270290',
// userCollateral: '1',
// collateralFromUserBorrowed: '0.315728154966395280',
// collateralFromMaxDebt: '9.831950038365875010',
// maxLeverage: '8.47263027035929823721',
// avgPrice: '3167.28167656266072703689'
// },
//
// ...
//
// '50': {
// maxDebt: '8122.705063645852013929',
// maxTotalCollateral: '3.880294838047496482',
// userCollateral: '1',
// collateralFromUserBorrowed: '0.315728154966395280',
// collateralFromMaxDebt: '2.564566683081101202',
// maxLeverage: '2.94916151440614435181',
// avgPrice: '3167.28167656266072703689'
// }await oneWayMarket.leverage.createLoanBandsAllRanges(userCollateral, userBorrowed, debt);
// {
// '4': [ 73, 70 ],
// '5': [ 73, 69 ],
// '6': [ 74, 69 ],
// '7': [ 74, 68 ],
//
// ...
//
// '50': [ 97, 48 ]
// }await oneWayMarket.leverage.createLoanPricesAllRanges(userCollateral, userBorrowed, debt);
// {
// '4': [ '1073.323292757532604807', '1136.910693647788699808' ],
// '5': [ '1073.323292757532604807', '1153.387660222394333133' ],
// '6': [ '1057.990102860996424743', '1153.387660222394333133' ],
// '7': [ '1057.990102860996424743', '1170.103423414023236507' ],
//
// ...
//
// '50': [ '759.898822708156242647', '1560.282492846180089068' ]
// }
```