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...
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.
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.
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.
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.
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.