Cryo Explorer Ethereum Mainnet

Address Contract Partially Verified

Address 0x5d556e21d306CB33809d98ae4eb898Ed41A59a6E
Balance 0 ETH
Nonce 1
Code Size 24518 bytes
Indexed Transactions 0
External Etherscan · Sourcify

Contract Bytecode

24518 bytes
0x608060405234801561001057600080fd5b506004361061025f5760003560e01c80636347c900116101475780639feab859116100be5780639feab85914610628578063a50857bf1461064f578063c391425e14610662578063ca0de88214610682578063ca4f2d97146106a9578063d72d8dd6146106bc578063d75b4c88146106c4578063dd8283f3146106d7578063e65797ad146106ea578063f2fde38b14610766578063fabc1cbc14610779578063fd39105a1461078c57600080fd5b80636347c90014610518578063683048351461052b5780636e3b17db14610552578063715018a61461056557806384b0196e1461056d57806384ca521314610588578063871ef0491461059b578063886f1195146105ae5780638da5cb5b146105c75780639aa1653d146105cf5780639b5d177b146105ee5780639e9923c21461060157600080fd5b8063296bb064116101db578063296bb0641461040857806329d1e0c31461041b5780632cdd1e861461042e5780633998fdd3146104415780633c2a7f4c146104685780635140a548146104885780635865c60c1461049b578063595c6a67146104bb5780635ac86ab7146104c35780635b0b829f146104d65780635c975abb146104e95780635df45946146104f157600080fd5b8062cf2ab51461026457806303fd34921461027957806304ec6351146102ac578063054310e6146102d75780630cf4b767146102f757806310d67a2f1461030a57806313542a4e1461031d578063136439dd146103465780631478851f146103595780631eb812da1461038c578063249a0c42146103d557806328f61b31146103f5575b600080fd5b6102776102723660046148f5565b6107c8565b005b610299610287366004614936565b6000908152609a602052604090205490565b6040519081526020015b60405180910390f35b6102bf6102ba366004614961565b6108dd565b6040516001600160c01b0390911681526020016102a3565b609f546102ea906001600160a01b031681565b6040516102a39190614999565b610277610305366004614a94565b610aaf565b610277610318366004614b09565b610b97565b61029961032b366004614b09565b6001600160a01b03166000908152609b602052604090205490565b610277610354366004614936565b610c48565b61037c610367366004614936565b609c6020526000908152604090205460ff1681565b60405190151581526020016102a3565b61039f61039a366004614b26565b610d73565b60408051825163ffffffff908116825260208085015190911690820152918101516001600160c01b0316908201526060016102a3565b6102996103e3366004614b59565b609d6020526000908152604090205481565b60a0546102ea906001600160a01b031681565b6102ea610416366004614936565b610e04565b610277610429366004614b09565b610e90565b61027761043c366004614b09565b610ea1565b6102ea7f000000000000000000000000e5445838c475a2980e6a88054ff1514230b83aeb81565b61047b610476366004614b09565b610eb2565b6040516102a39190614b74565b610277610496366004614bcc565b610f31565b6104ae6104a9366004614b09565b611441565b6040516102a39190614c6f565b6102776114b5565b61037c6104d1366004614b59565b611574565b6102776104e4366004614cf4565b611589565b600354610299565b6102ea7f00000000000000000000000061d25c9b943b893747bd33f92b62ec8270222e6f81565b6102ea610526366004614936565b61161a565b6102ea7f0000000000000000000000004a4ec1631ae79699be7dcfd3fca395ab89c5efe981565b610277610560366004614d28565b611644565b610277611701565b610575611715565b6040516102a39796959493929190614dc9565b610299610596366004614ec2565b61179d565b6102bf6105a9366004614936565b6117e7565b6002546102ea906201000090046001600160a01b031681565b6102ea6117f2565b6098546105dc9060ff1681565b60405160ff90911681526020016102a3565b6102776105fc366004615055565b61180b565b6102ea7f00000000000000000000000016552d7863560ee6903f092a901a9124a501308581565b6102997f2bd82124057f0913bc3b772ce7b83e8057c1ad1f3510fc83778be20f10ec5de681565b61027761065d36600461514e565b611b43565b6106756106703660046151f6565b611cc7565b6040516102a3919061529b565b6102997f4d404e3276e7ac2163d8ee476afa6a41d1f68fb71f2d8b6546b24e55ce01b72a81565b6102776106b73660046152e5565b611d80565b609e54610299565b6102776106d23660046153cb565b611de8565b6102776106e536600461557e565b611dfb565b6107596106f8366004614b59565b60408051606080820183526000808352602080840182905292840181905260ff9490941684526099825292829020825193840183525463ffffffff8116845261ffff600160201b8204811692850192909252600160301b9004169082015290565b6040516102a39190615652565b610277610774366004614b09565b6120ff565b610277610787366004614936565b612175565b6107bb61079a366004614b09565b6001600160a01b03166000908152609b602052604090206001015460ff1690565b6040516102a39190615683565b60026107d381611574565b156107f95760405162461bcd60e51b81526004016107f090615691565b60405180910390fd5b60005b828110156108d7576000848483818110610818576108186156c4565b905060200201602081019061082d9190614b09565b6001600160a01b0381166000908152609b602090815260408083208151808301909252805482526001810154949550929390929183019060ff16600281111561087857610878614c37565b600281111561088957610889614c37565b9052508051909150600061089c82612304565b905060006108b2826001600160c01b0316612373565b90506108bf85858361243f565b505050505080806108cf906156f0565b9150506107fc565b50505050565b6000838152609a60205260408120805482919084908110610900576109006156c4565b600091825260209182902060408051606081018252929091015463ffffffff808216808552600160201b8304821695850195909552600160401b9091046001600160c01b031691830191909152909250851610156109e85760405162461bcd60e51b81526020600482015260656024820152600080516020615eb183398151915260448201527f6d61704174426c6f636b4e756d6265724279496e6465783a2071756f72756d4260648201527f69746d61705570646174652069732066726f6d20616674657220626c6f636b4e6084820152643ab6b132b960d91b60a482015260c4016107f0565b602081015163ffffffff161580610a0e5750806020015163ffffffff168463ffffffff16105b610aa35760405162461bcd60e51b81526020600482015260666024820152600080516020615eb183398151915260448201527f6d61704174426c6f636b4e756d6265724279496e6465783a2071756f72756d4260648201527f69746d61705570646174652069732066726f6d206265666f726520626c6f636b608482015265273ab6b132b960d11b60a482015260c4016107f0565b60400151949350505050565b6001336000908152609b602052604090206001015460ff166002811115610ad857610ad8614c37565b14610b4b5760405162461bcd60e51b815260206004820152603c60248201527f5265676973747279436f6f7264696e61746f722e757064617465536f636b657460448201527f3a206f70657261746f72206973206e6f7420726567697374657265640000000060648201526084016107f0565b336000908152609b6020526040908190205490517fec2963ab21c1e50e1e582aa542af2e4bf7bf38e6e1403c27b42e1c5d6e621eaa90610b8c90849061570b565b60405180910390a250565b60028054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610be8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c0c919061571e565b6001600160a01b0316336001600160a01b031614610c3c5760405162461bcd60e51b81526004016107f09061573b565b610c458161252c565b50565b60025460405163237dfb4760e11b8152620100009091046001600160a01b0316906346fbf68e90610c7d903390600401614999565b602060405180830381865afa158015610c9a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cbe9190615785565b610cda5760405162461bcd60e51b81526004016107f0906157a7565b60035481811614610d4e5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d707420604482015277746f20756e70617573652066756e6374696f6e616c69747960401b60648201526084016107f0565b60038190556040518181523390600080516020615f1183398151915290602001610b8c565b60408051606081018252600080825260208201819052918101919091526000838152609a60205260409020805483908110610db057610db06156c4565b600091825260209182902060408051606081018252919092015463ffffffff8082168352600160201b820416938201939093526001600160c01b03600160401b909304929092169082015290505b92915050565b6040516308f6629d60e31b8152600481018290526000907f00000000000000000000000061d25c9b943b893747bd33f92b62ec8270222e6f6001600160a01b0316906347b314e890602401602060405180830381865afa158015610e6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dfe919061571e565b610e98612630565b610c458161268f565b610ea9612630565b610c45816126f8565b6040805180820190915260008082526020820152610dfe610f2c7f2bd82124057f0913bc3b772ce7b83e8057c1ad1f3510fc83778be20f10ec5de684604051602001610f119291909182526001600160a01b0316602082015260400190565b60405160208183030381529060405280519060200120612761565b61278e565b6002610f3c81611574565b15610f595760405162461bcd60e51b81526004016107f090615691565b6000610fa184848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060985460ff16915061281e9050565b90508483146110125760405162461bcd60e51b81526020600482015260436024820152600080516020615ed183398151915260448201527f6f7273466f7251756f72756d3a20696e707574206c656e677468206d69736d616064820152620e8c6d60eb1b608482015260a4016107f0565b60005b83811015611438576000858583818110611031576110316156c4565b919091013560f81c91503690506000898985818110611052576110526156c4565b905060200281019061106491906157ef565b6040516379a0849160e11b815260ff8616600482015291935091507f00000000000000000000000016552d7863560ee6903f092a901a9124a50130856001600160a01b03169063f341092290602401602060405180830381865afa1580156110d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110f49190615838565b63ffffffff1681146111905760405162461bcd60e51b81526020600482015260656024820152600080516020615ed183398151915260448201527f6f7273466f7251756f72756d3a206e756d626572206f6620757064617465642060648201527f6f70657261746f727320646f6573206e6f74206d617463682071756f72756d206084820152641d1bdd185b60da1b60a482015260c4016107f0565b6000805b828110156113d75760008484838181106111b0576111b06156c4565b90506020020160208101906111c59190614b09565b6001600160a01b0381166000908152609b602090815260408083208151808301909252805482526001810154949550929390929183019060ff16600281111561121057611210614c37565b600281111561122157611221614c37565b9052508051909150600061123482612304565b905060016001600160c01b03821660ff8b161c8116146112b85760405162461bcd60e51b815260206004820152604460248201819052600080516020615ed1833981519152908201527f6f7273466f7251756f72756d3a206f70657261746f72206e6f7420696e2071756064820152636f72756d60e01b608482015260a4016107f0565b856001600160a01b0316846001600160a01b0316116113635760405162461bcd60e51b81526020600482015260676024820152600080516020615ed183398151915260448201527f6f7273466f7251756f72756d3a206f70657261746f7273206172726179206d7560648201527f737420626520736f7274656420696e20617363656e64696e6720616464726573608482015266399037b93232b960c91b60a482015260c4016107f0565b506113c183838f8f8d908e600161137a9190615855565b926113879392919061586d565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061243f92505050565b509092506113d09050816156f0565b9050611194565b5060ff84166000818152609d6020908152604091829020439081905591519182527f46077d55330763f16269fd75e5761663f4192d2791747c0189b16ad31db07db4910160405180910390a25050505080611431906156f0565b9050611015565b50505050505050565b60408051808201909152600080825260208201526001600160a01b0382166000908152609b60209081526040918290208251808401909352805483526001810154909183019060ff16600281111561149b5761149b614c37565b60028111156114ac576114ac614c37565b90525092915050565b60025460405163237dfb4760e11b8152620100009091046001600160a01b0316906346fbf68e906114ea903390600401614999565b602060405180830381865afa158015611507573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061152b9190615785565b6115475760405162461bcd60e51b81526004016107f0906157a7565b60001960038190556040519081523390600080516020615f118339815191529060200160405180910390a2565b600354600160ff9092169190911b9081161490565b611591612630565b609854829060ff9081169082161061160b5760405162461bcd60e51b815260206004820152603760248201527f5265676973747279436f6f7264696e61746f722e71756f72756d4578697374736044820152760e881c5d5bdc9d5b48191bd95cc81b9bdd08195e1a5cdd604a1b60648201526084016107f0565b611615838361289d565b505050565b609e818154811061162a57600080fd5b6000918252602090912001546001600160a01b0316905081565b60a0546001600160a01b031633146116c15760405162461bcd60e51b815260206004820152603a60248201527f5265676973747279436f6f7264696e61746f722e6f6e6c79456a6563746f723a6044820152791031b0b63632b91034b9903737ba103a34329032b532b1ba37b960311b60648201526084016107f0565b6116158383838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061293892505050565b611709612630565b6117136000612d71565b565b6000606080828080836117487f4156535265676973747279436f6f7264696e61746f720000000000000000001683612dc3565b6117737f76302e302e3100000000000000000000000000000000000000000000000000066001612dc3565b60408051600080825260208201909252600f60f81b9b939a50919850469750309650945092509050565b60006117dd7f4d404e3276e7ac2163d8ee476afa6a41d1f68fb71f2d8b6546b24e55ce01b72a8787878787604051602001610f1196959493929190615897565b9695505050505050565b6000610dfe82612304565b60006118066066546001600160a01b031690565b905090565b600061181681611574565b156118335760405162461bcd60e51b81526004016107f090615691565b8389146118b65760405162461bcd60e51b8152602060048201526044602482018190527f5265676973747279436f6f7264696e61746f722e72656769737465724f706572908201527f61746f7257697468436875726e3a20696e707574206c656e677468206d69736d6064820152630c2e8c6d60e31b608482015260a4016107f0565b60006118c23388612e67565b905061192233828888808060200260200160405190810160405280939291908181526020016000905b82821015611917576119086040830286013681900381019061591c565b815260200190600101906118eb565b505050505087612f99565b600061196933838e8e8e8e8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508c9250613126915050565b905060005b8b811015611b34576000609960008f8f8581811061198e5761198e6156c4565b919091013560f81c82525060208082019290925260409081016000208151606081018352905463ffffffff811680835261ffff600160201b8304811695840195909552600160301b909104909316918101919091528451805191935090849081106119fb576119fb6156c4565b602002602001015163ffffffff161115611b2157611a9c8e8e84818110611a2457611a246156c4565b9050013560f81c60f81b60f81c84604001518481518110611a4757611a476156c4565b60200260200101513386602001518681518110611a6657611a666156c4565b60200260200101518d8d88818110611a8057611a806156c4565b905060400201803603810190611a96919061591c565b86613639565b611b21898984818110611ab157611ab16156c4565b9050604002016020016020810190611ac99190614b09565b8f8f8590866001611ada9190615855565b92611ae79392919061586d565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061293892505050565b5080611b2c816156f0565b91505061196e565b50505050505050505050505050565b6000611b4e81611574565b15611b6b5760405162461bcd60e51b81526004016107f090615691565b6000611b773385612e67565b90506000611bc033838b8b8b8b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508c9250613126915050565b51905060005b88811015611cbb5760008a8a83818110611be257611be26156c4565b919091013560f81c600081815260996020526040902054855191935063ffffffff169150849084908110611c1857611c186156c4565b602002602001015163ffffffff161115611ca85760405162461bcd60e51b8152602060048201526044602482018190527f5265676973747279436f6f7264696e61746f722e72656769737465724f706572908201527f61746f723a206f70657261746f7220636f756e742065786365656473206d6178606482015263696d756d60e01b608482015260a4016107f0565b5080611cb3816156f0565b915050611bc6565b50505050505050505050565b6060600082516001600160401b03811115611ce457611ce46149ad565b604051908082528060200260200182016040528015611d0d578160200160208202803683370190505b50905060005b8351811015611d7857611d3f85858381518110611d3257611d326156c4565b602002602001015161390e565b828281518110611d5157611d516156c4565b63ffffffff9092166020928302919091019091015280611d70816156f0565b915050611d13565b509392505050565b6001611d8b81611574565b15611da85760405162461bcd60e51b81526004016107f090615691565b6116153384848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061293892505050565b611df0612630565b611615838383613a38565b600254610100900460ff1615808015611e1b5750600254600160ff909116105b80611e355750303b158015611e35575060025460ff166001145b611e985760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016107f0565b6002805460ff191660011790558015611ebb576002805461ff0019166101001790555b82518451148015611ecd575081518351145b611f375760405162461bcd60e51b815260206004820152603560248201527f5265676973747279436f6f7264696e61746f722e696e697469616c697a653a206044820152740d2dce0eae840d8cadccee8d040dad2e6dac2e8c6d605b1b60648201526084016107f0565b611f4089612d71565b611f4a8686613c4f565b611f538861268f565b611f5c876126f8565b609e80546001818101835560008381527fcfe2a20ff701a1f3e14f63bd70d6c6bc6fba8172ec6d5a505cdab3927c0a9de692830180546001600160a01b037f0000000000000000000000004a4ec1631ae79699be7dcfd3fca395ab89c5efe981166001600160a01b03199283161790925585548085018755850180547f00000000000000000000000061d25c9b943b893747bd33f92b62ec8270222e6f841690831617905585549384019095559190920180547f00000000000000000000000016552d7863560ee6903f092a901a9124a501308590921691909316179091555b84518110156120ad5761209b85828151811061205a5761205a6156c4565b6020026020010151858381518110612074576120746156c4565b602002602001015185848151811061208e5761208e6156c4565b6020026020010151613a38565b806120a5816156f0565b91505061203c565b5080156120f4576002805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050505050565b612107612630565b6001600160a01b03811661216c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107f0565b610c4581612d71565b60028054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156121c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121ea919061571e565b6001600160a01b0316336001600160a01b03161461221a5760405162461bcd60e51b81526004016107f09061573b565b6003541981196003541916146122935760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d706044820152777420746f2070617573652066756e6374696f6e616c69747960401b60648201526084016107f0565b600381905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610b8c565b60006020835110156122e6576122df83613d2d565b9050610dfe565b828281516122f792602001906147dc565b5060ff9050610dfe565b90565b6000818152609a6020526040812054806123215750600092915050565b6000838152609a6020526040902061233a600183615938565b8154811061234a5761234a6156c4565b600091825260209091200154600160401b90046001600160c01b03169392505050565b50919050565b606060008061238184613d6b565b61ffff166001600160401b0381111561239c5761239c6149ad565b6040519080825280601f01601f1916602001820160405280156123c6576020820181803683370190505b5090506000805b8251821080156123de575061010081105b15612435576001811b935085841615612425578060f81b838381518110612407576124076156c4565b60200101906001600160f81b031916908160001a9053508160010191505b61242e816156f0565b90506123cd565b5090949350505050565b60018260200151600281111561245757612457614c37565b1461246157505050565b81516040516333567f7f60e11b81526000906001600160a01b037f0000000000000000000000004a4ec1631ae79699be7dcfd3fca395ab89c5efe916906366acfefe906124b69088908690889060040161594f565b6020604051808303816000875af11580156124d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124f9919061597f565b90506001600160c01b038116156125255761252585612520836001600160c01b0316612373565b612938565b5050505050565b6001600160a01b0381166125ba5760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a4016107f0565b7f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb660028054906101000a90046001600160a01b0316826040516125fe9291906159a8565b60405180910390a1600280546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b336126396117f2565b6001600160a01b0316146117135760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107f0565b609f546040517f315457d8a8fe60f04af17c16e2f5a5e1db612b31648e58030360759ef8f3528c916126ce916001600160a01b039091169084906159a8565b60405180910390a1609f80546001600160a01b0319166001600160a01b0392909216919091179055565b60a0546040517f8f30ab09f43a6c157d7fce7e0a13c003042c1c95e8a72e7a146a21c0caa24dc991612737916001600160a01b039091169084906159a8565b60405180910390a160a080546001600160a01b0319166001600160a01b0392909216919091179055565b6000610dfe61276e613d96565b8360405161190160f01b8152600281019290925260228201526042902090565b6040805180820190915260008082526020820152600080806127be600080516020615f31833981519152866159d8565b90505b6127ca81613ec1565b9093509150600080516020615f31833981519152828309831415612804576040805180820190915290815260208101919091529392505050565b600080516020615f318339815191526001820890506127c1565b60008061282a84613f43565b9050808360ff166001901b116128965760405162461bcd60e51b815260206004820152603f6024820152600080516020615f7183398151915260448201527f69746d61703a206269746d61702065786365656473206d61782076616c75650060648201526084016107f0565b9392505050565b60ff821660008181526099602090815260409182902084518154928601518487015161ffff908116600160301b0261ffff60301b1991909216600160201b0265ffffffffffff1990951663ffffffff909316929092179390931716919091179055517f3ee6fe8d54610244c3e9d3c066ae4aee997884aa28f10616ae821925401318ac9061292c908490615652565b60405180910390a25050565b6001600160a01b0382166000908152609b60205260409020805460018083015460ff16600281111561296c5761296c614c37565b146129d95760405162461bcd60e51b81526020600482015260436024820152600080516020615f5183398151915260448201527f70657261746f723a206f70657261746f72206973206e6f7420726567697374656064820152621c995960ea1b608482015260a4016107f0565b6098546000906129ed90859060ff1661281e565b905060006129fa83612304565b90506001600160c01b038216612a645760405162461bcd60e51b815260206004820152603b6024820152600080516020615f5183398151915260448201527a070657261746f723a206269746d61702063616e6e6f74206265203602c1b60648201526084016107f0565b612a7b6001600160c01b0383811690831681161490565b612afd5760405162461bcd60e51b81526020600482015260596024820152600080516020615f5183398151915260448201527f70657261746f723a206f70657261746f72206973206e6f74207265676973746560648201527872656420666f72207370656369666965642071756f72756d7360381b608482015260a4016107f0565b6001600160c01b0382811619821616612b1684826140ac565b6001600160c01b038116612be85760018501805460ff191660021790556040516351b27a6d60e11b81527f000000000000000000000000e5445838c475a2980e6a88054ff1514230b83aeb6001600160a01b03169063a364f4da90612b7f908a90600401614999565b600060405180830381600087803b158015612b9957600080fd5b505af1158015612bad573d6000803e3d6000fd5b50506040518692506001600160a01b038a1691507f396fdcb180cb0fea26928113fb0fd1c3549863f9cd563e6a184f1d578116c8e490600090a35b60405163f4e24fe560e01b81526001600160a01b037f00000000000000000000000061d25c9b943b893747bd33f92b62ec8270222e6f169063f4e24fe590612c36908a908a906004016159ec565b600060405180830381600087803b158015612c5057600080fd5b505af1158015612c64573d6000803e3d6000fd5b505060405163bd29b8cd60e01b81526001600160a01b037f0000000000000000000000004a4ec1631ae79699be7dcfd3fca395ab89c5efe916925063bd29b8cd9150612cb69087908a90600401615a10565b600060405180830381600087803b158015612cd057600080fd5b505af1158015612ce4573d6000803e3d6000fd5b505060405163bd29b8cd60e01b81526001600160a01b037f00000000000000000000000016552d7863560ee6903f092a901a9124a501308516925063bd29b8cd9150612d369087908a90600401615a10565b600060405180830381600087803b158015612d5057600080fd5b505af1158015612d64573d6000803e3d6000fd5b5050505050505050505050565b606680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b606060ff8314612dd6576122df8361426c565b818054612de290615a29565b80601f0160208091040260200160405190810160405280929190818152602001828054612e0e90615a29565b8015612e5b5780601f10612e3057610100808354040283529160200191612e5b565b820191906000526020600020905b815481529060010190602001808311612e3e57829003601f168201915b50505050509050610dfe565b6040516309aa152760e11b81526000906001600160a01b037f00000000000000000000000061d25c9b943b893747bd33f92b62ec8270222e6f16906313542a4e90612eb6908690600401614999565b602060405180830381865afa158015612ed3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ef79190615a5e565b905080610dfe577f00000000000000000000000061d25c9b943b893747bd33f92b62ec8270222e6f6001600160a01b031663bf79ce588484612f3887610eb2565b6040518463ffffffff1660e01b8152600401612f5693929190615a77565b6020604051808303816000875af1158015612f75573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128969190615a5e565b6020808201516000908152609c909152604090205460ff161561303f5760405162461bcd60e51b815260206004820152605260248201527f5265676973747279436f6f7264696e61746f722e5f766572696679436875726e60448201527f417070726f7665725369676e61747572653a20636875726e417070726f766572606482015271081cd85b1d08185b1c9958591e481d5cd95960721b608482015260a4016107f0565b42816040015110156130d45760405162461bcd60e51b815260206004820152605260248201527f5265676973747279436f6f7264696e61746f722e5f766572696679436875726e60448201527f417070726f7665725369676e61747572653a20636875726e417070726f766572606482015271081cda59db985d1d5c9948195e1c1a5c995960721b608482015260a4016107f0565b602080820180516000908152609c909252604091829020805460ff19166001179055609f549051918301516108d7926001600160a01b039092169161311f918891889188919061179d565b83516142ab565b61314a60405180606001604052806060815260200160608152602001606081525090565b600061319286868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060985460ff16915061281e9050565b9050600061319f88612304565b90506001600160c01b0382166132195760405162461bcd60e51b815260206004820152603960248201527f5265676973747279436f6f7264696e61746f722e5f72656769737465724f706560448201527807261746f723a206269746d61702063616e6e6f74206265203603c1b60648201526084016107f0565b8082166001600160c01b0316156132cf5760405162461bcd60e51b815260206004820152606860248201527f5265676973747279436f6f7264696e61746f722e5f72656769737465724f706560448201527f7261746f723a206f70657261746f7220616c726561647920726567697374657260648201527f656420666f7220736f6d652071756f72756d73206265696e672072656769737460848201526732b932b2103337b960c11b60a482015260c4016107f0565b6001600160c01b03818116908316176132e889826140ac565b887fec2963ab21c1e50e1e582aa542af2e4bf7bf38e6e1403c27b42e1c5d6e621eaa87604051613318919061570b565b60405180910390a260016001600160a01b038b166000908152609b602052604090206001015460ff16600281111561335257613352614c37565b1461346b576040805180820182528a8152600160208083018281526001600160a01b038f166000908152609b90925293902082518155925183820180549394939192909160ff1916908360028111156133ad576133ad614c37565b021790555050604051639926ee7d60e01b81526001600160a01b037f000000000000000000000000e5445838c475a2980e6a88054ff1514230b83aeb169150639926ee7d90613402908d908990600401615af6565b600060405180830381600087803b15801561341c57600080fd5b505af1158015613430573d6000803e3d6000fd5b50506040518b92506001600160a01b038d1691507fe8e68cef1c3a761ed7be7e8463a375f27f7bc335e51824223cacce636ec5c3fe90600090a35b604051631fd93ca960e11b81526001600160a01b037f00000000000000000000000061d25c9b943b893747bd33f92b62ec8270222e6f1690633fb27952906134bb908d908c908c90600401615b6a565b600060405180830381600087803b1580156134d557600080fd5b505af11580156134e9573d6000803e3d6000fd5b5050604051632550477760e01b81526001600160a01b037f0000000000000000000000004a4ec1631ae79699be7dcfd3fca395ab89c5efe91692506325504777915061353f908d908d908d908d90600401615b8f565b6000604051808303816000875af115801561355e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526135869190810190615c1b565b60408087019190915260208601919091525162bff04d60e01b81526001600160a01b037f00000000000000000000000016552d7863560ee6903f092a901a9124a5013085169062bff04d906135e3908c908c908c90600401615c7e565b6000604051808303816000875af1158015613602573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261362a9190810190615c98565b84525050509695505050505050565b6020808301516001600160a01b038082166000818152609b909452604090932054919290871614156136b95760405162461bcd60e51b81526020600482015260356024820152600080516020615ef183398151915260448201527439371d1031b0b73737ba1031b43ab9371039b2b63360591b60648201526084016107f0565b8760ff16846000015160ff16146137365760405162461bcd60e51b81526020600482015260476024820152600080516020615ef183398151915260448201527f726e3a2071756f72756d4e756d626572206e6f74207468652073616d65206173606482015266081cda59db995960ca1b608482015260a4016107f0565b604051635401ed2760e01b81526004810182905260ff891660248201526000907f0000000000000000000000004a4ec1631ae79699be7dcfd3fca395ab89c5efe96001600160a01b031690635401ed2790604401602060405180830381865afa1580156137a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137cb9190615d31565b90506137d78185614465565b6001600160601b0316866001600160601b03161161386a5760405162461bcd60e51b81526020600482015260566024820152600080516020615ef183398151915260448201527f726e3a20696e636f6d696e67206f70657261746f722068617320696e7375666660648201527534b1b4b2b73a1039ba30b5b2903337b91031b43ab93760511b608482015260a4016107f0565b6138748885614489565b6001600160601b0316816001600160601b0316106120f45760405162461bcd60e51b815260206004820152605c6024820152600080516020615ef183398151915260448201527f726e3a2063616e6e6f74206b69636b206f70657261746f722077697468206d6f60648201527f7265207468616e206b69636b424950734f66546f74616c5374616b6500000000608482015260a4016107f0565b6000818152609a6020526040812054815b818110156139a05760016139338284615938565b61393d9190615938565b92508463ffffffff16609a60008681526020019081526020016000208463ffffffff1681548110613970576139706156c4565b60009182526020909120015463ffffffff161161398e575050610dfe565b80613998816156f0565b91505061391f565b5060405162461bcd60e51b815260206004820152606c6024820152600080516020615eb183398151915260448201527f6d6170496e6465784174426c6f636b4e756d6265723a206e6f206269746d617060648201527f2075706461746520666f756e6420666f72206f70657261746f7249642061742060848201526b313637b1b590373ab6b132b960a11b60a482015260c4016107f0565b60985460ff1660c08110613aac5760405162461bcd60e51b815260206004820152603560248201527f5265676973747279436f6f7264696e61746f722e63726561746551756f72756d6044820152740e881b585e081c5d5bdc9d5b5cc81c995858da1959605a1b60648201526084016107f0565b613ab7816001615d4e565b6098805460ff191660ff9290921691909117905580613ad6818661289d565b60405160016296b58960e01b031981526001600160a01b037f0000000000000000000000004a4ec1631ae79699be7dcfd3fca395ab89c5efe9169063ff694a7790613b2990849088908890600401615d73565b600060405180830381600087803b158015613b4357600080fd5b505af1158015613b57573d6000803e3d6000fd5b505060405163136ca0f960e11b815260ff841660048201527f00000000000000000000000016552d7863560ee6903f092a901a9124a50130856001600160a01b031692506326d941f29150602401600060405180830381600087803b158015613bbf57600080fd5b505af1158015613bd3573d6000803e3d6000fd5b505060405163136ca0f960e11b815260ff841660048201527f00000000000000000000000061d25c9b943b893747bd33f92b62ec8270222e6f6001600160a01b031692506326d941f29150602401600060405180830381600087803b158015613c3b57600080fd5b505af11580156120f4573d6000803e3d6000fd5b6002546201000090046001600160a01b0316158015613c7657506001600160a01b03821615155b613cf85760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a4016107f0565b60038190556040518181523390600080516020615f118339815191529060200160405180910390a2613d298261252c565b5050565b600080829050601f81511115613d58578260405163305a27a960e01b81526004016107f0919061570b565b8051613d6382615deb565b179392505050565b6000805b8215610dfe57613d80600184615938565b9092169180613d8e81615e0f565b915050613d6f565b6000306001600160a01b037f0000000000000000000000005d556e21d306cb33809d98ae4eb898ed41a59a6e16148015613def57507f000000000000000000000000000000000000000000000000000000000000000146145b15613e1957507fe70c0c8c4e7b40f91c3d665e244db0f7e16a7bbe21a5abeafa87de9f7f339be790565b611806604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f6ec8a99f0e7f9ebde7354a446dcb9423f3af9c58f386a53c59c5b384f9e82d11918101919091527f6bda7e3f385e48841048390444cced5cc795af87758af67622e5f4f0882c4a9960608201524660808201523060a082015260009060c00160405160208183030381529060405280519060200120905090565b60008080600080516020615f318339815191526003600080516020615f3183398151915286600080516020615f31833981519152888909090890506000613f37827f0c19139cb84c680a6e14116da060561765e05aa45a1c72a34f082305b61f3f52600080516020615f318339815191526144a3565b91959194509092505050565b600061010082511115613fba5760405162461bcd60e51b815260206004820152604460248201819052600080516020615f71833981519152908201527f69746d61703a206f7264657265644279746573417272617920697320746f6f206064820152636c6f6e6760e01b608482015260a4016107f0565b8151613fc857506000919050565b60008083600081518110613fde57613fde6156c4565b0160200151600160f89190911c81901b92505b84518110156140a35784818151811061400c5761400c6156c4565b0160200151600160f89190911c1b915082821161408f5760405162461bcd60e51b81526020600482015260476024820152600080516020615f7183398151915260448201527f69746d61703a206f72646572656442797465734172726179206973206e6f74206064820152661bdc99195c995960ca1b608482015260a4016107f0565b9181179161409c816156f0565b9050613ff1565b50909392505050565b6000828152609a602052604090205480614151576000838152609a60209081526040808320815160608101835263ffffffff43811682528185018681526001600160c01b03808a16958401958652845460018101865594885295909620915191909201805495519351909416600160401b026001600160401b03938316600160201b0267ffffffffffffffff1990961691909216179390931716919091179055505050565b6000838152609a6020526040812061416a600184615938565b8154811061417a5761417a6156c4565b600091825260209091200180549091504363ffffffff908116911614156141be5780546001600160401b0316600160401b6001600160c01b038516021781556108d7565b805463ffffffff438116600160201b81810267ffffffff00000000199094169390931784556000878152609a6020908152604080832081516060810183529485528483018481526001600160c01b03808c1693870193845282546001810184559286529390942094519401805493519151909216600160401b026001600160401b0391861690960267ffffffffffffffff199093169390941692909217179190911691909117905550505050565b606060006142798361454f565b604080516020808252818301909252919250600091906020820181803683375050509182525060208101929092525090565b6001600160a01b0383163b156143c557604051630b135d3f60e11b808252906001600160a01b03851690631626ba7e906142eb9086908690600401615a10565b602060405180830381865afa158015614308573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061432c9190615e31565b6001600160e01b031916146116155760405162461bcd60e51b815260206004820152605360248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a2045524331323731207369676e6174757265206064820152721d995c9a599a58d85d1a5bdb8819985a5b1959606a1b608482015260a4016107f0565b826001600160a01b03166143d98383614577565b6001600160a01b0316146116155760405162461bcd60e51b815260206004820152604760248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a207369676e6174757265206e6f742066726f6d6064820152661039b4b3b732b960c91b608482015260a4016107f0565b60208101516000906127109061447f9061ffff1685615e5b565b6128969190615e8a565b60408101516000906127109061447f9061ffff1685615e5b565b6000806144ae614860565b6144b661487e565b602080825281810181905260408201819052606082018890526080820187905260a082018690528260c08360056107d05a03fa92508280156144f7576144f9565bfe5b50826145445760405162461bcd60e51b815260206004820152601a602482015279424e3235342e6578704d6f643a2063616c6c206661696c75726560301b60448201526064016107f0565b505195945050505050565b600060ff8216601f811115610dfe57604051632cd44ac360e21b815260040160405180910390fd5b60008060006145868585614593565b91509150611d78816145d9565b6000808251604114156145ca5760208301516040840151606085015160001a6145be87828585614722565b945094505050506145d2565b506000905060025b9250929050565b60008160048111156145ed576145ed614c37565b14156145f65750565b600181600481111561460a5761460a614c37565b14156146535760405162461bcd60e51b815260206004820152601860248201527745434453413a20696e76616c6964207369676e617475726560401b60448201526064016107f0565b600281600481111561466757614667614c37565b14156146b55760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016107f0565b60038160048111156146c9576146c9614c37565b1415610c455760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016107f0565b6000806fa2a8918ca85bafe22016d0b997e4df60600160ff1b0383111561474f57506000905060036147d3565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156147a3573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166147cc576000600192509250506147d3565b9150600090505b94509492505050565b8280546147e890615a29565b90600052602060002090601f01602090048101928261480a5760008555614850565b82601f1061482357805160ff1916838001178555614850565b82800160010185558215614850579182015b82811115614850578251825591602001919060010190614835565b5061485c92915061489c565b5090565b60405180602001604052806001906020820280368337509192915050565b6040518060c001604052806006906020820280368337509192915050565b5b8082111561485c576000815560010161489d565b60008083601f8401126148c357600080fd5b5081356001600160401b038111156148da57600080fd5b6020830191508360208260051b85010111156145d257600080fd5b6000806020838503121561490857600080fd5b82356001600160401b0381111561491e57600080fd5b61492a858286016148b1565b90969095509350505050565b60006020828403121561494857600080fd5b5035919050565b63ffffffff81168114610c4557600080fd5b60008060006060848603121561497657600080fd5b8335925060208401356149888161494f565b929592945050506040919091013590565b6001600160a01b0391909116815260200190565b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b03811182821017156149e5576149e56149ad565b60405290565b604080519081016001600160401b03811182821017156149e5576149e56149ad565b604051601f8201601f191681016001600160401b0381118282101715614a3557614a356149ad565b604052919050565b60006001600160401b03831115614a5657614a566149ad565b614a69601f8401601f1916602001614a0d565b9050828152838383011115614a7d57600080fd5b828260208301376000602084830101529392505050565b600060208284031215614aa657600080fd5b81356001600160401b03811115614abc57600080fd5b8201601f81018413614acd57600080fd5b614adc84823560208401614a3d565b949350505050565b6001600160a01b0381168114610c4557600080fd5b8035614b0481614ae4565b919050565b600060208284031215614b1b57600080fd5b813561289681614ae4565b60008060408385031215614b3957600080fd5b50508035926020909101359150565b803560ff81168114614b0457600080fd5b600060208284031215614b6b57600080fd5b61289682614b48565b815181526020808301519082015260408101610dfe565b60008083601f840112614b9d57600080fd5b5081356001600160401b03811115614bb457600080fd5b6020830191508360208285010111156145d257600080fd5b60008060008060408587031215614be257600080fd5b84356001600160401b0380821115614bf957600080fd5b614c05888389016148b1565b90965094506020870135915080821115614c1e57600080fd5b50614c2b87828801614b8b565b95989497509550505050565b634e487b7160e01b600052602160045260246000fd5b60038110614c6b57634e487b7160e01b600052602160045260246000fd5b9052565b815181526020808301516040830191614c8a90840182614c4d565b5092915050565b803561ffff81168114614b0457600080fd5b600060608284031215614cb557600080fd5b614cbd6149c3565b90508135614cca8161494f565b8152614cd860208301614c91565b6020820152614ce960408301614c91565b604082015292915050565b60008060808385031215614d0757600080fd5b614d1083614b48565b9150614d1f8460208501614ca3565b90509250929050565b600080600060408486031215614d3d57600080fd5b8335614d4881614ae4565b925060208401356001600160401b03811115614d6357600080fd5b614d6f86828701614b8b565b9497909650939450505050565b6000815180845260005b81811015614da257602081850181015186830182015201614d86565b81811115614db4576000602083870101525b50601f01601f19169290920160200192915050565b60ff60f81b881681526000602060e081840152614de960e084018a614d7c565b8381036040850152614dfb818a614d7c565b606085018990526001600160a01b038816608086015260a0850187905284810360c0860152855180825283870192509083019060005b81811015614e4d57835183529284019291840191600101614e31565b50909c9b505050505050505050505050565b60006001600160401b03821115614e7857614e786149ad565b5060051b60200190565b600060408284031215614e9457600080fd5b614e9c6149eb565b9050614ea782614b48565b81526020820135614eb781614ae4565b602082015292915050565b600080600080600060a08688031215614eda57600080fd5b8535614ee581614ae4565b945060208681013594506040808801356001600160401b03811115614f0957600080fd5b8801601f81018a13614f1a57600080fd5b8035614f2d614f2882614e5f565b614a0d565b81815260069190911b8201840190848101908c831115614f4c57600080fd5b928501925b82841015614f7257614f638d85614e82565b82529284019290850190614f51565b999c989b5098996060810135995060800135979650505050505050565b6000610100828403121561236d57600080fd5b60008083601f840112614fb457600080fd5b5081356001600160401b03811115614fcb57600080fd5b6020830191508360208260061b85010111156145d257600080fd5b600060608284031215614ff857600080fd5b6150006149c3565b905081356001600160401b0381111561501857600080fd5b8201601f8101841361502957600080fd5b61503884823560208401614a3d565b825250602082013560208201526040820135604082015292915050565b60008060008060008060008060006101a08a8c03121561507457600080fd5b89356001600160401b038082111561508b57600080fd5b6150978d838e01614b8b565b909b50995060208c01359150808211156150b057600080fd5b6150bc8d838e01614b8b565b90995097508791506150d18d60408e01614f8f565b96506101408c01359150808211156150e857600080fd5b6150f48d838e01614fa2565b90965094506101608c013591508082111561510e57600080fd5b61511a8d838e01614fe6565b93506101808c013591508082111561513157600080fd5b5061513e8c828d01614fe6565b9150509295985092959850929598565b600080600080600080610160878903121561516857600080fd5b86356001600160401b038082111561517f57600080fd5b61518b8a838b01614b8b565b909850965060208901359150808211156151a457600080fd5b6151b08a838b01614b8b565b90965094508491506151c58a60408b01614f8f565b93506101408901359150808211156151dc57600080fd5b506151e989828a01614fe6565b9150509295509295509295565b6000806040838503121561520957600080fd5b82356152148161494f565b91506020838101356001600160401b0381111561523057600080fd5b8401601f8101861361524157600080fd5b803561524f614f2882614e5f565b81815260059190911b8201830190838101908883111561526e57600080fd5b928401925b8284101561528c57833582529284019290840190615273565b80955050505050509250929050565b6020808252825182820181905260009190848201906040850190845b818110156152d957835163ffffffff16835292840192918401916001016152b7565b50909695505050505050565b600080602083850312156152f857600080fd5b82356001600160401b0381111561530e57600080fd5b61492a85828601614b8b565b6001600160601b0381168114610c4557600080fd5b600082601f83011261534057600080fd5b81356020615350614f2883614e5f565b82815260069290921b8401810191818101908684111561536f57600080fd5b8286015b848110156153c0576040818903121561538c5760008081fd5b6153946149eb565b813561539f81614ae4565b8152818501356153ae8161531a565b81860152835291830191604001615373565b509695505050505050565b600080600060a084860312156153e057600080fd5b6153ea8585614ca3565b925060608401356153fa8161531a565b915060808401356001600160401b0381111561541557600080fd5b6154218682870161532f565b9150509250925092565b600082601f83011261543c57600080fd5b8135602061544c614f2883614e5f565b8281526060928302850182019282820191908785111561546b57600080fd5b8387015b8581101561548e576154818982614ca3565b845292840192810161546f565b5090979650505050505050565b600082601f8301126154ac57600080fd5b813560206154bc614f2883614e5f565b82815260059290921b840181019181810190868411156154db57600080fd5b8286015b848110156153c05780356154f28161531a565b83529183019183016154df565b600082601f83011261551057600080fd5b81356020615520614f2883614e5f565b82815260059290921b8401810191818101908684111561553f57600080fd5b8286015b848110156153c05780356001600160401b038111156155625760008081fd5b6155708986838b010161532f565b845250918301918301615543565b600080600080600080600080610100898b03121561559b57600080fd5b6155a489614af9565b97506155b260208a01614af9565b96506155c060408a01614af9565b95506155ce60608a01614af9565b94506080890135935060a08901356001600160401b03808211156155f157600080fd5b6155fd8c838d0161542b565b945060c08b013591508082111561561357600080fd5b61561f8c838d0161549b565b935060e08b013591508082111561563557600080fd5b506156428b828c016154ff565b9150509295985092959890939650565b815163ffffffff16815260208083015161ffff90811691830191909152604092830151169181019190915260600190565b60208101610dfe8284614c4d565b60208082526019908201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415615704576157046156da565b5060010190565b6020815260006128966020830184614d7c565b60006020828403121561573057600080fd5b815161289681614ae4565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b60006020828403121561579757600080fd5b8151801515811461289657600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b6000808335601e1984360301811261580657600080fd5b8301803591506001600160401b0382111561582057600080fd5b6020019150600581901b36038213156145d257600080fd5b60006020828403121561584a57600080fd5b81516128968161494f565b60008219821115615868576158686156da565b500190565b6000808585111561587d57600080fd5b8386111561588a57600080fd5b5050820193919092039150565b600060c08201888352602060018060a01b03808a16828601526040898187015260c0606087015283895180865260e088019150848b01955060005b818110156158fc578651805160ff16845286015185168684015295850195918301916001016158d2565b505060808701989098525050505060a09091019190915250949350505050565b60006040828403121561592e57600080fd5b6128968383614e82565b60008282101561594a5761594a6156da565b500390565b60018060a01b03841681528260208201526060604082015260006159766060830184614d7c565b95945050505050565b60006020828403121561599157600080fd5b81516001600160c01b038116811461289657600080fd5b6001600160a01b0392831681529116602082015260400190565b634e487b7160e01b600052601260045260246000fd5b6000826159e7576159e76159c2565b500690565b6001600160a01b0383168152604060208201819052600090614adc90830184614d7c565b828152604060208201526000614adc6040830184614d7c565b600181811c90821680615a3d57607f821691505b6020821081141561236d57634e487b7160e01b600052602260045260246000fd5b600060208284031215615a7057600080fd5b5051919050565b6001600160a01b03841681526101608101615a9f602083018580358252602090810135910152565b615ab9606083016040860180358252602090810135910152565b60406080850160a084013760e0820160008152604060c0860182375060006101208301908152835190526020909201516101409091015292915050565b60018060a01b0383168152604060208201526000825160606040840152615b2060a0840182614d7c565b90506020840151606084015260408401516080840152809150509392505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b03841681526040602082018190526000906159769083018486615b41565b60018060a01b03851681528360208201526060604082015260006117dd606083018486615b41565b600082601f830112615bc857600080fd5b81516020615bd8614f2883614e5f565b82815260059290921b84018101918181019086841115615bf757600080fd5b8286015b848110156153c0578051615c0e8161531a565b8352918301918301615bfb565b60008060408385031215615c2e57600080fd5b82516001600160401b0380821115615c4557600080fd5b615c5186838701615bb7565b93506020850151915080821115615c6757600080fd5b50615c7485828601615bb7565b9150509250929050565b838152604060208201526000615976604083018486615b41565b60006020808385031215615cab57600080fd5b82516001600160401b03811115615cc157600080fd5b8301601f81018513615cd257600080fd5b8051615ce0614f2882614e5f565b81815260059190911b82018301908381019087831115615cff57600080fd5b928401925b82841015615d26578351615d178161494f565b82529284019290840190615d04565b979650505050505050565b600060208284031215615d4357600080fd5b81516128968161531a565b600060ff821660ff84168060ff03821115615d6b57615d6b6156da565b019392505050565b60006060820160ff86168352602060018060601b03808716828601526040606081870152838751808652608088019150848901955060005b81811015615ddb57865180516001600160a01b031684528601518516868401529585019591830191600101615dab565b50909a9950505050505050505050565b8051602080830151919081101561236d5760001960209190910360031b1b16919050565b600061ffff80831681811415615e2757615e276156da565b6001019392505050565b600060208284031215615e4357600080fd5b81516001600160e01b03198116811461289657600080fd5b60006001600160601b0382811684821681151582840482111615615e8157615e816156da565b02949350505050565b60006001600160601b0383811680615ea457615ea46159c2565b9216919091049291505056fe5265676973747279436f6f7264696e61746f722e67657451756f72756d4269745265676973747279436f6f7264696e61746f722e7570646174654f70657261745265676973747279436f6f7264696e61746f722e5f76616c6964617465436875ab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd475265676973747279436f6f7264696e61746f722e5f646572656769737465724f4269746d61705574696c732e6f72646572656442797465734172726179546f42a2646970667358221220ea1994fb4fb0a4623dbabd489597c85894506e36c87ecb86eb239f1f0db2be1364736f6c634300080c0033

