Skip to main content
A condensed chronological record of v0.3-relevant decisions. Full record lives in CLAUDE.md.

2026-06-15. Self-sponsorship backend

User had configured Enoki Portal Allowed Addresses with package ids (wrong field; that section gates senders, not Move targets) so every Enoki sponsorship attempt 403’d. Built POST /v1/sponsor as a pure Sui-native sponsored-tx protocol with no Enoki dependency. Three-strategy signer: self-sponsor → Enoki → direct. Abuse-bounded by per-tx + per-user + global caps in Redis. See Self-Sponsorship.

2026-06-14. zkLogin signing path becomes two-strategy with automatic fallback

Strategy 1: Enoki sponsorAndExecute. Strategy 2: direct execution via EnokiKeypair. The user gets a clean error pointing at their zk address if they’re out of gas. Predict’s package isn’t allowlisted in our Enoki Portal so sponsorship can’t cover it; Strategy 2 unblocks the mint.

2026-06-14. Profile owns PredictManager controls + new useAppAccount

dApp Kit’s useCurrentAccount() returns null for zkLogin users; that blind spot silently disabled BuyPanel’s Create-PredictManager UI on /markets and 7 other pages. Created lib/account.ts → useAppAccount() unifying wallet + zk. Moved PredictManager Create/Deposit/Withdraw + Send DUSDC to /profile. Manager UX belongs on the account page.

2026-06-14. Restrained framer-motion

Added shared lib/motion.ts primitives (fadeUp / fade / stagger / card / tab / numberTick / page / reducedFade). 12-16px lifts, soft easing curve, 220-500ms durations, no springs. Wired into Landing, Markets, AgentDetail, RecentFills, OOPanel. „Restrained motion is the demo polish that separates ‘real product’ from ‘AI-coded mock’ without crossing into casino territory.”

2026-06-14. Optimistic Oracle shipped end-to-end on frontend

Move was deployed since v0.3 but there was no UI. Built OOPanel with full propose / dispute / finalize_auto / finalize_vote lifecycle, state pill with countdown, historical proposals list. The OO→settlement::mark_resolved bridge is a v0.4 republish follow-up; scoped cut intentionally 3 days before submission.

2026-06-14. Owner-only Pause/Resume on-chain kill switch

Move had agent::pause(&mut TradeAgent, &AgentOwnerCap) since v0.3 publish but no events, so the server paused column never updated. Frontend now reads is_active live via sui.getObject and signs pause / resume through the connected wallet. Agent-service tick guard added. Three kinds of off: stop runtime / pause on-chain / reclaim DUSDC.

2026-06-14. Per-agent detail route + Groq model selector in wizard

/agents/:agentId replaces in-place expand with a proper detail page (performance hero with equity curve, open positions, scrollable settlements, sticky right column with Owner controls + Identity + Custody explainer + reputation). Wizard gains a Groq model picker baked into the success-panel env snippet. Model choice is runtime config, not chain state.

2026-06-12. Portfolio Value rolls up everything

Cash (wallet + manager) + predict positions at live mark + event-market YES/NO at pool mid + open-vault deposits at cost. Section 8 audit caught silent asset drops (the old headline was ignoring event positions + vaults). Fixed via lib/binary-holdings.ts + useBinaryHoldingsValue.

2026-06-12. Per-agent mandates + LLM provider presets

AGENT_PROMPT_FILE points at a markdown brief injected into the system prompt below the hard rules so a mandate can never override guardrails. Samples: prompts/momentum.md, prompts/contrarian.md. LLM_PROVIDER (groq | anthropic | openai | ollama) presets base URL + default model.

2026-06-12. Backend dockerized

One root Dockerfile (node:22-slim + corepack pnpm + tsx, no build step). Compose services for api/indexer/quote-worker/resolver + a one-shot migrate (drizzle) + opt-in agent profile. docker compose up -d --build is the canonical start.

2026-06-12. Limitless-style “Up or Down” surface

UpDownStrip quick cards on the crypto tab (15 Min / Hourly / Daily). Baseline = Pyth 1-min close rounded to the dollar. Up/Down buttons deep-link ?strike=&side=. New PriceLineChart (baseline series green/red around the selected strike) replaces TradingView candles as the default; candles kept behind a toggle.

2026-06-11. DEEP grant landed → V3 books live

DeepBook team granted 1000 DEEP + 200 DUSDC. create-v3-pools consumed the 2×500 creation fees; seed-v3-liquidity bootstrapped 50 × bid/ask on both books at 0.45/0.45/0.55; keeper-tick rested 1.9 YES + 1.9 NO asks @ $0.55 via TradeCap. Swap path proven both directions with real taker fills.

2026-06-11. TxSigner.sign() asserts on-chain success

Waits for waitForTransaction({showEffects}) and throws a humanized error on MoveAbort. Fixes all 11 sign call sites at once. Caught a $10 trade that aborted on-chain but had shown “Trade submitted ✓” in the panel.

2026-06-11. /markets dedupes oracles by (asset, expiry)

Testnet Predict runs two parallel ladders. Four expiries each had two live oracles with identical titles. allMarkets memo keeps the freshest book. lastUpdateMs 1h primary, fillCount tiebreak.

2026-06-09. Pivot to V3-everywhere

Outcome markets onto V3 pools, vault holds a BalanceManager, agents trade via TradeCap. Internal AMM (outcome_market.move) deleted. Seal-encrypted intent feature deleted in favor of vault-based privacy. Per-market = per-Move-package; templating + a registry.json is simpler than a factory contract or admin allowlists.

2026-06-09. Auto-settle keeper, one position per PTB

Not batched. Memo: success = never re-fire, failure = 30 min backoff. Always self-pays (Enoki allow-list rejects Predict targets). Batching aborted the whole tx whenever a single position had a stale quantity.