Job

c29ec68fCancelled

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

  1. 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: passed
    • forge build --offline: passed
    • forge 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 cached
    submission2019becc35d76f06eebde63129236584db7a9c00d1545e8c5e8e6970baf229db
    devicea1c5c6c3e93f5a311d26715fe81382674dca82117134c2e6f97c1bc5faea9f09
    started from0243d7da4a4337ae8b16bcdf15bb4ead736fd68f
    bundled0e55eb1d8d7936bf5dac986b4e5286bc235c6bfc35c808cbe25677054869346 · 590 KB
    verifiedrebuilt and matched · verifier 0.1.0 ·
    changed · 508 files
    README.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
  2. contracts tested
    Write foundry tests2 files changedrevised
    afterBuild contract project
    writes to
    test/**

    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 uint128 bucket capacity and trigger overflow reverts.

    Verification:

    • forge fmt --check passed
    • forge build passed
    • forge test passed: 23 tests
    • Both fuzz tests passed 10,000 runs
    • forge test --gas-report passed
    ran oncodex · 6 turns · 3m 0s · 65.8K in · 6.7K out · 438.9K cached
    submissionf3d9f49586f42bb6de8bf7e2ba5d879e5f28a014009b9602aecd6dfe4cbd72f5
    devicea1c5c6c3e93f5a311d26715fe81382674dca82117134c2e6f97c1bc5faea9f09
    started from5814ac1dc4be6db7a60ef38dbbdcc999a67c4d60
    bundle364266237740c7dfb75b4a71dded3dda788b5488fc3c2c36d32549708f286c5b · 592 KB
    verifiedrebuilt and matched · verifier 0.1.0 ·
    applied on084862c2b276fdfa166b167c2d6181d9d4a3e7504625ab89a8ae16a68ae16136
    changed · 2 files
    test/VolatilityGuardHook.t.soltest/VolatilityGuardToken.t.sol
    • mediumExact-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.

      Create a zeroForOne pool where currency0 has 18 decimals and currency1 has 6 decimals, with liquidity 1e18 and an approximately 1:1 human-unit price.

      Submit exact-output zeroForOne swaps with amountSpecified=+1_000_000, each of which spends approximately 1e18 currency0 base units.

      Expected: each swap consumes approximately 1e18 units of the currency0 directional budget.

      Actual: lines 114 and 129 account only 1_000_000 output base units, undercounting by about 1e12 and allowing the rolling input-volume guard to be bypassed.

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

  3. contracts tested
    Gas and size report2 files changed
    afterWrite foundry tests
    writes to
    test/**.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 afterSwap reaching 172,775 gas as the main launch-budget concern.

    ran oncodex · 6 turns · 3m 58s · 63.9K in · 8.3K out · 944.4K cached
    submissiona148748f2bf9399ee50b969ecf86fe9db04238e2a006dbd9d2ced65bbc4f1f3c
    devicea1c5c6c3e93f5a311d26715fe81382674dca82117134c2e6f97c1bc5faea9f09
    started fromeda1e06d99b43bf4c4fb1774762079a9c5edb72e
    bundlef004eee8d1a268b7510d0fa3f04f0cb517044b12751a2cb14feb73d309b477fc · 594 KB
    verifiedrebuilt and matched · verifier 0.1.0 ·
    applied on364266237740c7dfb75b4a71dded3dda788b5488fc3c2c36d32549708f286c5b
    changed · 2 files
    .gas-snapshottest/GasSurface.t.sol
  4. contracts integrated
    Manifest1 file changed
    afterBuild contract project, Write foundry tests, Gas and size report
    writes to
    launch.json

    Updated launch.json with:

    • Correct univ4_hook discriminator
    • 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 — passed
    • forge test — 27 passed, 0 failed
    • Manifest structural checks — passed
    • Scope check — only launch.json changed
    ran oncodex · 4 turns · 1m 49s · 58.3K in · 3.3K out · 439K cached
    submissionf036ff99e1062f9af764bcabe0331544bb21822c90c89cfb059c3f860aa29506
    devicea1c5c6c3e93f5a311d26715fe81382674dca82117134c2e6f97c1bc5faea9f09
    started fromf61f71144982b976a4f99d8f0b4feab63ed2ced6
    bundle2aaf30a3c01039d7cd0b32c88189452723d1ec99ff18fa25280c04973764d1c4 · 595 KB
    verifiedrebuilt and matched · verifier 0.1.0 ·
    applied on084862c2b276fdfa166b167c2d6181d9d4a3e7504625ab89a8ae16a68ae16136, 364266237740c7dfb75b4a71dded3dda788b5488fc3c2c36d32549708f286c5b, f004eee8d1a268b7510d0fa3f04f0cb517044b12751a2cb14feb73d309b477fc
    changed · 1 file
    launch.json
  5. contracts reviewed
    Adversarial review3 findings · 2 high
    afterBuild contract project, Write foundry tests, Gas and size report, Manifest

    Wrote 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 cached
    submissionf115a22bb388740834cb8aa73aa521dd7d9a4c854e260c16d79f61132d18f898
    device0edd2bbb66d2d014fbbda834d6ccbc278847c31414f601db126e7a1269baddd9
    started fromd60fd832d434e61442ce63ad0f6f0184b55cce74
    bundlenone
    applied on084862c2b276fdfa166b167c2d6181d9d4a3e7504625ab89a8ae16a68ae16136, 364266237740c7dfb75b4a71dded3dda788b5488fc3c2c36d32549708f286c5b, f004eee8d1a268b7510d0fa3f04f0cb517044b12751a2cb14feb73d309b477fc, 2aaf30a3c01039d7cd0b32c88189452723d1ec99ff18fa25280c04973764d1c4
    changed · 0 filesnothing
    • highPartial 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.

      Initialize a static-fee-3000 pool at sqrtPriceX96=79228162514264337593543950336, tick 0, with active liquidity 1000000000000000000 across tick 0 (for example a position spanning [-887220,887220]), zero protocol fee and an empty volume ring.

      Through a PoolManager unlock callback call swap with zeroForOne=true, amountSpecified=-64000000000000000000, sqrtPriceLimitX96=79228162514264337593543950335 and empty hookData; settle the actual deltas.

      The vendored SwapMath charges 1 unit input plus 1 unit fee and returns 0 output at this price limit.

      Expected recorded input volume: 2.

      Actual rollingVolume(id,true): 64000000000000000000.

      A subsequent same-direction request for 1 unit reverts VolumeBudgetExceeded(true,1,0), despite virtually the entire actual-volume budget remaining.

      No victim approval or privileged caller is required.

      This reproduction is derived from the vendored Pool/SwapMath rounding and hook code, not a claimed executed integration test.

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

      Use fee 3000, zero protocol fee, initial price 2^96 and full-range active liquidity 1e18.

      Seed calm observations at timestamps 100,130,160 with tick 0, ewmaVolatility=0, count=3 and empty/negligible directional volume.

      At timestamp 161 submit zeroForOne=true, amountSpecified=-1e18, sqrtPriceLimitX96=4295128740 (MIN_SQRT_PRICE+1).

      The starting tick equals reference 0 and 1e18 is below the 64e18 budget, so beforeSwap succeeds.

      Vendored swap arithmetic yields sqrtPriceX96=39673591644599067397868778336 and tick -13834.

      Expected: reject a resulting deviation beyond the reported 120-tick band.

      Actual: afterSwap returns success, records the swap and sets guardedAt; even its recalculated 900-tick maximum is exceeded.

      The existing testShockGuardAndPermissionlessRecovery likewise explicitly accepts a 3000-tick movement.

      Numeric outcome is derived from vendored swap arithmetic; no live swap is claimed.

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

      Initialize at timestamp 100 with tick 0 and liquidity 1e18.

      At timestamp 101 execute a budget-compliant swap ending at tick 500, then leave the pool at tick 500 until timestamp 130.

      The warmup precheck permits the swap; _writeObservation returns because 101-100<30.

      At timestamp 130, before another swap, snapshot(id) returns currentTick=500 and referenceTick=0.

      Expected time-weighted tick over the initialized 30-second history is trunc((01 + 50029)/30)=483.

      Actual is 0 because observation(0) remains (100,0), despite lastTick being 500.

      This can also be reproduced directly using the existing StateReaderMock and authenticated callback harness with these timestamps and ticks; it follows deterministically from the stored observations.

  6. 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: passed
    • forge test: 17 passed, 0 failed
    • Key fuzz tests: 10,000 runs
    • forge fmt --check: passed
    • Exported hook ABI matches forge inspect after JSON normalization
    • git diff --check: passed
    ran oncodex · 4 turns · 5m 35s · 83.6K in · 13.9K out · 1.1M cached
    submission6e0437d1987c249da0ffab4024d57712578cf251f917ba29bd52e31867abb17d
    devicea1c5c6c3e93f5a311d26715fe81382674dca82117134c2e6f97c1bc5faea9f09
    started from5814ac1dc4be6db7a60ef38dbbdcc999a67c4d60
    bundle084862c2b276fdfa166b167c2d6181d9d4a3e7504625ab89a8ae16a68ae16136 · 595 KB
    verifiedrebuilt and matched · verifier 0.1.0 ·
    changed · 8 files
    REVIEW.mddocs/abi/VolatilityGuardHook.jsondocs/architecture.mddocs/frontend-integration.mddocs/threat-model.mdlaunch.jsonsrc/VolatilityGuardHook.soltest/VolatilityGuardHook.t.sol
  7. 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 · 1s
    submission56ffdaed13127b09904cb3b43c096bc0469b0509f10a096669767280509b099a
    device0edd2bbb66d2d014fbbda834d6ccbc278847c31414f601db126e7a1269baddd9
    started from0243d7da4a4337ae8b16bcdf15bb4ead736fd68f
    bundlenone
    applied on084862c2b276fdfa166b167c2d6181d9d4a3e7504625ab89a8ae16a68ae16136
    changed · 0 filesnothing
    clone 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 · 0s
    submission43a31db7e1ec4f5738d2aa36819a794f4adcd000c49b49b90938f955aafc34a0
    devicea1c5c6c3e93f5a311d26715fe81382674dca82117134c2e6f97c1bc5faea9f09
    started from0243d7da4a4337ae8b16bcdf15bb4ead736fd68f
    bundlenone
    applied on084862c2b276fdfa166b167c2d6181d9d4a3e7504625ab89a8ae16a68ae16136
    changed · 0 filesnothing
    clone failedcould not restore accepted work: accepted work conflicts with a dependency, which plan validation should have …
    afterBuild contract project
    writes to
    test/**

    could not restore accepted work: accepted work conflicts with a dependency, which plan validation should have prevented:

    ran oncodex · 1s
    submission8086d5a6bf9f755813e8aaa13d3eaa4154a8c394795e4ff675599aa3d2bf6c12
    device0edd2bbb66d2d014fbbda834d6ccbc278847c31414f601db126e7a1269baddd9
    started from0243d7da4a4337ae8b16bcdf15bb4ead736fd68f
    bundlenone
    applied on084862c2b276fdfa166b167c2d6181d9d4a3e7504625ab89a8ae16a68ae16136
    changed · 0 filesnothing
  8. contracts publishedIdentity-md/launch-44-volatilityguardhook-volatilityguardtoken
  9. deployedThis workflow was cancelled. This step will not start.
  10. website builtafter deployment
  11. website publishedafter the website is accepted
  12. hostedThis workflow was cancelled. This step will not start.
  13. checkednot run; the workflow was cancelled