Home  /  Documentation

Oneliq Documentation

The engineering reference for the unified stablecoin terminal on Arc. Oneliq puts Circle's stablecoin stack - Gateway, CCTP V2, Programmable Wallets, USDC, EURC - behind a single non-custodial UI on the Arc Layer 1. This guide covers every live product surface, the on-chain contract registry, the proxy API, and the security baseline.

Public Beta · Arc Testnet Version 0.10.0 Updated 2026-08-11

Introduction

Oneliq is a unified stablecoin platform that simplifies how people use USDC across chains. Built on Circle's infrastructure and designed for the Arc Layer 1, Oneliq brings trading, cross-chain balance management, automation, and onboarding into one seamless experience. Six surfaces, one balance, zero custody:

SurfaceWhat it doesBuilt on
TradeSpend USDC anywhere - swap inside Arc (USDC ⇄ EURC) or bridge cross-chain. One panel, one source picker (wallet + Gateway pre-deposits), one destination. The output can be parked straight into your Unified Balance.OneliqRouter → Circle Curve pool + CCTP V2
Unified BalanceOne USDC balance across every supported chain. Deposit from any chain, spend instantly on Arc - no bridge clicks, no wrapped tokens. Batch Pay and Consolidate sit on top of the same engine.Circle Gateway V1
Oneliq AI previewDescribe what you want in plain language; the assistant drafts the automation rule, the swap, or the cross-chain payment and hands it to you to sign. Daily safety cap, revocable anytime.Cloudflare Workers AI + Circle Programmable Wallets
PortalDaily on-chain check-in with Star Points, streaks, badges, referrals, and a live leaderboard - the loyalty layer over everything else.OneliqCheckIn on Arc L1
HistoryA receipt-style feed of every Trade, Balance, and Agent moment on your USDC activity. Filter by surface, jump to the chain explorer in one click.Per-wallet history API + agent API
DashboardYour portfolio home. Total value with 24h change, holdings per token, allocation donut, unified balance across Gateway chains, and recent activity.Read-only aggregator

Who is this for?

Design principles

Architecture

Oneliq is a thin frontend over Circle's stablecoin stack and the Arc Layer 1. We deploy exactly two small contracts on Arc - OneliqRouter (the swap fee router) and OneliqCheckIn (Portal check-ins) - and neither can hold your balance. Everything that moves value is Circle's. What lives on our origin is static HTML, a few KB of shared JavaScript, a handful of stateless proxy routes, and two Cloudflare Workers.

# Oneliq layered architecture
┌─ UI Layer ────────────────────────────────────────────────────────────┐
│  index · trade · balance · agent · portal · history · dashboard       │
│   plain HTML + CSS + vanilla JS, no framework, no build step          │
└────────────────────────────────────────────────────────────────────────┘
                                  
┌─ Shared JS modules (assets/) ─────────────────────────────────────────┐
│  arc-core.js       → chain registry, token registry, ABIs, RPC      
│  arc-gateway.js    → Circle Gateway client (deposit, transfer, mint)
│  arc-appkit.js     → Circle App Kit wallet picker (EIP-6963)        
│  arc-ui.js / .css  → shared UI atoms (modal, toast, skeleton, nav)  
└────────────────────────────────────────────────────────────────────────┘
                                  
