# @curvefi/llamalend-api 中文文档

规范地址：https://npmcn.com/package/%40curvefi/llamalend-api/

版本：2\.7\.1
npm 元数据更新时间：2026-11-09T12:45:09.275Z
中文译文更新时间：2026-11-11T05:12:31.222Z
软件包许可：MIT

本文由上游 README 翻译，可能存在偏差，请结合原文核对 API、命令与配置。版权与许可归原作者所有。

原始 npm 页面：https://www.npmjs.com/package/%40curvefi/llamalend-api
原文对照：https://npmcn.com/package/%40curvefi/llamalend-api/?lang=original
项目主页：https://github.com/curvefi/curve-llamalend.js#readme
源码仓库：https://github.com/curvefi/curve-llamalend.js

## 关键信息（来自 npm 元数据）

- 包体积（解压后）：2.7 MB，314 个文件
- 模块格式：ES Module
- TypeScript 类型：包内自带
- Node.js 要求：24
- 运行依赖：4 个
- 首次发布：2025-03-17T21:11:59.096Z
- 最新版本发布：2026-11-09T12:45:08.823Z
- 近 30 天下载量：6491（2026-10-11 至 2026-11-09，npm 官方下载统计）
- 已发布版本数：120（近 12 个月 85 个）

## 中文简介

用于曲线借阅的 JavaScript 库

## 安装

```sh
npm install @curvefi/llamalend-api
```

也可以使用：`pnpm add @curvefi/llamalend-api`、`yarn add @curvefi/llamalend-api`、`bun add @curvefi/llamalend-api`

## README

# 库夫·拉马伦德(签名)

## 设置

从 npm 安装 :

`npm install @curvefi/llamalend-api`

## 输入

```ts
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有此功能 [错误](https://hardhat.org/metamask-issue.html)

**说明2.** Web3 init需要地址. 因此,只有在收到地址后才能初始化.

**错误的QQ**

```tsx
import type { FunctionComponent } from 'react'
import { useState, useMemo } from 'react'
import { providers } from 'ethers'
import Onboard from 'bnc-onboard'
import type { Wallet } from 'bnc-onboard/dist/src/interfaces'
import 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,
                },
            }),
        []
    )

    ...
```

**对**

```tsx
import type { FunctionComponent } from 'react'
import { useState, useMemo, useEffect } from 'react'
import { providers } from 'ethers'
import Onboard from 'bnc-onboard'
import type { Wallet } from 'bnc-onboard/dist/src/interfaces'
import 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.

## 一般方法

```ts
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
})()
```

## 借出市场

### 借出市场字段

```ts
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
})()
```

### 出借的钱包余额

```ts
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"
    }
    //
})()
```

### 出借市场

```ts
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"
    // }
})()
```

### 赔款:押金、薄荷、分金、未取款、提款、赎回借给马克泰

```ts
    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`。两个版本的调用表面相同.

```ts
(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
})()
```

### 创建贷款, 增加抵押品, 更多借款, 偿还出借市场

```ts
(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' }
})()
```

### 创建出借的所有范围方法

```ts
    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
    // }
```

### 换出市场

```ts
(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'
    // }
})()
```

### 贷款的自清算

```ts
(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' }
})()
```

### 部分自偿出借市场

```ts
(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' }
})()
```

### 贷款清算

```ts
(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' }
})()
```

### 出借市场的未来贷款方法

行动后估计未来影响力

```ts
    await lendMarket.borrowMoreFutureLeverage(0.1, 500);
    
    await lendMarket.repayFutureLeverage(1000);
    
    await lendMarket.leverage.borrowMoreFutureLeverage(userCollateral, userBorrowed, debt);

    await lendMarket.leverage.repayFutureLeverage(stateCollateral, userCollateral, userBorrowed);
```

### 强制更新出借的用户状态

执行某些交易后,建议强制更新缓存中的用户状态,以确保数据一致性:

```ts
// 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()` - 偿还贷款时

### 出借市场用户损失

```ts
(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 度量衡** - 用新方法返回的计量对象:

```ts
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` - 最低接收额(见 [安全改进](https://npmcn.com/package/%40curvefi/llamalend-api/#readme-security-improvements)(中文(简体) )

#### 理解召回函数和引用

**获取预期Fn** - 从路由器取出引号的调用函数(例如Odos, Curve):

```ts
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
```

**引用** - 有互换信息的引用对象:

```ts
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%)

```ts
// 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 });
```

#### 利用路由器操作

```ts
(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
})()
```

### 借入创建出借市场的所有范围方法

```ts
    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

```ts
(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
})()
```

### 借入创建出借市场的所有范围方法

```ts
    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 字段

```ts
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 是什么？

用于曲线借阅的 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 和提交记录判断。

