@dhedge/v2-sdk

中文文档
2.2.7发布于 2026/11/13MITTypeScriptCommonJS近 30 天下载 2138

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

中文使用文档
文档目录15 节
  1. 安装
  2. 快速启动
  3. 使用量
  4. 目录
  5. 初始设置
  6. 一般地窖管理
  7. 流动性
  8. 借出/借出
  9. 借出化合物V3 / 流体
  10. 平钱协议
  11. 发展
  12. 设置
  13. 构建线条( L)
  14. 叉子网络
  15. 运行测试

dHEDGE V2 SDK (英语)

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

特征 :

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

安装

# npm
npm install @dhedge/v2-sdk

# yarn
yarn add @dhedge/v2-sdk

快速启动

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 键 — 见 初始设置。 。 。 .

使用量

目录

  1. 初始设置
  2. 一般地窖管理
  3. 流动性
  4. 借出/借出
  5. 借出化合物V3 / 流体
  6. 平钱协议
  7. 发展

初始设置


如果您想要使用 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英寸开发者门户
  • 通过 Odos 开发者文件,并确保它对于由此 SDK 配置的 Odos 端点有效
  • 通过联系获取 Ondo API 密钥 注册@ondo.finance
  • 将密钥放入 .env 在调用聚合支持的方法前在工程根处的文件
  • 如果缺少所需的密钥, SDK 在提交交易前会失败

将 sdk 初始化为 醚钱包 和网络.

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 公共配置目录。 。 。 .

每个文件给你的:

  • 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 是方便代理的—— 直接获取) :

网络文件夹资产现役警卫折旧资产警卫
多边形文件夹乔森(单位:千美元)(单位:千美元)(单位:千美元)
乐观主义文件夹乔森(单位:千美元)(单位:千美元)(单位:千美元)
坐标文件夹乔森(单位:千美元)(单位:千美元)(单位:千美元)
基础文件夹乔森(单位:千美元)(单位:千美元)(单位:千美元)
以利亚文件夹乔森(单位:千美元)(单位:千美元)(单位:千美元)
超液态文件夹乔森(单位:千美元)无(单位:千美元)

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

常见的回归原因

两条教条参考文献 dhedge/V2-公用电话数字 :

  • dHEDGEV2ErrorCodes.json ——每个 dhN dHEDGE合同所抛出弦(例如. dh22, (中文(简体) ), dh4说明和建议采取行动。 找到JSON,抬头看看 result["dh22"]。 。 。 .
  • 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。 。 。 .

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 完全没有.

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可供存款.

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. 装入保险库

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

装入前验证金库地址 :

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

3. 获得金库组成

const composition = await vault.getComposition();

getComposition() 返回链上原始值 :

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

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

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

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

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. 设置交易商

设置有交易权限的账户

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

6. 核准存款资产

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

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

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

7. 将资产存入金库

1美元存入金库

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

8. 从金库撤出

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

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

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

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

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

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。 。 。 .

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 不支持.
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(...),但它不是一个通用的代号对托肯互换。 输入资产必须是基础托罗斯金库的有效存款资产.

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. 批准托罗斯赎罪令牌:
await vault.approve(
  Dapp.TOROS,
  "TOROS_TOKEN_ADDRESS",
  ethers.constants.MaxUint256
)
  1. 启动救赎:
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
)
  1. 在产品流动需要时完成取出:
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。见 查询地址 用于每个网络的URL.

  1. 批准限级管理器的托罗斯金库令牌(一次)
import { ethers } from "ethers";

await vault.approveTorosLimitOrder(
  "TOROS_VAULT_ADDRESS",
  ethers.constants.MaxUint256
);
  1. 在WBTC中以50 000美元的价格制作订单——停止损失和以100 000美元的价格获取利润
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)
);
  1. 读取活动顺序, 修改或删除
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流动资金库
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
)
  1. 从流动资金库中取出1个苏希斯瓦普LP的USDC/DAI值
const amountSlpUsdcDai = "1000000000000000000" // 1 LP token (18 decimals)
const tx = await pool.removeLiquidity(
  Dapp.SUSHISWAP,
  "USDC_TOKEN_ADDRESS",
  "DAI_TOKEN_ADDRESS",
  amountSlpUsdcDai
)
  1. 批准无限额的 SLP USDC-DAI 代币,用于吸取 Sushiswap
const tx = await pool.approveStaking(
  Dapp.SUSHISWAP,
  "SLP_USDC_DAI_TOKEN_ADDRESS",
  ethers.constants.MaxInt256
)
  1. USDC/DAI 代号
const amountSlpUsdcDai = "1000000000000000000" // 1 LP token (18 decimals)
const tx = await pool.stake(
  Dapp.SUSHISWAP,
  "SLP_USDC_DAI_TOKEN_ADDRESS",
  amountSlpUsdcDai
)
  1. USDC/DAI 令牌
