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 — on the Arc testnet
deployment of RiskKernelV2 (May 2026).
The contract is now live on Arc mainnet.
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 anchored to TrackRecordV2 on Arc testnet
(the mainnet TrackRecordV2 went live 2026-10-14).
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.
Forum keeper credit line, on chain.
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 decision trace of the Forum keeper (AgoraMind, mainnet).
The CovenantVaultV3 the keeper draws bounded credit from — funded, slashable.
CapitalRouter: allocator pool targeting multiple Covenant Accounts.
Funds stay in the vault. The operator draws bounded credit, never custody.
The keeper runs agora-mind-keeper.mjs off-UI. Users inspect custody,
receipts, and risk state instead of pressing a deploy-funds button.
CovenantVaultFactoryV2, separate from the keeper's own vault.
The keeper decides and calls pullCredit inside the mandate. 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 Arc mainnet contract set —
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
/receipts/…/.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, defineChain, http, zeroAddress } from "viem"; import { ForumClient } from "forum-arc-sdk"; // Arc mainnet, passed explicitly (the SDK's bundled ARC_TESTNET / ARC_TESTNET_DEPLOYMENT exports are the testnet ones) const arc = defineChain({ id: 5042, name: "Arc", nativeCurrency: { name: "USDC", symbol: "USDC", decimals: 18 }, rpcUrls: { default: { http: ["https://rpc.mainnet.arc.io"] } }, }); const publicClient = createPublicClient({ chain: arc, transport: http() }); // 2. point the client at the mainnet contracts (deployments/arc-mainnet.json) const forum = new ForumClient({ publicClient, addresses: { registry: zeroAddress, config: zeroAddress, // testnet-only v1 modules, trackRecord: zeroAddress, feeDistributor: zeroAddress, // not deployed on mainnet trackRecordV2: "…", covenantVaultFactory: "…", covenantVault: "…", // the keeper's vault riskKernel: "…", } }); // 3. read live state · anyone can call this const snapshot = await forum.covenantVault.snapshot(); const verdict = await forum.riskKernel.evaluate(); // defaults to addresses.covenantVault const vaults = await forum.covenantVaultFactory.allVaults(); // → snapshot.state "ACTIVE", verdict "ALLOW" // Opening your own vault (bond-gated) is the Create tab of the console.
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 mainnet — all 8 modules live and Sourcify-verified (exact match), no proxy, no upgradeability
- ✓ Permissionless
enforce(vault)· autonomous pause + slash proven on Arc testnet, May 2026 - ✓ 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 — mainnet is a capped pilot with real funds. Deposit only what you can afford to lose.
- ! 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.