160 txs
232 calls
constructor
constructor(uint256 slotsPerEpoch, uint256 secondsPerSlot, uint256 genesisTime, uint256 epochsPerFrame, uint256 fastLaneLengthSlots, address reportProcessor, address _owner)
functions
getChainConfig
viewfunction getChainConfig() view returns (uint256 slotsPerEpoch, uint256 secondsPerSlot, uint256 genesisTime)
getConsensusState
viewfunction getConsensusState() view returns (uint256 refSlot, bytes32 consensusReport, bool isReportProcessing)
getConsensusStateForMember
viewfunction getConsensusStateForMember(address addr) view returns (tuple result)
getCurrentFrame
viewfunction getCurrentFrame() view returns (uint256 refSlot, uint256 reportProcessingDeadlineSlot)
getFastLaneMembers
viewfunction getFastLaneMembers() view returns (address[] addresses, uint256[] lastReportedRefSlots)
getFrameConfig
viewfunction getFrameConfig() view returns (uint256 initialEpoch, uint256 epochsPerFrame, uint256 fastLaneLengthSlots)
getInitialRefSlot
viewfunction getInitialRefSlot() view returns (uint256)
getIsFastLaneMember
viewfunction getIsFastLaneMember(address addr) view returns (bool)
getIsMember
viewfunction getIsMember(address addr) view returns (bool)
getMembers
viewfunction getMembers() view returns (address[] addresses, uint256[] lastReportedRefSlots)
getQuorum
viewfunction getQuorum() view returns (uint256)
getReportProcessor
viewfunction getReportProcessor() view returns (address)
getReportVariants
viewfunction getReportVariants() view returns (bytes32[] variants, uint256[] support)
owner
viewfunction owner() view returns (address)
addMember
nonpayablefunction addMember(address addr, uint256 quorum)
disableConsensus
nonpayablefunction disableConsensus()
removeMember
nonpayablefunction removeMember(address addr, uint256 quorum)
renounceOwnership
nonpayablefunction renounceOwnership()
setFastLaneLengthSlots
nonpayablefunction setFastLaneLengthSlots(uint256 fastLaneLengthSlots)
setFrameConfig
nonpayablefunction setFrameConfig(uint256 epochsPerFrame, uint256 fastLaneLengthSlots)
setQuorum
nonpayablefunction setQuorum(uint256 quorum)
setReportProcessor
nonpayablefunction setReportProcessor(address newProcessor)
submitReport
nonpayablefunction submitReport(uint256 slot, bytes32 report, uint256 consensusVersion)
transferOwnership
nonpayablefunction transferOwnership(address newOwner)
updateInitialEpoch
nonpayablefunction updateInitialEpoch(uint256 initialEpoch)
events
ConsensusLost
event ConsensusLost(uint256 indexed refSlot)
ConsensusReached
event ConsensusReached(uint256 indexed refSlot, bytes32 report, uint256 support)
FastLaneConfigSet
event FastLaneConfigSet(uint256 fastLaneLengthSlots)
FrameConfigSet
event FrameConfigSet(uint256 newInitialEpoch, uint256 newEpochsPerFrame)
MemberAdded
event MemberAdded(address indexed addr, uint256 newTotalMembers, uint256 newQuorum)
MemberRemoved
event MemberRemoved(address indexed addr, uint256 newTotalMembers, uint256 newQuorum)
OwnershipTransferred
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner)
QuorumSet
event QuorumSet(uint256 newQuorum, uint256 totalMembers, uint256 prevQuorum)
ReportProcessorSet
event ReportProcessorSet(address indexed processor, address indexed prevProcessor)
ReportReceived
event ReportReceived(uint256 indexed refSlot, address indexed member, bytes32 report)
errors
AddressCannotBeZero
error AddressCannotBeZero()
AdminCannotBeZero
error AdminCannotBeZero()
ConsensusReportAlreadyProcessing
error ConsensusReportAlreadyProcessing()
DuplicateMember
error DuplicateMember()
DuplicateReport
error DuplicateReport()
EmptyReport
error EmptyReport()
EpochsPerFrameCannotBeZero
error EpochsPerFrameCannotBeZero()
FastLanePeriodCannotBeLongerThanFrame
error FastLanePeriodCannotBeLongerThanFrame()
InitialEpochAlreadyArrived
error InitialEpochAlreadyArrived()
InitialEpochIsYetToArrive
error InitialEpochIsYetToArrive()
InitialEpochRefSlotCannotBeEarlierThanProcessingSlot
error InitialEpochRefSlotCannotBeEarlierThanProcessingSlot()
InvalidChainConfig
error InvalidChainConfig()
InvalidSlot
error InvalidSlot()
NewProcessorCannotBeTheSame
error NewProcessorCannotBeTheSame()
NonFastLaneMemberCannotReportWithinFastLaneInterval
error NonFastLaneMemberCannotReportWithinFastLaneInterval()
NonMember
error NonMember()
NumericOverflow
error NumericOverflow()
OwnableInvalidOwner
error OwnableInvalidOwner(address owner)
OwnableUnauthorizedAccount
error OwnableUnauthorizedAccount(address account)
QuorumTooSmall
error QuorumTooSmall(uint256 minQuorum, uint256 receivedQuorum)
ReportProcessorCannotBeZero
error ReportProcessorCannotBeZero()
SafeCastOverflowedUintDowncast
error SafeCastOverflowedUintDowncast(uint8 bits, uint256 value)
StaleReport
error StaleReport()
UnexpectedConsensusVersion
error UnexpectedConsensusVersion(uint256 expected, uint256 received)
creation bytecode
0x60e06040523480156200001157600080fd5b50604051620032e9380380620032e983398101604081905262000034916200047a565b806001600160a01b0381166200006557604051631e4fbdf760e01b8152600060048201526024015b60405180910390fd5b6200007081620001b2565b5086600003620000935760405163fb305deb60e01b815260040160405180910390fd5b85600003620000b55760405163fb305deb60e01b815260040160405180910390fd5b620000c08762000202565b6001600160401b0316608052620000d78662000202565b6001600160401b031660a052620000ee8562000202565b6001600160401b031660c0526001600160a01b038216620001225760405163154f6dd160e31b815260040160405180910390fd5b6000620001366001600160401b036200023e565b905062000184818686604051806060016040528060006001600160401b0316815260200160006001600160401b0316815260200160006001600160401b03168152506200025b60201b60201c565b5050600980546001600160a01b0319166001600160a01b0392909216919091179055506200054b9350505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006001600160401b038211156200023a57604080516306dfcc6560e41b81526004810191909152602481018390526044016200005c565b5090565b6000620002556200024f836200040f565b62000442565b92915050565b826000036200027d5760405163ef3d10c160e01b815260040160405180910390fd5b60805162000295906001600160401b031684620004f8565b821115620002b6576040516385b552e160e01b815260040160405180910390fd5b6040518060600160405280620002d2866200020260201b60201c565b6001600160401b03168152602001620002eb8562000202565b6001600160401b03168152602001620003048462000202565b6001600160401b0390811690915281516001805460208501516040909501518416600160801b02600160801b600160c01b031995851668010000000000000000026001600160801b0319909216938516939093171793909316179091558151168414158062000380575080602001516001600160401b03168314155b15620003c05760408051858152602081018590527fe343afa5219eaf28c50ce9cd658acd69cbe28b34fa773eb3a523e28007f64afc910160405180910390a15b80604001516001600160401b0316821462000409576040518281527fab8b22776606cc75c47792d32af7e63ed9ca74e85c9780a7fc7994fdbd6fde2b9060200160405180910390a15b50505050565b600060a0516001600160401b031660c0516001600160401b03168362000436919062000512565b62000255919062000528565b60006080516001600160401b03168262000255919062000528565b80516001600160a01b03811681146200047557600080fd5b919050565b600080600080600080600060e0888a0312156200049657600080fd5b8751965060208801519550604088015194506060880151935060808801519250620004c460a089016200045d565b9150620004d460c089016200045d565b905092959891949750929550565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417620002555762000255620004e2565b81810381811115620002555762000255620004e2565b6000826200054657634e487b7160e01b600052601260045260246000fd5b500490565b60805160a05160c051612d2f620005ba600039600081816102a00152818161151e01526129b901526000818161027c015281816114f3015261298401526000818161025801528181610fa9015281816117c10152818161237d0152818161243a01526128d00152612d2f6000f3fe608060405234801561001057600080fd5b50600436106101a35760003560e01c8063715018a6116100ee578063ad231cb211610097578063e33a8d3911610071578063e33a8d3914610453578063e76cd4e014610466578063ea87627d14610479578063f2fde38b1461049e57600080fd5b8063ad231cb214610430578063c1ba4e5914610438578063c26c12eb1461044b57600080fd5b806398041ea3116100c857806398041ea31461040257806399229f58146104155780639eab52531461042857600080fd5b8063715018a6146103cc57806372f79b13146103d45780638da5cb5b146103f157600080fd5b8063433ab1f31161015057806360e618011161012a57806360e61801146102f45780636d058268146103635780636fb1bf661461038857600080fd5b8063433ab1f314610234578063606c0c941461024a5780636095012f146102de57600080fd5b80632fd2d750116101815780632fd2d750146101f8578063323a41f61461020e57806334aa67531461022157600080fd5b806316f6f03e146101a85780631951c037146101bd57806320b4d751146101e5575b600080fd5b6101bb6101b63660046129fa565b6104b1565b005b6101d06101cb366004612a24565b6104c7565b60405190151581526020015b60405180910390f35b6101d06101f3366004612a24565b6104e9565b610200610528565b6040516101dc929190612a7a565b6101bb61021c366004612ac7565b61067e565b6101bb61022f366004612ae0565b610775565b61023c610817565b6040516101dc929190612b02565b6102c367ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116917f00000000000000000000000000000000000000000000000000000000000000008216917f00000000000000000000000000000000000000000000000000000000000000001690565b604080519384526020840192909252908201526060016101dc565b6102e661082c565b6040519081526020016101dc565b610307610302366004612a24565b61083f565b6040516101dc9190600060e082019050825182526020830151602083015260408301511515604083015260608301511515606083015260808301511515608083015260a083015160a083015260c083015160c083015292915050565b6009546001600160a01b03165b6040516001600160a01b0390911681526020016101dc565b6040805160608101825260015467ffffffffffffffff808216808452600160401b8304821660208501819052600160801b90930490911692909301829052906102c3565b6101bb6109eb565b6103dc6109ff565b604080519283526020830191909152016101dc565b6000546001600160a01b0316610370565b6101bb6104103660046129fa565b610a21565b6101bb610423366004612ac7565b610a33565b61023c610a47565b6101bb610a54565b6101bb610446366004612ac7565b610a6c565b6006546102e6565b6101bb610461366004612b44565b610a82565b6101bb610474366004612a24565b610a92565b610481610aa3565b6040805193845260208401929092521515908201526060016101dc565b6101bb6104ac366004612a24565b610ad9565b6104b9610b32565b6104c38282610b78565b5050565b6001600160a01b03811660009081526004602052604081205415155b92915050565b6001600160a01b038116600090815260046020526040812054801580159061052157506105216001820361051b610ea8565b51610f13565b9392505050565b606080610533610ea8565b6020015160055467ffffffffffffffff161461054d579091565b6008548067ffffffffffffffff81111561056957610569612b70565b604051908082528060200260200182016040528015610592578160200160208202803683370190505b5092508067ffffffffffffffff8111156105ae576105ae612b70565b6040519080825280602002602001820160405280156105d7578160200160208202803683370190505b50915060005b81811015610678576000818152600760209081526040918290208251808401909352805480845260019091015467ffffffffffffffff1691830191909152855186908490811061062f5761062f612b86565b602002602001018181525050806020015167ffffffffffffffff1684838151811061065c5761065c612b86565b60209081029190910101525061067181612bb2565b90506105dd565b50509091565b610686610b32565b6040805160608101825260015467ffffffffffffffff808216808452600160401b830482166020850152600160801b9092041692820192909252906106ca42610f4e565b10610701576040517f29d1e0ff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61072982826020015167ffffffffffffffff16836040015167ffffffffffffffff1684610f61565b61073161116f565b6107396111f6565b6020015110156104c3576040517f8f288e9c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61077d610b32565b6040805160608101825260015467ffffffffffffffff8082168352600160401b820481166020840152600160801b909104169181019190915242906000906107c690839061125f565b6040805160608101825260015467ffffffffffffffff8082168352600160401b820481166020840152600160801b909104169181019190915290915061081190829086908690610f61565b50505050565b6060806108246001611274565b915091509091565b60006108366111f6565b60200151905090565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905290610880610ea8565b60208101805184525160065491925061089891611452565b50506020808401919091526001600160a01b03841660009081526004909152604090819020548015801592850192909252906109e457806001900390506000600282815481106108ea576108ea612b86565b60009182526020918290206040805180820190915291015467ffffffffffffffff808216808452600160401b909204168284015260a087018190529185015190925014610938576000610958565b60208082015167ffffffffffffffff166000908152600790915260409020545b60c08501526000610968426114ef565b905083604001518111158015610988575061098161116f565b8460200151115b15156080860152835161099c908490610f13565b158015606087018190526109b1575084608001515b156109e15760015460208501516109d991600160801b900467ffffffffffffffff1690612bcc565b811160808601525b50505b5050919050565b6109f3610b32565b6109fd600061155c565b565b6000806000610a0c610ea8565b90508060200151816040015192509250509091565b610a29610b32565b6104c382826115b9565b610a3b610b32565b610a448161177f565b50565b6060806108246000611274565b610a5c610b32565b6002546109fd90600019906118bf565b610a74610b32565b600254610a449082906118bf565b610a8d838383611998565b505050565b610a9a610b32565b610a4481612010565b6000806000610ab0610ea8565b602001519250610ac283600654611452565b50909250839050610ad161116f565b149050909192565b610ae1610b32565b6001600160a01b038116610b29576040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600060048201526024015b60405180910390fd5b610a448161155c565b6000546001600160a01b031633146109fd576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610b20565b6000610b838361225c565b600254909150600090610b9890600190612bdf565b905080821115610baa57610baa612bf2565b600060028381548110610bbf57610bbf612b86565b60009182526020918290206040805180820190915291015467ffffffffffffffff8082168352600160401b90910416918101919091529050828214610d1e57600060038381548110610c1357610c13612b86565b600091825260209091200154600380546001600160a01b039092169250829186908110610c4257610c42612b86565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060028381548110610c8357610c83612b86565b9060005260206000200160028581548110610ca057610ca0612b86565b6000918252602090912082549101805467ffffffffffffffff92831667ffffffffffffffff1982168117835593546fffffffffffffffffffffffffffffffff19909116909317600160401b93849004909216909202179055610d03846001612bcc565b6001600160a01b039091166000908152600460205260409020555b6002805480610d2f57610d2f612c08565b600082815260209020810160001990810180546fffffffffffffffffffffffffffffffff191690550190556003805480610d6b57610d6b612c08565b600082815260208082206000199084018101805473ffffffffffffffffffffffffffffffffffffffff191690559092019092556001600160a01b038716808352600482526040808420939093558251858152918201879052917fa182730913550d27dc6c5813fad297cb0785871bec3d0152c5650e59c5d39d60910160405180910390a2805167ffffffffffffffff1615610e97576000610e0a610ea8565b90508060200151826000015167ffffffffffffffff16148015610e3757508060200151610e3561116f565b105b15610e955760208083015167ffffffffffffffff90811660009081526007909252604082206001018054909291610e6e9116612c1e565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b505b610ea184836118bf565b5050505050565b610ecc60405180606001604052806000815260200160008152602001600081525090565b610f0e426040805160608101825260015467ffffffffffffffff8082168352600160401b820481166020840152600160801b90910416918101919091526122b8565b905090565b6002546000908180610f2585846122ef565b9150915080600014158015610f445750610f448683600184038661232b565b9695505050505050565b60006104e3610f5c836114ef565b61236d565b82600003610f9b576040517fef3d10c100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610fcf67ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001684612c38565b821115611008576040517f85b552e100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604051806060016040528061101c866123a3565b67ffffffffffffffff168152602001611034856123a3565b67ffffffffffffffff16815260200161104c846123a3565b67ffffffffffffffff90811690915281516001805460208501516040909501518416600160801b027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff958516600160401b026fffffffffffffffffffffffffffffffff1990921693851693909317179390931617909155815116841415806110e25750806020015167ffffffffffffffff168314155b156111215760408051858152602081018590527fe343afa5219eaf28c50ce9cd658acd69cbe28b34fa773eb3a523e28007f64afc910160405180910390a15b806040015167ffffffffffffffff168214610811576040518281527fab8b22776606cc75c47792d32af7e63ed9ca74e85c9780a7fc7994fdbd6fde2b9060200160405180910390a150505050565b600954604080517f3584d59c00000000000000000000000000000000000000000000000000000000815290516000926001600160a01b031691633584d59c9160048083019260209291908290030181865afa1580156111d2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f0e9190612c4f565b61121a60405180606001604052806000815260200160008152602001600081525090565b6040805160608101825260015467ffffffffffffffff8082168352600160401b820481166020840152600160801b9091041691810191909152610f0e906000906123f7565b600061052161126e84846124d8565b8361255d565b600254606090819060008085156112a157611297611290610ea8565b51846122ef565b90925090506112a4565b50815b6112ae8282612bdf565b67ffffffffffffffff8111156112c6576112c6612b70565b6040519080825280602002602001820160405280156112ef578160200160208202803683370190505b509450845167ffffffffffffffff81111561130c5761130c612b70565b604051908082528060200260200182016040528015611335578160200160208202803683370190505b509350815b8181101561144957600061134e8583612c7e565b905060006002828154811061136557611365612b86565b600091825260208083206040805180820190915292015467ffffffffffffffff8082168452600160401b909104169082015291506113a38685612bdf565b9050600383815481106113b8576113b8612b86565b9060005260206000200160009054906101000a90046001600160a01b03168982815181106113e8576113e8612b86565b60200260200101906001600160a01b031690816001600160a01b031681525050816000015167ffffffffffffffff1688828151811061142957611429612b86565b6020026020010181815250505050508061144290612bb2565b905061133a565b50505050915091565b6005546000908190819067ffffffffffffffff16851461147c5750600091506000199050816114e8565b505060085460009150600019908290815b818110156114e55760008181526007602052604090206001015467ffffffffffffffff168681106114d45760008281526007602052604090205495509093509150826114e5565b506114de81612bb2565b905061148d565b50505b9250925092565b60007f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff16836115529190612bdf565b6104e39190612c92565b600080546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03821660009081526004602052604090205415611609576040517fece0e40200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038216611649576040517fe622e04000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408051808201825260008082526020808301828152600280546001818101835582865295517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace9091018054935167ffffffffffffffff908116600160401b026fffffffffffffffffffffffffffffffff19909516921691909117929092179091556003805494850190557fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b90930180546001600160a01b03881673ffffffffffffffffffffffffffffffffffffffff199091168117909155925483835260049091529083902081905591517fe17e0e2cd88e2144dd54f3d823c30d4569092bcac1aabaec1129883e9cc12d2e9061176d9084908690918252602082015260400190565b60405180910390a2610a8d82826118bf565b6040805160608101825260015467ffffffffffffffff8082168352600160401b8204811660208401819052600160801b9092041692820192909252906117e6907f000000000000000000000000000000000000000000000000000000000000000090612ca6565b67ffffffffffffffff16821115611829576040517f85b552e100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806040015167ffffffffffffffff1682146104c357611847826123a3565b6001805467ffffffffffffffff92909216600160801b027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff9092169190911790556040518281527fab8b22776606cc75c47792d32af7e63ed9ca74e85c9780a7fc7994fdbd6fde2b9060200160405180910390a15050565b6118ca600282612c92565b8211611923576118db600282612c92565b6118e6906001612bcc565b6040517f2b2dd84d000000000000000000000000000000000000000000000000000000008152600481019190915260248101839052604401610b20565b60065482811461197457600683905560408051848152602081018490529081018290527f9f40cfd22fe91777c78f252bd21a710f3fb007dc2f321876891e7644ba0ae1759060600160405180910390a15b60015467ffffffffffffffff1661198a42610f4e565b10610a8d57610a8d8361258f565b826000036119d2576040517f1258e44300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff831115611a14576040517faac8f00900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81611a4a576040517ebf199700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611a553361225c565b9050600060028281548110611a6c57611a6c612b86565b600091825260208083206040805180820190915292015467ffffffffffffffff8082168452600160401b90910416908201529150611aa8612645565b9050808414611aed576040517f546fba7a0000000000000000000000000000000000000000000000000000000081526004810182905260248101859052604401610b20565b426000611af9826114ef565b6040805160608101825260015467ffffffffffffffff8082168352600160401b820481166020840152600160801b90910416918101919091529091506000611b4184836122b8565b905080602001518a14611b80576040517f1258e44300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060400151831115611bbe576040517ff803a2ca00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816040015167ffffffffffffffff168160200151611bdc9190612bcc565b8311158015611bf65750611bf4878260000151610f13565b155b15611c2d576040517f3e1ca93d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611c3561116f565b8a11611c8b57855167ffffffffffffffff168a03611c7f576040517fe7bf450800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050505050505050565b60055460009067ffffffffffffffff168b14611cc657506005805467ffffffffffffffff191667ffffffffffffffff8c161790556000611ccb565b506008545b60008060005b838367ffffffffffffffff16108015611d03575067ffffffffffffffff83166000908152600760205260409020548d14155b15611d1857611d1183612cd2565b9250611cd1565b895167ffffffffffffffff168e03611e0d5760208a015167ffffffffffffffff81168511611d4857611d48612bf2565b8067ffffffffffffffff168467ffffffffffffffff1603611d95576040517ffd10cf7300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff808216600090815260076020526040812060010180549092611dc09116612c1e565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905567ffffffffffffffff1691506001600654611e009190612bdf565b8203611e0b57600192505b505b838367ffffffffffffffff161015611e805767ffffffffffffffff808416600090815260076020526040812060010180549092611e4a9116612cd2565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905567ffffffffffffffff169050611ee2565b506040805180820182528d81526001602080830182815267ffffffffffffffff87811660009081526007909352949091209251835551918101805467ffffffffffffffff19169290931691909117909155611eda84612bb2565b600881905593505b60405180604001604052808f67ffffffffffffffff1681526020018467ffffffffffffffff1681525060028c81548110611f1e57611f1e612b86565b9060005260206000200160008201518160000160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060208201518160000160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050336001600160a01b03168e7f92f77576dabd7bad26f75c36abb3021b5bbb66a3e5688570a0355daddd4174888f604051611fc591815260200190565b60405180910390a36006548110611ff157611fec858e8567ffffffffffffffff16846126a8565b612000565b811561200057612000856127a7565b5050505050505050505050505050565b6009546001600160a01b03908116908216612057576040517faa7b6e8800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806001600160a01b0316826001600160a01b0316036120a2576040517ff1b3699f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6009805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03848116918217909255604051918316917f3b59429457a41af89ea682ac9ed8abb8e99eb5c7d3363d5eedfc6bff6271a81e90600090a36000612105610ea8565b90506000600560000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1690506000836001600160a01b0316633584d59c6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561216f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121939190612c4f565b90506000856001600160a01b0316633584d59c6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156121d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121f99190612c4f565b90508360200151821080156122115750836020015181105b80156122205750836020015183145b1561225457600554600160801b900467ffffffffffffffff166000908152600760205260409020546122528582612824565b505b505050505050565b6001600160a01b0381166000908152600460205260408120548082036122ae576040517f8d35f2ed00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000190192915050565b6122dc60405180606001604052806000815260200160008152602001600081525090565b6105216122e984846124d8565b836123f7565b600654600090819083811061230a5760009250839150612323565b6123148486612c7e565b92506123208184612bcc565b91505b509250929050565b6000816123388585612bdf565b6123429190612c7e565b828561234e8289612bcc565b6123589190612bdf565b6123629190612c7e565b111595945050505050565b60006104e367ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001683612c92565b600067ffffffffffffffff8211156123f357604080517f6dfcc650000000000000000000000000000000000000000000000000000000008152600481019190915260248101839052604401610b20565b5090565b61241b60405180606001604052806000815260200160008152602001600081525090565b6000612427848461255d565b90506000612434826128c0565b905060007f000000000000000000000000000000000000000000000000000000000000000085602001516124689190612ca6565b61247c9067ffffffffffffffff1683612bcc565b9050604051806060016040528087815260200160018461249c9190612bdf565b67ffffffffffffffff16815260200160006124b8600185612bdf565b6124c29190612bdf565b67ffffffffffffffff1690529695505050505050565b6000806124e484610f4e565b835190915067ffffffffffffffff1681101561252c576040517fcd0883ea00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020830151835167ffffffffffffffff9182169161254b911683612bdf565b6125559190612c92565b949350505050565b6000816020015167ffffffffffffffff16836125799190612c38565b8251610521919067ffffffffffffffff16612bcc565b6040805160608101825260015467ffffffffffffffff8082168352600160401b820481166020840152600160801b909104169181019190915242906000906125d89083906122b8565b905080604001516125e8836114ef565b11156125f357505050565b806020015161260061116f565b1061260a57505050565b600080600061261d846020015187611452565b9250925092506000821261263c57612637848484846126a8565b612254565b612254846127a7565b600954604080517f5be2042500000000000000000000000000000000000000000000000000000000815290516000926001600160a01b031691635be204259160048083019260209291908290030181865afa1580156111d2573d6000803e3d6000fd5b6020840151600554600160401b900467ffffffffffffffff161415806126e15750600554600160801b900467ffffffffffffffff168214155b156108115760208401516005805467ffffffffffffffff858116600160801b027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff918516600160401b02919091167fffffffffffffffff00000000000000000000000000000000ffffffffffffffff909216919091171790556040517f2b6bc782c916fa763822f1e50c6db0f95dade36d6541a8a4cbe070735b8b226d906127959086908590918252602082015260400190565b60405180910390a26108118484612824565b6020810151600554600160401b900467ffffffffffffffff1603610a4457600580547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff16905560208101516040517fde3f4ea5aa67881831e8fad2b0855d47e75aa63a2fae6ef657ffd5f856c4a61390600090a2610a44816128f6565b600954602083015160408401516001600160a01b039092169163063f36ad91849161284e90612974565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b168152600481019390935260248301919091526044820152606401600060405180830381600087803b1580156128ac57600080fd5b505af1158015612254573d6000803e3d6000fd5b60006104e367ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001683612c38565b60095460208201516040517fd43812170000000000000000000000000000000000000000000000000000000081526001600160a01b039092169163d4381217916129469160040190815260200190565b600060405180830381600087803b15801561296057600080fd5b505af1158015610ea1573d6000803e3d6000fd5b60006129aa67ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001683612c38565b6104e39067ffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016612bcc565b80356001600160a01b03811681146129f557600080fd5b919050565b60008060408385031215612a0d57600080fd5b612a16836129de565b946020939093013593505050565b600060208284031215612a3657600080fd5b610521826129de565b600081518084526020808501945080840160005b83811015612a6f57815187529582019590820190600101612a53565b509495945050505050565b604080825283519082018190526000906020906060840190828701845b82811015612ab357815184529284019290840190600101612a97565b50505083810382850152610f448186612a3f565b600060208284031215612ad957600080fd5b5035919050565b60008060408385031215612af357600080fd5b50508035926020909101359150565b604080825283519082018190526000906020906060840190828701845b82811015612ab35781516001600160a01b031684529284019290840190600101612b1f565b600080600060608486031215612b5957600080fd5b505081359360208301359350604090920135919050565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006000198203612bc557612bc5612b9c565b5060010190565b808201808211156104e3576104e3612b9c565b818103818111156104e3576104e3612b9c565b634e487b7160e01b600052600160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b600067ffffffffffffffff8216806122ae576122ae612b9c565b80820281158282048414176104e3576104e3612b9c565b600060208284031215612c6157600080fd5b5051919050565b634e487b7160e01b600052601260045260246000fd5b600082612c8d57612c8d612c68565b500690565b600082612ca157612ca1612c68565b500490565b67ffffffffffffffff818116838216028082169190828114612cca57612cca612b9c565b505092915050565b600067ffffffffffffffff808316818103612cef57612cef612b9c565b600101939250505056fea26469706673582212204094309f204d1fc39d5ee858e1e46a4d11a16a876f05e606810297f69b6ca85864736f6c634300081400330000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000065d35ee000000000000000000000000000000000000000000000000000000000000000e100000000000000000000000000000000000000000000000000000000000000640000000000000000000000003430bcadc7f23c42e7054e20f129d67baa91b1840000000000000000000000003a644be412a718ea5c33ec77a133db70d3cc6ebd