Files
PolyHermes/docs/neg-risk-redeem.md
WrBug 08e1219f77 feat(neg-risk): WCOL 解包轮询与 Safe/Magic 一致说明
- 新增 WcolUnwrapJobService:每 20s 轮询解包 WCOL,未配置 Builder Key 时直接跳过
- AccountService:赎回流程不再等待确认与解包,由轮询统一处理;新增 runWcolUnwrapForAllAccounts
- BlockchainService:unwrapWcolForProxy 注释说明 Safe/Magic 逻辑一致;waitForTransactionConfirmed 避免 inline lambda 中 continue
- RelayClientService:createUnwrapWcolTx 注释说明共用逻辑;移除 Builder Relayer 调试日志
- docs/neg-risk-redeem.md:更新解包流程与 Safe/Magic 一致说明
- scripts/unwrap-wcol.js:新增脚本支持 Safe/EOA 解包与 Builder Relayer

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-16 01:46:55 +08:00

4.0 KiB
Raw Permalink Blame History

Neg Risk 赎回与对应 JS/TS 代码说明

Neg Risk 特殊逻辑

1. 赎回(Redeem

  • 普通市场:仓位由 USDC.eBridged USDC)抵押,调用 CTF 的 redeemPositions(collateralToken, parentCollectionId, conditionId, indexSets) 时,collateralToken 为 USDC.e 地址(Polygon: 0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174)。
  • Neg Risk 市场:仓位由 WrappedCollateral 抵押(neg-risk-ctf-adapter 设计),同一笔赎回必须使用 WrappedCollateral 地址(Polygon: 0x3A3BD7bb9528E159577F7C2e685CC81A765002E2),否则链上找不到对应仓位,会得到 payout 0。

本项目中:通过 Gamma API 的 negRisk / negRiskOther 判断市场类型,赎回时对 Neg Risk 市场传 isNegRisk=true,在 createRedeemTx 中选用 WrappedCollateral 作为 collateralToken

2. 下单/签约(Order Signing

  • 普通市场:使用标准 CTF Exchange 合约签约。
  • Neg Risk 市场:必须使用 Neg Risk CTF Exchange 合约签约,否则 CLOB 返回 invalid signature。

OrderSigningService.getExchangeContract(negRisk)CopyOrderTrackingService 中按 getNegRiskByConditionId 选择 exchange。


对应的 JS/TS 代码位置

功能 仓库/来源 路径或说明
Relayer 执行、Safe 交易提交 Polymarket/builder-relayer-client src/client.tsexecute)、src/encode/safe.tsMultiSend createSafeMultisendTransaction
链与合约配置 builder-relayer-client src/config/index.tsPolygon/Amoy 的 SafeMultisend 等)
赎回 calldata 构建 官方仓库无 官方库只负责执行传入的 Transaction[],不包含 createRedeemTx 或 redeem 工具函数
社区赎回示例(单一 collateral) Gist: redeem-positions 使用 collateralToken 调用 redeemPositions未区分 Neg Risk(全部用同一 collateral,如 USDC
Neg Risk 合约与 WrappedCollateral Polymarket/neg-risk-ctf-adapter README、addresses.json137 链上 negRiskWrappedCollateral 等地址)
市场是否 Neg Risk Gamma API 市场/事件的 negRisknegRiskOther 字段,本项目中通过 MarketService.getNegRiskByConditionId 查询

赎回后自动解包 WCOL → USDC.e

Neg Risk 赎回到账为 WCOL,若不解包则余额显示为 WCOL 而非 USDC.e。本项目中由轮询任务统一解包,赎回流程内不再等待确认与解包:

  • WcolUnwrapJobService:每 20 秒轮询一次(@Scheduled(fixedRate = 20_000)),遍历所有账户的代理地址,若 WCOL 余额 > 0 则调用 BlockchainService.unwrapWcolForProxy 解包为 USDC.e。同一时间仅允许单次执行;若上次执行未结束则本次忽略。
  • AccountService.redeemPositions:只负责赎回,不再在流程内等待交易确认或执行解包;解包由上述 Job 在后续轮询中处理(含重启后未解包、解包失败重试等)。
  • BlockchainService:提供 getWcolBalance(proxyAddress)unwrapWcolForProxy(...)RelayClientService 提供 createUnwrapWcolTx(toAddress, amountWei)
  • Safe 与 Magic 解包逻辑一致:均使用同一 createUnwrapWcolTx(proxyAddress, balance)execute(privateKey, proxyAddress, unwrapTx, walletType)Safe 走 execTransaction(或 Builder Relayer SAFE),Magic 走 Builder Relayer PROXYencodeProxyTransactionData),最终均为代理合约调用 WCOL.unwrap(proxyAddress, amount)USDC.e 转入该代理地址。

小结

  • Neg Risk 特殊逻辑:赎回用 WrappedCollateral、下单用 Neg Risk Exchange;均由「是否为 Neg Risk 市场」分支处理。
  • 对应 JS 代码:执行与 MultiSend 在 builder-relayer-client;赎回参数与 calldata 在应用层构建,官方无现成 redeem 工具;Neg Risk 的抵押品与合约见 neg-risk-ctf-adapterGamma API