Are you an LLM? Read llms.txt for a summary of the docs, or llms-full.txt for the full context.
Skip to content

赚取收益

将 USDT0 供应到 Stable 主网上的 Morpho V2 资金库以赚取收益,然后读取您的头寸并提现。 @stablechain/sdkearn 方法处理 ERC-20 批准、存款和提现时的适配器解除分配,因此您每个操作只需调用一个方法。

涉及两个客户端。createStable 为您提供用于存款和提现的签名客户端。 createStableReader 为您提供只读客户端,用于查询 APY、头寸和可提现性,无需签名器。

先决条件

  • Node.js 20 或更高版本,并安装了 @stablechain/sdkviem。请参阅 SDK 快速入门
  • 在 Stable 主网上拥有 USDT0 的签名者。要转入资金,请使用 stable.bridge 或其中一个 支持的桥接器
  • 资金库地址。SDK 将默认主网资金库导出为 STABLE_VAULT_ADDRESS

1. 使用资金库创建签名客户端

earn: { vault } 传递给 createStable。如果没有它,存款和提现方法将抛出 StableValidationError

import { createStable, Network, STABLE_VAULT_ADDRESS } from "@stablechain/sdk";
import { privateKeyToAccount } from "viem/accounts";
 
const account = privateKeyToAccount(process.env.PRIVATE_KEY as `0x${string}`);
 
const stable = createStable({
  network: Network.Mainnet,
  account,
  earn: { vault: STABLE_VAULT_ADDRESS },
});
StableClient { transfer, quoteBridge, bridge, quoteSwap, swap, earn }

2. 存款前检查 APY

创建一个只读阅读器并获取资金库当前的净 APY。阅读器需要您要读取的地址和资金库,但不需要签名者。

import { createStableReader } from "@stablechain/sdk";
 
const reader = createStableReader({
  network: Network.Mainnet,
  address: account.address,
  earn: { vault: STABLE_VAULT_ADDRESS },
});
 
const { apy, native, rewards } = await reader.earn.getYield();
console.log("Net APY:", (apy * 100).toFixed(2) + "%");
Net APY: 5.80%

apy 是扣除费用后的总净 APY,包括奖励提升。native 是其自身的底层市场收益,rewards 分别列出了每个奖励代币的 APR 贡献。所有值都是小数,所以 0.058 是 5.8%。

要估算一段时间内的收益金额,请使用 preview

const { projectedYield } = await reader.earn.preview({ amount: 1000, horizonDays: 30 });
console.log("30-day projection on 1000:", projectedYield.toFixed(2));
30-day projection on 1000: 4.64

3. 存款

将资产存入资金库。SDK 发送审批(或者当钱包支持时发送许可签名),然后是存款,并等待收据。

const { txHash } = await stable.earn.deposit({ amount: 100 });
console.log("Deposit:", txHash);
Deposit: 0x8f3a...2d41

金额是人类可读的。除非您传递 tokenDecimals,否则底层资产的小数位会在链上获取。要限制单次存款消耗的资金库闲置流动性,请传递 depositBuffer(例如 0.8 表示 80%);如果金额超过上限,SDK 会在发送前抛出。

4. 读取您的持仓

获取您的份额余额及其当前资产价值。

const position = await reader.earn.position();
console.log("Shares:", position.sharesFormatted, "worth", position.assets);
Shares: 100 worth 100.02

shares 是原始余额,sharesFormatted 是其人类可读值。assets 是这些份额目前以底层单位计算的价值。

5. 提现或赎回

提取特定数量的底层资产,或赎回一定数量的份额。当资金库的闲置流动性不足时,SDK 会自动解除资金库适配器的分配以弥补差额。

const { txHash } = await stable.earn.withdraw({ amount: 50 });
console.log("Withdraw:", txHash);
Withdraw: 0xabcd...7890

要按份额数量赎回,请使用 stable.earn.redeem({ shares: 25 })。要首先检查某个金额是否可以立即取出,请调用阅读器:

const { isInstant, availableLiquidity } = await reader.earn.withdrawability({ amount: 50 });
console.log("Instant:", isInstant, "available:", availableLiquidity);
Instant: true available: 12500.5

isInstantfalse 时,提现仍然成功;它只是需要适配器解除分配,这由 withdrawredeem 为您处理。要手动控制从哪些适配器提取,请使用 forceWithdraw / forceRedeem

6. 领取激励奖励

资金库除了原生收益外,还可以赚取 Merkl 奖励代币。获取待领取奖励,然后领取它们。这些方法需要签名者,但不需要 earn 资金库配置。

const { rewards } = await stable.earn.incentiveRewards.fetch();
if (rewards.length > 0) {
  const { txHash, tokenCount } = await stable.earn.incentiveRewards.claim();
  console.log("Claimed", tokenCount, "token(s):", txHash);
}
Claimed 1 token(s): 0xabcd...7890

不在 SDK 中签名?

如果您在其他地方(中继器、免 gas 费用流程或多重签名)签名交易,则可以构建 calldata 而不发送它:

const { steps, chainId } = await stable.earn.prepareDepositCalldata({ amount: 100 });
{ steps: [ { to: "0x...", data: "0x...", value: 0n } ], chainId: 988 }

steps 是一个有序的交易列表,一个可选的批准后跟存款。prepareWithdrawCalldataprepareRedeemCalldata 都返回一个单一的 { to, data, value, chainId } 交易。

下一步

  • SDK 参考:完整的赚取收益参数、返回类型和阅读器方法。
  • 与 wagmi 一起使用:将 SDK 集成到 React 应用程序中,以便用户可以通过浏览器钱包存款。
  • SDK 概述:何时使用 SDK,以及签名模式的工作原理。