CLAUDE.md.
2026-06-15. Self-sponsorship backend
User had configured Enoki PortalAllowed 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 viaEnokiKeypair. 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 sharedlib/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. BuiltOOPanel 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 hadagent::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 vialib/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 rootDockerfile (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.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.