mcpField
I
index-bot

index-bot

github.com/uniswap其他236409 次安装2 天前更新
代码仓库

关于 index-bot

index-bot 是用于创建加权资产组合并在权重偏离时再平衡的策略技能。它从所选链模板解析代币地址,并将买入和调整兑换委托给现有集成。

主要功能

  1. 01按指定资产和权重定义组合
  2. 02计算组合各项的买入规模
  3. 03检查支出上限和代币许可名单
  4. 04预览计划中的组合买入
  5. 05按目标权重再平衡持仓

适用场景

  1. 01根据一条指令买入加权组合
  2. 02按设定周期再平衡持仓
  3. 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 会:

  1. 解析组合规格(明确指定资产及权重,或请求排名前 N 的资产)。
  2. 将每项资产解析为代币地址,并计算每项的配置金额。
  3. 应用防护措施(支出上限、代币允许列表、试运行)。
  4. 在目标链上,通过 swap-integration 的 Trading API 流程委托执行每笔买入。
  5. 记录目标权重和上次再平衡时间,并写入状态文件。

之后由宿主调度器再次调用时,它会读取当前持仓,计算相对于目标权重的偏离,生成调整用的兑换操作,并委托执行。

触发方式有两种:创建组合的提示词,以及宿主调度器(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:解析代币并计算每个标的的规模

对于每项资产:

  1. 从所选目标链模板及其代币来源中,将代币符号解析为代币地址。不要维护本地注册表。如果请求的资产无法从模板的代币来源中解析,则停止并报告,不要猜测。
  2. 计算每个标的的目标名义金额:legNotional = totalSize * weight。跨代币计算规模时,使用 Uniswap 报价(通过 swap-integration 调用 Trading API /quote,或通过 v4-sdk-integration 调用 V4Quoter),不得使用外部数据源或特定交易场所的 API。
  3. 记录该标的需要花费的资金代币数量。

在计算规模前,确认每个解析出的地址都是合约。如果某项资产无法在目标链上解析,则停止并报告,不要猜测。

步骤 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)。后续的偏离计算会以此为基准。

再平衡循环

每次按计划调用时:

  1. 读取状态,加载目标权重和 lastRebalanceAt。
  2. 检查幂等性:如果本周期已执行过再平衡,则跳过。
  3. 通过 viem 读取每个组成项当前的链上余额,并使用 Uniswap 报价以资金代币计价(通过 swap-integration 调用 Trading API /quote,或通过 v4-sdk-integration 使用 V4Quoter / StateView),从而获取当前权重。不得使用特定交易场所的 API 或外部价格馈送;请参阅 ../../references/execution-model.md(数据与定价)。
  4. 计算每个组成项的偏离值:drift = currentWeight - targetWeight。将偏离绝对值 |drift| 与阈值比较,以同时捕捉超配(drift > 0)和低配(drift < 0)的组成项。如果没有任何组成项的 |drift| 超过偏离阈值,则不执行任何操作,并更新 lastRebalanceAt。
  5. 生成调整用的兑换:卖出超配的组成项,买入低配的组成项,使每个组成项恢复到目标权重。
  6. 按照步骤 4 中的确切方式,将每笔调整用的兑换交由 swap-integration Trading API 流程处理。
  7. 使用新的 lastRebalanceAt 和任何发生变化的持仓更新状态。

执行模式

此技能使用 ../../references/execution-model.md 中定义的共享执行模式:

模式行为
confirm(默认)广播每笔交易前都请求用户批准。
autonomous无需逐笔交易提示即可执行,但仅限于护栏范围内。

默认使用 confirm。使用 autonomous 模式必须满足以下所有条件:设置每次运行和每个周期的支出上限、设置代币允许列表、先执行试运行,以及设置紧急停止开关。一次篮子买入包含多笔交易,因此在 confirm 模式下,应汇总整个篮子并在每次运行时确认一次(如果运行时不支持,则按组成项逐个确认)。

状态

状态遵循 ../../references/strategy-state.md。index-bot 会存储目标权重和上次再平衡时间,以便在下次运行时计算偏离值:

每次运行都会先读取状态,并且只在成功广播后更新状态,因此在同一周期内重新运行不会导致重复买入或重复再平衡。

限制与免责声明

RWA 准入控制因模板而异,并且可能在代币级别强制执行(受转账限制的 ERC-20),因此即使路由器接受报价,某个组成项仍可能在转账时回退。此技能必须:

  1. 妥善处理每个组成项的转账限制回退,并报告发生回退的组成项。
  2. 不得假设存在池级别或路由器级别的允许列表。
  3. 遵守股票市场交易时段;某些 RWA 在非交易时段可能有流动性限制。
  4. 执行前展示仓库根目录中的财务免责声明 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 元字符的任何输入:;、|、&、$、`、(、)、>、<、\、'、"、换行符。

评论

支持 Markdown