Run apps on any chain without bridges, friction, or network switching
Universal App Kit — Clear and Improved Explanation
Universal App Kit is a system that lets users interact with apps on another blockchain without switching networks or bridging tokens.
Instead of moving assets between chains, users send an intent (a signed request), and the system executes it on their behalf on the destination chain.
In simple terms:
Users stay on their favorite chain, but their actions happen on another chain automatically.
In normal multi-chain apps, users must:
This creates friction and reduces adoption.
Instead of directly calling a contract on another chain, users say:
“I want this action to happen on Arc.”
This request is called an intent.
The system then:
The user only signs one transaction.
The system works using three connected parts.
A. Source Chain (User Side)
Examples: Ethereum, Somnia, Sepolia
Contains:
ArcGateway.solRole:
Users only interact with this contract.
No business logic runs here.
B. Off-Chain Relayer (Backend Service)
A Node.js program that runs continuously.
Role:
This replaces traditional bridges.
It moves messages, not tokens.
. Arc Chain (Execution Layer)
Contains:
ArcExecutor.solRole:
This is where real logic happens.
Purpose: Collect intents
What it does:
forwardIntent() callsIntentForwardedIt is lightweight and cheap.
Purpose: Execute intents
What it does:
IntentExecutedThis is the core security layer.
A normal Solidity contract.
It proves that:
Apps work like normal.
Each external wallet maps to one Arc account.
So:
All become one identity on Arc.
Benefits:
Users feel like they have one account across chains.
Let’s follow one real action.
User calls:
gateway.forwardIntent(targetContract)
On Ethereum or Somnia.
Gas: ~50k
Gateway emits:
IntentForwarded(user, target, nonce, timestamp)
This is stored in blockchain logs.
Step 3: Relayer Detects Event
Relayer polls:
queryFilter(IntentForwarded)
Every few seconds.
Finds new intent.
Step 4: Validation
Relayer checks:
Prevents abuse.
Step 5: Execution on Arc
Relayer sends tx:
executor.execute(user, target)
Relayer pays gas.
Executor calls:
target.function()
Inside try/catch.
State updates.
Step 7: Result Event
Executor emits:
IntentExecuted(user, target, success)
Frontend updates UI.
Total time: 10–30 seconds.
For developers, this feels like single-chain development.
They write:
function increment() external {
count++;
}
They do NOT write:
Everything is abstracted.
Frontend (/src)
Handles:
Important parts:
IntentForwarder.tsx → sends intentsuseIntent.ts → logic hookIntentHistory.tsx → logsBackend (/web3-hardhat-intent)
Handles:
Includes:
contracts/ → Solidityrelayer/ → Node backendscripts/ → deploy/setuptest/ → integration testsThe system includes:
This prevents:
| Bridges | Universal App Kit | | --------------- | ----------------- | | Moves tokens | Moves intents | | Needs liquidity | No liquidity | | Hack-prone | Lower risk | | Slow | Faster | | Wrapped assets | No wrapping |
No locked funds. No pools. No synthetic tokens.
This system is useful for:
Any app that wants multi-chain users with single-chain UX.
Universal App Kit is:
A system that lets users use apps on another blockchain without leaving their current blockchain.
It works by:
All automatically.
Here’s a clear, detailed explanation you can use:
I built Universal App Kit using a modular Web3 stack that combines smart contracts, an off-chain relayer, and a modern frontend. On the blockchain side, I used Solidity and Hardhat to develop and test the core contracts: ArcGateway for collecting user intents on source chains, ArcExecutor for executing them on Arc, and example application contracts. These contracts are connected through an event-based system, where intents are emitted as logs and later consumed by the relayer.
For the backend, I built a Node.js and TypeScript relayer using ethers.js. This service continuously monitors source-chain events, validates nonces and permissions, and submits execution transactions to Arc. It also handles retries, error recovery, and maintains intent history. This layer replaces traditional bridges and is critical for reliability.
The frontend is built with Next.js, React, and TypeScript. It connects to wallets using standard Web3 libraries and lets users sign a single transaction to forward intents. Custom React hooks manage wallet state, intent tracking, and UI updates in real time. Environment-based configuration is used to support multiple chains and deployments.
Partner technologies like Hardhat, ethers.js, and RPC providers made development and testing much faster by providing stable tooling, local simulations, and reliable network access. They reduced the need to build infrastructure from scratch.
One notable “hacky” part of the system is the event-driven cross-chain design. Instead of using complex messaging protocols or bridges, I relied purely on on-chain events and an off-chain listener. This makes the system simpler, cheaper, and easier to debug. Another practical optimization is keeping ArcGateway stateless and lightweight, which minimizes gas costs and reduces attack surface.
Overall, the project pieces together Solidity contracts, a TypeScript relayer, and a React frontend into a clean pipeline where user intents flow from one chain to another automatically, giving a multi-chain experience with single-chain simplicity.

