SDK 레퍼런스
@stablechain/sdk의 전체 표면. 여기에는 createStable의 서명 클라이언트, createStableReader의 읽기 전용 클라이언트, 공유 열거형, 상수 및 오류 클래스가 포함됩니다. 자세한 내용은 SDK 퀵스타트를 참조하십시오. 작업 중심의 수익 가이드를 보려면 SDK로 수익 얻기를 참조하십시오.
설치
npm install @stablechain/sdk viemadded 2 packages, audited 3 packages in 2sviem >= 2.0.0은 피어 의존성입니다. 패키지는 @stablechain/sdk로 게시됩니다.
createStable(config)
StableClient를 구성합니다. StableClient에 나열된 메서드가 포함된 객체를 반환합니다.
import { createStable, Network } from "@stablechain/sdk";
const stable = createStable({ network: Network.Mainnet, account });StableClient { transfer, quoteBridge, bridge, quoteSwap, swap, earn }StableConfig
| 필드 | 유형 | 기본값 | 설명 |
|---|---|---|---|
network | Network | Network.Mainnet | 대상 네트워크. |
rpc | string | network에 대한 공용 RPC | RPC 재정의. |
account | viem.Account | 서버 측 서명자 (예: privateKeyToAccount). | |
transport | viem.Transport | 브라우저-지갑 전송 (예: custom(window.ethereum)). | |
walletClient | viem.WalletClient | 사전 구축된 지갑 클라이언트. account 및 transport보다 우선합니다. | |
earn | { vault: string } | 모포 V2 볼트 구성. stable.earn의 입금, 인출, 상환 및 준비-콜데이터 메서드를 호출하는 데 필요합니다. | |
merklApiBase | string | https://api.merkl.xyz | Merkl 보상 API 기본 URL. 자체 서버를 통해 프록시하고 브라우저 CORS 제한을 피하려면 재정의하십시오. |
account, transport 또는 walletClient 중 하나를 제공하십시오. earn 필드는 선택 사항입니다. 전송, 브릿지 및 스왑은 그것 없이도 작동합니다. 볼트 입금 및 인출에는 필요하며, 구성된 볼트 없이 호출하면 SDK는 StableValidationError를 발생시킵니다.
StableClient
transfer(params)
Stable에서 네이티브 USDT0 또는 모든 ERC-20을 보냅니다. 지갑을 Stable 체인으로 전환하고, 누락된 경우 온체인에서 토큰 소수점을 가져오고, 영수증을 기다립니다.
const { txHash } = await stable.transfer({
from: "0xYourAddress",
to: "0xRecipient",
amount: 10,
});{ txHash: "0x8f3a...2d41" }| 매개변수 | 유형 | 설명 |
|---|---|---|
from | string | 발신자 주소. |
to | string | 수신자 주소. |
amount | number | 읽기 쉬운 금액. |
token | string? | ERC-20 계약 주소. 네이티브 USDT0의 경우 생략. |
tokenDecimals | number? | 소수점. 생략하면 온체인에서 가져옵니다. |
OperationResult ({ txHash, toAmount? })를 반환합니다.
quoteBridge(params)
브릿지 미리보기. 읽기 전용. 서명 없음, 가스 없음.
const quote = await stable.quoteBridge({
fromChain: Chain.Ethereum,
toChain: Chain.Stable,
fromToken: "0xdAC17F958D2ee523a2206206994597C13D831ec7", // 이더리움의 USDT
toToken: "0x779Ded0c9e1022225f8E0630b35a9b54bE713736", // Stable의 USDT0
amount: 100,
});{ toAmount: 99.73 }BridgeQuote를 반환합니다.
bridge(params)
LI.FI를 통해 토큰을 크로스 체인으로 브릿지하며, 이는 브릿지 경로를 선택합니다. SDK는 ERC-20 승인을 처리하고 보내기 전에 지갑을 소스 체인으로 전환합니다. 내부 견적 호출을 건너뛰려면 미리 가져온 quote를 전달하십시오.
const { txHash } = await stable.bridge({ ...bridgeParams, quote });{ txHash: "0xabcd...7890" }| 매개변수 | 유형 | 설명 |
|---|---|---|
fromChain | Chain | 소스 체인. |
toChain | Chain | 대상 체인. |
fromToken | string | 소스 토큰 계약 주소. |
toToken | string | 대상 토큰 계약 주소. |
amount | number | 사람이 읽을 수 있는 금액. |
fromDecimals | number? | 소스 토큰 소수점. 기본값은 6입니다. |
recipient | string? | 대상 주소. 기본값은 서명자입니다. |
quote | BridgeQuote? | 미리 가져온 견적. 내부 견적 호출을 건너뜁니다. |
quoteSwap(params)
Stable에서 LI.FI 스왑 견적을 가져옵니다. 사전 구축된 트랜잭션 요청과 승인 주소를 반환합니다.
const quote = await stable.earn.quoteSwap({
fromToken: "0x8a2B28364102Bea189D99A475C494330Ef2bDD0B",
toToken: "0x779Ded0c9e1022225f8E0630b35a9b54bE713736",
amount: 100,
fromDecimals: 6,
});{ toAmount: 99.81, fromAmount: 100000000n, fromToken: "0x8a2B...", approvalAddress: "0x...", transactionRequest: { ... } }swap(params)
LI.FI를 통해 Stable에서 토큰을 스왑합니다. ERC-20 승인을 자동으로 처리하고 필요할 때 지갑의 체인을 전환합니다.
const { txHash, toAmount } = await stable.swap({ ...swapParams, quote });{ txHash: "0xabcd...", toAmount: 99.81 }| 매개변수 | 유형 | 기본값 | 설명 |
|---|---|---|---|
fromToken | string | 소스 토큰 주소. | |
toToken | string | 대상 토큰 주소. | |
amount | number | 사람이 읽을 수 있는 금액. | |
fromDecimals | number? | 6 | 소스 토큰 소수점. |
toAddress | string? | 서명자 | 수신자 주소. |
quote | SwapQuote? | 미리 가져온 견적. LI.FI 호출을 건너뜁니다. |
stable.earn
수익을 얻기 위해 USDT0를 모포 V2 볼트에 공급하고 Merkl 인센티브 보상을 청구합니다. 모든 메서드는 earn 네임스페이스 아래에 있으며 서명자가 필요합니다. 입금, 인출, 상환 및 준비-콜데이터 메서드는 StableConfig에 earn: { vault }도 필요합니다.
const stable = createStable({
network: Network.Mainnet,
account,
earn: { vault: "0xb7Df8db22A5DBBFA9ebeb94b3910aec6a4f05c08" },
});stable.earn { deposit, bulkDeposit, withdraw, bulkWithdraw, redeem, forceWithdraw, forceRedeem, prepareDepositCalldata, prepareWithdrawCalldata, prepareRedeemCalldata, incentiveRewards }금액과 공유 수는 사람이 읽을 수 있는 숫자입니다. 자산 및 공유 소수점은 생략하면 온체인에서 가져옵니다. 입금, 인출, 상환 및 강제 메서드는 EarnResult ({ txHash, idempotencyKey? })를 반환하고 해결되기 전에 영수증을 기다립니다. 대량 메서드는 BulkEarnResult를 반환하고 incentiveRewards.claim()은 아래 섹션에 설명된 MerklClaimResult를 반환합니다.
deposit(params)
자산을 볼트에 공급합니다. ERC-20 승인(또는 지갑이 지원하는 경우 허가 서명)을 처리한 다음 단일 호출로 입금합니다.
const { txHash } = await stable.earn.deposit({ amount: 100 });{ txHash: "0x8f3a...2d41" }| 매개변수 | 유형 | 기본값 | 설명 |
|---|---|---|---|
amount | number | 입금할 기본 자산, 사람이 읽을 수 있는. | |
vault | string? | 구성 볼트 | 볼트 주소 재정의. 여러 볼트에 걸쳐 bulkDeposit에서 항목당 필요합니다. |
tokenDecimals | number? | 온체인 | 기본 자산 소수점. |
slippageTolerance | number? | 0.0003 | 소수점 형식의 슬리피지 (예: 0.003 = 0.3%). 기본값은 Morpho의 0.03%입니다. |
depositBuffer | number? | 이 입금이 소비할 수 있는 볼트의 유휴 유동성 최대 비율 (예: 0.8 = 80%). > 0 이고 ≤ 1 이어야 합니다. 초과하면 보내기 전에 예외를 발생시킵니다. | |
idempotencyKey | string? | 중복 제거 키. 진행 중인 키로 두 번째 호출은 동일한 Promise를 반환합니다. |
withdraw(params)
주어진 양의 기본 자산을 인출합니다. 유휴 볼트 유동성이 부족할 때 SDK는 차액을 충당하기 위해 볼트의 어댑터에서 자동으로 할당을 해제합니다.
const { txHash } = await stable.earn.withdraw({ amount: 50 });{ txHash: "0xabcd...7890" }| 매개변수 | 유형 | 기본값 | 설명 |
|---|---|---|---|
amount | number | 인출할 기본 자산, 사람이 읽을 수 있는. | |
tokenDecimals | number? | 온체인 | 기본 자산 소수점. |
idempotencyKey | string? | 중복 제거 키. |
redeem(params)
기본 자산으로 다시 볼트 공유 수를 상환합니다. withdraw와 마찬가지로 유휴 유동성이 부족할 때 어댑터에서 자동으로 할당을 해제합니다.
const { txHash } = await stable.earn.redeem({ shares: 25 });{ txHash: "0xabcd...7890" }| 매개변수 | 유형 | 기본값 | 설명 |
|---|---|---|---|
shares | number | 상환할 볼트 공유, 사람이 읽을 수 있는. | |
shareDecimals | number? | 온체인 | 볼트 공유 소수점. |
idempotencyKey | string? | 중복 제거 키. |
bulkDeposit(items, options?) / bulkWithdraw(items, options?)
여러 입금 또는 인출을 순차적으로 실행합니다. 기본적으로 배치는 모든 항목을 시도하고 부분 결과를 반환합니다. stopOnError: true를 설정하면 첫 번째 실패 시 중단하고 StableBulkError를 발생시킵니다.
const result = await stable.earn.bulkDeposit([
{ amount: 100 },
{ amount: 250, vault: "0xAnotherVault" },
]);{ results: [ { status: "fulfilled", txHash: "0x..." }, ... ], succeeded: 2, failed: 0 }items는 EarnDepositParams (또는 EarnWithdrawParams) 배열입니다. options는 다음을 허용합니다:
| 옵션 | 유형 | 기본값 | 설명 |
|---|---|---|---|
idempotencyKey | string? | 배치 수준 중복 제거 키. | |
stopOnError | boolean? | false | 첫 번째 실패 시 중단하고 부분 결과를 반환하는 대신 StableBulkError를 발생시킵니다. |
BulkEarnResult ({ results, succeeded, failed, idempotencyKey? })를 반환합니다. results의 각 항목은 { status: "fulfilled", txHash, vault?, idempotencyKey? } 또는 { status: "rejected", error, vault?, idempotencyKey? }입니다.
forceWithdraw(params) / forceRedeem(params)
어떤 어댑터 위치에서 먼저 할당을 해제할지 명시적으로 제어하여 인출 또는 상환합니다. withdraw / redeem의 자동 선택 대신 직접 소스 시장을 선택해야 할 때 사용하십시오.
const { txHash } = await stable.earn.forceWithdraw({
amount: 1000,
deallocations: [{ adapter: "0xAdapter", amount: 1000 }],
});{ txHash: "0xabcd...7890" }둘 다 deallocations: ForceDeallocation[] 배열과 선택적 tokenDecimals (기본 자산 소수점, 할당 해제 금액에 사용; 생략하면 온체인에서 가져옴)을 사용합니다. forceWithdraw는 amount를 사용합니다. forceRedeem은 shares와 선택적 shareDecimals를 사용합니다. 각 ForceDeallocation은 다음과 같습니다.
| 필드 | 유형 | 설명 |
|---|---|---|
adapter | string | 할당을 해제할 어댑터 계약. |
amount | number | 기본 자산 단위로 할당을 해제할 금액. |
marketParams | object? | Morpho Blue 시장 어댑터에만 필요: { loanToken, collateralToken, oracle, irm, lltv } (lltv는 1e18으로 스케일링됨). 볼트 어댑터의 경우 생략. |
prepareDepositCalldata(params) / prepareWithdrawCalldata(params) / prepareRedeemCalldata(params)
서명하거나 보내지 않고 트랜잭션 콜데이터를 빌드합니다. 릴레이어, 가스 면제 흐름 또는 멀티시그를 통해 트랜잭션을 라우팅하는 데 사용하십시오.
const { steps, chainId } = await stable.earn.prepareDepositCalldata({ amount: 100 });{ steps: [ { to: "0x...", data: "0x...", value: 0n } ], chainId: 988 }prepareDepositCalldata는 EarnDepositCalldata ({ steps, chainId })를 반환하며, 여기서 steps는 { to, data, value } 트랜잭션의 정렬된 목록입니다. 이는 선택적 토큰 승인과 뒤이은 입금입니다. prepareWithdrawCalldata 및 prepareRedeemCalldata는 단일 트랜잭션인 EarnWithdrawCalldata ({ to, data, value, chainId })를 반환합니다. 서명 파트너와 동일한 매개변수를 허용합니다.
incentiveRewards
서명자에 대한 Merkl 보상 토큰을 가져오고 청구합니다. 이 메서드는 서명자가 필요하지만 earn 볼트 구성은 필요하지 않습니다.
const { rewards } = await stable.earn.incentiveRewards.fetch();
const { txHash, tokenCount } = await stable.earn.incentiveRewards.claim();{ txHash: "0xabcd...7890", tokenCount: 1 }fetch()는 토큰당 순 청구 가능 금액을 포함하는 MerklRewardsResult ({ chainId, rewards: MerklReward[] })를 반환합니다. claim()은 현재 Merkl Merkle 트리에 커밋된 모든 보상을 청구하고 MerklClaimResult ({ txHash, tokenCount })를 반환합니다.
createStableReader(config)
볼트 수익 및 포지션 데이터에 대한 읽기 전용 StableReader를 구성합니다. 서명자는 필요하지 않고 읽으려는 주소만 있으면 됩니다.
import { createStableReader, Network } from "@stablechain/sdk";
const reader = createStableReader({
network: Network.Mainnet,
address: "0xUserAddress",
earn: { vault: "0xb7Df8db22A5DBBFA9ebeb94b3910aec6a4f05c08" },
});StableReader { earn: { getYield, position, preview, withdrawability, incentiveRewards } }StableReaderConfig
| 필드 | 유형 | 기본값 | 설명 |
|---|---|---|---|
address | string | 포지션과 보상을 읽을 사용자 주소. 필수. | |
earn | { vault: string } | 읽을 볼트. 필수: createStableReader는 없을 경우 StableValidationError를 발생시킵니다. | |
network | Network? | Network.Mainnet | 대상 네트워크. |
rpc | string? | 공용 RPC | RPC 재정의. |
merklApiBase | string? | https://api.merkl.xyz | Merkl 보상 API 기본 URL. |
StableReader
getYield()
볼트의 현재 순 APY 및 수수료 내역을 반환합니다.
const vaultYield = await reader.earn.getYield();{ apy: 0.058, native: 0.041, rewards: [ { symbol: "MORPHO", address: "0x...", apr: 0.017 } ], performanceFee: 0.1, managementFee: 0 }VaultYield를 반환합니다. apy는 보상 부스트를 포함한 수수료 후 총 순 APY이며, native는 보상을 제외한 기본 시장 수익률입니다. 모든 값은 소수점 형식입니다 (0.05 = 5%).
position()
구성된 주소의 현재 볼트 포지션을 반환합니다.
const position = await reader.earn.position();{ shares: 100000000n, sharesFormatted: 100, shareDecimals: 6, assets: 101.2, tokenDecimals: 6, assetAddress: "0x..." }원시 shares 잔액, 포맷된 사람이 읽을 수 있는 sharesFormatted 값, 기본 단위로 된 해당 공유의 assets 값을 포함하는 VaultPosition을 반환합니다.
preview(params)
볼트의 실시간 순 APY를 사용하여 특정 금액의 수익을 특정 기간 동안 예측합니다.
const preview = await reader.earn.preview({ amount: 1000, horizonDays: 30 });{ projectedYield: 4.64, apy: 0.058, horizonDays: 30 }| 매개변수 | 유형 | 설명 |
|---|---|---|
amount | number | 예측할 원금, 사람이 읽을 수 있는. |
horizonDays | number | 예측 기간(일). |
YieldPreview ({ projectedYield, apy, horizonDays })를 반환합니다.
withdrawability(params)
볼트의 유휴 유동성에서 즉시 인출 가능한 금액인지 확인합니다.
const status = await reader.earn.withdrawability({ amount: 5000 });{ isInstant: true, availableLiquidity: 12500.5, tokenDecimals: 6 }| 매개변수 | 유형 | 기본값 | 설명 |
|---|---|---|---|
amount | number | 테스트할 금액, 사람이 읽을 수 있는. | |
tokenDecimals | number? | 온체인 | 기본 자산 소수점. |
WithdrawStatus ({ isInstant, availableLiquidity, tokenDecimals })를 반환합니다. isInstant가 false일 때 인출은 어댑터 할당 해제가 필요하며, 이는 stable.earn.withdraw가 자동으로 처리합니다.
incentiveRewards.fetch()
구성된 주소에 대한 보류 중인 Merkl 보상을 읽습니다. stable.earn.incentiveRewards.fetch에 대한 읽기 전용 대응물입니다.
const { rewards } = await reader.earn.incentiveRewards.fetch();{ chainId: 988, rewards: [ { token: { symbol: "MORPHO", ... }, amount: 1.25, rawAmount: "1250000...", proofs: [...] } ] }MerklRewardsResult를 반환합니다.
열거형
Network
| 값 | 체인 ID |
|---|---|
Network.Mainnet | 988 |
Network.Testnet | 2201 |
Chain
quoteBridge 및 bridge에서 사용됩니다. 각 항목에는 해당 CHAIN_CONFIGS 항목이 있습니다. 두 테스트넷 항목은 완전성을 위해 정의되었지만 LI.FI는 이를 거부합니다. 브릿징은 메인넷 체인 사이에서만 작동합니다.
| 열거형 | 네트워크 | 체인 ID |
|---|---|---|
Chain.Sepolia | 이더리움 세폴리아 | 11155111 |
Chain.StableTestnet | Stable 테스트넷 | 2201 |
Chain.Stable | Stable 메인넷 | 988 |
Chain.Ethereum | 이더리움 | 1 |
Chain.Arbitrum | 아비트럼 원 | 42161 |
Chain.Ink | Ink | 57073 |
Chain.Bera | 베라체인 | 80094 |
Chain.MegaETH | MegaETH | 4326 |
Chain.Base | Base | 8453 |
Chain.BSC | BNB 스마트 체인 | 56 |
Chain.HyperEVM | HyperEVM | 999 |
CHAIN_CONFIGS
Chain 열거형으로 키가 지정된 Partial<Record<Chain, ChainConfig>>입니다. 각 항목은 id, rpc, usdt 및 decimals를 노출합니다. 지원되는 체인에서 표준 USDT 주소를 하드 코딩하지 않고 필요할 때 사용하십시오.
import { CHAIN_CONFIGS, Chain } from "@stablechain/sdk";
console.log(CHAIN_CONFIGS[Chain.Stable]);{ id: 988, rpc: "https://rpc.stable.xyz", usdt: "0x779Ded0c9e1022225f8E0630b35a9b54bE713736", decimals: 6 }상수
하드 코딩할 필요가 없도록 내보낸 정식 메인넷 주소.
import { STABLE_USDT_ADDRESS, STABLE_VAULT_ADDRESS } from "@stablechain/sdk";STABLE_USDT_ADDRESS 0x779ded0c9e1022225f8e0630b35a9b54be713736
STABLE_VAULT_ADDRESS 0xb7Df8db22A5DBBFA9ebeb94b3910aec6a4f05c08| 상수 | 설명 |
|---|---|
STABLE_USDT_ADDRESS | Stable 메인넷의 USDT 토큰 주소. |
STABLE_VAULT_ADDRESS | Stable 메인넷의 기본 Morpho V2 수익 볼트. earn: { vault }에 전달. |
오류
모든 SDK 오류는 viem의 BaseError를 확장하는 StableError를 확장합니다. 오류는 구조화된 메타데이터를 포함하므로 error.name 또는 instanceof를 사용하여 분기할 수 있습니다.
| 클래스 | 발생 시점 | 유용한 필드 |
|---|---|---|
StableValidationError | 매개변수 유효성 검사 실패 (잘못된 주소, 유한하지 않은 양, 지원되지 않는 체인). | field, value |
StableQuoteError | LI.FI에 대한 견적 요청 실패. | provider, httpStatus, providerCode, body |
StableTransactionError | 온체인 단계 실패: 체인 전환, 승인, 전송 또는 되돌리기. | phase, txHash, chainId, revertReason |
StableNetworkError | 기본 HTTP/RPC 호출 실패 (예: Morpho 또는 Merkl API). | url |
StableBulkError | stopOnError: true로 실행된 bulkDeposit 또는 bulkWithdraw가 첫 번째 실패 시 중단. | results, succeeded, failed |
import { StableTransactionError } from "@stablechain/sdk";
try {
await stable.transfer({ from, to, amount: 1 });
} catch (err) {
if (err instanceof StableTransactionError && err.phase === "switch_chain") {
// 사용자가 체인 전환을 거부했습니다.
}
throw err;
}StableTransactionError: transfer: wallet rejected or failed to switch to chain 988
Phase: switch_chain
Chain ID: 988다음 권장 사항
- SDK 퀵스타트: SDK를 설치하고 테스트넷에서 첫 번째 전송을 실행합니다.
- viem과 함께 사용: 개인 키, 브라우저 지갑 및 사전 빌드된 서명자 간에 전환합니다.
- wagmi와 함께 사용: 훅을 사용하여 SDK를 React 앱에 연결합니다.

