Skip to main content
本指南介绍做市商如何处理 Combo RFQ。你将打开报价会话、响应传入的请求、在需要时取消已提交的报价、通过 Last Look 确认成交,并监控执行更新。
如需了解 Combos 做市功能的开发动态,请加入 Combos 做市商 Telegram 群组

开始报价

首先,准备一个通过 RFQ 系统身份验证的报价会话。你需要一个 Polymarket 账户;可在 polymarket.com 创建。
1

安装包

使用你选择的包管理器安装统一 TypeScript SDK。
本页使用 Viem 进行钱包签名。如需使用其他钱包库,请参阅 TypeScript 工具指南
2

创建安全客户端

使用一个具备用户请求成交所需资金的钱包及其签名者信息创建 SecureClient
下一步设置交易授权时需要 Relayer API 密钥。请前往 polymarket.com → Settings → API Keys 创建 Relayer API 密钥
3

设置交易授权

设置满足用户请求所需的授权。
4

打开 RFQ 会话

打开 RFQ 会话。
5

关闭会话

你可以随时调用 session.close() 关闭会话。

处理报价请求

报价请求描述用户买入或卖出由一组给定腿定义的 Combo 份额的意图。目前,报价请求只能买入或卖出 Combo 的 YES 侧。 下列情况展示做市商如何使用抵押品或库存满足用户的买入或卖出请求。 有关 YES/NO 持仓模型的详情,请参阅组合持仓 下图展示做市商侧的报价生命周期,从接收报价请求到最终结果。

授权报价

通过为请求定价并向 RFQ 系统返回已签名订单来授权每个报价。报价方应在 400 毫秒的提交窗口内响应。
1

根据事件类型分支

首先,根据 event.type 分支处理会话流中的报价请求。
2

评估请求

然后,在定价前检查 RfqQuoteRequestEventrequestedSize 是一个 RfqRequestedSize 值,用于描述用户如何指定请求规模。
其中:
  • notional:以抵押品货币计价的请求目标价值。例如,"3" 表示用户希望购买价值约 3 pUSD 的 Combo,最终份额数量由报价价格推导。notional 始终且仅由 BUY 请求使用。
  • shares:Combo 结果 token 的目标数量。例如,"10" 表示用户希望购买 10 份,即 10,000,000 个基础单位。shares 始终且仅由 SELL 请求使用。
在两种情况下,value 都是规范化的十进制字符串。
3

提交

最后,在会话循环外处理定价、报价提交和持久化,并确保在 event.submissionDeadline 截止时间前完成。请求价格以每份 YES Combo 的 pUSD 表示;例如,0.45 表示每份 0.45 pUSD。如果不想为该请求报价,请跳过提交。

部分成交报价

如果只想成交部分请求规模,请随报价传入 sizesize 是规范化十进制值:"10" 表示 10 份,即 10,000,000 个基础单位。省略时,SDK 会按完整请求规模报价。

使用库存

默认情况下,报价会按照组合持仓逻辑,使用抵押品(pUSD)按需购买 YES 或 NO token 以满足报价请求。如需从现有库存报价,请传入 source: "inventory"

取消报价

提交报价后,请保留返回的报价引用。如果报价被选中前价格、库存或风险发生变化,请使用该引用请求取消。
取消确认表示 RFQ 系统已处理取消请求,但不保证已从已经选中的 RFQ 中撤回报价。
1

存储报价引用

首先,保留 event.quote(…) 返回的报价引用。它包含取消报价所需的 rfqIdquoteId
2

取消报价

然后,在同一实时 RFQ 会话中将该引用传给 session.cancelQuote(…)

Last Look

Last Look 是为已启用该功能的做市商提供的独立最终审核步骤。如果选中的报价需要 Last Look,请在截止时间前进行最终风险检查,并接受或拒绝成交。 Last Look 面向 Combo 名义交易量约为 2,500 美元、且已与 Polymarket 建立沟通渠道的做市商。这有助于保持该计划的可靠性,并让 Polymarket 快速解决系统问题。 如需申请访问权限,请填写 Last Look 申请表
做市商应接受大多数被选中的报价。我们会跟踪接受率;若做市商在一小时回看窗口内拒绝超过 15% 的选中报价,可能会暂停其报价几分钟。
启用权限后,你的报价系统会立即收到审核已选成交的请求。请确保系统在权限启用前已准备好评估并响应这些请求。
1

根据事件类型分支

首先,根据 event.type 分支处理同一会话流中的确认请求。
2

检查确认请求

然后,在进行最终风险检查前检查确认请求。它包含选中的报价、最终成交规模,以及 Last Look 响应的 event.confirmBy 截止时间。
3

确认或拒绝

最后,在会话循环外执行最终风险检查,并在 event.confirmBy 截止时间前响应。

管理 Combo 持仓

使用 Combo 持仓工作流管理整个报价生命周期中的库存。

列出 Combo 持仓

