Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
92 changes: 46 additions & 46 deletions docs/pages/cn/how-to/earn-yield.mdx
Original file line number Diff line number Diff line change
@@ -1,30 +1,30 @@
---
source_path: how-to/earn-yield.mdx
source_sha: 03f36a00122cecc73b90075f5f9276cfd84121ee
title: "用 SDK 赚取收益"
description: "使用 Stable SDK 将 USDT0 存入 Morpho 资金库,读取年化收益率和头寸,提款,并领取 Merkl 奖励。"
source_sha: 7ae7a5bed0270b5b3181ebc3970c58172b6f0974
title: "赚取收益"
description: "通过 Stable SDK 将 USDT0 存入 Morpho 资金库,读取您的 APY 和头寸,提现,并领取 Merkl 奖励。"
diataxis: "how-to"
---

# 用 SDK 赚取收益
# 赚取收益

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

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

## 先决条件

- Node.js 20 或更高版本,以及已安装的 `@stablechain/sdk` 和 `viem`。请参阅 [SDK 快速入门](/cn/tutorial/sdk-quickstart)。
- 具有 Stable 主网 USDT0 的签名器。要转入资金,请使用 [`stable.bridge`](/cn/reference/sdk#bridgeparams) 或其中一个[支持的桥接器](/cn/reference/bridges)。
- Node.js 20 或更高版本,并安装了 `@stablechain/sdk` 和 `viem`。请参阅 [SDK 快速入门](/cn/tutorial/sdk-quickstart)。
- Stable 主网上拥有 USDT0 的签名者。要转入资金,请使用 [`stable.bridge`](/cn/reference/sdk#bridgeparams) 或其中一个 [支持的桥接器](/cn/reference/bridges)。
- 资金库地址。SDK 将默认主网资金库导出为 `STABLE_VAULT_ADDRESS`。

:::note
赚取收益的示例在主网上运行。SDK 不提供测试网资金库地址,因此 `Network.Testnet` 仅适用于您自己部署的资金库。
赚取收益示例在主网上运行。SDK 不提供测试网资金库地址,因此 `Network.Testnet` 仅适用于您自己部署的资金库。
:::

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

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

```ts
import { createStable, Network, STABLE_VAULT_ADDRESS } from "@stablechain/sdk";
Expand All @@ -43,9 +43,9 @@ const stable = createStable({
StableClient { transfer, quoteBridge, bridge, quoteSwap, swap, earn }
```

## 2. 存款前查看年化收益率
## 2. 存款前检查 APY

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

```ts
import { createStableReader } from "@stablechain/sdk";
Expand All @@ -57,109 +57,109 @@ const reader = createStableReader({
});

const { apy, native, rewards } = await reader.earn.getYield();
console.log("净年化收益率:", (apy * 100).toFixed(2) + "%");
console.log("Net APY:", (apy * 100).toFixed(2) + "%");
```

```text
净年化收益率: 5.80%
Net APY: 5.80%
```

`apy` 是扣除费用后的总净年化收益率,包括奖励提升。`native` 是底层市场的独立收益率,`rewards` 则分解了每个奖励代币的年化百分比贡献。所有值均为小数,因此 `0.058` 表示 5.8%。
`apy` 是扣除费用后的总净 APY,包括奖励提升。`native` 是其自身的底层市场收益,`rewards` 分别列出了每个奖励代币的 APR 贡献。所有值都是小数,所以 `0.058` 5.8%。

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

```ts
const { projectedYield } = await reader.earn.preview({ amount: 1000, horizonDays: 30 });
console.log("1000 美元 30 天预测收益:", projectedYield.toFixed(2));
console.log("30-day projection on 1000:", projectedYield.toFixed(2));
```

```text
1000 美元 30 天预测收益: 4.64
30-day projection on 1000: 4.64
```

## 3. 存款

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

```ts
const { txHash } = await stable.earn.deposit({ amount: 100 });
console.log("存款交易哈希:", txHash);
console.log("Deposit:", txHash);
```

```text
存款交易哈希: 0x8f3a...2d41
Deposit: 0x8f3a...2d41
```

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

:::tip
传递 `idempotencyKey` 可使存款安全重试。如果使用相同键的调用已在进行中,SDK 将返回相同的 Promise,而不是发送第二个交易
传递 `idempotencyKey` 可使存款安全地重试。如果使用相同密钥的调用已在进行中,SDK 将返回相同的 Promise,而不是发送第二个事务
:::

## 4. 读取您的头寸
## 4. 读取您的持仓

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

```ts
const position = await reader.earn.position();
console.log("份额:", position.sharesFormatted, "价值", position.assets);
console.log("Shares:", position.sharesFormatted, "worth", position.assets);
```

```text
份额: 100 价值 100.02
Shares: 100 worth 100.02
```

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

## 5. 提款或赎回
## 5. 提现或赎回

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

```ts
const { txHash } = await stable.earn.withdraw({ amount: 50 });
console.log("提款交易哈希:", txHash);
console.log("Withdraw:", txHash);
```

```text
提款交易哈希: 0xabcd...7890
Withdraw: 0xabcd...7890
```

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

```ts
const { isInstant, availableLiquidity } = await reader.earn.withdrawability({ amount: 50 });
console.log("即时提款:", isInstant, "可用流动性:", availableLiquidity);
console.log("Instant:", isInstant, "available:", availableLiquidity);
```

```text
即时提款: true 可用流动性: 12500.5
Instant: true available: 12500.5
```

当 `isInstant` 为 `false` 时,提款仍然成功;它只是需要适配器解除分配,这由 `withdraw` 和 `redeem` 为您处理。要手动控制从哪些适配器中提取,请使用 [`forceWithdraw` / `forceRedeem`](/cn/reference/sdk#forcewithdrawparams--forceredeemparams)。
当 `isInstant` 为 `false` 时,提现仍然成功;它只是需要适配器解除分配,这由 `withdraw` 和 `redeem` 为您处理。要手动控制从哪些适配器提取,请使用 [`forceWithdraw` / `forceRedeem`](/cn/reference/sdk#forcewithdrawparams--forceredeemparams)。

## 6. 领取奖励
## 6. 领取激励奖励

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

```ts
const { rewards } = await stable.earn.incentiveRewards.fetch();
if (rewards.length > 0) {
const { txHash, tokenCount } = await stable.earn.incentiveRewards.claim();
console.log("已领取", tokenCount, "个代币:", txHash);
console.log("Claimed", tokenCount, "token(s):", txHash);
}
```

```text
已领取 1 个代币: 0xabcd...7890
Claimed 1 token(s): 0xabcd...7890
```

:::note
Merkl 大约每两小时将奖励提交到其 merkle 树。仍在等待更新的奖励尚不能领取,如果调用 `claim()` 时没有可领取的奖励,则会抛出 `StableValidationError`。对于浏览器,请将 `merklApiBase` 设置为您自己服务器上的代理,以避免 Merkl API 的 CORS 限制。
Merkl 大约每两小时将奖励提交到其 Merkle 树。尚未更新的待领取奖励暂时无法领取,并且如果调用 `claim()` 时没有任何可领取项,则会抛出 `StableValidationError`。对于浏览器, `merklApiBase` 设置为您自己服务器上的代理,以避免 Merkl API 的 CORS 限制。
:::

## 不在 SDK 中签名?

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

```ts
const { steps, chainId } = await stable.earn.prepareDepositCalldata({ amount: 100 });
Expand All @@ -169,10 +169,10 @@ const { steps, chainId } = await stable.earn.prepareDepositCalldata({ amount: 10
{ steps: [ { to: "0x...", data: "0x...", value: 0n } ], chainId: 988 }
```

`steps` 是一个有序的交易列表,一个可选的授权,然后是存款。`prepareWithdrawCalldata` 和 `prepareRedeemCalldata` 各自返回一个 `{ to, data, value, chainId }` 交易。
`steps` 是一个有序的交易列表,一个可选的批准后跟存款。`prepareWithdrawCalldata` 和 `prepareRedeemCalldata` 都返回一个单一的 `{ to, data, value, chainId }` 交易。

## 接下来去哪里
## 下一步

- [**SDK 参考**](/cn/reference/sdk#stableearn):完整的赚取收益参数、返回类型和读取器方法
- [**与 wagmi 一起使用**](/cn/how-to/sdk-with-wagmi):将 SDK 集成到 React 应用程序中,以便用户从浏览器钱包存款
- [**SDK 概述**](/cn/explanation/sdk-overview):何时使用 SDK 以及签名模式如何工作
- [**SDK 参考**](/cn/reference/sdk#stableearn):完整的赚取收益参数、返回类型和阅读器方法
- [**与 wagmi 一起使用**](/cn/how-to/sdk-with-wagmi):将 SDK 集成到 React 应用程序中,以便用户可以通过浏览器钱包存款
- [**SDK 概述**](/cn/explanation/sdk-overview):何时使用 SDK,以及签名模式的工作原理
4 changes: 2 additions & 2 deletions docs/pages/en/how-to/earn-yield.mdx
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
---
title: "Earn yield with the SDK"
title: "Earn yield"
description: "Deposit USDT0 into a Morpho vault with the Stable SDK, read your APY and position, withdraw, and claim Merkl rewards."
diataxis: "how-to"
---

# Earn yield with the SDK
# Earn yield

Supply USDT0 into a Morpho V2 vault on Stable mainnet to earn yield, then read your position and withdraw. The `@stablechain/sdk` `earn` methods handle the ERC-20 approval, the deposit, and adapter deallocations on withdrawal, so you call one method per action.

Expand Down
Loading
Loading