对接
前端或索引器需要的东西。协议那页讲原理,这页讲接口。
:::info 合约已上线,协议还关着
六个核心合约已经部署在链 4663 上并且冻结。但现在还发不了任何东西:公开发射是关的、没有上架任何股票、发射 router 还没被 授权、策略数是 0。
下面是生产地址,2026-09-22 在链上只读核对过。不在这一页上的地址都不是 Hedgefun——特别注意别把任何东西指向沙盒 hook, 那是另一个合约,地址看起来很像。
:::
网络
| 链 | Robinhood Chain |
| Chain ID | 4663 |
| 台面 | hedgefun.trade——独立域名,不是应用的子域名 |
| 区块浏览器 | robinhoodchain.blockscout.com |
| 发射自己的池子 | Uniswap V4,挂共用 hook,用股票计价 |
| 国库的股票腿 | 只有 Uniswap V3,并用 10 分钟 TWAP 印证现价 |
| 股票预言机 | Chainlink,RHxxx / USD ÷ USDG 喂价——见三个价 |
| 出块时间 | 约 0.1 秒,所以这里每一处衰减都按秒计时而不是按块 |
合约
生产地址
从提交 3dc07eb 部署,链 4663 的第 69,454,565 块;2026-09-22 在第 69,459,976 块做过只读核对。六个合约都有 Sourcify 的
creation 与 runtime match(不是 exact_match);Blockscout 的源码展示和 Uniswap 的路由批准是另外两回事,不会因此自动
成立。
| 合约 | 地址 |
|---|---|
HedgeFunFactory | 0x58F6Ced8d02cD2567f1458801440Bc4eb67fA961 |
HedgeFunHook | 0x2A16d0973385952cFBE750D37f803d0958472844 |
TradingCalendar | 0xFE9E85f0C258Fc2757eB6Acd1ca032Ec860487F5 |
HedgeFunLaunchRouter | 0x470F5DeB0897118F6575F72183781C6a0610E1FA |
TreasuryDeployer | 0x05BC7875a7d61C3bbA2D7737D40C81aF5fD10DBE |
TokenDeployer | 0x9C0440dCc1b651C4707aa44E0eA083Fa4E0E8A6b |
HedgeFunTradeRouter | 0xb281F7D91325A3A386A00cA0F6010BC8B1491c8C |
owner、protocol 和日历的 owner 是同一个 Safe:0x2910117dd2cB431173Ae9Fb6eAF30726321d1693,3/4 多签,
pendingOwner 为零。
已上架的股票
12 只,由 owner 上架:NVDA、AMD、MU、INTC(半导体组),SPCX、CRCL、GOOGL、AMZN、GME、META、USAR、MSTR。 每只的开盘 FDV 大约 $10k。
一次上架就是三样东西,而且从工厂读、不要从我们这里抄——它们正是创作者不能自己选的预言机和池子:
listings(stock) -> (oracle, pool, openingPrice)
# 2026-09-22 链上核对
listings(NVDA) -> 0x03c77f527Aa1B0B304602e3fB9Ac994dd1c157f8 # PriceOracle
0xd4EB21209C4D6093f80B5b84f5C45cc093EA14a3 # 股票腿交易的那个 V3 池
44200000000 # 开盘价
公开发射是关的。 publicLaunch 读出来是 false、strategyCount 是 0,所以发射表单应该如实说明,而不是暗示今天
任何人都能发。
每个合约干什么
| 合约 | 你为什么会调它 |
|---|---|
HedgeFunFactory | predict(request) 拿报价和它的哈希,launch(request, terms) 发射,以及创作者能选的上架清单 |
HedgeFunHook | 所有发射共用一个实例,状态按 pool id 分。实时税率、分账、以及税的事件 |
HedgeFunToken | 代币本身,外加它的页面——logo()、description()、socials()、getTokenInfo(),沿用 pons 的读取函数名和选择器,所以给 pons 代币写的工具不用改就能读它 |
HedgeFunTreasury | lot、储备,以及 health() |
HedgeFunLaunchRouter | 一笔交易完成:发射 + 创作者第一笔买入 + 给国库第一批股票 |
HedgeFunTradeRouter | 一笔交易完成 USDG ↔ 发射代币:先走 V3 这一跳(全成或全不成),再进 V4 池 |
PriceOracle、TradingCalendar | 股票的 USDG 价格,以及它查询的 24/5 交易日历 |
ABI 打包在合约仓库的 abi/ 里,旁边有一份生成的接口清单,main 上的是最新的。要按真正部署的那个 commit 重新生成:止盈
字段在 09f42b4 加宽成了 uint32,这改变了 launch、launchWithMetadata 和 predict 的选择器,比它早生成的都是过期的。
发射
发射要传请求和 terms——也就是 predict(request) 返回的哈希,代表发射者对自己看到的全部报价的承诺。如果中间有上架、默认值或
费用变了,launch 会 revert,而不是按新的值成交。
| 字段 | 是什么 |
|---|---|
name、symbol | 代币的名字和符号 |
stock | 工厂已经上架的股票。自带地址会被拒绝:创作者提供的预言机就是创作者控制的价格 |
creator | 永久接收股票计价卖出税里创作者那一份。必须是能调用 vetoCreator 的地址——EOA 或 Safe,不能是分账合约 |
taxBps、creatorBps | 税率和创作者的分成,都被工厂限住 |
tp1Bps、tp2Bps | 两档止盈,uint32 且没有上限——创作者设了多大就如实显示多大 |
dipBps | 抄底在上一次卖出价往下多少处买 |
stopBps | 可选止损。0 表示没有止损,此时一个 lot 永远不低于自己的成本卖 |
lotBps | 规则按多大的 lot 工作 |
bandBpsPerHour | 过期带宽——见下。合法范围是 0..bandCeiling(stock),而这个上限在 owner 设定之前是 0;合约还会再把它限在 200 以内。出生时写进国库,之后不可改 |
发射费可选,三种币之一:原生 gas 代币(直接给,不换币)、USDG,或所发射的同一只股票——这样只持有 NVDA 的创作者完全不用碰
USDG。非原生币支付时多带的 msg.value 会 revert,而不是被吞掉。
launchWithMetadata 还能在同一笔交易里写代币页面。页面属于发射它的地址,该地址可以指定一个编辑者,也可以 lock() 永久
锁死;协议方对它没有任何权力。
报价
必须读实时税率。 一个池子刚开盘的几秒里,买入最高付 99%;而每次回购之后,卖出会带尖峰税率:
买入 → hook.buyRateBps(poolId) // 开盘 3 秒内 99% → 66% → 33% → 平常
卖出 → hook.sellRateBps(poolId) // 开盘时和每次回购后是尖峰,线性衰减回平常
在那些窗口里显示平常税率,报价会错最多 99 个百分点。显示 hook 返回的那个值,并且显示它正在衰减。
其他会影响你能提供什么的规则:
- 卖出只支持 exact-input。
- exact-output 只有「按平常税率的买入」被接受,税收在进来的股票上并做毛额换算,使路径成本相同;其余一律拒绝。
- 发射者在发射交易里的买入不受窗口约束,且不限金额、不限笔数。如果你要展示一个发射的早期成交历史,这一点值得显示出来 而不是被平均掉。
- 每个代币都要显示首买集中度。 发射者在发射交易里给自己拿走了多少供应量,是区分「还能买」和「已经没得买」的唯一那个 数字。前端不显示它,就是把买家最需要知道的东西藏起来了。
过期带宽,以及表单该怎么问
带宽不是让国库按池价交易。它放宽的是「现价距离上一次 Chainlink 打印可以有多远,而 health() 还不关闭」——
maxDeviationBps + bandBpsPerHour × 喂价过期小时数,上限 3000——成交本身仍然按预言机推出来的价格边界执行。
读 bandCeiling(stock) 然后分支,不要无条件渲染这个字段:
- 上限是 0(在 owner 设定之前每只股票都是 0):唯一合法值就是 0。这时候干脆不要渲染这个字段,直接说这个国库只认 Chainlink、休市期间不工作。摆一个禁用的滑块只会招来「为什么我不能选」。
- 上限大于 0:给一个 0 到上限的滑块,默认取上限。并且明说:调低更安全,选 0 也是正当选择,代价只是休市的一些时段 不工作。
不要把「带宽更宽」宣传成「交易更多」:可用性几乎立刻就饱和了,再往上拓宽主要是给别人留出一个更宽的区间去钉住休市时段的 成交价。无论哪种情况,都要标明它在发射时冻结——创作者和 owner 事后都改不了。
读一次发射
| 视图 | 告诉你什么 |
|---|---|
lotCount() | 规则现在扛着几个 lot |
reserveUsdg() | 抄底储备 |
unbookedStock() | 已到账但还没记成 lot 的股票——任何人都可以调 book() |
health() | 现在能不能定价和交易,以及按什么价 |
把一次发射显示成「在跑」之前先读 health()。 它在这几种情况下是 false:喂价过期超过带宽、股票代币因公司行动被置了
oraclePaused()、日历说休市、池子与预言机的偏离超过执行闸门。定不了价就不交易,这是结构决定的——而与此同时,它的代币一周
七天照常交易。
定价
发射池的价格是代币对股票的价格,不是对 USDG。要显示 USDG 价或市值,乘以股票自己的预言机价:
price_usdg = price_in_stock × oracle_usdg(stock)
market_cap = price_usdg × (总供应量 − 已销毁量)
两件要从链上读、不要假设的事:
- token 顺序。 哪一边是 token0 在这条链的股票池上不是常数。假定一种顺序会算出接近零的数字而且不报错,读起来像「没有 流动性」而不像 bug。这个坑已经栽过两次。
- 种池区间。 发射仓位是单边的,从开盘 tick 上方一直到可用区间顶端,所以「走了多远」要从池子当前的 tick 算。没有毕业事件 可以监听,因为什么都不迁移。
事件
事件 topic 和解码示例会和地址一起出现在这里。值得索引的路径:发射本身、hook 在每次交易时的税分账,以及国库的 book /
takeProfit / stopLoss / buyDip / buyback——它们合起来就能重建每一个 lot,不需要依赖我们的 API。
支持
team@hedgehood.app,或 @0xHedgehood。
这是一个界面,不是投资建议。见使用条款。