Cryo Explorer Ethereum Mainnet

Address Contract Partially Verified

Address 0x5A1b2aCd0c9992e14F2b6d8a326023E35a097A3a
Balance 0 ETH
Nonce 1
Code Size 21100 bytes
Indexed Transactions 0
External Etherscan · Sourcify

Contract Bytecode

21100 bytes
0x60808060405260043610156112b8575b5036156112b657346101ea57610023613aba565b906bcdccd5c65a7d4860ce3abbe991825c9283331860601b845f351860e01c176101ea575f905d806004116101ea576003196004830191019260a01c61ffff169081600214610da5578160061461082e57816005146102aa57816001146101ee578160041461013f57506003146100a857634e487b7160e01b5f52605160045260245ffd5b6024810190604481013580936060105f1461012c5750610102916100e2604051916100d2836115c4565b33835285602084015236906116c7565b906100fc60a484013593369060e460c48201359101611673565b91614060565b6040519060608252602082810152602082604001528160600152806080016040525b602081519101f35b905061013a91339035613a3e565b610102565b9260a09150106101ea576101d69161017160a48301916001600160a01b038061016785614726565b1691351614614045565b61019560405191610181836115c4565b3383526024840135602084015236906116c7565b906100fc6101058401356001169336906101257fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f6084830135019101611673565b6040516101e281611618565b5f8152610124565b5f80fd5b919260809150106101ea57359060248101359060448101350190602482013560601c92815f821391180218903083145f14610236576101d6925060383391013560601c613a3e565b906102446102a59315614045565b60405190610251826115c4565b338252602082015261026636602c84016116c7565b906100fc608d84013560011693369060ad7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff776004830135019101611673565b6101d6565b5050610327915080604460246103199301359101919091803560601c908060140135908160801c916fffffffffffffffffffffffffffffffff16908060340135908160801c916f01000000000000000000000000000000161515906058196059826045013560601c9201980196565b9586939197989495986145a8565b968560409b939694959b97929701518a8989898988306001600160a01b0387160361081e575b610800575b5050505050518460600152610366846148a8565b9061036f61429a565b906103786141a5565b925b6034821015610612575050505081604001519687602001519751996103a0845182615062565b8360200151805115610602575b5080519081158015610587575b50505082519a8b602001519b519b828d9384106105805750906103dd9291614abf565b156104cb575050505050821591821561041c575b505050505b604051906060825260208281015260208260400152816060015280608001604052610124565b6001600160a01b031630036104b75730905b60601b9161049a57604051926060526040528073777777777777777777777777777777777777777760611b141502602c526f0b0d9c09000000000000000000000000600c525f806064601c82335af115610492575f6060526040525f8080806103f1565b3d5f823e3d90fd5b506020526fcbf0dbf50000000000000000000000005f5260246010fd5b6bcd1e9517bb0cb8d0d5cde8935c9061042e565b606096929496959193950151968088039714610564576001600160a01b03811673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee03610553575050505050505f6014526fa58411940000000000000000000000005f525f806024601082335af115610548575f6004601c6020936311da60b48452335af16103f6575b6040513d5f823e3d90fd5b9061055e9691614bae565b506103f6565b6014526ffb772a880000000000000000000000005f5260246010fd5b9150613a1b565b6105ee576020810151856040015181036105cd575b5060015b828110156103ba57806105c760208460019460051b01015180602001519051903090614abf565b016105a0565b602081015190516105e89130906001600160a01b0316614abf565b5f61059c565b634e487b7160e01b5f52603260045260245ffd5b61060c9082615062565b5f6103ad565b808d6016601519610639943560f01c95846002013560601c60408a015201920190886148c5565b866020939293015160200151610708885160200151947fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe68360601b946001600160a01b038860601b9573777777777777777777777777777777777777777760611b9982888a10898d1415168a8d1417838318028093181660208d015218168952823560e81c60408a015262ffffff833560d01c1660020b60608a01526001600160a01b03833560301c1660808a01520190601a01919091803560e81c6002198160038185820195010195030192565b919692959062ffffff88116107ee576020926127105f938e8d898b108a8a1415168b8a1417151590528601515102048303848c0152806040519263f3cd914c84528b518073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415028487015260808c8701856040015e60608d8560c0015e61012084810152818461014001528361016001376101440190601c0182335af115610548575f5192600f84810b9460801d900b92808210908314151691141781831802916107d489602001519184835191185f0390613aad565b90526107e688518093815193186149e6565b01905261037a565b634e487b715f5260326020526024601cfd5b61081294866020015190875191614bae565b81528a89898989610352565b6108278261473a565b875261034d565b5050505061089c610319610840613aba565b90919091803560601c908060140135908160801c916fffffffffffffffffffffffffffffffff16908060340135908160801c916f01000000000000000000000000000000161515906058196059826045013560601c9201980196565b968560409b939694959b97929701518a8989898988306001600160a01b03871603610d95575b610d77575b50505050505184606001526108db846148a8565b906108e461429a565b604051928360e081011067ffffffffffffffff60e086011117610d635760e084016040525f84525f60208501525f60408501525f60608501525f60808501525f60a0850152606060c08501525b6003831015610b2357505050508160400151968760200151975199610957845182615062565b8360200151805115610b13575b5080519081158015610aac575b50505082519a8b602001519b519b828d9384106105805750906109949291614a60565b15610a6757505050505082159182156109c6575b505050505b6040519060208252816020015280604001604052610124565b6bcd1e9517bb0cb8d0d5cde8935c9160601b92610a4a57604051936060526001600160a01b033091161481301802186040528073777777777777777777777777777777777777777760611b141502602c526fae639329000000000000000000000000600c525f806064601c82335af115610492575f6060526040525f8080806109a8565b826020526fcbf0dbf50000000000000000000000005f5260246010fd5b606098979896919395929496015197808914610a8f57610a8997980391614b1e565b506109ad565b826014526ffb772a880000000000000000000000005f5260246010fd5b6105ee57602081015185604001518103610af2575b5060015b828110156109715780610aec60208460019460051b01015180602001519051903090614a60565b01610ac5565b60208101519051610b0d9130906001600160a01b0316614a60565b5f610ac1565b610b1d9082615062565b5f610964565b808d7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe610b5b933560f01c95019160020190886148c5565b92838261c0008316610ca057505081612710610bdd92610be9943560601c88602001526001600160a01b038a60200151602001511660408901526001600160a01b038a516020015116606089015289602001515102046080870152601319604051950190601401919091803560e81c6002198160038185820195010195030192565b95929391953691611673565b60c086015262ffffff84116107ee57604051603f1986015190601f1987015190632bfb780c603f198901526020601f1989015260605f60448a60c001518b8151910390818d60c0015201017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc8b0182335af115610548576020519160405193603f198a0152601f198901526040528860200151908151039052610c8f8851918251613ae7565b905260608560c00152604052610931565b92509362ffffff106107ee57613fff816140006127109316155f14610d40575f60208601526001600160a01b038951602001511660408601525b1687602001515102046060830152604051601f19830151906343583be5601f1985015260605f60a4600319870182335af115610492576020519060405192601f198601526040528760200151908151039052610d398751918251613ae7565b9052610931565b600160208601526001600160a01b03896020015160200151166040860152610cda565b634e487b7160e01b5f52604160045260245ffd5b610d8994866020015190875191614b1e565b81528a898989896108c7565b610d9e8261473a565b87526108c2565b5050610e14915080606460446103199301359101919091803560601c908060140135908160801c916fffffffffffffffffffffffffffffffff16908060340135908160801c916f01000000000000000000000000000000161515906058196059826045013560601c9201980196565b968560409b939694959b97929701518a8989898988306001600160a01b038716036112a6575b611288575b50505050508051607f1c6111c857518460600152610e5c846148a8565b610e646141a5565b915b602f811015611028575050508160400151968760200151975199610e8b845182615062565b8360200151805115611018575b5080519081158015610fb1575b50505082519a8b602001519b519b828d938410610580575090610ec89291614a01565b15610f8f5750505050508215918215610f055750505050604051906060825260208281015260208260400152816060015280608001604052610124565b6001600160a01b03163003610f7b5730905b60601b9161049a57604051926060526040528073777777777777777777777777777777777777777760611b141502602c526f03a65ab6000000000000000000000000600c525f806064601c82335af115610492575f6060526040525f8080806103f1565b6bcd1e9517bb0cb8d0d5cde8935c90610f17565b606098979896919395929496015197808914610a8f5761055e97980391614786565b6105ee57602081015185604001518103610ff7575b5060015b82811015610ea55780610ff160208460019460051b01015180602001519051903090614a01565b01610fca565b602081015190516110129130906001600160a01b0316614a01565b5f610fc6565b6110229082615062565b5f610e98565b611068823560f01c928d600e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2836002013560a01c9501920190886148c5565b919092866020015180519060200151885160200151918160601b946001600160a01b038460601b94818073777777777777777777777777777777777777777760611b9616911690828988108a8814151688881417838318028093181660208d015218168073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415028952601f19886020019701973560408a015262ffffff88116107ee575f60409161800087161582146111da57825182815260e49160608d602084015e612710617fff8a1687020482608001528988108a88141516888814178260a001528160c00152828160e00152601c0182335af11561054857617fff61118c612710935f519560205196985b808210908314151691141785881802809518968c60200151958691186149e6565b93805190858203905284119416020410176111c8578551908151905f81136111b9575f0301905290610e66565b602483633351b2608152601c01fd5b634e487b715f5260116020526024601cfd5b82516f101e895200000000000000000000000081526101049160148d8601602084015e60608d836034015e612710617fff8a1687020482609401528988108a88141516888814178260b401528160d40152828160f4015260100182335af115610548575f5192602051600f8180820b188680830b181790612710617fff891686020490612710617fff8a16870204900b183d60401117176101ea5761271093617fff9261118c92969861116b565b61129a94866020015190875191614786565b81528a89898989610e3f565b6112af8261473a565b8752610e3a565b005b60e05f3560e01c9182631fff991f14611341575050806367c4a3b014611313576370a08231146112e8575f61000f565b346101ea5760206003193601126101ea576004356001600160a01b038116036101ea575f805360015ff35b346101ea575f6003193601126101ea57602060405173352650ac2653508d946c4912b07895b22edd84cd8152f35b6003198036019160a08084126101ea5760608094126101ea576064359167ffffffffffffffff918284116101ea57366023850112156101ea5783600401359283116101ea576024913660248560051b870101116101ea5733956d1ff3684f28c67538d4d072c227343314611594575b86881b15611587576bcd1e9517bb0cb8d0d5cde89398895c808a1b61156b5750876001600160a01b03168a5d85611415575b505050505050506113f1611ca2565b825c18901b611408575f905d602060405160018152f35b635149e7955f526004601cfd5b60248701358701916024830135936044946044850135918260e01c90848301916048809801916114468484846117b1565b9060405215611502575b505050505060448801956001986001975b89891061147157505050506113e2565b80358201838101359088810135888784019201906114928383838c1c611c28565b156114a757505050988b019850602001611461565b9450965096509650508b92507fffffffff00000000000000000000000000000000000000000000000000000000915060405197633c74eed6895288602001521686604001528581015284608094838287015201370190601c01fd5b828261150d92611c28565b156115185780611450565b60809394508d7fffffffff0000000000000000000000000000000000000000000000000000000060405196633c74eed688525f88602001521686604001528581015281858501528460a001370190601c01fd5b6014526f7407c0f80000000000000000000000005f5260246010fd5b63e758b8d55f526004601cfd5b366013190135881c96506113b0565b35906001600160a01b03821682036101ea57565b359081151582036101ea57565b6040810190811067ffffffffffffffff821117610d6357604052565b6060810190811067ffffffffffffffff821117610d6357604052565b6080810190811067ffffffffffffffff821117610d6357604052565b6020810190811067ffffffffffffffff821117610d6357604052565b90601f601f19910116810190811067ffffffffffffffff821117610d6357604052565b67ffffffffffffffff8111610d6357601f01601f191660200190565b92919261167f82611657565b9161168d6040519384611634565b8294818452818301116101ea578281602093845f960137010152565b9080601f830112156101ea578160206116c493359101611673565b90565b8092910391608083126101ea57604051906116e1826115e0565b60408294126101ea57606060409182516116fa816115c4565b611703826115a3565b81526020820135602082015284528281013560208501520135910152565b91610160838303126101ea57611736836115a3565b92611743602082016115b7565b9260408201359260608301359267ffffffffffffffff9160808201358381116101ea57846117729184016116a9565b936117808160a085016116c7565b936101208401359081116101ea576101409161179d9185016116a9565b92013590565b35908160030b82036101ea57565b929190926117c0828583611d3f565b156117cd57506001925050565b63e15b26bc810361182157506117ed836118159261181a94950190611721565b96956001600160a01b036d1ff3684f28c67538d4d072c2273496929695939533149716613b25565b613d3c565b505b600190565b638de80c1c810361187d575063ffffffff611846846118729361181a95960190611721565b95946d1ff3684f28c67538d4d072c227349997999491949392933314956001600160a01b038b16613b25565b9160801c1690613cc4565b633a21aa128103611af557508201610140838203126101ea5761189f836115a3565b9260206040946118b08684016115b7565b936118be81606086016116c7565b9160e085013567ffffffffffffffff81116101ea57886118e481946101c19389016116a9565b966118f261010082016117a3565b93610120820135986001600160a01b0380938a865191730a7e848aca42d879ef06507fca0e7b33a0a63c1e5f5201358b527fbb7b783eb4b8ca46925c5384a6b9919df57cb83da8f76e37291f58d0dd5c439a865260ff600b536055600b20908652169761195e81613e23565b9185519582818d8980965191015e8c01836060015e6d1ff3684f28c67538d4d072c2273433148260a00153805180918c018360a1015e806081018252019560a18701809852845194858b019061018589015e60c061016588015260030b6101458701525f6101258701528a61010587015260e58601521660c58401526f3eece7db00000000000000000000000060b18401528060e40184528201018852826bcd1e9517bb0cb8d0d5cde8935c1860601b15611587576bcdccd5c65a7d4860ce3abbe991825c80611ae657505f9160c183927f67ca7c91000000000000000400000000000000000000000000000000000000008717865d51910182865af190611a64613e6e565b9115611ade575c80611acf575086818051810103126101ea5786015193838510611a9357506001955050505050565b5f6004601c899486946350a2884b02635f64b55b1884525afa15611ac657505f51908160a01c903d101715613a1b575f80fd5b513d5f823e3d90fd5b8363d66fcc385f52526024601cfd5b508281519101fd5b8563ab7646c45f52526024601cfd5b9192909163b840fd0e03611c2257611b0f91810190611721565b856060819498979993959699020460601483151715611c0e5787606081020460601488151715611c0e576060880260801c15156060840260801c15158260801c151517176111c85760606001600160a01b03938161181a9a604080519b8a51998d81519c8d928d6101329285610115868401820101526020018484015e602001918d01015e6101358d8b018c010182526d1ff3684f28c67538d4d072c2273433148d6101310153816020820160f18f015e518c60b1015e5f8b609d01520289608801520287607801528660680152168460580152018060d10183604401526020836024015263f83d08ba83600401526101150182528160a80153613c0d565b634e487b7160e01b5f52601160045260245ffd5b50505f90565b919091604051611c39838584612242565b906040525f14611c4b57505050600190565b63bd01c22603611c225781604091810103126101ea576020813591013590804211611c925750803411611c7e5750600190565b634a0944315f52602052346040526044601cfd5b63cd21db4f5f526020526024601cfd5b6004356001600160a01b038082168083036101ea57602435918216918281036101ea5760443592831580611d37575b611d305773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee148015611d205747935b808510611d18575015611d0e575050611d0c91613a9e565b565b611d0c9350613a3e565b925050613a1b565b611d2a30836139e7565b93611cf4565b5050505050565b508015611cd1565b90919063c1fb425e8103611dbf5750810160c0828203126101ea57611d63826115a3565b611d7082602085016116c7565b9160a084013567ffffffffffffffff81116101ea57611d9f611da7926001600160a01b039261181c97016116a9565b921683613af4565b506d1ff3684f28c67538d4d072c22734331492614060565b9192916322ce6ede036121d7578201610100838203126101ea57611de2836115a3565b67ffffffffffffffff9260208501358481116101ea5783611e049187016116a9565b92611e1281604088016116c7565b9460c08701359081116101ea5760e091611e2d9188016116a9565b9501359480516089019485608911611c0e57611eab91601f19611e68611e5289611657565b98611e606040519a8b611634565b808a52611657565b013660208901378151602001518760480152604082602001886068015e6d1ff3684f28c67538d4d072c2273433148760a801538051906020018760a9015e613e23565b5f957f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82116111c857602896939491935b825190604082106107ee5786958460140151918560150151908660180151918b88602c01519289604001519c8d9360ff80821680155f1461208c575050506001600160a01b03926120039695949260e49285611f88731f98431c8ad98523631ae4a59f267346ea31f984998d7fe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b549b63fa461e339c5b828b188b87168488161002928318928b189161455f565b958451938d866028015285601401528385526040519b8c998a9686602001908860c4015e60a08760a4015283168660840152856064015216868c161083604401528560408d1181831630180291161882602401526f128acb0800000000000000000000000082601001528060c4018252010160405216613db5565b6040818051810103126101ea5760409260208201519384920151926040526001600160a01b03808b16911610911802185f03955f87126111c85760408792111561206f575050309491602c8151106107ee57602c602b1982510191019081529487875294919394611edc565b94509550935050935081831061208757505050600190565b613a1b565b600181036120f2575050506001600160a01b03926120039695949260e49285611f887341ff9aa7e16b8b1a8a8dc4f0efacd93d02d071c9998d7f6ce8eb472fa82df5469c6ab6d485f17c3ad13c8cd7af59b3d4a8026c5ce0f7e29b6323a69e759c611f71565b60028103612158575050506001600160a01b03926120039695949260e49285611f8873baceb8ec6b9355dfc0269c18bac9d6e2bdc29c4f998d7fe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b549b63fa461e339c611f71565b91945092945060039150145f146121c6575050906001600160a01b038b60e48e61200396958e85611f887370fe4a44ea505cfa3a57b95cf2862d4fd5f0f687998d7fe9b68c5f77858eecac2e651646e208175e9b1359d68d0e14fc69f8c54e5010bf9b633a1c453c9c611f71565b63d3b1276d5f52166020526024601cfd5b505f9150565b9190610100838203126101ea576121f3836115a3565b92612200602082016115a3565b92604082013592612213606084016115b7565b9260808101359260a08201359260c083013567ffffffffffffffff81116101ea5760e09161179d9185016116a9565b9092919063d92aadfb810361260c575082016101209081848203126101ea5761226a846115a3565b9060209461227a828783016116c7565b9061228760a082016115a3565b9260c082013567ffffffffffffffff81116101ea578201906122a8916116a9565b6122b460e083016115a3565b9561010080930135936001600160a01b0380809716978b835101517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd8ef10156122fb90614045565b166123069082613af4565b8b8884959395515116968a60409c8d998a5190612322826115fc565b81528481018690528a810183905260016060820152601f190180517f7d806873084f389a66fd0315dead7adaad8ae6e8b6cf9fb0d3db61e5a91c3ffa825260a0822091528a51909c6bcd1e9517bb0cb8d0d5cde8935c612381836115fc565b83821683528683018e9052168b82015260016060820152601f190180517f7d806873084f389a66fd0315dead7adaad8ae6e8b6cf9fb0d3db61e5a91c3ffa825260a0822091529a8b956123d430846139e7565b828111818418021891826123e79261421f565b9d8e868b01526123f692613a3e565b88805197612403896115fc565b60588952848901987f436f6e73696465726174696f6e286164647265737320746f6b656e2c75696e748a528281017f32353620616d6f756e742c6164647265737320636f756e74657270617274792c9052606081017f626f6f6c207061727469616c46696c6c416c6c6f77656429000000000000000090528251612486816115e0565b602e8152868101907f546f6b656e5065726d697373696f6e73286164647265737320746f6b656e2c7582528481017f696e7432353620616d6f756e7429000000000000000000000000000000000000905284519b8c938985017f436f6e73696465726174696f6e20636f6e73696465726174696f6e29000000009052518091603c86015e830190603c8201905f8252519283915e01603c81015f905203601c81018a52603c01612536908a611634565b81519a8b98899663137c29fe88528282518983015e01866060015e8460a0015e8260e0015201526101409182910152815191610160918584840191015284838c0192015e815191828a0190828501610180015e016101840190601c015a915f9291836e22d473030f116ddee9f6b43ac78ba38194f115612602576fffffffffffffffffffffffffffffffff9394957f49fa719b76f0f6b7e76be94b56c26671a548e1c712d5b13dc2874f70a75982765f5252835190845260605f209352166010525f5260305fa0600190565b83513d5f823e3d90fd5b9283638d68a156829495145f1461295a575001916080828403126101ea57612633826115a3565b602083013593604084013567ffffffffffffffff81116101ea5760609161265b9186016116a9565b9301359361269384516020860151906bffffffffffffffffffffffff19918281169160148110612945575b503092505060601c6139e7565b818102918183041490151715611c0e57612710900491604051936126b6856115e0565b602895602886526040366020880137307f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff869396116111c857939491935b825190604082106107ee5786958460140151918560150151908660180151918b88602c01519289604001519c8d9360ff80821680155f1461280b575050506001600160a01b039261279f9695949260e49285611f88731f98431c8ad98523631ae4a59f267346ea31f984998d7fe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b549b63fa461e339c828b188b87168488161002928318928b189161455f565b6040818051810103126101ea5760409260208201519384920151926040526001600160a01b03808b16911610911802185f03955f87126111c85760408792111561206f575050309491602c8151106107ee57602c602b19825101910190815294878752949193946126f4565b60018103612871575050506001600160a01b039261279f9695949260e49285611f887341ff9aa7e16b8b1a8a8dc4f0efacd93d02d071c9998d7f6ce8eb472fa82df5469c6ab6d485f17c3ad13c8cd7af59b3d4a8026c5ce0f7e29b6323a69e759c611f71565b600281036128d7575050506001600160a01b039261279f9695949260e49285611f8873baceb8ec6b9355dfc0269c18bac9d6e2bdc29c4f998d7fe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b549b63fa461e339c611f71565b91945092945060039150145f146121c6575050906001600160a01b038b60e48e61279f96958e85611f887370fe4a44ea505cfa3a57b95cf2862d4fd5f0f687998d7fe9b68c5f77858eecac2e651646e208175e9b1359d68d0e14fc69f8c54e5010bf9b633a1c453c9c611f71565b8391925060140360031b1b1616805f80612686565b63103b48be8103612b19575060c091810103126101ea5761297a816115a3565b906020906129898282016115a3565b604093848301359361299d606085016115a3565b60808501359462ffffff861686036101ea5760a00135956001600160a01b0380809616921696600180881614915f9080612af7575b50630902f1ac5f52895f6004601c8c5afa15612aed57893d106101ea5788908360051b988951918a881896875194859183158015612adf575b612ac3575b50505061ffff6127109260081c1682030292028201918215612aaf57020491818310612a7b575050935f9693878481989460a49883978d519763022c0d9f89528801015285010152168160600152608081810152818160a00152601c01915af115611ac65750600190565b89855f6004601c8d849663dfec362602630dfe16811884525afa15611ac657505f51908160a01c903d101715613a1b575f80fd5b634e487b7160e01b5f52601260045260245ffd5b612ad7935090612ad2916139e7565b613aad565b838c5f612a10565b5060018086811c1614612a0b565b89513d5f823e3d90fd5b6127109150612b0630866139e7565b0204612b13818a86613a3e565b5f6129d2565b6338c9c1478103612b865750019060a0818303126101ea57612b3a816115a3565b90612b47604082016115a3565b90608081013567ffffffffffffffff81116101ea5761181c94612b6b9183016116a9565b9260206001600160a01b036060840135941692013590613e9d565b6334ee90ca8103612c4b5750608091810103126101ea57612ba6816115a3565b90612bb3602082016115a3565b6001600160a01b0381811673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee149260408101358415612c3b5747915b818311612bf7575b50505050505050600190565b60606127109101358302049103908181811191180218925f14612c2b575050612c1f91613a9e565b5f808080808080612beb565b612c36931690613a3e565b612c1f565b612c4530856139e7565b91612be3565b905063af72634f8103612c8357506001600160a01b03612c74836118159361181a9501906121dd565b9790969591959492941661440f565b829063736180c88103612df5575060c091810103126101ea57612ca5816115a3565b612cb1604083016115b7565b9160608101356080820135936001600160a01b0380861686036101ea5761271090612cde60a086016115a3565b951694612d0f73a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4860208584831802809418970135923091186139e7565b02049015612da95763fae036d55f5260205f6004601c885afa1561054857601f3d11156101ea57620f4240670de0b6b3a76400005f51019102049181831061208757505060105f60209481946044946034526014526f8d7ef9bb00000000000000000000000082525af115612d9057601f3d11156101ea575f603452600190565b6040516bffffffffffffffffffffffff163d5f823e3d90fd5b60105f602094968194966044946034526014526f9599127600000000000000000000000082525af115612d9057601f3d11156101ea575f6034525f519181831061208757505050600190565b9050636472b27681036132df57508160c091810103126101ea57612e18816115a3565b612e24602083016115a3565b60608301356001600160a01b03811690036101ea57612e45608084016115b7565b926040519161018083810160405260368460608501353c630902f1ac5f5260405f6004601c60608601355afa15610548575f51602051908060701c8260701c173d606011176101ea576001600160a01b038560200151166001600160a01b038651166001600160a01b0389828418028093181694876040015195866014526fd283e75f0000000000000000000000005f5260205f60246010845afa15610548573d6020116101ea5760205f602460108251948b6014526f402d267d00000000000000000000000084525afa15610548573d6020116101ea575f5101604051966001600160a01b0360608a0135166040528060601b602c526f1647292a000000000000000000000000600c5260205f6044601c730c9a3dd6b8f28529d72d7f9ce918d493519ee3835afa15610548575f519760405263961be3915f5260205f6004601c6001600160a01b03898918165afa15610548573d6020116101ea575f80516318e22d9882528888188e028818808218918111919091021891906040906004601c888a186001600160a01b03165afa15610548575f5195602051968760101c9060101c173d604011176101ea5760648760061c603f8916600a0a0204956347bd37185f5260205f6004601c6001600160a01b03868618165afa15610548573d6020116101ea578c978f975f5190818315826dffffffffffffffffffffffffffff18028218039215816dffffffffffffffffffffffffffff180218110292848410613281575b50505050966130fb978560a00151908660c0015190876060015192886080015191885f1461323757808c11908c03029282841161322257906130b59492918a61010001519461500f565b86808203911102915b670de0b6b3a764000091866101200151830393818302811090828402180291021802045f9160408901356131e6575b82156131bc575b50506144bf565b9160a0820135831061317357506001821161311a575b50505050600190565b5f606060a4936001600160a01b03839796846020819960405195869163022c0d9f835260051b9083828401015282180101521681830152608081810152828160a00152601c019201355af115610548575f808080613111565b5f6004601c6001600160a01b03848982806020988901511692511680926338d52e0f8852180218165afa15610548575f51908160a01c3d602011176101ea5760a0013590613a1b565b6131d69192506001600160a01b0360608a013516906139e7565b9081818111911802185f806130f4565b915061271060408901356131fa30856139e7565b020481811181831802189161321d836001600160a01b0360608c01351683613a3e565b6130ed565b61323294918a60e0015194614c46565b6130b5565b9193828b11928b0392909202929082841161326b579061325e9492918a60e001519461500f565b87808203911102916130be565b61327c94918a610100015194614c46565b61325e565b60209498505f93975082826132a66001600160a01b039384602497601c9718166139e7565b87526307a2d13a865218165afa15610548573d6020116101ea576130fb9689948c945f51019081818110159118021890975f808061306b565b91929163fd8c38e1810361331f575063ffffffff613307846118729361181a959601906121dd565b956001600160a01b03889a989692969593951661440f565b639b59756f81036134c557508260e091810103126101ea57613340826115a3565b9160209061334f8282016115a3565b9160409485830135926060810135916001600160a01b03808416908185036101ea57899261337f608086016115b7565b9860c061338e60a088016117a3565b96013598801561345a57935f966133bc829594936127108a99986133b230846139e7565b0204938491613a3e565b898651966133c988611618565b88885251968760e4015e60c08660c4015260030b8560a401528585608401528a856064015284604401521682602401526f3eece7db000000000000000000000000826010015260e4825281610120018a52828683519301915af161342b613e6e565b90156134535786818051810103126101ea5786015193838510611a9357506001955050505050565b8281519101fd5b50839294509261346a91936139e7565b928a5192631865c57d5f526101209384816004601c8b5afa156134bb578a1560051b0151938460801c903d10176101ea575f9586956fffffffffffffffffffffffffffffffff8e96169003906133bc565b8c513d5f823e3d90fd5b919291636c5f9cf981036135a15750906134e1918101906121dd565b6060849892959497939697029780890460601490151715611c0e57606086029580870460601490151715611c0e578560801c15158860801c15158260801c15156127108a111717176111c85761181a9760d3966001600160a01b039460405199885180996020018c8c015e8a60b301528960b101523089609d015288608801528760780152866068015216846058015281606f0184604401526020846024015263f83d08ba84600401528160b30184528360a80153820101604052613c0d565b829063ca9e5d0f81036136a9575060c091810103126101ea576135c3816115a3565b6135cf602083016115a3565b906040830135916060840135906001600160a01b0392838316948584036101ea57849260a061360060808a016115b7565b9801359682613688575b5050501660145283156360f3e02e0263dd93f59a1860601b5f5260205f6024601082855af11561054857601f3d11156101ea575f5193838510613651575050505050600190565b6004601c6020935f93639e9dfd6c0263d4b970461884525afa1561054857601f3d11156101ea575f518060a01c6101ea5716613a1b565b6127106136a19361369930856139e7565b020491613a3e565b5f808061360a565b63b8df6d4d14159050611c22578160a091810103126101ea576136cb816115a3565b602060409182840135906001600160a01b0394858316918284036101ea576137196136f8606084016115b7565b9161271087608086013595013561370f30846139e7565b02049485916142d5565b156139a55763ffa642255f52600491601c91865f8585885afa1561399b57603f3d11156101ea575f51978651986317be952e5f52875f87878a5afa1561391057601f998a3d11156101ea575f518060081c6101ea5760ff169060038210156139885763796da7af5f52895f89898c5afa1561397e578b3d11156101ea575f519163eab5d20e5f528a5f8a8a8d5afa15613974578c3d11156101ea57898b5f8b8b82519463ec2fd46d84525afa156134bb578d3d11156101ea578b8a8a8d8b5f51986ec097ce7bc90715b34b9f10000000000496600281145f14613943575050905f9291637c9b8e8984525afa156134bb578d3d11156101ea575f5194858403808a1161391a57505050868401938493670de0b6b3a7640000808097868297020402838082049106151501820204908403019303020402045b63c0ffa1785f52875f87878a5afa1561391057893d11156101ea575f5163ab44a7a35f52885f88888b5afa15612aed578a3d11156101ea57670de0b6b3a764000080915f510101910204948286106138e0575050506084925f9492859288519263e67ce7068452838901528289015260608281015282826080015201915af115611ac657503d1161181c575f80fd5b85935088885f8c93888b634a248d2a84525afa15611ac657503d11156101ea575f518060a01c6101ea5716613a1b565b88513d5f823e3d90fd5b91955093613939935091670de0b6b3a764000091890302048380615098565b8103910301613851565b925098959492505061396d969550670de0b6b3a76400009250158185180218958692020491615098565b9003613851565b8b513d5f823e3d90fd5b8a513d5f823e3d90fd5b602188634e487b7160e01b5f525260245ffd5b86513d5f823e3d90fd5b849550608492915f94959185925191638dae733383528288015281880152606081810152818160800152601c01915af115611ac65750601f3d1161181c575f80fd5b602460105f926020946014526f70a0823100000000000000000000000084525afa15610548573d601f10156101ea575f5190565b916054526034526014526f97a6f3b90000000000000000000000005f5260646010fd5b60105f60449260209582956014526034526fa9059cbb00000000000000000000000082525af115613a8e573d153d601f1060015f5114161715613a81575f603452565b6390b8ec185f526004601cfd5b60405162ffffff163d5f823e3d90fd5b5f80809381935af11561054857565b91908203918211611c0e57565b336d1ff3684f28c67538d4d072c2273403613ae157601319360190368211611c0e575f9190565b5f903690565b91908201809211611c0e57565b9091613b2060405192613b06846115c4565b60208401935f85526001600160a01b038196169052613e23565b809252565b93959498979290969882606081020460601483151715611c0e5781606081020460601482151715611c0e576060820260801c15156060840260801c15158560801c151517176111c85760405199878b9851978881519a8b93848284018101610115015260200190610132015e6020018c8901610132015e8a87018801610135016040528a610131015360406020820160f18c015e5160409060b18b015e88609d015f90526060028860880152606002876078015286606801528560580152018060d10184604401528360240160209052836004016348c8949190526101150183528260a80153565b73e0e0e08a6a4b9dc7bd67bcb7aade5cf48157d44490816bcd1e9517bb0cb8d0d5cde8935c1860601b15611587576bcdccd5c65a7d4860ce3abbe991825c80613cb457505f9182917fb45a3c0e0000000000000002e0e0e08a6a4b9dc7bd67bcb7aade5cf48157d444855d82602083519301915af190613c8b613e6e565b9115613cab575c80613c9b575090565b63d66fcc385f526020526024601cfd5b50602081519101fd5b63ab7646c45f526020526024601cfd5b73ba1333333333a1ba1108e8412f11850a5c319ba9806bcd1e9517bb0cb8d0d5cde8935c1860601b15611587576bcdccd5c65a7d4860ce3abbe992835c80613cb45750915f92917406ba1333333333a1ba1108e8412f11850a5c319ba9849360e01b17855d82602083519301915af190613c8b613e6e565b6e04444c5dc75cb358380d2e3de08a9090816bcd1e9517bb0cb8d0d5cde8935c1860601b15611587576bcdccd5c65a7d4860ce3abbe991825c80613cb457505f9182917f91dd73460000000000000005000000000004444c5dc75cb358380d2e3de08a90855d82602083519301915af190613c8b613e6e565b6001600160a01b0316806bcd1e9517bb0cb8d0d5cde8935c1860601b15611587576bcdccd5c65a7d4860ce3abbe992835c80613cb457509181740100000000000000000000000000000000000000005f9493859460e01b1717855d82602083519301915af190613c8b613e6e565b5190602082015191821961271091828210613e3d57505050565b6116c4939450906001600160a01b03613e699251169203916bcd1e9517bb0cb8d0d5cde8935c906139e7565b6141c3565b3d15613e98573d90613e7f82611657565b91613e8d6040519384611634565b82523d5f602084013e565b606090565b9291906001600160a01b03808316946e22d473030f116ddee9f6b43ac78ba386146d1ff3684f28c67538d4d072c22734871417611587575f9181169073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee8203613fd55750505061271090470204938051155f14613f59575050613f2f575f80809381935af1613f1e613e6e565b9015613f275750565b602081519101fd5b60046040517f01da1572000000000000000000000000000000000000000000000000000000008152fd5b90939260208301808411611c0e578251106107ee57835f9460208695850101525b602083519301915af1613f8b613e6e565b9015613f275751159081613fcb575b50613fa157565b60046040517f82d5d76a000000000000000000000000000000000000000000000000000000008152fd5b90503b155f613f9a565b9091949282979497155f14613ff457505050613f2f575f928392613f7a565b61400790613e69979496939730846139e7565b60208601808711611c0e578551106107ee5787845f988360208b9a8a01015203614034575b505050613f7a565b61403d926142d5565b5f808761402c565b1561404c57565b634e487b7160e01b5f52600160045260245ffd5b9190925f14614129575161411c5760208101516111c857604081015142116141085760845f926bffffffffffffffffffffffff19849351516bcd1e9517bb0cb8d0d5cde8935c60206001600160a01b0385511694015193604051948560800152846060015260601b83604c015260601b1681602c01526f15dacbea00000000000000000000000081600c0152601c01826d1ff3684f28c67538d4d072c227345af11561054857565b63cd21db4f5f52606001516020526024601cfd5b63c321526c5f526004601cfd5b905f9291839260406bcd1e9517bb0cb8d0d5cde8935c91818051956330f28b7a8752818151886020015e602001866060015e8460a0015e6001600160a01b03168260e0015261010082810152805190816020019083610120015e6101240190601c01826e22d473030f116ddee9f6b43ac78ba35af11561054857565b604051906141b2826115e0565b5f6040838281528260208201520152565b5f1982820982820291828083109203906127109485910991808214614218577fbc01a36e2eb1c432ca57a786c226809d495182a9930be0ded288ce703afb7e91945083831191030360fc1b910360041c170290565b5050500490565b90915f198383098383029081808210910393818514614291576116c49584910993039091909281805f0316809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b50500492915050565b6040519060a0820182811067ffffffffffffffff821117610d63576040525f6080838281528260208201528260408201528260608201520152565b906001600160a01b036040519384917fdd62ed3e0000000000000000000000000000000000000000000000000000000083523060048401528084166024840152826044602097889388165afa918215610548575f926143e0575b50811061433d575b50505050565b614398575b60105f80936044936014525f196034526f095ea7b300000000000000000000000082525af115613a8e573d153d601f1060015f511416171561438b575f6034525f808080614337565b633e3f8f735f526004601cfd5b806014525f6034526f095ea7b30000000000000000000000005f52825f6044601082865af115613a8e573d153d601f1060015f5114161761434257633e3f8f735f526004601cfd5b9091508481813d8311614408575b6143f88183611634565b810103126101ea5751905f61432f565b503d6143ee565b929390959497969197606082029180830460601490151715611c0e57606081029080820460601490151715611c0e578060801c15158260801c15158460801c15156127108c111717176111c85760d39660405199875180986020018c8b015e8a60b301528960b101523089609d0152886088015287607801528660680152856058015281606f018560440152602085602401526348c8949185600401528160b30185528460a80153830101604052565b9091928360a00151928460c0015190856060015192866080015194670de0b6b3a76400008861012001518202049003915f146145305701938285116145185761450c9560e001519461500f565b80150180820391110290565b9061452b95610100949394015194614c46565b61450c565b9601939192919082851161454d5761450c9561010001519461500f565b9061452b9560e0949394015194614c46565b90916001600160a01b039462ffffff169060405194826040526020525f805260601b600c521560051b6060035f20905f5260205260405260ff600b536055600b20906040521690565b90929194935f90604051938460c0015f8152610300386101e08801396104e086016040526145dc828a873560601c8461520c565b918287528287602001528660400199838b5287608001528660a001529495369436935f936020015173eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee145f1461465e57614634906001600160a01b03163014614045565b985161271061ffff8b3560501c16470204905260151901976016015b62ffffff89116107ee579796565b6001600160a01b031630810361469f5750612710601519823560501c9260160193019a519161ffff6146943085602001516139e7565b911602049052614650565b935094509750506146b1915015614045565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff48101908060550135600116908681016002198082013560e81c8092030191607501978289116101ea57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8891030197614650565b356001600160a01b03811681036101ea5790565b9060208201359182196127109182821061475357505050565b6116c4939450906001600160a01b0361476e613e6993614726565b169203916bcd1e9517bb0cb8d0d5cde8935c906139e7565b9490929395919573eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b038716145f146147c3575050505050506116c48133613a9e565b602095966040519788602401526f0c11dedd000000000000000000000000886010015287604401526044933003614880575b5050508091508352820101604052336bcd1e9517bb0cb8d0d5cde8935c1860601b15611587576bcdccd5c65a7d4860ce3abbe990815c80613cb457505f80917f599d0714000000000000000300000000000000000000000000000000000000003317845d60208151910182335af19061486c613e6e565b9115613cab575c80613c9b57506060015190565b829350604060c495810188606401378660a4015281868501528560e4013701805f80806147f5565b604001518051156148b65750565b8063fb772a8860249252601c01fd5b9190939293813592836001948060f81c91826148e8575b50505050508101920390565b9583949661492d9451806040018051156149cf575b5050818411614954575b50601491925001948360800151906001600160a01b038560a001519360581c169061520c565b908181526040015180911461494557808080806148dc565b8063784cb7b860249252601c01fd5b856020019384518051156149bf575b506002810361497e57505060149192855190525b8291614907565b60149350614990919250600314614045565b85820135926149b860159287608001516001600160a01b038960a001519260581c168b61520c565b9052614977565b6149c9908a615062565b5f614963565b898051850180825260051b01918252525f806148fd565b905f82126149f2575090565b80634c085bf160249252601c01fd5b60601b90821561049a57604051926060526040528073777777777777777777777777777777777777777760611b141502602c526f03a65ab6000000000000000000000000600c525f806064601c82335af115610492575f606052604052565b60601b90821561049a57604051926060526040528073777777777777777777777777777777777777777760611b141502602c526fae639329000000000000000000000000600c525f806064601c82335af115610492575f606052604052565b60601b90821561049a57604051926060526040528073777777777777777777777777777777777777777760611b141502602c526f0b0d9c09000000000000000000000000600c525f806064601c82335af115610492575f606052604052565b9591949392906001600160a01b03163003614b7f575050505080614b6f575b6034526014526f15afd4090000000000000000000000005f5260205f6044601082335af115613a8e575f515f60345290565b614b7a813384613a3e565b614b3d565b6100fc614b7a94614ba660405193614b96856115c4565b33855288602086015236906116c7565b933691611673565b93959290949194846014526fa58411940000000000000000000000005f525f806024601082335af115610548576001600160a01b03163003614c1557505050614bf992503390613a3e565b6311da60b45f5260205f6004601c82335af115610548575f5190565b614c41959492935090614ba66100fc9260405194614c32866115c4565b338652602086015236906116c7565b614bf9565b9093929491670de0b6b3a7640000938587029203020182028160011b938086860202808310928391825f0391031801908281830615151691040192614d0f84806fffffffffffffffffffffffffffffffff1060071b81811c67ffffffffffffffff1060061b1781811c63ffffffff1060051b1781811c61ffff1060041b1781811c60ff1060031b177ff8f9f9faf9fdfafbf9fdfcfdfafbfcfef9fafdfafcfcfbfefafafcfbffffffff6f8421084210842108cc6318c6db6d54be831593831c1c601f161a180190565b610100908103607f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81820191110290614dd46503782dace9d98902806fffffffffffffffffffffffffffffffff1060071b81811c67ffffffffffffffff1060061b1781811c63ffffffff1060051b1781811c61ffff1060041b1781811c60ff1060031b177ff8f9f9faf9fdfafbf9fdfcfdfafbfcfef9fafdfafcfcfbfefafafcfbffffffff6f8421084210842108cc6318c6db6d54be831593831c1c601f161a180190565b9003606d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9382019111028181811091180218928360011b925f14614ed85782614e329282614e2a938a800292030260021b61513a565b91848061513a565b01614ebd818070ffffffffffffffffffffffffffffffffff1060071b81811c68ffffffffffffffffff1060061b1781811c64ffffffffff1060051b1781811c62ffffff1060041b179060019160b56201000083831c0191841c1b0260121c80820401821c80820401821c80820401821c80820401821c80820401821c80820401821c80910401901c90565b908180021001901b01908082049106151501905b8111900390565b929082955091614f05614efd856150059795039788968a80029788910260021b61511e565b91848061511e565b0194614f91868070ffffffffffffffffffffffffffffffffff1060071b81811c68ffffffffffffffffff1060061b1781811c64ffffffffff1060051b1781811c62ffffff1060041b179060019160b56201000083831c0191841c1b0260121c80820401821c80820401821c80820401821c80820401821c80820401821c80820401821c80910401901c90565b80809260011b9704109003901b01805f19838609928086029509938281808795109103039091909281805f0316809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b9015150190614ed1565b919394929092670de0b6b3a7640000908181145f1461503957505003029080820491061515010190565b83838284615056998496999798020297030291020192030261515f565b8091019081105f031790565b90604001908151918261507457505050565b5f905280515f198101825260051b0181810361508e575050565b5180825260400152565b9190670de0b6b3a7640000928381860204029383039183828402049185040190818110155f146151145703826001945b8360021b02048180020191600183811c01835b84821061510357505060011b93156150fc57015b0290808204910615150190565b90036150ef565b909350838104840160011c906150db565b9003825f946150c8565b905f198183099102908180821091030382610100031b911c1790565b91905f198184099202908181610100039381808210910303841b911c17911b15150190565b90915f199182848209918482029181838086109503968588039209928183119486860197146151f5579183916151de9391909281805f0316809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b90151581019081106111c85701019081105f031790565b80935082915004910615150101019081105f031790565b919392610300916001600160a01b03169485090601916101208301926101408101908151908161016085821892015117026152585750811561524b5752565b63ad1991f55f526004601cfd5b639a62e8b45f52602052506040526044601cfd

