Torch Liquidation Bot
清算机器人
你来到这里,是因为你想在Torch市场上运行一个清算守护程序——并且希望安全地进行。
Torch上每个已迁移的代币都有一个内置的借贷市场。持有者可以锁定代币作为抵押品,并从社区金库借出SOL(最高贷款价值比为50%,周利率为2%)。当一笔贷款的贷款价值比超过65%时,它就变得可被清算。任何人都可以清算它,并获得抵押品价值的10%作为奖励。

这就是这个机器人的用武之地。
它使用SDK的批量贷款扫描器(getAllLoanPositions)扫描每个已迁移代币的借贷市场——每个代币通过一次RPC调用返回所有按健康度预先排序的活跃仓位。当它发现一个资不抵债的仓位时,它会通过你的金库进行清算。抵押的代币会进入你的金库关联代币账户(ATA)。清算所需的SOL成本从你的金库支出。签署交易的代理钱包本身不持有任何资产。
这不是一个只读扫描器。这是一个功能完整的守护程序,它能生成自己的密钥对,验证金库链接,并在一个持续循环中自主执行清算交易。
工作原理
┌──────────────────────────────────────────────────────────┐
│ LIQUIDATION LOOP │
│ │
│ 1. Discover migrated tokens (getTokens) │
│ 2. For each token, scan all loans (getAllLoanPositions) │
│ — single RPC call, returns positions sorted by health │
│ — liquidatable → at_risk → healthy │
│ 3. Skip tokens with no active loans │
│ 4. For each liquidatable position: │
│ → buildLiquidateTransaction(vault=creator) │
│ → sign with agent keypair │
│ → submit and confirm │
│ → break when health != 'liquidatable' (pre-sorted) │
│ 5. Sleep SCAN_INTERVAL_MS, repeat │
│ │
│ All SOL comes from vault. All collateral goes to vault. │
│ Agent wallet holds nothing. Vault is the boundary. │
└──────────────────────────────────────────────────────────┘
代理密钥对
机器人会生成一个全新的密钥对在每次启动时于进程中生成。无需私钥文件。无需环境变量(除非您想自行提供)。该密钥对为一次性使用——它仅用于签署交易,不存储任何有价值资产。
首次运行时,机器人会检查此密钥对是否已与您的金库关联。若未关联,它将打印出您需要用于关联的精确SDK调用指令:
--- ACTION REQUIRED ---
agent wallet is NOT linked to the vault.
link it by running (from your authority wallet):
buildLinkWalletTransaction(connection, {
authority: "<your-authority-pubkey>",
vault_creator: "<your-vault-creator>",
wallet_to_link: "<agent-pubkey>"
})
then restart the bot.
-----------------------
请通过您的授权钱包(硬件钱包、多签钱包等您使用的任何方式)进行关联。代理程序永远不需要授权方的密钥,授权方也永远不需要代理程序的密钥。它们共享的是金库,而非密钥。
金库
此金库与完整Torch市场协议中的Torch金库相同。它持有所有资产——包括SOL和代币。代理程序仅是临时控制器。
当机器人清算某个头寸时:
- SOL成本来自金库(用于支付清算以覆盖借款人债务)
- 抵押代币转入金库的关联代币账户(ATA)
- 10%奖励意味着收到的抵押物价值比支出的SOL高出10%
委托人始终保留完全控制权:
withdrawVault()——可随时提取SOLwithdrawTokens(mint)— 随时提取抵押代币unlinkWallet(agent)— 立即撤销代理访问权限
如果代理密钥对遭泄露,攻击者将只能获取少量资产,且您可通过单笔交易撤销其对金库的访问权限。
入门指南
1. 安装
npm install torch-liquidation-bot@4.0.2
或使用 ClawHub 提供的捆绑源码——Torch SDK 包含在lib/torchsdk/目录中,机器人源码位于lib/kit/目录。
2. 创建并注资金库(人类主体)
从您的授权钱包执行:
import { Connection } from "@solana/web3.js";
import {
buildCreateVaultTransaction,
buildDepositVaultTransaction,
} from "./lib/torchsdk/index.js";
const connection = new Connection(process.env.SOLANA_RPC_URL);
// Create vault
const { transaction: createTx } = await buildCreateVaultTransaction(connection, {
creator: authorityPubkey,
});
// sign and submit with authority wallet...
// Fund vault with SOL for liquidations
const { transaction: depositTx } = await buildDepositVaultTransaction(connection, {
depositor: authorityPubkey,
vault_creator: authorityPubkey,
amount_sol: 5_000_000_000, // 5 SOL
});
// sign and submit with authority wallet...
3. 运行机器人
VAULT_CREATOR=<your-vault-creator-pubkey> SOLANA_RPC_URL=<rpc-url> npx torch-liquidation-bot
首次运行时,机器人将打印代理密钥对及关联说明。请从您的授权钱包完成关联操作,随后重启机器人。
4. 配置
| 变量 | 必需 | 默认值 | 说明 |
|---|---|---|---|
SOLANA_RPC_URL | 是 | -- | Solana RPC 端点(HTTPS)。备用:RPC_URL |
VAULT_CREATOR | 是 | -- | 金库创建者公钥 |
SOLANA_PRIVATE_KEY | 否 | -- | 一次性控制器密钥对(base58 或 JSON 字节数组)。如果省略,则在启动时生成新的密钥对(推荐) |
SCAN_INTERVAL_MS | 否 | 30000 | 扫描周期之间的毫秒数(最小 5000) |
LOG_LEVEL | 否 | info | debug,info,warn,错误 |
架构
packages/bot/src/
├── index.ts — entry point: keypair generation, vault verification, scan loop
├── config.ts — loadConfig(): validates SOLANA_RPC_URL, VAULT_CREATOR, SOLANA_PRIVATE_KEY, SCAN_INTERVAL_MS, LOG_LEVEL
├── types.ts — BotConfig, LogLevel interfaces
└── utils.ts — sol(), bpsToPercent(), withTimeout(), createLogger()
该机器人由约192行TypeScript代码构成。它只做一件事:找出水下贷款并通过金库进行清算。
依赖项
| 包 | 版本 | 用途 |
|---|---|---|
@solana/web3.js | 1.98.4 | Solana RPC、密钥对、交易 |
torchsdk | 3.7.22 | 代币查询、批量贷款扫描、清算构建器、金库查询 |
两个运行时依赖项。均固定为精确版本。不使用^或~范围指定。
金库安全模型
Torch Market金库的七项保障条款在此同样适用:
| 属性 | 保障 |
|---|---|
| 完全托管 | 金库持有所有SOL和所有抵押代币。代理钱包不持有任何资产。 |
| 闭环 | 清算所用的SOL来自金库,抵押代币则归入金库。不会泄露给代理。 |
| 权限分离 | 创建者(不可变的PDA种子) vs 权限方(可转让的管理员) vs 控制器(一次性签名者)。 |
| 每个钱包仅有一个链接 | 一个代理只能属于一个金库。PDA的唯一性在链上强制执行这一点。 |
| 无需许可的存款 | 任何人都可以为金库充值。硬件钱包存款,代理进行清算。 |
| 即时撤销 | 权限方可以随时解除代理的链接。只需一笔交易。 |
| 仅限权限方提款 | 只有金库权限方可以提取SOL或代币。代理无法提取价值。 |
清算的闭环经济体系
| 方向 | 流向 |
|---|---|
| SOL流出 | 金库 → 借款人的国库债务(用于偿还贷款) |
| 代币流入 | 借款人抵押品 → 金库ATA(按10%折扣) |
| 净额 | 金库收到的抵押品价值为所花费SOL的110% |
该机器人设计上具有盈利性——每次成功的清算所返回的价值都高于其成本。利润在金库中累积。授权方可在准备就绪时提取。
借贷参数
| 参数 | 数值 |
|---|---|
| 最大贷款价值比 | 50% |
| 清算阈值 | 65% |
| 利率 | 每周期约2%(约每周) |
| 清算奖励 | 10% |
| 资金利用率上限 | 国库的70% |
| 最低借款额 | 0.1 SOL |
抵押品价值根据Raydium池储备金计算。抵押品存入和提取时适用0.03%的Token-2022转账费(3个基点,每个铸币固定)。
何时发生清算
当贷款的健康因子超过65%时,该贷款将进入可清算状态。这通常在以下情况发生:
- 代币价格下跌(抵押品价值相对于债务减少)
- 利息累积(债务在每个周期以2%的速度增长)
- 上述两种情况同时发生
机器人会检查position.health === 'liquidatable'——SDK根据链上Raydium储备和贷款的累积债务计算健康因子。
使用的SDK函数
机器人使用Torch SDK的一个特定子集:
| 函数 | 用途 |
|---|---|
getTokens(connection, { status: 'migrated' }) | 发现所有具有活跃借贷市场的代币 |
getAllLoanPositions(connection, mint) | 批量扫描某个代币的所有活跃贷款——返回按健康因子预排序的头寸(可清算的优先),一次性获取池价格 |
getVault(connection, creator) | 在启动时验证金库是否存在 |
getVaultForWallet(connection, wallet) | 验证代理是否已关联到金库 |
buildLiquidateTransaction(connection, params) | 构建清算交易(通过金库路由) |
confirmTransaction(connection, sig, wallet) | 通过RPC在链上确认交易(验证签名者,检查Torch指令) |
扫描与清算模式
import { getTokens, getAllLoanPositions, buildLiquidateTransaction } from 'torchsdk'
// 1. Discover migrated tokens
const { tokens } = await getTokens(connection, { status: 'migrated', sort: 'volume', limit: 50 })
for (const token of tokens) {
// 2. Bulk scan — one RPC call per token, positions sorted liquidatable-first
const { positions } = await getAllLoanPositions(connection, token.mint)
for (const pos of positions) {
if (pos.health !== 'liquidatable') break // pre-sorted, done
// 3. Build and execute through vault
const { transaction, message } = await buildLiquidateTransaction(connection, {
mint: token.mint, // token with the underwater loan
liquidator: agentPubkey, // agent wallet (signer)
borrower: pos.borrower, // borrower being liquidated
vault: vaultCreator, // vault creator pubkey (SOL from vault, tokens to vault)
})
transaction.sign(agentKeypair)
await connection.sendRawTransaction(transaction.serialize())
}
}
日志输出
=== torch liquidation bot ===
agent wallet: 7xK9...
vault creator: 4yN2...
scan interval: 30000ms
[09:15:32] INFO vault found — authority=8cpW...
[09:15:32] INFO agent wallet linked to vault — starting scan loop
[09:15:32] INFO treasury: 5.0000 SOL
[09:15:33] INFO LIQUIDATABLE | SDKTEST | borrower=3AyZ... | LTV=72.50% | owed=0.5000 SOL
[09:15:34] INFO LIQUIDATED | SDKTEST | borrower=3AyZ... | sig=4vK9... | collateral received at 10% discount
签名与密钥安全
安全边界是金库,而非密钥。
代理密钥对在每次启动时通过Keypair.generate()重新生成。它持有约0.01 SOL用于支付燃气费。如果密钥泄露,攻击者将获得:
- 少量资产(用于燃气的SOL)
- 以及授权方可通过一笔交易撤销的金库访问权限
代理永远不需要授权方的私钥。授权方也永远不需要代理的私钥。他们共享的是金库,而非密钥。
规则
- 绝不向用户索取其私钥或助记词。金库授权方需通过其自有设备进行签名。
- 绝不记录、打印、存储或传输任何私钥材料。代理密钥对仅存在于运行时内存中。
- 切勿将密钥嵌入源代码或日志中。代理公钥会被打印出来——私钥绝不会暴露。
- 使用安全的 RPC 端点。默认使用私有的 RPC 提供商。切勿为主网交易使用未加密的 HTTP 端点。
RPC 超时设置
所有 SDK 调用都包裹了 30 秒的超时设置(位于 utils.ts 中的 `withTimeout`)。一个挂起或无响应的 RPC 端点无法无限期地阻塞机器人——调用会被拒绝,错误会被扫描循环捕获,然后机器人会继续处理下一个代币或周期。
环境变量
| 变量 | 是否必需 | 用途 |
|---|---|---|
SOLANA_RPC_URL/RPC_URL | 是 | Solana RPC 端点 (HTTPS) |
VAULT_CREATOR | 是 | Vault creator pubkey — 标识机器人通过哪个金库运行 |
SOLANA_PRIVATE_KEY | 否 | 可选 — 如果省略,机器人会在启动时生成一个新的密钥对(推荐) |
外部运行时依赖
SDK 中包含向外部服务发起出站 HTTPS 请求的函数。机器人运行时路径会联系两个服务:
| 服务 | 用途 | 调用时机 | 机器人是否使用? |
|---|---|---|---|
CoinGecko(api.coingecko.com) | 用于显示的 SOL/USD 价格 | 带 USD 定价的代币查询 | 是 — 通过getTokens()、getToken() |
Irys Gateway(gateway.irys.xyz) | 代币元数据回退(名称、符号、图像) | getToken()当链上元数据URI指向Irys时 | 是 — 通过getTokens() |
SAID协议(api.saidprotocol.com) | 代理身份验证和信任等级查询 | verifySaid()仅 | 否— 该机器人不调用verifySaid() |
confirmTransaction()不会联系SAID。尽管它位于SDK的said.js模块中,但它仅调用connection.getParsedTransaction()(Solana RPC)用于验证交易是否在链上成功并确定事件类型。不会向任何外部服务发送数据。
不会向CoinGecko或Irys发送任何凭据。所有请求均为只读GET请求。如果任一服务不可访问,SDK会优雅降级。绝不会向任何外部端点传输私钥材料。
测试
要求Surfpool运行主网分叉:
surfpool start --network mainnet --no-tui
pnpm test
测试结果:9项通过,0项失败(Surfpool主网分叉)。
| 测试 | 验证内容 |
|---|---|
| 连接 | RPC可达性 |
| 获取代币 | 发现已迁移代币 |
| 获取借贷信息 | 读取所有代币的借贷状态 |
| 获取所有贷款头寸 | 批量扫描活跃贷款,验证排序顺序(优先显示可清算贷款) |
| 获取代币信息 | 代币元数据、价格、状态 |
| 获取钱包对应的金库 | 对于未关联的钱包,金库链接返回空值 |
| 进程内密钥对 | 无需外部密钥 |
错误代码
VAULT_NOT_FOUND:此创建者不存在金库WALLET_NOT_LINKED:代理钱包未关联到金库NOT_LIQUIDATABLE:头寸贷款价值比低于清算阈值NO_ACTIVE_LOAN:此钱包/代币无未结贷款INVALID_MINT:未找到代币
链接
- 清算工具包(源码):github.com/mrsirg97-rgb/torch-liquidation-kit
- 清算机器人(npm):npmjs.com/package/torch-liquidation-bot
- Torch SDK(捆绑包):
lib/torchsdk/-- 包含在此技能中 - Torch SDK(源代码):github.com/mrsirg97-rgb/torchsdk
- Torch SDK(npm):npmjs.com/package/torchsdk
- Torch Market(协议技能):clawhub.ai/mrsirg97-rgb/torchmarket
- 白皮书:torch.market/whitepaper.md
- 安全审计:torch.market/audit.md
- 网站:torch.market
- 程序ID:
8hbUkonssSEEtkqzwM7ZcZrD9evacM92TcWSooVF4BeT
这个机器人的存在是因为Torch借贷市场需要清算人。当贷款资不抵债且无人清算时,资金库将承担损失。活跃的清算人保护资金库健康,并从中获利。保险库使其安全——所有价值都保留在托管中,所有风险都得到控制,而人类主体始终掌握密钥。


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