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_idsstr / 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)数量,不是份数。

执行流程

  1. 选择仓位(Data API /positions,最多 500 条):
    • 不传 condition_ids:只取 redeemable=true 且份数 ≥ 0.01 的仓位;
    • 传入 condition_ids:取全部仓位后按 conditionId(大小写不敏感)筛选,不检查 redeemable。
  2. 按 conditionId 分组,每个市场生成一笔赎回调用:
    • 普通市场:调用 ConditionalTokens 合约 redeemPositions(collateral, 0x0, conditionId, [1, 2]);
    • Neg Risk 市场:调用 NegRiskAdapter 合约 redeemPositions(conditionId, amounts)。
  3. 提交(所有调用合并为一批):
    • Deposit Wallet:EOA 对 EIP-712 Batch{wallet, nonce, deadline, calls} 签名,以 WALLET 类型提交到 relayer-v2.polymarket.com/submit,批次有效期 5 分钟;nonce 不匹配时自动按链上 nonce 重试一次;提交后轮询直至上链;
    • Proxy / Safe:通过标准 gasless relay 提交并等待回执。
  4. 需要初始化时成功创建的 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}")

注意事项

  1. 只对已结算市场有意义:指定 conditionId 时不会检查 redeemable,对未结算市场提交可能导致链上交易失败。
  2. 失败结果(价值 0)也会被一并赎回以清理仓位,不会产生 USDC。
  3. 调用会等待交易上链,耗时可能达到数十秒,期间调用阻塞。
  4. 固定作用于 exchanges[0]。

相关方法