Job
Cancelled by operator.
Build VolatilityGuard Lab end to end in one multi-step job: implement and test the Uniswap v4 hook and VGL token, independently review the contracts and deployment manifest, deploy and seed the pool on Sepolia through the verified launch pipeline, then build and publicly host a working RainbowKit React swap and observability dapp using the verified deployment. Publish source and provide live URLs and transaction links.
the approved task
Approved workflow
Build VolatilityGuard Lab end to end in one multi-step job: implement and test the Uniswap v4 hook and VGL token, independently review the contracts and deployment manifest, deploy and seed the pool on Sepolia through the verified launch pipeline, then build and publicly host a working RainbowKit React swap and observability dapp using the verified deployment. Publish source and provide live URLs and transaction links.
The user explicitly approved one complete multi-step swarm task, including contracts AND the live website. Do not omit, defer to a manually submitted task, or silently split out the frontend. Coordinate the deployment-address handoff within the workflow. GitHub publication, public IPFS website hosting and the existing Sepolia univ4_hook launch policy are authorized. No mainnet deployment. Use the Uniswap v4/security/DeFi reference skills. Two workers are online; preserve independent final review and schedule true dependencies honestly.
Build VolatilityGuardHook: a complex but coherent Uniswap v4 market-regime protection hook, then deploy a working demonstration pool to Sepolia through the existing univ4_hook launch pipeline. Produce real implementation, tests, adversarial findings, gas measurements, deployment manifest, ABIs, and integration documentation.
Implement per-PoolId isolation; a bounded observation ring and time-weighted reference tick; bounded EWMA volatility; adaptive per-swap price-deviation limits; a rolling volume budget resistant to transaction splitting; and NORMAL/WARMUP/GUARDED/RECOVERY states with explicit stale-history, low-liquidity and cooldown behavior. Protect callback entry to the canonical PoolManager. Authenticate anything that affects accounting; never trust a router-supplied sender or hookData as proof of identity. Define exact-input and exact-output behavior in both directions, numeric units, rounding and caps. Keep every callback bounded in time/storage. Liquidity removal must remain possible in every guard state. Demonstrate how blocked swaps and reverted transactions affect state: a revert cannot persist a breaker transition. No claim that an internal pool TWAP prevents all manipulation or MEV. Prefer permissionless, deterministic recovery and immutable bounded defaults; do not introduce an unspecified admin wallet.
Deployment compatibility is mandatory: use ordinary static LP fee 3000, tickSpacing 60, paired native Sepolia ETH (zero currency address), initial sqrtPriceX96 79228162514264337593543950336. Dynamic-fee pool flags are outside the current launch manifest/policy and are not required. The hook must support arbitrary pool currencies for the protected floor, no hardcoded token-only restriction. Seed observations safely at initialization and choose non-bricking warmup defaults compatible with normal liquidity and swap flows. Include a distinct fixed-supply demonstration ERC20 named Volatility Guard Lab, symbol VGL, 18 decimals, no constructor arguments, exactly 10^27 units minted to its deployer, no mint backdoor. The system factory deploys token/hook, mines permission bits and seeds liquidity; workers never receive keys or broadcast. Use the real Sepolia PoolManager at 0xe03a1074c86cfedd5c142c4f04f1a1536e203543 and verify its published address. No other deployed helper may be required for launch: use existing verified v4 periphery or document a supported public router and exact calldata for the subsequent website.
Build a standalone Foundry tree with source, vendored pinned dependencies, tests, and bytecode_hash=none; offline forge build, forge test and forge fmt --check must pass. Include deterministic stress simulations, fuzz/property tests for accounting conservation, cross-pool isolation, ring wraparound, same-block updates, stale/zero-time history, decimals, overflow, fee/amount signs, split swaps, flash manipulation, donation/griefing, reentrancy, unauthorized callbacks, initialization, legitimate large trades, guard recovery and LP exits. Run at least 10000 fuzz cases for key properties where feasible and record actual counts, counterexamples and limitations, never invented passes. Reviewers must attack the design and deployment configuration and report severity, concrete exploit/reproduction and affected code. Resolve blocking findings through the normal repair loop before deployment. Passing tests is not an audit certificate.
Deliver docs/architecture.md, docs/threat-model.md, docs/frontend-integration.md, artifacts/gas.md and machine-readable frontend integration data: ABI JSON, exact pool-key construction, quote/swap/add-remove liquidity call recipes using verified existing periphery, custom error decoding, event schema, decimals, units, history bootstrap, and four reproducible demo scenarios (calm, burst/split volume, price shock, recovery). No fabricated chain addresses/transaction hashes. Distinguish local simulation from observed Sepolia behavior. Include precise positive and negative test vectors so the React dapp can plot tick/TWAP, volatility, allowed deviation, volume budget, current state and recent swaps.
The same end-to-end job must deliver and publicly host a React + Vite + TypeScript dapp with RainbowKit wallet connection and wagmi/viem. Put frontend source under web/ and final static export under dist/. Make an ETH/VGL swap card the primary interface: You pay/You receive amount boxes, token selectors, direction reversal, balances, gas-aware maximum amounts, live quotes, slippage, minimum received, explicit approval and swap buttons. Execute real Sepolia swaps through this hook-enabled pool using verified existing periphery. Show pending, rejected, reverted and confirmed transactions, decoded hook errors and explorer links. Never invent deployment addresses or quotes; obtain the accepted launch addresses, pool key and ABIs from the verified deployment before final integration. Document any WalletConnect project-ID configuration while supporting injected wallets.
Display live tick/price, reference TWAP, volatility, allowed deviation, rolling volume budget, warmup/guard/recovery state and recent swaps with timestamped charts and bounded event reads. Include calm, split-volume burst, price-shock and recovery demonstrations; clearly distinguish local simulations from real chain state. Every live transaction requires wallet signing. Include usable liquidity-exit controls where the connected wallet owns a supported position. Make read-only views accessible without connecting. Test quotes, approvals, swaps in both directions, wrong-chain/disconnected wallets, user rejection, guard reverts, insufficient funds, RPC failures and simulator parity. Verify the production build and responsive UI. Publish source to GitHub and the working static dapp through the publisher; return website URL, source links, deployment receipts, test results and limitations.
Required workflow: implementation and tests -> deployment manifest -> independent adversarial review -> protected verifier and policy admission -> Sepolia deployment -> verified deployment handoff -> complete and test frontend integration -> public website publication. Do not claim completion until both contracts are deployed and the actual swap site is published. Workers never receive deployment keys or broadcast deployment transactions themselves.
the website assignment
Build VolatilityGuard Lab end to end in one multi-step job: implement and test the Uniswap v4 hook and VGL token, independently review the contracts and deployment manifest, deploy and seed the pool on Sepolia through the verified launch pipeline, then build and publicly host a working RainbowKit React swap and observability dapp using the verified deployment. Publish source and provide live URLs and transaction links.
Work
- contracts built
Build contract project508 files changedrevised
Implemented the complete contract-stage deliverable.
Key outputs:
- VolatilityGuardHook.sol
- VolatilityGuardToken.sol
- launch.json
- Architecture
- Threat model
- Frontend integration
- Review findings
- Gas evidence
- ABI JSON exports under
docs/abi/
Verification:
forge fmt --check: passedforge build --offline: passedforge test --offline: 13 passed- Two key fuzz properties: 10,000 runs each
- Manifest and ABI JSON validated
- Dependencies vendored as ordinary files with no nested Git repositories
The PoolManager address was cross-checked against the current official Uniswap SDK Sepolia constants. No deployment transactions, addresses, or receipts were fabricated.
ran oncodex · 5 turns · 11m 21s · 117.8K in · 22.6K out · 3M cachedsubmission2019becc35d76f06eebde63129236584db7a9c00d1545e8c5e8e6970baf229dbdevicea1c5c6c3e93f5a311d26715fe81382674dca82117134c2e6f97c1bc5faea9f09started from0243d7da4a4337ae8b16bcdf15bb4ead736fd68fbundled0e55eb1d8d7936bf5dac986b4e5286bc235c6bfc35c808cbe25677054869346 · 590 KBverifiedrebuilt and matched · verifier 0.1.0 ·changed · 508 filesREADME.mdREVIEW.mddocs/abi/VolatilityGuardHook.jsondocs/abi/VolatilityGuardToken.jsondocs/architecture.mddocs/frontend-integration.mddocs/threat-model.mdfoundry.tomllaunch.jsonlib/forge-std/LICENSE-APACHElib/forge-std/LICENSE-MITlib/forge-std/README.mdlib/forge-std/src/Base.sollib/forge-std/src/Script.sollib/forge-std/src/StdAssertions.sollib/forge-std/src/StdChains.sollib/forge-std/src/StdCheats.sollib/forge-std/src/StdError.sollib/forge-std/src/StdInvariant.sollib/forge-std/src/StdJson.sollib/forge-std/src/StdMath.sollib/forge-std/src/StdStorage.sollib/forge-std/src/StdStyle.sollib/forge-std/src/StdToml.sollib/forge-std/src/StdUtils.sollib/forge-std/src/Test.sollib/forge-std/src/Vm.sollib/forge-std/src/console.sollib/forge-std/src/console2.sollib/forge-std/src/interfaces/IERC1155.sollib/forge-std/src/interfaces/IERC165.sollib/forge-std/src/interfaces/IERC20.sollib/forge-std/src/interfaces/IERC4626.sollib/forge-std/src/interfaces/IERC721.sollib/forge-std/src/interfaces/IMulticall3.sollib/forge-std/src/mocks/MockERC20.sollib/forge-std/src/mocks/MockERC721.sollib/forge-std/src/safeconsole.sollib/v4-core/README.mdlib/v4-core/SECURITY.mdlib/v4-core/lib/openzeppelin-contracts/LICENSElib/v4-core/lib/openzeppelin-contracts/README.mdlib/v4-core/lib/openzeppelin-contracts/contracts/access/AccessControl.sollib/v4-core/lib/openzeppelin-contracts/contracts/access/IAccessControl.sollib/v4-core/lib/openzeppelin-contracts/contracts/access/Ownable.sollib/v4-core/lib/openzeppelin-contracts/contracts/access/Ownable2Step.sollib/v4-core/lib/openzeppelin-contracts/contracts/access/README.adoclib/v4-core/lib/openzeppelin-contracts/contracts/access/extensions/AccessControlDefaultAdminRules.sollib/v4-core/lib/openzeppelin-contracts/contracts/access/extensions/AccessControlEnumerable.sollib/v4-core/lib/openzeppelin-contracts/contracts/access/extensions/IAccessControlDefaultAdminRules.sollib/v4-core/lib/openzeppelin-contracts/contracts/access/extensions/IAccessControlEnumerable.sollib/v4-core/lib/openzeppelin-contracts/contracts/access/manager/AccessManaged.sollib/v4-core/lib/openzeppelin-contracts/contracts/access/manager/AccessManager.sollib/v4-core/lib/openzeppelin-contracts/contracts/access/manager/AuthorityUtils.sollib/v4-core/lib/openzeppelin-contracts/contracts/access/manager/IAccessManaged.sollib/v4-core/lib/openzeppelin-contracts/contracts/access/manager/IAccessManager.sollib/v4-core/lib/openzeppelin-contracts/contracts/access/manager/IAuthority.sollib/v4-core/lib/openzeppelin-contracts/contracts/finance/README.adoclib/v4-core/lib/openzeppelin-contracts/contracts/finance/VestingWallet.sollib/v4-core/lib/openzeppelin-contracts/contracts/governance/Governor.sollib/v4-core/lib/openzeppelin-contracts/contracts/governance/IGovernor.sollib/v4-core/lib/openzeppelin-contracts/contracts/governance/README.adoclib/v4-core/lib/openzeppelin-contracts/contracts/governance/TimelockController.sollib/v4-core/lib/openzeppelin-contracts/contracts/governance/extensions/GovernorCountingSimple.sollib/v4-core/lib/openzeppelin-contracts/contracts/governance/extensions/GovernorPreventLateQuorum.sollib/v4-core/lib/openzeppelin-contracts/contracts/governance/extensions/GovernorSettings.sollib/v4-core/lib/openzeppelin-contracts/contracts/governance/extensions/GovernorStorage.sollib/v4-core/lib/openzeppelin-contracts/contracts/governance/extensions/GovernorTimelockAccess.sollib/v4-core/lib/openzeppelin-contracts/contracts/governance/extensions/GovernorTimelockCompound.sollib/v4-core/lib/openzeppelin-contracts/contracts/governance/extensions/GovernorTimelockControl.sollib/v4-core/lib/openzeppelin-contracts/contracts/governance/extensions/GovernorVotes.sollib/v4-core/lib/openzeppelin-contracts/contracts/governance/extensions/GovernorVotesQuorumFraction.sollib/v4-core/lib/openzeppelin-contracts/contracts/governance/utils/IVotes.sollib/v4-core/lib/openzeppelin-contracts/contracts/governance/utils/Votes.sollib/v4-core/lib/openzeppelin-contracts/contracts/interfaces/IERC1155.sollib/v4-core/lib/openzeppelin-contracts/contracts/interfaces/IERC1155MetadataURI.sollib/v4-core/lib/openzeppelin-contracts/contracts/interfaces/IERC1155Receiver.sollib/v4-core/lib/openzeppelin-contracts/contracts/interfaces/IERC1271.sollib/v4-core/lib/openzeppelin-contracts/contracts/interfaces/IERC1363.sollib/v4-core/lib/openzeppelin-contracts/contracts/interfaces/IERC1363Receiver.sollib/v4-core/lib/openzeppelin-contracts/contracts/interfaces/IERC1363Spender.sollib/v4-core/lib/openzeppelin-contracts/contracts/interfaces/IERC165.sollib/v4-core/lib/openzeppelin-contracts/contracts/interfaces/IERC1820Implementer.sollib/v4-core/lib/openzeppelin-contracts/contracts/interfaces/IERC1820Registry.sollib/v4-core/lib/openzeppelin-contracts/contracts/interfaces/IERC1967.sollib/v4-core/lib/openzeppelin-contracts/contracts/interfaces/IERC20.sollib/v4-core/lib/openzeppelin-contracts/contracts/interfaces/IERC20Metadata.sollib/v4-core/lib/openzeppelin-contracts/contracts/interfaces/IERC2309.sollib/v4-core/lib/openzeppelin-contracts/contracts/interfaces/IERC2612.sollib/v4-core/lib/openzeppelin-contracts/contracts/interfaces/IERC2981.sollib/v4-core/lib/openzeppelin-contracts/contracts/interfaces/IERC3156.sollib/v4-core/lib/openzeppelin-contracts/contracts/interfaces/IERC3156FlashBorrower.sollib/v4-core/lib/openzeppelin-contracts/contracts/interfaces/IERC3156FlashLender.sollib/v4-core/lib/openzeppelin-contracts/contracts/interfaces/IERC4626.sollib/v4-core/lib/openzeppelin-contracts/contracts/interfaces/IERC4906.sollib/v4-core/lib/openzeppelin-contracts/contracts/interfaces/IERC5267.sollib/v4-core/lib/openzeppelin-contracts/contracts/interfaces/IERC5313.sollib/v4-core/lib/openzeppelin-contracts/contracts/interfaces/IERC5805.sollib/v4-core/lib/openzeppelin-contracts/contracts/interfaces/IERC6372.sollib/v4-core/lib/openzeppelin-contracts/contracts/interfaces/IERC721.sollib/v4-core/lib/openzeppelin-contracts/contracts/interfaces/IERC721Enumerable.sollib/v4-core/lib/openzeppelin-contracts/contracts/interfaces/IERC721Metadata.sollib/v4-core/lib/openzeppelin-contracts/contracts/interfaces/IERC721Receiver.sollib/v4-core/lib/openzeppelin-contracts/contracts/interfaces/IERC777.sollib/v4-core/lib/openzeppelin-contracts/contracts/interfaces/IERC777Recipient.sollib/v4-core/lib/openzeppelin-contracts/contracts/interfaces/IERC777Sender.sollib/v4-core/lib/openzeppelin-contracts/contracts/interfaces/README.adoclib/v4-core/lib/openzeppelin-contracts/contracts/interfaces/draft-IERC1822.sollib/v4-core/lib/openzeppelin-contracts/contracts/interfaces/draft-IERC6093.sollib/v4-core/lib/openzeppelin-contracts/contracts/metatx/ERC2771Context.sollib/v4-core/lib/openzeppelin-contracts/contracts/metatx/ERC2771Forwarder.sollib/v4-core/lib/openzeppelin-contracts/contracts/metatx/README.adoclib/v4-core/lib/openzeppelin-contracts/contracts/mocks/AccessManagedTarget.sollib/v4-core/lib/openzeppelin-contracts/contracts/mocks/ArraysMock.sollib/v4-core/lib/openzeppelin-contracts/contracts/mocks/AuthorityMock.sollib/v4-core/lib/openzeppelin-contracts/contracts/mocks/Base64Dirty.sollib/v4-core/lib/openzeppelin-contracts/contracts/mocks/CallReceiverMock.sollib/v4-core/lib/openzeppelin-contracts/contracts/mocks/ContextMock.sollib/v4-core/lib/openzeppelin-contracts/contracts/mocks/DummyImplementation.sollib/v4-core/lib/openzeppelin-contracts/contracts/mocks/EIP712Verifier.sollib/v4-core/lib/openzeppelin-contracts/contracts/mocks/ERC1271WalletMock.sollib/v4-core/lib/openzeppelin-contracts/contracts/mocks/ERC165/ERC165InterfacesSupported.sollib/v4-core/lib/openzeppelin-contracts/contracts/mocks/ERC165/ERC165MaliciousData.sollib/v4-core/lib/openzeppelin-contracts/contracts/mocks/ERC165/ERC165MissingData.sollib/v4-core/lib/openzeppelin-contracts/contracts/mocks/ERC165/ERC165NotSupported.sollib/v4-core/lib/openzeppelin-contracts/contracts/mocks/ERC165/ERC165ReturnBomb.sollib/v4-core/lib/openzeppelin-contracts/contracts/mocks/ERC2771ContextMock.sollib/v4-core/lib/openzeppelin-contracts/contracts/mocks/ERC3156FlashBorrowerMock.sollib/v4-core/lib/openzeppelin-contracts/contracts/mocks/EtherReceiverMock.sollib/v4-core/lib/openzeppelin-contracts/contracts/mocks/InitializableMock.sollib/v4-core/lib/openzeppelin-contracts/contracts/mocks/MulticallTest.sollib/v4-core/lib/openzeppelin-contracts/contracts/mocks/MultipleInheritanceInitializableMocks.sollib/v4-core/lib/openzeppelin-contracts/contracts/mocks/PausableMock.sollib/v4-core/lib/openzeppelin-contracts/contracts/mocks/ReentrancyAttack.sollib/v4-core/lib/openzeppelin-contracts/contracts/mocks/ReentrancyMock.sollib/v4-core/lib/openzeppelin-contracts/contracts/mocks/RegressionImplementation.sollib/v4-core/lib/openzeppelin-contracts/contracts/mocks/SingleInheritanceInitializableMocks.sollib/v4-core/lib/openzeppelin-contracts/contracts/mocks/Stateless.sollib/v4-core/lib/openzeppelin-contracts/contracts/mocks/StorageSlotMock.sollib/v4-core/lib/openzeppelin-contracts/contracts/mocks/TimelockReentrant.sollib/v4-core/lib/openzeppelin-contracts/contracts/mocks/UpgradeableBeaconMock.sollib/v4-core/lib/openzeppelin-contracts/contracts/mocks/VotesMock.sollib/v4-core/lib/openzeppelin-contracts/contracts/mocks/compound/CompTimelock.sollib/v4-core/lib/openzeppelin-contracts/contracts/mocks/docs/ERC20WithAutoMinerReward.sollib/v4-core/lib/openzeppelin-contracts/contracts/mocks/docs/ERC4626Fees.sollib/v4-core/lib/openzeppelin-contracts/contracts/mocks/docs/access-control/AccessControlERC20MintBase.sollib/v4-core/lib/openzeppelin-contracts/contracts/mocks/docs/access-control/AccessControlERC20MintMissing.sollib/v4-core/lib/openzeppelin-contracts/contracts/mocks/docs/access-control/AccessControlERC20MintOnlyRole.sollib/v4-core/lib/openzeppelin-contracts/contracts/mocks/docs/access-control/AccessManagedERC20MintBase.sollib/v4-core/lib/openzeppelin-contracts/contracts/mocks/docs/access-control/MyContractOwnable.sollib/v4-core/lib/openzeppelin-contracts/contracts/mocks/docs/governance/MyGovernor.sollib/v4-core/lib/openzeppelin-contracts/contracts/mocks/docs/governance/MyToken.sollib/v4-core/lib/openzeppelin-contracts/contracts/mocks/docs/governance/MyTokenTimestampBased.sollib/v4-core/lib/openzeppelin-contracts/contracts/mocks/docs/governance/MyTokenWrapped.sollib/v4-core/lib/openzeppelin-contracts/contracts/mocks/governance/GovernorMock.sollib/v4-core/lib/openzeppelin-contracts/contracts/mocks/governance/GovernorPreventLateQuorumMock.sollib/v4-core/lib/openzeppelin-contracts/contracts/mocks/governance/GovernorStorageMock.sollib/v4-core/lib/openzeppelin-contracts/contracts/mocks/governance/GovernorTimelockAccessMock.sollib/v4-core/lib/openzeppelin-contracts/contracts/mocks/governance/GovernorTimelockCompoundMock.sollib/v4-core/lib/openzeppelin-contracts/contracts/mocks/governance/GovernorTimelockControlMock.sollib/v4-core/lib/openzeppelin-contracts/contracts/mocks/governance/GovernorVoteMock.sollib/v4-core/lib/openzeppelin-contracts/contracts/mocks/governance/GovernorWithParamsMock.sollib/v4-core/lib/openzeppelin-contracts/contracts/mocks/proxy/BadBeacon.sollib/v4-core/lib/openzeppelin-contracts/contracts/mocks/proxy/ClashingImplementation.sollib/v4-core/lib/openzeppelin-contracts/contracts/mocks/proxy/UUPSUpgradeableMock.sollib/v4-core/lib/openzeppelin-contracts/contracts/mocks/token/ERC1155ReceiverMock.sollib/v4-core/lib/openzeppelin-contracts/contracts/mocks/token/ERC20ApprovalMock.sollib/v4-core/lib/openzeppelin-contracts/contracts/mocks/token/ERC20DecimalsMock.sollib/v4-core/lib/openzeppelin-contracts/contracts/mocks/token/ERC20ExcessDecimalsMock.sollib/v4-core/lib/openzeppelin-contracts/contracts/mocks/token/ERC20FlashMintMock.sollib/v4-core/lib/openzeppelin-contracts/contracts/mocks/token/ERC20ForceApproveMock.sollib/v4-core/lib/openzeppelin-contracts/contracts/mocks/token/ERC20Mock.sollib/v4-core/lib/openzeppelin-contracts/contracts/mocks/token/ERC20MulticallMock.sollib/v4-core/lib/openzeppelin-contracts/contracts/mocks/token/ERC20NoReturnMock.sollib/v4-core/lib/openzeppelin-contracts/contracts/mocks/token/ERC20Reentrant.sollib/v4-core/lib/openzeppelin-contracts/contracts/mocks/token/ERC20ReturnFalseMock.sollib/v4-core/lib/openzeppelin-contracts/contracts/mocks/token/ERC20VotesLegacyMock.sollib/v4-core/lib/openzeppelin-contracts/contracts/mocks/token/ERC4626LimitsMock.sollib/v4-core/lib/openzeppelin-contracts/contracts/mocks/token/ERC4626Mock.sollib/v4-core/lib/openzeppelin-contracts/contracts/mocks/token/ERC4626OffsetMock.sollib/v4-core/lib/openzeppelin-contracts/contracts/mocks/token/ERC4646FeesMock.sollib/v4-core/lib/openzeppelin-contracts/contracts/mocks/token/ERC721ConsecutiveEnumerableMock.sollib/v4-core/lib/openzeppelin-contracts/contracts/mocks/token/ERC721ConsecutiveMock.sollib/v4-core/lib/openzeppelin-contracts/contracts/mocks/token/ERC721ReceiverMock.sollib/v4-core/lib/openzeppelin-contracts/contracts/mocks/token/ERC721URIStorageMock.sollib/v4-core/lib/openzeppelin-contracts/contracts/mocks/token/VotesTimestamp.sollib/v4-core/lib/openzeppelin-contracts/contracts/package.jsonlib/v4-core/lib/openzeppelin-contracts/contracts/proxy/Clones.sollib/v4-core/lib/openzeppelin-contracts/contracts/proxy/ERC1967/ERC1967Proxy.sollib/v4-core/lib/openzeppelin-contracts/contracts/proxy/ERC1967/ERC1967Utils.sollib/v4-core/lib/openzeppelin-contracts/contracts/proxy/Proxy.sollib/v4-core/lib/openzeppelin-contracts/contracts/proxy/README.adoclib/v4-core/lib/openzeppelin-contracts/contracts/proxy/beacon/BeaconProxy.sollib/v4-core/lib/openzeppelin-contracts/contracts/proxy/beacon/IBeacon.sollib/v4-core/lib/openzeppelin-contracts/contracts/proxy/beacon/UpgradeableBeacon.sollib/v4-core/lib/openzeppelin-contracts/contracts/proxy/transparent/ProxyAdmin.sollib/v4-core/lib/openzeppelin-contracts/contracts/proxy/transparent/TransparentUpgradeableProxy.sollib/v4-core/lib/openzeppelin-contracts/contracts/proxy/utils/Initializable.sollib/v4-core/lib/openzeppelin-contracts/contracts/proxy/utils/UUPSUpgradeable.sollib/v4-core/lib/openzeppelin-contracts/contracts/token/ERC1155/ERC1155.sollib/v4-core/lib/openzeppelin-contracts/contracts/token/ERC1155/IERC1155.sollib/v4-core/lib/openzeppelin-contracts/contracts/token/ERC1155/IERC1155Receiver.sollib/v4-core/lib/openzeppelin-contracts/contracts/token/ERC1155/README.adoclib/v4-core/lib/openzeppelin-contracts/contracts/token/ERC1155/extensions/ERC1155Burnable.sollib/v4-core/lib/openzeppelin-contracts/contracts/token/ERC1155/extensions/ERC1155Pausable.sollib/v4-core/lib/openzeppelin-contracts/contracts/token/ERC1155/extensions/ERC1155Supply.sollib/v4-core/lib/openzeppelin-contracts/contracts/token/ERC1155/extensions/ERC1155URIStorage.sollib/v4-core/lib/openzeppelin-contracts/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sollib/v4-core/lib/openzeppelin-contracts/contracts/token/ERC1155/utils/ERC1155Holder.sollib/v4-core/lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sollib/v4-core/lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sollib/v4-core/lib/openzeppelin-contracts/contracts/token/ERC20/README.adoclib/v4-core/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC20Burnable.sollib/v4-core/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC20Capped.sollib/v4-core/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC20FlashMint.sollib/v4-core/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC20Pausable.sollib/v4-core/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC20Permit.sollib/v4-core/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC20Votes.sollib/v4-core/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC20Wrapper.sollib/v4-core/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC4626.sollib/v4-core/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sollib/v4-core/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Permit.sollib/v4-core/lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sollib/v4-core/lib/openzeppelin-contracts/contracts/token/ERC721/ERC721.sollib/v4-core/lib/openzeppelin-contracts/contracts/token/ERC721/IERC721.sollib/v4-core/lib/openzeppelin-contracts/contracts/token/ERC721/IERC721Receiver.sollib/v4-core/lib/openzeppelin-contracts/contracts/token/ERC721/README.adoclib/v4-core/lib/openzeppelin-contracts/contracts/token/ERC721/extensions/ERC721Burnable.sollib/v4-core/lib/openzeppelin-contracts/contracts/token/ERC721/extensions/ERC721Consecutive.sollib/v4-core/lib/openzeppelin-contracts/contracts/token/ERC721/extensions/ERC721Enumerable.sollib/v4-core/lib/openzeppelin-contracts/contracts/token/ERC721/extensions/ERC721Pausable.sollib/v4-core/lib/openzeppelin-contracts/contracts/token/ERC721/extensions/ERC721Royalty.sollib/v4-core/lib/openzeppelin-contracts/contracts/token/ERC721/extensions/ERC721URIStorage.sollib/v4-core/lib/openzeppelin-contracts/contracts/token/ERC721/extensions/ERC721Votes.sollib/v4-core/lib/openzeppelin-contracts/contracts/token/ERC721/extensions/ERC721Wrapper.sollib/v4-core/lib/openzeppelin-contracts/contracts/token/ERC721/extensions/IERC721Enumerable.sollib/v4-core/lib/openzeppelin-contracts/contracts/token/ERC721/extensions/IERC721Metadata.sollib/v4-core/lib/openzeppelin-contracts/contracts/token/ERC721/utils/ERC721Holder.sollib/v4-core/lib/openzeppelin-contracts/contracts/token/common/ERC2981.sollib/v4-core/lib/openzeppelin-contracts/contracts/token/common/README.adoclib/v4-core/lib/openzeppelin-contracts/contracts/utils/Address.sollib/v4-core/lib/openzeppelin-contracts/contracts/utils/Arrays.sollib/v4-core/lib/openzeppelin-contracts/contracts/utils/Base64.sollib/v4-core/lib/openzeppelin-contracts/contracts/utils/Context.sollib/v4-core/lib/openzeppelin-contracts/contracts/utils/Create2.sollib/v4-core/lib/openzeppelin-contracts/contracts/utils/Multicall.sollib/v4-core/lib/openzeppelin-contracts/contracts/utils/Nonces.sollib/v4-core/lib/openzeppelin-contracts/contracts/utils/Pausable.sollib/v4-core/lib/openzeppelin-contracts/contracts/utils/README.adoclib/v4-core/lib/openzeppelin-contracts/contracts/utils/ReentrancyGuard.sollib/v4-core/lib/openzeppelin-contracts/contracts/utils/ShortStrings.sollib/v4-core/lib/openzeppelin-contracts/contracts/utils/StorageSlot.sollib/v4-core/lib/openzeppelin-contracts/contracts/utils/Strings.sollib/v4-core/lib/openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sollib/v4-core/lib/openzeppelin-contracts/contracts/utils/cryptography/EIP712.sollib/v4-core/lib/openzeppelin-contracts/contracts/utils/cryptography/MerkleProof.sollib/v4-core/lib/openzeppelin-contracts/contracts/utils/cryptography/MessageHashUtils.sollib/v4-core/lib/openzeppelin-contracts/contracts/utils/cryptography/SignatureChecker.sollib/v4-core/lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sollib/v4-core/lib/openzeppelin-contracts/contracts/utils/introspection/ERC165Checker.sollib/v4-core/lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sollib/v4-core/lib/openzeppelin-contracts/contracts/utils/math/Math.sollib/v4-core/lib/openzeppelin-contracts/contracts/utils/math/SafeCast.sollib/v4-core/lib/openzeppelin-contracts/contracts/utils/math/SignedMath.sollib/v4-core/lib/openzeppelin-contracts/contracts/utils/structs/BitMaps.sollib/v4-core/lib/openzeppelin-contracts/contracts/utils/structs/Checkpoints.sollib/v4-core/lib/openzeppelin-contracts/contracts/utils/structs/DoubleEndedQueue.sollib/v4-core/lib/openzeppelin-contracts/contracts/utils/structs/EnumerableMap.sollib/v4-core/lib/openzeppelin-contracts/contracts/utils/structs/EnumerableSet.sollib/v4-core/lib/openzeppelin-contracts/contracts/utils/types/Time.sollib/v4-core/lib/openzeppelin-contracts/contracts/vendor/compound/ICompoundTimelock.sollib/v4-core/lib/openzeppelin-contracts/contracts/vendor/compound/LICENSElib/v4-core/lib/solmate/LICENSElib/v4-core/lib/solmate/README.mdlib/v4-core/lib/solmate/src/auth/Auth.sollib/v4-core/lib/solmate/src/auth/Owned.sollib/v4-core/lib/solmate/src/auth/authorities/MultiRolesAuthority.sollib/v4-core/lib/solmate/src/auth/authorities/RolesAuthority.sollib/v4-core/lib/solmate/src/mixins/ERC4626.sollib/v4-core/lib/solmate/src/test/Auth.t.sollib/v4-core/lib/solmate/src/test/Bytes32AddressLib.t.sollib/v4-core/lib/solmate/src/test/CREATE3.t.sollib/v4-core/lib/solmate/src/test/DSTestPlus.t.sollib/v4-core/lib/solmate/src/test/ERC1155.t.sollib/v4-core/lib/solmate/src/test/ERC20.t.sollib/v4-core/lib/solmate/src/test/ERC4626.t.sollib/v4-core/lib/solmate/src/test/ERC6909.t.sollib/v4-core/lib/solmate/src/test/ERC721.t.sollib/v4-core/lib/solmate/src/test/FixedPointMathLib.t.sollib/v4-core/lib/solmate/src/test/LibString.t.sollib/v4-core/lib/solmate/src/test/MerkleProofLib.t.sollib/v4-core/lib/solmate/src/test/MultiRolesAuthority.t.sollib/v4-core/lib/solmate/src/test/Owned.t.sollib/v4-core/lib/solmate/src/test/ReentrancyGuard.t.sollib/v4-core/lib/solmate/src/test/RolesAuthority.t.sollib/v4-core/lib/solmate/src/test/SSTORE2.t.sollib/v4-core/lib/solmate/src/test/SafeCastLib.t.sollib/v4-core/lib/solmate/src/test/SafeTransferLib.t.sollib/v4-core/lib/solmate/src/test/SignedWadMath.t.sollib/v4-core/lib/solmate/src/test/WETH.t.sollib/v4-core/lib/solmate/src/test/utils/DSInvariantTest.sollib/v4-core/lib/solmate/src/test/utils/DSTestPlus.sollib/v4-core/lib/solmate/src/test/utils/Hevm.sollib/v4-core/lib/solmate/src/test/utils/mocks/MockAuthChild.sollib/v4-core/lib/solmate/src/test/utils/mocks/MockAuthority.sollib/v4-core/lib/solmate/src/test/utils/mocks/MockERC1155.sollib/v4-core/lib/solmate/src/test/utils/mocks/MockERC20.sollib/v4-core/lib/solmate/src/test/utils/mocks/MockERC4626.sollib/v4-core/lib/solmate/src/test/utils/mocks/MockERC6909.sollib/v4-core/lib/solmate/src/test/utils/mocks/MockERC721.sollib/v4-core/lib/solmate/src/test/utils/mocks/MockOwned.sollib/v4-core/lib/solmate/src/test/utils/weird-tokens/MissingReturnToken.sollib/v4-core/lib/solmate/src/test/utils/weird-tokens/ReturnsFalseToken.sollib/v4-core/lib/solmate/src/test/utils/weird-tokens/ReturnsGarbageToken.sollib/v4-core/lib/solmate/src/test/utils/weird-tokens/ReturnsTooLittleToken.sollib/v4-core/lib/solmate/src/test/utils/weird-tokens/ReturnsTooMuchToken.sollib/v4-core/lib/solmate/src/test/utils/weird-tokens/ReturnsTwoToken.sollib/v4-core/lib/solmate/src/test/utils/weird-tokens/RevertingToken.sollib/v4-core/lib/solmate/src/tokens/ERC1155.sollib/v4-core/lib/solmate/src/tokens/ERC20.sollib/v4-core/lib/solmate/src/tokens/ERC6909.sollib/v4-core/lib/solmate/src/tokens/ERC721.sollib/v4-core/lib/solmate/src/tokens/WETH.sollib/v4-core/lib/solmate/src/utils/Bytes32AddressLib.sollib/v4-core/lib/solmate/src/utils/CREATE3.sollib/v4-core/lib/solmate/src/utils/FixedPointMathLib.sollib/v4-core/lib/solmate/src/utils/LibString.sollib/v4-core/lib/solmate/src/utils/MerkleProofLib.sollib/v4-core/lib/solmate/src/utils/ReentrancyGuard.sollib/v4-core/lib/solmate/src/utils/SSTORE2.sollib/v4-core/lib/solmate/src/utils/SafeCastLib.sollib/v4-core/lib/solmate/src/utils/SafeTransferLib.sollib/v4-core/lib/solmate/src/utils/SignedWadMath.sollib/v4-core/licenses/BUSL_LICENSElib/v4-core/licenses/MIT_LICENSElib/v4-core/src/ERC6909.sollib/v4-core/src/ERC6909Claims.sollib/v4-core/src/Extsload.sollib/v4-core/src/Exttload.sollib/v4-core/src/NoDelegateCall.sollib/v4-core/src/PoolManager.sollib/v4-core/src/ProtocolFees.sollib/v4-core/src/interfaces/IExtsload.sollib/v4-core/src/interfaces/IExttload.sollib/v4-core/src/interfaces/IHooks.sollib/v4-core/src/interfaces/IPoolManager.sollib/v4-core/src/interfaces/IProtocolFees.sollib/v4-core/src/interfaces/callback/IUnlockCallback.sollib/v4-core/src/interfaces/external/IERC20Minimal.sollib/v4-core/src/interfaces/external/IERC6909Claims.sollib/v4-core/src/libraries/BitMath.sollib/v4-core/src/libraries/CurrencyDelta.sollib/v4-core/src/libraries/CurrencyReserves.sollib/v4-core/src/libraries/CustomRevert.sollib/v4-core/src/libraries/FixedPoint128.sollib/v4-core/src/libraries/FixedPoint96.sollib/v4-core/src/libraries/FullMath.sollib/v4-core/src/libraries/Hooks.sollib/v4-core/src/libraries/LPFeeLibrary.sollib/v4-core/src/libraries/LiquidityMath.sollib/v4-core/src/libraries/Lock.sollib/v4-core/src/libraries/NonzeroDeltaCount.sollib/v4-core/src/libraries/ParseBytes.sollib/v4-core/src/libraries/Pool.sollib/v4-core/src/libraries/Position.sollib/v4-core/src/libraries/ProtocolFeeLibrary.sollib/v4-core/src/libraries/SafeCast.sollib/v4-core/src/libraries/SqrtPriceMath.sollib/v4-core/src/libraries/StateLibrary.sollib/v4-core/src/libraries/SwapMath.sollib/v4-core/src/libraries/TickBitmap.sollib/v4-core/src/libraries/TickMath.sollib/v4-core/src/libraries/TransientStateLibrary.sollib/v4-core/src/libraries/UnsafeMath.sollib/v4-core/src/test/ActionsRouter.sollib/v4-core/src/test/BaseTestHooks.sollib/v4-core/src/test/CurrencyTest.sollib/v4-core/src/test/CustomCurveHook.sollib/v4-core/src/test/DeltaReturningHook.sollib/v4-core/src/test/DynamicFeesTestHook.sollib/v4-core/src/test/DynamicReturnFeeTestHook.sollib/v4-core/src/test/EmptyRevertContract.sollib/v4-core/src/test/EmptyTestHooks.sollib/v4-core/src/test/FeeTakingHook.sollib/v4-core/src/test/Fuzzers.sollib/v4-core/src/test/HooksTest.sollib/v4-core/src/test/LPFeeTakingHook.sollib/v4-core/src/test/LiquidityMathTest.sollib/v4-core/src/test/MockContract.sollib/v4-core/src/test/MockERC6909Claims.sollib/v4-core/src/test/MockHooks.sollib/v4-core/src/test/NativeERC20.sollib/v4-core/src/test/NoDelegateCallTest.sollib/v4-core/src/test/PoolClaimsTest.sollib/v4-core/src/test/PoolDonateTest.sollib/v4-core/src/test/PoolEmptyUnlockTest.sollib/v4-core/src/test/PoolModifyLiquidityTest.sollib/v4-core/src/test/PoolModifyLiquidityTestNoChecks.sollib/v4-core/src/test/PoolNestedActionsTest.sollib/v4-core/src/test/PoolSwapTest.sollib/v4-core/src/test/PoolTakeTest.sollib/v4-core/src/test/PoolTestBase.sollib/v4-core/src/test/ProtocolFeesImplementation.sollib/v4-core/src/test/ProxyPoolManager.sollib/v4-core/src/test/SkipCallsTestHook.sollib/v4-core/src/test/SqrtPriceMathEchidnaTest.sollib/v4-core/src/test/SwapRouterNoChecks.sollib/v4-core/src/test/TestERC20.sollib/v4-core/src/test/TestInvalidERC20.sollib/v4-core/src/test/TickMathEchidnaTest.sollib/v4-core/src/test/TickMathTest.sollib/v4-core/src/test/TickOverflowSafetyEchidnaTest.sollib/v4-core/src/types/BalanceDelta.sollib/v4-core/src/types/BeforeSwapDelta.sollib/v4-core/src/types/Currency.sollib/v4-core/src/types/PoolId.sollib/v4-core/src/types/PoolKey.sollib/v4-core/src/types/PoolOperation.sollib/v4-core/src/types/Slot0.sollib/v4-periphery/LICENSElib/v4-periphery/README.mdlib/v4-periphery/lib/permit2/LICENSElib/v4-periphery/lib/permit2/README.mdlib/v4-periphery/lib/permit2/src/AllowanceTransfer.sollib/v4-periphery/lib/permit2/src/EIP712.sollib/v4-periphery/lib/permit2/src/Permit2.sollib/v4-periphery/lib/permit2/src/PermitErrors.sollib/v4-periphery/lib/permit2/src/SignatureTransfer.sollib/v4-periphery/lib/permit2/src/interfaces/IAllowanceTransfer.sollib/v4-periphery/lib/permit2/src/interfaces/IDAIPermit.sollib/v4-periphery/lib/permit2/src/interfaces/IEIP712.sollib/v4-periphery/lib/permit2/src/interfaces/IERC1271.sollib/v4-periphery/lib/permit2/src/interfaces/IPermit2.sollib/v4-periphery/lib/permit2/src/interfaces/ISignatureTransfer.sollib/v4-periphery/lib/permit2/src/libraries/Allowance.sollib/v4-periphery/lib/permit2/src/libraries/Permit2Lib.sollib/v4-periphery/lib/permit2/src/libraries/PermitHash.sollib/v4-periphery/lib/permit2/src/libraries/SafeCast160.sollib/v4-periphery/lib/permit2/src/libraries/SignatureVerification.sollib/v4-periphery/src/PositionDescriptor.sollib/v4-periphery/src/PositionManager.sollib/v4-periphery/src/UniswapV4DeployerCompetition.sollib/v4-periphery/src/V4Router.sollib/v4-periphery/src/base/BaseActionsRouter.sollib/v4-periphery/src/base/BaseV4Quoter.sollib/v4-periphery/src/base/DeltaResolver.sollib/v4-periphery/src/base/EIP712_v4.sollib/v4-periphery/src/base/ERC721Permit_v4.sollib/v4-periphery/src/base/ImmutableState.sollib/v4-periphery/src/base/Multicall_v4.sollib/v4-periphery/src/base/NativeWrapper.sollib/v4-periphery/src/base/Notifier.sollib/v4-periphery/src/base/Permit2Forwarder.sollib/v4-periphery/src/base/PoolInitializer_v4.sollib/v4-periphery/src/base/ReentrancyLock.sollib/v4-periphery/src/base/SafeCallback.sollib/v4-periphery/src/base/UnorderedNonce.sollib/v4-periphery/src/base/hooks/BaseTokenWrapperHook.sollib/v4-periphery/src/hooks/WETHHook.sollib/v4-periphery/src/hooks/WstETHHook.sollib/v4-periphery/src/hooks/WstETHRoutingHook.sollib/v4-periphery/src/interfaces/IEIP712_v4.sollib/v4-periphery/src/interfaces/IERC721Permit_v4.sollib/v4-periphery/src/interfaces/IImmutableState.sollib/v4-periphery/src/interfaces/IMsgSender.sollib/v4-periphery/src/interfaces/IMulticall_v4.sollib/v4-periphery/src/interfaces/INotifier.sollib/v4-periphery/src/interfaces/IPermit2Forwarder.sollib/v4-periphery/src/interfaces/IPoolInitializer_v4.sollib/v4-periphery/src/interfaces/IPositionDescriptor.sollib/v4-periphery/src/interfaces/IPositionManager.sollib/v4-periphery/src/interfaces/IStateView.sollib/v4-periphery/src/interfaces/ISubscriber.sollib/v4-periphery/src/interfaces/IUniswapV4DeployerCompetition.sollib/v4-periphery/src/interfaces/IUnorderedNonce.sollib/v4-periphery/src/interfaces/IV4Quoter.sollib/v4-periphery/src/interfaces/IV4Router.sollib/v4-periphery/src/interfaces/external/IWETH9.sollib/v4-periphery/src/interfaces/external/IWstETH.sollib/v4-periphery/src/lens/StateView.sollib/v4-periphery/src/lens/V4Quoter.sollib/v4-periphery/src/libraries/ActionConstants.sollib/v4-periphery/src/libraries/Actions.sollib/v4-periphery/src/libraries/AddressStringUtil.sollib/v4-periphery/src/libraries/BipsLibrary.sollib/v4-periphery/src/libraries/CalldataDecoder.sollib/v4-periphery/src/libraries/CurrencyRatioSortOrder.sollib/v4-periphery/src/libraries/Descriptor.sollib/v4-periphery/src/libraries/ERC721PermitHash.sollib/v4-periphery/src/libraries/HexStrings.sollib/v4-periphery/src/libraries/LiquidityAmounts.sollib/v4-periphery/src/libraries/Locker.sollib/v4-periphery/src/libraries/PathKey.sollib/v4-periphery/src/libraries/PositionConfig.sollib/v4-periphery/src/libraries/PositionConfigId.sollib/v4-periphery/src/libraries/PositionInfoLibrary.sollib/v4-periphery/src/libraries/QuoterRevert.sollib/v4-periphery/src/libraries/SVG.sollib/v4-periphery/src/libraries/SafeCurrencyMetadata.sollib/v4-periphery/src/libraries/SlippageCheck.sollib/v4-periphery/src/libraries/VanityAddressLib.sollib/v4-periphery/src/utils/BaseHook.sollib/v4-periphery/src/utils/HookMiner.solsrc/HookFlags.solsrc/VolatilityGuardHook.solsrc/VolatilityGuardToken.soltest/VolatilityGuardHook.t.soltest/VolatilityGuardToken.t.sol - contracts tested
Write foundry tests2 files changedrevised
afterBuild contract projectwrites totest/**Implemented expanded adversarial Foundry coverage in:
- VolatilityGuardHook.t.sol
- VolatilityGuardToken.t.sol
Coverage now includes callback authorization, minimal permissions, amount limits, budget boundaries/expiry, rollback behavior, ring-buffer updates, allowance failures, zero-address transfers, infinite allowances, and supply conservation.
Reported two implementation defects in
.imd-findings.json:- Medium: exact-output swaps are budgeted using output rather than input currency units.
- Low: the public volume limit can exceed
uint128bucket capacity and trigger overflow reverts.
Verification:
forge fmt --checkpassedforge buildpassedforge testpassed: 23 tests- Both fuzz tests passed 10,000 runs
forge test --gas-reportpassed
ran oncodex · 6 turns · 3m 0s · 65.8K in · 6.7K out · 438.9K cachedsubmissionf3d9f49586f42bb6de8bf7e2ba5d879e5f28a014009b9602aecd6dfe4cbd72f5devicea1c5c6c3e93f5a311d26715fe81382674dca82117134c2e6f97c1bc5faea9f09started from5814ac1dc4be6db7a60ef38dbbdcc999a67c4d60bundle364266237740c7dfb75b4a71dded3dda788b5488fc3c2c36d32549708f286c5b · 592 KBverifiedrebuilt and matched · verifier 0.1.0 ·applied on084862c2b276fdfa166b167c2d6181d9d4a3e7504625ab89a8ae16a68ae16136changed · 2 filestest/VolatilityGuardHook.t.soltest/VolatilityGuardToken.t.solExact-output swaps consume the wrong currency units from the rolling budgetsrc/VolatilityGuardHook.sol:114
The hook always uses abs(params.amountSpecified) as volume. In Uniswap v4 this is the input amount for exact-input swaps, but it is the output amount for exact-output swaps. volumeBudget documents and exposes a per-direction input-currency budget, so exact-output traffic is accounted in a different token's raw units. Pairs with unequal decimals or prices can therefore bypass or spuriously exhaust the split-resistant input budget.
Advertised volume budget exceeds bucket storage capacity and can revert otherwise-budgeted swapssrc/VolatilityGuardHook.sol:232
Each directional bucket is uint128, while the public limit is liquidity * 64 in uint256. For sufficiently large liquidity, multiple individually valid swaps can remain below that limit but overflow bucket.zeroForOne or bucket.oneForZero in _recordVolume. The checked addition then reverts afterSwap and consequently the whole otherwise-valid swap.
Set active liquidity to type(uint128).max and remain within one 75-second epoch.
Complete one swap in a direction with abs(amountSpecified)=type(uint128).max, then attempt a second swap in the same direction with abs(amountSpecified)=1.
Expected from volumeBudget: used=type(uint128).max, limit=64*type(uint128).max, so the second swap is accepted and recorded.
Actual: beforeSwap accepts it, but afterSwap executes bucket.zeroForOne += 1 at line 232 and reverts with arithmetic overflow.
- contracts tested
Gas and size report2 files changed
afterWrite foundry testswrites totest/**.gas-snapshotartifacts/**Completed the gas and size deliverables:
- Added .gas-snapshot.
- Added full ABI gas coverage in GasSurface.t.sol.
- Added gas.md with every public function and deployed size.
Results:
VolatilityGuardHook: 6,685 bytes.VolatilityGuardToken: 1,130 bytes.- No EIP-170 size defect.
forge build: passed.forge test: 27 passed, 0 failed.forge snapshot --check: passed.forge fmt --check: passed.- Key fuzz tests ran 10,000 cases.
The report flags
afterSwapreaching 172,775 gas as the main launch-budget concern.ran oncodex · 6 turns · 3m 58s · 63.9K in · 8.3K out · 944.4K cachedsubmissiona148748f2bf9399ee50b969ecf86fe9db04238e2a006dbd9d2ced65bbc4f1f3cdevicea1c5c6c3e93f5a311d26715fe81382674dca82117134c2e6f97c1bc5faea9f09started fromeda1e06d99b43bf4c4fb1774762079a9c5edb72ebundlef004eee8d1a268b7510d0fa3f04f0cb517044b12751a2cb14feb73d309b477fc · 594 KBverifiedrebuilt and matched · verifier 0.1.0 ·applied on364266237740c7dfb75b4a71dded3dda788b5488fc3c2c36d32549708f286c5bchanged · 2 files.gas-snapshottest/GasSurface.t.sol - contracts integrated
Manifest1 file changed
afterBuild contract project, Write foundry tests, Gas and size reportwrites tolaunch.jsonUpdated launch.json with:
- Correct
univ4_hookdiscriminator - Explicit hook permissions matching flags
4288 - Required ETH/VGL pool configuration and decimal
sqrtPriceX96 - ABI integration paths
- Notes length: 1,872 characters
Verification:
forge build— passedforge test— 27 passed, 0 failed- Manifest structural checks — passed
- Scope check — only
launch.jsonchanged
ran oncodex · 4 turns · 1m 49s · 58.3K in · 3.3K out · 439K cachedsubmissionf036ff99e1062f9af764bcabe0331544bb21822c90c89cfb059c3f860aa29506devicea1c5c6c3e93f5a311d26715fe81382674dca82117134c2e6f97c1bc5faea9f09started fromf61f71144982b976a4f99d8f0b4feab63ed2ced6bundle2aaf30a3c01039d7cd0b32c88189452723d1ec99ff18fa25280c04973764d1c4 · 595 KBverifiedrebuilt and matched · verifier 0.1.0 ·applied on084862c2b276fdfa166b167c2d6181d9d4a3e7504625ab89a8ae16a68ae16136, 364266237740c7dfb75b4a71dded3dda788b5488fc3c2c36d32549708f286c5b, f004eee8d1a268b7510d0fa3f04f0cb517044b12751a2cb14feb73d309b477fcchanged · 1 filelaunch.json - Correct
- contracts reviewed
Adversarial review3 findings · 2 high
afterBuild contract project, Write foundry tests, Gas and size report, ManifestWrote three findings to .imd-findings.json, ranked by severity:
- High: Two-unit partial fill can exhaust the directional volume budget.
- High: Swaps can exceed the adaptive price band and still succeed.
- Medium: Skipped tick changes corrupt the time-weighted reference.
Each includes concrete reproduction inputs. Findings use source tracing and arithmetic checks; no live transactions were executed. Implementation files remain unchanged.
ran oncodex · 4 turns · 2m 9s · 88.7K in · 3.7K out · 303.4K cachedsubmissionf115a22bb388740834cb8aa73aa521dd7d9a4c854e260c16d79f61132d18f898device0edd2bbb66d2d014fbbda834d6ccbc278847c31414f601db126e7a1269baddd9started fromd60fd832d434e61442ce63ad0f6f0184b55cce74bundlenoneapplied on084862c2b276fdfa166b167c2d6181d9d4a3e7504625ab89a8ae16a68ae16136, 364266237740c7dfb75b4a71dded3dda788b5488fc3c2c36d32549708f286c5b, f004eee8d1a268b7510d0fa3f04f0cb517044b12751a2cb14feb73d309b477fc, 2aaf30a3c01039d7cd0b32c88189452723d1ec99ff18fa25280c04973764d1c4changed · 0 filesnothinghighPartial fills can exhaust the entire directional budget for two base unitssrc/VolatilityGuardHook.sol:129
The hook ignores the authenticated BalanceDelta and charges abs(amountSpecified), although PoolManager permits partial fills at sqrtPriceLimitX96. Any trader can consume the complete rolling budget without trading that volume, denying subsequent swaps in that direction until bucket expiry. A second opposite-direction partial fill can block both directions.
The same accounting also mixes output-currency units into the input-currency budget for exact-output swaps. Tests always supply a zero BalanceDelta and assert requested amounts, so they enshrine rather than detect the mismatch. Check and record the actual input delta after execution; exact-output requests cannot be compared directly with an input-denominated remaining budget.
highThe adaptive price band does not constrain the swap that crosses itsrc/VolatilityGuardHook.sol:139
beforeSwap checks only the starting tick. afterSwap commits an arbitrarily large price movement and sets guardedAt instead of enforcing the required per-swap deviation limit. Thus the first price shock succeeds and only later trades, including corrective trades, are blocked. Documentation acknowledges this behavior, but it does not meet the approved adaptive per-swap protection requirement.
Returning no delta does not prevent validating the resulting PoolManager price and reverting the entire swap. The check should use the applicable pre-execution reference/band so the triggering swap cannot rewrite its own reference or enlarge its own limit.
Discarded within-period tick changes corrupt the time-weighted referencesrc/VolatilityGuardHook.sol:244
A swap occurring less than 30 seconds after the newest observation updates lastTick but is discarded from observation history. _reference subsequently weights the old sampled tick over the entire elapsed interval, even when the pool spent almost all that interval at a different tick. This is not merely a manipulable internal TWAP: it assigns time to a price that was not present.
Sampling-boundary trades can distort guard decisions cheaply, and the same-block/count tests never assert elapsed-time price integration. Maintain a bounded cumulative tick integral across price changes and sample that integral, rather than dropping the changes themselves.
- contracts updated
Build contract project8 files changed
Implemented and verified all five reviewer findings.
Key fixes:
- Volume accounting now uses actual authenticated input deltas, including fees and partial fills.
- Exact-output swaps are budgeted in input-currency units.
- Band-crossing swaps revert atomically in
afterSwap. - Volume buckets use
uint256, matching advertised capacity. - TWAP uses a cumulative tick integral updated on every successful price change.
- Updated ABI, launch manifest, architecture, threat model, review, and frontend integration docs.
- Recorded all verdicts in .imd-responses.json.
Verification:
forge build: passedforge test: 17 passed, 0 failed- Key fuzz tests: 10,000 runs
forge fmt --check: passed- Exported hook ABI matches
forge inspectafter JSON normalization git diff --check: passed
ran oncodex · 4 turns · 5m 35s · 83.6K in · 13.9K out · 1.1M cachedsubmission6e0437d1987c249da0ffab4024d57712578cf251f917ba29bd52e31867abb17ddevicea1c5c6c3e93f5a311d26715fe81382674dca82117134c2e6f97c1bc5faea9f09started from5814ac1dc4be6db7a60ef38dbbdcc999a67c4d60bundle084862c2b276fdfa166b167c2d6181d9d4a3e7504625ab89a8ae16a68ae16136 · 595 KBverifiedrebuilt and matched · verifier 0.1.0 ·changed · 8 filesREVIEW.mddocs/abi/VolatilityGuardHook.jsondocs/architecture.mddocs/frontend-integration.mddocs/threat-model.mdlaunch.jsonsrc/VolatilityGuardHook.soltest/VolatilityGuardHook.t.sol - contracts updated
Write foundry testsclone failedcould not restore accepted work: accepted work conflicts with a dependency, which plan validation should have …
could not restore accepted work: accepted work conflicts with a dependency, which plan validation should have prevented:
ran oncodex · 1ssubmission56ffdaed13127b09904cb3b43c096bc0469b0509f10a096669767280509b099adevice0edd2bbb66d2d014fbbda834d6ccbc278847c31414f601db126e7a1269baddd9started from0243d7da4a4337ae8b16bcdf15bb4ead736fd68fbundlenoneapplied on084862c2b276fdfa166b167c2d6181d9d4a3e7504625ab89a8ae16a68ae16136changed · 0 filesnothingclone failedcould not restore accepted work: accepted work conflicts with a dependency, which plan validation should have …
could not restore accepted work: accepted work conflicts with a dependency, which plan validation should have prevented:
ran oncodex · 0ssubmission43a31db7e1ec4f5738d2aa36819a794f4adcd000c49b49b90938f955aafc34a0devicea1c5c6c3e93f5a311d26715fe81382674dca82117134c2e6f97c1bc5faea9f09started from0243d7da4a4337ae8b16bcdf15bb4ead736fd68fbundlenoneapplied on084862c2b276fdfa166b167c2d6181d9d4a3e7504625ab89a8ae16a68ae16136changed · 0 filesnothingclone failedcould not restore accepted work: accepted work conflicts with a dependency, which plan validation should have …
afterBuild contract projectwrites totest/**could not restore accepted work: accepted work conflicts with a dependency, which plan validation should have prevented:
ran oncodex · 1ssubmission8086d5a6bf9f755813e8aaa13d3eaa4154a8c394795e4ff675599aa3d2bf6c12device0edd2bbb66d2d014fbbda834d6ccbc278847c31414f601db126e7a1269baddd9started from0243d7da4a4337ae8b16bcdf15bb4ead736fd68fbundlenoneapplied on084862c2b276fdfa166b167c2d6181d9d4a3e7504625ab89a8ae16a68ae16136changed · 0 filesnothing - contracts publishedIdentity-md/launch-44-volatilityguardhook-volatilityguardtoken
- deployedThis workflow was cancelled. This step will not start.
- website builtafter deployment
- website publishedafter the website is accepted
- hostedThis workflow was cancelled. This step will not start.
- checkednot run; the workflow was cancelled