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 leaderboardRoute 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().
Three 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.
# 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.
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.
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.
Vault-USDC to Polymarket pUSD automation and fee revenue are not complete.
Connect a wallet, set the mandate, click create. CovenantVaultFactory.createVault(mandate) deploys a fresh immutable vault with RiskKernelV2 + SlashBondV1.1 pre-wired.
Pulled live from /api/factory-vaults. Every vault created via this form auto-appears within ~30s.
The live Arc contract set 10 immutable modules · no proxies · no upgradeability
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 (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
- ! 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.
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.