# @dhedge/v2-sdk 中文文档

规范地址：https://npmcn.com/package/%40dhedge/v2-sdk/

版本：2\.2\.7
npm 元数据更新时间：2026-11-13T08:30:16.443Z
中文译文更新时间：2026-11-14T07:19:46.278Z
软件包许可：MIT

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

原始 npm 页面：https://www.npmjs.com/package/%40dhedge/v2-sdk
原文对照：https://npmcn.com/package/%40dhedge/v2-sdk/?lang=original

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

- 包体积（解压后）：4.5 MB，191 个文件
- 模块格式：CommonJS
- TypeScript 类型：包内自带
- Node.js 要求：\>=10
- 运行依赖：14 个
- 首次发布：2021-08-09T05:28:48.890Z
- 最新版本发布：2026-11-13T08:30:16.209Z
- 近 30 天下载量：2138（2026-10-12 至 2026-11-10，npm 官方下载统计）
- 已发布版本数：73（近 12 个月 13 个）

## 中文简介

用于在 dHEDGE V2 上构建应用程序的 SDK

## 安装

```sh
npm install @dhedge/v2-sdk
```

也可以使用：`pnpm add @dhedge/v2-sdk`、`yarn add @dhedge/v2-sdk`、`bun add @dhedge/v2-sdk`

## README

# dHEDGE V2 SDK (英语)

dHEDGE V2 之上的构建应用程序的完整实施

**特征 :**