Verified Source Code Partial Match

Compiler: v0.8.12+commit.f00d7308 EVM: london Optimization: Yes (50 runs)
RegistryCoordinator.sol 6345 lines
// SPDX-License-Identifier: BUSL-1.1
pragma solidity =0.8.12;

/**
 * @title Interface for the `PauserRegistry` contract.
 * @author Layr Labs, Inc.
 * @notice Terms of Service: https://docs.eigenlayer.xyz/overview/terms-of-service
 */
interface IPauserRegistry {
    event PauserStatusChanged(address pauser, bool canPause);

    event UnpauserChanged(address previousUnpauser, address newUnpauser);
    
    /// @notice Mapping of addresses to whether they hold the pauser role.
    function isPauser(address pauser) external view returns (bool);

    /// @notice Unique address that holds the unpauser role. Capable of changing *both* the pauser and unpauser addresses.
    function unpauser() external view returns (address);
}

/**
 * @title The interface for common signature utilities.
 * @author Layr Labs, Inc.
 * @notice Terms of Service: https://docs.eigenlayer.xyz/overview/terms-of-service
 */
interface ISignatureUtils {
    // @notice Struct that bundles together a signature and an expiration time for the signature. Used primarily for stack management.
    struct SignatureWithExpiry {
        // the signature itself, formatted as a single bytes object
        bytes signature;
        // the expiration timestamp (UTC) of the signature
        uint256 expiry;
    }

