Search projects, hackathons, sponsors and tech

    ← All projects

    Inlet

    A deposit and exit rail for DeFi protocols. One signature in, one signature out, USDC on any chain.

    Demo

    About

    Inlet is deposit and exit infrastructure for DeFi protocols. A protocol mounts it beside its own deposit and withdraw controls, and its users come in from any chain and leave to any chain, native USDC, one signature each. Today every protocol rebuilds the same onboarding: bridge the USDC, swap or unwrap whatever arrived, switch the wallet to the right network, then sign the deposit. Four steps, two or three signatures, gas on two chains, a wrapped asset somewhere in the middle. And the way back out is left to the user. With Inlet you pick a destination, Aave on Arbitrum, Compound or a Morpho vault on Base, a Uniswap v4 position on Unichain, and you sign once on whatever chain your USDC already sits on. The USDC arrives as the position itself, in your name, on the chain the protocol lives on. No bridge, no swap, nothing wrapped, no network switch, no gas on the far side. Inlet charges no fee; the only cost is Circle's transfer fee, shown before you sign. Arc is the settlement hub, not a stop on the way. A hub contract on Arc derives a deposit address from every parameter of the intent: who you are, how much, which chain, which protocol, which beneficiary, which deadline. Change any one and it is a different address, so the address itself is the promise. Circle Gateway or CCTP V2 brings the USDC to that address on Arc, the hub escrows it, every sweep burns from Arc toward the destination, and every refund returns through Arc. Everything after your signature is permissionless. Anyone can call sweep. Anyone can call refund after the deadline. If the destination protocol reverts, the USDC waits in the receiver, claimable by you. There is no path where funds are stuck and no privileged party who has to act. The relayer we run makes it fast, about thirty seconds end to end, but it makes it fast rather than possible. The way out is the same trick in reverse. Sign once on the position token and it becomes native USDC in your wallet on the chains you choose, in the amounts you choose, five to Base and the rest to Ethereum. The approval names as spender an executor address derived from every parameter of the exit, so it can only ever produce the exit you described, and anyone can submit it. Live on testnet: seven destinations across five protocols and five chains, and six sources, five EVM testnets and Solana Devnet, where the same deposit is one transaction signed in Phantom. Thirteen deposits and five withdrawals are recorded with their hashes, the fastest deposit at sixteen seconds, the fastest withdrawal at thirteen, the Solana deposit at twenty nine. A Privy email wallet with no extension and no gas has made the same deposit. You can make a real one on the site or replay a recorded one. It ships as a kit, not an app. Three lines mount the widget, one Solidity function adds a protocol, the docs state what a protocol needs to be a destination and to be withdrawable, and an MCP server lets an agent do the whole thing from a sentence. From any chain into any position, and back.

    How it's made

    Contracts, Foundry. A hub on Arc holds the destination registry and derives per intent deposit addresses. A receiver on each destination chain validates that Circle actually minted the message before it calls an adapter. Adapters are one function each: ERC 4626, Aave V3, Compound III, and Uniswap v4 single sided liquidity. 43 tests across 8 suites, three of them fork tests against the live protocols on Arbitrum Sepolia, Base Sepolia and Unichain Sepolia. Circle rails only, native USDC only. Circle Gateway gives the one signature path: a burn intent is a plain EIP 712 signature with no chain in its domain, so the widget signs it on whatever network the wallet is already on and never asks for a switch, spending a unified balance with no gas. CCTP V2 fast transfer is the self contained path when there is no unified balance, and it is the only path on Monad, where Gateway is not deployed. Circle's Iris API supplies the attestations and the fast transfer fee quotes. Arc is the settlement hub, not a stop on the way. Every deposit address lives there, every sweep burns from there, and every refund returns from there. One chain holds the commitment and the escrow while five other chains hold the positions. Privy carries the wallet. Email login creates an embedded wallet, and that wallet signs the Gateway burn intent directly, so a user with no wallet extension and no gas anywhere completes a real cross chain deposit into a real lending market. The widget also takes any external wallet through wagmi, so Privy is the default rather than a requirement. Uniswap in two places. The v4 adapter mints a real single sided ETH/USDC position on Unichain Sepolia from inside the receiver, which needs the raw action encoding, a Permit2 double approval, and tick rounding toward minus infinity. The Uniswap Trading API is proxied through our relayer so the widget shows the live pool price before you commit. The exit rail. An InletExit contract on each destination chain creates a one shot executor per exit intent with CREATE2, salted by the intent's EIP 712 hash, so the executor address is known before anyone signs. The user's EIP 2612 permit on the aToken or the vault shares, or the allowBySig authorization on the Compound Comet, names that address as spender. The executor runs entirely in its constructor: it delegatecalls the exit adapter, which applies the signature and redeems the position, then burns one CCTP V2 message per leg toward the chain and recipient in the intent, the last leg taking the remainder. Three exit adapters, one per protocol, each a single function. Relayer, Fastify and SQLite on Azure Container Apps. It watches for funded deposit addresses, sweeps, fetches the attestation, and executes on the destination. For exits it submits the execute call, waits for Circle to attest every leg, and mints each leg on its own chain. Every chain it serves comes from a config file, so a new chain is configuration rather than code. It manages nonces locally because a public RPC once handed us a stale one. Frontend, Next.js on Vercel. The live widget sits in the hero, so the first thing on the page is a real deposit you can make. There is a flow instrument that follows a deposit by hash and replays recorded ones. Agents get the same surface. An MCP server exposes quote, create, submit and status, plus a single deposit tool that takes a sentence and returns a position. One of the twelve recorded runs was made by the agent, into Compound III, in sixteen seconds. The hardest parts were not the contracts. Gateway balances are per chain and a burn intent needs to expire about a week of blocks ahead. CCTP fast transfer deducts its fee at mint, so the intent amount is a floor rather than the burn amount. Public RPCs lag behind themselves, so approvals must be visible before the burn and reads need retrying. Monad has CCTP V2 but no Gateway, which we confirmed by reading localDomain from the MessageTransmitter rather than trusting a table.