Verified Source Code Partial Match

Compiler: v0.8.25+commit.b61c2a91 EVM: cancun Optimization: Yes (2000 runs)
MainnetTakerSubmittedFlat.sol 10573 lines
// SPDX-License-Identifier: MIT
pragma solidity =0.8.25 >=0.6.2 >=0.8.25 ^0.8.0 ^0.8.25;

// src/vendor/Clz.sol

// @author Modified from Solady by Vectorized https://github.com/Vectorized/solady/blob/701406e8126cfed931645727b274df303fbcd94d/src/utils/LibBit.sol#L30-L45 under the MIT license
library Clz {
    /// @dev Count leading zeros.
    /// Returns the number of zeros preceding the most significant one bit.
    /// If `x` is zero, returns 256.
    function clz(uint256 x) internal pure returns (uint256 r) {
        assembly ("memory-safe") {
            r := shl(7, lt(0xffffffffffffffffffffffffffffffff, x))
            r := or(r, shl(6, lt(0xffffffffffffffff, shr(r, x))))
            r := or(r, shl(5, lt(0xffffffff, shr(r, x))))
            r := or(r, shl(4, lt(0xffff, shr(r, x))))
            r := or(r, shl(3, lt(0xff, shr(r, x))))
            // We use a 5-bit deBruijn Sequence to convert `x`'s 8
            // most-significant bits into an index. We then index the lookup
            // table (bytewise) by the deBruijn symbol to obtain the bitwise
            // inverse of its logarithm.
            r :=
                add(
                    xor(
                        r,
                        byte(
                            and(0x1f, shr(shr(r, x), 0x8421084210842108cc6318c6db6d54be)),
                            0xf8f9f9faf9fdfafbf9fdfcfdfafbfcfef9fafdfafcfcfbfefafafcfbffffffff
                        )
                    ),
                    iszero(x)
                )
        }
    }

    function bitLength(uint256 x) internal pure returns (uint256) {
        unchecked {
            return 256 - clz(x);
        }
    }
}