    // @notice Struct that bundles together a signature, a salt for uniqueness, and an expiration time for the signature. Used primarily for stack management.
    struct SignatureWithSaltAndExpiry {
        // the signature itself, formatted as a single bytes object
        bytes signature;
        // the salt used to generate the signature
        bytes32 salt;
        // the expiration timestamp (UTC) of the signature
        uint256 expiry;
    }
}

/**
 * @title Interface for an `ISocketUpdater` where operators can update their sockets.
 * @author Layr Labs, Inc.
 */
interface ISocketUpdater {
    // EVENTS

    event OperatorSocketUpdate(bytes32 indexed operatorId, string socket);

    // FUNCTIONS
    
    /**
     * @notice Updates the socket of the msg.sender given they are a registered operator
     * @param socket is the new socket of the operator
     */
    function updateSocket(string memory socket) external;
}

/**
 * @title Minimal interface for a `Registry`-type contract.
 * @author Layr Labs, Inc.
 * @notice Terms of Service: https://docs.eigenlayer.xyz/overview/terms-of-service
 * @notice Functions related to the registration process itself have been intentionally excluded
 * because their function signatures may vary significantly.
 */
interface IRegistry {
    function registryCoordinator() external view returns (address);
}

// several functions are taken or adapted from https://github.com/HarryR/solcrypto/blob/master/contracts/altbn128.sol (MIT license):
// Copyright 2017 Christian Reitwiessner
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to
// deal in the Software without restriction, including without limitation the
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
// sell copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
// IN THE SOFTWARE.

