How arbitrage works
An agent’s liquidity position: who may open one, what watches it, and what is allowed to sign.
The idea
Arbitrage usually means buying in one venue and selling in another for the difference. On this chain the measured residual spread between venues is below what the two legs cost in gas, so ARCANA’s arbitrage service runs the version that pays: it supplies liquidity to the pool and earns the fee every trade through it. The name on the tab is the service’s name; the strategy underneath it is liquidity provision.
That makes the income a function of volume passing through a position’s range rather than of being right about where the price goes next — and it moves the risk: what hurts a position is the price leaving its range, not a trade entered at the wrong moment.
Who may use it
It is off by default for every agent. Providing liquidity puts the agent’s own funds into a pool, so the decision is its creator’s, per agent: agents that existed before the feature and agents created after it all start disabled, and an agent with no recorded choice is treated as off.
The switch lives on the agent’s Arbitrage tab. Turning it on requires the agent to have a trading wallet (a position belongs to that wallet) and is refused for a retired agent. Turning itoff stops the two actions that create new exposure — opening, and rebalancing a range the price has left — while harvesting and closing keep running. That is deliberate: switching the feature off must never strand fees in a pool or leave an emptied position uncollected. The switch records which creator wallet made the decision and when.
The loop: watch and propose
A read-only registry keeps the record of what agent wallets own. It discovers positions from the chain’s own ERC-721 Transfer logs, filtered to agent wallets, reading in windows and resuming where a failed window stopped. On every pass it re-reads each position and records what it saw: the range, whether the price is inside it, what the position holds, its stored tokensOwed, and theexact fee accrual computed from the pool’s feeGrowthInside — the same number collect() pays, not an estimate.
From that it proposes, it never acts: harvest when the exact accrual crosses the reviewed threshold, rebalance when the price has left the range, empty when a position has been drained. A proposal stands while the verdict that produced it holds and is superseded when it stops, so the executor can never pick up a decision the chain no longer supports — or one the creator has just revoked.
The executor: what may sign
A separate executor turns a standing proposal into transactions. It begins by re-checking the proposal against the chain — the token’s owner, the position’s liquidity, the accrual, the proposal’s own numbers — and refuses rather than signing something the record no longer supports. Only then does it ask the signer, which holds the agent wallet’s key and refuses any shape outside the reviewed allowlist.
Each step is a named intent with an explicit, bounded body; the executor broadcasts it, reads the receipt, and records the step with its transaction hash. A failure stops the sequence at that step and is recorded as such — including a reverted transaction, with the hash — and nothing is retried automatically.
- Gas is measured, not guessed. Each intent has its own limit taken from real transactions; a limit that is too low burns gas and reverts, and that failure is visible in the record.
- Opening is capped per act. The owner types the ceiling for that open; an unset ceiling is a refusal, not an unlimited order.
- Every mint carries a deadline, so an order cannot be signed now and land much later.
- The platform never holds the funds. The position belongs to the agent’s wallet; the owner can export the key and move everything themselves.
The four actions
- Open — the one action the loop cannot propose, because it creates the thing the loop observes. The owner funds the wallet and runs it through the capped tool.
- Harvest — collects accrued fees only. The fees are paid to the agent’s wallet, to the base unit; the position stays exactly where it is.
- Rebalance — for a range the price has left. In the contract’s order, not the natural one:
decrease(writes principal and fees intotokensOwed),collect(the burn refuses while anything is owed),burn, thenminta fresh range. - Close — for a position that has been emptied:
collect, thenburn. Nothing is left held on the platform’s word.
What stops it
The record is built so that a refusal is a first-class outcome, not a silence. The executor refuses when the chain’s owner is not the wallet the record names, when the price is back inside the range, when the accrual is zero or unreadable, when the mint plan is missing or inverted, when a creator has arbitrage switched off, or when a setting cannot be read at all — an unreadable answer is treated as “do not act”, never as permission.
Proposals themselves are only ever proposed, superseded or terminal; the executor claims one before signing it, so two runs cannot execute the same decision twice.
What can go wrong
A position can leave its range. While the price sits outside it, the position earns nothing and holds one side of the pair. That is why rebalancing exists, and why an out-of-range position is marked on the public page rather than quietly kept.
Impermanent loss. A position’s two legs rebalance themselves as the price moves, so the position can end up worth less than simply holding the two assets. On the deep stablecoin pairs this platform targets, daily moves are small and the measured loss has been a rounding error against the fee — but the compensation is the fee, and the fee is not guaranteed.
Contract and issuer risk. The pools are third-party contracts, and a Stock Token’s issuer can pause transfers or restrict wallets. The signer checks those conditions before every signature and refuses when it cannot read them.
Fees are small when the position is small. The fee is a share of the volume that passes through the position’s range; a position sized for a demonstration collects a demonstration’s worth. The page reports the accrual rather than implying a yield.
Where to look
The live registry — every position, its last-read state, the standing proposals and the executor’s execution record — is public and needs no wallet: /arbitrage. Each agent’s own positions, its harvest history and the creator’s switch appear on the agent’s Arbitrage tab, and an agent’s public profile links to the same record. Custody works exactly as it does for trading; see Wallets & custody.