{"hook":"0x2965c66FC26cE0d11001A8D6465d8AC07EC8A0cC","block":93397047,"bits":8396,"flags":[{"bit":13,"key":"beforeInitialize","label":"Before initialize","risk":0,"does":"Runs once, when a pool is created.","fn":"beforeInitialize(address,(address,address,uint24,int24,address),uint160)","on":true},{"bit":12,"key":"afterInitialize","label":"After initialize","risk":0,"does":"Runs once, right after a pool is created.","fn":"afterInitialize(address,(address,address,uint24,int24,address),uint160,int24)","on":false},{"bit":11,"key":"beforeAddLiquidity","label":"Before add liquidity","risk":1,"does":"Can refuse a deposit, or only let some addresses provide liquidity.","fn":"beforeAddLiquidity(address,(address,address,uint24,int24,address),(int24,int24,int256,bytes32),bytes)","on":false},{"bit":10,"key":"afterAddLiquidity","label":"After add liquidity","risk":0,"does":"Runs after each deposit.","fn":"afterAddLiquidity(address,(address,address,uint24,int24,address),(int24,int24,int256,bytes32),int256,int256,bytes)","on":false},{"bit":9,"key":"beforeRemoveLiquidity","label":"Before remove liquidity","risk":2,"does":"Can refuse a withdrawal. LPs may not get out.","fn":"beforeRemoveLiquidity(address,(address,address,uint24,int24,address),(int24,int24,int256,bytes32),bytes)","on":false},{"bit":8,"key":"afterRemoveLiquidity","label":"After remove liquidity","risk":0,"does":"Runs after each withdrawal.","fn":"afterRemoveLiquidity(address,(address,address,uint24,int24,address),(int24,int24,int256,bytes32),int256,int256,bytes)","on":false},{"bit":7,"key":"beforeSwap","label":"Before swap","risk":1,"does":"Runs before every swap. On a dynamic-fee pool it can set the fee each time.","fn":"beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)","on":true},{"bit":6,"key":"afterSwap","label":"After swap","risk":0,"does":"Runs after every swap.","fn":"afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)","on":true},{"bit":5,"key":"beforeDonate","label":"Before donate","risk":0,"does":"Runs before a donation to LPs.","fn":"beforeDonate(address,(address,address,uint24,int24,address),uint256,uint256,bytes)","on":false},{"bit":4,"key":"afterDonate","label":"After donate","risk":0,"does":"Runs after a donation to LPs.","fn":"afterDonate(address,(address,address,uint24,int24,address),uint256,uint256,bytes)","on":false},{"bit":3,"key":"beforeSwapReturnDelta","label":"Before swap returns delta","risk":2,"does":"Can take part of what you put into a swap, or change how much is swapped.","fn":null,"on":true},{"bit":2,"key":"afterSwapReturnDelta","label":"After swap returns delta","risk":2,"does":"Can take part of what you get out of every swap.","fn":null,"on":true},{"bit":1,"key":"afterAddLiquidityReturnDelta","label":"After add returns delta","risk":2,"does":"Can charge LPs on the way in.","fn":null,"on":false},{"bit":0,"key":"afterRemoveLiquidityReturnDelta","label":"After remove returns delta","risk":2,"does":"Can take part of what LPs withdraw.","fn":null,"on":false}],"code":{"size":11039,"selectors":["0x02669b52","0x0d77c6fe","0x10af8c84","0x20eda6d5","0x21c0b342","0x21d0ee70","0x259982e5","0x36f4c0eb","0x43a19abe","0x46732e4f","0x51f783fd","0x575e24b4","0x5b064208","0x5fd07da5","0x61d027b3","0x6c2bbe7e","0x6fe7e6eb","0x715018a6","0x79ba5097","0x8da5cb5b","0x91dd7346","0x9f063efc","0xa18cd06c","0xb47b2fb1","0xb6a8b0fa","0xc2898f5e","0xc4e833ce","0xd4570c1c","0xdc4c90d3","0xdc98354e","0xe1b4af69","0xe30c3978","0xe3a0be18","0xe9ee6eeb","0xf0f44260","0xf1097725","0xf2fde38b","0xfad17eb6","0xfc3fa966"],"delegatecall":false,"selfdestruct":false,"create":false,"calls":12,"addresses":[]},"proxy":{"implementation":null,"admin":null,"beacon":null,"clone":false},"owner":"0x01b1A16ED6eb5a58A3742014D1971bCce5B96DC8","functions":[{"selector":"0x02669b52","name":"launchpad()"},{"selector":"0x0d77c6fe","name":"registerToken(address,address,(address,uint16,uint8)[],uint40,uint128)"},{"selector":"0x10af8c84","name":"lowerTax((address,address,uint24,int24,address),uint16,uint16)"},{"selector":"0x20eda6d5","name":"getRecipients(address)"},{"selector":"0x21c0b342","name":"claim(address,address)"},{"selector":"0x21d0ee70","name":"beforeRemoveLiquidity(address,(address,address,uint24,int24,address),(int24,int24,int256,bytes32),bytes)"},{"selector":"0x259982e5","name":"beforeAddLiquidity(address,(address,address,uint24,int24,address),(int24,int24,int256,bytes32),bytes)"},{"selector":"0x36f4c0eb","name":"setLaunchpad(address)"},{"selector":"0x43a19abe","name":"totalTaxCollected(address,address)"},{"selector":"0x46732e4f","name":"setProtocolTaxShare(uint16)"},{"selector":"0x51f783fd","name":"setRecipients(address,(address,uint16,uint8)[])"},{"selector":"0x575e24b4","name":"beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)"},{"selector":"0x5b064208","name":"rewardBacklog(address,address)"},{"selector":"0x5fd07da5","name":"registerPool((address,address,uint24,int24,address),address,uint16,uint16)"},{"selector":"0x61d027b3","name":"treasury()"},{"selector":"0x6c2bbe7e","name":"afterRemoveLiquidity(address,(address,address,uint24,int24,address),(int24,int24,int256,bytes32),int256,int256,bytes)"},{"selector":"0x6fe7e6eb","name":"afterInitialize(address,(address,address,uint24,int24,address),uint160,int24)"},{"selector":"0x715018a6","name":"renounceOwnership()"},{"selector":"0x79ba5097","name":"acceptOwnership()"},{"selector":"0x8da5cb5b","name":"owner()"},{"selector":"0x91dd7346","name":"unlockCallback(bytes)"},{"selector":"0x9f063efc","name":"afterAddLiquidity(address,(address,address,uint24,int24,address),(int24,int24,int256,bytes32),int256,int256,bytes)"},{"selector":"0xa18cd06c","name":"distribute(address,address)"},{"selector":"0xb47b2fb1","name":"afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)"},{"selector":"0xb6a8b0fa","name":"beforeDonate(address,(address,address,uint24,int24,address),uint256,uint256,bytes)"},{"selector":"0xc2898f5e","name":"poolTax(bytes32)"},{"selector":"0xc4e833ce","name":"getHookPermissions()"},{"selector":"0xd4570c1c","name":"claimable(address,address)"},{"selector":"0xdc4c90d3","name":"poolManager()"},{"selector":"0xdc98354e","name":"beforeInitialize(address,(address,address,uint24,int24,address),uint160)"},{"selector":"0xe1b4af69","name":"afterDonate(address,(address,address,uint24,int24,address),uint256,uint256,bytes)"},{"selector":"0xe30c3978","name":"pendingOwner()"},{"selector":"0xe3a0be18","name":"MAX_PROTOCOL_TAX_SHARE()"},{"selector":"0xe9ee6eeb","name":"transferAdmin(address,address)"},{"selector":"0xf0f44260","name":"setTreasury(address)"},{"selector":"0xf1097725","name":"distributeMany(address,address[])"},{"selector":"0xf2fde38b","name":"transferOwnership(address)"},{"selector":"0xfad17eb6","name":"accrued(address,address)"},{"selector":"0xfc3fa966","name":"protocolTaxShareBps()"}],"history":{"pools":4,"firstTime":1789730664,"lastTime":1791448811},"pools":[{"id":"0x50b3b0d5cc31806d3a146b5fd947d090999ad9c1466f31af253f6765eaf958a8","key":{"currency0":"0x2691ca04E18C4196a7ba125203f676583F8CF25c","currency1":"0x322F0929c4625eD5bAd873c95208D54E1c003b2d","fee":10000,"tickSpacing":200,"hooks":"0x2965c66FC26cE0d11001A8D6465d8AC07EC8A0cC"},"symbols":["MOMOWEB","TSLA"],"state":{"sqrtP":"44228794237567088792808","tick":-287984,"protocolFee":0,"lpFee":10000,"liquidity":"91839545397989762841"},"swaps":[{"zeroForOne":true,"ok":true,"amountIn":"33479878120154883098732","paid":"33479878120154883098732","got":"9810840404","expected":"10327200425","feePpm":10000,"takePpm":50000},{"zeroForOne":false,"ok":true,"amountIn":"25634523301","paid":"25634523301","got":"77326585667586023417536","expected":"81394392400365797957702","feePpm":10000,"takePpm":49977}],"roundTrip":{"ok":true,"lossPpm":1,"added":["-632172140128348896637","-155562284"],"removed":["632172140128348896636","155562283"]}},{"id":"0xdc49f5c3b0550c7196fed32224df7fdd52e16e99ae25d74779c0ac1e2d45cac2","key":{"currency0":"0x0Bd7D308f8E1639FAb988df18A8011f41EAcAD73","currency1":"0x2691ca04E18C4196a7ba125203f676583F8CF25c","fee":10000,"tickSpacing":200,"hooks":"0x2965c66FC26cE0d11001A8D6465d8AC07EC8A0cC"},"symbols":["WETH","MOMOWEB"],"state":{"sqrtP":"394939607426262896704698325974521816","tick":308453,"protocolFee":0,"lpFee":10000,"liquidity":"4211397113257187973"},"swaps":[{"zeroForOne":true,"ok":true,"amountIn":"422420603","paid":"422420603","got":"10075016297195594157305","expected":"10386460551939212572318","feePpm":10000,"takePpm":29986},{"zeroForOne":false,"ok":true,"amountIn":"10496567570442123240306","paid":"10496567570442123240306","got":"405449809","expected":"417989493","feePpm":10000,"takePpm":30000}],"roundTrip":{"ok":true,"lossPpm":1,"added":["-3094469","-67498785140143968346"],"removed":["3094468","67498785140143968345"]}}],"openCallbacks":[],"checks":[{"id":"01","title":"Permissions that touch your money","status":"caution","detail":"The address enables before swap returns delta, after swap returns delta. The hook is allowed to take; the next two checks measure whether it does."},{"id":"02","title":"What it takes from a swap","status":"caution","detail":"It takes 5% of each swap on top of the pool fee."},{"id":"03","title":"LPs can get out","status":"pass","detail":"Liquidity added and removed in the same block came back whole."},{"id":"04","title":"The fee is the fee","status":"pass","detail":"A fixed fee of 1%, written in the pool key."},{"id":"05","title":"No one holds the switch","status":"caution","detail":"Owned by 0x01b1A16ED6eb5a58A3742014D1971bCce5B96DC8. Owner-style functions: claim, setLaunchpad, setProtocolTaxShare, setRecipients, claimable, transferAdmin."},{"id":"06","title":"The code cannot change","status":"pass","detail":"Not a proxy, no DELEGATECALL, no SELFDESTRUCT."},{"id":"07","title":"Only the PoolManager can call it","status":"pass","detail":"Each callback refused a call that did not come from the PoolManager."},{"id":"08","title":"Track record","status":"pass","detail":"4 pools over 31 days."}],"score":75,"verdict":"caution"}