Console · Base Sepolia (chain id 84532)

Open the sluice.

Push exposure readings as the keeper, then swap the same maker strategy directly through SwapVM or through Uniswap v4 and watch both react identically.

Loading deployment...

I

Reading & keeper

Maker exposure

Keeper control (demo)

Stands in for the off-chain Graph pipeline (see subgraph/ + keeper/pushExposure.ts), which would push this same value automatically in production. Use it to move the maker's reported exposure and watch both swap panels react. "Malicious (100%)" pushes ExposureOracle's own real on-chain maximum -- an intentionally bad reading, still only ever able to halt a fill, never improve one.

II

Swap the same strategy on two venues

Swap directly via SwapVM

Calls swapVM.swap(...) straight from your connected wallet -- no contract needed as taker (SwapVM's useTransferFromAndAquaPush flag handles the transfer for you). Runs through the maker's program, including the exposure gate.

tokenIntokenOut

Connect a wallet to swap.

Swap via Uniswap v4

No v4 deployment found. Run forge script script/AqueductV4Demo.s.sol ... after the main demo script, then reload.

III

Composed position & dynamic fee

Strategy P (price + risk aware)

No sophisticated position found in this deployment. Run forge script script/AqueductV2Redeploy.s.sol ..., then reload.

Risk-adjusted dynamic fee (Uniswap v4)

No dynamic-fee pool found in this deployment. Run forge script script/AqueductV3DynamicFee.s.sol ... after the main demo script, then reload.

IV

Policy & emergency halt

The oracle can lie, but it cannot make the maker trade more than the underlying SwapVM program authorized.

Try every keeper preset, including "Malicious (100%)". Every reading either derates a fill or halts it, and none can produce a better fill than the maker's own unsigned program already allowed. See test_MaliciousOracle_CanOnlyEverMakeFillMoreConservative.