{"reviewedAt":"2026-09-06","bytecodeCheckedAt":"2026-09-28T23:26:19.042Z","needsReview":[],"vaults":[{"id":"hoodlock","address":"0xD0f7d8c6e9f6D80c297bEbe4F7fD1B9C8125C32F","name":"HoodLock RobinhoodLocker","kind":"erc20","codehash":"0x1ec0a7c8ab5624a07a04f2fc170cd52fa806298826bae7376487c07f4aba603e","isProxy":false,"verified":true,"compiler":"v0.8.35","license":"MIT","privileges":[{"who":"admin","can":"setFee / setFeeCollector / setAdmin","reachesFunds":false}],"guarantees":{"noAdminOverFunds":true,"extendOnly":true,"ownerOnlyWithdraw":true,"feesToHolder":null,"pausable":false,"upgradeable":false},"notes":["Locks any ERC-20: team token OR v2 LP token. The contract does not distinguish; the reader classifies by token0()/token1().","fee-on-transfer handled by measuring balance delta."],"bytecode":"match","codehashNow":"0x1ec0a7c8ab5624a07a04f2fc170cd52fa806298826bae7376487c07f4aba603e"},{"id":"x4663","address":"0x902f3e8363C11088b31C34a5E294B50fbD243B7C","name":"0x4663 LockerV3","kind":"v3","codehash":"0x8ee2d1539a44fad8f12c0baa8f3f4755015b14ec8fbb1fb7ecba62730e946468","isProxy":false,"verified":true,"compiler":"v0.8.28","license":"Unlicense","privileges":[],"guarantees":{"noAdminOverFunds":true,"extendOnly":true,"ownerOnlyWithdraw":true,"feesToHolder":true,"pausable":false,"upgradeable":false},"related":[{"role":"receipt","address":"0x32517bA467C4Fe6063446Ce5405DE760c7474A03","codehash":"0x8b1625ccabc3f9c9b04fe1609973599a15ee41b23bab473fd6ad8d3640e054db"}],"notes":["Linear vesting between startUnlock and finishUnlock; PERMANENT = uint64.max."],"bytecode":"match","codehashNow":"0x8ee2d1539a44fad8f12c0baa8f3f4755015b14ec8fbb1fb7ecba62730e946468"},{"id":"uncx","address":"0x354db70639358f9D532526a982950683eb847130","name":"UNCX UniV3Locker (D)","kind":"v3","codehash":"0xcbe065504386278917488dd960bb427557cf12e17c1f96ba57012711034aaf0e","isProxy":false,"verified":true,"compiler":"v0.8.30","license":"MIT","privileges":[{"who":"owner","can":"setStakingPool / stakeUniV3Position (moves locked NFTs into a staking pool)","reachesFunds":true}],"guarantees":{"noAdminOverFunds":false,"extendOnly":null,"ownerOnlyWithdraw":true,"feesToHolder":true,"pausable":false,"upgradeable":false},"notes":["Ownable. `stakeUniV3Position(ids)` lets the owner move locked positions to a staking pool: the guarantee depends on UNCX, not on code alone."],"bytecode":"match","codehashNow":"0xcbe065504386278917488dd960bb427557cf12e17c1f96ba57012711034aaf0e"},{"id":"uncx","address":"0xC49C3303781E1b141903dE846dE78D85DF4fca47","name":"UNCX UniV3Locker (A)","kind":"v3","codehash":"0x84a7c2ec8b73c4fac8e0376b130fc744dd7c2d9292c99f93c416ec8798d99e55","isProxy":false,"verified":true,"compiler":"v0.8.30","license":"MIT","privileges":[{"who":"owner","can":"setStakingPool / stakeUniV3Position (moves locked NFTs into a staking pool)","reachesFunds":true}],"guarantees":{"noAdminOverFunds":false,"extendOnly":null,"ownerOnlyWithdraw":true,"feesToHolder":true,"pausable":false,"upgradeable":false},"notes":["Ownable. `stakeUniV3Position(ids)` lets the owner move locked positions to a staking pool: the guarantee depends on UNCX, not on code alone."],"bytecode":"match","codehashNow":"0x84a7c2ec8b73c4fac8e0376b130fc744dd7c2d9292c99f93c416ec8798d99e55"},{"id":"uncx","address":"0x3452f30857e1FE0363C0E95334194F0771Fb27aa","name":"UNCX UniV3Locker (B)","kind":"v3","codehash":"0x84a7c2ec8b73c4fac8e0376b130fc744dd7c2d9292c99f93c416ec8798d99e55","isProxy":false,"verified":true,"compiler":"v0.8.30","license":"MIT","privileges":[{"who":"owner","can":"setStakingPool / stakeUniV3Position (moves locked NFTs into a staking pool)","reachesFunds":true}],"guarantees":{"noAdminOverFunds":false,"extendOnly":null,"ownerOnlyWithdraw":true,"feesToHolder":true,"pausable":false,"upgradeable":false},"notes":["Ownable. `stakeUniV3Position(ids)` lets the owner move locked positions to a staking pool: the guarantee depends on UNCX, not on code alone."],"bytecode":"match","codehashNow":"0x84a7c2ec8b73c4fac8e0376b130fc744dd7c2d9292c99f93c416ec8798d99e55"},{"id":"uncx","address":"0xdEDBdec59a06e5FE36745A4F862eCE74745b9bcf","name":"UNCX UniV3Locker (C)","kind":"v3","codehash":"0x84a7c2ec8b73c4fac8e0376b130fc744dd7c2d9292c99f93c416ec8798d99e55","isProxy":false,"verified":true,"compiler":"v0.8.30","license":"MIT","privileges":[{"who":"owner","can":"setStakingPool / stakeUniV3Position (moves locked NFTs into a staking pool)","reachesFunds":true}],"guarantees":{"noAdminOverFunds":false,"extendOnly":null,"ownerOnlyWithdraw":true,"feesToHolder":true,"pausable":false,"upgradeable":false},"notes":["Ownable. `stakeUniV3Position(ids)` lets the owner move locked positions to a staking pool: the guarantee depends on UNCX, not on code alone."],"bytecode":"match","codehashNow":"0x84a7c2ec8b73c4fac8e0376b130fc744dd7c2d9292c99f93c416ec8798d99e55"},{"id":"uncx","address":"0xBC2145608CD1617772E000400a5176E4F751d385","name":"UNCX UniV3Locker (E)","kind":"v3","codehash":"0x79bdd04f7035c832d42509ee0362af61075baf0e2c95d435261f476e2bd156b5","isProxy":false,"verified":true,"compiler":"v0.8.30","license":"MIT","privileges":[{"who":"owner","can":"setStakingPool / stakeUniV3Position (moves locked NFTs into a staking pool)","reachesFunds":true}],"guarantees":{"noAdminOverFunds":false,"extendOnly":null,"ownerOnlyWithdraw":true,"feesToHolder":true,"pausable":false,"upgradeable":false},"notes":["Ownable. `stakeUniV3Position(ids)` lets the owner move locked positions to a staking pool: the guarantee depends on UNCX, not on code alone."],"bytecode":"match","codehashNow":"0x79bdd04f7035c832d42509ee0362af61075baf0e2c95d435261f476e2bd156b5"},{"id":"uncx","address":"0xb84B3a3E70dFD12aCfc1592e93852A5beC654E04","name":"UNCX UniV3Locker (F)","kind":"v3","codehash":"0x4f5f535a9a81ba73d47e2f33f778fbfefee20512a565069118c93702cbd50dc9","isProxy":false,"verified":true,"compiler":"v0.8.30","license":"MIT","privileges":[{"who":"owner","can":"setStakingPool / stakeUniV3Position (moves locked NFTs into a staking pool)","reachesFunds":true}],"guarantees":{"noAdminOverFunds":false,"extendOnly":null,"ownerOnlyWithdraw":true,"feesToHolder":true,"pausable":false,"upgradeable":false},"notes":["Ownable. `stakeUniV3Position(ids)` lets the owner move locked positions to a staking pool: the guarantee depends on UNCX, not on code alone."],"bytecode":"match","codehashNow":"0x4f5f535a9a81ba73d47e2f33f778fbfefee20512a565069118c93702cbd50dc9"},{"id":"launcher","address":"0x736D76699C26D0d966744cAe304C000d471f7F35","name":"Pons V1 launch locker","kind":"v3","codehash":"0xa7880a625a649da833de5597c9f41585bb75e20ef91d45830ccc6f4e49cc281c","isProxy":false,"verified":true,"compiler":"v0.8.26/0.8.30","license":"none","privileges":[{"who":"owner","can":"setFeeCollector / setFeeRedirect / setProtocolFeeShare / setProtocolFeeRecipient (fee routing only)","reachesFunds":false},{"who":"factory","can":"lockPosition (adds locks)","reachesFunds":false}],"guarantees":{"noAdminOverFunds":true,"extendOnly":true,"ownerOnlyWithdraw":null,"feesToHolder":true,"pausable":false,"upgradeable":false,"noWithdrawPath":true},"notes":["Graduated v3 LP position is locked by the factory (`lockPosition` onlyFactory). There is NO function that transfers the position out: permanent by construction.","Creator (or a fee redirect set by the owner) collects swap fees via `collectFees(token)`; owner sets protocol fee share (max bounded) and recipients."],"bytecode":"match","codehashNow":"0xa7880a625a649da833de5597c9f41585bb75e20ef91d45830ccc6f4e49cc281c"},{"id":"launcher","address":"0x267444d099b10fb5ed7c3cc7b7c767adca574952","name":"Pons V2 launch locker","kind":"v4","codehash":"0x58455f80b3773871d601a025e56ec27c71ab3bbb8e2ca6b17828954450742025","isProxy":false,"verified":true,"compiler":"v0.8.26/0.8.30","license":"none","privileges":[{"who":"owner","can":"setFactory","reachesFunds":false},{"who":"factory","can":"lockPosition / lockTokenSupply (adds locks)","reachesFunds":false}],"guarantees":{"noAdminOverFunds":true,"extendOnly":true,"ownerOnlyWithdraw":null,"feesToHolder":false,"pausable":false,"upgradeable":false,"noWithdrawPath":true},"notes":["Graduated v4 LP position + part of the token supply locked by the factory. No withdraw, no collectFees: fees accrue inside the PoolManager and are not claimable by anyone; the creator is paid through the V2FeeEscrow (hook fees), not through this locker.","Owner can only `setFactory` (affects future locks)."],"bytecode":"match","codehashNow":"0x58455f80b3773871d601a025e56ec27c71ab3bbb8e2ca6b17828954450742025"},{"id":"launcher","address":"0x8d519cC4343079F774ec316B4d84860de71E8F58","name":"PairPad launch locker","kind":"v4","codehash":"0xb2cb19c29fd959edae76ef67a3e27648495d915038716b6fc0ffba702a1c94f0","isProxy":false,"verified":true,"compiler":"v0.8.26/0.8.30","license":"none","privileges":[{"who":"owner","can":"setFactory","reachesFunds":false},{"who":"factory","can":"lockPosition / lockTokenSupply","reachesFunds":false}],"guarantees":{"noAdminOverFunds":true,"extendOnly":true,"ownerOnlyWithdraw":null,"feesToHolder":true,"pausable":false,"upgradeable":false,"noWithdrawPath":true},"notes":["Graduated v4 LP position + token supply locked by the factory; no withdraw path. `collectFees(token)` = DECREASE_LIQUIDITY(0) + TAKE_PAIR to the fee escrow (the pattern our LPLockerV4 spec copies).","Owner can only `setFactory`."],"bytecode":"match","codehashNow":"0xb2cb19c29fd959edae76ef67a3e27648495d915038716b6fc0ffba702a1c94f0"},{"id":"launcher","address":"0x8a6d37B2E6a2AC7970eF69d2932757F04be0A231","name":"PairPad launch locker","kind":"v4","codehash":"0x9e88bce6dd4e55684a4c1c4c7e50b0549a26676ba29053b5817654c9f5754cef","isProxy":false,"verified":true,"compiler":"v0.8.26/0.8.30","license":"none","privileges":[{"who":"owner","can":"setFactory","reachesFunds":false},{"who":"factory","can":"lockPosition / lockTokenSupply","reachesFunds":false}],"guarantees":{"noAdminOverFunds":true,"extendOnly":true,"ownerOnlyWithdraw":null,"feesToHolder":true,"pausable":false,"upgradeable":false,"noWithdrawPath":true},"notes":["Graduated v4 LP position + token supply locked by the factory; no withdraw path. `collectFees(token)` = DECREASE_LIQUIDITY(0) + TAKE_PAIR to the fee escrow (the pattern our LPLockerV4 spec copies).","Owner can only `setFactory`."],"bytecode":"match","codehashNow":"0x9e88bce6dd4e55684a4c1c4c7e50b0549a26676ba29053b5817654c9f5754cef"},{"id":"launcher","address":"0xE15a647F8964f05238d17f79BfA9F1E8b1d97abd","name":"PairPad launch locker","kind":"v4","codehash":"0x90575719ad5d6802f39b5d867a448f86e0c406a81ee7aba93a479f530d132fed","isProxy":false,"verified":true,"compiler":"v0.8.26/0.8.30","license":"none","privileges":[{"who":"owner","can":"setFactory","reachesFunds":false},{"who":"factory","can":"lockPosition / lockTokenSupply","reachesFunds":false}],"guarantees":{"noAdminOverFunds":true,"extendOnly":true,"ownerOnlyWithdraw":null,"feesToHolder":true,"pausable":false,"upgradeable":false,"noWithdrawPath":true},"notes":["Graduated v4 LP position + token supply locked by the factory; no withdraw path. `collectFees(token)` = DECREASE_LIQUIDITY(0) + TAKE_PAIR to the fee escrow (the pattern our LPLockerV4 spec copies).","Owner can only `setFactory`."],"bytecode":"match","codehashNow":"0x90575719ad5d6802f39b5d867a448f86e0c406a81ee7aba93a479f530d132fed"},{"id":"launcher","address":"0x95660E5c4ca641F227E0D1b8DcF845C506d984e8","name":"PairPad launch locker","kind":"v4","codehash":"0x1c24a00dcd56c099d1c62523fee215d6b777b6a36449a8405391f067186f77e3","isProxy":false,"verified":true,"compiler":"v0.8.26/0.8.30","license":"none","privileges":[{"who":"owner","can":"setFactory","reachesFunds":false},{"who":"factory","can":"lockPosition / lockTokenSupply","reachesFunds":false}],"guarantees":{"noAdminOverFunds":true,"extendOnly":true,"ownerOnlyWithdraw":null,"feesToHolder":true,"pausable":false,"upgradeable":false,"noWithdrawPath":true},"notes":["Graduated v4 LP position + token supply locked by the factory; no withdraw path. `collectFees(token)` = DECREASE_LIQUIDITY(0) + TAKE_PAIR to the fee escrow (the pattern our LPLockerV4 spec copies).","Owner can only `setFactory`."],"bytecode":"match","codehashNow":"0x1c24a00dcd56c099d1c62523fee215d6b777b6a36449a8405391f067186f77e3"},{"id":"launcher","address":"0x7f03effbd7ceb22a3f80dd468f67ef27826acd85","name":"Noxa launch locker","kind":"v3","codehash":"0x1cb00fd9946bc7db326a141b737c2e42262091c00025913c0ab58208381a2f1f","isProxy":false,"verified":true,"compiler":"v0.8.30","license":"none","privileges":[{"who":"owner","can":"fee routing only (setFeeCollector / setFeeRedirect / setProtocolFeeShare / setProtocolFeeRecipient)","reachesFunds":false},{"who":"factory","can":"lockPosition (adds locks)","reachesFunds":false}],"guarantees":{"noAdminOverFunds":true,"extendOnly":true,"ownerOnlyWithdraw":null,"feesToHolder":true,"pausable":false,"upgradeable":false,"noWithdrawPath":true},"notes":["Fork of the Pons V1 launch locker (same getLaunchedToken/lockPosition/collectFees). No function transfers the position out: permanent by construction. Found by the 2026-09-06 census (factory → locker()).","Identified 2026-09-22 as the noxa.fun locker: DefiLlama's noxa-fun adapter lists this address as the Robinhood Chain locker, and its factory() is 0xD9eC2db5…. Contract name on Blockscout is still the generic LaunchLocker."],"bytecode":"match","codehashNow":"0x1cb00fd9946bc7db326a141b737c2e42262091c00025913c0ab58208381a2f1f"},{"id":"launcher","address":"0xc10309cf03bc81c121a8270e3a28e159a9296903","name":"Lemon launch locker","kind":"v3","codehash":"0x22211f2d836a45a0f6636dc127e2581f027128f401f37e0add32fb2532bb7d39","isProxy":false,"verified":true,"compiler":"v0.8.30","license":"none","privileges":[{"who":"owner","can":"fee routing only (setFeeCollector / setFeeRedirect / setProtocolFeeShare / setProtocolFeeRecipient)","reachesFunds":false},{"who":"factory","can":"lockPosition (adds locks)","reachesFunds":false}],"guarantees":{"noAdminOverFunds":true,"extendOnly":true,"ownerOnlyWithdraw":null,"feesToHolder":true,"pausable":false,"upgradeable":false,"noWithdrawPath":true},"notes":["Fork of the Pons V1 launch locker (same getLaunchedToken/lockPosition/collectFees). No function transfers the position out: permanent by construction. Found by the 2026-09-06 census (factory → locker())."],"bytecode":"match","codehashNow":"0x22211f2d836a45a0f6636dc127e2581f027128f401f37e0add32fb2532bb7d39"},{"id":"v4direct","reviewedAt":"2026-09-10","address":"0x889069BD282f1c1C66CB853e10627595C28e71E2","name":"The Index LpLock (direct v4, no NFT)","kind":"v4-direct","codehash":"0x1b3cc515c95da3ae36f09de2e636f37d6035d68e5fb611754bc0d62478039c7a","isProxy":false,"verified":true,"compiler":"v0.8.26+commit.8a97fa7a","license":"MIT","privileges":[{"who":"owner","can":"collect() — realizes accrued LP fees with liquidityDelta 0","reachesFunds":false}],"guarantees":{"noAdminOverFunds":true,"extendOnly":null,"ownerOnlyWithdraw":null,"noWithdrawPath":true,"feesToHolder":true,"pausable":false,"upgradeable":false},"notes":["Owns its liquidity DIRECTLY in the PoolManager: there is no position NFT, so enumerating PositionManager holders cannot find it. Read via pools[poolId].positions[keccak(owner‖tickLower‖tickUpper‖salt)].","seed() is onlyOwner and reverts once seeded; the pool key is set there and has no setter. Full range, salt 0.","collect() calls modifyLiquidity with liquidityDelta 0, which realizes fees without touching principal. Reviewed from verified source 2026-09-10.","The pool runs the project's own hook (0x2cD91b…), which takes 3% of each swap in native ETH. The hook is NOT audited by us."],"bytecode":"match","codehashNow":"0x1b3cc515c95da3ae36f09de2e636f37d6035d68e5fb611754bc0d62478039c7a"},{"id":"pinklock","reviewedAt":"2026-09-18","address":"0xBE0b139ABc90723Af76a89D3051f60Ba1B64c8d9","name":"PinkLock02 (PinkSale)","kind":"erc20","codehash":"0x88172df766517edffa7d598d05205119ce584cf79509cfa6c7db228921dfb82f","isProxy":false,"verified":true,"compiler":"v0.8.4+commit.c7e474f2","license":"MIT","privileges":[],"guarantees":{"noAdminOverFunds":true,"extendOnly":true,"ownerOnlyWithdraw":true,"noWithdrawPath":null,"feesToHolder":null,"pausable":false,"upgradeable":false},"notes":["No admin at all: the string `onlyOwner` does not appear in the contract. No pause, no rescue, no upgrade, no privileged withdraw.","editLock is extend-only: a new unlock date must be >= the current one and in the future, and a new amount must be >= the current one.","renounceLockOwnership sets the lock owner to address(0). Nobody can sign as address(0), so a renounced lock becomes permanent; the reader reports those as permanent.","Vesting locks exist (tgeBps / cycle / cycleBps). The reader reports amount minus unlockedAmount, so the figure is what is still held, and unlockAt is the first unlock date, not the last.","Locks an ERC-20 that may be a team token or a v2 LP token; cumulativeLockInfo(token).factory tells them apart, which is the contract's own classification.","Enumerated per token, not globally: the 1,017 locks over 678 tokens counted on 2026-09-18 would exceed the cron's subrequest budget, so the global index does not include this vault."],"bytecode":"match","codehashNow":"0x88172df766517edffa7d598d05205119ce584cf79509cfa6c7db228921dfb82f"},{"id":"launcher","address":"0x9A6931E371b62048C7543C7002C99D83685BD44d","name":"LaunchLocker (0x9A69…)","kind":"v3","codehash":"0xb7219bf75c18c5c622e0fc832c1b863588c1d1995a4fe018749c44871c1663b3","isProxy":false,"verified":true,"compiler":"v0.8.30","license":"none","privileges":[{"who":"owner","can":"fee routing only (setFeeCollector / setFeeRedirect / setProtocolFeeShare / setProtocolFeeRecipient / setMaxSlippageBps / setTwapWindow)","reachesFunds":false},{"who":"factory","can":"lockPosition (adds locks)","reachesFunds":false}],"guarantees":{"noAdminOverFunds":true,"extendOnly":true,"ownerOnlyWithdraw":null,"feesToHolder":true,"pausable":false,"upgradeable":false,"noWithdrawPath":true},"notes":["Verified source read 2026-09-22. getLaunchedToken proxies to the factory; same struct layout as Pons V1 (positionManager at word 3, positionId at word 4). No transfer or decreaseLiquidity call anywhere: permanent by construction. 1,119 v3 positions held on 2026-09-22."],"bytecode":"match","codehashNow":"0xb7219bf75c18c5c622e0fc832c1b863588c1d1995a4fe018749c44871c1663b3"},{"id":"launcher","address":"0xbaEEcA4975cB1c4722E82753b1fa9cbF3C595313","name":"Pons V2 launch locker (B)","kind":"v4","codehash":"0x15e54b929adc0132ebf97dc5e17da4b375ac84c69daba4fb1f02823dd409cc62","isProxy":false,"verified":true,"compiler":"0.8.35","license":"none","privileges":[{"who":"owner","can":"setFactory (renounceOwnership reverts)","reachesFunds":false},{"who":"factory","can":"lockPosition / lockTokenSupply (adds locks)","reachesFunds":false}],"guarantees":{"noAdminOverFunds":true,"extendOnly":true,"ownerOnlyWithdraw":null,"feesToHolder":true,"pausable":false,"upgradeable":false,"noWithdrawPath":true},"notes":["Second PonsV2LaunchLocker deployment, verified source read 2026-09-22: same ABI as 0x267444d0…, no withdraw path. Held 0 Uniswap v4 NFTs on 2026-09-22; positions may be direct (no NFT) or the locker may be newer than its use."],"bytecode":"match","codehashNow":"0x15e54b929adc0132ebf97dc5e17da4b375ac84c69daba4fb1f02823dd409cc62"},{"id":"launcher","address":"0x99B79154Ff4Fc0e313549B809254B02722631ee0","name":"LaunchHood v3 locker","kind":"v3","codehash":"0xd9a35b69f34a7b7156c98aa28d1319aa6b4fe05330cbf52d5cf8de40e9e4e00f","isProxy":false,"verified":true,"compiler":"v0.8.26","license":"MIT","privileges":[{"who":"factory owner","can":"setDefaultCreatorShareBps / setRewardRecipient (fee split only)","reachesFunds":false},{"who":"factory","can":"register (adds locks)","reachesFunds":false}],"guarantees":{"noAdminOverFunds":true,"extendOnly":true,"ownerOnlyWithdraw":null,"feesToHolder":true,"pausable":false,"upgradeable":false,"noWithdrawPath":true},"notes":["Verified source read 2026-09-22. positionOf(meme) → Uniswap v3 tokenId. collect() forwards swap fees to creator and treasury; no function transfers or decreases the position. 4,162 v3 positions held on 2026-09-22."],"bytecode":"match","codehashNow":"0xd9a35b69f34a7b7156c98aa28d1319aa6b4fe05330cbf52d5cf8de40e9e4e00f"},{"id":"launcher","address":"0x3EA17330BCD94E8C8f5106f2b9366C3ce9a55263","name":"LaunchHood v4 locker","kind":"v4","codehash":"0x45314607723944b77961f55c5833524a72e6a4aa672ad6fcc1d30ace64e6f9dd","isProxy":false,"verified":true,"compiler":"v0.8.26","license":"MIT","privileges":[{"who":"admin","can":"setStrategy (once) / setDefaultCreatorShareBps / setRewardRecipient (fee split only)","reachesFunds":false},{"who":"strategy","can":"register (adds locks)","reachesFunds":false}],"guarantees":{"noAdminOverFunds":true,"extendOnly":true,"ownerOnlyWithdraw":null,"feesToHolder":true,"pausable":false,"upgradeable":false,"noWithdrawPath":true},"notes":["Verified source read 2026-09-22. positionOf(meme) → Uniswap v4 tokenId. collect() only; no transfer or DECREASE_LIQUIDITY with liquidity > 0. 789 v4 positions held on 2026-09-22."],"bytecode":"match","codehashNow":"0x45314607723944b77961f55c5833524a72e6a4aa672ad6fcc1d30ace64e6f9dd"},{"id":"launcher","address":"0x173d8370B4F67535D406F2F46168ec48aa03d26E","name":"LauncherLocker","kind":"v3","codehash":"0xaacb925fd09b5312ee48ff97250ed070faaf0284a8a51ad4cd3a97e17a281cc5","isProxy":false,"verified":true,"compiler":"v0.8.26","license":"none","privileges":[{"who":"owner","can":"setFactory","reachesFunds":false},{"who":"factory","can":"registerPosition (adds locks)","reachesFunds":false},{"who":"fee wallet","can":"setFeeRedirect / claimFees (swap fees only)","reachesFunds":false}],"guarantees":{"noAdminOverFunds":true,"extendOnly":true,"ownerOnlyWithdraw":null,"feesToHolder":true,"pausable":false,"upgradeable":false,"noWithdrawPath":true},"notes":["Verified source read 2026-09-22. getPosition(token) → (positionId, positionManager, pairToken, feeWallet, isToken0). No transfer or decreaseLiquidity: permanent by construction. 2,367 v3 positions held on 2026-09-22."],"bytecode":"match","codehashNow":"0xaacb925fd09b5312ee48ff97250ed070faaf0284a8a51ad4cd3a97e17a281cc5"},{"id":"launcher","address":"0x290F735F63824BB5836cDe24a35F5103A5B5Bc99","name":"Clanker LP locker (ClankerLpLockerFeeConversion)","kind":"v4","codehash":"0x2175e20d41bc72ad6596b2fdd2c43c75e9d8ca10a706a1ca6c1a3d1526c336bc","isProxy":false,"verified":true,"compiler":"v0.8.28","license":"MIT","privileges":[{"who":"owner","can":"withdrawERC20 / withdrawETH of balances sitting in the contract (collected fees), never the position NFTs","reachesFunds":false},{"who":"factory","can":"placeLiquidity (adds locks)","reachesFunds":false},{"who":"reward admins","can":"updateRewardRecipient / updateFeePreference (fee routing)","reachesFunds":false}],"guarantees":{"noAdminOverFunds":true,"extendOnly":true,"ownerOnlyWithdraw":null,"feesToHolder":true,"pausable":false,"upgradeable":false,"noWithdrawPath":true},"notes":["Verified source read 2026-09-22. tokenRewards(token) → poolKey, first positionId, numPositions (≤ 7 contiguous Uniswap v4 ids). Fee collection is DECREASE_LIQUIDITY with liquidity 0 (comment in source: 'collecting fees is achieved with liquidity=0'); no path removes liquidity or transfers the NFT. 62,493 v4 positions held on 2026-09-22 — the largest locked-LP population on the chain."],"bytecode":"match","codehashNow":"0x2175e20d41bc72ad6596b2fdd2c43c75e9d8ca10a706a1ca6c1a3d1526c336bc"},{"id":"launcher","address":"0x9a9f7443cf35109bc2fdf5ef02b6f3c17a636f13","name":"PairedLockerV4","kind":"v4","codehash":"0xae2b7704eda04785f140a2c9865007c3deb1bf92480875ebae8319ae27648bcc","isProxy":false,"verified":true,"compiler":"v0.8.30","license":"none","privileges":[{"who":"registering factory","can":"register / bind (adds locks)","reachesFunds":false},{"who":"keeper","can":"sweepFees / executeBuyback (fees only)","reachesFunds":false}],"guarantees":{"noAdminOverFunds":true,"extendOnly":true,"ownerOnlyWithdraw":null,"feesToHolder":true,"pausable":false,"upgradeable":false,"noWithdrawPath":true},"notes":["Verified source read 2026-09-22. positionsOf(coin) → position ids; positionOf(id) → Uniswap v4 tokenId once bound. collect() is DECREASE_LIQUIDITY with liquidity 0 + TAKE_PAIR (fees). No function transfers or decreases the position. 144 v4 positions held on 2026-09-22."],"bytecode":"match","codehashNow":"0xae2b7704eda04785f140a2c9865007c3deb1bf92480875ebae8319ae27648bcc"},{"id":"uncx","address":"0xF28704c691290547924e2129D407dA36bda8ce0f","name":"UNCX UNCX_LiquidityLocker_UniV3 (classic)","kind":"v3","codehash":"0x325ad147a61d60ecaee0e60d066043f956c789a14a341c93429e966f9371d210","isProxy":false,"verified":true,"compiler":"v0.8.19","license":"MIT","privileges":[{"who":"owner","can":"fees (addOrEditFee / setFeeParams / setFeeResolver), allowNftPositionManager, setMigrator / setMigrateInContract, setUCF, adminRefundEth / adminRefundERC20 (contract balances only)","reachesFunds":false},{"who":"lock owner","can":"collect, relock, decreaseLiquidity (reverts on eternal locks), withdraw after unlockDate, migrate (only if a migrator is set)","reachesFunds":true}],"guarantees":{"noAdminOverFunds":true,"extendOnly":true,"ownerOnlyWithdraw":true,"feesToHolder":true,"pausable":false,"upgradeable":false},"notes":["Verified source read 2026-09-22. Same deployer as the six UniV3Locker entries (0x4401E39b…) but the canonical interface: LOCKS / getLock / getLocksLength (NONCE). unlockDate == uint256.max is ETERNAL_LOCK. 11 locks on 2026-09-22. The migrator is a trust point: the UNCX owner names it, the lock owner must call migrate."],"bytecode":"match","codehashNow":"0x325ad147a61d60ecaee0e60d066043f956c789a14a341c93429e966f9371d210"},{"id":"uncx","address":"0x128A800cBc615cc110Bff16E475865c67631603A","name":"UNCX UniV4LiquidityLockerV3","kind":"v4","codehash":"0x29de8d4c8c3a0042ced8847ac2d9679849a645f8b4892720f5cc1414c95f1ca8","isProxy":false,"verified":true,"compiler":"v0.8.26","license":"MIT","privileges":[{"who":"owner","can":"fees, hook whitelist/blacklist, permissionMode, setMigrator, setUCF, adminRescueTokens (refuses the position manager: CannotRescueNFTs) / adminRescueETH","reachesFunds":false},{"who":"lock owner","can":"collect, relock, unlockLiquidity after unlockTime, migrate (only if a migrator is set), transferLockOwnership","reachesFunds":true}],"guarantees":{"noAdminOverFunds":true,"extendOnly":true,"ownerOnlyWithdraw":true,"feesToHolder":true,"pausable":false,"upgradeable":false},"notes":["Verified source read 2026-09-22. locks(lockId) from id 1 (nextLockId is private; the reader pages until an empty page). unlockTime == uint256.max is ETERNAL_LOCK. Locks can be NFT-ized (the locker is itself an ERC-721). 34 Uniswap v4 NFTs held on 2026-09-22. Listed in UNCX's official docs for Robinhood Chain."],"bytecode":"match","codehashNow":"0x29de8d4c8c3a0042ced8847ac2d9679849a645f8b4892720f5cc1414c95f1ca8"},{"id":"uncx","address":"0xB560307e7e02a58dBB03562aaB32700255140E37","name":"UNCX UniswapV2Locker","kind":"erc20","codehash":"0x26e18528f18d99142763dcd44649df8e504d06b567a25fe4060e432a69b590ed","isProxy":false,"verified":true,"compiler":"v0.8.9","license":"none","privileges":[{"who":"owner","can":"setDev, setFees, setSecondaryFeeToken, setMigrator, whitelistFeeAccount","reachesFunds":false},{"who":"lock owner","can":"withdraw after unlockDate, relock, splitLock, incrementLock, transferLockOwnership, migrate (only if a migrator is set)","reachesFunds":true}],"guarantees":{"noAdminOverFunds":true,"extendOnly":true,"ownerOnlyWithdraw":true,"feesToHolder":null,"pausable":false,"upgradeable":false},"notes":["Verified source read 2026-09-22. Locks Uniswap v2 LP tokens (uniswapFactory = 0x8bceaa40…); the reader classifies every lock as v2_lp_token. LOCKS(id) for id < NONCE. 12 locks on 2026-09-22."],"bytecode":"match","codehashNow":"0x26e18528f18d99142763dcd44649df8e504d06b567a25fe4060e432a69b590ed"},{"id":"doppler","reviewedAt":"2026-09-23","address":"0x4e3468951d49f2eea976ed0d6e75ffcb44a9a544","name":"Doppler multicurve hook (long.xyz, Bankr)","kind":"v4-hook-owned","codehash":"0xc41a91106002f15bf70ae266824317f3f3ac638ac72ca5253bae395fa47ee631","isProxy":false,"verified":true,"compiler":"v0.8.26+commit.8a97fa7a","license":"none","privileges":[{"who":"Airlock (Doppler protocol)","can":"exitLiquidity(asset) — burns the positions and hands the funds to the asset's migrator, but ONLY while the pool status is Initialized (no beneficiaries). A Locked pool (status 2) cannot be exited.","reachesFunds":true},{"who":"anyone","can":"graduate(asset) once the far tick is crossed — flips Locked→Graduated and runs the optional Doppler hook callback; burns nothing","reachesFunds":false},{"who":"beneficiaries / Airlock owner","can":"collectFees(poolId) — modifyLiquidity with liquidityDelta 0, realizes accrued fees and streams them by shares; updateBeneficiary","reachesFunds":false},{"who":"Airlock owner","can":"setDopplerHookState — enables/disables optional Doppler hooks used for dynamic fees; cannot touch positions","reachesFunds":false}],"guarantees":{"noAdminOverFunds":true,"extendOnly":null,"ownerOnlyWithdraw":null,"noWithdrawPath":true,"feesToHolder":false,"pausable":false,"upgradeable":false},"notes":["The hook owns the liquidity itself: `_mint` at initialize() writes the multicurve positions into the PoolManager under the hook's address (salt = position index) and no NFT exists. Neither the PositionManager census nor the v4 registry sees it.","Guarantee applies to pools whose status is Locked (2) or Graduated (3): exitLiquidity requires Initialized, graduate only changes the status, _burn is reachable only from exitLiquidity. The reader reports permanent=true only for those statuses; an Initialized pool (no beneficiaries) is reported as a lock without a date, because Airlock.migrate can exit it.","TUX (0x4E9d3bfb…) on 2026-09-23: status Locked, migrator NoOpMigrator (migrate() reverts), 2 positions, 96% of the TUX/IBM pool. The hook had >10,000 Create logs that day.","Verified source read 2026-09-23 (DopplerHookInitializer, 78 files). Fees stream to beneficiaries, not to the token holders: feesToHolder=false."],"bytecode":"match","codehashNow":"0xc41a91106002f15bf70ae266824317f3f3ac638ac72ca5253bae395fa47ee631"},{"id":"virtuals","reviewedAt":"2026-09-23","address":"0x4008561d44a774ad3d517a009d0b6b647932d8d0","name":"Virtuals agent veToken (AgentNftV2 registry)","kind":"erc20","codehash":"0xdb1c08d42301872959fa05ae479db323fb856a76468225b14b54b6039a0dc3d1","isProxy":true,"verified":true,"compiler":"v0.8.26+commit.8a97fa7a","license":"none","privileges":[{"who":"AgentNft ADMIN_ROLE (Virtuals)","can":"setMatureAt(veToken) — moves the founder's unlock date in either direction, including to the past","reachesFunds":true},{"who":"veToken owner or AgentFactory (REMOVE_LIQUIDITY_ROLE)","can":"removeLpLiquidity(router, amount, recipient, …) — burns the founder's veToken, removes the pair's liquidity and sends both sides to `recipient`; bypasses matureAt by design (\"draining rugged Project60days\")","reachesFunds":true},{"who":"founder","can":"withdraw() only down to initialLock before matureAt; anything above it, and everything after matureAt","reachesFunds":true},{"who":"other stakers","can":"stake/withdraw freely when canStake is on — their LP is not locked and is not reported","reachesFunds":true},{"who":"proxy admin (Virtuals)","can":"upgrade AgentNftV2 and, via the beacon, every AgentVeTokenV2","reachesFunds":true}],"guarantees":{"noAdminOverFunds":false,"extendOnly":false,"ownerOnlyWithdraw":false,"noWithdrawPath":false,"feesToHolder":null,"pausable":false,"upgradeable":true},"notes":["This entry is the registry (AgentNftV2 proxy) that maps virtualId → (token, founder) and → (pool, veToken); the lock itself lives in each agent's AgentVeTokenV2 (\"Staked <name>\"), one per agent, all clones of impl 0xD851E9f4… The lock id on the proof is the veToken address.","What is locked: the founder's initial LP stake (`initialLock`) of the token/VIRTUAL Uniswap v2 pair, until `matureAt`. MLY on 2026-09-23: 100% of the pair's LP, matureAt 2036-07-04.","Why the guarantees are all `false`: two third-party keys reach the funds before the date — Virtuals' admin can shorten matureAt, and the factory/owner can pull the pair's liquidity with removeLpLiquidity. Verified source read 2026-09-23 (AgentVeTokenV2, AgentNftV2, AgentFactoryV7 ABI).","Discovery is a 2-multicall enumeration of the registry (91 agents on 2026-09-23), so the reader also feeds the index snapshot."],"bytecode":"match","codehashNow":"0xdb1c08d42301872959fa05ae479db323fb856a76468225b14b54b6039a0dc3d1"},{"id":"poolstrade","reviewedAt":"2026-09-23","address":"0xeff166aaf189323c58dc27ed1206eb2c37faacdf","name":"pools.trade FeeSplitter (Uniswap Labs launchpad)","kind":"v4-nft-holder","codehash":"0x8238e5106b3a895514083110d1f3b4e51be61148604f35113719af56ae325f42","isProxy":false,"verified":true,"compiler":"v0.8.26+commit.8a97fa7a","license":"MIT","privileges":[{"who":"anyone","can":"collectFees(tokenIds) — DECREASE_LIQUIDITY with liquidity 0 (realizes fees only), then splits the standing balances by the immutable splits","reachesFunds":false},{"who":"anyone","can":"increaseLiquidity(tokenId, …) — adds liquidity to a held position; cannot remove","reachesFunds":false}],"guarantees":{"noAdminOverFunds":true,"extendOnly":null,"ownerOnlyWithdraw":null,"noWithdrawPath":true,"feesToHolder":false,"pausable":false,"upgradeable":false},"notes":["Holds the v4 position NFTs of pools.trade launches (54,449 on 2026-09-23). No owner, no transferFrom, no burn, no DECREASE_LIQUIDITY with a non-zero amount anywhere in the verified source (47 files): permanent by construction.","Discovery: LiquidityLauncher 0x0000FffF… emits TokenDistributed(token, strategy); the NFT reaches the FeeSplitter in the same block (InstantLaunchStrategy 0x23f82095… on LOGOS). Strategies seen in the last 2M blocks on 2026-09-23: InstantLaunchStrategy, UniversalRouterStrategy, LBPStrategy, TokenSplitter and one unverified.","Fees go to the configured splits (getSplits), not to the token holders: feesToHolder=false. LOGOS (0x8c63b6ad…) on 2026-09-23: NFT #567800, 73% of supply in the position, pool LOGOS/ETH 0.25%."],"bytecode":"match","codehashNow":"0x8238e5106b3a895514083110d1f3b4e51be61148604f35113719af56ae325f42"}]}