┌─ Cloudflare Pages Functions (proxies, agent, AI, Portal) ─────────────┐
│  /api/circle-proxy/*   → CCTP V2 IRIS attestation API                 
│  /api/gateway-proxy/*  → Circle Gateway public REST API               
│  /api/agent/*          → register / list / pause / revoke agents      
│  /api/ai/*             → Oneliq AI chat on Workers AI                 
│  /api/history/*        → per-wallet Trade / Balance receipts          
│  /api/recipients/*     → saved payees for Batch Pay                   
│  /api/metrics/*        → aggregated read-only telemetry rollup        
│  /auth/*               → Portal check-in, points, streaks, leaderboard
└────────────────────────────────────────────────────────────────────────┘
                                  
┌─ Cloudflare Workers (scheduled) ──────────────────────────────────────┐
│  agent-cron       → scans rules, fires Programmable Wallet executions  
│  kv-backup        → nightly KV snapshot of profiles and history        
└────────────────────────────────────────────────────────────────────────┘
                                  
┌─ External protocols (we don't operate any of these) ──────────────────┐
│  Arc L1                  → EVM execution + USDC native gas               
│  Circle Gateway          → GatewayWallet / GatewayMinter + REST API      
│  Circle CCTP V2          → TokenMessenger / MessageTransmitter + IRIS    
│  Circle App Kit Swap     → same-chain USDC ⇄ EURC routing on Arc         
│  Circle Programmable     → smart-account executor + Paymaster gas        
│      Wallets               sponsorship for the agent                     
└────────────────────────────────────────────────────────────────────────┘

What "non-custodial" means in practice

Quick start

From a fresh browser to your first cross-chain USDC spend in five steps.

  1. Install a wallet. MetaMask, Rabby, Coinbase Wallet, Frame, or any EIP-6963-compliant browser wallet. See Supported wallets.
  2. Add Arc Testnet. Open oneliq.xyz/trade, click Connect, and approve the network prompt. Manual params are in the Network info table below.
  3. Get testnet USDC. Use the Circle faucet on your address. Arc uses USDC as native gas, so one faucet drip covers both spending and gas fees. The same USDC works for Trade, Balance, and Agent.
  4. Open Balance. Deposit USDC from any supported chain (Sepolia, Base, Fuji, Arbitrum, OP, Polygon, Unichain) into the Gateway. Your unified balance updates in seconds.
  5. Spend from Balance. Pick a destination chain and recipient. Multi-source unified spend pulls from N chains in one signature and mints native USDC on the destination. Trade is the surface for swapping and bridging instead.
Tip
For fastest testnet deposits, use Avalanche Fuji as your source chain - Gateway credits show up in ~30 seconds. Ethereum Sepolia takes 12–15 minutes (two beacon-chain epochs of finality).

Wallet setup

Oneliq uses EIP-6963 for wallet discovery - the multi-injector standard that replaced the old window.ethereum singleton. Any wallet that announces itself via eip6963:announceProvider appears in our wallet picker, ranked by RDNS so the choice is deterministic when multiple wallets are installed.

Once connected, the session is held entirely in browser memory. There is no auth cookie, no JWT, no session token issued by Oneliq.

Adding Arc Testnet manually

If your wallet doesn't auto-prompt or you prefer to add the network by hand:

FieldValue
Network nameArc Testnet
RPC URLhttps://rpc.testnet.arc.network
Chain ID5042002 (0x4cef52)
Currency symbolUSDC
Block explorertestnet.arcscan.app

Get testnet USDC

Arc Testnet uses USDC as the native gas token. You need USDC for both transaction fees and for whatever you want to do with it (deposit, swap, agent funding). One faucet call covers both.

  1. Visit faucet.circle.com.
  2. Select Arc Testnet from the network dropdown.
  3. Paste your wallet address - delivery is typically under 30 seconds.
  4. Faucets are rate-limited per-address per-day. If you hit the limit, come back tomorrow or grab USDC on Sepolia / Base / Fuji and use Unified Balance to make it spendable on Arc.
Testnet only
Every asset on this network is a testnet token with no monetary value. Never send mainnet USDC or real funds to a testnet address - they are unrecoverable.

Trade

The /trade page is the spend surface. It unifies same-chain swap (USDC ⇄ EURC on Arc via OneliqRouter into Circle's Curve pool) and cross-chain bridging (USDC anywhere via CCTP V2) into a single panel. Source picker shows your wallet balances plus your Circle Gateway pre-deposits, ranked so the path with the lowest friction floats to the top.

Same-chain swap (Arc internal)

USDC ⇄ EURC swaps on Arc route through our own OneliqRouter contract, which forwards the trade into Circle's Curve StableSwap pool and takes a transparent 0.30% on-chain protocol fee (hard-capped at 1%). Circle App Kit Swap remains integrated for quoting/routing. Quote latency is debounced at 150 ms on the source-amount input.

Cross-chain spend (CCTP V2)

  1. Choose source chain and destination chain (any pair from the 8 supported).
  2. Enter USDC amount and recipient address (defaults to your own).
  3. Pick a finality mode - Fast (~20 s, small Circle fee) or Standard (13–19 min, zero fee).
  4. Burn on source - calls TokenMessengerV2.depositForBurn(amount, destDomain, recipient, burnToken, ...).
  5. Wait for Circle's IRIS attestation, then mint on destination - calls MessageTransmitterV2.receiveMessage(message, attestation). Oneliq submits the receive automatically when the attestation arrives.

Trade panel features

Latency is dominated by the slowest chain
Arc has sub-second deterministic finality, so an Arc → other-chain bridge waits only on the destination's finality clock. An Ethereum Sepolia → Arc bridge waits 13+ minutes for two beacon-chain epochs before Circle issues the attestation. Fast-finality mode short-circuits this for supported pairs.

Unified Balance

The /balance page is the centerpiece of Oneliq. It uses Circle Gateway V1 to give you a single USDC balance that's spendable on every supported chain - no bridge clicks, no chain switching, no wrapped tokens.

How it works

Each Gateway-supported chain has a GatewayWallet contract at the same deterministic address (CREATE2 with the same salt). You deposit USDC into the wallet on whichever chain you currently hold it. Circle's Gateway service issues attestations that authorize a fresh mint of native USDC on the destination chain - the USDC you spend is always native USDC, not a wrapped derivative.

Deposit flow

  1. Select a source chain with a USDC balance (Sepolia, Base, Arbitrum, OP, Polygon Amoy, Fuji, Unichain).
  2. Approve the GatewayWallet to pull USDC (one-time per chain per token).
  3. Deposit - your USDC moves from your wallet into the GatewayWallet contract on that chain.
  4. Done. Your unified balance updates in seconds (Fuji ~30s, Sepolia ~12-15 min). Spendable everywhere Gateway is supported.

Spend flow (mint on Arc)

  1. Submit an EIP-712 signed burn intent to Circle's Gateway service via POST /v1/transfer.
  2. Gateway validates available balance across all your deposits, signs an attestation.
  3. Your wallet calls GatewayMinter.gatewayMint(attestation, signature) on the destination chain.
  4. Native USDC appears on the destination, ready to spend or hold.

Spend: three modes

The ↗ Spend modal lets you choose how the source funds are allocated. You enter a recipient, an amount, and a destination chain; the mode decides where the USDC comes from.

ModeSourcingUse case
⚡ AutoOneliq picks source chains for you, available-USDC first. If no single chain covers the amount, it aggregates several into one BurnIntentSet and settles in one signature.The default - just spend without thinking about where funds sit.
SingleThe full amount is drawn from one chain you pick.Predictable draw-down when you know which balance to drain.
ManualYou set an amount from each chain individually; the spend is assembled from your custom allocation.Full control over exactly how each leg settles.

In every mode, a partial-liquidity route that spans several chains is still a single EIP-712 signature: one BurnIntentSet → one attestation → one mint on the destination. No popup-per-chain.

Estimate before you sign

Before the wallet popup, Oneliq shows the route, the per-intent fee, and the recipient outcome via ARC.gateway.estimateSpend(). Cost is visible up front. When a spend can't be fully covered, the UI names why - insufficient balance, no viable route, or needs aggregation across sources - instead of a generic error.

⇉ Batch Pay

Batch Pay sends USDC to many recipients from one Unified Balance. Each recipient has its own address, amount, and destination chain. Oneliq runs a non-overlapping allocation across your balances so no chain's funds are double-spent, then groups recipients by destination chain: one signature per destination. Recipients that all land on the same chain settle in a single signature; a payout spanning K destination chains becomes K signatures, one click each. Built for payroll, contributor payouts, or fanning funds out to a set of wallets.

Rows can be typed one at a time or pasted in bulk - address, amount, chain per line, with the chain column optional. Everyone you successfully pay is remembered in a recipient book stored against your wallet address, so the list follows you to another browser or device instead of living in one browser's storage.

Circle's per-request rules
A single BurnIntentSet must share one destination domain, so cross-chain batches are grouped per destination. Each group is also capped at 16 intents per request. Note the cap counts intents, not recipients: every source chain a recipient draws from is its own intent, so a fragmented balance uses the budget faster. Oversized groups are split into extra signatures automatically, and the preview says how many and why.

⤵ Consolidate

Consolidate is the mirror of Batch Pay. It sweeps your entire spendable balance from every chain except a chosen destination onto that one chain, in a single signature, minting back to your own wallet. It reuses the Auto-spend engine with the recipient set to you. Chains whose balance is too small to clear their per-intent fee floor are skipped automatically (and listed in the preview) rather than failing the whole sweep. Use it to tidy dust across chains or stage liquidity where you need it next.

If you close the tab mid-transfer

A forwarded spend is recorded locally the moment it is submitted, together with the attestation needed to finish it. Reconnect the same wallet and Oneliq re-checks the transfer with Gateway: already minted, it just clears the record; still pending, it waits for the forwarder and falls back to a self-mint if that fails. Terminal outcomes (failed or expired) are cleared rather than retried forever.

Gasless mint, on by default
Cross-chain spends route the destination mint through Circle's Forwarding Service, so Circle submits and pays for the mint. The recipient receives USDC without holding gas first - which matters on Arc, where gas is USDC. The per-intent source burn fee is separate and always applies.

Withdrawals

Withdrawals are two-step. You initiate a withdrawal on the source chain, which queues it through Gateway's safety delay (~minutes on testnet). Then you finalize to receive USDC back in your wallet. The pending list shows everything in flight with countdown timers.

Why this is different from a normal bridge
A traditional bridge holds your USDC in a custodian contract and gives you a wrapped IOU. Gateway burns and re-issues native USDC attested by Circle. There's no bridge TVL to drain, no wrapped derivative to unwrap, and the USDC you spend is the same USDC accepted everywhere else.

Direct deposits on Arc

Arc's USDC is the native gas token, which lives in the L1 ledger rather than in an ERC-20 wrapper. GatewayWallet.deposit relies on standard approve/transferFrom, which can only move ERC-20 balances, so direct deposits from Arc are disabled. To fund Arc, deposit from any other supported chain and let Gateway mint native USDC on Arc.

Oneliq AI PREVIEW

The /agent page is Oneliq AI: a chat assistant on the left, a config panel on the right. Describe what you want in plain language and the assistant fills in the rule for you. It also answers questions about your holdings and can prep a USDC ⇄ EURC swap right in the conversation. The AI never moves funds on its own - it prefills; you review and sign every action.

Under the chat is the same autopilot engine, in three modes: Auto Top-Up (keep a target wallet above a floor), Scheduled Send (recurring USDC transfers across chains and wallets, once/daily/weekly/monthly), and Recurring Buy (a USDC ⇄ EURC swap on a cadence, delivered to your own wallet). All three run on Circle Programmable Wallets with Circle Paymaster-sponsored gas - you sign once, the agent runs on its own, and you can pause or revoke at any moment.

Chat interface

The assistant is powered by Cloudflare Workers AI (served through /api/ai). Ask it to "top up my ops wallet whenever it drops below 50 USDC" or "send 100 USDC to this address every Monday" and it populates the config panel with the matching rule. Nothing is authorized until you confirm and sign - the chat is an input method, not an executor.

It also handles one-off actions without leaving the conversation. "Swap 5 EURC to USDC" renders a live quote card with a Confirm button; "send 20 USDC to 0x… on Base" renders a route and fee card for a cross-chain spend out of your Unified Balance. Both are still signed by your wallet. The agent itself only reads your unified balance - it cannot spend it, because a burn intent is signed for one fixed amount and there is nothing an unattended cron could reuse. When a rule's wallet-side funding looks thin, the pre-flight says how much is parked in Gateway and that you need to move it first.

How it works

  1. You sign once. One EIP-712 typed signature defines the rule (floor, refill amount, daily cap, target chains). One EIP-2612 permit authorizes the agent's Circle Programmable Wallet to pull USDC from your wallet via transferFrom.
  2. Agent watches. A Cloudflare cron Worker scans active rules every minute. When a target wallet drops below its floor (or a scheduled time arrives), the rule fires.
  3. Funds move. The agent's smart account assembles a userOp - USDC pull, optional CCTP V2 burn-and-mint to the destination chain (~30s fast finality), final delivery to the target wallet. Gas is sponsored by Circle Paymaster, so the user pays nothing in their gas token.
  4. Pause / resume / revoke. One-click in the agent drawer. Revoke yanks the permit; every future execution fails closed.

Safety rails

Modes

ModeWhen it firesUse case
Auto Top-UpTarget wallet's USDC drops below your floorKeep an ops wallet, a hot wallet, or a treasury sub-account always funded
Scheduled SendCalendar: once / daily / weekly / monthlyRecurring payouts, payroll, subscription disbursements
Recurring BuyCalendar: once / daily / weekly / monthlyDollar-cost averaging between USDC and EURC on Arc, delivered to your own wallet
Preview status
The agent is in preview. Mainnet flows wait on Arc mainnet + the Circle Programmable Wallets production GA. Dry-run executions, telemetry, and feedback are all welcome - Discord is the fastest channel.

Portal

The /portal page is the loyalty layer over every other surface. Checking in is a real transaction against OneliqCheckIn (0x368a0E854ec69EC10b50D20fCaFC1bAF8b7eff10) on Arc, not a database write - the contract is immutable and counts days in UTC, so your record is verifiable on the explorer independently of us.

Profiles, badges, and streak history live in Cloudflare KV keyed by wallet address. Nothing here touches your funds - check-in moves no USDC beyond the gas the transaction costs.

History

The /history page is your personal stablecoin operations explorer. Every transfer, swap, bridge, and agent execution renders as a clean receipt - title, source → destination chain tags, status pill, relative time, amount, tx hash linkable to the right chain explorer.

Tabs

Data sources

Trade and Balance events are recorded local-first in your browser's activity log (arc.trade.activity.v1) and also mirrored to /api/history/*, keyed by your wallet address, so the feed follows your wallet across browsers and devices. Agent events come from the backend /api/agent/* endpoints which only return rows where you're the rule owner (server-side auth).

Dashboard

The /dashboard page is your portfolio home - a read-only aggregator over everything a connected wallet holds. It shows your profile (deterministic avatar + address), total portfolio value with 24h change, a Holdings table (USDC / EURC / cirBTC with live price and value), an allocation donut, your unified USDC balance across Gateway chains, and a recent-activity feed mirrored from History.

It's a pure aggregator - no Gateway writes happen on this page. Prices come from CoinGecko (USDC pinned to $1) and every card deep-links to Balance, Trade, or History.

Arc L1

Arc is a purpose-built Layer 1 blockchain optimized for stablecoin-denominated finance. Three defining design choices set it apart from a generic EVM chain:

Arc is fully EVM-compatible: existing Solidity contracts, Hardhat / Foundry / Viem / ethers tooling all work without modification. Reference docs at docs.arc.network.

Circle Gateway

Circle Gateway is the protocol that powers Unified Balance. It replaces "I bridged my USDC to chain X and now I have to bridge it back" with "my USDC is already everywhere I need it."

The two on-chain contracts

Both addresses are deterministic across chains (CREATE2 deploy with the same salt), which is why Unified Balance can address every chain uniformly without a per-chain registry.

Gateway vs. CCTP - when to use which

GatewayCCTP V2
Best forMulti-chain treasury, "I want my USDC available everywhere"One-shot move from chain A to chain B
LatencySeconds (off-chain attestation + one mint tx)~20s (Fast) or 13–19 min (Standard, free)
State heldYes - balance lives in GatewayWallet until you spend itNo - fully transactional, USDC moves directly between user wallets
Min flow1 tx (deposit) + 1 tx (mint at spend time)2 txs (burn + receive)

CCTP V2

Cross-Chain Transfer Protocol V2 is Circle's official bridge for native USDC. Unlike lock-and-mint bridges (which create wrapped tokens backed by frozen liquidity), CCTP burns native USDC on the source chain and mints native USDC on the destination - every USDC stays "real USDC" all the way through.

Why this matters

Finality modes

Programmable Wallets & Paymaster

Circle Programmable Wallets are smart-account wallets Circle issues on demand via REST API. Oneliq's Oneliq AI uses them as the executor account - every scheduled or threshold-triggered USDC move is a userOp signed by a Programmable Wallet under server-side custody, paid for by Circle Paymaster.

Why this is safe

USDC as native gas

Most chains use a volatile native token for gas (ETH, MATIC, AVAX). Arc uses USDC. The practical impact:

Implementation note

Arc's USDC lives at 0x3600000000000000000000000000000000000000 as a precompile-style ledger token, not a deployed ERC-20. Standard balanceOf/transfer/ approve all work, but the token cannot be deposited via transferFrom to any contract that wasn't designed for native gas - which is why Gateway deposits originate from other chains.

Network info - Arc Testnet

FieldValue
Chain ID5042002 (0x4cef52)
RPC URLhttps://rpc.testnet.arc.network
CurrencyUSDC (18-decimal native gas)
Explorertestnet.arcscan.app
Faucetfaucet.circle.com
FinalitySub-second deterministic
CCTP domain26
EVM compatibilityFull (Solidity, Foundry, Hardhat, Viem, ethers)

Supported chains

Oneliq surfaces eight testnets - Arc as the home chain plus seven external chains for Unified Balance, CCTP bridging, and the Oneliq AI.

ChainChain IDCCTP domainRPCRole
Arc Testnet504200226rpc.testnet.arc.networkHome - Trade, Mint destination, Portal check-in
Ethereum Sepolia111551110ethereum-sepolia-rpc.publicnode.comGateway · CCTP · Agent
Base Sepolia845326sepolia.base.orgGateway · CCTP · Agent
Avalanche Fuji431131api.avax-test.networkGateway · CCTP · Agent · fastest
Arbitrum Sepolia4216143sepolia-rollup.arbitrum.ioGateway · CCTP · Agent
OP Sepolia111554202optimism-sepolia.publicnode.comGateway · CCTP · Agent
Polygon Amoy800027rpc-amoy.polygon.technologyGateway · CCTP · Agent
Unichain Sepolia130110sepolia.unichain.orgGateway · CCTP · Agent

Contract addresses

All contracts Oneliq interacts with on Arc Testnet (chain ID 5042002):

Tokens

TokenAddressDecimalsIssuer
USDC (native gas)0x360000000000000000000000000000000000000018 / 6 (CCTP)Circle / Arc
EURC0x89B50855Aa3bE2F677cD6303Cec089B5F319D72a6Circle

Circle Gateway V1

Same deterministic addresses on every Gateway-supported chain.

ContractAddress
GatewayWallet0x0077777d7EBA4688BDeF3E311b846F25870A19B9
GatewayMinter0x0022222ABE238Cc2C7Bb1f21003F0a260052475B

Circle CCTP V2

Same addresses on every CCTP V2 chain.

ContractAddress
TokenMessengerV20x8FE6B999Dc680CcFDD5Bf7EB0974218be2542DAA
MessageTransmitterV20xE737e5cEBEEBa77EFE34D4aa090756590b1CE275

OneliqRouter (Oneliq swap router → Circle Curve pool)

Used by Trade for same-chain USDC ⇄ EURC swaps. Forwards into Circle's Curve StableSwap pool and takes a 0.30% on-chain protocol fee (capped at 1%). Sourcify-verified.

ContractAddress
OneliqRouter0xb508F475230E4Ab876258B7DCaFbc182d806e1F7
Curve StableSwap pool0x2d84d79c852f6842abe0304b70bbaa1506add457

OneliqCheckIn (Portal daily check-in)

Immutable, no owner and no upgrade path. Counts days in UTC. Sourcify-verified.

ContractAddress
OneliqCheckIn0x368a0E854ec69EC10b50D20fCaFC1bAF8b7eff10

Arc-native

ContractAddress
FxEscrow (StableFX - roadmap)0x867650F5eAe8df91445971f14d89fd84F0C9a9f8
Multicall30xcA11bde05977b3631167028862bE2a173976CA11

Oneliq deploys exactly two contracts - OneliqRouter and OneliqCheckIn - and both are published and verified. Neither can hold your balance: the router forwards a swap within a single transaction, and the check-in contract moves no funds at all. Every other contract above is operated by Circle or the Arc Foundation.

API endpoints

Oneliq exposes a handful of Cloudflare Pages Functions. Two are read-only proxies to Circle's public APIs; the others are the minimal backend the Oneliq AI needs (rule storage, cron triggers, execution log). None hold private keys, none custody funds.

/api/circle-proxy/*

Proxies Circle's IRIS attestation API for CCTP. Used by the Trade module to poll for attestations after a burn transaction.

# Fetch attestation by burn message hash
GET /api/circle-proxy/v2/messages/{sourceDomain}?transactionHash={txHash}
    proxies to https://iris-api-sandbox.circle.com/v2/messages/...

/api/gateway-proxy/*

Proxies Circle's Gateway public REST API. Used by Unified Balance to fetch balances and submit signed transfer intents.

# Read multi-chain balance
POST /api/gateway-proxy/v1/balances
     # body: { token, sources: [{ domain, depositor }] }

# Submit a signed burn-intent for cross-chain spend
POST /api/gateway-proxy/v1/transfer
     # body: signed EIP-712 BurnIntent

/api/agent/*

The agent backend. Reads are filtered by your connected-wallet signature; writes require an EIP-712 typed signature matching the rule payload.

# Register a new rule (Auto Top-Up or Scheduled Send)
POST /api/agent/register
     # body: { rule, eip712Signature, permitSignature }

# List agents owned by the connected wallet
GET  /api/agent/list?owner={address}

# Execution log for a single agent
GET  /api/agent/{id}/executions

# Pause / resume / revoke
POST /api/agent/{id}/pause
POST /api/agent/{id}/resume
POST /api/agent/{id}/revoke

/api/ai/*

The Oneliq AI chat. Runs on the Cloudflare Workers AI binding, so there is no third-party model provider and no model API key anywhere in the stack. It returns a draft action for the UI to prefill - it cannot sign, submit, or authorize anything.

/api/history/* and /api/recipients/*

Per-wallet storage, keyed by address and capped in size: the receipt feed behind History, and the recipient book behind Batch Pay. Both exist so the data follows your wallet across browsers instead of being trapped in one browser's local storage. Neither can move funds.

/auth/*

The Portal backend: check-in recording, Star Points, streaks, badges, referrals, and the leaderboard. A check-in is only credited after the on-chain transaction is verified against the OneliqCheckIn contract, so points cannot be minted by calling the API.

/api/metrics/*

Read-only telemetry rollup used by status.oneliq.xyz. Compute-on-write so a single /summary call doesn't trigger 273× KV reads. Headline counters are re-derived from Arc itself - router swaps and check-in totals read straight off-chain - rather than trusted from our own store.

No API key on the client
Circle's Gateway API requires a server-issued bearer token. The Pages Function injects it server-side; the browser never sees it. The token is scoped to read-only and intent-submission endpoints - it cannot move user funds.

Supported wallets

Any browser wallet announcing itself via EIP-6963 appears in the picker. Tested with:

Mobile wallets via WalletConnect / Reown AppKit are on the near-term roadmap (see Changelog).

Tech stack

Deliberately minimal. Every choice was made to maximize auditability and minimize attack surface.

Frontend
Plain HTML + CSS + vanilla JavaScript. No framework, no JSX, no transpiler, no build step.
On-chain library
ethers.js v6 via SRI-pinned UMD CDN - the only runtime dependency.
Hosting
Cloudflare Pages - edge CDN, DDoS protection, automatic HTTPS.
Functions
Cloudflare Pages Functions for the proxies, the agent API, the AI chat, and the Portal backend.
Cron
agent-cron runs every minute to scan and fire active agent rules; kv-backup snapshots KV nightly.
AI
Cloudflare Workers AI via the platform binding - no third-party model provider, no model key.
Theming
One shared token set drives a light and a dark theme across every page; the choice is remembered.
Source
~20 HTML pages + a handful of shared JS modules. First paint < 1s on 4G.

Why no framework?

Security

Oneliq takes a defense-in-depth approach. Highlights:

Found a vulnerability? Report it via SECURITY.md - bug-bounty rewards from $100 (low) to $50,000 (critical), depending on impact. Coordinated disclosure expected.

FAQ

When should I use Unified Balance vs. Trade (CCTP)?

Use Unified Balance when you want USDC ready to spend on multiple chains over time. Deposit once, spend many times - latency at spend is in the seconds. Use the Trade cross-chain mode (CCTP V2) for a one-shot move from chain A to chain B where you don't need to pre-fund.

Why is my CCTP bridge taking 13 minutes?

You're on Standard finality. Circle waits for source-chain finality before issuing the attestation - sub-second on Arc, but ~13 min on Ethereum Sepolia (two beacon-chain epochs). Switch to Fast finality for supported pairs to bring this down to ~20s for a small fee.

Can the agent drain my wallet?

No. The agent can only pull what your EIP-2612 permit explicitly authorizes - bounded by the daily cap you signed on-chain. Revoke the permit at any time and the agent literally cannot pull a single USDC unit. The executor's smart account holds no private keys you didn't authorize via signature.

Can the AI spend my money?

No. Oneliq AI reads and drafts; it never signs. When you ask for a swap, a payment, or an automation rule, it fills in a form and hands it back to you - your wallet raises the signature prompt and you can change or cancel anything before approving. It also cannot spend your Unified Balance even indirectly: a Gateway burn intent is signed for one fixed amount, so there is nothing an unattended process could re-use.

Where do agent rules live?

Rules and execution logs are stored in Cloudflare KV, keyed by your wallet address with the EIP-712 signature serving as ownership proof. We never see your private key - only your public address and the typed-data signature.

Does Oneliq have its own token?

No. Oneliq is a frontend, not a protocol. There is no ASWP token, no airdrop campaign, no governance token sale. Anyone telling you otherwise is running a scam.

When mainnet?

Arc mainnet is governed by the Arc Foundation; Oneliq deploys on mainnet shortly after Arc launches. See the homepage roadmap for current milestones.

Why don't you use a bigger frontend framework?

We optimized for auditability and minimum supply-chain risk. See Tech stack.

Changelog

v0.10.x - Public Beta on Arc Testnet

Upcoming

© 2026 Oneliq · Arc Testnet · v0.10.0
Home  ·  Blog  ·  Security  ·  X  ·  Discord