iSwap —— 综述
本文档是 iSwap 协议的综述,帮助开发者快速了解项目全貌。
1. 概述
1.1 什么是 iSwap
iSwap 是 Solana 上的 ETF Token 资产管理协议,允许用户:
- 创建代表多资产组合的 ETF Token
- 铸造/赎回 ETF Token(类似 ETF 的申购/赎回)
- 通过集成的 DEX 进行代币交换
1.2 核心价值
1 2 3 4 5 6 7
| 传统方式:用户需要分别购买 SOL、USDC、RAY... │ ▼ iSwap ETF:一键持有多资产组合 │ ▼ 收益:简化操作、分散风险、一键再平衡
|
1.3 程序 ID
1
| dXgZyuguvD2m5G5385XkdokZBryUoSE6LbNJeWiFiN5
|
2. 核心概念
2.1 ETF Token
代表一篮子资产的代币,每个 ETF 定义了:
- 资产列表:包含哪些代币
- 权重:每种代币占比(总和 = 100%)
1 2 3 4 5 6 7 8
| ┌─────────────────────────────────────┐ │ ETF Token │ │ "Solana DeFi Index" │ ├─────────────────────────────────────┤ │ SOL ████████████████ 60% │ │ USDC ██████████ 30% │ │ RAY ████ 10% │ └─────────────────────────────────────┘
|
2.2 铸造(Mint)与赎回(Burn)
1 2 3 4 5 6 7 8 9 10 11
| 铸造 ETF Token ┌──────────┐ ┌──────────┐ │ 用户 │ ──存入底层资产──▶ │ ETF PDA │ │ │ ◀──获得 ETF Token── │ │ └──────────┘ └──────────┘
赎回 ETF Token ┌──────────┐ ┌──────────┐ │ 用户 │ ──销毁 ETF Token──▶ │ ETF PDA │ │ │ ◀──获得底层资产── │ │ └──────────┘ └──────────┘
|
计算公式:
1 2 3 4 5
| 铸造 10 个 ETF Token(权重:SOL 60%, USDC 40%) → 需存入:6 SOL + 4 USDC
赎回 10 个 ETF Token → 获得:6 SOL + 4 USDC
|
2.3 用户系统
支持用户档案和邀请链追踪:
1 2 3 4 5
| 用户 A(邀请人) │ └──邀请──▶ 用户 B │ └──邀请──▶ 用户 C
|
2.4 两种交换模型
| 模型 |
签名者 |
适用场景 |
| 用户直控 |
用户 |
即时交换、手动操作 |
| 程序托管 |
vault PDA |
自动化策略、定时任务 |
1 2 3 4 5 6 7 8 9 10 11
| 用户直控模型(Raydium / Meteora) ┌──────────┐ ┌──────────┐ │ 用户 │ ──用户签名──▶ │ DEX │ │ (资金) │ ◀──交换结果── │ │ └──────────┘ └──────────┘
程序托管模型(Jupiter) ┌──────────┐ ┌──────────┐ │ Vault │ ──PDA 签名──▶ │ DEX │ │ (资金) │ ◀──交换结果── │ │ └──────────┘ └──────────┘
|
3. 模块架构
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| ┌─────────────────────────────────────────────────────────────────┐ │ iSwap │ ├───────────────────┬─────────────────┬───────────────────────────┤ │ ETF 管理 │ 用户系统 │ DEX 集成 │ │ │ │ │ │ • etf_create │ • initialize │ • ray_swap_in │ │ 创建 ETF │ _user │ (Raydium) │ │ │ 创建用户档案 │ │ │ • etf_mint │ │ • meteora_swap_in │ │ 铸造 ETF │ │ (Meteora) │ │ │ │ │ │ • etf_burn │ │ • jup_swap_in │ │ 赎回 ETF │ │ (Jupiter) │ └───────────────────┴─────────────────┴───────────────────────────┘
|
| 模块 |
职责 |
调用者 |
| ETF 管理 |
创建、铸造、赎回 ETF Token |
任何用户 |
| 用户系统 |
用户档案、邀请链追踪 |
任何用户 |
| DEX 集成 |
代币交换(三种 DEX) |
任何用户 / 程序 |
4. 账户体系
4.1 账户关系图
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| ┌─────────────────────────────────────────────────────────────────┐ │ EtfToken │ │ (ETF 配置:资产列表、权重、创建者) │ ├─────────────────────────────────────────────────────────────────┤ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ │ │ ETF Mint │ │ Asset 0 ATA │ │ Asset 1 ATA │ ... │ │ │ (ETF 代币) │ │ (底层资产 0) │ │ (底层资产 1) │ │ │ └──────────────┘ └──────────────┘ └──────────────┘ │ └─────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────┐ │ UserAccount │ │ (用户档案:昵称、头像、邀请链) │ └─────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────┐ │ Vault │ │ (程序托管金库:用于 Jupiter 自动化交换) │ ├─────────────────────────────────────────────────────────────────┤ │ ┌──────────────┐ ┌──────────────┐ │ │ │ Input ATA │ │ Output ATA │ │ │ │ (输入代币) │ │ (输出代币) │ │ │ └──────────────┘ └──────────────┘ │ └─────────────────────────────────────────────────────────────────┘
|
4.2 核心账户说明
| 账户 |
用途 |
所属模块 |
| EtfToken |
存储 ETF 配置(资产、权重) |
ETF 管理 |
| ETF Mint |
ETF Token 的 Mint 账户 |
ETF 管理 |
| UserAccount |
用户档案(昵称、邀请链) |
用户系统 |
| Vault |
程序托管金库 |
DEX 集成 (Jupiter) |
4.3 PDA 种子总表
| 账户 |
Seeds |
说明 |
| EtfToken (info) |
["etf_token_v3", etf_token_mint] |
ETF 配置 PDA |
| ETF Mint |
["etf_token_v3", symbol] |
根据符号生成 |
| UserAccount |
["userAccount_v2", user_pubkey] |
用户档案 PDA |
| Vault |
["vault"] |
Jupiter 交换金库 |
5. 典型调用流程
5.1 创建 ETF
1 2 3 4 5 6 7 8 9
| 创建者 │ └─1─▶ etf_create │ ├── 定义资产:[SOL, USDC, RAY] ├── 定义权重:[60%, 30%, 10%] ├── 设置名称、符号、描述 │ └── 创建 ETF Mint + EtfToken PDA + Metadata
|
5.2 用户注册与铸造 ETF
1 2 3 4 5 6 7 8 9 10 11 12
| 用户 │ ├─1─▶ initialize_user 创建用户档案(可选,如需邀请链) │ ├─2─▶ ray_swap_in / 准备底层资产(如手里只有 SOL) │ meteora_swap_in │ └─3─▶ etf_mint 存入底层资产,获得 ETF Token │ ├── 存入:6 SOL + 3 USDC + 1 RAY │ └── 获得:10 ETF Token
|
5.3 赎回 ETF
1 2 3 4 5 6 7
| 用户 │ └───▶ etf_burn 销毁 ETF Token,赎回底层资产 │ ├── 销毁:10 ETF Token │ └── 获得:6 SOL + 3 USDC + 1 RAY
|
5.4 DEX 交换
1 2 3 4 5 6 7 8 9
| 用户直控交换(即时) │ ├───▶ ray_swap_in 通过 Raydium 交换 │ └───▶ meteora_swap_in 通过 Meteora 交换
程序托管交换(自动化) │ └───▶ jup_swap_in 通过 Jupiter 交换(vault PDA 签名)
|
6. 两种交换模型详解
6.1 用户直控模型
1 2
| pub user: Signer<'info>,
|
特点:
- 用户持有资金,直接授权
- 合约只是”转发意图”
- 即时完成,无需托管
适用场景:
6.2 程序托管模型
1 2 3
| #[account(seeds = [b"vault"], bump)] pub vault: SystemAccount<'info>,
|
特点:
- 程序持有资金,自主执行
- 用户无需在线签名
- 支持复杂自动化逻辑
适用场景:
6.3 为什么设计不同
| 场景 |
需要用户签名? |
适合模型 |
| 用户手动交换 |
是 |
用户直控 |
| 定时自动交换 |
否 |
程序托管 |
| 策略触发交换 |
否 |
程序托管 |
| 金库管理 |
否 |
程序托管 |
7. Token 标准支持
| 标准 |
ETF 管理 |
DEX 集成 |
| SPL Token |
✅ |
✅ |
| Token-2022 |
✅ |
✅ (Jupiter) |
ETF mint/burn 通过检测 Mint 账户的 owner 自动选择 Token Program。
8. 文档导航
9. 快速参考
9.1 指令一览
| 指令 |
模块 |
功能 |
| etf_create |
ETF 管理 |
创建 ETF Token |
| etf_mint |
ETF 管理 |
铸造 ETF Token |
| etf_burn |
ETF 管理 |
赎回 ETF Token |
| initialize_user |
用户系统 |
创建用户档案 |
| ray_swap_in |
DEX 集成 |
Raydium 交换 |
| meteora_swap_in |
DEX 集成 |
Meteora 交换 |
| jup_swap_in |
DEX 集成 |
Jupiter 交换 |
9.2 常量定义
1 2 3 4 5 6 7 8 9 10
| SEED_PREFIX = "etf_token_v3" TOKEN_DECIMALS = 9
SEED_PREFIX = "userAccount_v2"
VAULT_SEED = b"vault" JUPITER_PROGRAM_ID = "JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4"
|
9.3 错误码
| 错误 |
说明 |
| InvalidInviterCode |
无效的邀请码 |
| CalculationOverflow |
计算溢出 |
| InvalidInput |
无效输入 |
| InvalidAmount |
无效数量 |
| InvalidOwner |
无效所有者 |
| InvalidAccounts |
缺少必要账户 |
| InsufficientBalance |
余额不足 |