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

수익 창출하기

Stable 메인넷의 Morpho V2 볼트에 USDT0를 공급하여 수익을 얻은 다음, 포지션을 확인하고 인출하세요. @stablechain/sdkearn 메서드는 ERC-20 승인, 예치, 인출 시 어댑터 할당 해제를 처리하므로, 각 작업당 하나의 메서드만 호출하면 됩니다.

두 개의 클라이언트가 사용됩니다. createStable은 예치 및 인출을 위한 서명 클라이언트를 제공합니다. createStableReader는 APY, 포지션, 인출 가능성을 확인하기 위한 읽기 전용 클라이언트를 제공하며, 서명자는 필요 없습니다.

전제 조건

  • Node.js 20 이상, @stablechain/sdkviem 설치. SDK Quickstart를 참조하세요.
  • Stable 메인넷에 USDT0를 보유한 서명자. 자금을 이동하려면 stable.bridge 또는 지원되는 브리지 중 하나를 사용하세요.
  • 볼트 주소. SDK는 기본 메인넷 볼트를 STABLE_VAULT_ADDRESS로 내보냅니다.

1. 볼트로 서명 클라이언트 생성

createStableearn: { vault }를 전달합니다. 이것이 없으면 예치 및 인출 메서드는 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를 전달합니다(예: 80%의 경우 0.8); 금액이 한도를 초과하면 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에서 서명하지 않으려면?

트랜잭션을 다른 곳(릴레이어, 가스 면제 흐름 또는 멀티시그)에서 서명하는 경우, 보내지 않고 콜데이터를 빌드합니다.

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를 언제 사용해야 하는지, 서명 모드가 어떻게 작동하는지.