在后台库存同步中列出 Combo 持仓。请在报价路径外保持此状态为最新。
默认列表会省略份额余额低于 0.001 的未平仓持仓,例如全部卖出后剩余的微量余额。已结算持仓始终返回;增量同步请求也会返回所有持仓,不受余额影响。
使用 client.listComboPositions(...) 分页读取已验证账户的 Combo 持仓。
你可以按以下条件筛选持仓。conditionId 接受一个 Combo condition ID 或 Combo condition ID 数组。
每个返回项都是 ComboPosition
对于已赎回持仓,sharesentryCostUsdc 跟踪剩余库存,因此获胜 Combo 赎回后两者都可能为零。realizedPayoutUsdc 表示赎回总收入,totalCostUsdc 表示原始成本基础;净结果为 realizedPayoutUsdc - totalCostUsdc你可以按以下条件筛选持仓:

列出 Combo 活动

当你需要库存变更事件的审计轨迹时,请使用 Combo 活动,其中包括拆分、合并、转换、包装、解包和赎回。当前库存状态请使用 Combo 持仓。
使用 client.listComboActivity(...) 分页读取已验证账户的 Combo 生命周期活动。
使用 conditionId 筛选一个或多个 Combo。
每个返回项都是带有判别字段的 ComboActivity 联合类型。所有生命周期记录共享基础字段;赎回记录还包含被赎回的 position ID 和 payout。

库存管理

如果要从库存报价,请在报价请求到达前建立库存。拆分会将抵押品转换为一组腿对应的互补 Combo 持仓;合并会将匹配的互补 Combo 持仓转换回抵押品。
使用带有 legsclient.splitPosition(...) 从抵押品创建 Combo 库存。amount 以 pUSD 基础单位表示。
使用带有相同 legsclient.mergePositions(...) 将互补 Combo 持仓合并回抵押品。传入 amount: "max" 可合并可用的最大匹配数量。

赎回已结算持仓

Combo 持仓结算后,赎回获胜持仓以将其结算回抵押品。
使用带有 Combo positionIdclient.redeemPositions(...)。SDK 会赎回该已结算持仓的可用余额。
你可以先列出已结算的获胜持仓,然后逐一赎回。

获取 Combo 市场

使用 Combo 市场目录检索可用作 Combo 腿的活跃市场。市场按交易量降序排列。
使用 client.listComboMarkets(...) 分页读取可用作 Combo 腿的市场。
使用 exclude 排除已经展示或选择的市场。
SDK 返回结构化的 YES 和 NO 结果。

将腿映射到市场

做市商应在报价请求到达前构建自己的 Combo 支持市场视图。支持 Combo 的市场会公开一个包含两个条目的 position ID 列表:第一个是 YES position ID,第二个是 NO position ID。这些 ID 标识定价系统可映射回市场数据的结果持仓。
获取未关闭的市场,并在自己的市场数据存储中按 position ID 建立索引。
你也可以按腿 position ID 按需获取市场,但大多数做市商应在 400 毫秒报价窗口开始前准备好这些上下文。

监听执行更新

执行更新会说明你的报价被选中后发生了什么。使用这些更新在自己的系统中核对 RFQ 状态、交易哈希和最终执行结果。
1

根据事件类型分支

首先,根据 event.type 分支处理同一会话流中的执行更新。
2

检查执行更新

然后,在核对选中的 RFQ 前检查执行更新。执行更新通过 rfqId 关联。
其中 RfqExecutionStatus 可能为:
3

核对执行状态

最后,持久化该更新,并将 RfqExecutionStatus.ConfirmedRfqExecutionStatus.Failed 视为终止状态。

监听交易广播

已确认交易广播会在任何 Combo RFQ 交易成功完成时通知已连接的做市商。使用它们构建公开成交记录、更新风险,或核对由其他做市商成交的市场活动。 交易广播采用尽力交付机制,重新连接后可能重放。请按 RFQ ID 去重:TypeScript 使用 rfqId,Python 和原始 WebSocket 消息使用 rfq_id
1

根据事件类型分支

首先,根据 event.type 分支处理同一会话流中的交易广播。
2

检查交易

然后,在存储或应用已确认交易前进行检查。交易广播不包含做市商身份和每个做市商的成交分配。
price 是每份 YES Combo 以 pUSD 计价的已接受混合价格。size 是匹配的 Combo 份额规模。两个值都是规范化十进制字符串。
3

存储交易

最后,按 RFQ ID 和执行时间戳持久化交易,以供下游核对。

处理错误

本节介绍如何处理 RFQ 系统错误。

打开 RFQ 会话

client.openRfqSession() 包装在 try/catch 中,并使用 OpenRfqSessionError.isError(…) 缩小错误类型范围。

提交报价

event.quote(…) 包装在 try/catch 中,并使用 RfqQuoteError.isError(…) 缩小错误类型范围。

取消报价

session.cancelQuote(…) 包装在 try/catch 中,并使用 RfqCancelQuoteError.isError(…) 缩小错误类型范围。

确认或拒绝

event.confirm()event.decline() 包装在 try/catch 中,并使用 RfqConfirmationError.isError(…) 缩小错误类型范围。