// src/Context.sol

abstract contract AbstractContext {
    function _msgSender() internal view virtual returns (address);

    function _msgData() internal view virtual returns (bytes calldata);

    function _isForwarded() internal view virtual returns (bool);
}

abstract contract Context is AbstractContext {
    function _msgSender() internal view virtual override returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual override returns (bytes calldata) {
        return msg.data;
    }

    function _isForwarded() internal view virtual override returns (bool) {
        return false;
    }
}

// src/deployer/DeployerAddress.sol

address constant DEPLOYER = 0x00000000000004533Fe15556B1E086BB1A72cEae;

// src/utils/FastLogic.sol

library FastLogic {
    function or(bool a, bool b) internal pure returns (bool r) {
        assembly ("memory-safe") {
            r := or(a, b)
        }
    }

    function and(bool a, bool b) internal pure returns (bool r) {
        assembly ("memory-safe") {
            r := and(a, b)
        }
    }

    function andNot(bool a, bool b) internal pure returns (bool r) {
        assembly ("memory-safe") {
            r := gt(a, b)
        }
    }

    function toUint(bool b) internal pure returns (uint256 r) {
        assembly ("memory-safe") {
            r := b
        }
    }
}

// src/utils/FreeMemory.sol

abstract contract FreeMemory {
    modifier DANGEROUS_freeMemory() {
        uint256 freeMemPtr;
        assembly ("memory-safe") {
            freeMemPtr := mload(0x40)
        }
        _;
        assembly ("memory-safe") {
            mstore(0x40, freeMemPtr)
        }
    }
}

