Polymarket
exchange.IO("Redeem")
Polymarket 专属。把已结算市场中的结果份额兑回 USDC(链上 redeemPositions),通过 Polymarket 中继无 Gas 提交。
语法
python
result = exchange.IO("Redeem") # 赎回全部可赎回仓位
result = exchange.IO("Redeem", "0xconditionId") # 赎回单个市场
result = exchange.IO("Redeem", ["0xcid1", "0xcid2"]) # 赎回多个市场参数
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| condition_ids | str / list | 否 | 市场条件 ID(GetPosition() 的 Info["conditionId"])。不传或为空时赎回全部可赎回仓位 |
返回值
| 情况 | 返回 |
|---|---|
| 没有符合条件的仓位 | {"redeemed": 0, "message": "没有可赎回的仓位"} |
| Proxy / Gnosis Safe 钱包 | {"redeemed": n, "txHash": "0x...", "gasUsed": 123456} |
| Deposit Wallet(POLY_1271) | {"redeemed": n, "txHash": "0x..."} |
| 失败 | None(错误写入策略日志) |
redeemed 为本次提交的市场(conditionId)数量,不是份数。
执行流程
- 选择仓位(Data API
/positions,最多 500 条):- 不传
condition_ids:只取redeemable=true且份数 ≥ 0.01 的仓位; - 传入
condition_ids:取全部仓位后按 conditionId(大小写不敏感)筛选,不检查 redeemable。
- 不传
- 按 conditionId 分组,每个市场生成一笔赎回调用:
- 普通市场:调用 ConditionalTokens 合约
redeemPositions(collateral, 0x0, conditionId, [1, 2]); - Neg Risk 市场:调用 NegRiskAdapter 合约
redeemPositions(conditionId, amounts)。
- 普通市场:调用 ConditionalTokens 合约
- 提交(所有调用合并为一批):
- Deposit Wallet:EOA 对 EIP-712
Batch{wallet, nonce, deadline, calls}签名,以WALLET类型提交到relayer-v2.polymarket.com/submit,批次有效期 5 分钟;nonce 不匹配时自动按链上 nonce 重试一次;提交后轮询直至上链; - Proxy / Safe:通过标准 gasless relay 提交并等待回执。
- Deposit Wallet:EOA 对 EIP-712
- 需要初始化时成功创建的 Builder API Key;创建失败时返回错误(Deposit Wallet 报
DW 无 gas 赎回需要 builder 凭证,初始化时未能创建)。
示例
定期自动赎回
python
def main():
while True:
result = exchange.IO("Redeem")
if result and result.get("redeemed", 0) > 0:
Log(f"赎回 {result['redeemed']} 个市场,交易 {result.get('txHash')}")
Sleep(10 * 60 * 1000) # 每 10 分钟检查一次只赎回指定市场
python
cids = [p["Info"]["conditionId"] for p in exchange.GetPosition()
if p["Info"].get("redeemable") and p["Info"].get("slug", "").startswith("btc-updown-5m-")]
if cids:
result = exchange.IO("Redeem", list(set(cids)))
Log("赎回结果:", result)赎回前后对比余额
python
before = exchange.GetAccount()["Balance"]
result = exchange.IO("Redeem")
Sleep(5000)
after = exchange.GetAccount()["Balance"]
Log(f"赎回 {result},余额 {before:.2f} → {after:.2f}")注意事项
- 只对已结算市场有意义:指定 conditionId 时不会检查
redeemable,对未结算市场提交可能导致链上交易失败。 - 失败结果(价值 0)也会被一并赎回以清理仓位,不会产生 USDC。
- 调用会等待交易上链,耗时可能达到数十秒,期间调用阻塞。
- 固定作用于
exchanges[0]。
相关方法
- exchange.GetPosition() - 查看
redeemable仓位 - exchange.IO("GetActivity") - 查询赎回记录(
type=REDEEM) - exchange.IO() - 扩展命令总览