// The remainder of the code in this library is written by LayrLabs Inc. and is also under an MIT license

/**
 * @title Library for operations on the BN254 elliptic curve.
 * @author Layr Labs, Inc.
 * @notice Terms of Service: https://docs.eigenlayer.xyz/overview/terms-of-service
 * @notice Contains BN254 parameters, common operations (addition, scalar mul, pairing), and BLS signature functionality.
 */
library BN254 {
    // modulus for the underlying field F_p of the elliptic curve
    uint256 internal constant FP_MODULUS =
        21888242871839275222246405745257275088696311157297823662689037894645226208583;
    // modulus for the underlying field F_r of the elliptic curve
    uint256 internal constant FR_MODULUS =
        21888242871839275222246405745257275088548364400416034343698204186575808495617;

    struct G1Point {
        uint256 X;
        uint256 Y;
    }

    // Encoding of field elements is: X[1] * i + X[0]
    struct G2Point {
        uint256[2] X;
        uint256[2] Y;
    }

    function generatorG1() internal pure returns (G1Point memory) {
        return G1Point(1, 2);
    }

    // generator of group G2
    /// @dev Generator point in F_q2 is of the form: (x0 + ix1, y0 + iy1).
    uint256 internal constant G2x1 = 11559732032986387107991004021392285783925812861821192530917403151452391805634;
    uint256 internal constant G2x0 = 10857046999023057135944570762232829481370756359578518086990519993285655852781;
    uint256 internal constant G2y1 = 4082367875863433681332203403145435568316851327593401208105741076214120093531;
    uint256 internal constant G2y0 = 8495653923123431417604973247489272438418190587263600148770280649306958101930;

    /// @notice returns the G2 generator
    /// @dev mind the ordering of the 1s and 0s!
    ///      this is because of the (unknown to us) convention used in the bn254 pairing precompile contract
    ///      "Elements a * i + b of F_p^2 are encoded as two elements of F_p, (a, b)."
    ///      https://github.com/ethereum/EIPs/blob/master/EIPS/eip-197.md#encoding
    function generatorG2() internal pure returns (G2Point memory) {
        return G2Point([G2x1, G2x0], [G2y1, G2y0]);
    }

    // negation of the generator of group G2
    /// @dev Generator point in F_q2 is of the form: (x0 + ix1, y0 + iy1).
    uint256 internal constant nG2x1 = 11559732032986387107991004021392285783925812861821192530917403151452391805634;
    uint256 internal constant nG2x0 = 10857046999023057135944570762232829481370756359578518086990519993285655852781;
    uint256 internal constant nG2y1 = 17805874995975841540914202342111839520379459829704422454583296818431106115052;
    uint256 internal constant nG2y0 = 13392588948715843804641432497768002650278120570034223513918757245338268106653;

    function negGeneratorG2() internal pure returns (G2Point memory) {
        return G2Point([nG2x1, nG2x0], [nG2y1, nG2y0]);
    }

    bytes32 internal constant powersOfTauMerkleRoot =
        0x22c998e49752bbb1918ba87d6d59dd0e83620a311ba91dd4b2cc84990b31b56f;

    /**
     * @param p Some point in G1.
     * @return The negation of `p`, i.e. p.plus(p.negate()) should be zero.
     */
    function negate(G1Point memory p) internal pure returns (G1Point memory) {
        // The prime q in the base field F_q for G1
        if (p.X == 0 && p.Y == 0) {
            return G1Point(0, 0);
        } else {
            return G1Point(p.X, FP_MODULUS - (p.Y % FP_MODULUS));
        }
    }

    /**
     * @return r the sum of two points of G1
     */
    function plus(G1Point memory p1, G1Point memory p2) internal view returns (G1Point memory r) {
        uint256[4] memory input;
        input[0] = p1.X;
        input[1] = p1.Y;
        input[2] = p2.X;
        input[3] = p2.Y;
        bool success;

        // solium-disable-next-line security/no-inline-assembly
        assembly {
            success := staticcall(sub(gas(), 2000), 6, input, 0x80, r, 0x40)
            // Use "invalid" to make gas estimation work
            switch success
            case 0 {
                invalid()
            }
        }

        require(success, "ec-add-failed");
    }

    /**
     * @notice an optimized ecMul implementation that takes O(log_2(s)) ecAdds
     * @param p the point to multiply
     * @param s the scalar to multiply by
     * @dev this function is only safe to use if the scalar is 9 bits or less
     */ 
    function scalar_mul_tiny(BN254.G1Point memory p, uint16 s) internal view returns (BN254.G1Point memory) {
        require(s < 2**9, "scalar-too-large");

        // if s is 1 return p
        if(s == 1) {
            return p;
        }

        // the accumulated product to return
        BN254.G1Point memory acc = BN254.G1Point(0, 0);
        // the 2^n*p to add to the accumulated product in each iteration
        BN254.G1Point memory p2n = p;
        // value of most significant bit
        uint16 m = 1;
        // index of most significant bit
        uint8 i = 0;

        //loop until we reach the most significant bit
        while(s >= m){
            unchecked {
                // if the  current bit is 1, add the 2^n*p to the accumulated product
                if ((s >> i) & 1 == 1) {
                    acc = plus(acc, p2n);
                }
                // double the 2^n*p for the next iteration
                p2n = plus(p2n, p2n);

                // increment the index and double the value of the most significant bit
                m <<= 1;
                ++i;
            }
        }
        
        // return the accumulated product
        return acc;
    }

    /**
     * @return r the product of a point on G1 and a scalar, i.e.
     *         p == p.scalar_mul(1) and p.plus(p) == p.scalar_mul(2) for all
     *         points p.
     */
    function scalar_mul(G1Point memory p, uint256 s) internal view returns (G1Point memory r) {
        uint256[3] memory input;
        input[0] = p.X;
        input[1] = p.Y;
        input[2] = s;
        bool success;
        // solium-disable-next-line security/no-inline-assembly
        assembly {
            success := staticcall(sub(gas(), 2000), 7, input, 0x60, r, 0x40)
            // Use "invalid" to make gas estimation work
            switch success
            case 0 {
                invalid()
            }
        }
        require(success, "ec-mul-failed");
    }

    /**
     *  @return The result of computing the pairing check
     *         e(p1[0], p2[0]) *  .... * e(p1[n], p2[n]) == 1
     *         For example,
     *         pairing([P1(), P1().negate()], [P2(), P2()]) should return true.
     */
    function pairing(
        G1Point memory a1,
        G2Point memory a2,
        G1Point memory b1,
        G2Point memory b2
    ) internal view returns (bool) {
        G1Point[2] memory p1 = [a1, b1];
        G2Point[2] memory p2 = [a2, b2];

        uint256[12] memory input;

        for (uint256 i = 0; i < 2; i++) {
            uint256 j = i * 6;
            input[j + 0] = p1[i].X;
            input[j + 1] = p1[i].Y;
            input[j + 2] = p2[i].X[0];
            input[j + 3] = p2[i].X[1];
            input[j + 4] = p2[i].Y[0];
            input[j + 5] = p2[i].Y[1];
        }

        uint256[1] memory out;
        bool success;

        // solium-disable-next-line security/no-inline-assembly
        assembly {
            success := staticcall(sub(gas(), 2000), 8, input, mul(12, 0x20), out, 0x20)
            // Use "invalid" to make gas estimation work
            switch success
            case 0 {
                invalid()
            }
        }

        require(success, "pairing-opcode-failed");

        return out[0] != 0;
    }

    /**
     * @notice This function is functionally the same as pairing(), however it specifies a gas limit
     *         the user can set, as a precompile may use the entire gas budget if it reverts.
     */
    function safePairing(
        G1Point memory a1,
        G2Point memory a2,
        G1Point memory b1,
        G2Point memory b2,
        uint256 pairingGas
    ) internal view returns (bool, bool) {
        G1Point[2] memory p1 = [a1, b1];
        G2Point[2] memory p2 = [a2, b2];

        uint256[12] memory input;

        for (uint256 i = 0; i < 2; i++) {
            uint256 j = i * 6;
            input[j + 0] = p1[i].X;
            input[j + 1] = p1[i].Y;
            input[j + 2] = p2[i].X[0];
            input[j + 3] = p2[i].X[1];
            input[j + 4] = p2[i].Y[0];
            input[j + 5] = p2[i].Y[1];
        }

        uint256[1] memory out;
        bool success;

        // solium-disable-next-line security/no-inline-assembly
        assembly {
            success := staticcall(pairingGas, 8, input, mul(12, 0x20), out, 0x20)
        }

        //Out is the output of the pairing precompile, either 0 or 1 based on whether the two pairings are equal.
        //Success is true if the precompile actually goes through (aka all inputs are valid)

        return (success, out[0] != 0);
    }

    /// @return hashedG1 the keccak256 hash of the G1 Point
    /// @dev used for BLS signatures
    function hashG1Point(BN254.G1Point memory pk) internal pure returns (bytes32 hashedG1) {
        assembly {
            mstore(0, mload(pk))
            mstore(0x20, mload(add(0x20, pk)))
            hashedG1 := keccak256(0, 0x40)
        }
    }

    /// @return the keccak256 hash of the G2 Point
    /// @dev used for BLS signatures
    function hashG2Point(
        BN254.G2Point memory pk
    ) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked(pk.X[0], pk.X[1], pk.Y[0], pk.Y[1]));
    }

    /**
     * @notice adapted from https://github.com/HarryR/solcrypto/blob/master/contracts/altbn128.sol
     */
    function hashToG1(bytes32 _x) internal view returns (G1Point memory) {
        uint256 beta = 0;
        uint256 y = 0;

        uint256 x = uint256(_x) % FP_MODULUS;

        while (true) {
            (beta, y) = findYFromX(x);

            // y^2 == beta
            if( beta == mulmod(y, y, FP_MODULUS) ) {
                return G1Point(x, y);
            }

            x = addmod(x, 1, FP_MODULUS);
        }
        return G1Point(0, 0);
    }

    /**
     * Given X, find Y
     *
     *   where y = sqrt(x^3 + b)
     *
     * Returns: (x^3 + b), y
     */
    function findYFromX(uint256 x) internal view returns (uint256, uint256) {
        // beta = (x^3 + b) % p
        uint256 beta = addmod(mulmod(mulmod(x, x, FP_MODULUS), x, FP_MODULUS), 3, FP_MODULUS);

        // y^2 = x^3 + b
        // this acts like: y = sqrt(beta) = beta^((p+1) / 4)
        uint256 y = expMod(beta, 0xc19139cb84c680a6e14116da060561765e05aa45a1c72a34f082305b61f3f52, FP_MODULUS);

        return (beta, y);
    }

    function expMod(uint256 _base, uint256 _exponent, uint256 _modulus) internal view returns (uint256 retval) {
        bool success;
        uint256[1] memory output;
        uint[6] memory input;
        input[0] = 0x20; // baseLen = new(big.Int).SetBytes(getData(input, 0, 32))
        input[1] = 0x20; // expLen  = new(big.Int).SetBytes(getData(input, 32, 32))
        input[2] = 0x20; // modLen  = new(big.Int).SetBytes(getData(input, 64, 32))
        input[3] = _base;
        input[4] = _exponent;
        input[5] = _modulus;
        assembly {
            success := staticcall(sub(gas(), 2000), 5, input, 0xc0, output, 0x20)
            // Use "invalid" to make gas estimation work
            switch success
            case 0 {
                invalid()
            }
        }
        require(success, "BN254.expMod: call failure");
        return output[0];
    }
}

