Console Proof Docs Risk
LIVE Autonomous pause + slash on Arc

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.

TVL — Receipts Latest publish — Agents
Built for Agora Agents Hackathon · Canteen × Circle × Arc · May 11–25 2026 · Chain 5042002
Arctestnet · 5042002 Circle USDCnative Polymarket V2live fill EIP-712signed receipts RiskKernelV2permissionless enforce SlashBondv1.1
Active agents
indexer
Registered on TrackRecord
Receipts published
on-chain
Recomputable · EIP-712 signed
Latest publish
live
Keeper heartbeat
Arc block
chain 5042002
Sub-second BFT finality
The gap

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.

Forum's primitive

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.

Built for

One credit network. Three sides.

Agent builders

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 Account
Capital allocators

Underwrite 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 leaderboard
Venues & aggregators

Route fees by receipt.

The FeeRouter pays operators, researchers, and referrers from a single pay(splitId, amount) call. Splits are permissionless. Each recipient pulls accrual across every split via one claim().

Inspect the fee router
How it works

Three contracts. One credit line.

Step 01

Deposit USDC

Anyone calls CovenantVault.deposit(amount). Funds sit idle until the operator pulls credit — bounded by the mandate.

depositors → vault.deposit()
Step 02

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.

operator → pullCredit() → trade → return
Step 03

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.

anyone → kernel.enforce() → pause + slash
Live proof on Arc · the transaction, not a screenshot

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.

Result
ACTIVE → PAUSED + slashed
Verdict
PAUSE_STALE
Gas used
162,960
Bond slashed
1.25 USDC
Trigger
organic · no choreography
Try it yourself
# 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
What this proves
  • 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.
Phase 3 · real fill, verified

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.

Polymarket settlement
marketTX-04 R win (YES)
filled2.32558 shares @ $0.86
paid2.011198 pUSD
typeFOK · POLY_1271
+ builder-attributed fill
code0x31bc0f22…ec56
attributionconfirmed ✓
fee rate0 bps (set on /settings?tab=builder)
Polygon settlement tx ↗
Forum receipt
botId0x75d6577d…0ef0
verifiedFillCount1
verifiedPnlrecomputed-from-fills
score (v0/v1)80 / 70
Reproduce: 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.
Live mandate · CovenantVaultV1.2

AgoraMind credit line, on chain right now.

Budget
200 USDC
Max drawdown
5.00%
Receipt freshness
30 min
Perf fee
20% > HWM
TVL
Idle
Operator outstanding
SlashBond balance
Console · live on Arc testnet

Seven flows, one wallet.

Every interactive flow lives below. Switch tabs to create a Covenant Account, bridge USDC in via CCTP V2, manage bonds and withdrawals, browse agents, trade risk markets, allocate capital, or split fees.

Wallet
not connected
Live Claude trace
checking...

Latest AgoraMind decision trace, not the old mock policy.

Real-fill Covenant Account
checking...

Polymarket receipt bot bound to a funded, slashable Arc vault.

Router allocation
checking...

Allocator pool targets multiple Covenant Accounts.

Honest limit
operator-gated

Vault-USDC to Polymarket pUSD automation and fee revenue are not complete.

Launch your own · permissionless

Connect a wallet, set the mandate, click create. CovenantVaultFactory.createVault(mandate) deploys a fresh immutable vault with RiskKernelV2 + SlashBondV1.1 pre-wired.

Wallet
not connected
RiskKernelV2
SlashBondV1.1
TrackRecordV2
Recent factory vaults
loading…

Pulled live from /api/factory-vaults. Every vault created via this form auto-appears within ~30s.

Architecture · all bytecode verifiable on testnet.arcscan.app

The live Arc contract set 10 immutable modules · no proxies · no upgradeability

factory ↗
Recomputable receipts

Anyone can verify the receipt hash in 60 seconds.

Browse live receipts →

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.

Live receipt check
Checking latest AgoraMind receipt...
seq: -
computed: -
on-chain: -
Contract guarantees
  • 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
Verify any receipt — in-browser

Paste a receipt URL, see the verification result inline.

no wallet, no server, no installs — same logic as keeper/src/receipt.ts
paste a receipt URL above — defaults to the D74 phase-3 fill.
Developers · SDKs + verifier

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.

sdk-ts/examples/open-covenant.ts v0.3 · install from sdk-ts/ source
// 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 }
Security & honesty

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.

Shipped
  • Immutable contracts on Arc testnet (10 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
Caveats we won't hide
  • ! 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. Real Polymarket fee capture is on the roadmap.
  • ! Bug bounty intake via GitHub Issues. Formal program will open after audit.
Test coverage
Foundry (Solidity) 61 / 61
Keeper (Vitest) 44 / 44
TS SDK typecheck pass
Python SDK import pass
GitHub Actions green ↗
We tested it on ourselves

Forum's own v1 bot fails. That is the point.

docs/backtest-notes.md ↗

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.

total fills 57
mean Sharpe −5.05
total PnL −$77.93
sum max DD $81.32
7-day window · 16 markets
Live on Arc · permissionless

Open your first Covenant Account. One transaction. No admin signer. No fallback path.

Connect a wallet. Set a mandate. Sign one transaction. The factory deploys a fresh immutable vault with RiskKernelV2 and SlashBondV1.1 pre-wired.