赚取收益
将 USDT0 供应到 Stable 主网上的 Morpho V2 资金库以赚取收益,然后读取您的头寸并提现。 @stablechain/sdk 的 earn 方法处理 ERC-20 批准、存款和提现时的适配器解除分配,因此您每个操作只需调用一个方法。
涉及两个客户端。createStable 为您提供用于存款和提现的签名客户端。 createStableReader 为您提供只读客户端,用于查询 APY、头寸和可提现性,无需签名器。
先决条件
- Node.js 20 或更高版本,并安装了
@stablechain/sdk和viem。请参阅 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.643. 存款
将资产存入资金库。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.02shares 是原始余额,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当 isInstant 为 false 时,提现仍然成功;它只是需要适配器解除分配,这由 withdraw 和 redeem 为您处理。要手动控制从哪些适配器提取,请使用 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 是一个有序的交易列表,一个可选的批准后跟存款。prepareWithdrawCalldata 和 prepareRedeemCalldata 都返回一个单一的 { to, data, value, chainId } 交易。
下一步
- SDK 参考:完整的赚取收益参数、返回类型和阅读器方法。
- 与 wagmi 一起使用:将 SDK 集成到 React 应用程序中,以便用户可以通过浏览器钱包存款。
- SDK 概述:何时使用 SDK,以及签名模式的工作原理。