const amountSlpUsdcDai = "1000000000000000000" // 1 LP token (18 decimals)
const tx = await pool.unstake(
  Dapp.SUSHISWAP,
  "SLP_USDC_DAI_TOKEN_ADDRESS",
  amountSlpUsdcDai
)
  1. 股份有限公司(USDC/DAI)
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
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)
  1. 从 WBTC/USDC/ WETH 平衡器池中删除所有符号
const amount = await dhedge.utils.getBalance(BALANCER_LP_TOKEN_ADDRESS, pool.address)
const tx = await pool.exitBalancerPool(balancerPoolId, assets, amount)
  1. 平衡器的收获奖励
const tx = await pool.harvestBalancerRewards()

Uniswap- v3 样式

对阿拉基斯来说 我们使用 increaseLiquidity 以加注或加注 lp,以及 decreaseLiquidity,以及 claimFees示例 arrakis 测试


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

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

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,
)
  1. 从现有现金池中去除50%的流动性
tokenId = await nonfungiblePositionManager.tokenOfOwnerByIndex(pool.address,0).toString();
const tx = await pool.decreaseLiquidity(
  Dapp.UNISWAPV3,
  tokenId,
  50 // percent
);

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

  1. 增加现有WETH/USDC现金池中的流动性
const result = await pool.increaseLiquidity(
  Dapp.UNISWAPV3,
  tokenId,
  new BigNumber(3000).times(1e6).toFixed(0), // usdc
  new BigNumber(1).times(1e18).toFixed(0) // eth
);
  1. 索赔费
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) 相接器
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。 。 。 .

  1. 将CL位置取入测量仪中(然后不取)
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测试 财务报告和审定财务报表 机场试验。 。 。 .

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 资产处理器中白列一等,然后一个金库才能持有或交易. 检查实时资产登记册(见 查询地址对于目前的清单来说——试图交易一个未被列入白名单的PT将会恢复.

  1. 在活跃的市场上将基础(如wstETH)交换为PT
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 %
);
  1. 在成熟前将PT换回基础
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
);
  1. 将成熟的PT恢复到它的底部

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

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美元
const tx = await pool.lend(Dapp.AAVE, USDC_TOKEN_ADDRESS, "1000000") // 1 USDC (6 decimals)
2. 从Aave贷款库中取出1美元
const tx = await pool.withdrawDeposit(Dapp.AAVE, USDC_TOKEN_ADDRESS, "1000000") // 1 USDC (6 decimals)
3. 从Aave贷款池借款0.0001瓦特
const tx = await pool.borrow(Dapp.AAVE, WETH_TOKEN_ADDRESS, "100000000000000"); // 0.0001 WETH (18 decimals)
4. 向Aave贷款池偿还0.0001WETH
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 (见 查询地址) (中文(简体) ). V3复合市场 assetType: "28" 与 contractGuard: "CompoundV3CometContractGuard";流体市场是 assetType: "34" 与 contractGuard: "FluidTokenContractGuard"。 。 。 .

  1. 为市场核准资产
await pool.approveSpender(MARKET_ADDRESS, ASSET_ADDRESS, ethers.constants.MaxUint256);
  1. 供应
// 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");
  1. 撤销
await pool.withdrawCompoundV3(MARKET_ADDRESS, ASSET_ADDRESS, AMOUNT);
  1. (只有Compompt V3)收获COMP奖
await pool.harvestCompoundV3Rewards(CWETH_V3_ADDRESS);

平钱协议


1. 管理联合国信息技术公司:将1 reth 存入联合国信息技术公司
      const depositAmount = new BigNumber(1).times(1e18).toString();
      const tx = await pool.mintUnitViaFlatMoney(
        depositAmount,
        0.5,  // slippage, 0.5%
        5,  // maxKeeperFeeInUsd, $5
      );
2. 重整联合国信息技术研究所:重整联合国信息技术研究所
      const withdrawAmount = new BigNumber(1).times(1e18).toString();
      const tx = await pool.redeemUnitViaFlatMoney(
        withdrawAmount,
        0.5,  // slippage, 0.5%
        5, // maxKeeperFeeInUsd, $5
      );
3. 取消宣布的命令
      await pool.cancelOrderViaFlatMoney();

发展

设置

# install
yarn install

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

.env 识别的密钥 :

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

构建线条( L)

yarn build   # tsdx build
yarn lint    # tsdx lint

叉子网络

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

网络命令本地端口
多边形yarn fork:polygon8542 (英语)
乐观主义yarn fork:optimism第8544号
坐标yarn fork:arbitrum8540 (英语)
基础yarn fork:base8546 (英语)
以利亚yarn fork:ethereum8547 (英语)
等离子体yarn fork:plasma第8548号
超液态yarn fork:hyperliquid8549 (英语)

运行测试

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 共发布 73 个版本,首次发布于 2021/08/09;过去 12 个月发布了 13 个版本。

版本发布日期距今
2.2.7latest2026/11/13今天
2.2.62026/10/121 个月前
2.2.52026/07/223 个月前
2.2.42026/07/084 个月前
2.2.32026/07/084 个月前
2.2.22026/06/055 个月前

关于 @dhedge/v2-sdk 的常见问题

@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 和提交记录判断。