{"hook":"0xA0cFc3eb8339001971f4473365cb1614971A40Cc","block":93239615,"bits":204,"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":false},{"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":4737,"selectors":["0x03fd2a45","0x07fea792","0x4a09ee48","0x4c9d9df0","0x50516573","0x5579ed01","0x575e24b4","0x6b53e9e1","0x817025b9","0x921ad58c","0xa6c31c90","0xac4e4054","0xb47b2fb1","0xb5217bb4","0xb521d013","0xbd66528a","0xc45a0155","0xc94bafb4","0xdc4c90d3","0xe32093aa","0xe4186cfa","0xf50c5110","0xfea1fc8e"],"delegatecall":false,"selfdestruct":false,"create":false,"calls":4,"addresses":[]},"proxy":{"implementation":null,"admin":null,"beacon":null,"clone":false},"owner":null,"functions":[{"selector":"0x03fd2a45","name":"DEAD()"},{"selector":"0x07fea792","name":"REWARDS_ETHICS_BPS()"},{"selector":"0x4a09ee48","name":"CREATOR_CREATOR_BPS()"},{"selector":"0x4c9d9df0","name":"QUOTE_FEE_BPS()"},{"selector":"0x50516573","name":"HOOK_FLAG_MASK()"},{"selector":"0x5579ed01","name":"rewardsVault()"},{"selector":"0x575e24b4","name":"beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)"},{"selector":"0x6b53e9e1","name":"CREATOR_ETHICS_BPS()"},{"selector":"0x817025b9","name":"MODE_BURN()"},{"selector":"0x921ad58c","name":"REWARDS_VAULT_BPS()"},{"selector":"0xa6c31c90","name":"burnedBase(bytes32)"},{"selector":"0xac4e4054","name":"REQUIRED_HOOK_FLAGS()"},{"selector":"0xb47b2fb1","name":"afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)"},{"selector":"0xb5217bb4","name":"pools(bytes32)"},{"selector":"0xb521d013","name":"feeSchedule(uint8)"},{"selector":"0xbd66528a","name":"claim(bytes32)"},{"selector":"0xc45a0155","name":null},{"selector":"0xc94bafb4","name":"accruedQuote(bytes32)"},{"selector":"0xdc4c90d3","name":"poolManager()"},{"selector":"0xe32093aa","name":"ethicsFee()"},{"selector":"0xe4186cfa","name":"MODE_CREATOR()"},{"selector":"0xf50c5110","name":"register(bytes32,address,address,uint8)"},{"selector":"0xfea1fc8e","name":"MODE_REWARDS()"}],"history":{"pools":5,"firstTime":1788313286,"lastTime":1788502186},"pools":[{"id":"0x953a45a53d60946b63d16559275edd1f80abd5ff25dd0675c028b95b4e0594d5","key":{"currency0":"0x9945B7F458790287a182E8d8e6C85059db2C6333","currency1":"0xd917B029C761D264c6A312BBbcDA868658eF86a6","fee":0,"tickSpacing":200,"hooks":"0xA0cFc3eb8339001971f4473365cb1614971A40Cc"},"symbols":["ND","USAR"],"state":{"sqrtP":"41700560834500639835428161","tick":-150999,"protocolFee":0,"lpFee":0,"liquidity":"526308757936314236768967"},"swaps":[{"zeroForOne":true,"ok":true,"amountIn":"12499999792134223039375","paid":"12499999792134223039375","got":"3428186147778340","expected":"3462814290685191","feePpm":0,"takePpm":10000},{"zeroForOne":false,"ok":true,"amountIn":"138507379709218367","paid":"138507379709218367","got":"494730358472556083684001","expected":"499725137431284354315885","feePpm":0,"takePpm":9996}],"roundTrip":{"ok":true,"lossPpm":1,"added":["-3915863939497281336519","-820006160573561"],"removed":["3915863939497281336518","820006160573560"]}},{"id":"0x741dc024968962738209166c2a8c43dd0c671200e3d5c1ec0e428092a28497ba","key":{"currency0":"0x0000000000000000000000000000000000000000","currency1":"0xa0669C7042b32002Fb494758688E672feDeBB333","fee":0,"tickSpacing":200,"hooks":"0xA0cFc3eb8339001971f4473365cb1614971A40Cc"},"symbols":["ETH","ETH"],"state":{"sqrtP":"1744242017162271910958877320943748","tick":199999,"protocolFee":0,"lpFee":0,"liquidity":"45422633889328990341800"},"swaps":[{"zeroForOne":true,"ok":true,"amountIn":"1031609084117965","paid":"1031609084117965","got":"494754497022662855902116","expected":"499749519683278319558876","feePpm":0,"takePpm":9996},{"zeroForOne":false,"ok":true,"amountIn":"302778164585199234962","paid":"302778164585199234962","got":"618450997777","expected":"624697977552","feePpm":0,"takePpm":10000}],"roundTrip":{"ok":true,"lossPpm":1,"added":["-6097673391700","-3920742828121323544343"],"removed":["6097673391699","3920742828121323544342"]}}],"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":"pass","detail":"It takes 1% 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 0%, written in the pool key."},{"id":"05","title":"No one holds the switch","status":"caution","detail":"No owner() but it has burnedBase, claim."},{"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":"5 pools over 48 days."}],"score":88,"verdict":"caution"}