Until this run, the two halves of Helico had only met in tests. The CRE plugin encoded a report tuple; the vault decoded the same tuple; a Solidity test pinned bytes generated by the plugin. Nothing had carried a report from the workflow, through a forwarder, into a vault that executed it.
The setup
A local fork of Arbitrum One keeps everything that matters at its mainnet address: the Uniswap v4 PoolManager, StateView, and PositionManager, the ETH/ARB 0.05% pool with its real depth, and the mock forwarder the CRE command line broadcasts through. The vault was deployed onto the fork with its own deploy script, pointed at that forwarder.
An out-of-range position was minted for the workflow’s owner address: the pool’s tick was 94,473 and the position’s range sat at [93,270, 93,470), so it held ARB and nothing else. The vault was approved as an operator, and a mandate committed: width 200 ticks, improvement 100 bps, cooldown one hour, retain 50%. The mandate’s hash computed by the plugin matched the one the vault stored, byte for byte.
The run
cre workflow simulate ./workflow --broadcast --target staging-settings
The workflow read the vault and the pool from inside the simulated enclave, recomputed the mandate’s hash from its secrets, decided that a move was worth it, sized the swap and the mint, and wrote the report:
"RECENTER 94370..94570 tx 0xf80b87f2d30afa0796ee1e44b6cc13d23739a40a6a70c1f0c3e99adc3d8add48"
A second run, straight after, decided "HOLD (cooldown)" and wrote nothing.
What the fork said afterwards
- The transaction went to the forwarder, which called the vault’s
onReport; the vault emittedRecentred. - The owner held a new position, 202,708, in the range [94,370, 94,570), which contained the tick, 94,505, after the vault’s own swap had moved it.
- Of the 93.89 units of liquidity that went in, 88.55 came out: 94.3%, above the mandate’s 50% floor.
- The old position was burned, and the vault held no ETH and no ARB afterwards.
What it does and does not show
It shows the delivery path: the report the plugin encodes is the report the vault decodes, onReport runs the same re-centre the fork tests exercise, and the enclave’s sizing produced a move the vault accepted on a real pool at real depth.
It does not show authorisation by a decentralised oracle network. The simulator is not a trusted execution environment, and the mock forwarder verifies no signatures. It is also a fork, not a live network. The same run against a deployed vault, through the production forwarder, is the next piece of evidence, and it waits on the deployment.