// src/allowanceholder/IAllowanceHolder.sol

IAllowanceHolder constant ALLOWANCE_HOLDER = IAllowanceHolder(0x0000000000001fF3684f28c67538d4D072C22734);

interface IAllowanceHolder {
    /// @notice Executes against `target` with the `data` payload. Prior to execution, token permits
    ///         are temporarily stored for the duration of the transaction. These permits can be
    ///         consumed by the `operator` during the execution
    /// @notice `operator` consumes the funds during its operations by calling back into
    ///         `AllowanceHolder` with `transferFrom`, consuming a token permit.
    /// @dev Neither `exec` nor `transferFrom` check that `token` contains code.
    /// @dev msg.sender is forwarded to target appended to the msg data (similar to ERC-2771)
    /// @param operator An address which is allowed to consume the token permits
    /// @param token The ERC20 token the caller has authorised to be consumed
    /// @param amount The quantity of `token` the caller has authorised to be consumed
    /// @param target A contract to execute operations with `data`
    /// @param data The data to forward to `target`
    /// @return result The returndata from calling `target` with `data`
    /// @notice If calling `target` with `data` reverts, the revert is propagated
    function exec(address operator, address token, uint256 amount, address payable target, bytes calldata data)
        external
        payable
        returns (bytes memory result);