/**
 * @title Minimal interface for a registry that keeps track of aggregate operator public keys across many quorums.
 * @author Layr Labs, Inc.
 */
interface IBLSApkRegistry is IRegistry {
    // STRUCTS
    /// @notice Data structure used to track the history of the Aggregate Public Key of all operators
    struct ApkUpdate {
        // first 24 bytes of keccak256(apk_x0, apk_x1, apk_y0, apk_y1)
        bytes24 apkHash;
        // block number at which the update occurred
        uint32 updateBlockNumber;
        // block number at which the next update occurred
        uint32 nextUpdateBlockNumber;
    }

    /**
     * @notice Struct used when registering a new public key
     * @param pubkeyRegistrationSignature is the registration message signed by the private key of the operator
     * @param pubkeyG1 is the corresponding G1 public key of the operator 
     * @param pubkeyG2 is the corresponding G2 public key of the operator
     */     
    struct PubkeyRegistrationParams {
        BN254.G1Point pubkeyRegistrationSignature;
        BN254.G1Point pubkeyG1;
        BN254.G2Point pubkeyG2;
    }

    // EVENTS
    /// @notice Emitted when `operator` registers with the public keys `pubkeyG1` and `pubkeyG2`.
    event NewPubkeyRegistration(address indexed operator, BN254.G1Point pubkeyG1, BN254.G2Point pubkeyG2);