-   与 [乙醚(js)](https://docs.ethers.io/)
-   从背景应用程序或您自己的 dApp 创建和管理 V2 池
-   易用功能,以交换资产,提供流动性或有利害关系的资产
-   用于创建自动交易 bots
-   在您的 Javascript 或 Typescript 计划中使用带有完整 Typescript 源
-   所有协议和网络 [dHEDGE 应用程序](https://dhedge.org/management/create) 获得支持

## 安装

```bash
# npm
npm install @dhedge/v2-sdk

# yarn
yarn add @dhedge/v2-sdk
```

## 快速启动

```ts
import { Dhedge, Dapp, Network, ethers } from "@dhedge/v2-sdk";

// 1. Connect a wallet
const provider = new ethers.providers.JsonRpcProvider("YOUR_RPC_URL");
const wallet = new ethers.Wallet("YOUR_PRIVATE_KEY", provider);
const dhedge = new Dhedge(wallet, Network.POLYGON);

// 2. Load an existing vault and check its composition
const vault = await dhedge.loadPool("VAULT_ADDRESS");
const composition = await vault.getComposition();

// 3. Deposit USDC into the vault
await vault.approveDeposit("USDC_ADDRESS", ethers.constants.MaxUint256);
await vault.deposit("USDC_ADDRESS", "1000000"); // 1 USDC (6 decimals)

// 4. Trade USDC → WETH on KyberSwap (no API key needed)
await vault.approve(Dapp.KYBERSWAP, "USDC_ADDRESS", ethers.constants.MaxUint256);
await vault.trade(Dapp.KYBERSWAP, "USDC_ADDRESS", "WETH_ADDRESS", "1000000", 0.5);
```

> 对于聚合支持的行业(1 Inch, Odos),您需要 API 键 — 见 [初始设置](https://npmcn.com/package/%40dhedge/v2-sdk/#readme-initial-setup)。 。 。 .

## 使用量

### 目录

1.  [初始设置](https://npmcn.com/package/%40dhedge/v2-sdk/#readme-initial-setup)
    -   [支助网络](https://npmcn.com/package/%40dhedge/v2-sdk/#readme-supported-networks)
    -   [查询地址](https://npmcn.com/package/%40dhedge/v2-sdk/#readme-looking-up-addresses)
    -   [常见的回归原因](https://npmcn.com/package/%40dhedge/v2-sdk/#readme-common-revert-reasons)
    -   [参考:作为活实例的测试](https://npmcn.com/package/%40dhedge/v2-sdk/#readme-reference-tests-as-live-examples)
    -   [执行模式](https://npmcn.com/package/%40dhedge/v2-sdk/#readme-execution-model)
    -   [模拟和tx数据](https://npmcn.com/package/%40dhedge/v2-sdk/#readme-simulation-and-tx-data)
2.  [一般地窖管理](https://npmcn.com/package/%40dhedge/v2-sdk/#readme-general-vault-management)
    -   [创建金库](https://npmcn.com/package/%40dhedge/v2-sdk/#readme-1-create-a-vault)
    -   [装入金库](https://npmcn.com/package/%40dhedge/v2-sdk/#readme-2-load-a-vault)
    -   [获取金库配置](https://npmcn.com/package/%40dhedge/v2-sdk/#readme-3-get-vault-composition)
    -   [更改金库资产](https://npmcn.com/package/%40dhedge/v2-sdk/#readme-4-change-vault-assets-enabledisable)
    -   [设置交易商](https://npmcn.com/package/%40dhedge/v2-sdk/#readme-5-set-trader)
    -   [核准存款资产](https://npmcn.com/package/%40dhedge/v2-sdk/#readme-6-approve-asset-for-deposit)
    -   [将资产存入金库](https://npmcn.com/package/%40dhedge/v2-sdk/#readme-7-deposit-asset-into-a-vault)
    -   [退出金库](https://npmcn.com/package/%40dhedge/v2-sdk/#readme-8-withdraw-from-a-vault)
    -   [批准用于交易的金库资产](https://npmcn.com/package/%40dhedge/v2-sdk/#readme-9-approve-vault-asset-for-trading--staking)
    -   [贸易金库资产](https://npmcn.com/package/%40dhedge/v2-sdk/#readme-10-trade-vault-assets)
    -   [薄荷流动](https://npmcn.com/package/%40dhedge/v2-sdk/#readme-toros-mint-flow)
    -   [托罗斯赎回流量](https://npmcn.com/package/%40dhedge/v2-sdk/#readme-toros-redeem-flow)
    -   [托罗斯限制命令](https://npmcn.com/package/%40dhedge/v2-sdk/#readme-toros-limit-orders)
3.  [流动性](https://npmcn.com/package/%40dhedge/v2-sdk/#readme-liquidity)
    -   [Uniswap- v2 样式协议](https://npmcn.com/package/%40dhedge/v2-sdk/#readme-uniswap-v2-style)
    -   [余额](https://npmcn.com/package/%40dhedge/v2-sdk/#readme-balancer)
    -   [Uniswap- v3 样式协议](https://npmcn.com/package/%40dhedge/v2-sdk/#readme-uniswap-v3-style)
    -   [VelodromeCL / AerodromeCL / 薄饼CL](https://npmcn.com/package/%40dhedge/v2-sdk/#readme-velodromecl--aerodromecl--pancakecl)
    -   [VelodromeV2 / 机场](https://npmcn.com/package/%40dhedge/v2-sdk/#readme-velodromev2--aerodrome)
    -   [笔鼓](https://npmcn.com/package/%40dhedge/v2-sdk/#readme-pendle)
4.  [借出/借出](https://npmcn.com/package/%40dhedge/v2-sdk/#readme-lendingborrowing-aave)
5.  [借出化合物V3 / 流体](https://npmcn.com/package/%40dhedge/v2-sdk/#readme-lending-compoundv3--fluid)
6.  [平钱协议](https://npmcn.com/package/%40dhedge/v2-sdk/#readme-the-flat-money-protocol)
7.  [发展](https://npmcn.com/package/%40dhedge/v2-sdk/#readme-development)

  

### 初始设置

* * *

如果您想要使用 1 Inch 或 Odos 等聚合器, 或是 Ondo 代号 GM 互换, 请复制 `.env.example` 改为 `.env` 并配置所需的 API 密钥.

```
ONEINCH_API_KEY=YOUR_API_KEY_FROM_1INCH
ODOS_API_KEY=YOUR_ODOS_API_KEY
ONDO_API_KEY=YOUR_ONDO_API_KEY
```

-   `ONEINCH_API_KEY` 用于 `Dapp.ONEINCH`
-   `ODOS_API_KEY` 用于 `Dapp.ODOS`
-   `ODOS_API_KEY` 也可以通过 `completeTorosWithdrawal(...)` 当托罗斯退出需要 Odos 支持的交换数据时
-   `ONDO_API_KEY` 需要用于 Ondo GM 令牌交换(`Dapp.ONDO`(中文(简体) )

要开始 :

-   从中获取1英寸 API 密钥 [1英寸开发者门户](https://docs.1inch.io/docs/aggregation-protocol/introduction)
-   通过 [Odos 开发者文件](https://docs.odos.xyz/build/api-docs),并确保它对于由此 SDK 配置的 Odos 端点有效
-   通过联系获取 Ondo API 密钥 [注册@ondo.finance](mailto:onboarding@ondo.finance)
-   将密钥放入 `.env` 在调用聚合支持的方法前在工程根处的文件
-   如果缺少所需的密钥, SDK 在提交交易前会失败

将 sdk 初始化为 [醚钱包](https://docs.ethers.io/v5/api/signer/#Wallet) 和网络.

```ts
import { Dhedge, Dapp, Network, ethers } from "@dhedge/v2-sdk";

const privateKey = "YOUR_PRIVATE_KEY";
const providerUrl = "https://polygon-mainnet.infura.io/v3/{YOUR_PROJECT_ID}"

const provider = new ethers.providers.JsonRpcProvider(providerUrl);
const walletWithProvider = new ethers.Wallet(privateKey, provider);

const dhedge = new Dhedge(walletWithProvider, Network.POLYGON);
```

在 dHEDGE 产品语言中,这些通常称为金库. 在SDK和智能合约中,许多类和方法仍然使用更老的 `pool` 命名,因此这两个术语可能出现在下面的代码示例中.

重要说明:

-   `Dhedge` 预期一个连接提供者 `ethers.Wallet`。只读提供者不足以满足状态变化的呼叫.
-   你传入的钱包是用于签名交易的账户. 在大多数情况下,这是池管理器的钱包 .
-   `loadPool(address)` 假设地址是 dHEDGE 池,并自动解决管理者合同.
-   `loadPool(address, false)` 可以在您想要与非 DHEDGE 合同合作时使用,该合同应从签名人直接执行.

#### 支助网络

SDK支持6个网络: **多边形**, (中文(简体) ), **乐观主义**, (中文(简体) ), **坐标**, (中文(简体) ), **基础**, (中文(简体) ), **以利亚**, (中文(简体) ), **超液态**这些网络中部署最广泛的协议是: **1英寸( x)**, (中文(简体) ), **凯伯斯瓦普**, (中文(简体) ), **保护 V3**, (中文(简体) ), **托罗斯**,以及 **托罗斯限制命令**。每个(网络、Dapp)登记册的权威是: `routerAddress` 内 `src/config.ts` 在网络上支持一个 Dapp, iff `routerAddress[network][dapp]` 已经设定。 CL 位置管理器、仪表、平价和限制命令使用同一文件中的平行地图(`nonfungiblePositionManagerAddress`, (中文(简体) ), `stakingAddress`, (中文(简体) ), `flatMoneyContractAddresses`, (中文(简体) ), `limitOrderAddress`) (中文(简体) ).

#### 查询地址

大多数代码示例都使用占位符 `"USDC_TOKEN_ADDRESS"`, (中文(简体) ), `MARKET_ADDRESS`,或 `BALANCER_LP_TOKEN_ADDRESS`。每个网络上部署和列入白名单的真相来源是 **dHEDGE (英语) [V2 公共配置目录](https://github.com/dhedge/V2-Public/tree/master/config)**。 。 。 .

每个文件给你的:

-   **`dHEDGE Assets list.json`** - 每项已登记资产/合同: `assetName`, (中文(简体) ), `assetAddress`, (中文(简体) ), `assetType`,神谕的配置。 过滤器由 `assetName` (例如:. `WBTC`, (中文(简体) ), `USDC Native`, (中文(简体) ), `Toros BTCBULL3X`, (中文(简体) ), `cWETHv3`, (中文(简体) ), `Fluid USDC`, (中文(简体) ), `PT-wstETH-25JUN2026`以获得其地址.
-   **`dHEDGE Governance Contract Guards.csv`** —— 说 **活动** 合同警卫:目前允许哪些协议金库调用(Aave、Pendle、Velodrome路由器、Toros LimitedOrderManager等).
-   **`dHEDGE Deprecated Contract Guards.csv`** —— 说 **已贬值** 合同警卫:过去允许但不再允许的协议。 以前工作的地址开始回放时有用 .
-   **`dHEDGE Governance Asset Guards.csv`** ——每资产类型的规则(资产类型库可以持有).

网络直接链接( raw URLs 是方便代理的—— 直接获取) :

| 网络 | 文件夹 | 资产 | 现役警卫 | 折旧 | 资产警卫 |
| --- | --- | :-: | --- | --- | --- |
| 多边形 | [文件夹](https://github.com/dhedge/V2-Public/tree/master/config/polygonProd) | [乔森](https://raw.githubusercontent.com/dhedge/V2-Public/master/config/polygonProd/dHEDGE%20Assets%20list%20-%20Polygon.json) | [(单位:千美元)](https://raw.githubusercontent.com/dhedge/V2-Public/master/config/polygonProd/dHEDGE%20Governance%20Contract%20Guards%20-%20Polygon.csv) | [(单位:千美元)](https://raw.githubusercontent.com/dhedge/V2-Public/master/config/polygonProd/dHEDGE%20Deprecated%20Contract%20Guards%20-%20Polygon.csv) | [(单位:千美元)](https://raw.githubusercontent.com/dhedge/V2-Public/master/config/polygonProd/dHEDGE%20Governance%20Asset%20Guards%20-%20Polygon.csv) |
| 乐观主义 | [文件夹](https://github.com/dhedge/V2-Public/tree/master/config/ovm) | [乔森](https://raw.githubusercontent.com/dhedge/V2-Public/master/config/ovm/dHEDGE%20Assets%20list.json) | [(单位:千美元)](https://raw.githubusercontent.com/dhedge/V2-Public/master/config/ovm/dHEDGE%20Governance%20Contract%20Guards.csv) | [(单位:千美元)](https://raw.githubusercontent.com/dhedge/V2-Public/master/config/ovm/dHEDGE%20Deprecated%20Contract%20Guards.csv) | [(单位:千美元)](https://raw.githubusercontent.com/dhedge/V2-Public/master/config/ovm/dHEDGE%20Governance%20Asset%20Guards.csv) |
| 坐标 | [文件夹](https://github.com/dhedge/V2-Public/tree/master/config/arbitrum) | [乔森](https://raw.githubusercontent.com/dhedge/V2-Public/master/config/arbitrum/dHEDGE%20Assets%20list.json) | [(单位:千美元)](https://raw.githubusercontent.com/dhedge/V2-Public/master/config/arbitrum/dHEDGE%20Governance%20Contract%20Guards.csv) | [(单位:千美元)](https://raw.githubusercontent.com/dhedge/V2-Public/master/config/arbitrum/dHEDGE%20Deprecated%20Contract%20Guards.csv) | [(单位:千美元)](https://raw.githubusercontent.com/dhedge/V2-Public/master/config/arbitrum/dHEDGE%20Governance%20Asset%20Guards.csv) |
| 基础 | [文件夹](https://github.com/dhedge/V2-Public/tree/master/config/base) | [乔森](https://raw.githubusercontent.com/dhedge/V2-Public/master/config/base/dHEDGE%20Assets%20list.json) | [(单位:千美元)](https://raw.githubusercontent.com/dhedge/V2-Public/master/config/base/dHEDGE%20Governance%20Contract%20Guards.csv) | [(单位:千美元)](https://raw.githubusercontent.com/dhedge/V2-Public/master/config/base/dHEDGE%20Deprecated%20Contract%20Guards.csv) | [(单位:千美元)](https://raw.githubusercontent.com/dhedge/V2-Public/master/config/base/dHEDGE%20Governance%20Asset%20Guards.csv) |
| 以利亚 | [文件夹](https://github.com/dhedge/V2-Public/tree/master/config/ethereum) | [乔森](https://raw.githubusercontent.com/dhedge/V2-Public/master/config/ethereum/dHEDGE%20Assets%20list.json) | [(单位:千美元)](https://raw.githubusercontent.com/dhedge/V2-Public/master/config/ethereum/dHEDGE%20Governance%20Contract%20Guards.csv) | [(单位:千美元)](https://raw.githubusercontent.com/dhedge/V2-Public/master/config/ethereum/dHEDGE%20Deprecated%20Contract%20Guards.csv) | [(单位:千美元)](https://raw.githubusercontent.com/dhedge/V2-Public/master/config/ethereum/dHEDGE%20Governance%20Asset%20Guards.csv) |
| 超液态 | [文件夹](https://github.com/dhedge/V2-Public/tree/master/config/hyperevm) | [乔森](https://raw.githubusercontent.com/dhedge/V2-Public/master/config/hyperevm/dHEDGE%20Assets%20list.json) | [(单位:千美元)](https://raw.githubusercontent.com/dhedge/V2-Public/master/config/hyperevm/dHEDGE%20Governance%20Contract%20Guards.csv) | 无 | [(单位:千美元)](https://raw.githubusercontent.com/dhedge/V2-Public/master/config/hyperevm/dHEDGE%20Governance%20Asset%20Guards.csv) |

路由器地址(用于 `pool.approve(dapp, ...)`住在这里 `src/config.ts` → `routerAddress[network][dapp]`。 。 。 .

#### 常见的回归原因

两条教条参考文献 [dhedge/V2-公用电话](https://github.com/dhedge/V2-Public/tree/master/readmes/errorCodes)数字 :

-   [`dHEDGEV2ErrorCodes.json`](https://raw.githubusercontent.com/dhedge/V2-Public/master/readmes/errorCodes/dHEDGEV2ErrorCodes.json) ——每个 `dhN` dHEDGE合同所抛出弦(例如. `dh22`, (中文(简体) ), `dh4`说明和建议采取行动。 找到JSON,抬头看看 `result["dh22"]`。 。 。 .
-   [`4byteErrorCodes.md`](https://raw.githubusercontent.com/dhedge/V2-Public/master/readmes/errorCodes/4byteErrorCodes.md) ——协议专用的4字节自定义错误选择器(DYTM等)被绘制到其源合同上.

对于上面文件中没有的4字节选择器,请用 `cast 4byte 0x<selector>` (发相.

#### 参考:作为活实例的测试

下面每个协议部分都有匹配测试 `src/test/`。测试是SDK的最新参考文献 **调用模式** 它们显示了SDK方法的实际序列(同意) 贸易,添加Liquidity 等,用于每次整合.

在读取一个测试作为参考时,专注于SDK自取其名并忽略只测试的脚手架(管理者冒充,资产融资通过 `setUSDCAmount` 编号 : `setTokenAmount`, oracle staleness fixed, fork RPC pyputing)——这些存在是因为测试运行在哈达特叉上. 真正的金库经理已经从生产代码调用 SDK _实值_ 管理者,持有资产,并使用活的RPC,所以唯一可转让的部分是SDK引用序列.

命名公约:

-   `src/test/<protocol>.test.ts` 与哈德哈特叉决斗.
-   `src/test/<protocol>.onchain.test.ts` ——需要活的RPC(当叉子无法复制路径时使用: CowSwap 解析器解析器,超液态 CoreWriter, Toros) `completeWithdrawal` 汇总引文).

#### 执行模式

默认情况下, 管理器动作通过 `pool.poolLogic.execTransaction(...)`。 。 。 .

如果您设置了单独的交易账户 `pool.setTrader(...)`,您可以通过使用 `sdkOptions.useTraderAddressAsFrom`。 。 。 .

```ts
const tx = await pool.trade(
  Dapp.ONEINCH,
  "USDC_TOKEN_ADDRESS",
  "WETH_TOKEN_ADDRESS",
  "1000000",   // 1 USDC (6 decimals)
  0.5,         // slippage %
  null,
  {
    estimateGas: true,
    useTraderAddressAsFrom: true,
  }
)
```

#### 模拟和tx数据

多数管理方法接受 `sdkOptions` 作为最后的论点。 返回形状取决于您设置的旗帜 :

-   **无旗 (默认)** ——发送交易并返回下层醚 `ContractTransaction` 编号 : `TransactionResponse`。 。 。 .
-   **`true`** ——简称: `{ estimateGas: true }`。 。 。 .
-   **`{ estimateGas: true }`** - 模拟和返回 `{ gas, gasEstimationError, to, txData, minAmountOut }`。 。 。 . `gas` 实值 `null` 何时 `gasEstimationError` 已经设定.
-   **`{ onlyGetTxData: true }`** ——返回 `{ to, txData, minAmountOut }` (无) `gas` 编号 : `gasEstimationError`),不发送或模拟.

> `minAmountOut` 仅由 `pool.trade(...)` 用于获取外部 API 引用的交换聚合器: `Dapp.ONEINCH`, (中文(简体) ), `Dapp.ODOS`, (中文(简体) ), `Dapp.KYBERSWAP`,以及 `Dapp.PENDLE`所有其他Dapp和非贸易方法`approve`, (中文(简体) ), `lend`, (中文(简体) ), `addLiquidity*`(等等) 这是 `null` ——或者在执行时间的调用数据内部编码了出错限制,或者操作没有分钟出错的概念. `Dapp.COWSWAP` 拒绝 `estimateGas` 财务报告和审定财务报表 `onlyGetTxData` 完全没有.

```ts
const result = await pool.trade(
  Dapp.ONEINCH,
  "USDC_TOKEN_ADDRESS",
  "WETH_TOKEN_ADDRESS",
  "1000000",   // 1 USDC (6 decimals)
  0.5,         // slippage %
  null,
  { estimateGas: true }
)

if (result.gasEstimationError) {
  console.error(result.gasEstimationError)
}
```

  

#### 超液态客户端命令

这些方法在交易选项前接受客户端命令ID(CLOID):

-   `openMarketOrderHyperliquidWithCloid(assetId, isLong, value, slippage, cloid, options, sdkOptions)`
-   `openLimitOrderHyperliquidWithCloid(assetId, isLong, value, limitPrice, tif, cloid, options, sdkOptions)`
-   `closePositionHyperliquidWithCloid(assetId, percentageToClose, slippage, cloid, options, sdkOptions)`

CLOID 可以是非负式安全整数或16字节六进制字符串,例如 `0x1234567890abcdef1234567890abcdef`设置默认值 `0` (没有 CLOID),而 falsy 值也编码为 0. 为您要跟踪的每个顺序选择并存储一个不同的 CLOID .

使用 `cancelOrderByCloidHyperliquid(assetId, cloid, options, sdkOptions)` 用于取消使用非零 CLOID。 现有 `cancelOrderHyperliquid(...)` 使用 HyperCore 的 OID 取消 。 原始交易方法保留了它们现有的辩证令,在没有CLOID的情况下发布定单.

### 一般地窖管理

* * *

#### 1\. 建立一个金库

USDC和DAI提供了资产,但只有USDC可供存款.

```ts
const usdcTokenAddress = "USDC_TOKEN_ADDRESS"
const daiTokenAddress = "DAI_TOKEN_ADDRESS"
const vault = await dhedge.createPool(
  "Day Ralio",
  "Awesome Fund",
  "DRAF",
  [
    [usdcTokenAddress, true],
    [daiTokenAddress, false],
  ],
  10
)
console.log("created vault with address", vault.address)
```

#### 2\. 装入保险库

```ts
const vaultAddress = "YOUR_VAULT_ADDRESS"
const vault = await dhedge.loadPool(vaultAddress)
```

装入前验证金库地址 :

```ts
const isValidVault = await dhedge.validatePool(vaultAddress)
if (!isValidVault) throw new Error("invalid dHEDGE vault address")
```

#### 3\. 获得金库组成

```ts
const composition = await vault.getComposition();
```

`getComposition()` 返回链上原始值 :

```ts
[
  {
    asset: "0x...",
    isDeposit: true,
    balance: BigNumber,
    rate: BigNumber,
  }
]
```

在向用户显示金库控股之前, 您通常需要分别获取小数和符号 .

#### 4\. 改变金库资产(可/可拆)

改变集合资产,允许DAI存款. 同时让WETH成为资产,但不应该被允许作为存款.

```ts
const enabledAssets = [
  { asset: "USDC_TOKEN_ADDRESS", isDeposit: true },
  { asset: "DAI_TOKEN_ADDRESS", isDeposit: true },
  { asset: "WETH_TOKEN_ADDRESS", isDeposit: false },
]
const tx = await vault.changeAssets(enabledAssets)
```

#### 5\. 设置交易商

设置有交易权限的账户

```ts
const tx = await vault.setTrader("TRADER_ACCOUNT_ADDRESS")
```

#### 6\. 核准存款资产

在将资产存入金库之前,用户钱包必须批准金库转移该资产.

批准无限额的USDC存入金库.

```ts
const tx = await vault.approveDeposit("USDC_TOKEN_ADDRESS", ethers.constants.MaxUint256);
```

#### 7\. 将资产存入金库

1美元存入金库

```ts
const usdcDepositAmount = "1000000" // 1 USDC (6 decimals)
const tx = await vault.deposit("USDC_TOKEN_ADDRESS", usdcDepositAmount);
```

#### 8\. 从金库撤出

撤销1.000002975个金库代币. 注意如果设置为交易账户,则无法调用

```ts
const poolTokensWithdrawAmount = "1000029750000000000"
const tx = await vault.withdraw(poolTokensWithdrawAmount);
```

#### 9\. 核准用于交易和承接的金库资产

在金库能够将资产交易或置入外部协议之前,金库必须批准协议路由器或承接合同.

核准在KyberSwap进行贸易的无限额USDC

```ts
const tx = await vault.approve(
  Dapp.KYBERSWAP,
  "USDC_TOKEN_ADDRESS",
  ethers.constants.MaxInt256
)
```

核准模式摘要:

| 方法 | 从 —— 到 | 投影解析 | 何时使用 |
| --- | --- | :-: | --- |
| `approveDeposit(asset, amount)` | 用户钱包 ~ 保险库 | 保险库本身 | 在此之前 `vault.deposit(asset, amount)` |
| `approve(dapp, asset, amount)` | 库 → 协议路由器 | `routerAddress[network][dapp]` | 在此之前 `vault.trade`, (中文(简体) ), `vault.lend`, (中文(简体) ), `vault.borrow`等 (中文(简体) ). |
| `approveStaking(dapp, asset, amount)` | 保险库 —— 承接合同 | `stakingAddress[network][dapp]` | 在此之前 `vault.stake(dapp, ...)` (V2型农场) |
| `approveSpender(spender, asset, amount)` | • 任意开支者 | 调用供应商 | 自定义集成,CL职位管理等. |
| `approveSpenderNFT(spender, nftContract, tokenId)` | ——任意支出者(ERC-721) | 调用供应商 | 之前批准一个 CL 位置 NFT `stakeInGauge` |

#### 10\. 贸易金库资产

1USDC在KyberSwap上交易DAI. 其它 `Dapp` 由 `vault.trade(...)` 取决于网络,其中包括: `TOROS`, (中文(简体) ), `BALANCER`, (中文(简体) ), `ONEINCH` (所需经费) `ONEINCH_API_KEY`, (中文(简体) ), `ODOS` (所需经费) `ODOS_API_KEY`, (中文(简体) ), `PENDLE`,以及 `COWSWAP`。 。 。 .

```ts
const amountIn = "1000000" // 1 USDC (6 decimals)
const slippage = 0.5
const tx = await vault.trade(
  Dapp.KYBERSWAP,
  "USDC_TOKEN_ADDRESS",
  "DAI_TOKEN_ADDRESS",
  amountIn,
  slippage
)
```

**猫头鹰** 行为不同于其他集合 :

-   核准 **CoW 断层更新器** (单位:千美元)`0xC92E8bdf79f0507f65a392b0ab4667716BFE0110`)通过 `approveSpender`,不通过 `approve(Dapp.COWSWAP, ...)`。 。 。 .
-   单人 `vault.trade(Dapp.COWSWAP, ...)` 内部调用 **两次交易** (签署命令,然后) `setPreSignature` 在GPv2Settlement上。 订单由解脱者补出.
-   `estimateGas` 财务报告和审定财务报表 `onlyGetTxData` 不支持.

```ts
await vault.approveSpender(
  "0xC92E8bdf79f0507f65a392b0ab4667716BFE0110", // CoW Vault Relayer
  "USDC_TOKEN_ADDRESS",
  ethers.constants.MaxUint256
);

await vault.trade(
  Dapp.COWSWAP,
  "USDC_TOKEN_ADDRESS",
  "WETH_TOKEN_ADDRESS",
  "2000000",
  0.5
);
```

#### 薄荷流动

嵌入托罗斯令牌用途 `vault.trade(...)`,但它不是一个通用的代号对托肯互换。 输入资产必须是基础托罗斯金库的有效存款资产.

```ts
await vault.approve(
  Dapp.TOROS,
  "USDC_TOKEN_ADDRESS",
  ethers.constants.MaxUint256
)

const tx = await vault.trade(
  Dapp.TOROS,
  "USDC_TOKEN_ADDRESS",
  "TOROS_TOKEN_ADDRESS",
  "100000000", // 100 USDC (6 decimals)
  slippage
)
```

#### 托罗斯赎回流量

重新开发一个托罗斯符牌比普通贸易有更多的先决条件:

-   新铸造的Toros或dHEDGE金库活符在启动赎回之前可能会被冷却
-   在冷却状态下无法启动救赎
-   在启动赎回前,金库必须批准托罗斯路由器的托罗斯代号
-   在救赎开始后,一些托罗斯撤退需要第二个完成步骤
-   `completeTorosWithdrawal(...)` 可能要求 `ODOS_API_KEY` 当需要 Odos 支持的交换数据时

1.  批准托罗斯赎罪令牌:

```ts
await vault.approve(
  Dapp.TOROS,
  "TOROS_TOKEN_ADDRESS",
  ethers.constants.MaxUint256
)
```

2.  启动救赎:

```ts
const tx = await vault.trade(
  Dapp.TOROS,
  "TOROS_TOKEN_ADDRESS",
  "USDC_TOKEN_ADDRESS",
  "100000000", // amount of Toros vault tokens to redeem (Toros tokens are 18 decimals)
  slippage
)
```

3.  在产品流动需要时完成取出:

```ts
const tx = await vault.completeTorosWithdrawal(
  "USDC_TOKEN_ADDRESS",
  slippage
)
```

#### 托罗斯限制命令

托罗斯金库支持由链上公司管理的停止损失/收受利润订单 `PoolLimitOrderManager`。从 dHEDGE 保险库中,管理者(或交易者)可以对持有的托罗斯保险库令牌登记订单;一旦定价-资产价格超过某一阈值,订单即可执行.

保险库最多可按每个托罗斯保险库代号维持一个有效限额。 价格以18-十进制固定点(D18)通过. 过 `null`编号 :`undefined` 以禁用一面——停止-损失默认值 `0` (关闭)和收取利润的违约 `MaxUint256` (关).

这个 `pricingAsset` 必须与 dHEDGE 资产处理器中注册的资产地址相匹配。 选择条目 `dHEDGE Assets list.json` 谁 `assetName` 代表托罗斯金库的价格参考(如:. `WBTC` 用于BTC金库, `WETH` 并使用它 `assetAddress`。见 [查询地址](https://npmcn.com/package/%40dhedge/v2-sdk/#readme-looking-up-addresses) 用于每个网络的URL.

1.  批准限级管理器的托罗斯金库令牌(一次)

```ts
import { ethers } from "ethers";

await vault.approveTorosLimitOrder(
  "TOROS_VAULT_ADDRESS",
  ethers.constants.MaxUint256
);
```

2.  在WBTC中以50 000美元的价格制作订单——停止损失和以100 000美元的价格获取利润

```ts
await vault.createTorosLimitOrder(
  "TOROS_VAULT_ADDRESS",
  ethers.utils.parseEther("0.001"),       // amount of vault tokens (18 decimals)
  ethers.utils.parseEther("50000"),       // stopLossPriceD18
  ethers.utils.parseEther("100000"),      // takeProfitPriceD18
  "WBTC_TOKEN_ADDRESS"                    // pricingAsset (assetAddress from dHEDGE Assets list.json)
);
```

3.  读取活动顺序, 修改或删除

```ts
const order = await vault.getTorosLimitOrder(vault.address, "TOROS_VAULT_ADDRESS");
const exists = await vault.hasActiveTorosLimitOrder(vault.address, "TOROS_VAULT_ADDRESS");

await vault.modifyTorosLimitOrder(
  "TOROS_VAULT_ADDRESS",
  order.amount,
  order.stopLossPriceD18.mul(95).div(100), // tighten stop by 5%
  order.takeProfitPriceD18,
  order.pricingAsset
);

await vault.deleteTorosLimitOrder("TOROS_VAULT_ADDRESS");
```

### 流动性

* * *

#### Uniswap- v2 样式

> **说明:** 此路径是 **遗产**. Sushiswap是唯一一个仍然被配置的V2风格的DEX(只有Polygon),并且没有被积极使用;新的集成应该更喜欢KyberSwap / 1inch / Pendle / Velodrome. 以下方法仍用于后向相容性.

对于Uniswap-v2像协议,例如sushiswap,我们使用 `addLiquidity`, (中文(简体) ), `removeLiquidity`, (中文(简体) ), `stake`,以及 `unstake`,以及 `harvestRewards`

1.  将USDC/DAI加入Sushiswap流动资金库

```ts
const amountUsdc = "1000000"          // 1 USDC (6 decimals)
const amountDai = "997085000000000000" // ~0.997 DAI (18 decimals)
const tx = await pool.addLiquidity(
  Dapp.SUSHISWAP,
  "USDC_TOKEN_ADDRESS",
  "DAI_TOKEN_ADDRESS",
  amountUsdc,
  amountDai
)
```

2.  从流动资金库中取出1个苏希斯瓦普LP的USDC/DAI值

```ts
const amountSlpUsdcDai = "1000000000000000000" // 1 LP token (18 decimals)
const tx = await pool.removeLiquidity(
  Dapp.SUSHISWAP,
  "USDC_TOKEN_ADDRESS",
  "DAI_TOKEN_ADDRESS",
  amountSlpUsdcDai
)
```

3.  批准无限额的 SLP USDC-DAI 代币,用于吸取 Sushiswap

```ts
const tx = await pool.approveStaking(
  Dapp.SUSHISWAP,
  "SLP_USDC_DAI_TOKEN_ADDRESS",
  ethers.constants.MaxInt256
)
```

4.  USDC/DAI 代号

```ts
const amountSlpUsdcDai = "1000000000000000000" // 1 LP token (18 decimals)
const tx = await pool.stake(
  Dapp.SUSHISWAP,
  "SLP_USDC_DAI_TOKEN_ADDRESS",
  amountSlpUsdcDai
)
```

5.  USDC/DAI 令牌

```ts
const amountSlpUsdcDai = "1000000000000000000" // 1 LP token (18 decimals)
const tx = await pool.unstake(
  Dapp.SUSHISWAP,
  "SLP_USDC_DAI_TOKEN_ADDRESS",
  amountSlpUsdcDai
)
```

6.  股份有限公司(USDC/DAI)

```ts
const tx = await pool.harvestRewards(
  Dapp.SUSHISWAP,
  "SLP_USDC_DAI_TOKEN_ADDRESS"
)
```

#### 余额

对于平衡器,我们使用 `joinBalancerPool`, (中文(简体) ), `exitBalancerPool`,以及 `harvestBalancerRewards`

1.  在WBTC/USDC/WETH 平衡器池中加入0.00002 WBTC、1美元C和0.00002 WETH

```ts
const balancerPoolId = "0x03cd191f589d12b0582a99808cf19851e468e6b500010000000000000000000a"
const assets = [WBTC_TOKEN_ADDRESS, USDC_TOKEN_ADDRESS, WETH_TOKEN_ADDRESS];
const amounts = [
  "2000",            // 0.00002 WBTC (8 decimals)
  "1000000",         // 1 USDC (6 decimals)
  "200000000000000"  // 0.0002 WETH (18 decimals)
];
const tx = await pool.joinBalancerPool(balancerPoolId, assets, amounts)
```

2.  从 WBTC/USDC/ WETH 平衡器池中删除所有符号

```ts
const amount = await dhedge.utils.getBalance(BALANCER_LP_TOKEN_ADDRESS, pool.address)
const tx = await pool.exitBalancerPool(balancerPoolId, assets, amount)
```

3.  平衡器的收获奖励

```ts
const tx = await pool.harvestBalancerRewards()
```

#### Uniswap- v3 样式

对阿拉基斯来说 我们使用 `increaseLiquidity` 以加注或加注 lp,以及 `decreaseLiquidity`,以及 `claimFees`示例 [arrakis 测试](https://github.com/dhedge/dhedge-v2-sdk/blob/master/src/test/arrakis.test.ts)

* * *

用于 Uniswap v3, 我们使用 `approveUniswapV3Liquidity`, (中文(简体) ), `addLiquidityUniswapV3`, (中文(简体) ), `decreaseLiquidity`, (中文(简体) ), `increaseLiquidity`,以及 `claimFees`。 。 。 .

1.  将100美元和0.00043美元的流动资金加入UniswapV3集合(此处使用价格范围)

```ts

await pool.approveUniswapV3Liquidity(
  USDC_ADDRESS,
  ethers.constants.MaxInt256
);
await pool.approveUniswapV3Liquidity(
  WETH_ADDRESS,
  ethers.constants.MaxInt256
);
const tx = await pool.addLiquidityUniswapV3(
  Dapp.UNISWAPV3,
  WETH_ADDRESS,
  USDC_ADDRESS,
  '430000000000000', // wethBalance
  '100000000',       // usdcBalance
  2000,              // minPrice
  3000,              // maxPrice
  null,              // minTick (use null when providing prices)
  null,              // maxTick (use null when providing prices)
  FeeAmount.MEDIUM,
)
```

2.  从现有现金池中去除50%的流动性

```ts
tokenId = await nonfungiblePositionManager.tokenOfOwnerByIndex(pool.address,0).toString();
const tx = await pool.decreaseLiquidity(
  Dapp.UNISWAPV3,
  tokenId,
  50 // percent
);
```

100%的删除会烧掉 NFT 位置 .

3.  增加现有WETH/USDC现金池中的流动性

```ts
const result = await pool.increaseLiquidity(
  Dapp.UNISWAPV3,
  tokenId,
  new BigNumber(3000).times(1e6).toFixed(0), // usdc
  new BigNumber(1).times(1e18).toFixed(0) // eth
);
```

4.  索赔费

```ts
const tx = await pool.claimFees(Dapp.UNISWAPV3, tokenId);
```

#### VelodromeCL / AerodromeCL / 薄饼CL

Velodrome CL,Aerodrome CL,和煎饼 CL使用与Uniswap V3相同的SDK方法—— `approveUniswapV3Liquidity`, (中文(简体) ), `addLiquidityUniswapV3`, (中文(简体) ), `increaseLiquidity`, (中文(简体) ), `decreaseLiquidity`, (中文(简体) ), `claimFees` - 刚刚通过匹配 `Dapp` enum (中文(简体) )`Dapp.VELODROMECL`, (中文(简体) ), `Dapp.AERODROMECL`,或 `Dapp.PANCAKECL`) (中文(简体) ). 使用 `minTick` 编号 : `maxTick` (无) `minPrice` 编号 : `maxPrice`),并将游泳池的勾选间隔作为最后一个参数,而不是Uniswap收费等级.

1.  薄荷(USDC/WETH on Aerodrome CL) 相接器

```ts
await pool.approveSpender(AERODROME_POSITION_MANAGER, USDC_ADDRESS, ethers.constants.MaxUint256);
await pool.approveSpender(AERODROME_POSITION_MANAGER, WETH_ADDRESS, ethers.constants.MaxUint256);

await pool.addLiquidityUniswapV3(
  Dapp.AERODROMECL,
  USDC_ADDRESS,
  WETH_ADDRESS,
  usdcAmount,
  wethAmount,
  null,        // minPrice (use ticks instead)
  null,        // maxPrice
  -2,          // minTick
  4,           // maxTick
  1            // tick spacing
);
```

`AERODROME_POSITION_MANAGER` 是链子的 CL `nonfungiblePositionManager`;通过查找 `nonfungiblePositionManagerAddress[network][Dapp.AERODROMECL]` 从 `src/config.ts`。 。 。 .

2.  将CL位置取入测量仪中(然后不取)

```ts
await pool.approveSpenderNFT(GAUGE_ADDRESS, AERODROME_POSITION_MANAGER, tokenId);
await pool.stakeInGauge(Dapp.AERODROMECL, GAUGE_ADDRESS, tokenId);

// later
await pool.unstakeFromGauge(GAUGE_ADDRESS, tokenId);
```

`claimFees(Dapp.AERODROMECL, tokenId)` 收取未占位置的交换费和计分奖励(如AERO/VELO),以计分位置.

#### VelodromeV2 / 机场

对于VelodromeV2 / Airdrome,我们使用 `addLiquidityV2`, (中文(简体) ), `stakeInGauge`, (中文(简体) ), `unstakeFromGauge`, (中文(简体) ), `removeLiquidityV2`,以及 `claimFees`。 。 。 .

将100美元和0.00043美元的流动资金加入USDC/WETH池 (用于Velodrome) `Dapp.VELODROMEV2`,用于机场 `Dapp.AERODROME`) (中文(简体) ). 参见 [velodromeV2测试](https://github.com/dhedge/dhedge-v2-sdk/blob/master/src/test/velodromeV2.test.ts) 财务报告和审定财务报表 [机场试验](https://github.com/dhedge/dhedge-v2-sdk/blob/master/src/test/aerodrome.test.ts)。 。 。 .

```ts
const tx = await pool.addLiquidityV2(
  Dapp.VELODROMEV2,
  USDC_ADDRESS,
  WETH_ADDRESS,
  '10000000',
  '430000000000000',
  false
)
```

#### 笔鼓

对于彭德勒校长托肯斯(PT),我们使用 `pool.trade(Dapp.PENDLE, ...)` 将一个基本的信号转换成PT,将一个PT转换回其基础,或在市场到期后通过SY汇率将PT赎回其基础。 SDK自动检测器通过Pendle API已经过期了市场,并通过已成熟的出行路径引导呼叫.

> **说明:** 只支持有限的一组PT. 每个PT(及其基础/SY)必须在 dHEDGE 资产处理器中白列一等,然后一个金库才能持有或交易. 检查实时资产登记册(见 [查询地址](https://npmcn.com/package/%40dhedge/v2-sdk/#readme-looking-up-addresses)对于目前的清单来说——试图交易一个未被列入白名单的PT将会恢复.

1.  在活跃的市场上将基础(如wstETH)交换为PT

```ts
const wstEthBalance = await vault.utils.getBalance(WSTETH_ADDRESS, vault.address);
await vault.approve(Dapp.PENDLE, WSTETH_ADDRESS, ethers.constants.MaxUint256);
await vault.trade(
  Dapp.PENDLE,
  WSTETH_ADDRESS,
  PT_WSTETH_ADDRESS,
  wstEthBalance,
  1 // slippage %
);
```

2.  在成熟前将PT换回基础

```ts
const ptBalance = await vault.utils.getBalance(PT_WSTETH_ADDRESS, vault.address);
await vault.approve(Dapp.PENDLE, PT_WSTETH_ADDRESS, ethers.constants.MaxUint256);
await vault.trade(
  Dapp.PENDLE,
  PT_WSTETH_ADDRESS,
  WSTETH_ADDRESS,
  ptBalance,
  1
);
```

3.  将成熟的PT恢复到它的底部

在市场之后 `expiry`,SDK检测到不活跃的市场并使用 `exitPostExpToToken` 路径; 收到的金额是 `ptAmount * 1e18 / SY.exchangeRate()`。 。 。 .

```ts
const ptBalance = await vault.utils.getBalance(MATURED_PT_ADDRESS, vault.address);
await vault.approve(Dapp.PENDLE, MATURED_PT_ADDRESS, ethers.constants.MaxUint256);
await vault.trade(
  Dapp.PENDLE,
  MATURED_PT_ADDRESS,
  UNDERLYING_ADDRESS,
  ptBalance,
  1
);
```

  

### 借出/借出

* * *

为了Aave,我们使用 `lend`, (中文(简体) ), `withdrawDeposit`, (中文(简体) ), `borrow` 财务报告和审定财务报表 `repay`

##### 1\. 向Aave贷款库存入1美元

```ts
const tx = await pool.lend(Dapp.AAVE, USDC_TOKEN_ADDRESS, "1000000") // 1 USDC (6 decimals)
```

##### 2\. 从Aave贷款库中取出1美元

```ts
const tx = await pool.withdrawDeposit(Dapp.AAVE, USDC_TOKEN_ADDRESS, "1000000") // 1 USDC (6 decimals)
```

##### 3\. 从Aave贷款池借款0.0001瓦特

```ts
const tx = await pool.borrow(Dapp.AAVE, WETH_TOKEN_ADDRESS, "100000000000000"); // 0.0001 WETH (18 decimals)
```

##### 4\. 向Aave贷款池偿还0.0001WETH

```ts
const tx = await pool.repay(Dapp.AAVE, WETH_TOKEN_ADDRESS, "100000000000000"); // 0.0001 WETH (18 decimals)
```

  

### 借出化合物V3 / 流体

复合V3市场(ctokens,例如:. `cWETHv3`, (中文(简体) ), `cUSDCv3`)和流体市场(fTokens等. `fWETH`, (中文(简体) ), `fUSDC`共用相同的SDK表面—— `lendCompoundV3` 供应和供应 `withdrawCompoundV3` 以市场地址作为第一个论据。 化合物V3额外暴露 `harvestCompoundV3Rewards` (Fluid没有收获的奖励路径).

查查市场地址 `dHEDGE Assets list.json` (见 [查询地址](https://npmcn.com/package/%40dhedge/v2-sdk/#readme-looking-up-addresses)) (中文(简体) ). V3复合市场 `assetType: "28"` 与 `contractGuard: "CompoundV3CometContractGuard"`;流体市场是 `assetType: "34"` 与 `contractGuard: "FluidTokenContractGuard"`。 。 。 .

1.  为市场核准资产

```ts
await pool.approveSpender(MARKET_ADDRESS, ASSET_ADDRESS, ethers.constants.MaxUint256);
```

2.  供应

```ts
// CompoundV3
await pool.lendCompoundV3(CWETH_V3_ADDRESS, WETH_ADDRESS, "1000000000000000000"); // 1 WETH (18 decimals)

// Fluid uses the same method, just a Fluid market address
await pool.lendCompoundV3(FWETH_ADDRESS, WETH_ADDRESS, "1000000000000000000");
```

3.  撤销

```ts
await pool.withdrawCompoundV3(MARKET_ADDRESS, ASSET_ADDRESS, AMOUNT);
```

4.  (只有Compompt V3)收获COMP奖

```ts
await pool.harvestCompoundV3Rewards(CWETH_V3_ADDRESS);
```

  

### 平钱协议

* * *

##### 1\. 管理联合国信息技术公司:将1 reth 存入联合国信息技术公司

```ts
      const depositAmount = new BigNumber(1).times(1e18).toString();
      const tx = await pool.mintUnitViaFlatMoney(
        depositAmount,
        0.5,  // slippage, 0.5%
        5,  // maxKeeperFeeInUsd, $5
      );
```

##### 2\. 重整联合国信息技术研究所:重整联合国信息技术研究所

```ts
      const withdrawAmount = new BigNumber(1).times(1e18).toString();
      const tx = await pool.redeemUnitViaFlatMoney(
        withdrawAmount,
        0.5,  // slippage, 0.5%
        5, // maxKeeperFeeInUsd, $5
      );
```

##### 3\. 取消宣布的命令

```ts
      await pool.cancelOrderViaFlatMoney();
```

  

## 发展

### 设置

```sh
# install
yarn install

# copy and edit env
cp .env.example .env
```

`.env` 识别的密钥 :

| 变量 | 目的 |
| --- | --- |
| `PRIVATE_KEY` | 测试所使用的钱包; 需要成为 `TEST_POOL[network]` 叉子测试. |
| `<NETWORK>_URL` | RPC URL 用于叉或运行于链上测试. 每个网络一个: `POLYGON_URL`, (中文(简体) ), `OPTIMISM_URL`, (中文(简体) ), `ARBITRUM_URL`, (中文(简体) ), `BASE_URL`, (中文(简体) ), `ETHEREUM_URL`, (中文(简体) ), `PLASMA_URL`, (中文(简体) ), `HYPERLIQUID_URL`。 。 。 . |
| `ONEINCH_API_KEY` | 仅限 `Dapp.ONEINCH` 打电话. |

### 构建线条( L)

```sh
yarn build   # tsdx build
yarn lint    # tsdx lint
```

### 叉子网络

每个分叉命令在固定端口上旋转一个本地的 Hardhat 节点( 测试钱包帮助器当 `onFork: true`:

| 网络 | 命令 | 本地端口 |
| --- | --- | :-: |
| 多边形 | `yarn fork:polygon` | 8542 (英语) |
| 乐观主义 | `yarn fork:optimism` | 第8544号 |
| 坐标 | `yarn fork:arbitrum` | 8540 (英语) |
| 基础 | `yarn fork:base` | 8546 (英语) |
| 以利亚 | `yarn fork:ethereum` | 8547 (英语) |
| 等离子体 | `yarn fork:plasma` | 第8548号 |
| 超液态 | `yarn fork:hyperliquid` | 8549 (英语) |

### 运行测试

```sh
yarn test                             # run everything
npx jest src/test/aave.test.ts        # one file
npx jest -t "trades USDC into WETH"   # by test name
```

大多数测试文件声明网络使用 `testingHelper({ network: Network.X, testingRun, onFork: true })`。帮助者选择 `http://127.0.0.1:<port>` 何时 `onFork: true` (匹配) `yarn fork:<network>` 必须是运行)和 `process.env.<NETWORK>_URL` 何时 `onFork: false` 用于“链上”测试,如 `*.onchain.test.ts` 无法在分叉上运行(例如CowSwap 解析器解析器,Hyper Aliquid CoreWriter,Toros 完成 Constructionor 引文).

## 常见问题

### @dhedge/v2-sdk 是什么？

用于在 dHEDGE V2 上构建应用程序的 SDK

### 如何安装 @dhedge/v2-sdk？

在项目目录运行 npm install @dhedge/v2-sdk，或使用 pnpm add / yarn add / bun add。

### @dhedge/v2-sdk 支持 TypeScript 吗？

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

### @dhedge/v2-sdk 支持 ESM 还是 CommonJS？

以 CommonJS 形式发布，可以直接 require\(\)；在 ES Module 项目中也可以用 import 引入（Node\.js 会把 module\.exports 作为默认导出）。

### @dhedge/v2-sdk 需要什么版本的 Node\.js？

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

### @dhedge/v2-sdk 可以商用吗？

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

### @dhedge/v2-sdk 的下载量有多少？

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

### @dhedge/v2-sdk 还在维护吗？

最新版本 2\.2\.7 发布于 2026/11/13（今天）；至今共发布 73 个版本，其中过去 12 个月发布了 13 个；首次发布于 2021/08/09。发布频率只是参考信号：功能稳定的工具可能很少需要更新，建议结合源码仓库的 issue 和提交记录判断。