    /// @notice The counterpart to `exec` which allows for the consumption of token permits later
    ///         during execution
    /// @dev *DOES NOT* check that `token` contains code. This function vacuously succeeds if
    ///      `token` is empty.
    /// @dev can only be called by the `operator` previously registered in `exec`
    /// @param token The ERC20 token to transfer
    /// @param owner The owner of tokens to transfer
    /// @param recipient The destination/beneficiary of the ERC20 `transferFrom`
    /// @param amount The quantity of `token` to transfer`
    /// @return true
    function transferFrom(address token, address owner, address recipient, uint256 amount) external returns (bool);
}

// lib/permit2/src/interfaces/IEIP712.sol

interface IEIP712 {
    function DOMAIN_SEPARATOR() external view returns (bytes32);
}

// lib/forge-std/src/interfaces/IERC20.sol

/// @dev Interface of the ERC20 standard as defined in the EIP.
/// @dev This includes the optional name, symbol, and decimals metadata.
interface IERC20 {
    /// @dev Emitted when `value` tokens are moved from one account (`from`) to another (`to`).
    event Transfer(address indexed from, address indexed to, uint256 value);

    /// @dev Emitted when the allowance of a `spender` for an `owner` is set, where `value`
    /// is the new allowance.
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /// @notice Returns the amount of tokens in existence.
    function totalSupply() external view returns (uint256);

    /// @notice Returns the amount of tokens owned by `account`.
    function balanceOf(address account) external view returns (uint256);

    /// @notice Moves `amount` tokens from the caller's account to `to`.
    function transfer(address to, uint256 amount) external returns (bool);

    /// @notice Returns the remaining number of tokens that `spender` is allowed
    /// to spend on behalf of `owner`
    function allowance(address owner, address spender) external view returns (uint256);

    /// @notice Sets `amount` as the allowance of `spender` over the caller's tokens.
    /// @dev Be aware of front-running risks: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
    function approve(address spender, uint256 amount) external returns (bool);

    /// @notice Moves `amount` tokens from `from` to `to` using the allowance mechanism.
    /// `amount` is then deducted from the caller's allowance.
    function transferFrom(address from, address to, uint256 amount) external returns (bool);

    /// @notice Returns the name of the token.
    function name() external view returns (string memory);

    /// @notice Returns the symbol of the token.
    function symbol() external view returns (string memory);

    /// @notice Returns the decimals places of the token.
    function decimals() external view returns (uint8);
}

// src/IERC721Owner.sol

interface IERC721Owner {
    function ownerOf(uint256) external view returns (address);
}

// src/core/univ3forks/PancakeSwapV3.sol

address constant pancakeSwapV3Factory = 0x41ff9AA7e16B8B1a8a8dc4f0eFacd93D02d071c9;
bytes32 constant pancakeSwapV3InitHash = 0x6ce8eb472fa82df5469c6ab6d485f17c3ad13c8cd7af59b3d4a8026c5ce0f7e2;
uint8 constant pancakeSwapV3ForkId = 1;

interface IPancakeSwapV3Callback {
    function pancakeV3SwapCallback(int256 amount0Delta, int256 amount1Delta, bytes calldata data) external;
}

// src/utils/Panic.sol

library Panic {
    function panic(uint256 code) internal pure {
        assembly ("memory-safe") {
            mstore(0x00, 0x4e487b71) // selector for `Panic(uint256)`
            mstore(0x20, code)
            revert(0x1c, 0x24)
        }
    }

    // https://docs.soliditylang.org/en/latest/control-structures.html#panic-via-assert-and-error-via-require
    uint8 internal constant GENERIC = 0x00;
    uint8 internal constant ASSERT_FAIL = 0x01;
    uint8 internal constant ARITHMETIC_OVERFLOW = 0x11;
    uint8 internal constant DIVISION_BY_ZERO = 0x12;
    uint8 internal constant ENUM_CAST = 0x21;
    uint8 internal constant CORRUPT_STORAGE_ARRAY = 0x22;
    uint8 internal constant POP_EMPTY_ARRAY = 0x31;
    uint8 internal constant ARRAY_OUT_OF_BOUNDS = 0x32;
    uint8 internal constant OUT_OF_MEMORY = 0x41;
    uint8 internal constant ZERO_FUNCTION_POINTER = 0x51;
}

// src/utils/Revert.sol

library Revert {
    function _revert(bytes memory reason) internal pure {
        assembly ("memory-safe") {
            revert(add(reason, 0x20), mload(reason))
        }
    }

    function maybeRevert(bool success, bytes memory reason) internal pure {
        if (!success) {
            _revert(reason);
        }
    }
}

// src/core/univ3forks/SolidlyV3.sol

address constant solidlyV3Factory = 0x70Fe4a44EA505cFa3A57b95cF2862D4fd5F0f687;
address constant solidlyV3SonicFactory = 0x777fAca731b17E8847eBF175c94DbE9d81A8f630;
bytes32 constant solidlyV3InitHash = 0xe9b68c5f77858eecac2e651646e208175e9b1359d68d0e14fc69f8c54e5010bf;
uint8 constant solidlyV3ForkId = 3;

interface ISolidlyV3Callback {
    function solidlyV3SwapCallback(int256 amount0Delta, int256 amount1Delta, bytes calldata data) external;
}

// src/vendor/Sqrt.sol

// @author Modified from Solady by Vectorized https://github.com/Vectorized/solady/blob/701406e8126cfed931645727b274df303fbcd94d/src/utils/FixedPointMathLib.sol#L774-L826 under the MIT license.
library Sqrt {
    /// @dev Returns the square root of `x`, rounded down.
    function _sqrt(uint256 x) private pure returns (uint256 z) {
        assembly ("memory-safe") {
            // `floor(sqrt(2**15)) = 181`. `sqrt(2**15) - 181 = 2.84`.
            z := 181 // The "correct" value is 1, but this saves a multiplication later.

            // This segment is to get a reasonable initial estimate for the Babylonian method. With a bad
            // start, the correct # of bits increases ~linearly each iteration instead of ~quadratically.

            // Let `y = x / 2**r`. We check `y >= 2**(k + 8)`
            // but shift right by `k` bits to ensure that if `x >= 256`, then `y >= 256`.
            let r := shl(7, lt(0xffffffffffffffffffffffffffffffffff, x))
            r := or(r, shl(6, lt(0xffffffffffffffffff, shr(r, x))))
            r := or(r, shl(5, lt(0xffffffffff, shr(r, x))))
            r := or(r, shl(4, lt(0xffffff, shr(r, x))))
            z := shl(shr(1, r), z)

            // Goal was to get `z*z*y` within a small factor of `x`. More iterations could
            // get y in a tighter range. Currently, we will have y in `[256, 256*(2**16))`.
            // We ensured `y >= 256` so that the relative difference between `y` and `y+1` is small.
            // That's not possible if `x < 256` but we can just verify those cases exhaustively.

            // Now, `z*z*y <= x < z*z*(y+1)`, and `y <= 2**(16+8)`, and either `y >= 256`, or `x < 256`.
            // Correctness can be checked exhaustively for `x < 256`, so we assume `y >= 256`.
            // Then `z*sqrt(y)` is within `sqrt(257)/sqrt(256)` of `sqrt(x)`, or about 20bps.

            // For `s` in the range `[1/256, 256]`, the estimate `f(s) = (181/1024) * (s+1)`
            // is in the range `(1/2.84 * sqrt(s), 2.84 * sqrt(s))`,
            // with largest error when `s = 1` and when `s = 256` or `1/256`.

            // Since `y` is in `[256, 256*(2**16))`, let `a = y/65536`, so that `a` is in `[1/256, 256)`.
            // Then we can estimate `sqrt(y)` using
            // `sqrt(65536) * 181/1024 * (a + 1) = 181/4 * (y + 65536)/65536 = 181 * (y + 65536)/2**18`.

            // There is no overflow risk here since `y < 2**136` after the first branch above.
            z := shr(18, mul(z, add(shr(r, x), 65536))) // A `mul()` is saved from starting `z` at 181.

            // Given the worst case multiplicative error of 2.84 above, 7 iterations should be enough.
            z := shr(1, add(z, div(x, z)))
            z := shr(1, add(z, div(x, z)))
            z := shr(1, add(z, div(x, z)))
            z := shr(1, add(z, div(x, z)))
            z := shr(1, add(z, div(x, z)))
            z := shr(1, add(z, div(x, z)))
            z := shr(1, add(z, div(x, z)))
        }
    }

    function sqrt(uint256 x) internal pure returns (uint256 z) {
        z = _sqrt(x);
        assembly ("memory-safe") {
            // If `x+1` is a perfect square, the Babylonian method cycles between
            // `floor(sqrt(x))` and `ceil(sqrt(x))`. This statement ensures we return floor.
            // See: https://en.wikipedia.org/wiki/Integer_square_root#Using_only_integer_division
            z := sub(z, lt(div(x, z), z))
        }
    }

    function sqrtUp(uint256 x) internal pure returns (uint256 z) {
        z = _sqrt(x);
        assembly ("memory-safe") {
            z := add(lt(mul(z, z), x), z)
        }
    }
}

