A walkthrough, not a live account. The numbers are ones the project recorded.
Built on
A Program That Cannot Break Your Rules
You set the rules. The program decides. The contract checks. Nothing moves otherwise.
- Who may move itthe one you name nobody else, eversetAgent ↗
- Where it may gomarkets you allow-list and nowhere elsepermitVenue ↗
- Putting money to workinto a permitted market no recipient in the callsupplyIdle ↗
- Taking it backeven from one you revoked so revoking never traps itwithdrawIdle ↗
- Who the account admitsyou, or the one you named and no one else_requireOwnerOrAgent ↗
- The way outeverything, to you no upgrade can remove itescape ↗
- How much a swap may takea ceiling you set per token, on the way outmaxOut ↗
- Until whena date you choose then the mandate is deadexpiry ↗
Break any of these and the contract rejects the move. There is no other way in.
- Where it lives
- a contract that is yours alone, at an address known before it exists
- Liquid
- enough to cover a swap against your mandate, held back on purpose
- At work
- the rest, earning in a lending market you allow-listed
- Owner
- you; the agent may move it between your own places and nowhere else
- Ending it
- remove the agent, or take everything out through a door no upgrade can close
- Reads
- your account and every market you permitted, from inside a sealed environment
- Checks
- that the rules it was given are the rules you published; if not, it stops before touching the chain
- Asks
- the index what your live mandates could still be asked to pay, and holds that much back
- Decides
- the split, then whether the difference is worth its own gas
- Leaves
- only the decision, as a report Chainlink's network signs and writes to the chain — no key of ours
- Admits
- you, or the agent you named, checked on every call
- Refuses
- any market you did not allow-list, and any caller you did not name
- Cannot
- transfer, approve, add a market, or upgrade itself
- Has no recipient
- both calls the agent can make end at this account; there is no address to redirect
- Cannot be walled up
- the way out lives in the proxy, so replacing the code cannot remove it
- Deployed
- the account factory and the account code every owner's account runs, two Aqua apps, three lending venues, the SwapVM router, the agent contract and the taker any wallet can use — ten, each proxy counted once — are live on Arbitrum One and verified
- Live
- on 11 September the network carried its first move: idle USDC into Morpho, from an account its owner opened, with no key of ours in the transaction
- Rehearsal
- on a snapshot of the real market, the sealed program moved 40,000 of 50,000 USDC into real Aave v3
- Left behind
- 10,000 held liquid, and the agent's own balance zero, because a move that goes nowhere reads like one that worked
- Through the app
- opening an account, naming the agent and permitting a market, all checked against the chain rather than the screen
- Tests
- 186 Solidity tests, 82 of them on a snapshot of the real market, 211 for the decision, and 32 browser checks
- Caveats
- the rehearsal is a snapshot, not the live network, and the sealed environment was simulated
An example account, not a live one. The contracts are deployed on Arbitrum One, and every rule above links to the line that enforces it.
Rules for every style.
Keep more on hand or put more to work. Move on small differences or only on large ones. You pick once, and the contract stops everything else.
Active
Keeps only what a swap needs on hand, and puts the rest to work.
Relaxed
Moves only when the difference is clearly worth its own gas.
Cautious
Holds a wide buffer, so a swap never waits on a lending market.
Built in the Open
Every line is public: the Aqua app, the program that decides, and the tests for both.
_requireReceiptFor · open on GitHub ↗function _requireReceiptFor(address pool, address receipt, address token) private view {
if (receipt == address(0)) return;
require(IReceiptToken(receipt).UNDERLYING_ASSET_ADDRESS() == token, ReceiptIsNotFor(receipt, token));
require(ILendingVenue(pool).getReserveAToken(token) == receipt, ReceiptIsNotFrom(receipt, pool));
}Open by default.
The code above is the actual check our Aqua app runs, read from the source when this page is built. Every count below points at the code that proves it.
An Aqua app of our own, live on Arbitrum One. The mandate is the strategy, and every refusal has a name.
Read the source ↗Asks the index what Aqua cannot be asked: which mandates a wallet holds, and what is left in each.
Read the source ↗Decides and sizes inside the enclave. Chainlink's network writes the move.
Read the source ↗Your Money Stays Yours
It can move your funds. It can never keep them.
Your funds stay in your wallet.
The contract moves them for one step, and proves it kept none before that step ends.
Break a rule and the move is refused.
The contract checks every rule itself. 428 assertions run against it on every change.
All of the code is public.
Ten contracts, each proxy counted once, are deployed on Arbitrum One with their source verified. Twelve automated reviewers went over the Aqua contracts, which is not a professional audit.
80% went to work.
In a rehearsal on a copy of the real market, 50,000 USDC was funded and 40,000 went into Aave v3. That is the share the rules asked for, to the unit, and it left a 10,000 buffer. The agent ended holding none of it. A rehearsal, not the live network.
FAQs
What is Helico, in plain words?
Money sitting in a wallet earns nothing. Money you have lent out cannot be spent. Helico keeps the balance between the two: an agent moves idle funds into a lending market you allow-listed, and pulls them back when you need cash. You set the terms once. How much stays spendable, which markets it may use, and which agent may act. The account holding your money cannot send it anywhere else, because the code has no way to.
What do I need to start?
A wallet and some stablecoins on Arbitrum. You get an account of your own at an address that is known before it is built, so you can fund it before it exists, and whatever arrives there was always yours. Ten contracts — each proxy counted once, superseded deployments not — are deployed on Arbitrum One with their source published. One account is open on the live chain, and on 11 September the program moved its idle stablecoins into Morpho — the first move made because the program said so, carried to the chain by Chainlink's network rather than by any key of ours.
Who holds my money?
An account that is yours and nobody else's. One contract per owner, not a pool everyone shares. It has a way out that no upgrade can remove: a function on the account that sends everything back to you and answers to nobody else. When it trades, the tokens go from your account to the buyer directly. The exchange keeps a record of what may be spent and never holds anything itself.
What can the automation do to it?
Two things. Put idle money into a market you allow-listed, and take it back out. Neither call has anywhere to put an address, so there is no way to write an instruction that sends your money somewhere else. An agent that was completely taken over could shuffle your money between the markets you chose, and nothing more.
When does it do nothing?
Most of the time. Interest builds every block, so the balance drifts constantly, and chasing it would mean a transaction every few minutes to move a rounding error. A move has to be worth making twice over: big enough that gas is not most of it, and big enough to matter against the size of your account. Small accounts and large ones are stopped by different halves of that.
What stays private?
How the decision is made. The program that decides runs inside a sealed environment that Chainlink's network provides. Whose funds it watches, when it looks, and how it sizes a move never leave that environment. The rules themselves are public on the chain, so anyone can check that a move followed them.
Is it live? Is it audited?
Live, but not audited. Ten contracts — each proxy counted once, superseded deployments not — are deployed on Arbitrum One with their source published, and the program that decides runs on Chainlink's network every five minutes. Two accounts are open on the live chain, the first opened on 10 September and the second on 13 September from one sentence typed into the chat, and on 11 September the program moved the first one's idle stablecoins into Morpho: the network signed the decision and wrote it to the chain, the account's own event says what moved, and no key of ours was in the transaction. Before that, the whole flow was rehearsed on a copy of the real market — an account opened at an address predicted before it existed, real stablecoins moved into the real lending market, the decision made inside a simulated sealed environment. Twelve AI reviewers went over the Aqua contracts. That is not a professional audit, and this page does not call it one.