库夫·拉马伦德(签名)
设置
从 npm 安装 :
npm install @curvefi/llamalend-api
输入
import llamalend from "@curvefi/llamalend-api";
(async () => {
// 1. Dev
await llamalend.init('JsonRpc', {url: 'http://localhost:8545/', privateKey: ''}, { gasPrice: 0, maxFeePerGas: 0, maxPriorityFeePerGas: 0, chainId: 1 });
// OR
await llamalend.init('JsonRpc', {}, {}); // In this case JsonRpc url, privateKey, fee data and chainId will be specified automatically
// 2. Infura
llamalend.init("Infura", { network: "homestead", apiKey: <INFURA_KEY> }, { chainId: 1 });
// 3. Web3 provider
llamalend.init('Web3', { externalProvider: <WEB3_PROVIDER> }, { chainId: 1 });
})()
说明1. chainId 参数是可选的,但在本地主机网络上使用Metamask时必须指定,因为Metamask有此功能 错误
说明2. Web3 init需要地址. 因此,只有在收到地址后才能初始化.
错误的QQ
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 llamalend from '@curvefi/llamalend-api'
...
const WalletProvider: FunctionComponent = ({ children }) => {
const [wallet, setWallet] = useState<Wallet>()
const [provider, setProvider] = useState<providers.Web3Provider>()
const [address, setAddress] = useState<string>()
const networkId = 1
const onboard = useMemo(
() =>
Onboard({
dappId: DAPP_ID,
networkId,
subscriptions: {
address: (address) => {
setAddress(address)
},
wallet: (wallet) => {
setWallet(wallet)
if (wallet.provider) {
llamalend.init("Web3", { externalProvider: wallet.provider }, { chainId: networkId })
}
},
},
walletSelect: {
wallets: wallets,
},
}),
[]
)
...
对
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 llamalend from '@curvefi/llamalend-api'
...
const WalletProvider: FunctionComponent = ({ children }) => {
const [wallet, setWallet] = useState<Wallet>()
const [provider, setProvider] = useState<providers.Web3Provider>()
const [address, setAddress] = useState<string>()
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) {
llamalend.init("Web3", { externalProvider: wallet.provider }, { chainId: networkId })
}
}, [address, wallet?.provider]);
...
页:1
- 1 数量可以以数字或字符串的形式传递.
- 2出借市场.swap价格影响 方法返回%,例如 0 < priceImpact > 100.
- 3 滑动参数应作为 % 传递,例如 0 < slipped QQ 100.
一般方法
import llamalend from "@curvefi/llamalend-api";
(async () => {
await llamalend.init('JsonRpc', {});
const balances1 = await llamalend.getBalances(['sdt', 'weth']);
// OR const balances1 = await llamalend.getBalances(['0x361a5a4993493ce00f61c32d4ecca5512b82ce90', '0x7ceb23fd6bc0add59e62ac25578270cff1b9f619']);
//['80980.0', '99.0']
// You can specify address
const balances2 = await llamalend.getBalances(['sdt', 'weth'], "0x0063046686E46Dc6F15918b61AE2B121458534a5");
// OR const balances2 = await llamalend.getBalances(['0x361a5a4993493ce00f61c32d4ecca5512b82ce90', '0x7ceb23fd6bc0add59e62ac25578270cff1b9f619'], '0x0063046686E46Dc6F15918b61AE2B121458534a5');
//['0.0', '0.0']
const spender = "0x136e783846ef68C8Bd00a3369F787dF8d683a696"
await llamalend.getAllowance(['sdt', 'weth'], llamalend.signerAddress, spender);
//['0.0', '0.0']
await llamalend.hasAllowance(['sdt', 'weth'], ['1000', '1000'], llamalend.signerAddress, spender);
//false
await llamalend.ensureAllowance(['sdt', 'weth'], ['1000', '1000'], spender);
//['0xab21975af93c403fff91ac50e3e0df6a55b59c3003b34e9900821f5fa19e5454', '0xb6e10a2975adbde7dfb4263c0957dcce6c28cbe7a862f285bb4bda43cca8d62d']
await llamalend.getUsdRate('0x7ceb23fd6bc0add59e62ac25578270cff1b9f619');
//2637.61
})()
借出市场
借出市场字段
import llamalend from "@curvefi/llamalend-api";
(async () => {
await llamalend.init('JsonRpc', {});
const lendMarket = llamalend.getLendMarket('one-way-market-0');
lendMarket.id
// "one-way-market-0"
lendMarket.name
// "market-0"
lendMarket.addresses
// {
// amm: "0x78f7f91dce40269df106a189e47f27bab561332b"
// borrowed_token: "0x361a5a4993493ce00f61c32d4ecca5512b82ce90"
// collateral_token: "0x7ceb23fd6bc0add59e62ac25578270cff1b9f619"
// controller: "0xe27dda8e706f41ca0b496e6cf1b7f1e8308e6732"
// gauge: "0x0000000000000000000000000000000000000000"
// monetary_policy: "0xa845d0688745db0f377a6c5bf5fcde0a3a1a6aeb"
// vault: "0x42526886adb3b20a23a5a19c04e4bf81e9febb2b"
// }
lendMarket.borrowed_token
// {
// address: "0x361a5a4993493ce00f61c32d4ecca5512b82ce90"
// decimals: 18
// name: "Stake DAO Token (PoS)"
// symbol: "SDT"
// }
lendMarket.collateral_token
// {
// address: "0x7ceb23fd6bc0add59e62ac25578270cff1b9f619"
// decimals: 18
// name: "Wrapped Ether"
// symbol: "WETH"
// }
lendMarket.coinAddresses
// ["0x361a5a4993493ce00f61c32d4ecca5512b82ce90", "0x7ceb23fd6bc0add59e62ac25578270cff1b9f619"]
lendMarket.coinDecimals
// [18,18]
lendMarket.defaultBands
// 10
lendMarket.maxBands
// 50
lendMarket.minBands
// 4
})()
出借的钱包余额
import llamalend from "@curvefi/llamalend-api";
(async () => {
await llamalend.init('JsonRpc', {});
await llamalend.lendMarkets.fetchMarkets();
const lendMarket = llamalend.getLendMarket('one-way-market-0');
// 1. Current address (signer) balances
console.log(await lendMarket.wallet.balances());
//
{
borrowed: "100000.0"
collateral: "100.0"
vaultShares: "0.0"
}
//
// 2. You can specify the address
console.log(await lendMarket.wallet.balances("0x0063046686E46Dc6F15918b61AE2B121458534a5"));
//
{
borrowed: "0.0"
collateral: "0.0"
vaultShares: "0.0"
}
//
})()
出借市场
import llamalend from "@curvefi/llamalend-api";
(async () => {
await llamalend.init('JsonRpc', {});
await llamalend.lendMarkets.fetchMarkets();
const lendMarket = llamalend.getLendMarket('one-way-market-0');
await lendMarket.stats.parameters();
// {
// A: "100"
// admin_fee: "0.0"
// base_price: "8595.062092132517715849"
// fee: "0.6"
// liquidation_discount: "6.0"
// loan_discount: "9.0"
// }
await lendMarket.stats.rates();
// {
// borrowApr: '17.8208613727056',
// lendApr: '13.829407727114368717',
// borrowApy: '19.507460419926105',
// lendApy: '15.138248271258824725'
// }
await lendMarket.stats.futureRates(10000, 0); // dReserves = 10000, dDebt = 0
// {
// borrowApr: '14.7869386793856',
// lendApr: '10.875115183120530145',
// borrowApy: '15.936145855611583',
// lendApy: '11.720304351866410822'
// }
await lendMarket.stats.futureRates(0, 10000); // dReserves = 0, dDebt = 10000
// {
// borrowApr: '22.979565109512',
// lendApr: '19.100290524367724358',
// borrowApy: '25.834284267258045',
// lendApy: '21.473092838884015799'
// }
await lendMarket.stats.balances();
const { activeBand, maxBand, minBand, liquidationBand } = await lendMarket.stats.bandsInfo();
// { activeBand: 0, maxBand: 15, minBand: 0, liquidationBand: null }
await lendMarket.stats.bandBalances(liquidatingBand ?? 0);
// {
// borrowed: "0.0"
// collateral: "0.0"
// }
await lendMarket.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 lendMarket.stats.totalDebt();
// 1000.0
await lendMarket.stats.ammBalances();
// {
// borrowed: "0"
// collateral: "0"
// }
await lendMarket.stats.capAndAvailable();
// {
// available: "0.0"
// cap: "0.0"
// }
})()
赔款:押金、薄荷、分金、未取款、提款、赎回借给马克泰
await llamalend.init('JsonRpc', {});
await llamalend.lendMarkets.fetchMarkets();
const lendMarket = llamalend.getLendMarket('one-way-market-1');
await lendMarket.wallet.balances();
// {
// collateral: '100000.0',
// borrowed: '1000000.0',
// vaultShares: '0.0',
// gauge: '0.0'
// }
// ------------ DEPOSIT ------------
await lendMarket.vault.maxDeposit();
// 1000000.0
await lendMarket.vault.previewDeposit(20000); // Shares to receive
// 19957279.880161894212096572
await lendMarket.vault.depositIsApproved(20000);
// false
await lendMarket.vault.depositApprove(20000);
// [
// '0xb4a9da37381d6a7b36d89c977c6974d6f7d0aa7b82564b7bdef7b06b2fbd58ae'
// ]
await lendMarket.vault.deposit(20000);
// 0x2670db285b6ac1d1e4fc63455554303b583ea0278ee7d75624be4573e018aa2e
await lendMarket.wallet.balances();
// {
// collateral: '100000.0',
// borrowed: '980000.0',
// vaultShares: '19957272.526619469933528807',
// gauge: '0.0'
// }
// ------------ MINT ------------
await lendMarket.vault.maxMint();
// 977906353.804354026742911543
await lendMarket.vault.previewMint(20000); // Assets to send
// 20.042818950659253842
await lendMarket.vault.mintIsApproved(20000);
// true
await lendMarket.vault.mintApprove(20000);
// []
await lendMarket.vault.mint(20000);
// 0x9e34e201edaeacd27cb3013e003d415c110f562ad105e587f7c8fb0c3b974142
let balances = await lendMarket.wallet.balances();
// {
// collateral: '100000.0',
// borrowed: '979979.95718098845915171',
// vaultShares: '19977272.526619469933528807',
// gauge: '0.0'
// }
// ------------ UTILS ------------
await lendMarket.vault.convertToAssets(100000);
// 100.0
await lendMarket.vault.convertToShares(100);
// 100000.0
// ------------ STAKE ------------
await lendMarket.vault.stakeIsApproved(balances.vaultShares);
// false
await lendMarket.vault.stakeApprove(balances.vaultShares);
// [
// '0xf3009825dfed3352d99b7d45b72d99b9a9b1773fae2abeabdb39d9880a3266d6'
// ]
await lendMarket.vault.stake(balances.vaultShares);
// 0x3572dfa980b98091061df4b27ea8f05dee8b49384cc781dbcd7b8cf099610426
balances = await lendMarket.wallet.balances();
// {
// collateral: '100000.0',
// borrowed: '979979.95718098845915171',
// vaultShares: '0.0',
// gauge: '19977272.526619469933528807'
// }
// ------------ UNSTAKE ------------
await lendMarket.vault.unstake(balances.gauge);
// 0x30216703c444705598b10b3b510d05a19b44ad84699d8e2f3f0198a4573def99
await lendMarket.wallet.balances();
// {
// collateral: '100000.0',
// borrowed: '979979.95718098845915171',
// vaultShares: '19977272.526619469933528807',
// gauge: '0.0'
// }
// ------------ WITHDRAW ------------
await lendMarket.vault.maxWithdraw();
// 20020.043244481699203505
await lendMarket.vault.previewWithdraw(10000); // Shares to send
// 9978636.051211318667087166
await lendMarket.vault.withdraw(10000);
//0xa8df19e420040dc21e60f1a25eedec01fead748e2d654100ca3e2d0e369a7ae0
await lendMarket.wallet.balances();
// {
// collateral: '100000.0',
// borrowed: '989979.95718098845915171',
// vaultShares: '9998636.505706074967248914',
// gauge: '0.0'
// }
// ------------ REDEEM ------------
await lendMarket.vault.maxRedeem();
// 9998636.505706074967248914
await lendMarket.vault.previewRedeem(10000); // Assets to receive
// 10.021409718764999588
await lendMarket.vault.redeem(10000);
// 0x391721baa517170c23819b070532a3429ab3c7a306042615bf8e1983d035e363
await lendMarket.wallet.balances();
// {
// collateral: '100000.0',
// borrowed: '989989.978590745251091246',
// vaultShares: '9988636.505706074967248914',
// gauge: '0.0'
// }
// ------------ REWARDS ------------
lendMarket.vault.rewardsOnly();
// false
await lendMarket.vault.totalLiquidity();
// 180638.919172
await lendMarket.vault.crvApr();
// [0, 0]
await lendMarket.vault.rewardTokens();
// []
await lendMarket.vault.rewardsApr();
// []
await lendMarket.vault.claimableCrv();
// 0.0
await lendMarket.vault.claimCrv();
// 0x8325bada809340d681c165ffc5bac0ba490f8350872b5d0aa82f3fe6c01205aa
await lendMarket.vault.claimableRewards();
// []
await lendMarket.vault.claimRewards();
// 0xb0906c3a2dea66d1ab6f280833f7205f46af7374f8cf9baa5429f881094140ba
贷款的附带报酬
CRV -- -- 流动性开采 -- -- 对AMM中保存的抵押品的奖励。 可在LLv2市场上使用,这些市场在AMM上附有LM召回;在LLv1上 isCollateralRewardEnable 总是返回 false。两个版本的调用表面相同.
(async () => {
await llamalend.init('JsonRpc', {});
await llamalend.lendMarkets.fetchMarkets();
const lendMarket = llamalend.getLendMarket('one-way-market-0');
// Check support before showing/using the rest
await lendMarket.collateralRewards.isCollateralRewardEnable();
// true
await lendMarket.collateralRewards.callbackAddress();
// 0x...
await lendMarket.collateralRewards.userCollateral();
// 1.5
await lendMarket.collateralRewards.totalCollateral();
// 1250.0
await lendMarket.collateralRewards.claimableCrv();
// 0.0
await lendMarket.collateralRewards.estimateGas.claimCrv();
// 250000
await lendMarket.collateralRewards.claimCrv();
// 0x8325bada809340d681c165ffc5bac0ba490f8350872b5d0aa82f3fe6c01205aa
})()
创建贷款, 增加抵押品, 更多借款, 偿还出借市场
(async () => {
await llamalend.init('JsonRpc', {});
await llamalend.lendMarkets.fetchMarkets();
const lendMarket = llamalend.getLendMarket('one-way-market-0');
// --- CREATE LOAN ---
await lendMarket.oraclePrice();
// 3000.0
await lendMarket.price();
// 3045.569137149127502965
await lendMarket.basePrice();
// '3000.0'
await lendMarket.wallet.balances();
// { borrowed: '0.0', collateral: '1.0' }
await lendMarket.createLoanMaxRecv(0.5, 5);
// 1375.74670276529114147
await lendMarket.createLoanBands(0.5, 1000, 5);
// [ 36, 32 ]
await lendMarket.createLoanPrices(0.5, 1000, 5);
// [ '2068.347257607234777', '2174.941007873561634' ]
await lendMarket.createLoanHealth(0.5, 1000, 5); // FULL
// 45.191203147616155
await lendMarket.createLoanHealth(0.5, 1000, 5, false); // NOT FULL
// 3.9382535412942367
await lendMarket.createLoanIsApproved(0.5);
// false
await lendMarketa.createLoanApprove(0.5);
// [
// '0xc111e471715ae6f5437e12d3b94868a5b6542cd7304efca18b5782d315760ae5'
// ]
await lendMarket.createLoan(0.5, 1000, 5);
console.log(await lendMarket.userLoanExists());
//true
console.log(await lendMarket.userState());
//
{
N: "5"
borrowed: "0.0"
collateral: "1.0"
debt: "1000.0"
}
//
console.log(await lendMarket.userHealth()); // FULL
//722.5902543890457276
console.log(await lendMarket.userHealth(false)); // NOT FULL
//3.4708541149110123
console.log(await lendMarket.userRange());
//5
console.log(await lendMarket.userBands());
//[206,,202]
console.log(await lendMarket.userPrices());
//["1073.332550295331639435","1128.647508360591547283]
console.log(await lendMarket.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 lendMarket.borrowMoreMaxRecv(0.1);
// 650.896043318349376298
await lendMarket.borrowMoreBands(0.1, 500);
// [ 14, 10 ]
await lendMarket.borrowMorePrices(0.1, 500);
// [ '2580.175063923865968', '2713.146225026413746' ]
await lendMarket.borrowMoreHealth(0.1, 500); // FULL
// 15.200984677843693 %
await lendMarket.borrowMoreHealth(0.1, 500, false); // NOT FULL
// 3.7268336789002429 %
await lendMarket.borrowMoreIsApproved(0.1);
// true
await lendMarket.borrowMoreApprove(0.1);
// []
await lendMarket.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 lendMarket.addCollateralBands(0.2);
// [ 43, 39 ]
await lendMarket.addCollateralPrices(0.2);
// [ '1927.834806254156043', '2027.187147180850842' ]
await lendMarket.addCollateralHealth(0.2); // FULL
// 55.2190795613534006
await lendMarket.addCollateralHealth(0.2, false); // NOT FULL
// 3.3357274109987789
await lendMarket.addCollateralIsApproved(0.2);
// true
await lendMarket.addCollateralApprove(0.2);
// []
await lendMarket.addCollateral(0.2); // OR await lendMarket.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 lendMarket.maxRemovable()
// 0.254841506439755199
await lendMarket.removeCollateralBands(0.1);
// [ 29, 25 ]
await lendMarket.removeCollateralPrices(0.1);
// [ '2219.101120164841944', '2333.46407819744091' ]
await lendMarket.removeCollateralHealth(0.1); // FULL
// 35.1846612411492316
await lendMarket.removeCollateralHealth(0.1, false); // NOT FULL
// 4.0796515570298074
await lendMarket.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 lendMarket.wallet.balances();
// { borrowed: '1500.0', collateral: '0.3' }
await lendMarket.repayBands(1000);
// [ 139, 135 ]
await lendMarket.repayPrices(1000);
// [ '734.595897104762463', '772.453820291837448' ]
await lendMarket.repayHealth(1000); // FULL
// 315.2178906180373138
await lendMarket.repayHealth(1000, false); // NOT FULL
// 3.3614254588945566
await lendMarket.repayIsApproved(1000);
// true
await lendMarket.repayApprove(1000);
// []
await lendMarket.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 lendMarket.fullRepayIsApproved();
// true
await lendMarket.fullRepayApprove();
// []
await lendMarket.fullRepay();
// Loan exists: false
// State: { collateral: '0.0', borrowed: '0.0', debt: '0.0' }
})()
创建出借的所有范围方法
await llamalend.init('JsonRpc', {});
const lendMarket = llamalend.getLendMarket('one-way-market-0');
await lendMarket.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 lendMarket.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 lendMarket.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
// }
换出市场
(async () => {
await llamalend.init('JsonRpc', {});
const lendMarket = llamalend.getLendMarket('one-way-market-0');
await lendMarket.wallet.balances();
// {
// borrowed: '301.533523886491869218',
// collateral: '0.860611976623971606'
// }
await lendMarket.maxSwappable(0, 1);
// 380.672763174593107707
await lendMarket.swapExpected(0, 1, 100); // 100 - in_amount
// 0.03679356627103543 (out_amount)
await lendMarket.swapRequired(0, 1, 0.03679356627103543); // 0.03679356627103543 - out_amount
// 100.000000000000000558 (in_amount)
await lendMarket.swapPriceImpact(0, 1, 100);
// 0.170826
await lendMarket.swapIsApproved(0, 100);
// true
await lendMarket.swapApprove(0, 100);
// []
await lendMarket.swap(0, 1, 100, 0.1);
await lendMarket.wallet.balances();
// {
// borrowed: '201.533523886491869218',
// collateral: '0.897405542895007036'
// }
})()
贷款的自清算
(async () => {
await llamalend.init('JsonRpc', {});
const lendMarket = llamalend.getLendMarket('one-way-market-0');
// Wallet balances: {
// borrowed: '301.533523886491869218',
// collateral: '0.860611976623971606'
// }
// State: {
// collateral: '0.139388023376028394',
// borrowed: '2751.493405530582315609',
// debt: '3053.026929417074184827'
// }
await lendMarket.tokensToLiquidate();
// 301.533523886491869218
await lendMarket.selfLiquidateIsApproved();
// true
await lendMarket.selfLiquidateApprove();
// []
await lendMarket.selfLiquidate(0.1); // slippage = 0.1 %
// Wallet balances: { borrowed: '0.0', collateral: '1.0' }
// State: { collateral: '0.0', borrowed: '0.0', debt: '0.0' }
})()
部分自偿出借市场
(async () => {
await llamalend.init('JsonRpc', {});
const lendMarket = llamalend.getLendMarket('one-way-market-0');
// Wallet balances: {
// borrowed: '301.533523886491869218',
// collateral: '0.860611976623971606'
// }
// State: {
// collateral: '0.139388023376028394',
// borrowed: '2751.493405530582315609',
// debt: '3053.026929417074184827'
// }
await lendMarket.tokensToLiquidate();
// 301.533523886491869218
const fraction = await lendMarket.calcPartialFrac(140); // <- 140 - amount (should be less then lendMarket.tokensToLiquidate)
// {frac: '472880873283878292', fracDecimal: '0.47288087328387829207', amount: 140}
//
await lendMarket.partialSelfLiquidateIsApproved(fraction);
// false
await lendMarket.partialSelfLiquidateApprove(fraction);
// []
await lendMarket.partialSelfLiquidateIsApproved(fraction);
// true
await lendMarket.partialSelfLiquidate(fraction, 0.1); // slippage = 0.1 %
// Wallet balances: { borrowed: '0', collateral: '0.7' }
// State: { collateral: '0.6', borrowed: '1300', debt: '1500' }
})()
贷款清算
(async () => {
await llamalend.init('JsonRpc', {});
const lendMarket = llamalend.getLendMarket('one-way-market-0');
const addressToLiquidate = "0x66aB6D9362d4F35596279692F0251Db635165871";
await lendMarket.wallet.balances();
// Liquidator wallet balances: {
// borrowed: '301.533523886491869218',
// collateral: '0.860611976623971606'
// }
await lendMarket.userState(addressToLiquidate);
// State of the account we are goning to liquidate: {
// collateral: '0.139388023376028394',
// borrowed: '2751.493405530582315609',
// debt: '3053.026929417074184827'
// }
await lendMarket.currentLeverage()
//0.94083266399502623316
await lendMarket.currentPnL()
/*
{
currentPosition:"9.383656846426222260"
currentProfit:"0.007205653033021260"
deposited:"1.572195559253977"
percentage:"0.46"
}
*/
await lendMarket.tokensToLiquidate(addressToLiquidate);
// 301.533523886491869218
await lendMarket.liquidateIsApproved();
// true
await lendMarket.liquidateApprove();
// []
await lendMarket.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' }
})()
出借市场的未来贷款方法
行动后估计未来影响力
await lendMarket.borrowMoreFutureLeverage(0.1, 500);
await lendMarket.repayFutureLeverage(1000);
await lendMarket.leverage.borrowMoreFutureLeverage(userCollateral, userBorrowed, debt);
await lendMarket.leverage.repayFutureLeverage(stateCollateral, userCollateral, userBorrowed);
强制更新出借的用户状态
执行某些交易后,建议强制更新缓存中的用户状态,以确保数据一致性:
// Methods after which you should call forceUpdateUserState:
// - createLoan()
// - leverage.createLoan()
// - borrowMore()
// - partialSelfLiquidate()
// - repay()
// Basic usage (after successful transaction):
const txHash = await lendMarket.createLoan(0.5, 1000, 5);
// Wait for transaction to be mined and confirmed
await lendMarket.forceUpdateUserState(txHash);
// With specific user address:
await lendMarket.forceUpdateUserState(txHash, "0x123...");
// The method sends a request with new_tx parameter and clears the cache
// to get fresh user state data
// Important: Only call after successful transaction confirmation
为什么使用强制 Update UserState?
- 确保成功交易后的数据一致性
- 清除缓存的用户状态数据
- 将新 API 请求与交易散列
- 防止陈旧的数据问题
- 重要: 仅在交易成功被布雷和确认后才呼叫
何时使用 :
- 之后
createLoan()- 创建新贷款时 - 之后
leverage.createLoan()- 在创建杠杆位置时 - 之后
borrowMore()- 增加贷款额时 - 之后
partialSelfLiquidate()- 部分清理位置时 - 之后
repay()- 偿还贷款时
出借市场用户损失
(async () => {
await llamalend.init('JsonRpc', {});
const lendMarket = llamalend.getLendMarket('sfrxeth');
console.log(await lendMarket.userLoss("0x0063046686E46Dc6F15918b61AE2B121458534a5"));
// {
// deposited_collateral: '929.933909709140155529',
// current_collateral_estimation: '883.035865972092328038',
// loss: '46.898043737047827491',
// loss_pct: '5.043158793049750311'
// }
})()
借出( 创建 Loan, 借出 More, 偿还) 借出 Market 杠杆 ZapV2
LendMarket杠杆操作支持不同的路由器,并需要外部路由服务提供的引用信息.
中断更改
1. 新的衡量标准方法 -- -- 将所有衡量标准纳入一个呼叫中
- 改为
createLoanBands, (中文(简体) ),createLoanPrices, (中文(简体) ),createLoanHealth, (中文(简体) ),createLoanPriceImpact数字 :createLoanExpectedMetrics()- 价格、波段、价格、健康 - 改为
borrowMoreBands, (中文(简体) ),borrowMorePrices, (中文(简体) ),borrowMoreHealth, (中文(简体) ),borrowMorePriceImpact数字 :borrowMoreExpectedMetrics()- 回报价格影响、波段、价格、健康 - 改为
repayBands, (中文(简体) ),repayPrices, (中文(简体) ),repayHealth, (中文(简体) ),repayPriceImpact数字 :repayExpectedMetrics()- 回报价格影响、波段、价格、健康
Iverage 度量衡 - 用新方法返回的计量对象:
interface ILeverageMetrics {
priceImpact: number;
bands: [number, number];
prices: string[];
health: string;
}
2. 最后方法现在需要 router, (中文(简体) ), calldata 财务报告和审定财务报表 minRecv 参数
- 在此之前数字 :
createLoan(userCollateral, userBorrowed, debt, range) - 现在数字 :
createLoan(userCollateral, userBorrowed, debt, range, minRecv, router, calldata) - 在此之前数字 :
borrowMore(userCollateral, userBorrowed, debt, slippage) - 现在数字 :
borrowMore(userCollateral, userBorrowed, debt, minRecv, router, calldata) - 在此之前数字 :
repay(stateCollateral, userCollateral, userBorrowed, slippage) - 现在数字 :
repay(stateCollateral, userCollateral, userBorrowed, minRecv, router, calldata)
地点 router - 路由器地址, calldata - 调用数据字节代码, minRecv - 最低接收额(见 安全改进(中文(简体) )
理解召回函数和引用
获取预期Fn - 从路由器取出引号的调用函数(例如Odos, Curve):
type GetExpectedFn = (
fromToken: string, // Address of token to swap from
toToken: string, // Address of token to swap to
amountIn: bigint, // Amount of tokens to swap (in wei)
blacklist: string | string[], // Contract/pool addresses to exclude
) => Promise<IQuote | null>; // null when no route is found
引用 - 有互换信息的引用对象:
interface IQuote {
outAmount: string; // Amount of tokens to receive
priceImpact: number; // Price impac
}
不同操作需要引用哪些词
| 动作类型 | 引用输入 |
|---|---|
| 创建 LOAN | 债务 + 用户 Borrowed |
| 借更多钱 | 债务 + 用户 Borrowed |
| 偿还 | 状态边框 + 用户边框 |
为创建Loan和借更多:
- 换取引用
(debt + userBorrowed)借入的代币 − 抵押代币 - 示例:债务=2000,用户Borrowed=1000, 借出3000个借入的令牌换作抵押
快点! 注意:这里的债务是指操作期间所增加的债务金额,而不是用户在操作后将拥有的新的债务总额.
偿还:
- 换取引用
(stateCollateral + userCollateral)有价证券 = 借出证券 - 示例: 对于 State Corlateral = 2 和 user Corlateral = 1 , 以 3 个抵押符交换出所借符
安全改进
执行方法(createLoan, (中文(简体) ), borrowMore, (中文(简体) ), repay接受一个 minRecv 参数保证了交换后收到的最低信使数量。 这可以保护用户避免滑行和前跑.
使用 calcMinRecv(expected, slippage) 计算最低可接受数量:
公式 : minRecv = expected * (100 - slippage) / 100
expected——从互换中预期的代币金额slippage——允许下降百分比(如:.0.5(0.5%)
// quote.outAmount — the expected amount from your router (computed on your side)
const minRecv = lendMarket.leverageZapV2.calcMinRecv(quote.outAmount, 0.5); // 0.5% slippage
await lendMarket.leverageZapV2.createLoan({ userCollateral, debt, range, minRecv, router, calldata });
利用路由器操作
(async () => {
await llamalend.init('JsonRpc', {});
await llamalend.lendMarkets.fetchMarkets();
const lendMarket = llamalend.getLendMarket('one-way-market-0');
const router = '0x.....'; // router name
const calldata = '0x...'; // calldata from router for executing swap
const quote = // quote from your router (debt + userBorrowed)
// - 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;
await lendMarket.leverageZapV2.maxLeverage(range);
// 7.4728229145282742179
// Get maximum possible debt for given parameters
await lendMarket.leverageZapV2.createLoanMaxRecv({ userCollateral, range, getExpected });
// {
// maxDebt: '26089.494406081862861214',
// maxTotalCollateral: '9.539182089833411347',
// userCollateral: '1',
// collateralFromUserBorrowed: '0.315221168834966496',
// collateralFromMaxDebt: '8.223960920998444851',
// maxLeverage: '7.25291100528992828612',
// avgPrice: '3172.3757757003568790858'
// }
// Get quote for swapping (debt + userBorrowed)!!!
// Get expected collateral amount
await lendMarket.leverageZapV2.createLoanExpectedCollateral({ userCollateral, debt, quote });
// {
// totalCollateral: '1.946422996710829',
// userCollateral: '1.0',
// collateralFromUserBorrowed: '0.315474332236942984',
// collateralFromDebt: '0.630948664473886',
// leverage: '1.4796358613861877'
// avgPrice: '3169.8299919022623523421'
// }
// NEW: Get all metrics in one call
const metrics = await lendMarket.leverageZapV2.createLoanExpectedMetrics({
userCollateral,
debt,
range,
quote,
healthIsFull: true // true for full health, false for not full
});
// {
// priceImpact: 0.08944411854377342, // %
// bands: [76, 67],
// prices: ['1027.977701011670136614', '1187.061409925215211173'],
// health: '195.8994783042570637' // %
//
await lendMarket.leverageZapV2.createLoanIsApproved({ userCollateral });
// false
await lendMarket.leverageZapV2.createLoanApprove({ userCollateral });
// [
// '0xd5491d9f1e9d8ac84b03867494e35b25efad151c597d2fa4211d7bf5d540c98e',
// '0x93565f37ec5be902a824714a30bddc25cf9cd9ed39b4c0e8de61fab44af5bc8c'
// ]
// Calculate minRecv with slippage protection (see Security Improvements)
// expected — amount from your router quote
const minRecv = lendMarket.leverageZapV2.calcMinRecv(quote.outAmount, 0.5); // 0.5% slippage
// Create loan, passing router address and calldata from router
await lendMarket.leverageZapV2.createLoan({ userCollateral, debt, range, minRecv, router, calldata });
// 0xeb1b7a92bcb02598f00dc8bbfe8fa3a554e7a2b1ca764e0ee45e2bf583edf731
await lendMarket.wallet.balances();
// {
// collateral: '99.0',
// borrowed: '599000.0',
// vaultShares: '1400000000.0',
// gauge: '0'
// }
await lendMarket.userState();
// {
// collateral: '1.945616160868693648',
// borrowed: '0.0',
// debt: '2000.0',
// N: '10'
// }
await lendMarket.userBands();
// [ 76, 67 ]
await lendMarket.userPrices();
// [ '1027.977718614028011906', '1187.061430251609195098' ]
await lendMarket.userHealth();
// 195.8372633833293605
await lendMarket.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;
// Get maximum possible debt for given parameters
await lendMarket.leverageZapV2.borrowMoreMaxRecv({ userCollateral, getExpected });
// {
// maxDebt: '76182.8497941193262889',
// maxTotalCollateral: '26.639775583730298462',
// userCollateral: '2',
// collateralFromUserBorrowed: '1.677318306610359627',
// collateralFromMaxDebt: '22.962457277119938834',
// avgPrice: '3172.55402418338331369083'
// }
// Get quote for swapping (debt + userBorrowed)
await lendMarket.leverageZapV2.borrowMoreExpectedCollateral({ userCollateral, dDebt: debt, quote });
// {
// totalCollateral: '5.783452104143246413',
// userCollateral: '2.0',
// collateralFromUserBorrowed: '0.630575350690541071',
// collateralFromDebt: '3.152876753452705342'
// avgPrice: '3171.70659749038129067231'
// }
// NEW: Get all metrics in one call
const metricsBM = await lendMarket.leverageZapV2.borrowMoreExpectedMetrics({
userCollateral,
debt,
quote,
healthIsFull: true // true for full health, false for not full
});
// {
// priceImpact: 0.010784277354269765, // %
// bands: [47, 38],
// prices: ['1560.282474721398939216', '1801.742501325928269008'],
// health: '91.6798951784708552' // %
// }
await lendMarket.leverageZapV2.borrowMoreIsApproved({ userCollateral });
// true
await lendMarket.leverageZapV2.borrowMoreApprove({ userCollateral });
// []
// Calculate minRecv with slippage protection (see Security Improvements)
const minRecvBM = lendMarket.leverageZapV2.calcMinRecv(quote.outAmount, 0.5); // 0.5% slippage
// Execute borrowMore, passing router address and calldata from router
await lendMarket.leverageZapV2.borrowMore({ userCollateral, debt, minRecv: minRecvBM, router, calldata });
// 0x6357dd6ea7250d7adb2344cd9295f8255fd8fbbe85f00120fbcd1ebf139e057c
await lendMarket.wallet.balances();
// {
// collateral: '97.0',
// borrowed: '597000.0',
// vaultShares: '1400000000.0',
// gauge: '0'
// }
await lendMarket.userState();
// {
// collateral: '7.727839965845165558',
// borrowed: '0.0',
// debt: '12000.000010193901375446',
// N: '10'
// }
await lendMarket.userBands();
// [ 47, 38 ]
await lendMarket.userPrices();
// [ '1560.28248267408177179', '1801.742510509320950242' ]
await lendMarket.userHealth();
// 91.6519475547753288
await lendMarket.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;
// Get quote for swapping (stateCollateral + userCollateral)
await lendMarket.leverageZapV2.repayExpectedBorrowed({ stateCollateral, userCollateral, quote });
// {
// totalBorrowed: '10998.882838599741571472',
// borrowedFromStateCollateral: '6332.588559066494374648',
// borrowedFromUserCollateral: '3166.294279533247196824',
// userBorrowed: '1500'
// avgPrice: '3166.29427953324743125312'
// }
await lendMarket.leverageZapV2.repayIsFull({ stateCollateral, userCollateral, quote });
// false
await lendMarket.leverageZapV2.repayIsAvailable({ stateCollateral, userCollateral, quote });
// true
// NEW: Get all metrics in one call
const metricsRepay = await lendMarket.leverageZapV2.repayExpectedMetrics({
stateCollateral,
userCollateral,
healthIsFull: true, // true for full health, false for not full
quote,
address: llamalend.signerAddress
});
// {
// priceImpact: 0.013150142802201724, // %
// bands: [199, 190],
// prices: ['175.130965754280721633', '202.233191367561902757'],
// health: '1699.6097751079226865' // %
// }
await lendMarket.leverageZapV2.repayIsApproved({ userCollateral });
// false
await lendMarket.leverageZapV2.repayApprove({ userCollateral });
// ['0xd8a8d3b3f67395e1a4f4d4f95b041edcaf1c9f7bab5eb8a8a767467678295498']
// Calculate minRecv with slippage protection (see Security Improvements)
const minRecvRepay = lendMarket.leverageZapV2.calcMinRecv(quote.outAmount, 0.5); // 0.5% slippage
// Execute repay, passing router address and calldata from router
await lendMarket.leverageZapV2.repay({ stateCollateral, userCollateral, minRecv: minRecvRepay, router, calldata });
// 0xe48a97fef1c54180a2c7d104d210a95ac1a516fdd22109682179f1582da23a82
await lendMarket.wallet.balances();
// {
// collateral: '96.0',
// borrowed: '595500.0',
// vaultShares: '1400000000.0',
// gauge: '0'
// }
await lendMarket.userState();
// {
// collateral: '5.727839965845165558',
// borrowed: '0.0',
// debt: '992.083214663467727334',
// N: '10'
// }
await lendMarket.userBands();
// [ 199, 190 ]
await lendMarket.userPrices();
// [ '175.13096689602455189', '202.233192685995210783' ]
await lendMarket.userHealth();
// 1716.0249924305707883
await lendMarket.userHealth(false);
// 3.6389352509210336
})()
借入创建出借市场的所有范围方法
await llamalend.init('JsonRpc', {});
await llamalend.lendMarkets.fetchMarkets();
const lendMarket = llamalend.getLendMarket('one-way-market-0');
const userCollateral = 1;
const userBorrowed = 1000;
const debt = 2000;
// Get maximum values for all possible ranges
await lendMarket.leverageZapV2.createLoanMaxRecvAllRanges({ userCollateral, getExpected });
// {
// '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'
// }
// Get quote for specific debt + userBorrowed
// and provide getExpected callback
await lendMarket.leverageZapV2.createLoanBandsAllRanges({ userCollateral, debt, getExpected, quote });
// {
// '4': [ 73, 70 ],
// '5': [ 73, 69 ],
// '6': [ 74, 69 ],
// '7': [ 74, 68 ],
//
// ...
//
// '50': [ 97, 48 ]
// }
await lendMarket.leverageZapV2.createLoanPricesAllRanges({ userCollateral, debt, getExpected, quote });
// {
// '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' ]
// }
借出市场! 将来会删除,请使用杠杆ZapV2
(async () => {
await llamalend.init('JsonRpc', {}, {}, API_KEY_1INCH);
await llamalend.lendMarkets.fetchMarkets();
const lendMarket = llamalend.getLendMarket('one-way-market-0');
console.log(lendMarket.collateral_token, lendMarket.borrowed_token);
// {
// address: '0x82af49447d8a07e3bd95bd0d56f35241523fbab1',
// decimals: 18,
// name: 'Wrapped Ether',
// symbol: 'WETH'
// }
//
// {
// address: '0x498bf2b1e120fed3ad3d42ea2165e9b73f99c1e5',
// decimals: 18,
// name: 'curve.finance USD Stablecoin',
// symbol: 'crvUSD'
// }
console.log(await lendMarket.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 lendMarket.leverage.maxLeverage(range);
// 7.4728229145282742179
await lendMarket.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 lendMarket.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 lendMarket.leverage.createLoanPriceImpact(userBorrowed, debt);
// 0.08944411854377342 %
await lendMarket.leverage.createLoanMaxRange(userCollateral, userBorrowed, debt);
// 50
await lendMarket.leverage.createLoanBands(userCollateral, userBorrowed, debt, range);
// [ 76, 67 ]
await lendMarket.leverage.createLoanPrices(userCollateral, userBorrowed, debt, range);
// [ '1027.977701011670136614', '1187.061409925215211173' ]
await lendMarket.leverage.createLoanHealth(userCollateral, userBorrowed, debt, range);
// 195.8994783042570637
await lendMarket.leverage.createLoanHealth(userCollateral, userBorrowed, debt, range, false);
// 3.2780908310686365
await lendMarket.leverage.createLoanIsApproved(userCollateral, userBorrowed);
// false
await lendMarket.leverage.createLoanApprove(userCollateral, userBorrowed);
// [
// '0xd5491d9f1e9d8ac84b03867494e35b25efad151c597d2fa4211d7bf5d540c98e',
// '0x93565f37ec5be902a824714a30bddc25cf9cd9ed39b4c0e8de61fab44af5bc8c'
// ]
await lendMarket.leverage.createLoanRouteImage(userBorrowed, debt);
// 'data:image/svg+xml;base64,PHN2ZyBpZD0ic2Fua2V5UGFyZW50U3ZnIiB4bWxucz...'
// You must call lendMarket.leverage.createLoanExpectedCollateral() with the same args before
await lendMarket.leverage.createLoan(userCollateral, userBorrowed, debt, range);
// 0xeb1b7a92bcb02598f00dc8bbfe8fa3a554e7a2b1ca764e0ee45e2bf583edf731
await lendMarket.wallet.balances();
// {
// collateral: '99.0',
// borrowed: '599000.0',
// vaultShares: '1400000000.0',
// gauge: '0'
// }
await lendMarket.userState();
// {
// collateral: '1.945616160868693648',
// borrowed: '0.0',
// debt: '2000.0',
// N: '10'
// }
await lendMarket.userBands();
// [ 76, 67 ]
await lendMarket.userPrices();
// [ '1027.977718614028011906', '1187.061430251609195098' ]
await lendMarket.userHealth();
// 195.8372633833293605
await lendMarket.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 lendMarket.leverage.borrowMoreMaxRecv(userCollateral, userBorrowed);
// {
// maxDebt: '76182.8497941193262889',
// maxTotalCollateral: '26.639775583730298462',
// userCollateral: '2',
// collateralFromUserBorrowed: '1.677318306610359627',
// collateralFromMaxDebt: '22.962457277119938834',
// avgPrice: '3172.55402418338331369083'
// }
await lendMarket.leverage.borrowMoreExpectedCollateral(userCollateral, userBorrowed, debt, slippage);
// {
// totalCollateral: '5.783452104143246413',
// userCollateral: '2.0',
// collateralFromUserBorrowed: '0.630575350690541071',
// collateralFromDebt: '3.152876753452705342'
// avgPrice: '3171.70659749038129067231'
// }
await lendMarket.leverage.borrowMorePriceImpact(userBorrowed, debt);
// 0.010784277354269765 %
await lendMarket.leverage.borrowMoreBands(userCollateral, userBorrowed, debt);
// [ 47, 38 ]
await lendMarket.leverage.borrowMorePrices(userCollateral, userBorrowed, debt);
// [ '1560.282474721398939216', '1801.742501325928269008' ]
await lendMarket.leverage.borrowMoreHealth(userCollateral, userBorrowed, debt, true);
// 91.6798951784708552
await lendMarket.leverage.borrowMoreHealth(userCollateral, userBorrowed, debt, false);
// 3.7614279042995641
await lendMarket.leverage.borrowMoreIsApproved(userCollateral, userBorrowed);
// true
await lendMarket.leverage.borrowMoreApprove(userCollateral, userBorrowed);
// []
await lendMarket.leverage.borrowMoreRouteImage(userBorrowed, debt);
// 'data:image/svg+xml;base64,PHN2ZyBpZD0ic2Fua2V5UGFyZW50U3ZnIiB4bWxucz...'
// You must call lendMarket.leverage.borrowMoreExpectedCollateral() with the same args before
await lendMarket.leverage.borrowMore(userCollateral, userBorrowed, debt, slippage);
// 0x6357dd6ea7250d7adb2344cd9295f8255fd8fbbe85f00120fbcd1ebf139e057c
await lendMarket.wallet.balances();
// {
// collateral: '97.0',
// borrowed: '597000.0',
// vaultShares: '1400000000.0',
// gauge: '0'
// }
await lendMarket.userState();
// {
// collateral: '7.727839965845165558',
// borrowed: '0.0',
// debt: '12000.000010193901375446',
// N: '10'
// }
await lendMarket.userBands();
// [ 47, 38 ]
await lendMarket.userPrices();
// [ '1560.28248267408177179', '1801.742510509320950242' ]
await lendMarket.userHealth();
// 91.6519475547753288
await lendMarket.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 lendMarket.leverage.repayExpectedBorrowed(stateCollateral, userCollateral, userBorrowed, slippage);
// {
// totalBorrowed: '10998.882838599741571472',
// borrowedFromStateCollateral: '6332.588559066494374648',
// borrowedFromUserCollateral: '3166.294279533247196824',
// userBorrowed: '1500'
// avgPrice: '3166.29427953324743125312'
// }
await lendMarket.leverage.repayPriceImpact(stateCollateral, userCollateral);
// 0.013150142802201724 %
await lendMarket.leverage.repayIsFull(stateCollateral, userCollateral, userBorrowed);
// false
await lendMarket.leverage.repayIsAvailable(stateCollateral, userCollateral, userBorrowed);
// true
await lendMarket.leverage.repayBands(stateCollateral, userCollateral, userBorrowed);
// [ 199, 190 ]
await lendMarket.leverage.repayPrices(stateCollateral, userCollateral, userBorrowed);
// [ '175.130965754280721633', '202.233191367561902757' ]
await lendMarket.leverage.repayHealth(stateCollateral, userCollateral, userBorrowed, true);
// 1699.6097751079226865
await lendMarket.leverage.repayHealth(stateCollateral, userCollateral, userBorrowed, false);
// 3.4560086962806991
await lendMarket.leverage.repayIsApproved(userCollateral, userBorrowed);
// false
await lendMarket.leverage.repayApprove(userCollateral, userBorrowed);
// ['0xd8a8d3b3f67395e1a4f4d4f95b041edcaf1c9f7bab5eb8a8a767467678295498']
await lendMarket.leverage.repayRouteImage(stateCollateral, userCollateral);
// 'data:image/svg+xml;base64,PHN2ZyBpZD0ic2Fua2V5UGFyZW50U3ZnIiB4bWxucz...'
// You must call lendMarket.leverage.repayExpectedBorrowed() with the same args before
await lendMarket.leverage.repay(stateCollateral, userCollateral, userBorrowed, slippage);
// 0xe48a97fef1c54180a2c7d104d210a95ac1a516fdd22109682179f1582da23a82
await lendMarket.wallet.balances();
// {
// collateral: '96.0',
// borrowed: '595500.0',
// vaultShares: '1400000000.0',
// gauge: '0'
// }
await lendMarket.userState();
// {
// collateral: '5.727839965845165558',
// borrowed: '0.0',
// debt: '992.083214663467727334',
// N: '10'
// }
await lendMarket.userBands();
// [ 199, 190 ]
await lendMarket.userPrices();
// [ '175.13096689602455189', '202.233192685995210783' ]
await lendMarket.userHealth();
// 1716.0249924305707883
await lendMarket.userHealth(false);
// 3.6389352509210336
})()
借入创建出借市场的所有范围方法
await llamalend.init('JsonRpc', {}, {}, API_KEY_1INCH);
await llamalend.lendMarkets.fetchMarkets();
const lendMarket = llamalend.getLendMarket('one-way-market-0');
const userCollateral = 1;
const userBorrowed = 1000;
const debt = 2000;
await lendMarket.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 lendMarket.leverage.createLoanBandsAllRanges(userCollateral, userBorrowed, debt);
// {
// '4': [ 73, 70 ],
// '5': [ 73, 69 ],
// '6': [ 74, 69 ],
// '7': [ 74, 68 ],
//
// ...
//
// '50': [ 97, 48 ]
// }
await lendMarket.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' ]
// }
薄荷市场
MintMarket 字段
import llamalend from "@curvefi/llamalend-api";
import {llamalend} from "./llamalend";
(async () => {
await llamalend.init('JsonRpc', {});
const mintMarket = llamalend.getMintMarket('eth');
mintMarket.id;
// eth
mintMarket.address;
// 0x3897810a334833184Ef7