// src/core/univ3forks/SushiswapV3.sol

address constant sushiswapV3MainnetFactory = 0xbACEB8eC6b9355Dfc0269C18bac9d6E2Bdc29C4F;
address constant sushiswapV3Factory = 0xc35DADB65012eC5796536bD9864eD8773aBc74C4; // Base, Linea
address constant sushiswapV3ArbitrumFactory = 0x1af415a1EbA07a4986a52B6f2e7dE7003D82231e;
//address constant sushiswapV3AvalancheFactory = 0x3e603C14aF37EBdaD31709C4f848Fc6aD5BEc715;
//address constant sushiswapV3BlastFactory = 0x7680D4B43f3d1d54d6cfEeB2169463bFa7a6cf0d;
//address constant sushiswapV3BnbFactory = 0x126555dd55a39328F69400d6aE4F782Bd4C34ABb;
address constant sushiswapV3OptimismFactory = 0x9c6522117e2ed1fE5bdb72bb0eD5E3f2bdE7DBe0;
address constant sushiswapV3PolygonFactory = 0x917933899c6a5F8E37F31E19f92CdBFF7e8FF0e2;
address constant sushiswapV3ScrollFactory = 0x46B3fDF7b5CDe91Ac049936bF0bDb12c5d22202e;
address constant sushiswapV3GnosisFactory = 0xf78031CBCA409F2FB6876BDFDBc1b2df24cF9bEf;
//bytes32 constant sushiswapV3BlastInitHash = 0x8e13daee7f5a62e37e71bf852bcd44e7d16b90617ed2b17c24c2ee62411c5bae;
uint8 constant sushiswapV3ForkId = 2;

// src/core/univ3forks/UniswapV3.sol

address constant uniswapV3MainnetFactory = 0x1F98431c8aD98523631AE4a59f267346ea31F984;
address constant uniswapV3SepoliaFactory = 0x0227628f3F023bb0B980b67D528571c95c6DaC1c;
address constant uniswapV3BaseFactory = 0x33128a8fC17869897dcE68Ed026d694621f6FDfD;
address constant uniswapV3BnbFactory = 0xdB1d10011AD0Ff90774D0C6Bb92e5C5c8b4461F7;
address constant uniswapV3AvalancheFactory = 0x740b1c1de25031C31FF4fC9A62f554A55cdC1baD;
address constant uniswapV3BlastFactory = 0x792edAdE80af5fC680d96a2eD80A44247D2Cf6Fd;
address constant uniswapV3ScrollFactory = 0x70C62C8b8e801124A4Aa81ce07b637A3e83cb919;
address constant uniswapV3LineaFactory = 0x31FAfd4889FA1269F7a13A66eE0fB458f27D72A9;
address constant uniswapV3MantleFactory = 0x0d922Fb1Bc191F64970ac40376643808b4B74Df9;
address constant uniswapV3TaikoFactory = 0x75FC67473A91335B5b8F8821277262a13B38c9b3;
address constant uniswapV3WorldChainFactory = 0x7a5028BDa40e7B173C278C5342087826455ea25a;
address constant uniswapV3GnosisFactory = 0xe32F7dD7e3f098D518ff19A22d5f028e076489B1;
address constant uniswapV3SonicFactory = 0xcb2436774C3e191c85056d248EF4260ce5f27A9D;
address constant uniswapV3InkFactory = 0x640887A9ba3A9C53Ed27D0F7e8246A4F933f3424;
address constant uniswapV3MonadTestnetFactory = 0x961235a9020B05C44DF1026D956D1F4D78014276;
address constant uniswapV3UnichainFactory = 0x1F98400000000000000000000000000000000003; // https://github.com/Uniswap/contracts/blob/main/deployments/130.md#fri-nov-08-2024
address constant uniswapV3PlasmaFactory = 0xcb2436774C3e191c85056d248EF4260ce5f27A9D;
address constant uniswapV3MonadFactory = 0x204FAca1764B154221e35c0d20aBb3c525710498;
address constant uniswapV3AbstractSepoliaFactory = 0x2E17FF9b877661bDFEF8879a4B31665157a960F0;
address constant uniswapV3AbstractFactory = 0xA1160e73B63F322ae88cC2d8E700833e71D0b2a1;

bytes32 constant uniswapV3InitHash = 0xe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b54;
// This isn't a "hash" inasmuch as it's a versioned discriminator
// ref: https://web.archive.org/web/20251108134721/https://matter-labs.github.io/zksync-era/core/latest/guides/advanced/12_alternative_vm_intro.html#bytecode-hashes
bytes32 constant uniswapV3InitHashEraVm = 0x010013f177ea1fcbc4520f9a3ca7cd2d1d77959e05aa66484027cb38e712aeed;
uint8 constant uniswapV3ForkId = 0;

interface IUniswapV3Callback {
    function uniswapV3SwapCallback(int256 amount0Delta, int256 amount1Delta, bytes calldata data) external;
}

// lib/forge-std/src/interfaces/IERC4626.sol

/// @dev Interface of the ERC4626 "Tokenized Vault Standard", as defined in
/// https://eips.ethereum.org/EIPS/eip-4626
interface IERC4626 is IERC20 {
    event Deposit(address indexed sender, address indexed owner, uint256 assets, uint256 shares);

    event Withdraw(
        address indexed sender, address indexed receiver, address indexed owner, uint256 assets, uint256 shares
    );

    /// @notice Returns the address of the underlying token used for the Vault for accounting, depositing, and withdrawing.
    /// @dev
    /// - MUST be an ERC-20 token contract.
    /// - MUST NOT revert.
    function asset() external view returns (address assetTokenAddress);

    /// @notice Returns the total amount of the underlying asset that is “managed” by Vault.
    /// @dev
    /// - SHOULD include any compounding that occurs from yield.
    /// - MUST be inclusive of any fees that are charged against assets in the Vault.
    /// - MUST NOT revert.
    function totalAssets() external view returns (uint256 totalManagedAssets);

    /// @notice Returns the amount of shares that the Vault would exchange for the amount of assets provided, in an ideal
    /// scenario where all the conditions are met.
    /// @dev
    /// - MUST NOT be inclusive of any fees that are charged against assets in the Vault.
    /// - MUST NOT show any variations depending on the caller.
    /// - MUST NOT reflect slippage or other on-chain conditions, when performing the actual exchange.
    /// - MUST NOT revert.
    ///
    /// NOTE: This calculation MAY NOT reflect the “per-user” price-per-share, and instead should reflect the
    /// “average-user’s” price-per-share, meaning what the average user should expect to see when exchanging to and
    /// from.
    function convertToShares(uint256 assets) external view returns (uint256 shares);

    /// @notice Returns the amount of assets that the Vault would exchange for the amount of shares provided, in an ideal
    /// scenario where all the conditions are met.
    /// @dev
    /// - MUST NOT be inclusive of any fees that are charged against assets in the Vault.
    /// - MUST NOT show any variations depending on the caller.
    /// - MUST NOT reflect slippage or other on-chain conditions, when performing the actual exchange.
    /// - MUST NOT revert.
    ///
    /// NOTE: This calculation MAY NOT reflect the “per-user” price-per-share, and instead should reflect the
    /// “average-user’s” price-per-share, meaning what the average user should expect to see when exchanging to and
    /// from.
    function convertToAssets(uint256 shares) external view returns (uint256 assets);

    /// @notice Returns the maximum amount of the underlying asset that can be deposited into the Vault for the receiver,
    /// through a deposit call.
    /// @dev
    /// - MUST return a limited value if receiver is subject to some deposit limit.
    /// - MUST return 2 ** 256 - 1 if there is no limit on the maximum amount of assets that may be deposited.
    /// - MUST NOT revert.
    function maxDeposit(address receiver) external view returns (uint256 maxAssets);

    /// @notice Allows an on-chain or off-chain user to simulate the effects of their deposit at the current block, given
    /// current on-chain conditions.
    /// @dev
    /// - MUST return as close to and no more than the exact amount of Vault shares that would be minted in a deposit
    ///   call in the same transaction. I.e. deposit should return the same or more shares as previewDeposit if called
    ///   in the same transaction.
    /// - MUST NOT account for deposit limits like those returned from maxDeposit and should always act as though the
    ///   deposit would be accepted, regardless if the user has enough tokens approved, etc.
    /// - MUST be inclusive of deposit fees. Integrators should be aware of the existence of deposit fees.
    /// - MUST NOT revert.
    ///
    /// NOTE: any unfavorable discrepancy between convertToShares and previewDeposit SHOULD be considered slippage in
    /// share price or some other type of condition, meaning the depositor will lose assets by depositing.
    function previewDeposit(uint256 assets) external view returns (uint256 shares);

    /// @notice Mints shares Vault shares to receiver by depositing exactly amount of underlying tokens.
    /// @dev
    /// - MUST emit the Deposit event.
    /// - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the
    ///   deposit execution, and are accounted for during deposit.
    /// - MUST revert if all of assets cannot be deposited (due to deposit limit being reached, slippage, the user not
    ///   approving enough underlying tokens to the Vault contract, etc).
    ///
    /// NOTE: most implementations will require pre-approval of the Vault with the Vault’s underlying asset token.
    function deposit(uint256 assets, address receiver) external returns (uint256 shares);

    /// @notice Returns the maximum amount of the Vault shares that can be minted for the receiver, through a mint call.
    /// @dev
    /// - MUST return a limited value if receiver is subject to some mint limit.
    /// - MUST return 2 ** 256 - 1 if there is no limit on the maximum amount of shares that may be minted.
    /// - MUST NOT revert.
    function maxMint(address receiver) external view returns (uint256 maxShares);

    /// @notice Allows an on-chain or off-chain user to simulate the effects of their mint at the current block, given
    /// current on-chain conditions.
    /// @dev
    /// - MUST return as close to and no fewer than the exact amount of assets that would be deposited in a mint call
    ///   in the same transaction. I.e. mint should return the same or fewer assets as previewMint if called in the
    ///   same transaction.
    /// - MUST NOT account for mint limits like those returned from maxMint and should always act as though the mint
    ///   would be accepted, regardless if the user has enough tokens approved, etc.
    /// - MUST be inclusive of deposit fees. Integrators should be aware of the existence of deposit fees.
    /// - MUST NOT revert.
    ///
    /// NOTE: any unfavorable discrepancy between convertToAssets and previewMint SHOULD be considered slippage in
    /// share price or some other type of condition, meaning the depositor will lose assets by minting.
    function previewMint(uint256 shares) external view returns (uint256 assets);

    /// @notice Mints exactly shares Vault shares to receiver by depositing amount of underlying tokens.
    /// @dev
    /// - MUST emit the Deposit event.
    /// - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the mint
    ///   execution, and are accounted for during mint.
    /// - MUST revert if all of shares cannot be minted (due to deposit limit being reached, slippage, the user not
    ///   approving enough underlying tokens to the Vault contract, etc).
    ///
    /// NOTE: most implementations will require pre-approval of the Vault with the Vault’s underlying asset token.
    function mint(uint256 shares, address receiver) external returns (uint256 assets);