    // @notice Emitted when a new operator pubkey is registered for a set of quorums
    event OperatorAddedToQuorums(
        address operator,
        bytes32 operatorId,
        bytes quorumNumbers
    );

    // @notice Emitted when an operator pubkey is removed from a set of quorums
    event OperatorRemovedFromQuorums(
        address operator, 
        bytes32 operatorId,
        bytes quorumNumbers
    );

    /**
     * @notice Registers the `operator`'s pubkey for the specified `quorumNumbers`.
     * @param operator The address of the operator to register.
     * @param quorumNumbers The quorum numbers the operator is registering for, where each byte is an 8 bit integer quorumNumber.
     * @dev access restricted to the RegistryCoordinator
     * @dev Preconditions (these are assumed, not validated in this contract):
     *         1) `quorumNumbers` has no duplicates
     *         2) `quorumNumbers.length` != 0
     *         3) `quorumNumbers` is ordered in ascending order
     *         4) the operator is not already registered
     */
    function registerOperator(address operator, bytes calldata quorumNumbers) external;

    /**
     * @notice Deregisters the `operator`'s pubkey for the specified `quorumNumbers`.
     * @param operator The address of the operator to deregister.
     * @param quorumNumbers The quorum numbers the operator is deregistering from, where each byte is an 8 bit integer quorumNumber.
     * @dev access restricted to the RegistryCoordinator
     * @dev Preconditions (these are assumed, not validated in this contract):
     *         1) `quorumNumbers` has no duplicates
     *         2) `quorumNumbers.length` != 0
     *         3) `quorumNumbers` is ordered in ascending order
     *         4) the operator is not already deregistered
     *         5) `quorumNumbers` is a subset of the quorumNumbers that the operator is registered for
     */ 
    function deregisterOperator(address operator, bytes calldata quorumNumbers) external;
    
    /**
     * @notice Initializes a new quorum by pushing its first apk update
     * @param quorumNumber The number of the new quorum
     */
    function initializeQuorum(uint8 quorumNumber) external;

    /**
     * @notice mapping from operator address to pubkey hash.
     * Returns *zero* if the `operator` has never registered, and otherwise returns the hash of the public key of the operator.
     */
    function operatorToPubkeyHash(address operator) external view returns (bytes32);

    /**
     * @notice mapping from pubkey hash to operator address.
     * Returns *zero* if no operator has ever registered the public key corresponding to `pubkeyHash`,
     * and otherwise returns the (unique) registered operator who owns the BLS public key that is the preimage of `pubkeyHash`.
     */
    function pubkeyHashToOperator(bytes32 pubkeyHash) external view returns (address);

    /**
     * @notice Called by the RegistryCoordinator register an operator as the owner of a BLS public key.
     * @param operator is the operator for whom the key is being registered
     * @param params contains the G1 & G2 public keys of the operator, and a signature proving their ownership
     * @param pubkeyRegistrationMessageHash is a hash that the operator must sign to prove key ownership
     */
    function registerBLSPublicKey(
        address operator,
        PubkeyRegistrationParams calldata params,
        BN254.G1Point calldata pubkeyRegistrationMessageHash
    ) external returns (bytes32 operatorId);

    /**
     * @notice Returns the pubkey and pubkey hash of an operator
     * @dev Reverts if the operator has not registered a valid pubkey
     */
    function getRegisteredPubkey(address operator) external view returns (BN254.G1Point memory, bytes32);

    /// @notice Returns the current APK for the provided `quorumNumber `
    function getApk(uint8 quorumNumber) external view returns (BN254.G1Point memory);

    /// @notice Returns the index of the quorumApk index at `blockNumber` for the provided `quorumNumber`
    function getApkIndicesAtBlockNumber(bytes calldata quorumNumbers, uint256 blockNumber) external view returns(uint32[] memory);

    /// @notice Returns the `ApkUpdate` struct at `index` in the list of APK updates for the `quorumNumber`
    function getApkUpdateAtIndex(uint8 quorumNumber, uint256 index) external view returns (ApkUpdate memory);

    /// @notice Returns the operator address for the given `pubkeyHash`
    function getOperatorFromPubkeyHash(bytes32 pubkeyHash) external view returns (address);

    /**
     * @notice get 24 byte hash of the apk of `quorumNumber` at `blockNumber` using the provided `index`;
     * called by checkSignatures in BLSSignatureChecker.sol.
     * @param quorumNumber is the quorum whose ApkHash is being retrieved
     * @param blockNumber is the number of the block for which the latest ApkHash will be retrieved
     * @param index is the index of the apkUpdate being retrieved from the list of quorum apkUpdates in storage
     */
    function getApkHashAtBlockNumberAndIndex(uint8 quorumNumber, uint32 blockNumber, uint256 index) external view returns (bytes24);

    /// @notice returns the ID used to identify the `operator` within this AVS.
    /// @dev Returns zero in the event that the `operator` has never registered for the AVS
    function getOperatorId(address operator) external view returns (bytes32);
}

// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

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

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

    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address from, address to, uint256 amount) external returns (bool);
}

