关于 index-bot
index-bot 是用于创建加权资产组合并在权重偏离时再平衡的策略技能。它从所选链模板解析代币地址,并将买入和调整兑换委托给现有集成。
主要功能
- 01按指定资产和权重定义组合
- 02计算组合各项的买入规模
- 03检查支出上限和代币许可名单
- 04预览计划中的组合买入
- 05按目标权重再平衡持仓
适用场景
- 01根据一条指令买入加权组合
- 02按设定周期再平衡持仓
- 03跳过资金或 Gas 不足的组合项目
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ uniswap/ uniswap-ai --skill index-bot安装后在 Claude Code 中输入/index-bot确认已加载。
详细介绍
Index Bot
通过一条指令构建加权资产组合,一次性买入整个组合,并按设定周期在权重偏离时进行再平衡。此技能是一个轻量策略层:负责决定买入什么以及买入多少,然后将所有报价、授权、兑换和签名步骤委托给现有技能。
运行时兼容性: 此技能使用
AskUserQuestion进行交互式提示。如果你的运行时不支持AskUserQuestion,请通过自然语言对话收集相同的参数。
概述
根据一条提示词(例如“建立由市值排名前 5 的 RWA 等权重组成的组合,每周再平衡”),index-bot 会:
- 解析组合规格(明确指定资产及权重,或请求排名前 N 的资产)。
- 将每项资产解析为代币地址,并计算每项的配置金额。
- 应用防护措施(支出上限、代币允许列表、试运行)。
- 在目标链上,通过 swap-integration 的 Trading API 流程委托执行每笔买入。
- 记录目标权重和上次再平衡时间,并写入状态文件。
之后由宿主调度器再次调用时,它会读取当前持仓,计算相对于目标权重的偏离,生成调整用的兑换操作,并委托执行。
触发方式有两种:创建组合的提示词,以及宿主调度器(cron 或 Agent 运行时唤醒)触发的每次再平衡运行。
前置条件
此技能不会重新实现兑换执行。它依赖以下技能:
- swap-integration(uniswap-trading):唯一的执行路径。每笔买入和再平衡操作都必须经过其 Trading API 流程(依次执行
check_approval、quote、swap,然后签名并广播)。请勿重新实现其中任何步骤。 - v4-sdk-integration(uniswap-trading):仅当某项操作还需建立或管理流动性头寸时才用于执行 LP 操作。默认的指数型组合仅持有现货,无需此项。
- viem-integration(uniswap-viem):用于账户、签名、交易广播,以及读取链上余额以计算偏离情况。
操作前请阅读这些插件参考资料,并以其为准:
- 所选目标链模板:chainId、链名称、合约地址、可交易代币来源、资金约束、市场数据可用性,以及模板特定注意事项。Robinhood Chain 参考模板见
../../references/robinhood-chain.md。 ../../references/execution-model.md:Trading API 要求、执行模式、限制和免责声明规则。../../references/strategy-state.md:共享状态文件和调度器模式。
模板输入
所选目标链模板必须提供:
- 链 ID、链名称、原生 Gas 代币,以及 RPC/读取路径。
- 委托执行和估值所需的已部署 Uniswap router、Permit2 及 quoter/state-reader 地址。
- 如果组合还管理 LP 头寸,则需提供可选的 v4 PoolManager/PositionManager 地址。
- 可交易代币解析规则,包括任何代币列表、排名来源或允许列表来源。
- 资金约束、市场数据可用性、转账限制注意事项及市场开放时间指南。
工作流
步骤 1:解析资产篮子规格
从提示词中提取资产篮子定义:
| 参数 | 必填 | 示例 |
|---|---|---|
| 资产 | 是 | 明确的列表,或“前 5 大 RWA” |
| 权重 | 是 | equal,或总和为 1 的自定义权重 |
| 总规模 | 是 | 1000 USDG、0.5 ETH |
| 资金代币 | 是 | 用于买入每个标的的代币 |
| 再平衡频率 | 是 | weekly、monthly、none |
| 偏离阈值 | 否 | 仅当某个标的偏离 > X% 时再平衡 |
| 支出上限 | 是 | 以代币计价的单次运行和单周期上限 |
如果提示词要求进行前 N 名排名(“前 5 大 RWA”),则没有默认的排名来源,因此不要编造或猜测排名。如果所选模板提供索引器或排名来源,且操作人员指示使用该来源,则使用该来源。否则,通过 AskUserQuestion 向用户索取明确的资产列表,并根据该列表继续操作。如果缺少其他必填参数(包括单次运行或单周期支出上限),请使用带结构化选项的 AskUserQuestion 收集。
步骤 2:解析代币并计算每个标的的规模
对于每项资产:
- 从所选目标链模板及其代币来源中,将代币符号解析为代币地址。不要维护本地注册表。如果请求的资产无法从模板的代币来源中解析,则停止并报告,不要猜测。
- 计算每个标的的目标名义金额:
legNotional = totalSize * weight。跨代币计算规模时,使用 Uniswap 报价(通过swap-integration调用 Trading API/quote,或通过v4-sdk-integration调用V4Quoter),不得使用外部数据源或特定交易场所的 API。 - 记录该标的需要花费的资金代币数量。
在计算规模前,确认每个解析出的地址都是合约。如果某项资产无法在目标链上解析,则停止并报告,不要猜测。
步骤 3:防护措施
执行任何操作前:
- 使用
AskUserQuestion(如果不可用,则用自然语言)询问操作人员尚未提供的单次运行或单周期支出上限;同时说明用于比较的资金代币或计价单位。如果任一上限仍未设置,则不要进入autonomous模式。 - 确认资产篮子总额未超过已配置的支出上限(单次运行和单周期)。
- 确认每个标的代币都在操作人员的许可名单中。
- 先进行试运行,打印每个计划买入的标的(代币、数量、权重)以供审核。
- 如果任何标的是 RWA,确认股票市场交易时段(非交易时段的流动性可能较低)。
- 逐个标的检查钱包是否有足够余额:必须持有足够的资金代币(
tokenIn)以支付该标的的买入金额,并持有足够的原生代币用于支付 Gas 费。如果某个标的在其中一项余额不足,则跳过该标的并报告,然后继续处理资产篮子的其余部分。遵循所选模板中的资金约束;除非技能之外明确提供了此行为,否则技能不会自动提供资金、跨链桥接或补足余额。
步骤 4:买入资产篮子(委派)
对于每个标的,委派给 swap-integration 的 Trading API 流程:依次执行 check_approval、quote、swap,然后通过 viem 签名并广播交易。传入目标链 ID,以及所选模板中该链的路由器和代币地址。
不要重新实现报价、授权、swap 请求体构造或签名。每个标的之间短暂延迟,以遵守 Trading API 的速率限制;如果某个标的失败,不要因此放弃资产篮子的其余部分(报告失败并继续)。
步骤 5:记录目标权重
买入成功后,将目标权重和再平衡元数据写入状态文件(参见 ../../references/strategy-state.md)。后续的偏离计算会以此为基准。
再平衡循环
每次按计划调用时:
- 读取状态,加载目标权重和
lastRebalanceAt。 - 检查幂等性:如果本周期已执行过再平衡,则跳过。
- 通过 viem 读取每个组成项当前的链上余额,并使用 Uniswap 报价以资金代币计价(通过
swap-integration调用 Trading API/quote,或通过v4-sdk-integration使用V4Quoter/StateView),从而获取当前权重。不得使用特定交易场所的 API 或外部价格馈送;请参阅../../references/execution-model.md(数据与定价)。 - 计算每个组成项的偏离值:
drift = currentWeight - targetWeight。将偏离绝对值|drift|与阈值比较,以同时捕捉超配(drift > 0)和低配(drift < 0)的组成项。如果没有任何组成项的|drift|超过偏离阈值,则不执行任何操作,并更新lastRebalanceAt。 - 生成调整用的兑换:卖出超配的组成项,买入低配的组成项,使每个组成项恢复到目标权重。
- 按照步骤 4 中的确切方式,将每笔调整用的兑换交由 swap-integration Trading API 流程处理。
- 使用新的
lastRebalanceAt和任何发生变化的持仓更新状态。
执行模式
此技能使用 ../../references/execution-model.md 中定义的共享执行模式:
| 模式 | 行为 |
|---|---|
confirm(默认) | 广播每笔交易前都请求用户批准。 |
autonomous | 无需逐笔交易提示即可执行,但仅限于护栏范围内。 |
默认使用 confirm。使用 autonomous 模式必须满足以下所有条件:设置每次运行和每个周期的支出上限、设置代币允许列表、先执行试运行,以及设置紧急停止开关。一次篮子买入包含多笔交易,因此在 confirm 模式下,应汇总整个篮子并在每次运行时确认一次(如果运行时不支持,则按组成项逐个确认)。
状态
状态遵循 ../../references/strategy-state.md。index-bot 会存储目标权重和上次再平衡时间,以便在下次运行时计算偏离值:
每次运行都会先读取状态,并且只在成功广播后更新状态,因此在同一周期内重新运行不会导致重复买入或重复再平衡。
限制与免责声明
RWA 准入控制因模板而异,并且可能在代币级别强制执行(受转账限制的 ERC-20),因此即使路由器接受报价,某个组成项仍可能在转账时回退。此技能必须:
- 妥善处理每个组成项的转账限制回退,并报告发生回退的组成项。
- 不得假设存在池级别或路由器级别的允许列表。
- 遵守股票市场交易时段;某些 RWA 在非交易时段可能有流动性限制。
- 执行前展示仓库根目录中的财务免责声明
DISCLAIMER.md。
完整的限制和免责声明规则请参阅 ../../references/execution-model.md。
输入验证
在将任何用户提供的值插入生成的代码、API 调用或 shell 命令前:
- 代币地址:必须匹配
^0x[a-fA-F0-9]{40}$;否则拒绝。 - 金额和名义金额:必须是非负数值,并匹配
^[0-9]+\.?[0-9]*$。 - 权重:每项权重必须在
[0, 1]范围内,且全部权重的总和必须为1(允许小幅误差)。如果篮子权重总和不为 1,则拒绝。 - Chain id:必须是由运营方配置的目标 chain id,并从所选模板中读取,而不是硬编码。
- API 密钥:必须来自环境变量,绝不能硬编码。
- 拒绝包含 shell 元字符的任何输入:
;、|、&、$、`、(、)、>、<、\、'、"、换行符。