    /// @notice Returns the maximum amount of the underlying asset that can be withdrawn from the owner balance in the
    /// Vault, through a withdrawal call.
    /// @dev
    /// - MUST return a limited value if owner is subject to some withdrawal limit or timelock.
    /// - MUST NOT revert.
    function maxWithdraw(address owner) external view returns (uint256 maxAssets);

    /// @notice Allows an on-chain or off-chain user to simulate the effects of their withdrawal at the current block,
    /// given current on-chain conditions.
    /// @dev
    /// - MUST return as close to and no fewer than the exact amount of Vault shares that would be burned in a withdraw
    ///   call in the same transaction. I.e. withdraw should return the same or fewer shares as previewWithdraw if
    ///   called
    ///   in the same transaction.
    /// - MUST NOT account for withdrawal limits like those returned from maxWithdraw and should always act as though
    ///   the withdrawal would be accepted, regardless if the user has enough shares, etc.
    /// - MUST be inclusive of withdrawal fees. Integrators should be aware of the existence of withdrawal fees.
    /// - MUST NOT revert.
    ///
    /// NOTE: any unfavorable discrepancy between convertToShares and previewWithdraw SHOULD be considered slippage in
    /// share price or some other type of condition, meaning the depositor will lose assets by depositing.
    function previewWithdraw(uint256 assets) external view returns (uint256 shares);

    /// @notice Burns shares from owner and sends exactly assets of underlying tokens to receiver.
    /// @dev
    /// - MUST emit the Withdraw event.
    /// - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the
    ///   withdraw execution, and are accounted for during withdrawal.
    /// - MUST revert if all of assets cannot be withdrawn (due to withdrawal limit being reached, slippage, the owner
    ///   not having enough shares, etc).
    ///
    /// Note that some implementations will require pre-requesting to the Vault before a withdrawal may be performed.
    /// Those methods should be performed separately.
    function withdraw(uint256 assets, address receiver, address owner) external returns (uint256 shares);

    /// @notice Returns the maximum amount of Vault shares that can be redeemed from the owner balance in the Vault,
    /// through a redeem call.
    /// @dev
    /// - MUST return a limited value if owner is subject to some withdrawal limit or timelock.
    /// - MUST return balanceOf(owner) if owner is not subject to any withdrawal limit or timelock.
    /// - MUST NOT revert.
    function maxRedeem(address owner) external view returns (uint256 maxShares);

    /// @notice Allows an on-chain or off-chain user to simulate the effects of their redeemption at the current block,
    /// given current on-chain conditions.
    /// @dev
    /// - MUST return as close to and no more than the exact amount of assets that would be withdrawn in a redeem call
    ///   in the same transaction. I.e. redeem should return the same or more assets as previewRedeem if called in the
    ///   same transaction.
    /// - MUST NOT account for redemption limits like those returned from maxRedeem and should always act as though the
    ///   redemption would be accepted, regardless if the user has enough shares, etc.
    /// - MUST be inclusive of withdrawal fees. Integrators should be aware of the existence of withdrawal fees.
    /// - MUST NOT revert.
    ///
    /// NOTE: any unfavorable discrepancy between convertToAssets and previewRedeem SHOULD be considered slippage in
    /// share price or some other type of condition, meaning the depositor will lose assets by redeeming.
    function previewRedeem(uint256 shares) external view returns (uint256 assets);

    /// @notice Burns exactly shares from owner and sends assets of underlying tokens to receiver.
    /// @dev
    /// - MUST emit the Withdraw event.
    /// - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the
    ///   redeem execution, and are accounted for during redeem.
    /// - MUST revert if all of shares cannot be redeemed (due to withdrawal limit being reached, slippage, the owner
    ///   not having enough shares, etc).
    ///
    /// NOTE: some implementations will require pre-requesting to the Vault before a withdrawal may be performed.
    /// Those methods should be performed separately.
    function redeem(uint256 shares, address receiver, address owner) external returns (uint256 assets);
}

// src/interfaces/ISettlerBase.sol

interface ISettlerBase {
    struct AllowedSlippage {
        address payable recipient;
        IERC20 buyToken;
        uint256 minAmountOut;
    }
}

// lib/permit2/src/interfaces/ISignatureTransfer.sol

/// @title SignatureTransfer
/// @notice Handles ERC20 token transfers through signature based actions
/// @dev Requires user's token approval on the Permit2 contract
interface ISignatureTransfer is IEIP712 {
    /// @notice Thrown when the requested amount for a transfer is larger than the permissioned amount
    /// @param maxAmount The maximum amount a spender can request to transfer
    error InvalidAmount(uint256 maxAmount);

    /// @notice Thrown when the number of tokens permissioned to a spender does not match the number of tokens being transferred
    /// @dev If the spender does not need to transfer the number of tokens permitted, the spender can request amount 0 to be transferred
    error LengthMismatch();

    /// @notice Emits an event when the owner successfully invalidates an unordered nonce.
    event UnorderedNonceInvalidation(address indexed owner, uint256 word, uint256 mask);

    /// @notice The token and amount details for a transfer signed in the permit transfer signature
    struct TokenPermissions {
        // ERC20 token address
        address token;
        // the maximum amount that can be spent
        uint256 amount;
    }

    /// @notice The signed permit message for a single token transfer
    struct PermitTransferFrom {
        TokenPermissions permitted;
        // a unique value for every token owner's signature to prevent signature replays
        uint256 nonce;
        // deadline on the permit signature
        uint256 deadline;
    }

    /// @notice Specifies the recipient address and amount for batched transfers.
    /// @dev Recipients and amounts correspond to the index of the signed token permissions array.
    /// @dev Reverts if the requested amount is greater than the permitted signed amount.
    struct SignatureTransferDetails {
        // recipient address
        address to;
        // spender requested amount
        uint256 requestedAmount;
    }

    /// @notice Used to reconstruct the signed permit message for multiple token transfers
    /// @dev Do not need to pass in spender address as it is required that it is msg.sender
    /// @dev Note that a user still signs over a spender address
    struct PermitBatchTransferFrom {
        // the tokens and corresponding amounts permitted for a transfer
        TokenPermissions[] permitted;
        // a unique value for every token owner's signature to prevent signature replays
        uint256 nonce;
        // deadline on the permit signature
        uint256 deadline;
    }

    /// @notice A map from token owner address and a caller specified word index to a bitmap. Used to set bits in the bitmap to prevent against signature replay protection
    /// @dev Uses unordered nonces so that permit messages do not need to be spent in a certain order
    /// @dev The mapping is indexed first by the token owner, then by an index specified in the nonce
    /// @dev It returns a uint256 bitmap
    /// @dev The index, or wordPosition is capped at type(uint248).max
    function nonceBitmap(address, uint256) external view returns (uint256);

    /// @notice Transfers a token using a signed permit message
    /// @dev Reverts if the requested amount is greater than the permitted signed amount
    /// @param permit The permit data signed over by the owner
    /// @param owner The owner of the tokens to transfer
    /// @param transferDetails The spender's requested transfer details for the permitted token
    /// @param signature The signature to verify
    function permitTransferFrom(
        PermitTransferFrom memory permit,
        SignatureTransferDetails calldata transferDetails,
        address owner,
        bytes calldata signature
    ) external;

    /// @notice Transfers a token using a signed permit message
    /// @notice Includes extra data provided by the caller to verify signature over
    /// @dev The witness type string must follow EIP712 ordering of nested structs and must include the TokenPermissions type definition
    /// @dev Reverts if the requested amount is greater than the permitted signed amount
    /// @param permit The permit data signed over by the owner
    /// @param owner The owner of the tokens to transfer
    /// @param transferDetails The spender's requested transfer details for the permitted token
    /// @param witness Extra data to include when checking the user signature
    /// @param witnessTypeString The EIP-712 type definition for remaining string stub of the typehash
    /// @param signature The signature to verify
    function permitWitnessTransferFrom(
        PermitTransferFrom memory permit,
        SignatureTransferDetails calldata transferDetails,
        address owner,
        bytes32 witness,
        string calldata witnessTypeString,
        bytes calldata signature
    ) external;

    /// @notice Transfers multiple tokens using a signed permit message
    /// @param permit The permit data signed over by the owner
    /// @param owner The owner of the tokens to transfer
    /// @param transferDetails Specifies the recipient and requested amount for the token transfer
    /// @param signature The signature to verify
    function permitTransferFrom(
        PermitBatchTransferFrom memory permit,
        SignatureTransferDetails[] calldata transferDetails,
        address owner,
        bytes calldata signature
    ) external;

    /// @notice Transfers multiple tokens using a signed permit message
    /// @dev The witness type string must follow EIP712 ordering of nested structs and must include the TokenPermissions type definition
    /// @notice Includes extra data provided by the caller to verify signature over
    /// @param permit The permit data signed over by the owner
    /// @param owner The owner of the tokens to transfer
    /// @param transferDetails Specifies the recipient and requested amount for the token transfer
    /// @param witness Extra data to include when checking the user signature
    /// @param witnessTypeString The EIP-712 type definition for remaining string stub of the typehash
    /// @param signature The signature to verify
    function permitWitnessTransferFrom(
        PermitBatchTransferFrom memory permit,
        SignatureTransferDetails[] calldata transferDetails,
        address owner,
        bytes32 witness,
        string calldata witnessTypeString,
        bytes calldata signature
    ) external;

    /// @notice Invalidates the bits specified in mask for the bitmap at the word position
    /// @dev The wordPos is maxed at type(uint248).max
    /// @param wordPos A number to index the nonceBitmap at
    /// @param mask A bitmap masked against msg.sender's current bitmap at the word position
    function invalidateUnorderedNonces(uint256 wordPos, uint256 mask) external;
}

// src/vendor/SafeTransferLib.sol