/**
 * @title Minimal interface for an `Strategy` contract.
 * @author Layr Labs, Inc.
 * @notice Terms of Service: https://docs.eigenlayer.xyz/overview/terms-of-service
 * @notice Custom `Strategy` implementations may expand extensively on this interface.
 */
interface IStrategy {
    /**
     * @notice Used to deposit tokens into this Strategy
     * @param token is the ERC20 token being deposited
     * @param amount is the amount of token being deposited
     * @dev This function is only callable by the strategyManager contract. It is invoked inside of the strategyManager's
     * `depositIntoStrategy` function, and individual share balances are recorded in the strategyManager as well.
     * @return newShares is the number of new shares issued at the current exchange ratio.
     */
    function deposit(IERC20 token, uint256 amount) external returns (uint256);

    /**
     * @notice Used to withdraw tokens from this Strategy, to the `recipient`'s address
     * @param recipient is the address to receive the withdrawn funds
     * @param token is the ERC20 token being transferred out
     * @param amountShares is the amount of shares being withdrawn
     * @dev This function is only callable by the strategyManager contract. It is invoked inside of the strategyManager's
     * other functions, and individual share balances are recorded in the strategyManager as well.
     */
    function withdraw(address recipient, IERC20 token, uint256 amountShares) external;

    /**
     * @notice Used to convert a number of shares to the equivalent amount of underlying tokens for this strategy.
     * @notice In contrast to `sharesToUnderlyingView`, this function **may** make state modifications
     * @param amountShares is the amount of shares to calculate its conversion into the underlying token
     * @return The amount of underlying tokens corresponding to the input `amountShares`
     * @dev Implementation for these functions in particular may vary significantly for different strategies
     */
    function sharesToUnderlying(uint256 amountShares) external returns (uint256);

    /**
     * @notice Used to convert an amount of underlying tokens to the equivalent amount of shares in this strategy.
     * @notice In contrast to `underlyingToSharesView`, this function **may** make state modifications
     * @param amountUnderlying is the amount of `underlyingToken` to calculate its conversion into strategy shares
     * @return The amount of underlying tokens corresponding to the input `amountShares`
     * @dev Implementation for these functions in particular may vary significantly for different strategies
     */
    function underlyingToShares(uint256 amountUnderlying) external returns (uint256);

    /**
     * @notice convenience function for fetching the current underlying value of all of the `user`'s shares in
     * this strategy. In contrast to `userUnderlyingView`, this function **may** make state modifications
     */
    function userUnderlying(address user) external returns (uint256);

    /**
     * @notice convenience function for fetching the current total shares of `user` in this strategy, by
     * querying the `strategyManager` contract
     */
    function shares(address user) external view returns (uint256);

    /**
     * @notice Used to convert a number of shares to the equivalent amount of underlying tokens for this strategy.
     * @notice In contrast to `sharesToUnderlying`, this function guarantees no state modifications
     * @param amountShares is the amount of shares to calculate its conversion into the underlying token
     * @return The amount of shares corresponding to the input `amountUnderlying`
     * @dev Implementation for these functions in particular may vary significantly for different strategies
     */
    function sharesToUnderlyingView(uint256 amountShares) external view returns (uint256);

    /**
     * @notice Used to convert an amount of underlying tokens to the equivalent amount of shares in this strategy.
     * @notice In contrast to `underlyingToShares`, this function guarantees no state modifications
     * @param amountUnderlying is the amount of `underlyingToken` to calculate its conversion into strategy shares
     * @return The amount of shares corresponding to the input `amountUnderlying`
     * @dev Implementation for these functions in particular may vary significantly for different strategies
     */
    function underlyingToSharesView(uint256 amountUnderlying) external view returns (uint256);

    /**
     * @notice convenience function for fetching the current underlying value of all of the `user`'s shares in
     * this strategy. In contrast to `userUnderlying`, this function guarantees no state modifications
     */
    function userUnderlyingView(address user) external view returns (uint256);

    /// @notice The underlying token for shares in this Strategy
    function underlyingToken() external view returns (IERC20);

    /// @notice The total number of extant shares in this Strategy
    function totalShares() external view returns (uint256);

    /// @notice Returns either a brief string explaining the strategy's goal & purpose, or a link to metadata that explains in more detail.
    function explanation() external view returns (string memory);
}

/**
 * @title Interface for the primary 'slashing' contract for EigenLayer.
 * @author Layr Labs, Inc.
 * @notice Terms of Service: https://docs.eigenlayer.xyz/overview/terms-of-service
 * @notice See the `Slasher` contract itself for implementation details.
 */
interface ISlasher {
    // struct used to store information about the current state of an operator's obligations to middlewares they are serving
    struct MiddlewareTimes {
        // The update block for the middleware whose most recent update was earliest, i.e. the 'stalest' update out of all middlewares the operator is serving
        uint32 stalestUpdateBlock;
        // The latest 'serveUntilBlock' from all of the middleware that the operator is serving
        uint32 latestServeUntilBlock;
    }

    // struct used to store details relevant to a single middleware that an operator has opted-in to serving
    struct MiddlewareDetails {
        // the block at which the contract begins being able to finalize the operator's registration with the service via calling `recordFirstStakeUpdate`
        uint32 registrationMayBeginAtBlock;
        // the block before which the contract is allowed to slash the user
        uint32 contractCanSlashOperatorUntilBlock;
        // the block at which the middleware's view of the operator's stake was most recently updated
        uint32 latestUpdateBlock;
    }

    /// @notice Emitted when a middleware times is added to `operator`'s array.
    event MiddlewareTimesAdded(
        address operator,
        uint256 index,
        uint32 stalestUpdateBlock,
        uint32 latestServeUntilBlock
    );

    /// @notice Emitted when `operator` begins to allow `contractAddress` to slash them.
    event OptedIntoSlashing(address indexed operator, address indexed contractAddress);

    /// @notice Emitted when `contractAddress` signals that it will no longer be able to slash `operator` after the `contractCanSlashOperatorUntilBlock`.
    event SlashingAbilityRevoked(
        address indexed operator,
        address indexed contractAddress,
        uint32 contractCanSlashOperatorUntilBlock
    );

    /**
     * @notice Emitted when `slashingContract` 'freezes' the `slashedOperator`.
     * @dev The `slashingContract` must have permission to slash the `slashedOperator`, i.e. `canSlash(slasherOperator, slashingContract)` must return 'true'.
     */
    event OperatorFrozen(address indexed slashedOperator, address indexed slashingContract);

    /// @notice Emitted when `previouslySlashedAddress` is 'unfrozen', allowing them to again move deposited funds within EigenLayer.
    event FrozenStatusReset(address indexed previouslySlashedAddress);

    /**
     * @notice Gives the `contractAddress` permission to slash the funds of the caller.
     * @dev Typically, this function must be called prior to registering for a middleware.
     */
    function optIntoSlashing(address contractAddress) external;

    /**
     * @notice Used for 'slashing' a certain operator.
     * @param toBeFrozen The operator to be frozen.
     * @dev Technically the operator is 'frozen' (hence the name of this function), and then subject to slashing pending a decision by a human-in-the-loop.
     * @dev The operator must have previously given the caller (which should be a contract) the ability to slash them, through a call to `optIntoSlashing`.
     */
    function freezeOperator(address toBeFrozen) external;

    /**
     * @notice Removes the 'frozen' status from each of the `frozenAddresses`
     * @dev Callable only by the contract owner (i.e. governance).
     */
    function resetFrozenStatus(address[] calldata frozenAddresses) external;

    /**
     * @notice this function is a called by middlewares during an operator's registration to make sure the operator's stake at registration
     *         is slashable until serveUntil
     * @param operator the operator whose stake update is being recorded
     * @param serveUntilBlock the block until which the operator's stake at the current block is slashable
     * @dev adds the middleware's slashing contract to the operator's linked list
     */
    function recordFirstStakeUpdate(address operator, uint32 serveUntilBlock) external;

    /**
     * @notice this function is a called by middlewares during a stake update for an operator (perhaps to free pending withdrawals)
     *         to make sure the operator's stake at updateBlock is slashable until serveUntil
     * @param operator the operator whose stake update is being recorded
     * @param updateBlock the block for which the stake update is being recorded
     * @param serveUntilBlock the block until which the operator's stake at updateBlock is slashable
     * @param insertAfter the element of the operators linked list that the currently updating middleware should be inserted after
     * @dev insertAfter should be calculated offchain before making the transaction that calls this. this is subject to race conditions,
     *      but it is anticipated to be rare and not detrimental.
     */
    function recordStakeUpdate(
        address operator,
        uint32 updateBlock,
        uint32 serveUntilBlock,
        uint256 insertAfter
    ) external;

    /**
     * @notice this function is a called by middlewares during an operator's deregistration to make sure the operator's stake at deregistration
     *         is slashable until serveUntil
     * @param operator the operator whose stake update is being recorded
     * @param serveUntilBlock the block until which the operator's stake at the current block is slashable
     * @dev removes the middleware's slashing contract to the operator's linked list and revokes the middleware's (i.e. caller's) ability to
     * slash `operator` once `serveUntil` is reached
     */
    function recordLastStakeUpdateAndRevokeSlashingAbility(address operator, uint32 serveUntilBlock) external;

    /// @notice The StrategyManager contract of EigenLayer
    function strategyManager() external view returns (IStrategyManager);

    /// @notice The DelegationManager contract of EigenLayer
    function delegation() external view returns (IDelegationManager);

    /**
     * @notice Used to determine whether `staker` is actively 'frozen'. If a staker is frozen, then they are potentially subject to
     * slashing of their funds, and cannot cannot deposit or withdraw from the strategyManager until the slashing process is completed
     * and the staker's status is reset (to 'unfrozen').
     * @param staker The staker of interest.
     * @return Returns 'true' if `staker` themselves has their status set to frozen, OR if the staker is delegated
     * to an operator who has their status set to frozen. Otherwise returns 'false'.
     */
    function isFrozen(address staker) external view returns (bool);

    /// @notice Returns true if `slashingContract` is currently allowed to slash `toBeSlashed`.
    function canSlash(address toBeSlashed, address slashingContract) external view returns (bool);

    /// @notice Returns the block until which `serviceContract` is allowed to slash the `operator`.
    function contractCanSlashOperatorUntilBlock(
        address operator,
        address serviceContract
    ) external view returns (uint32);

    /// @notice Returns the block at which the `serviceContract` last updated its view of the `operator`'s stake
    function latestUpdateBlock(address operator, address serviceContract) external view returns (uint32);

    /// @notice A search routine for finding the correct input value of `insertAfter` to `recordStakeUpdate` / `_updateMiddlewareList`.
    function getCorrectValueForInsertAfter(address operator, uint32 updateBlock) external view returns (uint256);

    /**
     * @notice Returns 'true' if `operator` can currently complete a withdrawal started at the `withdrawalStartBlock`, with `middlewareTimesIndex` used
     * to specify the index of a `MiddlewareTimes` struct in the operator's list (i.e. an index in `operatorToMiddlewareTimes[operator]`). The specified
     * struct is consulted as proof of the `operator`'s ability (or lack thereof) to complete the withdrawal.
     * This function will return 'false' if the operator cannot currently complete a withdrawal started at the `withdrawalStartBlock`, *or* in the event
     * that an incorrect `middlewareTimesIndex` is supplied, even if one or more correct inputs exist.
     * @param operator Either the operator who queued the withdrawal themselves, or if the withdrawing party is a staker who delegated to an operator,
     * this address is the operator *who the staker was delegated to* at the time of the `withdrawalStartBlock`.
     * @param withdrawalStartBlock The block number at which the withdrawal was initiated.
     * @param middlewareTimesIndex Indicates an index in `operatorToMiddlewareTimes[operator]` to consult as proof of the `operator`'s ability to withdraw
     * @dev The correct `middlewareTimesIndex` input should be computable off-chain.
     */
    function canWithdraw(
        address operator,
        uint32 withdrawalStartBlock,
        uint256 middlewareTimesIndex
    ) external returns (bool);

