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 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.ONEINCHODOS_API_KEY用于Dapp.ODOSODOS_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——每个dhNdHEDGE合同所抛出弦(例如.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 支持的交换数据时
- 批准托罗斯赎罪令牌:
await vault.approve(
Dapp.TOROS,
"TOROS_TOKEN_ADDRESS",
ethers.constants.MaxUint256
)
- 启动救赎:
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
)
- 在产品流动需要时完成取出:
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.
- 批准限级管理器的托罗斯金库令牌(一次)
import { ethers } from "ethers";
await vault.approveTorosLimitOrder(
"TOROS_VAULT_ADDRESS",
ethers.constants.MaxUint256
);
- 在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)
);
- 读取活动顺序, 修改或删除
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
- 将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个苏希斯瓦普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
)
- 批准无限额的 SLP USDC-DAI 代币,用于吸取 Sushiswap
const tx = await pool.approveStaking(
Dapp.SUSHISWAP,
"SLP_USDC_DAI_TOKEN_ADDRESS",
ethers.constants.MaxInt256
)
- USDC/DAI 代号
const amountSlpUsdcDai = "1000000000000000000" // 1 LP token (18 decimals)
const tx = await pool.stake(
Dapp.SUSHISWAP,
"SLP_USDC_DAI_TOKEN_ADDRESS",
amountSlpUsdcDai
)
- USDC/DAI 令牌
const amountSlpUsdcDai = "1000000000000000000" // 1 LP token (18 decimals)
const tx = await pool.unstake(
Dapp.SUSHISWAP,
"SLP_USDC_DAI_TOKEN_ADDRESS",
amountSlpUsdcDai
)
- 股份有限公司(USDC/DAI)
const tx = await pool.harvestRewards(
Dapp.SUSHISWAP,
"SLP_USDC_DAI_TOKEN_ADDRESS"
)
余额
对于平衡器,我们使用 joinBalancerPool, (中文(简体) ), exitBalancerPool,以及 harvestBalancerRewards
- 在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)
- 从 WBTC/USDC/ WETH 平衡器池中删除所有符号
const amount = await dhedge.utils.getBalance(BALANCER_LP_TOKEN_ADDRESS, pool.address)
const tx = await pool.exitBalancerPool(balancerPoolId, assets, amount)
- 平衡器的收获奖励
const tx = await pool.harvestBalancerRewards()
Uniswap- v3 样式
对阿拉基斯来说 我们使用 increaseLiquidity 以加注或加注 lp,以及 decreaseLiquidity,以及 claimFees示例 arrakis 测试
用于 Uniswap v3, 我们使用 approveUniswapV3Liquidity, (中文(简体) ), addLiquidityUniswapV3, (中文(简体) ), decreaseLiquidity, (中文(简体) ), increaseLiquidity,以及 claimFees。 。 。 .
- 将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,
)
- 从现有现金池中去除50%的流动性
tokenId = await nonfungiblePositionManager.tokenOfOwnerByIndex(pool.address,0).toString();
const tx = await pool.decreaseLiquidity(
Dapp.UNISWAPV3,
tokenId,
50 // percent
);
100%的删除会烧掉 NFT 位置 .
- 增加现有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
);
- 索赔费
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收费等级.
- 薄荷(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。 。 。 .
- 将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将会恢复.
- 在活跃的市场上将基础(如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 %
);
- 在成熟前将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
);
- 将成熟的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"。 。 。 .
- 为市场核准资产
await pool.approveSpender(MARKET_ADDRESS, ASSET_ADDRESS, ethers.constants.MaxUint256);
- 供应
// 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");
- 撤销
await pool.withdrawCompoundV3(MARKET_ADDRESS, ASSET_ADDRESS, AMOUNT);
- (只有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>_URL | RPC 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: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 (英语) |
运行测试
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 引文).