/// @notice Safe ETH and ERC20 transfer library that gracefully handles missing return values.
/// @author Modified from Solady (https://github.com/vectorized/solady/blob/main/src/utils/SafeTransferLib.sol)
/// @author Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/SafeTransferLib.sol)
/// @dev Note that none of the functions in this library check that a token has code at all! That responsibility is delegated to the caller.
library SafeTransferLib {
    /*//////////////////////////////////////////////////////////////
                             ETH OPERATIONS
    //////////////////////////////////////////////////////////////*/

    function safeTransferETH(address payable to, uint256 amount) internal {
        assembly ("memory-safe") {
            // Transfer the ETH and revert if it fails.
            if iszero(call(gas(), to, amount, 0x00, 0x00, 0x00, 0x00)) {
                let ptr := mload(0x40)
                returndatacopy(ptr, 0x00, returndatasize())
                revert(ptr, returndatasize())
            }
        }
    }

    /*//////////////////////////////////////////////////////////////
                            ERC20 OPERATIONS
    //////////////////////////////////////////////////////////////*/

    function fastBalanceOf(IERC20 token, address acct) internal view returns (uint256 r) {
        assembly ("memory-safe") {
            mstore(0x14, acct) // Store the `acct` argument.
            mstore(0x00, 0x70a08231000000000000000000000000) // Selector for `balanceOf(address)`, with `acct`'s padding.

            // Call and check for revert. Storing the selector with padding in
            // memory at 0 results in a start of calldata at offset 16. Calldata
            // is 36 bytes long (4 bytes selector, 32 bytes argument)
            if iszero(staticcall(gas(), token, 0x10, 0x24, 0x00, 0x20)) {
                let ptr := mload(0x40)
                returndatacopy(ptr, 0x00, returndatasize())
                revert(ptr, returndatasize())
            }
            // Check for short returndata and missing code
            if iszero(lt(0x1f, returndatasize())) { revert(0x00, 0x00) }

            r := mload(0x00)
        }
    }

    function safeTransferFrom(IERC20 token, address from, address to, uint256 amount) internal {
        assembly ("memory-safe") {
            let ptr := mload(0x40) // Cache the free memory pointer.

            mstore(0x60, amount) // Store the `amount` argument.
            mstore(0x40, to) // Store the `to` argument.
            mstore(0x2c, shl(0x60, from)) // Store the `from` argument. (Clears `to`'s padding.)
            mstore(0x0c, 0x23b872dd000000000000000000000000) // Selector for `transferFrom(address,address,uint256)`, with `from`'s padding.

            // Calldata starts at offset 28 and is 100 bytes long (3 * 32 + 4).
            // If there is returndata (optional) we copy the first 32 bytes into the first slot of memory.
            if iszero(call(gas(), token, 0x00, 0x1c, 0x64, 0x00, 0x20)) {
                returndatacopy(ptr, 0x00, returndatasize())
                revert(ptr, returndatasize())
            }
            // We check that the call either returned exactly 1 [true] (can't just be non-zero
            // data), or had no return data.
            if iszero(or(and(eq(mload(0x00), 0x01), lt(0x1f, returndatasize())), iszero(returndatasize()))) {
                mstore(0x00, 0x7939f424) // Selector for `TransferFromFailed()`
                revert(0x1c, 0x04)
            }

            mstore(0x60, 0x00) // Restore the zero slot to zero.
            mstore(0x40, ptr) // Restore the free memory pointer.
        }
    }

    function safeTransfer(IERC20 token, address to, uint256 amount) internal {
        assembly ("memory-safe") {
            mstore(0x14, to) // Store the `to` argument.
            mstore(0x34, amount) // Store the `amount` argument.
            // Storing `amount` clobbers the upper bits of the free memory pointer, but those bits
            // can never be set without running into an OOG, so it's safe. We'll restore them to
            // zero at the end.
            mstore(0x00, 0xa9059cbb000000000000000000000000) // Selector for `transfer(address,uint256)`, with `to`'s padding.

            // Calldata starts at offset 16 and is 68 bytes long (2 * 32 + 4).
            // If there is returndata (optional) we copy the first 32 bytes into the first slot of memory.
            if iszero(call(gas(), token, 0x00, 0x10, 0x44, 0x00, 0x20)) {
                let ptr := and(0xffffff, mload(0x40))
                returndatacopy(ptr, 0x00, returndatasize())
                revert(ptr, returndatasize())
            }
            // We check that the call either returned exactly 1 [true] (can't just be non-zero
            // data), or had no return data.
            if iszero(or(and(eq(mload(0x00), 0x01), lt(0x1f, returndatasize())), iszero(returndatasize()))) {
                mstore(0x00, 0x90b8ec18) // Selector for `TransferFailed()`
                revert(0x1c, 0x04)
            }

            mstore(0x34, 0x00) // Restore the part of the free memory pointer that was overwritten.
        }
    }

    function safeApprove(IERC20 token, address to, uint256 amount) internal {
        assembly ("memory-safe") {
            mstore(0x14, to) // Store the `to` argument.
            mstore(0x34, amount) // Store the `amount` argument.
            // Storing `amount` clobbers the upper bits of the free memory pointer, but those bits
            // can never be set without running into an OOG, so it's safe. We'll restore them to
            // zero at the end.
            mstore(0x00, 0x095ea7b3000000000000000000000000) // Selector for `approve(address,uint256)`, with `to`'s padding.

            // Calldata starts at offset 16 and is 68 bytes long (2 * 32 + 4).
            // If there is returndata (optional) we copy the first 32 bytes into the first slot of memory.
            if iszero(call(gas(), token, 0x00, 0x10, 0x44, 0x00, 0x20)) {
                let ptr := and(0xffffff, mload(0x40))
                returndatacopy(ptr, 0x00, returndatasize())
                revert(ptr, returndatasize())
            }
            // We check that the call either returned exactly 1 [true] (can't just be non-zero
            // data), or had no return data.
            if iszero(or(and(eq(mload(0x00), 0x01), lt(0x1f, returndatasize())), iszero(returndatasize()))) {
                mstore(0x00, 0x3e3f8f73) // Selector for `ApproveFailed()`
                revert(0x1c, 0x04)
            }

            mstore(0x34, 0x00) // Restore the part of the free memory pointer that was overwritten.
        }
    }

    function safeApproveIfBelow(IERC20 token, address spender, uint256 amount) internal {
        uint256 allowance = token.allowance(address(this), spender);
        if (allowance < amount) {
            if (allowance != 0) {
                safeApprove(token, spender, 0);
            }
            safeApprove(token, spender, type(uint256).max);
        }
    }
}

// src/core/SettlerErrors.sol

/// @notice Thrown when an offset is not the expected value
error InvalidOffset();

/// @notice Thrown when a validating a target contract to avoid certain types of targets
error ConfusedDeputy();

function revertConfusedDeputy() pure {
    assembly ("memory-safe") {
        mstore(0x00, 0xe758b8d5) // selector for `ConfusedDeputy()`
        revert(0x1c, 0x04)
    }
}

/// @notice Thrown when a target contract is invalid given the context
error InvalidTarget();

/// @notice Thrown when validating the caller against the expected caller
error InvalidSender();

/// @notice Thrown in cases when using a Trusted Forwarder / AllowanceHolder is not allowed
error ForwarderNotAllowed();

/// @notice Thrown when a signature length is not the expected length
error InvalidSignatureLen();

/// @notice Thrown when a slippage limit is exceeded
error TooMuchSlippage(IERC20 token, uint256 expected, uint256 actual);

function revertTooMuchSlippage(IERC20 buyToken, uint256 expectedBuyAmount, uint256 actualBuyAmount) pure {
    assembly ("memory-safe") {
        mstore(0x54, actualBuyAmount)
        mstore(0x34, expectedBuyAmount)
        mstore(0x14, buyToken)
        mstore(0x00, 0x97a6f3b9000000000000000000000000) // selector for `TooMuchSlippage(address,uint256,uint256)` with `buyToken`'s padding
        revert(0x10, 0x64)
    }
}

/// @notice Thrown when a byte array that is supposed to encode a function from ISettlerActions is
///         not recognized in context.
error ActionInvalid(uint256 i, bytes4 action, bytes data);

function revertActionInvalid(uint256 i, uint256 action, bytes calldata data) pure {
    assembly ("memory-safe") {
        let ptr := mload(0x40)
        mstore(ptr, 0x3c74eed6) // selector for `ActionInvalid(uint256,bytes4,bytes)`
        mstore(add(0x20, ptr), i)
        mstore(add(0x40, ptr), shl(0xe0, action)) // align as `bytes4`
        mstore(add(0x60, ptr), 0x60) // offset to the length slot of the dynamic value `data`
        mstore(add(0x80, ptr), data.length)
        calldatacopy(add(0xa0, ptr), data.offset, data.length)
        revert(add(0x1c, ptr), add(0x84, data.length))
    }
}

/// @notice Thrown when the encoded fork ID as part of UniswapV3 fork path is not on the list of
///         recognized forks for this chain.
error UnknownForkId(uint8 forkId);

function revertUnknownForkId(uint8 forkId) pure {
    assembly ("memory-safe") {
        mstore(0x00, 0xd3b1276d) // selector for `UnknownForkId(uint8)`
        mstore(0x20, and(0xff, forkId))
        revert(0x1c, 0x24)
    }
}

/// @notice Thrown when an AllowanceHolder transfer's permit is past its deadline
error SignatureExpired(uint256 deadline);

/// @notice Thrown when selling the native asset, but `msg.value` exceeds the value from the generated quote
error MsgValueMismatch(uint256 expected, uint256 actual);

/// @notice An internal error that should never be thrown. Thrown when a callback reenters the
///         entrypoint and attempts to clobber the existing callback.
error ReentrantCallback(uint256 callbackInt);

/// @notice An internal error that should never be thrown. This error can only be thrown by
///         non-metatx-supporting Settler instances. Thrown when a callback-requiring liquidity
///         source is called, but Settler never receives the callback.
error CallbackNotSpent(uint256 callbackInt);

/// @notice Thrown when a metatransaction has reentrancy.
error ReentrantMetatransaction(bytes32 oldWitness);

/// @notice Thrown when any transaction has reentrancy, not just taker-submitted or metatransaction.
error ReentrantPayer(address oldPayer);

/// @notice An internal error that should never be thrown. Thrown when a metatransaction fails to
///         spend a coupon.
error WitnessNotSpent(bytes32 oldWitness);

/// @notice An internal error that should never be thrown. Thrown when the payer is unset
///         unexpectedly.
error PayerSpent();

error DeltaNotPositive(IERC20 token);
error DeltaNotNegative(IERC20 token);
error ZeroSellAmount(IERC20 token);
error ZeroBuyAmount(IERC20 buyToken);
error BoughtSellToken(IERC20 sellToken);
error TokenHashCollision(IERC20 token0, IERC20 token1);
error ZeroToken();

/// @notice Thrown for liquidities that require a Newton-Raphson approximation to solve their
///         constant function when Newton-Raphson fails to converge on the solution in a
///         "reasonable" number of iterations.
error NotConverged();

/// @notice Thrown when the encoded pool manager ID as part of PancakeSwap Infinity fill is not on
///         the list of recognized pool managers.
error UnknownPoolManagerId(uint8 poolManagerId);

/// @notice Thrown when the `msg.value` is less than the minimum expected value.
error Underpayment(uint256 msgValueMin, uint256 msgValueActual);

// src/utils/Ternary.sol

library Ternary {
    //// All the code duplication in this file is because solc isn't smart enough to figure out that
    //// it doesn't need to do a ton of masking when types are cast to each other without
    //// modification.

    function ternary(bool c, uint256 x, uint256 y) internal pure returns (uint256 r) {
        assembly ("memory-safe") {
            r := xor(y, mul(xor(x, y), c))
        }
    }

    function ternary(bool c, int256 x, int256 y) internal pure returns (int256 r) {
        assembly ("memory-safe") {
            r := xor(y, mul(xor(x, y), c))
        }
    }

    function ternary(bool c, bytes4 x, bytes4 y) internal pure returns (bytes4 r) {
        assembly ("memory-safe") {
            r := xor(y, mul(xor(x, y), c))
        }
    }

    function ternary(bool c, address x, address y) internal pure returns (address r) {
        assembly ("memory-safe") {
            r := xor(y, mul(xor(x, y), c))
        }
    }

    function orZero(bool c, uint256 x) internal pure returns (uint256 r) {
        assembly ("memory-safe") {
            r := mul(x, c)
        }
    }

    function maybeSwap(bool c, uint256 x, uint256 y) internal pure returns (uint256 a, uint256 b) {
        assembly ("memory-safe") {
            let t := mul(xor(x, y), c)
            a := xor(x, t)
            b := xor(y, t)
        }
    }

    function maybeSwap(bool c, int256 x, int256 y) internal pure returns (int256 a, int256 b) {
        assembly ("memory-safe") {
            let t := mul(xor(x, y), c)
            a := xor(x, t)
            b := xor(y, t)
        }
    }

    function maybeSwap(bool c, IERC20 x, IERC20 y) internal pure returns (IERC20 a, IERC20 b) {
        assembly ("memory-safe") {
            let t := mul(xor(x, y), c)
            a := xor(x, t)
         ...

// [truncated — 457620 bytes total]

Read Contract

balanceOf 0x70a08231
rebateClaimer 0x67c4a3b0 → address

Write Contract 1 functions

These functions modify contract state and require a wallet transaction to execute.

execute 0xd2f84ab6
tuple slippage
bytes[] actions
bytes32
returns: bool

Recent Transactions

No transactions found for this address