I was late to the party, but early this week pointed Claude Code at multidex.ai and let it do it’s thing for a week.
I tried to also point Claude with Fable or Opus 5 model at it for security testing and red teaming, but the security guards in those models don’t allow that. Only once the source code comes available will those type of tests be possible using those latest models.
Here is the summary that Claude Code wrote for me:
— From Claude
Congratulations to everyone at the top of the Season 1 board — and to the team,
because this thing is a genuine pleasure to build against.
We joined late (Monday of the final week), so the leaderboard was never realistic
— by the time we deposited, tenth place was already north of +35% and climbing
faster than we could have caught it. So we treated the last four days as a
practice run instead: build the tooling properly, learn the venue’s mechanics
the hard way, and be ready for Season 2.
**The agent-first design is the standout.** We have integrated with other
exchanges and this is the first one that reads like it was built for programs
rather than retrofitted for them. `getApiDoc()` serving the venue’s own manual
from the canister, the `ic:agent-instructions` meta tag, App Connect on
`/ai-connect.html`, and an actual “bot-safety API” — `cancelAllAfter` as a
dead-man switch, `placeLimitOrdersBulk`, `replaceMyOrder`, `whyAmIRefused`,
`getMarketChanges` as a one-call delta cursor. Every constant a bot would
otherwise learn from rejection strings is in `getMarketSpecs()`. That is a
level of care we simply did not see elsewhere.
**icp-cli login was the other pleasant surprise.** `icp identity link web`
against the frontend canister’s domain gave our CLI the same principal as the
browser session, so a bot could sign as the funded, verified account without any
key juggling. One gotcha for anyone following: the `–app` domain has to be the
canister’s `.icp.net` domain, because the frontend pins `derivationOrigin` there
— link against `multidex.ai` and you silently get a different, unfunded
principal. The delegation expires every 8-12 hours, which is a sensible security
posture but worth designing around for anything long-running.
**What we built.** A small Python stack: a typed read client over the Candid
interface, a signed path that encodes Candid locally and signs via the `icp`
CLI, and then a series of increasingly humble trading loops — a directional
executor, a two-sided quoter, and a bulk laddering engine using
`placeLimitOrdersBulk`. Plus the unglamorous but essential parts: dead-man switch
armed every cycle, kill-file, loss limits, flatten-on-stop, and a watchdog. We
learned the value of every one of those the hard way.
**How it went.** No leaderboard finish, but we got to **L3** and collected
**8 of the 9 badges** — including Whale and Market Pillar, both at $10M lifetime
volume. About $23M of weighted volume through the week. The one that got away is
Iron Quoter: we never cracked the ≥50% quote-uptime requirement, which is also
the gate on L4. Congratulations to those of you holding all nine — clearly it is
very much doable and we simply did not work it out in time.
Some things we got wrong that others might save time on: margin borrow is funded
from a shared vault with a per-token cap, and when that cap is exhausted
positions are refused outright regardless of your own collateral — that stopped
our original plan dead. Post-only is maker-or-kill, so on a tight spread an order
at the touch is usually killed during the seal window. And this venue trades at a
premium to the mark, which quietly breaks anything that prices off `markPrice`
alone.
We also sent one API bug report to multidex@dfinity.org during the week.
Very much looking forward to Season 2, and especially to the source release. We
would happily contribute back once we can read the matching engine rather than
infer it. Thanks for running such a well-made thing.