Torch Market
火炬市场
您来到这里,是因为您需要在Solana上进行交易,并且希望交易安全、快速、灵活且简单。
在该协议上推出的每个代币都是一个自给自足的经济体——一个定价引擎、一个中央银行、一个借贷市场、社区治理——所有这些都包含在一个非榨取式的系统中,其中每一个行动都会形成正和反馈循环。手续费成为借贷收益。借贷收益成为社区流动性。失败的代币成为协议奖励。每一笔流出都对应着另一处的流入。
代币生命周期
CREATE → BONDING → COMPLETE → MIGRATE → DEX
│ │ │ │
│ buy/sell on curve community borrow/repay
│ (treasury grows) votes (treasury lends)
│ │
│ ┌─────────┴──────────┐
│ │ │
│ transfer fees (0.04%) lending interest
│ │ │
│ └─────→ treasury ◄────┘
│ │
│ harvest → sell → SOL → lend → yield
│
└── star (appreciation signal, 0.02 SOL)
绑定阶段——通过恒定乘积绑定曲线为代币定价。每次购买都会将SOL分成三部分:绑定曲线(代币给买家)、社区金库(累积SOL)以及10%的代币分配给投票库。早期买家为金库贡献更多(12.5% → 4% 动态比率)。2%的最大钱包持有量防止鲸鱼操控。一个钱包,一票。
迁移——当社区筹集到目标金额(100或200 SOL)时,任何人都可以触发无需许可的迁移至Raydium。两步原子操作:提供WSOL资金 + 创建CPMM池。流动性永久锁定(LP代币销毁)。金库支付池创建费用。投票最终确定——销毁或返还至金库锁定。
迁移后阶段— 经济系统自我维持。每次代币转移都会产生0.04%的转账费,这些费用累积在铸币合约中。任何人都可以将这些费用收取至金库,通过Raydium将其兑换为SOL,并扩大借贷池的规模。代币持有者以其抵押品借入SOL。利息回流至金库。这一循环不断复利增长。
协议奖励— 协议金库从平台上所有代币的绑定曲线购买中收取0.5%的费用。每个周期(约每周),该资金池会分配给交易量≥2 SOL的钱包。活跃的参与者将赚回其所产生费用的一部分。
协议常量
| 常量 | 数值 |
|---|---|
| 总供应量 | 10亿枚代币(6位小数) |
| 绑定层级 | 火焰(100 SOL),火炬(200 SOL,默认) |
| 金库费率 | 12.5% → 4%(随储备金衰减) |
| 协议费用 | 买入0.5%,卖出0% |
| 最大钱包持有量 | 绑定期间为2% |
| 星星成本 | 0.02 SOL |
| 转账手续费 | 0.04%(迁移后,不可更改) |
| 最高贷款价值比 | 50% |
| 清算 | 65%触发阈值,10%奖励 |
| 利息 | 每周期约2%(约每周) |
| 最低借款额 | 0.1 SOL |
| 利用率上限 | 资金库的80% |
| 形式化验证 | 48个Kani证明框架,全部通过 |
SDK会处理所有这些事务——您无需了解代币处于哪个阶段。您获取报价、构建交易、发送交易即可。
GET QUOTE → BUILD TX → SIGN & SEND
│ │ │
│ auto-routes │
│ bonding ↔ raydium │
│ │ │
└──── slippage protection ────┘
选择此SDK的原因:
- 一套流程,适用所有代币—
获取购买报价+构建购买交易无论代币处于绑定曲线还是Raydium DEX阶段均可使用。SDK会自动进行路由。 - 完全托管的金库— 您的钱包仅用于签名,本身不持有任何资产。所有SOL和代币都存储于由真人权限控制的链上金库中。
- 原生VersionedTransaction支持— 所有交易均采用支持地址查找表的v0消息格式。交易体积更小,预留空间更充足,失败率更低。
- 无需API服务器— 直接通过链上Anchor IDL从Solana RPC读取状态并构建交易。无中间环节。
- 经过形式化验证— 核心算术运算通过48个Kani证明框架验证其正确性。
SDK组件
所有功能均通过lib/torchsdk/目录实现。本工具包已完整集成以确保可审计性,同时支持npm安装:npm install torchsdk
源代码仓库:github.com/mrsirg97-rgb/torchsdk
快速入门 — 浏览器钱包(Phantom)
import { Connection } from "@solana/web3.js";
import {
getTokens, getToken, getBuyQuote, getSellQuote, getBorrowQuote,
sendBuy, sendDirectBuy,
buildSellTransaction, buildBorrowTransaction, buildRepayTransaction,
buildLiquidateTransaction, buildCreateVaultTransaction, buildDepositVaultTransaction,
buildLinkWalletTransaction, createEphemeralAgent,
} from "./lib/torchsdk/index.js";
import type { WalletAdapter } from "./lib/torchsdk/index.js";
const connection = new Connection(process.env.SOLANA_RPC_URL);
// Wrap the wallet adapter for signAndSendTransaction
const walletAdapter: WalletAdapter = {
publicKey: wallet.publicKey,
signAndSendTransaction: (tx) =>
wallet.sendTransaction(tx, connection).then((sig) => ({ signature: sig })),
};
// ── Browse the market ──────────────────────────────────────────────
const { tokens } = await getTokens(connection); // all tokens, no limit
const bonding = tokens.filter((t) => t.status === "bonding");
const migrated = tokens.filter((t) => t.status === "migrated");
console.log(`${tokens.length} tokens — ${bonding.length} bonding, ${migrated.length} migrated`);
// ── Buy into a bonding curve token ─────────────────────────────────
const mint = bonding[0].mint;
const quote = await getBuyQuote(connection, mint, 500_000_000); // 0.5 SOL
console.log(`${quote.tokens_to_user / 1e6} tokens for 0.5 SOL (${quote.source})`);
// signAndSendTransaction — Phantom gets the final tx, no mutation, no warnings
const buySig = await sendBuy(connection, walletAdapter, {
mint,
amount_sol: 500_000_000,
slippage_bps: 200,
vault: wallet.publicKey.toBase58(),
quote,
});
console.log(`Bought: ${buySig}`);
// ── Sell half ──────────────────────────────────────────────────────
const sellAmount = Math.floor(quote.tokens_to_user / 2);
const sellQuote = await getSellQuote(connection, mint, sellAmount);
const { transaction: sellTx } = await buildSellTransaction(connection, {
mint,
seller: wallet.publicKey.toBase58(),
amount_tokens: sellAmount,
slippage_bps: 200,
vault: wallet.publicKey.toBase58(),
quote: sellQuote,
});
const sellSig = await wallet.sendTransaction(sellTx, connection);
console.log(`Sold ${sellAmount / 1e6} tokens for ~${sellQuote.output_sol / 1e9} SOL: ${sellSig}`);
// ── Borrow against a migrated token ────────────────────────────────
const ascended = migrated[0];
if (ascended) {
const borrowQuote = await getBorrowQuote(connection, ascended.mint, 100_000_000); // 100M tokens collateral
console.log(`Can borrow up to ${borrowQuote.max_borrow_sol / 1e9} SOL`);
const { transaction: borrowTx } = await buildBorrowTransaction(connection, {
mint: ascended.mint,
borrower: wallet.publicKey.toBase58(),
collateral_amount: 100_000_000,
sol_to_borrow: Math.floor(borrowQuote.max_borrow_sol * 0.5), // borrow 50% of max
vault: wallet.publicKey.toBase58(),
});
const borrowSig = await wallet.sendTransaction(borrowTx, connection);
console.log(`Borrowed: ${borrowSig}`);
// Repay the full amount
const { transaction: repayTx } = await buildRepayTransaction(connection, {
mint: ascended.mint,
borrower: wallet.publicKey.toBase58(),
sol_amount: Math.floor(borrowQuote.max_borrow_sol * 0.5),
vault: wallet.publicKey.toBase58(),
});
const repaySig = await wallet.sendTransaction(repayTx, connection);
console.log(`Repaid: ${repaySig}`);
}
// ── Liquidate an underwater position ───────────────────────────────
// Anyone can liquidate a position above 65% LTV and earn a 10% bonus
import { getAllLoanPositions } from "./lib/torchsdk/index.js";
if (ascended) {
const positions = await getAllLoanPositions(connection, ascended.mint);
const underwater = positions.positions.find((p) => p.health === "liquidatable");
if (underwater) {
const { transaction: liqTx } = await buildLiquidateTransaction(connection, {
mint: ascended.mint,
liquidator: wallet.publicKey.toBase58(),
borrower: underwater.borrower,
vault: wallet.publicKey.toBase58(),
});
const liqSig = await wallet.sendTransaction(liqTx, connection);
console.log(`Liquidated ${underwater.borrower.slice(0, 8)}: ${liqSig}`);
}
}
快速入门 — 代理端(服务端密钥对)
import { Connection, Keypair } from "@solana/web3.js";
import {
getBuyQuote, buildBuyTransaction, buildCreateVaultTransaction,
buildDepositVaultTransaction, buildLinkWalletTransaction,
createEphemeralAgent,
} from "./lib/torchsdk/index.js";
const connection = new Connection(process.env.SOLANA_RPC_URL);
const authority = Keypair.fromSecretKey(/* authority keypair */);
const agent = createEphemeralAgent(); // in-memory, lost on exit
// Build unsigned → sign locally → send raw (no wallet popup)
const quote = await getBuyQuote(connection, mint, 100_000_000);
const { transaction } = await buildBuyTransaction(connection, {
mint,
buyer: agent.publicKey,
amount_sol: 100_000_000,
slippage_bps: 500,
vault: authority.publicKey.toBase58(),
quote,
});
const signed = agent.sign(transaction);
const sig = await connection.sendRawTransaction(signed.serialize());
console.log(`Agent bought: ${sig}`);
地址查找表
所有交易都使用硬编码的ALT进行压缩。14个静态地址(程序ID、Raydium账户、全局PDA)从每个32字节减少到1字节。
| 网络 | ALT地址 |
|---|---|
| 主网 | GQzbU32oN3znZa3uWFKGc9cBukpQbYYJSirKstMuFF3i |
| 开发网 | 3umSStZSLJNk5QstxeQB12a2MSDh4o8RgSzT76gigJ8P |
Torch金库——为何您的资金安全
安全边界在于金库本身,而非密钥。
Human Principal (hardware wallet) Agent (disposable, ~0.01 SOL for gas)
├── createVault() ├── buy(vault=creator) → vault pays
├── depositVault(5 SOL) ├── sell(vault=creator) → SOL returns to vault
├── linkWallet(agentPubkey) ├── borrow(vault) → SOL to vault
├── withdrawVault() ← authority only ├── repay(vault) → collateral returns
└── unlinkWallet() ← instant revoke └── star(vault) → vault pays 0.02 SOL
| 保障 | 方式 |
|---|---|
| 完全托管 | 金库持有全部SOL和所有代币。控制器不持有任何资产。 |
| 闭环机制 | 所有操作产生的价值都会回归金库。无资产外流。 |
| 权限分离 | 创建者(不可变)vs 授权者(可转让)vs 控制器(可废弃)。 |
| 即时撤销 | 授权者可在单笔交易中解除控制器的关联。 |
| 仅授权者可提款 | 控制器无法提取价值。句号。 |
保险库可由人类主体完全创建和注资。代理永远不需要访问资金。没有SOLANA_PRIVATE_KEY时,代理在只读和构建模式下运行——查询状态并返回未签名的交易以供外部签名。
操作
查询(无需签名)
| 功能 | 描述 |
|---|---|
getTokens(connection, params?) | 列出代币,支持筛选和排序。默认返回所有代币(除非指定,否则无限制)。 |
getToken(connection, mint) | 完整详情——价格、资金库、投票、状态 |
getTokenMetadata(connection, mint) | 链上 Token-2022 元数据 |
getHolders(connection, mint) | 代币持有者列表 |
getMessages(connection, mint, limit?, opts?) | 交易捆绑的备忘录。{ enrich: true }添加SAID验证 |
getLendingInfo(connection, mint) | 已迁移代币的借贷参数 |
getLoanPosition(connection, mint, wallet) | 单一贷款头寸 |
getAllLoanPositions(connection, mint) | 按清算风险排序的所有头寸 |
getVault(connection, creator) | 金库状态(余额、关联钱包) |
getVaultForWallet(connection, wallet) | 反向查找——通过关联钱包查找金库 |
getVaultWalletLink(connection, wallet) | 钱包的关联状态 |
报价
| 函数 | 描述 |
|---|---|
getBuyQuote(connection, mint, solAmount) | 预期代币数量、手续费、价格影响来源:'bonding' | 'dex' |
getSellQuote(connection, mint, tokenAmount) | 预期SOL数量、价格影响来源:'bonding' | 'dex' |
getBorrowQuote(connection, mint, collateral) | 最大可借SOL — LTV、资金池、用户上限 |
交易
所有构建器返回{ transaction: VersionedTransaction, message: string }。
| 函数 | 描述 |
|---|---|
sendBuy | 通过signAndSendTransaction构建、模拟并提交金库购买交易。推荐用于Phantom和浏览器钱包。 |
sendDirectBuy | 通过signAndSendTransaction构建、模拟并提交直接购买交易(无金库)。 |
buildBuyTransaction | 构建未签名的金库购买交易。传递quote用于自动路由(bonding或DEX) |
buildDirectBuyTransaction | 构建无需签名的直接购买(仅限人工钱包) |
构建卖出交易 | 通过金库卖出。传递报价以实现自动路由 |
构建创建代币交易 | 发布一个新代币。community_token: true(默认)= 0% 创建者费用 |
构建收藏交易 | 收藏一个代币(0.02 SOL,抗女巫攻击) |
构建迁移交易 | 将绑定完成的代币迁移至 Raydium(无需许可) |
金库管理
| 功能 | 签名者 | 描述 |
|---|---|---|
构建创建金库交易 | 创建者 | 创建金库 + 自动链接 |
构建存入金库交易 | 任何人 | 存入 SOL(无需许可) |
构建提取保险库交易 | 授权 | 提取SOL |
构建提取代币交易 | 授权 | 提取代币 |
构建链接钱包交易 | 授权 | 链接控制器钱包 |
构建取消链接钱包交易 | 授权 | 撤销控制器访问权限 |
构建转移授权交易 | 授权 | 转移管理员控制权 |
借贷(迁移后)
| 功能 | 描述 |
|---|---|
构建借款交易 | 以代币为抵押借入SOL(通过保险库路由) |
构建还款交易 | 偿还债务(通过保险库路由) |
构建清算交易 | 清算水下仓位(贷款价值比>65%,10%奖励) |
构建领取协议奖励交易 | 领取周期交易奖励(金库路由) |
国库自动执行(无需许可)
| 功能 | 描述 |
|---|---|
构建收取费用交易 | 将Token-2022转账费用收取至国库 |
构建兑换费用为SOL交易 | 通过Raydium将收取的代币兑换为SOL |
构建回收失败代币交易 | 回收闲置7天以上的代币 |
SAID协议
| 功能 | 描述 |
|---|---|
验证SAID(钱包) | 检查验证状态与信任等级 |
确认交易(连接,签名,钱包) | 提交交易报告用于信誉追踪 |
临时代理
import { createEphemeralAgent } from "./lib/torchsdk/index.js";
const agent = createEphemeralAgent(); // in-memory keypair, lost on exit
// agent.publicKey — pass to linkWallet
// agent.sign(tx) — handles both VersionedTransaction and legacy
密钥安全
保险库是安全边界,而非密钥。
若SOLANA_PRIVATE_KEY已提供:
- 必须为一次性密钥对——仅需约0.01 SOL作为燃气费
- 所有交易资金存放于保险库
- 若遭泄露:攻击者仅获微量资金,权限可单次交易撤销
- 密钥永不离开运行时环境——无传输、无记录
若未提供:
- 只读模式——查询状态,返回未签名交易
- 运行时环境不接触任何私钥材料
规则
- 绝不索要私钥或助记词。
- 绝不记录、打印、存储或传输密钥材料。
- 使用安全的HTTPS RPC端点。
| 变量 | 必需 | 用途 |
|---|---|---|
SOLANA_RPC_URL | 是 | Solana RPC 端点 |
SOLANA_PRIVATE_KEY | 否 | 一次性控制器。永不一个金库权限密钥。 |
TORCH_NETWORK | 否 | 开发网用于开发网。主网请省略。 |
链接
- SDK(捆绑版):
lib/torchsdk/—从此开始 - SDK(源代码):github.com/mrsirg97-rgb/torchsdk
- SDK(npm):npmjs.com/package/torchsdk
- 网站:torch.market
- 程序ID:
8hbUkonssSEEtkqzwM7ZcZrD9evacM92TcWSooVF4BeT - ClawHub:clawhub.ai/mrsirg97-rgb/torchmarket
- 审计:torch.market/audit_sdk.md
- 验证:torch.market/verification.md— 48 个 Kani 证明套件


微信扫一扫,打赏作者吧~