@curvefi/llamalend-api

中文文档
2.7.1发布于 2026/11/09MITTypeScriptES Module构建来源已验证近 30 天下载 6491

用于曲线借阅的 JavaScript 库

中文使用文档
文档目录25 节
  1. 设置
  2. 输入
  3. 页:1
  4. 一般方法
  5. 借出市场
  6. 借出市场字段
  7. 出借的钱包余额
  8. 出借市场
  9. 赔款:押金、薄荷、分金、未取款、提款、赎回借给马克泰
  10. 贷款的附带报酬
  11. 创建贷款, 增加抵押品, 更多借款, 偿还出借市场
  12. 创建出借的所有范围方法
  13. 换出市场
  14. 贷款的自清算
  15. 部分自偿出借市场
  16. 贷款清算
  17. 出借市场的未来贷款方法
  18. 强制更新出借的用户状态
  19. 出借市场用户损失
  20. 借出( 创建 Loan, 借出 More, 偿还) 借出 Market 杠杆 ZapV2
  21. 借入创建出借市场的所有范围方法
  22. 借出市场! 将来会删除,请使用杠杆ZapV2
  23. 借入创建出借市场的所有范围方法
  24. 薄荷市场
  25. MintMarket 字段

库夫·拉马伦德(签名)

设置

从 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

版本与发布记录

@curvefi/llamalend-api 共发布 120 个版本,首次发布于 2025/03/18;过去 12 个月发布了 85 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
2.7.1latest2026/11/091 天前
2.7.02026/11/046 天前
2.6.32026/10/1229 天前
2.6.22026/10/071 个月前
2.6.12026/10/011 个月前
2.6.02026/09/241 个月前

其他发布通道:legacy → 1.1.13。

关于 @curvefi/llamalend-api 的常见问题

@curvefi/llamalend-api 是什么?

用于曲线借阅的 JavaScript 库

如何安装 @curvefi/llamalend-api?

在项目目录运行 npm install @curvefi/llamalend-api,或使用 pnpm add / yarn add / bun add。

@curvefi/llamalend-api 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@curvefi/llamalend-api 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

@curvefi/llamalend-api 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js 24。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

@curvefi/llamalend-api 可以商用吗?

@curvefi/llamalend-api 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@curvefi/llamalend-api 的下载量有多少?

根据 npm 官方下载统计,@curvefi/llamalend-api 在 2026/10/11 – 2026/11/09 这 30 天内被下载 6,491 次,日均约 216 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@curvefi/llamalend-api 还在维护吗?

最新版本 2.7.1 发布于 2026/11/09(1 天前);至今共发布 120 个版本,其中过去 12 个月发布了 85 个;首次发布于 2025/03/18。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。