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
// Raydium / Meteora
pub user: Signer<'info>, // 用户签名

特点

  • 用户持有资金,直接授权
  • 合约只是”转发意图”
  • 即时完成,无需托管

适用场景

  • 前端调用的手动交换
  • 用户在线的即时交易

6.2 程序托管模型

1
2
3
// Jupiter
#[account(seeds = [b"vault"], bump)]
pub vault: SystemAccount<'info>, // vault PDA 签名

特点

  • 程序持有资金,自主执行
  • 用户无需在线签名
  • 支持复杂自动化逻辑

适用场景

  • 定时策略执行
  • 金库资产再平衡
  • 后台自动化任务

6.3 为什么设计不同

场景 需要用户签名? 适合模型
用户手动交换 用户直控
定时自动交换 程序托管
策略触发交换 程序托管
金库管理 程序托管

7. Token 标准支持

标准 ETF 管理 DEX 集成
SPL Token
Token-2022 ✅ (Jupiter)

ETF mint/burn 通过检测 Mint 账户的 owner 自动选择 Token Program。


8. 文档导航

文档 内容 适合阅读场景
iswap_etf.md ETF + 用户指令详解 需要创建/管理 ETF
iswap_swap.md DEX 交换指令详解 需要实现交换功能

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
// ETF Token
SEED_PREFIX = "etf_token_v3"
TOKEN_DECIMALS = 9

// User Account
SEED_PREFIX = "userAccount_v2"

// Jupiter Vault
VAULT_SEED = b"vault"
JUPITER_PROGRAM_ID = "JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4"

9.3 错误码

错误 说明
InvalidInviterCode 无效的邀请码
CalculationOverflow 计算溢出
InvalidInput 无效输入
InvalidAmount 无效数量
InvalidOwner 无效所有者
InvalidAccounts 缺少必要账户
InsufficientBalance 余额不足