    /**
     * operator =>
     *  [
     *      (
     *          the least recent update block of all of the middlewares it's serving/served,
     *          latest time that the stake bonded at that update needed to serve until
     *      )
     *  ]
     */
    function operatorToMiddlewareTimes(
        address operator,
        uint256 arrayIndex
    ) external view returns (MiddlewareTimes memory);

    /// @notice Getter function for fetching `operatorToMiddlewareTimes[operator].length`
    function middlewareTimesLength(address operator) external view returns (uint256);

    /// @notice Getter function for fetching `operatorToMiddlewareTimes[operator][index].stalestUpdateBlock`.
    function getMiddlewareTimesIndexStalestUpdateBlock(address operator, uint32 index) external view returns (uint32);

    /// @notice Getter function for fetching `operatorToMiddlewareTimes[operator][index].latestServeUntil`.
    function getMiddlewareTimesIndexServeUntilBlock(address operator, uint32 index) external view returns (uint32);

    /// @notice Getter function for fetching `_operatorToWhitelistedContractsByUpdate[operator].size`.
    function operatorWhitelistedContractsLinkedListSize(address operator) external view returns (uint256);

    /// @notice Getter function for fetching a single node in the operator's linked list (`_operatorToWhitelistedContractsByUpdate[operator]`).
    function operatorWhitelistedContractsLinkedListEntry(
        address operator,
        address node
    ) external view returns (bool, uint256, uint256);
}

// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)

/**
 * @dev This is the interface that {BeaconProxy} expects of its beacon.
 */
interface IBeacon {
    /**
     * @dev Must return an address that can be used as a delegate call target.
     *
     * {BeaconProxy} will check that this address is a contract.
     */
    function implementation() external view returns (address);
}

// ┏━━━┓━┏┓━┏┓━━┏━━━┓━━┏━━━┓━━━━┏━━━┓━━━━━━━━━━━━━━━━━━━┏┓━━━━━┏━━━┓━━━━━━━━━┏┓━━━━━━━━━━━━━━┏┓━
// ┃┏━━┛┏┛┗┓┃┃━━┃┏━┓┃━━┃┏━┓┃━━━━┗┓┏┓┃━━━━━━━━━━━━━━━━━━┏┛┗┓━━━━┃┏━┓┃━━━━━━━━┏┛┗┓━━━━━━━━━━━━┏┛┗┓
// ┃┗━━┓┗┓┏┛┃┗━┓┗┛┏┛┃━━┃┃━┃┃━━━━━┃┃┃┃┏━━┓┏━━┓┏━━┓┏━━┓┏┓┗┓┏┛━━━━┃┃━┗┛┏━━┓┏━┓━┗┓┏┛┏━┓┏━━┓━┏━━┓┗┓┏┛
// ┃┏━━┛━┃┃━┃┏┓┃┏━┛┏┛━━┃┃━┃┃━━━━━┃┃┃┃┃┏┓┃┃┏┓┃┃┏┓┃┃━━┫┣┫━┃┃━━━━━┃┃━┏┓┃┏┓┃┃┏┓┓━┃┃━┃┏┛┗━┓┃━┃┏━┛━┃┃━
// ┃┗━━┓━┃┗┓┃┃┃┃┃┃┗━┓┏┓┃┗━┛┃━━━━┏┛┗┛┃┃┃━┫┃┗┛┃┃┗┛┃┣━━┃┃┃━┃┗┓━━━━┃┗━┛┃┃┗┛┃┃┃┃┃━┃┗┓┃┃━┃┗┛┗┓┃┗━┓━┃┗┓
// ┗━━━┛━┗━┛┗┛┗┛┗━━━┛┗┛┗━━━┛━━━━┗━━━┛┗━━┛┃┏━┛┗━━┛┗━━┛┗┛━┗━┛━━━━┗━━━┛┗━━┛┗┛┗┛━┗━┛┗┛━┗━━━┛┗━━┛━┗━┛
// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┃┃━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┗┛━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

// This interface is designed to be compatible with the Vyper version.
/// @notice This is the Ethereum 2.0 deposit contract interface.
/// For more information see the Phase 0 specification under https://github.com/ethereum/eth2.0-specs
interface IETHPOSDeposit {
    /// @notice A processed deposit event.
    event DepositEvent(bytes pubkey, bytes withdrawal_credentials, bytes amount, bytes signature, bytes index);

    /// @notice Submit a Phase 0 DepositData object.
    /// @param pubkey A BLS12-381 public key.
    /// @param withdrawal_credentials Commitment to a public key for withdrawals.
    /// @param signature A BLS12-381 signature.
    /// @param deposit_data_root The SHA-256 hash of the SSZ-encoded DepositData object.
    /// Used as a protection against malformed input.
    function deposit(
        bytes calldata pubkey,
        bytes calldata withdrawal_credentials,
        bytes calldata signature,
        bytes32 deposit_data_root
    ) external payable;

    /// @notice Query the current deposit root hash.
    /// @return The deposit root hash.
    function get_deposit_root() external view returns (bytes32);

    /// @notice Query the current deposit count.
    /// @return The deposit count encoded as a little endian 64-bit number.
    function get_deposit_count() external view returns (bytes memory);
}

// Adapted from OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/MerkleProof.sol)

/**
 * @dev These functions deal with verification of Merkle Tree proofs.
 *
 * The tree and the proofs can be generated using our
 * https://github.com/OpenZeppelin/merkle-tree[JavaScript library].
 * You will find a quickstart guide in the readme.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 * OpenZeppelin's JavaScript library generates merkle trees that are safe
 * against this attack out of the box.
 */
library Merkle {
    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. The tree is built assuming `leaf` is
     * the 0 indexed `index`'th leaf from the bottom left of the tree.
     *
     * Note this is for a Merkle tree using the keccak/sha3 hash function
     */
    function verifyInclusionKeccak(
        bytes memory proof,
        bytes32 root,
        bytes32 leaf,
        uint256 index
    ) internal pure returns (bool) {
        return processInclusionProofKeccak(proof, leaf, index) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. The tree is built assuming `leaf` is
     * the 0 indexed `index`'th leaf from the bottom left of the tree.
     *
     * _Available since v4.4._
     *
     * Note this is for a Merkle tree using the keccak/sha3 hash function
     */
    function processInclusionProofKeccak(
        bytes memory proof,
        bytes32 leaf,
        uint256 index
    ) internal pure returns (bytes32) {
        require(
            proof.length != 0 && proof.length % 32 == 0,
            "Merkle.processInclusionProofKeccak: proof length should be a non-zero multiple of 32"
        );
        bytes32 computedHash = leaf;
        for (uint256 i = 32; i <= proof.length; i += 32) {
            if (index % 2 == 0) {
                // if ith bit of index is 0, then computedHash is a left sibling
                assembly {
                    mstore(0x00, computedHash)
                    mstore(0x20, mload(add(proof, i)))
                    computedHash := keccak256(0x00, 0x40)
                    index := div(index, 2)
                }
            } else {
                // if ith bit of index is 1, then computedHash is a right sibling
                assembly {
                    mstore(0x00, mload(add(proof, i)))
                    mstore(0x20, computedHash)
                    computedHash := keccak256(0x00, 0x40)
                    index := div(index, 2)
                }
            }
        }
        return computedHash;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. The tree is built assuming `leaf` is
     * the 0 indexed `index`'th leaf from the bottom left of the tree.
     *
     * Note this is for a Merkle tree using the sha256 hash function
     */
    function verifyInclusionSha256(
        bytes memory proof,
        bytes32 root,
        bytes32 leaf,
        uint256 index
    ) internal view returns (bool) {
        return processInclusionProofSha256(proof, leaf, index) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches...

// [truncated — 295266 bytes total]

Read Contract

OPERATOR_CHURN_APPROVAL_TYPEHASH 0xca0de882 → bytes32
PUBKEY_REGISTRATION_TYPEHASH 0x9feab859 → bytes32
blsApkRegistry 0x5df45946 → address
calculateOperatorChurnApprovalDigestHash 0xaa3f680c → bytes32
churnApprover 0x054310e6 → address
eip712Domain 0x84b0196e → bytes1, string, string, uint256, address, bytes32, uint256[]
ejector 0x28f61b31 → address
getCurrentQuorumBitmap 0x871ef049 → uint192
getOperator 0x5865c60c → tuple
getOperatorFromId 0x296bb064 → address
getOperatorId 0x13542a4e → bytes32
getOperatorSetParams 0xe65797ad → tuple
getOperatorStatus 0xfd39105a → uint8
getQuorumBitmapAtBlockNumberByIndex 0x04ec6351 → uint192
getQuorumBitmapHistoryLength 0x03fd3492 → uint256
getQuorumBitmapIndicesAtBlockNumber 0xc391425e → uint32[]
getQuorumBitmapUpdateByIndex 0x1eb812da → tuple
indexRegistry 0x9e9923c2 → address
isChurnApproverSaltUsed 0x1478851f → bool
numRegistries 0xd72d8dd6 → uint256
owner 0x8da5cb5b → address
paused 0x5ac86ab7 → bool
paused 0x5c975abb → uint256
pauserRegistry 0x886f1195 → address
pubkeyRegistrationMessageHash 0x3c2a7f4c → tuple
quorumCount 0x9aa1653d → uint8
quorumUpdateBlockNumber 0x249a0c42 → uint256
registries 0x6347c900 → address
serviceManager 0x3998fdd3 → address
stakeRegistry 0x68304835 → address

Write Contract 18 functions

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

createQuorum 0x7f2ec40e
tuple operatorSetParams
uint96 minimumStake
tuple[] strategyParams
deregisterOperator 0xca4f2d97
bytes quorumNumbers
ejectOperator 0x6e3b17db
address operator
bytes quorumNumbers
initialize 0x404d5de8
address _initialOwner
address _churnApprover
address _ejector
address _pauserRegistry
uint256 _initialPausedStatus
tuple[] _operatorSetParams
uint96[] _minimumStakes
tuple[][] _strategyParams
pause 0x136439dd
uint256 newPausedStatus
pauseAll 0x595c6a67
No parameters
registerOperator 0x76e3c1c6
bytes quorumNumbers
string socket
tuple params
tuple operatorSignature
registerOperatorWithChurn 0x399063f1
bytes quorumNumbers
string socket
tuple params
tuple[] operatorKickParams
tuple churnApproverSignature
tuple operatorSignature
renounceOwnership 0x715018a6
No parameters
setChurnApprover 0x29d1e0c3
address _churnApprover
setEjector 0x2cdd1e86
address _ejector
setOperatorSetParams 0x1069589b
uint8 quorumNumber
tuple operatorSetParams
setPauserRegistry 0x10d67a2f
address newPauserRegistry
transferOwnership 0xf2fde38b
address newOwner
unpause 0xfabc1cbc
uint256 newPausedStatus
updateOperators 0x00cf2ab5
address[] operators
updateOperatorsForQuorum 0x5140a548
address[][] operatorsPerQuorum
bytes quorumNumbers
updateSocket 0x0cf4b767
string socket

Recent Transactions

No transactions found for this address