From c91e9a8c2aa57a37bf3192c5c1c64003fd542bf8 Mon Sep 17 00:00:00 2001 From: jaxperro Date: Thu, 16 Jul 2026 23:44:16 -0400 Subject: [PATCH] =?UTF-8?q?dust=20sweep:=20redeem=20branch=20=E2=80=94=20u?= =?UTF-8?q?ntracked=20resolved=20winners=20collect=20via=20try=5Fredeem,?= =?UTF-8?q?=20booked=20as=20adjustment?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Fable 5 --- copybot.py | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/copybot.py b/copybot.py index 1d3dd875..257b828d 100644 --- a/copybot.py +++ b/copybot.py @@ -1667,12 +1667,31 @@ class Copybot: for p in pos: tok, val = p.get("asset"), p.get("currentValue") or 0 cur, shares = p.get("curPrice") or 0, p.get("size") or 0 - if (not tok or tok in skip or val < self.DUST_MIN_USD - or p.get("redeemable") or not 0.01 <= cur <= 0.99 - or shares <= 0): + if not tok or tok in skip or val < self.DUST_MIN_USD or shares <= 0: continue if tried >= 10: break + if p.get("redeemable") or cur >= 0.99: + # resolved WINNER residual (the 2026-07-17 $1.90 case): the + # tracked-position redeemer never sees untracked tokens, so + # collect here. Refunds/winners pay at the vector price. + cond = p.get("conditionId") + if not (self.redeemer and cond) or market_neg_risk(cond): + continue + tried += 1 + ok, info = self.redeemer.try_redeem(cond) + if ok: + with self.lock: + st["cash"] += val + recovered += val + sold.append(f"redeemed {shares:.2f}sh ≈ ${val:.2f} " + f"{str(p.get('title'))[:36]}") + log(f"DUST REDEEM +${val:.2f} · {sold[-1]}") + else: + log(f"dust redeem failed ({str(info)[:40]}) — retry next pass") + continue + if not 0.01 <= cur <= 0.99: + continue tried += 1 quote = clob_price(tok, "sell") if not quote: