Search projects, hackathons, sponsors and tech

    ← All projects

    Arcaidia

    Permissionless Cross-Chain Liquidity & Intelligence Market for Arc

    Demo

    About

    Arcaidia is a permissionless intent liquidity market for moving USDC across chains, and for turning it into a different token on the far side, built on Circle's CCTP V2 between Ethereum and Arc. A user signs one intent: "this much USDC from this chain to this recipient on that chain, at most this fee, by this deadline", optionally naming a token to receive instead of USDC and the minimum they will accept. The router pulls the USDC and initiates the canonical CCTP burn in the same transaction. From there the money arrives in one of two ways, tracked separately and never conflated: in seconds, if a liquidity vault advances it, or in minutes through canonical settlement if none does. The vaults are the market. Anyone deploys one through a factory, posts an immutable utilisation-tiered fee policy, deposits USDC, and runs the open-source solver. Solvers are autonomous agents: each discovers intents through The Graph, independently re-verifies the source transaction over RPC, prices the risk deterministically against its vault's live liquidity, exposure and settlement health, and signs a short-lived EIP-712 authorisation, through a Circle Agent Wallet for the house vault. The vault verifies that signature on chain, enforces the user's fee cap and its own posted tier, and pays the recipient from its own capital. The first valid fill wins on chain. When Circle's attestation lands, the settlement receiver proves the message, reads the intent from the CCTP hook data the router burned in, and reimburses whichever vault filled; if none did, it pays the recipient directly. No solver ever touches funds, and nothing in the protocol trusts a solver's word. Trade intents extend this with one adapter: for a non-USDC token out, the vault swaps through a Uniswap V2 market on the destination chain inside the same fill and falls back to delivering USDC if the swap cannot meet the user's floor. On top sits an agent economy: the relay computes ecosystem intelligence (liquidity, fee band, scarcity, settlement latency) from the indexed market, and sells it per request over x402 on Hedera. The house solver buys the view it decides with from its own Hedera account on every intent, and in selective mode uses it to hold under-priced fills when capital is scarce, while two independent operators run unpaid and fill the same intents. The site shows all of it: a console per vault with live solver telemetry, a liquidity page with the market state, an intelligence page where a visitor can pay for an answer from the browser, a self-service Earn flow that deploys a vault on both chains and hands the operator a one-command solver, and Transfer and Trade pages with live candles and the cross-chain spread. Three vaults, three solvers, a traffic generator, the market bot and the paywall have been running around the clock on both testnets.

    How it's made

    The protocol is five Solidity contracts (router, liquidity vault, vault factory, intent market, settlement receiver) deployed at identical CREATE2 addresses on Ethereum Sepolia and Arc Testnet from one deployer, so the same bytecode serves both directions. The router calls Circle's TokenMessengerV2 depositForBurnWithHook, encoding the intent id and recipient in the hook so settlement is bound to the intent rather than asserted by anyone. The receiver calls receiveMessage on Circle's MessageTransmitterV2 with the real attestation and decodes the burn body; we learned the hard way that the header's recipient field is Circle's own contract, not ours, and carry the real 472-byte message as a golden test vector. Vault safety is enforced entirely on chain: reserve floor, per-fill and exposure caps as live percentages of total assets, replay nonces, expiry, signer allowlist, the user's fee cap and the vault's posted tier, checked before any transfer, with an atomic claim on the intent market so the race has one winner. Everything off chain is TypeScript in a pnpm monorepo. @arcaidia/domain is the single schema: canonical intent v1.1, decision types, ports, config and generated ABIs, shared by contracts tests, solver, relay, indexer views and web. The solver reads The Graph's Nest indexer (SQL over HTTP, hosted by the Graph team) for pending intents, vault state and settlement health, then checks every "pending" intent against the settlement receiver on chain because the indexer lags fills by independent vaults; that one check is what stopped all three solvers from wrongly refusing every fill as a settlement backlog. Risk is a pure function over deterministic inputs; every decision is logged with the exact inputs behind it. The house solver signs through a Circle developer-controlled Agent Wallet; independent operators use local keys generated in the browser on Earn. The Hedera piece uses @x402/express in front of the relay with the Blocky402 testnet facilitator and HBAR pricing, and @x402/fetch plus the Hiero SDK in the solver, which caps its spend per answer and records every settlement receipt into its decision narrative and telemetry heartbeat; the intelligence page pays from the browser with a polyfilled Buffer for the Hedera SDK. The Uniswap market is our own 0.8.28 fork of Uniswap V2 with four mock tokens against real USDC, a bot that trends and rebalances the pools so prices drift between chains, a price API that never emits a price as a JSON number (everything is an e18 string), and an ISwapAdapter the vault calls inside fastFill behind try/catch so a failed swap still delivers USDC. The solver's trade gate asks the deployed adapter about the post-fee amount, the same amount the vault will swap, which was a real bug we caught in the handoff. The frontend is TanStack Start with Privy as the wallet layer, viem for every read and write, lightweight-charts for the candles, and a hard rule that no number is ever fabricated: every figure is real or rendered as unavailable. The whole stack ships as one Docker image whose entrypoint is chosen by an env var, built on a laptop and streamed to a 4 GB AWS box behind Caddy, after we watched a 2 GB box spend an hour swapping while it tried to build seven images. Hackiest but honest: the relay and solver keep a list of retired receiver addresses and ask every one of them whether an intent settled, because the D12 receiver replacement left intents settled on a contract nobody points at any more.