avnu
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
Chineseavnu SDK Integration
avnu SDK 集成
avnu is the leading DEX aggregator on Starknet, providing optimized swaps across multiple liquidity sources, DCA orders, staking, gasless transactions, and market data APIs.
avnu是Starknet上领先的DEX聚合器,提供跨多个流动性来源的优化兑换、DCA订单、质押、无Gas交易以及市场数据API服务。
Installation
安装
bash
npm install @avnu/avnu-sdk starknetbash
npm install @avnu/avnu-sdk starknetAccount Setup
账户设置
The SDK requires a Starknet account. Two patterns depending on your use case:
SDK需要一个Starknet账户,根据你的使用场景有两种配置方式:
Direct Account (Scripts/Backend)
直接账户(脚本/后端)
typescript
import { Account, RpcProvider } from 'starknet';
const provider = new RpcProvider({
nodeUrl: process.env.STARKNET_RPC_URL || 'https://rpc.starknet.lava.build'
});
const account = new Account(
provider,
process.env.STARKNET_ACCOUNT_ADDRESS!,
process.env.STARKNET_PRIVATE_KEY!
);typescript
import { Account, RpcProvider } from 'starknet';
const provider = new RpcProvider({
nodeUrl: process.env.STARKNET_RPC_URL || 'https://rpc.starknet.lava.build'
});
const account = new Account(
provider,
process.env.STARKNET_ACCOUNT_ADDRESS!,
process.env.STARKNET_PRIVATE_KEY!
);Wallet Account (Frontend/dApps)
钱包账户(前端/去中心化应用)
typescript
import { WalletAccount } from 'starknet';
// User connects their wallet (Argent, Braavos)
const account = await WalletAccount.connect(provider, walletProvider);typescript
import { WalletAccount } from 'starknet';
// 用户连接钱包(Argent、Braavos等)
const account = await WalletAccount.connect(provider, walletProvider);Common Token Addresses
常用代币地址
typescript
const TOKENS = {
ETH: '0x049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7',
STRK: '0x04718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d',
USDC: '0x053c91253bc9682c04929ca02ed00b3e423f6710d2ee7e0d5ebb06f3ecf368a8',
USDT: '0x068f5c6a61780768455de69077e07e89787839bf8166decfbf92b645209c0fb8',
};typescript
const TOKENS = {
ETH: '0x049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7',
STRK: '0x04718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d',
USDC: '0x053c91253bc9682c04929ca02ed00b3e423f6710d2ee7e0d5ebb06f3ecf368a8',
USDT: '0x068f5c6a61780768455de69077e07e89787839bf8166decfbf92b645209c0fb8',
};Swap Operations
兑换操作
Get optimized quotes from multiple DEXs and execute swaps with best-price routing.
从多个DEX获取最优报价,并通过最优价格路由执行兑换。
Get Quotes
获取报价
typescript
import { getQuotes } from '@avnu/avnu-sdk';
const quotes = await getQuotes({
sellTokenAddress: TOKENS.ETH,
buyTokenAddress: TOKENS.USDC,
sellAmount: BigInt(1e18), // 1 ETH
takerAddress: account.address,
size: 3, // Get top 3 quotes
});
const best = quotes[0];
console.log('Buy amount:', best.buyAmount);
console.log('Price impact:', `${(best.priceImpact / 100).toFixed(2)}%`); // basis points to %
console.log('Gas fees USD:', best.gasFeesInUsd);typescript
import { getQuotes } from '@avnu/avnu-sdk';
const quotes = await getQuotes({
sellTokenAddress: TOKENS.ETH,
buyTokenAddress: TOKENS.USDC,
sellAmount: BigInt(1e18), // 1 ETH
takerAddress: account.address,
size: 3, // 获取前3个报价
});
const best = quotes[0];
console.log('可买入数量:', best.buyAmount);
console.log('价格影响:', `${(best.priceImpact / 100).toFixed(2)}%`); // 基点转换为百分比
console.log('Gas费用(美元):', best.gasFeesInUsd);Execute Swap
执行兑换
typescript
import { executeSwap } from '@avnu/avnu-sdk';
const result = await executeSwap({
provider: account,
quote: quotes[0],
slippage: 0.01, // 1%
executeApprove: true,
});
console.log('Tx hash:', result.transactionHash);typescript
import { executeSwap } from '@avnu/avnu-sdk';
const result = await executeSwap({
provider: account,
quote: quotes[0],
slippage: 0.01, // 1%
executeApprove: true,
});
console.log('交易哈希:', result.transactionHash);Build Calls Only (for custom execution)
仅生成调用(用于自定义执行)
typescript
import { quoteToCalls } from '@avnu/avnu-sdk';
const { calls } = await quoteToCalls({
quote: quotes[0],
takerAddress: account.address,
slippage: 0.01,
includeApprove: true,
});
// Execute manually
const tx = await account.execute(calls);typescript
import { quoteToCalls } from '@avnu/avnu-sdk';
const { calls } = await quoteToCalls({
quote: quotes[0],
takerAddress: account.address,
slippage: 0.01,
includeApprove: true,
});
// 手动执行
const tx = await account.execute(calls);Slippage Strategies
滑点策略
| Token Type | Recommended Slippage |
|---|---|
| Stablecoins | 0.1% - 0.5% |
| Major tokens (ETH, STRK) | 0.5% - 1% |
| Low liquidity | 1% - 3% |
See references/swap-guide.md for advanced routing and multi-quote analysis.
| 代币类型 | 推荐滑点 |
|---|---|
| 稳定币 | 0.1% - 0.5% |
| 主流代币(ETH、STRK) | 0.5% - 1% |
| 低流动性代币 | 1% - 3% |
高级路由和多报价分析请参考 references/swap-guide.md。
DCA (Dollar Cost Averaging)
定期定额投资(DCA)
Create recurring buy orders that execute automatically at specified intervals.
创建可按指定时间间隔自动执行的定期买入订单。
Create DCA Order
创建DCA订单
typescript
import { executeCreateDca, createDcaToCalls } from '@avnu/avnu-sdk';
import moment from 'moment';
const dcaOrder = {
sellTokenAddress: TOKENS.USDC,
buyTokenAddress: TOKENS.ETH,
sellAmount: '100000000', // Total 100 USDC (6 decimals)
sellAmountPerCycle: '10000000', // 10 USDC per execution
frequency: moment.duration(1, 'day'),
traderAddress: account.address,
};
const result = await executeCreateDca({
provider: account,
order: dcaOrder,
});
console.log('DCA created:', result.transactionHash);typescript
import { executeCreateDca, createDcaToCalls } from '@avnu/avnu-sdk';
import moment from 'moment';
const dcaOrder = {
sellTokenAddress: TOKENS.USDC,
buyTokenAddress: TOKENS.ETH,
sellAmount: '100000000', // 总计100 USDC(6位小数)
sellAmountPerCycle: '10000000', // 每次执行买入10 USDC
frequency: moment.duration(1, 'day'),
traderAddress: account.address,
};
const result = await executeCreateDca({
provider: account,
order: dcaOrder,
});
console.log('DCA订单已创建:', result.transactionHash);Get User's DCA Orders
获取用户的DCA订单
typescript
import { getDcaOrders, DcaOrderStatus } from '@avnu/avnu-sdk';
const orders = await getDcaOrders({
traderAddress: account.address,
status: DcaOrderStatus.ACTIVE,
page: 0,
size: 20,
});
orders.content.forEach(order => {
console.log('Order:', order.orderAddress);
console.log('Progress:', order.executedTradesCount, '/', order.iterations);
console.log('Sold:', order.amountSold, '/ Bought:', order.amountBought);
});typescript
import { getDcaOrders, DcaOrderStatus } from '@avnu/avnu-sdk';
const orders = await getDcaOrders({
traderAddress: account.address,
status: DcaOrderStatus.ACTIVE,
page: 0,
size: 20,
});
orders.content.forEach(order => {
console.log('订单地址:', order.orderAddress);
console.log('执行进度:', order.executedTradesCount, '/', order.iterations);
console.log('已卖出:', order.amountSold, '/ 已买入:', order.amountBought);
});Cancel DCA Order
取消DCA订单
typescript
import { executeCancelDca } from '@avnu/avnu-sdk';
const result = await executeCancelDca({
provider: account,
orderAddress: '0xorder...',
});typescript
import { executeCancelDca } from '@avnu/avnu-sdk';
const result = await executeCancelDca({
provider: account,
orderAddress: '0xorder...',
});DCA Frequency Options
DCA时间间隔选项
typescript
moment.duration(1, 'hour') // Hourly
moment.duration(1, 'day') // Daily
moment.duration(1, 'week') // Weekly
moment.duration(1, 'month') // MonthlySee references/dca-guide.md for pricing strategies and order lifecycle.
typescript
moment.duration(1, 'hour') // 每小时
moment.duration(1, 'day') // 每天
moment.duration(1, 'week') // 每周
moment.duration(1, 'month') // 每月定价策略和订单生命周期请参考 references/dca-guide.md。
Staking
质押
Stake tokens to earn rewards. Supports STRK and BTC variants.
质押代币以赚取奖励,支持STRK和BTC变体。
Stake Tokens
质押代币
typescript
import { executeStake } from '@avnu/avnu-sdk';
const result = await executeStake({
provider: account,
poolAddress: '0xpool...',
amount: BigInt(100e18), // 100 STRK
});
console.log('Staked:', result.transactionHash);typescript
import { executeStake } from '@avnu/avnu-sdk';
const result = await executeStake({
provider: account,
poolAddress: '0xpool...',
amount: BigInt(100e18), // 100 STRK
});
console.log('质押完成:', result.transactionHash);Get Staking Info
获取质押信息
typescript
import { getUserStakingInfo, getAvnuStakingInfo } from '@avnu/avnu-sdk';
// Get pool info
const stakingInfo = await getAvnuStakingInfo();
console.log('Total staked:', stakingInfo.totalStaked);
console.log('APY:', stakingInfo.apy);
// Get user position
const userInfo = await getUserStakingInfo(
TOKENS.STRK,
account.address
);
console.log('Staked:', userInfo.stakedAmount);
console.log('Rewards:', userInfo.pendingRewards);typescript
import { getUserStakingInfo, getAvnuStakingInfo } from '@avnu/avnu-sdk';
// 获取矿池信息
const stakingInfo = await getAvnuStakingInfo();
console.log('总质押量:', stakingInfo.totalStaked);
console.log('年化收益率(APY):', stakingInfo.apy);
// 获取用户持仓
const userInfo = await getUserStakingInfo(
TOKENS.STRK,
account.address
);
console.log('用户质押量:', userInfo.stakedAmount);
console.log('待领取奖励:', userInfo.pendingRewards);Claim Rewards
领取奖励
typescript
import { executeClaimRewards } from '@avnu/avnu-sdk';
// Claim and withdraw
await executeClaimRewards({
provider: account,
poolAddress: '0xpool...',
restake: false,
});
// Claim and restake
await executeClaimRewards({
provider: account,
poolAddress: '0xpool...',
restake: true,
});typescript
import { executeClaimRewards } from '@avnu/avnu-sdk';
// 领取并提取
await executeClaimRewards({
provider: account,
poolAddress: '0xpool...',
restake: false,
});
// 领取并复投
await executeClaimRewards({
provider: account,
poolAddress: '0xpool...',
restake: true,
});Unstake (Two-Step Process)
解除质押(两步流程)
typescript
import { executeInitiateUnstake, executeUnstake } from '@avnu/avnu-sdk';
// Step 1: Initiate unstake (starts cooldown)
await executeInitiateUnstake({
provider: account,
poolAddress: '0xpool...',
amount: BigInt(50e18),
});
// Step 2: After cooldown period (7-21 days), complete withdrawal
await executeUnstake({
provider: account,
poolAddress: '0xpool...',
});See references/staking-guide.md for pool discovery and unbonding periods.
typescript
import { executeInitiateUnstake, executeUnstake } from '@avnu/avnu-sdk';
// 第一步:发起解除质押(开始冷却期)
await executeInitiateUnstake({
provider: account,
poolAddress: '0xpool...',
amount: BigInt(50e18),
});
// 第二步:冷却期结束后(7-21天),完成提取
await executeUnstake({
provider: account,
poolAddress: '0xpool...',
});矿池发现和解绑周期请参考 references/staking-guide.md。
Paymaster (Gasless Transactions)
Paymaster(无Gas交易)
Enable gasless transactions where users pay fees in ERC-20 tokens instead of ETH.
启用无Gas交易,用户可使用ERC-20代币支付手续费,而非ETH。
Setup PaymasterRpc
设置PaymasterRpc
typescript
import { PaymasterRpc } from 'starknet';
const paymaster = new PaymasterRpc({
nodeUrl: 'https://starknet.api.avnu.fi/paymaster/v1',
});typescript
import { PaymasterRpc } from 'starknet';
const paymaster = new PaymasterRpc({
nodeUrl: 'https://starknet.api.avnu.fi/paymaster/v1',
});Gasless Swap (User Pays in Token)
无Gas兑换(用户用代币支付手续费)
typescript
import { PaymasterRpc, type PaymasterDetails } from 'starknet';
import { executeSwap } from '@avnu/avnu-sdk';
const paymaster = new PaymasterRpc({
nodeUrl: 'https://starknet.api.avnu.fi/paymaster/v1',
});
const result = await executeSwap({
provider: account,
quote: quotes[0],
slippage: 0.01,
paymaster: {
active: true,
provider: paymaster,
params: {
feeMode: { mode: 'default', gasToken: TOKENS.USDC },
},
},
});typescript
import { PaymasterRpc, type PaymasterDetails } from 'starknet';
import { executeSwap } from '@avnu/avnu-sdk';
const paymaster = new PaymasterRpc({
nodeUrl: 'https://starknet.api.avnu.fi/paymaster/v1',
});
const result = await executeSwap({
provider: account,
quote: quotes[0],
slippage: 0.01,
paymaster: {
active: true,
provider: paymaster,
params: {
feeMode: { mode: 'default', gasToken: TOKENS.USDC },
},
},
});With Fee Estimation (Recommended)
带手续费估算(推荐)
typescript
import { PaymasterRpc, type PaymasterDetails } from 'starknet';
import { quoteToCalls } from '@avnu/avnu-sdk';
const paymaster = new PaymasterRpc({
nodeUrl: 'https://starknet.api.avnu.fi/paymaster/v1',
});
// Build calls from quote
const { calls } = await quoteToCalls({
quote: quotes[0],
takerAddress: account.address,
slippage: 0.01,
includeApprove: true,
});
// Estimate fees
const feeDetails: PaymasterDetails = {
feeMode: { mode: 'default', gasToken: TOKENS.USDC },
};
const estimation = await account.estimatePaymasterTransactionFee(calls, feeDetails);
// Execute with estimated max fee
const result = await account.executePaymasterTransaction(
calls,
feeDetails,
estimation.suggested_max_fee_in_gas_token
);See references/paymaster-guide.md for supported tokens and best practices.
typescript
import { PaymasterRpc, type PaymasterDetails } from 'starknet';
import { quoteToCalls } from '@avnu/avnu-sdk';
const paymaster = new PaymasterRpc({
nodeUrl: 'https://starknet.api.avnu.fi/paymaster/v1',
});
// 根据报价生成调用
const { calls } = await quoteToCalls({
quote: quotes[0],
takerAddress: account.address,
slippage: 0.01,
includeApprove: true,
});
// 估算手续费
const feeDetails: PaymasterDetails = {
feeMode: { mode: 'default', gasToken: TOKENS.USDC },
};
const estimation = await account.estimatePaymasterTransactionFee(calls, feeDetails);
// 使用估算的最大手续费执行
const result = await account.executePaymasterTransaction(
calls,
feeDetails,
estimation.suggested_max_fee_in_gas_token
);支持的代币和最佳实践请参考 references/paymaster-guide.md。
Gasfree (Sponsored Transactions)
Gasfree(赞助交易)
Enable zero-gas-fee transactions where your dApp pays gas on behalf of users. Requires an API key from portal.avnu.fi.
启用零Gas费交易,由你的dApp代用户支付Gas费。需要从 portal.avnu.fi 获取API密钥。
Setup (Backend/Scripts)
设置(后端/脚本)
typescript
import { PaymasterRpc } from 'starknet';
const paymaster = new PaymasterRpc({
nodeUrl: 'https://starknet.paymaster.avnu.fi',
headers: {
'x-paymaster-api-key': process.env.AVNU_PAYMASTER_API_KEY!,
},
});typescript
import { PaymasterRpc } from 'starknet';
const paymaster = new PaymasterRpc({
nodeUrl: 'https://starknet.paymaster.avnu.fi',
headers: {
'x-paymaster-api-key': process.env.AVNU_PAYMASTER_API_KEY!,
},
});Gasfree Swap
Gasfree兑换
typescript
import { executeSwap } from '@avnu/avnu-sdk';
const result = await executeSwap({
provider: account,
quote: quotes[0],
slippage: 0.01,
paymaster: {
active: true,
provider: paymaster,
params: {
feeMode: { mode: 'sponsored' },
},
},
});
// User paid $0 in gas!typescript
import { executeSwap } from '@avnu/avnu-sdk';
const result = await executeSwap({
provider: account,
quote: quotes[0],
slippage: 0.01,
paymaster: {
active: true,
provider: paymaster,
params: {
feeMode: { mode: 'sponsored' },
},
},
});
// 用户支付的Gas费为0!Frontend Integration (Next.js)
前端集成(Next.js)
The API key must never be exposed client-side. Use a 3-phase pattern:
typescript
// Server Action (API key protected)
'use server';
import { buildPaymasterTransaction, executePaymasterTransaction } from '@avnu/avnu-sdk';
export async function buildSponsoredTx(userAddress: string, calls: Call[]) {
return buildPaymasterTransaction({
takerAddress: userAddress,
paymaster: { provider: getPaymaster(), params: { feeMode: { mode: 'sponsored' } } },
calls,
});
}
// Client-side
const prepared = await buildSponsoredTx(account.address, calls); // 1. Build on server
const signed = await signPaymasterTransaction({ provider: account, typedData: prepared.typed_data }); // 2. Sign on client
const result = await executeSponsoredTx(account.address, signed); // 3. Execute on serverSee references/gasfree-frontend.md for complete Next.js integration with hooks and error handling. See scripts/gasfree-swap.ts for a runnable backend example.
API密钥绝不能暴露在客户端,需使用三步流程:
typescript
// 服务器动作(API密钥受保护)
'use server';
import { buildPaymasterTransaction, executePaymasterTransaction } from '@avnu/avnu-sdk';
export async function buildSponsoredTx(userAddress: string, calls: Call[]) {
return buildPaymasterTransaction({
takerAddress: userAddress,
paymaster: { provider: getPaymaster(), params: { feeMode: { mode: 'sponsored' } } },
calls,
});
}
// 客户端
const prepared = await buildSponsoredTx(account.address, calls); // 1. 在服务器端生成
const signed = await signPaymasterTransaction({ provider: account, typedData: prepared.typed_data }); // 2. 在客户端签名
const result = await executeSponsoredTx(account.address, signed); // 3. 在服务器端执行完整的Next.js集成(包含钩子和错误处理)请参考 references/gasfree-frontend.md。 可运行的后端示例请参考 scripts/gasfree-swap.ts。
Gasless vs Gasfree
无Gas vs Gasfree
| Mode | Who Pays | API Key | Best For |
|---|---|---|---|
| Gasless | User (in token) | No | Users without ETH |
| Gasfree | dApp | Yes | Zero-friction UX |
| 模式 | 支付方 | 是否需要API密钥 | 适用场景 |
|---|---|---|---|
| 无Gas | 用户(用代币支付) | 否 | 没有ETH的用户 |
| Gasfree | dApp | 是 | 零摩擦用户体验 |
Tokens & Prices
代币与价格
Fetch token lists and real-time market data.
获取代币列表和实时市场数据。
Fetch Tokens
获取代币
typescript
import { fetchTokens, fetchVerifiedTokenBySymbol } from '@avnu/avnu-sdk';
// Get paginated token list
const page = await fetchTokens({
page: 0,
size: 50,
tags: ['Verified'],
});
page.content.forEach(token => {
console.log(token.symbol, token.address, token.decimals);
});
// Get verified token by symbol
const eth = await fetchVerifiedTokenBySymbol('ETH');
const strk = await fetchVerifiedTokenBySymbol('STRK');typescript
import { fetchTokens, fetchVerifiedTokenBySymbol } from '@avnu/avnu-sdk';
// 获取分页代币列表
const page = await fetchTokens({
page: 0,
size: 50,
tags: ['Verified'],
});
page.content.forEach(token => {
console.log(token.symbol, token.address, token.decimals);
});
// 通过符号获取已验证代币
const eth = await fetchVerifiedTokenBySymbol('ETH');
const strk = await fetchVerifiedTokenBySymbol('STRK');Get Token Prices
获取代币价格
typescript
import { getPrices } from '@avnu/avnu-sdk';
const prices = await getPrices([
TOKENS.ETH,
TOKENS.STRK,
TOKENS.USDC,
]);
prices.forEach(p => {
console.log('Address:', p.address);
console.log('Global USD:', p.globalMarket?.usd);
console.log('Starknet USD:', p.starknetMarket?.usd);
});Token tags: , , , , . See references/tokens-prices.md for OHLCV data.
VerifiedCommunityUnruggableAVNUUnknowntypescript
import { getPrices } from '@avnu/avnu-sdk';
const prices = await getPrices([
TOKENS.ETH,
TOKENS.STRK,
TOKENS.USDC,
]);
prices.forEach(p => {
console.log('代币地址:', p.address);
console.log('全球市场价格(美元):', p.globalMarket?.usd);
console.log('Starknet市场价格(美元):', p.starknetMarket?.usd);
});代币标签:、、、、。OHLCV数据请参考 references/tokens-prices.md。
VerifiedCommunityUnruggableAVNUUnknownError Quick Reference
错误速查
| Error | Cause | Solution |
|---|---|---|
| No route found | Reduce amount or try different pair |
| Price moved during execution | Increase slippage or refresh quote |
| Quote too old (>30s) | Fetch new quote before executing |
| Transaction not eligible | Check token/amount eligibility |
| Not enough tokens | Validate balance before execute |
See references/error-handling.md for complete error taxonomy.
| 错误 | 原因 | 解决方案 |
|---|---|---|
| 未找到路由 | 减少兑换数量或尝试其他交易对 |
| 执行期间价格波动 | 提高滑点设置或刷新报价 |
| 报价过期(超过30秒) | 执行前重新获取报价 |
| 交易不符合条件 | 检查代币/数量是否符合要求 |
| 代币余额不足 | 执行前验证余额 |
完整的错误分类请参考 references/error-handling.md。
Configuration
配置
Environment Variables
环境变量
bash
undefinedbash
undefinedRequired for direct account
直接账户必填
STARKNET_ACCOUNT_ADDRESS=0x...
STARKNET_PRIVATE_KEY=0x... # NEVER commit!
STARKNET_ACCOUNT_ADDRESS=0x...
STARKNET_PRIVATE_KEY=0x... # 绝不要提交到代码仓库!
Optional
可选
STARKNET_RPC_URL=https://rpc.starknet.lava.build
undefinedSTARKNET_RPC_URL=https://rpc.starknet.lava.build
undefinedSDK Options
SDK选项
typescript
import { AvnuOptions } from '@avnu/avnu-sdk';
const options: AvnuOptions = {
baseUrl: 'https://starknet.api.avnu.fi', // Default
impulseBaseUrl: 'https://starknet.impulse.avnu.fi', // DCA API
abortSignal: controller.signal, // Request cancellation
};
// Pass to any SDK call
const quotes = await getQuotes(request, options);typescript
import { AvnuOptions } from '@avnu/avnu-sdk';
const options: AvnuOptions = {
baseUrl: 'https://starknet.api.avnu.fi', // 默认值
impulseBaseUrl: 'https://starknet.impulse.avnu.fi', // DCA API
abortSignal: controller.signal, // 请求取消
};
// 传递给任意SDK调用
const quotes = await getQuotes(request, options);Networks
网络
| Network | Base URL |
|---|---|
| Mainnet | |
| Sepolia | |
See references/configuration.md for complete setup guide.
| 网络 | 基础URL |
|---|---|
| 主网 | |
| Sepolia测试网 | |
完整设置指南请参考 references/configuration.md。
References & Examples
参考资料与示例
Guides: swap-guide | dca-guide | staking-guide | paymaster-guide | gasfree-frontend | tokens-prices | error-handling | configuration
Scripts: swap-example.ts | dca-example.ts | staking-example.ts | gasless-swap.ts | gasfree-swap.ts
指南: swap-guide | dca-guide | staking-guide | paymaster-guide | gasfree-frontend | tokens-prices | error-handling | configuration
脚本: swap-example.ts | dca-example.ts | staking-example.ts | gasless-swap.ts | gasfree-swap.ts