{"hook":"0x4BBA749a09E0fd002ac52E83A7ABa1E69782A000","block":93401342,"bits":8192,"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":false},{"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":false},{"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":false},{"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":false},{"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":17750,"selectors":["0x12261ee7","0x16d9eefb","0x184cfbab","0x1f5ba264","0x21c099c8","0x2aefd857","0x2f14ae32","0x30040054","0x35a9e4df","0x4bc1bf14","0x4e6b0bbe","0x571fe4e3","0x634282af","0x680c60c7","0x6bb135ba","0x7824407f","0x791b98bc","0x816c1c62","0x8a4940f2","0x8baf2ced","0x977f4303","0x9b177c8e","0x9dd4c4ec","0xc59f7df4","0xc84f7749","0xcdf46660","0xcfb965e7","0xd66fd662","0xdbb80e42","0xdc4c90d3","0xdc98354e","0xdea5c2e0","0x9fa36cdc","0xceefe5d1","0xd4570c1c","0xe5225381","0xf3f05313","0xf940e385","0x03ee438c","0x06fdde03","0x095ea7b3","0x18160ddd","0x23b872dd","0x313ce567","0x3c130d90","0x70a08231","0x95d89b41","0xa9059cbb","0xdd62ed3e","0xe8a3d485"],"delegatecall":false,"selfdestruct":false,"create":false,"calls":12,"addresses":[]},"proxy":{"implementation":null,"admin":null,"beacon":null,"clone":false},"owner":null,"functions":[{"selector":"0x12261ee7","name":"permit2()"},{"selector":"0x16d9eefb","name":"lpFeeOf(address)"},{"selector":"0x184cfbab","name":"lockerOf(address)"},{"selector":"0x1f5ba264","name":"roundingDustOf(address)"},{"selector":"0x21c099c8","name":"poolKeyFor(address)"},{"selector":"0x2aefd857","name":"LP_FEE_MEDIUM()"},{"selector":"0x2f14ae32","name":"tickUpperOf(address)"},{"selector":"0x30040054","name":"poolIdOf(address)"},{"selector":"0x35a9e4df","name":"universalRouter()"},{"selector":"0x4bc1bf14","name":"DEFAULT_LP_FEE()"},{"selector":"0x4e6b0bbe","name":"MAX_METADATA_URI_BYTES()"},{"selector":"0x571fe4e3","name":"getTokenBytecode(string,string,string)"},{"selector":"0x634282af","name":"allTokens(uint256)"},{"selector":"0x680c60c7","name":"MAX_NAME_BYTES()"},{"selector":"0x6bb135ba","name":"tickSpacingForFee(uint24)"},{"selector":"0x7824407f","name":"tokenSupply()"},{"selector":"0x791b98bc","name":"positionManager()"},{"selector":"0x816c1c62","name":"usedSalt(bytes32)"},{"selector":"0x8a4940f2","name":"MAX_SYMBOL_BYTES()"},{"selector":"0x8baf2ced","name":"LP_FEE_LOW()"},{"selector":"0x977f4303","name":"predictTokenAddress(address,bytes32,string,string,string)"},{"selector":"0x9b177c8e","name":"poolKeyFor(address,uint24)"},{"selector":"0x9dd4c4ec","name":"initialSqrtPriceX96Of(address)"},{"selector":"0xc59f7df4","name":"deriveSalt(address,bytes32)"},{"selector":"0xc84f7749","name":"maxRoundingDustExclusiveOf(address)"},{"selector":"0xcdf46660","name":"tickLowerOf(address)"},{"selector":"0xcfb965e7","name":"launch(string,string,string,bytes32,int24,int24,uint24,uint256)"},{"selector":"0xd66fd662","name":"LP_FEE_HIGH()"},{"selector":"0xdbb80e42","name":"allTokensLength()"},{"selector":"0xdc4c90d3","name":"poolManager()"},{"selector":"0xdc98354e","name":"beforeInitialize(address,(address,address,uint24,int24,address),uint160)"},{"selector":"0xdea5c2e0","name":"creatorOf(address)"},{"selector":"0x9fa36cdc","name":"creatorFeeRecipient()"},{"selector":"0xceefe5d1","name":"positionTokenId()"},{"selector":"0xd4570c1c","name":"claimable(address,address)"},{"selector":"0xe5225381","name":"collect()"},{"selector":"0xf3f05313","name":"totalCollected(address)"},{"selector":"0xf940e385","name":"withdraw(address,address)"},{"selector":"0x03ee438c","name":"metadataURI()"},{"selector":"0x06fdde03","name":"name()"},{"selector":"0x095ea7b3","name":"approve(address,uint256)"},{"selector":"0x18160ddd","name":"totalSupply()"},{"selector":"0x23b872dd","name":"transferFrom(address,address,uint256)"},{"selector":"0x313ce567","name":"decimals()"},{"selector":"0x3c130d90","name":"tokenURI()"},{"selector":"0x70a08231","name":"balanceOf(address)"},{"selector":"0x95d89b41","name":"symbol()"},{"selector":"0xa9059cbb","name":"transfer(address,uint256)"},{"selector":"0xdd62ed3e","name":"allowance(address,address)"},{"selector":"0xe8a3d485","name":"contractURI()"}],"history":{"pools":3,"firstTime":1784059938,"lastTime":1784075597},"pools":[{"id":"0x614f1b9f58f7a9f497c80573b78893053f43590177f11415a9bd62028a3eabc5","key":{"currency0":"0x0000000000000000000000000000000000000000","currency1":"0xe6A3304DdA3D2878b65Fd47A607b4E86C89a06d3","fee":500,"tickSpacing":10,"hooks":"0x4BBA749a09E0fd002ac52E83A7ABa1E69782A000"},"symbols":["ETH","OKAY"],"state":{"sqrtP":"686355756953620584382706639677003","tick":181345,"protocolFee":0,"lpFee":500,"liquidity":"119131751653670457386085"},"swaps":[{"zeroForOne":true,"ok":true,"amountIn":"938221513795156","paid":"938221513795156","got":"70371687522341471240184","expected":"70371687522341471240184","feePpm":500,"takePpm":0},{"zeroForOne":false,"ok":true,"amountIn":"58603324780656006687251","paid":"58603324780656006687251","got":"780442681326374","expected":"780442681326374","feePpm":500,"takePpm":0}],"roundTrip":{"ok":true,"lossPpm":1,"added":["-40943600040023","-3077318680327101659859"],"removed":["40943600040022","3077318680327101659858"]}},{"id":"0xc54b8090aee59774b3e0d55424fca333e35ef9e56ca6db4a3d9b9cbb11dc2c02","key":{"currency0":"0x0000000000000000000000000000000000000000","currency1":"0x790fAa103C61160A2Faaf668EE19A0D708e0906e","fee":10000,"tickSpacing":200,"hooks":"0x4BBA749a09E0fd002ac52E83A7ABa1E69782A000"},"symbols":["ETH","TES"],"state":{"sqrtP":"1546364563412770678544987768597669","tick":197591,"protocolFee":0,"lpFee":10000,"liquidity":"52892980416150088098085"},"swaps":[{"zeroForOne":true,"ok":true,"amountIn":"1354988903465948","paid":"1354988903465948","got":"510764401438736029001150","expected":"510764401438736029001150","feePpm":10000,"takePpm":0},{"zeroForOne":false,"ok":true,"amountIn":"108566183145814760528287","paid":"108566183145814760528287","got":"282110948637165","expected":"282110948637165","feePpm":10000,"takePpm":0}],"roundTrip":{"ok":true,"lossPpm":1,"added":["-8119381006338","-4006011631388190161824"],"removed":["8119381006337","4006011631388190161823"]}}],"openCallbacks":[],"checks":[{"id":"01","title":"Permissions that touch your money","status":"pass","detail":"None of the permissions that let a hook take from swaps or from LPs are switched on."},{"id":"02","title":"What it takes from a swap","status":"pass","detail":"A swap through it pays the pool fee and nothing else."},{"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":"No owner() but it has claimable, collect, withdraw, transferFrom, transfer."},{"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":"3 pools over 97 days."}],"score":93,"verdict":"caution"}