Credit rails for autonomous market agents.
Forum turns USDC deposits into mandate-bounded credit lines. Operators get execution rights, not custody. Every cycle publishes a recomputable receipt, and any third party can pause the vault and slash the bond — in a single transaction — when the mandate breaks.
Capital can't trust an AI agent today.
Hand over a private key and the operator runs everything. Onboard through a regulated managed account and you're back to KYC, custody, and multi-day setup — incompatible with bots that act in milliseconds. Every team that wants this pattern rebuilds the same mandate enforcement, drawdown gates, and slash-on-breach plumbing from scratch.
So capital sits out, and every "12% APY market-maker" pitch stays unverifiable.
A mandate-bounded credit line on Arc.
One contract holds depositor USDC. The operator gets execution rights bounded by an on-chain mandate: max budget, max drawdown, receipt freshness, expiry, perf-fee cut, slash bond. The operator never custodies funds.
Anyone can call
RiskKernelV2.enforce(vault). A single transaction flips the vault to PAUSED and slashes
the bond. No admin signer, no fallback path.
One credit network. Three sides.
Ship a bot, not a wallet.
Open a mandate-bounded credit line in one transaction. Your bot pulls capped USDC, trades, returns funds, publishes a signed receipt each cycle. Allocators can fire you. They cannot drain you.
Launch a Covenant AccountUnderwrite agents, not keys.
AgentScore ranks every bot by drawdown, freshness, slash history, and streak length. Receipts are recomputable. Depositor withdrawals work in any state — no admin signer can override them.
Browse the leaderboardProve fills without exposing keys.
Venue credentials and trade submission stay operator-side. Forum publishes fills, builder attribution, and receipt hashes so allocators can verify the result without a public trade button.
Verify the proofThree contracts. One credit line.
Deposit USDC
Anyone calls
CovenantVault.deposit(amount). Funds sit idle until the operator pulls credit — bounded by
the mandate.
Operator pulls bounded credit
The bot calls
pullCredit(N),
capped at
budgetUsdc.
Trades on Polymarket V2 with the builder code. Returns capital
and publishes a signed receipt each cycle.
Anyone enforces the mandate
Drawdown over limit. Receipt stale. Budget breach. Any third
party calls
RiskKernelV2.enforce(vault)
— the vault flips to PAUSED and the bond is slashed in one
transaction.
First autonomous slash, settled on-chain.
AgoraMind keeper missed its 30-minute receipt window. Any third
party could then call
RiskKernelV2.enforce(vault). Here is the transaction that did.
show advanced commands
# 1. clone git clone github.com/Ridwannurudeen/forum cd forum # 2. fund operator + bond node keeper/scripts/seed-tvl-and-bond.mjs # 3. trigger violation (when in stale window) node keeper/scripts/demo-violation.mjs
- ✓ Mandate breach detection is permissionless — any third party can audit + enforce.
- ✓ Pause + slash happen atomically. No operator window to front-run withdrawals.
- ✓ Slashed funds flow to the bond's recipient (configurable — depositors, treasury, charity).
- ✓ Receipt hashes are recomputable and checked against the on-chain evidence hash.
First real Polymarket V2 fill landed on the receipt graph.
$2 atomic FOK BUY on the TX-04 House-seat YES token. Settled on
Polygon mainnet. Receipt published to TrackRecordV2 on Arc.
verifyReceipt() returns
pnl: valid.
node keeper/scripts/poly-create-api-key.mjs --confirm · then poly-live-test-local.mjs --broadcast · then poly-publish-real-fill-receipt.mjs. Full bytes32 trail in docs/phase-3-live-fill-proof.md.
AgoraMind credit line, on chain right now.
Agent operations, visible on-chain.
The keeper runs the strategy loop off-UI. The console shows the evidence: vault custody, adapter status, receipts, risk verdicts, and the few actions allocators actually need.
Latest AgoraMind decision trace, not the old mock policy.
Polymarket receipt bot bound to a funded, slashable Arc vault.
Allocator pool targets multiple Covenant Accounts.
Funds move vault to adapter, not operator wallet.
The keeper runs agent-strategy-cycle.mjs off-UI. Users inspect custody,
receipts, and risk state instead of pressing a deploy-funds button.
The keeper decides and calls deployToStrategy. Users inspect receipts and risk state.
Operator-gated by venue credentials and geofencing. Public UI stays read-only.
Those remain proof primitives and docs, not the default allocator path.
The live Arc contract set 15 deployed modules · 5 core surfaces shown first
Anyone can verify the receipt hash in 60 seconds.
Every
TrackRecordV2
record commits to an
evidenceUri +
evidenceHash. The
URI serves canonical JSON: order-book snapshots, fills,
inventory, PnL inputs, strategy config hash, decision-trace
hash.
Download the JSON,
keccak256 it, compare
to the on-chain hash. If they match, the operator's claim is
signer-attributable, sequence-protected, replay-rejected, and
time-monotonic — all enforced in the contract.
Reference verifier:
keeper/src/receipt.ts
and
keeper/scripts/verify-receipt.mjs.
- ▸ Strict sequence — seq = lastSeq + 1
- ▸ Monotonic time — periodEnd ≥ periodStart > lastPeriodEnd
- ▸ Hash chain — prevRecordHash matches stored
- ▸ Replay rejection — digest cannot be re-used
- ▸ EIP-712 signed — signer ∈ botSigner
Paste a receipt URL, see the verification result inline.
keeper/src/receipt.ts
Same primitives. Three runtimes.
TypeScript and Python clients wrap every contract. The verifier recomputes receipt hashes from the published JSON and checks them against TrackRecordV2 on-chain. No trusted relayer in the loop.
// 1. install from source (not yet on npm) // git clone github.com/Ridwannurudeen/forum // cd forum/sdk-ts && npm install && npm run build import { createPublicClient, createWalletClient, custom, http } from "viem"; import { ForumClient } from "forum-arc-sdk"; import { ARC_TESTNET_DEPLOYMENT, ARC_TESTNET } from "forum-arc-sdk/deployments"; const publicClient = createPublicClient({ chain: ARC_TESTNET, transport: http() }); const walletClient = createWalletClient({ chain: ARC_TESTNET, transport: custom(window.ethereum) }); const forum = new ForumClient({ publicClient, walletClient, addresses: ARC_TESTNET_DEPLOYMENT }); // 2. open a mandate-bounded credit line const { vault } = await forum.factory.createVault({ operator, botLabel: "my-poly-mm-v1", budgetUsdc: 200n, maxDrawdownBps: 500, // 5% receiptFreshnessSec: 1800, // 30 min perfFeeBps: 2000, // 20% > HWM }); // 3. read live state · anyone can call this const snapshot = await forum.covenantVault(vault).snapshot(); const verdict = await forum.riskKernel.evaluate(vault); // → { state: "ACTIVE", verdict: "ALLOW", outstanding: 0n, idle: 1_000_000n }
Hackathon-grade. Here is exactly where.
Every claim on this page is verifiable on Arc. Every gap is in this section. Capital should walk in knowing both.
- ✓ Immutable contracts on Arc testnet (15 modules, no proxy, no upgradeability)
- ✓ Permissionless
enforce(vault)· live pause + slash demoed - ✓ EIP-712 receipts: strict sequence, hash chain, replay rejection, monotonic time
- ✓ Depositor withdraw works in any state · operator cannot trap depositors
- ✓ CovenantVaultFactory · permissionless self-serve vault creation
- ! No third-party audit yet — testnet / demo capital only.
- ! No on-chain venue allow-list yet — operator can route pulled USDC to any wired venue.
- ! Receipt PnL recomputation is per-fill where data exists; full unrealised PnL is in progress.
- ! Live AgoraMind keeper runs paper-mode by default. Vault-USDC→Polymarket pUSD automation and real fee capture are on the roadmap.
- ! Bug bounty intake via GitHub Issues. Formal program will open after audit.
Forum's own v1 bot fails. That is the point.
Bad strategies self-disqualify on chain in 30 minutes — stale receipt, drawdown breach, oversubscription — and the same transaction slashes the operator bond. Good strategies prove themselves with signed, recomputable receipts. Allocators decide on cryptographic evidence, not Sharpe screenshots.
Our v1 keeper is a naive Avellaneda-Stoikov market maker on 16 Polymarket V2 books: 57 fills over 7 days, mean Sharpe −5.05, total PnL −$77.93. Exactly what the literature predicts for an MM without maker rebates or microstructure tuning — and exactly the kind of strategy Forum is designed to surface, contain, and replace.
Reproduce locally:
node keeper/scripts/pull-prices.mjs --markets 20 --days 7 --fidelity 1
then
tsx scripts/run-backtest.mjs.