diff --git a/.github/workflows/manual-deploy-testnet-l2.yml b/.github/workflows/manual-deploy-testnet-l2.yml index 0e42f82d6..5dabd8a4a 100644 --- a/.github/workflows/manual-deploy-testnet-l2.yml +++ b/.github/workflows/manual-deploy-testnet-l2.yml @@ -419,6 +419,40 @@ jobs: grant-sequencers.out retention-days: 7 + set-challenge-period: + needs: + - build + - check-obscuro-is-healthy + runs-on: ubuntu-latest + environment: + name: ${{ github.event.inputs.testnet_type }} + steps: + - uses: actions/checkout@v4 + + - name: 'Set challenge period on management contract' + id: setChallengePeriod + shell: bash + run: | + go run ./testnet/launcher/l1challengeperiod/cmd \ + -l1_http_url=${{ secrets.L1_HTTP_URL }} \ + -private_key=${{ secrets.ACCOUNT_PK_WORKER }} \ + -management_contract_addr=${{ needs.build.outputs.MGMT_CONTRACT_ADDR }} \ + -docker_image=${{ vars.L2_HARDHATDEPLOYER_DOCKER_BUILD_TAG }} \ + -l1_challenge_period=${{ vars.L1_CHALLENGE_PERIOD }} \ + echo "Setting challenge period to ${{ vars.L1_CHALLENGE_PERIOD }}" + + - name: 'Save challenge period container logs' + run: | + docker logs `docker ps -aqf "name=set-challenge-period"` > set-challenge-period.out 2>&1 + + - name: 'Upload challenge period container logs' + uses: actions/upload-artifact@v4 + with: + name: set-challenge-period + path: | + set-challenge-period.out + retention-days: 7 + deploy-l2-contracts: needs: - build diff --git a/contracts/generated/ManagementContract/ManagementContract.go b/contracts/generated/ManagementContract/ManagementContract.go index 633d46094..2d7004b1f 100644 --- a/contracts/generated/ManagementContract/ManagementContract.go +++ b/contracts/generated/ManagementContract/ManagementContract.go @@ -46,8 +46,8 @@ type StructsValueTransferMessage struct { // ManagementContractMetaData contains all meta data concerning the ManagementContract contract. var ManagementContractMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ECDSAInvalidSignature\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"}],\"name\":\"ECDSAInvalidSignatureLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"ECDSAInvalidSignatureS\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotInitializing\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"OwnableInvalidOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"OwnableUnauthorizedAccount\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newAddress\",\"type\":\"address\"}],\"name\":\"ImportantContractAddressUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"version\",\"type\":\"uint64\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"messageBusAddress\",\"type\":\"address\"}],\"name\":\"LogManagementContractCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"requester\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"requestReport\",\"type\":\"string\"}],\"name\":\"NetworkSecretRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"attester\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"requester\",\"type\":\"address\"}],\"name\":\"NetworkSecretResponded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"rollupHash\",\"type\":\"bytes32\"}],\"name\":\"RollupAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"enclaveID\",\"type\":\"address\"}],\"name\":\"SequencerEnclaveGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"enclaveID\",\"type\":\"address\"}],\"name\":\"SequencerEnclaveRevoked\",\"type\":\"event\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"Hash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"Signature\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"LastSequenceNumber\",\"type\":\"uint256\"}],\"internalType\":\"structStructs.MetaRollup\",\"name\":\"r\",\"type\":\"tuple\"}],\"name\":\"AddRollup\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_addr\",\"type\":\"address\"}],\"name\":\"Attested\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"sequence\",\"type\":\"uint64\"}],\"internalType\":\"structStructs.ValueTransferMessage\",\"name\":\"_msg\",\"type\":\"tuple\"},{\"internalType\":\"bytes32[]\",\"name\":\"proof\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes32\",\"name\":\"root\",\"type\":\"bytes32\"}],\"name\":\"ExtractNativeValue\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"GetImportantContractKeys\",\"outputs\":[{\"internalType\":\"string[]\",\"name\":\"\",\"type\":\"string[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"rollupHash\",\"type\":\"bytes32\"}],\"name\":\"GetRollupByHash\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"Hash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"Signature\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"LastSequenceNumber\",\"type\":\"uint256\"}],\"internalType\":\"structStructs.MetaRollup\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"number\",\"type\":\"uint256\"}],\"name\":\"GetRollupByNumber\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"Hash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"Signature\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"LastSequenceNumber\",\"type\":\"uint256\"}],\"internalType\":\"structStructs.MetaRollup\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"number\",\"type\":\"uint256\"}],\"name\":\"GetUniqueForkID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"Hash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"Signature\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"LastSequenceNumber\",\"type\":\"uint256\"}],\"internalType\":\"structStructs.MetaRollup\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_addr\",\"type\":\"address\"}],\"name\":\"GrantSequencerEnclave\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_enclaveID\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_initSecret\",\"type\":\"bytes\"},{\"internalType\":\"string\",\"name\":\"_genesisAttestation\",\"type\":\"string\"}],\"name\":\"InitializeNetworkSecret\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_addr\",\"type\":\"address\"}],\"name\":\"IsSequencerEnclave\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"IsWithdrawalAvailable\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"requestReport\",\"type\":\"string\"}],\"name\":\"RequestNetworkSecret\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"attesterID\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"requesterID\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"attesterSig\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"responseSecret\",\"type\":\"bytes\"},{\"internalType\":\"bool\",\"name\":\"verifyAttester\",\"type\":\"bool\"}],\"name\":\"RespondNetworkSecret\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"RetrieveAllBridgeFunds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_addr\",\"type\":\"address\"}],\"name\":\"RevokeSequencerEnclave\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"newAddress\",\"type\":\"address\"}],\"name\":\"SetImportantContractAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_lastBatchHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"providedBlockHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"blockNum\",\"type\":\"uint256\"},{\"internalType\":\"bytes[]\",\"name\":\"crossChainHashes\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"rollupNumber\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"forkID\",\"type\":\"bytes32\"}],\"name\":\"addCrossChainMessagesRoot\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"name\":\"importantContractAddresses\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"importantContractKeys\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes[]\",\"name\":\"crossChainHashes\",\"type\":\"bytes[]\"}],\"name\":\"isBundleAvailable\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"isBundleSaved\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"isWithdrawalSpent\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastBatchHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastBatchSeqNo\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"merkleMessageBus\",\"outputs\":[{\"internalType\":\"contractIMerkleTreeMessageBus\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"messageBus\",\"outputs\":[{\"internalType\":\"contractIMessageBus\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x6080604052348015600f57600080fd5b50601733601b565b608c565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b6154d28061009b6000396000f3fe608060405234801561001057600080fd5b50600436106101d95760003560e01c80638129fc1c11610104578063a1a227fa116100a2578063db5d91b111610071578063db5d91b114610475578063e34fbfc8146104a1578063e874eb20146104b4578063f2fde38b146104c757600080fd5b8063a1a227fa1461041f578063a4ab2faa1461043f578063a52f433c14610452578063d4fab8871461046257600080fd5b806384154826116100de578063841548261461039957806387059edb146103bc5780638da5cb5b146103cf57806398077e86146103ff57600080fd5b80638129fc1c1461035d57806381be5385146103655780638236a7ba1461037857600080fd5b8063476657381161017c5780636a30d26c1161014b5780636a30d26c146103255780636b9707d61461033a578063715018a61461034d578063728109961461035557600080fd5b806347665738146102cb5780635371a216146102de578063568699c8146102f157806368e103831461031257600080fd5b80632f0cb9e3116101b85780632f0cb9e3146102255780633e60a22f1461025557806343348b2f14610296578063440c953b146102c257600080fd5b80620ddd27146101de57806303e72e48146101fd578063073b6ef314610212575b600080fd5b6101e7600e5481565b6040516101f49190611ad4565b60405180910390f35b61021061020b366004611c0a565b6104da565b005b610210610220366004611d7f565b6105e2565b610248610233366004611e4d565b600c6020526000908152604090205460ff1681565b6040516101f49190611e74565b610289610263366004611e82565b80516020818301810180516003825292820191909301209152546001600160a01b031681565b6040516101f49190611ece565b6102486102a4366004611edc565b6001600160a01b031660009081526020819052604090205460ff1690565b6101e760055481565b6102106102d9366004611edc565b610864565b6102106102ec366004611f61565b610904565b6103046102ff366004611e4d565b610aa9565b6040516101f4929190612063565b610210610320366004612083565b610aff565b61032d610ba3565b6040516101f49190612186565b610210610348366004611edc565b610c7c565b610210610d0c565b610210610d20565b610210610da5565b6102106103733660046121ac565b610f80565b61038b610386366004611e4d565b61107b565b6040516101f49291906121e7565b6102486103a7366004611e4d565b600d6020526000908152604090205460ff1681565b61038b6103ca366004611e4d565b611163565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b0316610289565b61041261040d366004611e4d565b6111da565b6040516101f491906121f5565b600a54610432906001600160a01b031681565b6040516101f49190612248565b61024861044d366004612256565b611286565b600454610100900460ff16610248565b6102106104703660046122a4565b611304565b610248610483366004611edc565b6001600160a01b031660009081526001602052604090205460ff1690565b6102106104af36600461234b565b61140c565b600b54610432906001600160a01b031681565b6102106104d5366004611edc565b611453565b6104e26114aa565b60006001600160a01b03166003836040516104fd91906123b5565b908152604051908190036020019020546001600160a01b03160361055957600280546001810182556000919091527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace016105578382612491565b505b8060038360405161056a91906123b5565b90815260405190819003602001812080546001600160a01b039390931673ffffffffffffffffffffffffffffffffffffffff19909316929092179091557f17b2f9f5748931099ffee882b5b64f4a560b5c55da9b4f4e396dae3bb9f98cb5906105d69084908490612551565b60405180910390a15050565b6105ed8660ff612587565b43106106145760405162461bcd60e51b815260040161060b906125cc565b60405180910390fd5b8543036106335760405162461bcd60e51b815260040161060b90612636565b854060008190036106565760405162461bcd60e51b815260040161060b90612678565b8781146106755760405162461bcd60e51b815260040161060b906126ba565b60008381526008602052604090205482146106a25760405162461bcd60e51b815260040161060b906126fc565b60006107108a8a8a8a6040516020016106be9493929190612764565b6040516020818303038152906040528051906020012087878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061151e92505050565b6001600160a01b03811660009081526001602052604090205490915060ff1661074b5760405162461bcd60e51b815260040161060b906127da565b600e8a90556000805b885181101561083e57600b5489516001600160a01b039091169063b6aed0cb908b9084908110610786576107866127ea565b60200260200101516107979061280a565b426040518363ffffffff1660e01b81526004016107b5929190612840565b600060405180830381600087803b1580156107cf57600080fd5b505af11580156107e3573d6000803e3d6000fd5b50505050818982815181106107fa576107fa6127ea565b602002602001015161080b9061280a565b60405160200161081c929190612840565b60408051601f1981840301815291905280516020909101209150600101610754565b506000908152600d60205260409020805460ff1916600117905550505050505050505050565b61086c6114aa565b6001600160a01b03811660009081526020819052604090205460ff166108a45760405162461bcd60e51b815260040161060b9061288d565b6001600160a01b038116600090815260016020819052604091829020805460ff19169091179055517ffe64c7181f0fc60e300dc02cca368cdfa94d7ca45902de3b9a9d80070e760936906108f9908390611ece565b60405180910390a150565b600b546040517fb201246f0000000000000000000000000000000000000000000000000000000081526001600160a01b039091169063b201246f906109539087908790879087906004016129b8565b60006040518083038186803b15801561096b57600080fd5b505afa15801561097f573d6000803e3d6000fd5b5050505060008460405160200161099691906129f1565b60408051601f1981840301815291815281516020928301206000818152600c90935291205490915060ff16156109de5760405162461bcd60e51b815260040161060b90612a31565b6001600c6000876040516020016109f591906129f1565b60408051808303601f190181529181528151602092830120835282820193909352908201600020805460ff191693151593909317909255600a546001600160a01b0316916399a3ad2191610a4e91908901908901611edc565b87604001356040518363ffffffff1660e01b8152600401610a70929190612a41565b600060405180830381600087803b158015610a8a57600080fd5b505af1158015610a9e573d6000803e3d6000fd5b505050505050505050565b604080516060808201835260008083526020830191909152918101829052600080610ad385611163565b9150915081610ae85760009590945092505050565b600094855260086020526040909420549492505050565b60045460ff1615610b225760405162461bcd60e51b815260040161060b90612aa7565b60048054600160ff1991821681179092556001600160a01b0387166000908152602081815260408083208054851686179055908490529081902080549092169092179055517ffe64c7181f0fc60e300dc02cca368cdfa94d7ca45902de3b9a9d80070e76093690610b94908790611ece565b60405180910390a15050505050565b60606002805480602002602001604051908101604052809291908181526020016000905b82821015610c73578382906000526020600020018054610be6906123d5565b80601f0160208091040260200160405190810160405280929190818152602001828054610c12906123d5565b8015610c5f5780601f10610c3457610100808354040283529160200191610c5f565b820191906000526020600020905b815481529060010190602001808311610c4257829003601f168201915b505050505081526020019060010190610bc7565b50505050905090565b610c846114aa565b6001600160a01b03811660009081526001602052604090205460ff16610cbc5760405162461bcd60e51b815260040161060b90612ae9565b6001600160a01b03811660009081526001602052604090819020805460ff19169055517f0f279980343c7ca542fde9fa5396555068efb5cd560d9cf9c191aa2911079b47906108f9908390611ece565b610d146114aa565b610d1e600061154a565b565b610d286114aa565b600a546040517f36d2da900000000000000000000000000000000000000000000000000000000081526001600160a01b03909116906336d2da9090610d71903390600401611ece565b600060405180830381600087803b158015610d8b57600080fd5b505af1158015610d9f573d6000803e3d6000fd5b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff16159067ffffffffffffffff16600081158015610df05750825b905060008267ffffffffffffffff166001148015610e0d5750303b155b905081158015610e1b575080155b15610e52576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610e8657845468ff00000000000000001916680100000000000000001785555b610e8f336115c8565b60006005556001600955604051610ea590611abf565b604051809103906000f080158015610ec1573d6000803e3d6000fd5b50600b80546001600160a01b039290921673ffffffffffffffffffffffffffffffffffffffff199283168117909155600a805490921681179091556040517fbd726cf82ac9c3260b1495107182e336e0654b25c10915648c0cc15b2bb72cbf91610f2a91611ece565b60405180910390a18315610f7957845468ff0000000000000000191685556040517fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290610b9490600190612b14565b5050505050565b6000610fce8235610f946020850185612b22565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061151e92505050565b6001600160a01b03811660009081526020819052604090205490915060ff166110095760405162461bcd60e51b815260040161060b9061288d565b6001600160a01b03811660009081526001602052604090205460ff166110415760405162461bcd60e51b815260040161060b90612ae9565b61104a826115d9565b6040517fd6555bff8670bd3008dc064c30bb56d6ac7cb14ae801e36146fe4e7c6a504a58906105d690843590611ad4565b6040805160608082018352600080835260208084018390528385018290528582526006815284822085519384019095528454835260018501805492958694939092840191906110c9906123d5565b80601f01602080910402602001604051908101604052809291908181526020018280546110f5906123d5565b80156111425780601f1061111757610100808354040283529160200191611142565b820191906000526020600020905b81548152906001019060200180831161112557829003601f168201915b50505091835250506002919091015460209091015280519094149492505050565b604080516060808201835260008083526020830191909152918101829052600083815260076020526040812054908190036111c757505060408051606081018252600080825282516020818101855282825283015291810182905290939092509050565b6111d08161107b565b9250925050915091565b600281815481106111ea57600080fd5b906000526020600020016000915090508054611205906123d5565b80601f0160208091040260200160405190810160405280929190818152602001828054611231906123d5565b801561127e5780601f106112535761010080835404028352916020019161127e565b820191906000526020600020905b81548152906001019060200180831161126157829003601f168201915b505050505081565b600080805b83518110156112eb57818482815181106112a7576112a76127ea565b60200260200101516112b89061280a565b6040516020016112c9929190612840565b60408051601f198184030181529190528051602090910120915060010161128b565b506000908152600d602052604090205460ff1692915050565b6001600160a01b03851660009081526020819052604090205460ff168061133d5760405162461bcd60e51b815260040161060b90612bcf565b81156113b557600061137187878660405160200161135d93929190612c07565b60405160208183030381529060405261167d565b9050600061137f828761151e565b9050876001600160a01b0316816001600160a01b0316146113b25760405162461bcd60e51b815260040161060b90612c83565b50505b6001600160a01b03808616600081815260208190526040808220805460ff191660011790555191928916917fb869e23ebc7c717d76e345eee8ec282612603e45c44f7ae5494b197c8d9d1be19190a3505050505050565b336001600160a01b03167f0b0ecdedd12079aa2d6c5e0186026c711cb0c8d04f1b724ba5880fb6328d43018383604051611447929190612cb3565b60405180910390a25050565b61145b6114aa565b6001600160a01b03811661149e5760006040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161060b9190611ece565b6114a78161154a565b50565b336114dc7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b031614610d1e57336040517f118cdaa700000000000000000000000000000000000000000000000000000000815260040161060b9190611ece565b60008060008061152e86866116b8565b92509250925061153e8282611705565b50909150505b92915050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300805473ffffffffffffffffffffffffffffffffffffffff1981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b6115d061180b565b6114a781611872565b8035600090815260066020526040902081906115f58282612e28565b50506009546000908152600760205260409020813590819055611619600143612e32565b4060405160200161162b929190612840565b60408051601f19818403018152918152815160209283012060098054600090815260089094529183205580549161166183612e45565b9190505550600554816040013511156114a75760400135600555565b6000611689825161187a565b8260405160200161169b929190612e5e565b604051602081830303815290604052805190602001209050919050565b600080600083516041036116f25760208401516040850151606086015160001a6116e48882858561191b565b9550955095505050506116fe565b50508151600091506002905b9250925092565b600082600381111561171957611719612e9a565b03611722575050565b600182600381111561173657611736612e9a565b0361176d576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600282600381111561178157611781612e9a565b036117ba576040517ffce698f700000000000000000000000000000000000000000000000000000000815261060b908290600401611ad4565b60038260038111156117ce576117ce612e9a565b0361180757806040517fd78bce0c00000000000000000000000000000000000000000000000000000000815260040161060b9190611ad4565b5050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005468010000000000000000900460ff16610d1e576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61145b61180b565b60606000611887836119dd565b600101905060008167ffffffffffffffff8111156118a7576118a7611ae2565b6040519080825280601f01601f1916602001820160405280156118d1576020820181803683370190505b5090508181016020015b600019017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85049450846118db575b509392505050565b600080807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561195657506000915060039050826119d3565b60006001888888886040516000815260200160405260405161197b9493929190612eb9565b6020604051602081039080840390855afa15801561199d573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166119c9575060009250600191508290506119d3565b9250600091508190505b9450945094915050565b6000807a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310611a26577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef81000000008310611a52576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310611a7057662386f26fc10000830492506010015b6305f5e1008310611a88576305f5e100830492506008015b6127108310611a9c57612710830492506004015b60648310611aae576064830492506002015b600a83106115445760010192915050565b6125ae80612eef83390190565b805b82525050565b602081016115448284611acc565b634e487b7160e01b600052604160045260246000fd5b601f19601f830116810181811067ffffffffffffffff82111715611b1e57611b1e611ae2565b6040525050565b6000611b3060405190565b9050611b3c8282611af8565b919050565b600067ffffffffffffffff821115611b5b57611b5b611ae2565b601f19601f83011660200192915050565b82818337506000910152565b6000611b8b611b8684611b41565b611b25565b9050828152838383011115611ba257611ba2600080fd5b611bb0836020830184611b6c565b9392505050565b600082601f830112611bcb57611bcb600080fd5b611bb083833560208501611b78565b60006001600160a01b038216611544565b611bf481611bda565b81146114a757600080fd5b803561154481611beb565b60008060408385031215611c2057611c20600080fd5b823567ffffffffffffffff811115611c3a57611c3a600080fd5b611c4685828601611bb7565b925050611c568460208501611bff565b90509250929050565b80611bf4565b803561154481611c5f565b600067ffffffffffffffff821115611c8a57611c8a611ae2565b5060209081020190565b6000611ca2611b8684611c70565b83815290506020808201908402830185811115611cc157611cc1600080fd5b835b81811015611d0057803567ffffffffffffffff811115611ce557611ce5600080fd5b611cf188828801611bb7565b84525060209283019201611cc3565b5050509392505050565b600082601f830112611d1e57611d1e600080fd5b611bb083833560208501611c94565b60008083601f840112611d4257611d42600080fd5b50813567ffffffffffffffff811115611d5d57611d5d600080fd5b602083019150836001820283011115611d7857611d78600080fd5b9250929050565b60008060008060008060008060e0898b031215611d9e57611d9e600080fd5b611da88a8a611c65565b9750611db78a60208b01611c65565b9650611dc68a60408b01611c65565b9550606089013567ffffffffffffffff811115611de557611de5600080fd5b611df18b828c01611d0a565b955050608089013567ffffffffffffffff811115611e1157611e11600080fd5b611e1d8b828c01611d2d565b9450945050611e2f8a60a08b01611c65565b9150611e3e8a60c08b01611c65565b90509295985092959890939650565b600060208284031215611e6257611e62600080fd5b611bb08383611c65565b801515611ace565b602081016115448284611e6c565b600060208284031215611e9757611e97600080fd5b813567ffffffffffffffff811115611eb157611eb1600080fd5b611ebd84828501611bb7565b949350505050565b611ace81611bda565b602081016115448284611ec5565b600060208284031215611ef157611ef1600080fd5b611bb08383611bff565b600060808284031215611f1057611f10600080fd5b50919050565b60008083601f840112611f2b57611f2b600080fd5b50813567ffffffffffffffff811115611f4657611f46600080fd5b602083019150836020820283011115611d7857611d78600080fd5b60008060008060c08587031215611f7a57611f7a600080fd5b611f848686611efb565b9350608085013567ffffffffffffffff811115611fa357611fa3600080fd5b611faf87828801611f16565b9350935050611fc18660a08701611c65565b905092959194509250565b60005b83811015611fe7578181015183820152602001611fcf565b50506000910152565b6000611ffa825190565b808452602084019350612011818560208601611fcc565b601f01601f19169290920192915050565b805160009060608401906120368582611acc565b506020830151848203602086015261204e8282611ff0565b91505060408301516119136040860182611acc565b604081016120718285611acc565b8181036020830152611ebd8184612022565b60008060008060006060868803121561209e5761209e600080fd5b6120a88787611bff565b9450602086013567ffffffffffffffff8111156120c7576120c7600080fd5b6120d388828901611d2d565b9450945050604086013567ffffffffffffffff8111156120f5576120f5600080fd5b61210188828901611d2d565b92509250509295509295909350565b6000611bb08383611ff0565b60200190565b600061212c825190565b808452602084019350836020820285016121468560200190565b60005b8481101561217a57838303885281516121628482612110565b93505060208201602098909801979150600101612149565b50909695505050505050565b60208082528101611bb08184612122565b600060608284031215611f1057611f10600080fd5b6000602082840312156121c1576121c1600080fd5b813567ffffffffffffffff8111156121db576121db600080fd5b611ebd84828501612197565b604081016120718285611e6c565b60208082528101611bb08184611ff0565b60006115446001600160a01b03831661221d565b90565b6001600160a01b031690565b600061154482612206565b600061154482612229565b611ace81612234565b60208101611544828461223f565b60006020828403121561226b5761226b600080fd5b813567ffffffffffffffff81111561228557612285600080fd5b611ebd84828501611d0a565b801515611bf4565b803561154481612291565b600080600080600060a086880312156122bf576122bf600080fd5b6122c98787611bff565b94506122d88760208801611bff565b9350604086013567ffffffffffffffff8111156122f7576122f7600080fd5b61230388828901611bb7565b935050606086013567ffffffffffffffff81111561232357612323600080fd5b61232f88828901611bb7565b92505061233f8760808801612299565b90509295509295909350565b6000806020838503121561236157612361600080fd5b823567ffffffffffffffff81111561237b5761237b600080fd5b61238785828601611d2d565b92509250509250929050565b600061239d825190565b6123ab818560208601611fcc565b9290920192915050565b6115448183612393565b634e487b7160e01b600052602260045260246000fd5b6002810460018216806123e957607f821691505b602082108103611f1057611f106123bf565b600061154461221a8381565b612410836123fb565b815460001960089490940293841b1916921b91909117905550565b6000612438818484612407565b505050565b818110156118075761245060008261242b565b60010161243d565b601f821115612438576000818152602090206020601f8501048101602085101561247f5750805b610f796020601f86010483018261243d565b815167ffffffffffffffff8111156124ab576124ab611ae2565b6124b582546123d5565b6124c0828285612458565b506020601f8211600181146124f557600083156124dd5750848201515b600019600885021c1981166002850217855550610f79565b600084815260208120601f198516915b828110156125255787850151825560209485019460019092019101612505565b50848210156125425783870151600019601f87166008021c191681555b50505050600202600101905550565b604080825281016125628185611ff0565b9050611bb06020830184611ec5565b634e487b7160e01b600052601160045260246000fd5b8082018082111561154457611544612571565b60158152602081017f426c6f636b2062696e64696e6720746f6f206f6c6400000000000000000000008152905061211c565b602080825281016115448161259a565b60368152602081017f43616e6e6f742062696e6420746f2074686520626c6f636b207468617420697381527f206265696e672063757272656e746c79206d696e656400000000000000000000602082015290505b60400190565b60208082528101611544816125dc565b60128152602081017f556e6b6e6f776e20626c6f636b206861736800000000000000000000000000008152905061211c565b6020808252810161154481612646565b60168152602081017f426c6f636b2062696e64696e67206d69736d61746368000000000000000000008152905061211c565b6020808252810161154481612688565b600e8152602081017f496e76616c696420666f726b49440000000000000000000000000000000000008152905061211c565b60208082528101611544816126ca565b6000612716825190565b808452602084019350836020820285016127308560200190565b60005b8481101561217a578383038852815161274c8482612110565b93505060208201602098909801979150600101612733565b608081016127728287611acc565b61277f6020830186611acc565b61278c6040830185611acc565b818103606083015261279e818461270c565b9695505050505050565b60178152602081017f61646472657373206e6f7420612073657175656e6365720000000000000000008152905061211c565b60208082528101611544816127a8565b634e487b7160e01b600052603260045260246000fd5b6000611544825190565b6000612814825190565b6020830161282181612800565b9250506020811015611f10576000196020919091036008021b16919050565b6040810161284e8285611acc565b611bb06020830184611acc565b60168152602081017f656e636c6176654944206e6f74206174746573746564000000000000000000008152905061211c565b602080825281016115448161285b565b5060006115446020830183611bff565b5060006115446020830183611c65565b67ffffffffffffffff8116611bf4565b8035611544816128bd565b50600061154460208301836128cd565b67ffffffffffffffff8116611ace565b612902818061289d565b61290c8382611ec5565b5061291a602082018261289d565b6129276020840182611ec5565b5061293560408201826128ad565b6129426040840182611acc565b5061295060608201826128d8565b61243860608401826128e8565b82818337505050565b81835260208301925060007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311156129a1576129a1600080fd5b6020830292506129b283858461295d565b50500190565b60c081016129c682876128f8565b81810360808301526129d9818587612966565b90506129e860a0830184611acc565b95945050505050565b6080810161154482846128f8565b60188152602081017f7769746864726177616c20616c7265616479207370656e7400000000000000008152905061211c565b60208082528101611544816129ff565b6040810161284e8285611ec5565b60228152602081017f6e6574776f726b2073656372657420616c726561647920696e697469616c697a81527f656400000000000000000000000000000000000000000000000000000000000060208201529050612630565b6020808252810161154481612a4f565b60198152602081017f656e636c6176654944206e6f7420612073657175656e636572000000000000008152905061211c565b6020808252810161154481612ab7565b600067ffffffffffffffff8216611544565b611ace81612af9565b602081016115448284612b0b565b6000808335601e1936859003018112612b3d57612b3d600080fd5b8301915050803567ffffffffffffffff811115612b5c57612b5c600080fd5b602082019150600181023603821315611d7857611d78600080fd5b60238152602081017f726573706f6e64696e67206174746573746572206973206e6f7420617474657381527f746564000000000000000000000000000000000000000000000000000000000060208201529050612630565b6020808252810161154481612b77565b60006115448260601b90565b600061154482612bdf565b611ace612c0282611bda565b612beb565b612c118185612bf6565b601401612c1e8184612bf6565b601401611ebd8183612393565b602c8152602081017f63616c63756c61746564206164647265737320616e642061747465737465724981527f4420646f6e74206d61746368000000000000000000000000000000000000000060208201529050612630565b6020808252810161154481612c2b565b818352602083019250612ca7828483611b6c565b50601f01601f19160190565b60208082528101611ebd818486612c93565b6000813561154481611c5f565b600081611544565b612ce382612cd2565b612cef61221a82612cd2565b8255505050565b8267ffffffffffffffff811115612d0f57612d0f611ae2565b612d1982546123d5565b612d24828285612458565b506000601f821160018114612d595760008315612d415750848201355b600019600885021c1981166002850217855550612db3565b600084815260209020601f19841690835b82811015612d8a5787850135825560209485019460019092019101612d6a565b5084821015612da7576000196008601f8716021c19878501351681555b50506001600284020184555b505050505050565b612438838383612cf6565b612dcf826123fb565b80612cef565b8180612de081612cc5565b9050612dec8184612cda565b5050612dfb6020830183612b22565b612e09818360018601612dbb565b50506040820180612e1982612cc5565b9050610d9f8160028501612dc6565b6118078282612dd5565b8181038181111561154457611544612571565b600060018201612e5757612e57612571565b5060010190565b7f19457468657265756d205369676e6564204d6573736167653a0a0000000000008152601a01612e8e8184612393565b9050611bb08183612393565b634e487b7160e01b600052602160045260246000fd5b60ff8116611ace565b60808101612ec78287611acc565b612ed46020830186612eb0565b612ee16040830185611acc565b6129e86060830184611acc56fe608060405234801561001057600080fd5b5061001a33610027565b610022610098565b61014a565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100e85760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101475780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b612455806101596000396000f3fe6080604052600436106101115760003560e01c80638da5cb5b116100a5578063b1454caa11610074578063b6aed0cb11610059578063b6aed0cb1461038b578063e138a8d2146103ab578063f2fde38b146103cb57610185565b8063b1454caa1461034b578063b201246f1461036b57610185565b80638da5cb5b146102a65780639730886d146102eb57806399a3ad211461030b578063ab53bddc1461032b57610185565b8063346633fb116100e1578063346633fb1461023e57806336d2da9014610251578063485cc95514610271578063715018a61461029157610185565b8062a1b815146101a65780630fcfbd11146101d15780630fe9188e146101f157806333a88c721461021157610185565b36610185576040517f346633fb000000000000000000000000000000000000000000000000000000008152309063346633fb90349061015690339083906004016111ea565b6000604051808303818588803b15801561016f57600080fd5b505af1158015610183573d6000803e3d6000fd5b005b60405162461bcd60e51b815260040161019d90611239565b60405180910390fd5b3480156101b257600080fd5b506101bb6103eb565b6040516101c89190611249565b60405180910390f35b3480156101dd57600080fd5b506101bb6101ec366004611272565b610477565b3480156101fd57600080fd5b5061018361020c3660046112c5565b6104d6565b34801561021d57600080fd5b5061023161022c366004611272565b61051c565b6040516101c891906112ec565b61018361024c36600461130e565b61056e565b34801561025d57600080fd5b5061018361026c366004611346565b6106bd565b34801561027d57600080fd5b5061018361028c366004611365565b61073c565b34801561029d57600080fd5b506101836108a7565b3480156102b257600080fd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03166040516101c89190611394565b3480156102f757600080fd5b506101836103063660046113a2565b6108bb565b34801561031757600080fd5b5061018361032636600461130e565b610a27565b34801561033757600080fd5b5061018361034636600461130e565b610aa7565b61035e61035936600461146b565b610b70565b6040516101c891906114f8565b34801561037757600080fd5b50610183610386366004611566565b610c7d565b34801561039757600080fd5b506101836103a63660046115d1565b610d7e565b3480156103b757600080fd5b506101836103c63660046115f1565b610dc4565b3480156103d757600080fd5b506101836103e6366004611346565b610f0f565b600354604080517f1a90a21900000000000000000000000000000000000000000000000000000000815290516000926001600160a01b031691631a90a2199160048083019260209291908290030181865afa15801561044e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104729190611679565b905090565b6000808260405160200161048b9190611837565b60408051601f198184030181529181528151602092830120600081815292839052912054909150806104cf5760405162461bcd60e51b815260040161019d90611886565b9392505050565b6104de610f66565b600081815260046020526040812054900361050b5760405162461bcd60e51b815260040161019d906118c8565b600090815260046020526040812055565b600080826040516020016105309190611837565b60408051601f19818403018152918152815160209283012060008181529283905291205490915080158015906105665750428111155b949350505050565b60003411801561057d57508034145b6105995760405162461bcd60e51b815260040161019d90611930565b60035434906001600160a01b03161561065d5760006105b66103eb565b9050803410156105d85760405162461bcd60e51b815260040161019d90611970565b6105e28134611996565b6003546040519193506000916001600160a01b039091169083908381818185875af1925050503d8060008114610634576040519150601f19603f3d011682016040523d82523d6000602084013e610639565b606091505b505090508061065a5760405162461bcd60e51b815260040161019d90611a01565b50505b600061066833610fda565b9050836001600160a01b0316336001600160a01b03167f50c536ac33a920f00755865b831d17bf4cff0b2e0345f65b16d52bfc004068b684846040516106af929190611a11565b60405180910390a350505050565b6106c5610f66565b6000816001600160a01b03164760405160006040518083038185875af1925050503d8060008114610712576040519150601f19603f3d011682016040523d82523d6000602084013e610717565b606091505b50509050806107385760405162461bcd60e51b815260040161019d90611a5e565b5050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff16159067ffffffffffffffff166000811580156107875750825b905060008267ffffffffffffffff1660011480156107a45750303b155b9050811580156107b2575080155b156107e9576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561081d57845468ff00000000000000001916680100000000000000001785555b61082687611038565b6003805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038816179055831561089e57845468ff0000000000000000191685556040517fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29061089590600190611a92565b60405180910390a15b50505050505050565b6108af610f66565b6108b96000611049565b565b60006108c8600130611aa0565b90506108fb7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316336001600160a01b031614806109225750336001600160a01b038216145b61093e5760405162461bcd60e51b815260040161019d90611af5565b600061094a8342611b05565b905060008460405160200161095f9190611837565b60408051601f198184030181529181528151602092830120600081815292839052912054909150156109a35760405162461bcd60e51b815260040161019d90611b70565b6000818152602081815260408220849055600191906109c490880188611346565b6001600160a01b0316815260208101919091526040016000908120906109f06080880160608901611b80565b63ffffffff1681526020808201929092526040016000908120805460018101825590825291902086916004020161089e8282611fbe565b610a2f610f66565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114610a7c576040519150601f19603f3d011682016040523d82523d6000602084013e610a81565b606091505b5050905080610aa25760405162461bcd60e51b815260040161019d90611a5e565b505050565b6000610ab4600130611aa0565b9050610ae77f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316336001600160a01b03161480610b0e5750336001600160a01b038216145b610b2a5760405162461bcd60e51b815260040161019d90611af5565b826001600160a01b03167fcd9850463422a7449c406a036e35e5edb6fbe35a64c9f12a2354be98a750c0d383604051610b639190611249565b60405180910390a2505050565b6003546000906001600160a01b031615610c26576000610b8e6103eb565b905080341015610bb05760405162461bcd60e51b815260040161019d90612020565b6003546040516000916001600160a01b03169083908381818185875af1925050503d8060008114610bfd576040519150601f19603f3d011682016040523d82523d6000602084013e610c02565b606091505b5050905080610c235760405162461bcd60e51b815260040161019d90611a01565b50505b610c2f33610fda565b90507fb93c37389233beb85a3a726c3f15c2d15533ee74cb602f20f490dfffef77593733828888888888604051610c6c9796959493929190612030565b60405180910390a195945050505050565b6000818152600460205260408120549003610caa5760405162461bcd60e51b815260040161019d906120eb565b600081815260046020526040902054421015610cd85760405162461bcd60e51b815260040161019d90612137565b600084604051602001610ceb91906121bc565b60405160208183030381529060405280519060200120604051602001610d1191906121fc565b604051602081830303815290604052805190602001209050610d5b84848484604051602001610d40919061221b565b604051602081830303815290604052805190602001206110c7565b610d775760405162461bcd60e51b815260040161019d90612285565b5050505050565b610d86610f66565b60008281526004602052604090205415610db25760405162461bcd60e51b815260040161019d906122ed565b60009182526004602052604090912055565b6000818152600460205260408120549003610df15760405162461bcd60e51b815260040161019d906120eb565b600081815260046020526040902054421015610e1f5760405162461bcd60e51b815260040161019d90612137565b6000610e2e6020860186611346565b610e3e60408701602088016122fd565b610e4e6060880160408901611b80565b610e5e6080890160608a01611b80565b610e6b60808a018a611cd7565b610e7b60c08c0160a08d0161231c565b604051602001610e919796959493929190612030565b604051602081830303815290604052805190602001209050600081604051602001610ebc919061236d565b604051602081830303815290604052805190602001209050610eeb85858584604051602001610d40919061221b565b610f075760405162461bcd60e51b815260040161019d906123d5565b505050505050565b610f17610f66565b6001600160a01b038116610f5a5760006040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161019d9190611394565b610f6381611049565b50565b33610f987f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146108b957336040517f118cdaa700000000000000000000000000000000000000000000000000000000815260040161019d9190611394565b6001600160a01b0381166000908152600260205260408120805467ffffffffffffffff16916001919061100d83856123e5565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550919050565b6110406110df565b610f6381611146565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300805473ffffffffffffffffffffffffffffffffffffffff1981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b6000826110d586868561114e565b1495945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005468010000000000000000900460ff166108b9576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f176110df565b600081815b848110156111875761117d8287878481811061117157611171612409565b90506020020135611190565b9150600101611153565b50949350505050565b60008183106111ac5760008281526020849052604090206111bb565b60008381526020839052604090205b90505b92915050565b60006001600160a01b0382166111be565b6111de816111c4565b82525050565b806111de565b604081016111f882856111d5565b6104cf60208301846111e4565b600b8152602081017f756e737570706f72746564000000000000000000000000000000000000000000815290505b60200190565b602080825281016111be81611205565b602081016111be82846111e4565b600060c0828403121561126c5761126c600080fd5b50919050565b60006020828403121561128757611287600080fd5b813567ffffffffffffffff8111156112a1576112a1600080fd5b61056684828501611257565b805b8114610f6357600080fd5b80356111be816112ad565b6000602082840312156112da576112da600080fd5b6111bb83836112ba565b8015156111de565b602081016111be82846112e4565b6112af816111c4565b80356111be816112fa565b6000806040838503121561132457611324600080fd5b61132e8484611303565b915061133d84602085016112ba565b90509250929050565b60006020828403121561135b5761135b600080fd5b6111bb8383611303565b6000806040838503121561137b5761137b600080fd5b6113858484611303565b915061133d8460208501611303565b602081016111be82846111d5565b600080604083850312156113b8576113b8600080fd5b823567ffffffffffffffff8111156113d2576113d2600080fd5b6113de85828601611257565b92505061133d84602085016112ba565b63ffffffff81166112af565b80356111be816113ee565b60008083601f84011261141a5761141a600080fd5b50813567ffffffffffffffff81111561143557611435600080fd5b60208301915083600182028301111561145057611450600080fd5b9250929050565b60ff81166112af565b80356111be81611457565b60008060008060006080868803121561148657611486600080fd5b61149087876113fa565b945061149f87602088016113fa565b9350604086013567ffffffffffffffff8111156114be576114be600080fd5b6114ca88828901611405565b93509350506114dc8760608801611460565b90509295509295909350565b67ffffffffffffffff81166111de565b602081016111be82846114e8565b60006080828403121561126c5761126c600080fd5b60008083601f84011261153057611530600080fd5b50813567ffffffffffffffff81111561154b5761154b600080fd5b60208301915083602082028301111561145057611450600080fd5b60008060008060c0858703121561157f5761157f600080fd5b6115898686611506565b9350608085013567ffffffffffffffff8111156115a8576115a8600080fd5b6115b48782880161151b565b93509350506115c68660a087016112ba565b905092959194509250565b600080604083850312156115e7576115e7600080fd5b61132e84846112ba565b6000806000806060858703121561160a5761160a600080fd5b843567ffffffffffffffff81111561162457611624600080fd5b61163087828801611257565b945050602085013567ffffffffffffffff81111561165057611650600080fd5b61165c8782880161151b565b93509350506115c686604087016112ba565b80516111be816112ad565b60006020828403121561168e5761168e600080fd5b6111bb838361166e565b5060006111be6020830183611303565b67ffffffffffffffff81166112af565b80356111be816116a8565b5060006111be60208301836116b8565b5060006111be60208301836113fa565b63ffffffff81166111de565b6000808335601e193685900301811261170a5761170a600080fd5b830160208101925035905067ffffffffffffffff81111561172d5761172d600080fd5b3681900382131561145057611450600080fd5b82818337506000910152565b818352602083019250611760828483611740565b50601f01601f19160190565b5060006111be6020830183611460565b60ff81166111de565b600060c083016117958380611698565b61179f85826111d5565b506117ad60208401846116c3565b6117ba60208601826114e8565b506117c860408401846116d3565b6117d560408601826116e3565b506117e360608401846116d3565b6117f060608601826116e3565b506117fe60808401846116ef565b858303608087015261181183828461174c565b9250505061182260a084018461176c565b61182f60a086018261177c565b509392505050565b602080825281016111bb8184611785565b60218152602081017f54686973206d65737361676520776173206e65766572207375626d69747465648152601760f91b602082015290505b60400190565b602080825281016111be81611848565b601a8152602081017f537461746520726f6f7420646f6573206e6f742065786973742e00000000000081529050611233565b602080825281016111be81611896565b60308152602081017f417474656d7074696e6720746f2073656e642076616c756520776974686f757481527f2070726f766964696e672045746865720000000000000000000000000000000060208201529050611880565b602080825281016111be816118d8565b60208082527f496e73756666696369656e742066756e647320746f2073656e642076616c75659101908152611233565b602080825281016111be81611940565b634e487b7160e01b600052601160045260246000fd5b818103818111156111be576111be611980565b60248152602081017f4661696c656420746f2073656e64206665657320746f206665657320636f6e7481527f726163740000000000000000000000000000000000000000000000000000000060208201529050611880565b602080825281016111be816119a9565b60408101611a1f82856111e4565b6104cf60208301846114e8565b60148152602081017f6661696c65642073656e64696e672076616c756500000000000000000000000081529050611233565b602080825281016111be81611a2c565b60006111be82611a7c565b90565b67ffffffffffffffff1690565b6111de81611a6e565b602081016111be8284611a89565b6001600160a01b039182169190811690828203908111156111be576111be611980565b60118152602081017f4e6f74206f776e6572206f722073656c6600000000000000000000000000000081529050611233565b602080825281016111be81611ac3565b808201808211156111be576111be611980565b60218152602081017f4d657373616765207375626d6974746564206d6f7265207468616e206f6e636581527f210000000000000000000000000000000000000000000000000000000000000060208201529050611880565b602080825281016111be81611b18565b600060208284031215611b9557611b95600080fd5b6111bb83836113fa565b600081356111be816112fa565b60006001600160a01b03835b81169019929092169190911792915050565b60006111be826111c4565b60006111be82611bca565b611be982611bd5565b611bf4818354611bac565b8255505050565b600081356111be816116a8565b60007bffffffffffffffff0000000000000000000000000000000000000000611bb88460a01b90565b60006111be67ffffffffffffffff8316611a7c565b611c4f82611c31565b611bf4818354611c08565b600081356111be816113ee565b60007fffffffff00000000000000000000000000000000000000000000000000000000611bb88460e01b90565b600063ffffffff82166111be565b611cab82611c94565b611bf4818354611c67565b600063ffffffff83611bb8565b611ccc82611c94565b611bf4818354611cb6565b6000808335601e1936859003018112611cf257611cf2600080fd5b8301915050803567ffffffffffffffff811115611d1157611d11600080fd5b60208201915060018102360382131561145057611450600080fd5b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052602260045260246000fd5b600281046001821680611d6c57607f821691505b60208210810361126c5761126c611d42565b60006111be611a798381565b611d9383611d7e565b815460001960089490940293841b1916921b91909117905550565b6000610aa2818484611d8a565b8181101561073857611dce600082611dae565b600101611dbb565b601f821115610aa2576000818152602090206020601f85010481016020851015611dfd5750805b610d776020601f860104830182611dbb565b8267ffffffffffffffff811115611e2857611e28611d2c565b611e328254611d58565b611e3d828285611dd6565b506000601f821160018114611e725760008315611e5a5750848201355b600019600885021c1981166002850217855550610f07565b600084815260209020601f19841690835b82811015611ea35787850135825560209485019460019092019101611e83565b5084821015611ec0576000196008601f8716021c19878501351681555b5050505060020260010190555050565b610aa2838383611e0f565b600081356111be81611457565b600060ff82166111be565b611efc82611ee8565b815460ff191660ff821617611bf4565b808280611f1881611b9f565b9050611f248184611be0565b50506020830180611f3482611bfb565b9050611f408184611c46565b50506040830180611f5082611c5a565b9050611f5c8184611ca2565b5050506060820180611f6d82611c5a565b9050611f7c8160018501611cc3565b5050611f8b6080830183611cd7565b611f99818360028601611ed0565b505060a0820180611fa982611edb565b9050611fb88160038501611ef3565b50505050565b6107388282611f0c565b60258152602081017f496e73756666696369656e742066756e647320746f207075626c697368206d6581527f737361676500000000000000000000000000000000000000000000000000000060208201529050611880565b602080825281016111be81611fc8565b60c0810161203e828a6111d5565b61204b60208301896114e8565b61205860408301886116e3565b61206560608301876116e3565b818103608083015261207881858761174c565b905061208760a083018461177c565b98975050505050505050565b602a8152602081017f526f6f74206973206e6f74207075626c6973686564206f6e2074686973206d6581527f7373616765206275732e0000000000000000000000000000000000000000000060208201529050611880565b602080825281016111be81612093565b60218152602081017f526f6f74206973206e6f7420636f6e736964657265642066696e616c207965748152601760f91b60208201529050611880565b602080825281016111be816120fb565b5060006111be60208301836112ba565b6121618180611698565b61216b83826111d5565b506121796020820182611698565b61218660208401826111d5565b506121946040820182612147565b6121a160408401826111e4565b506121af60608201826116c3565b610aa260608401826114e8565b608081016111be8284612157565b60018152602081017f760000000000000000000000000000000000000000000000000000000000000081529050611233565b6040808252810161220c816121ca565b90506111be60208301846111e4565b61222581836111e4565b602001919050565b60338152602081017f496e76616c696420696e636c7573696f6e2070726f6f6620666f722076616c7581527f65207472616e73666572206d6573736167652e0000000000000000000000000060208201529050611880565b602080825281016111be8161222d565b60258152602081017f526f6f7420616c726561647920616464656420746f20746865206d657373616781527f652062757300000000000000000000000000000000000000000000000000000060208201529050611880565b602080825281016111be81612295565b60006020828403121561231257612312600080fd5b6111bb83836116b8565b60006020828403121561233157612331600080fd5b6111bb8383611460565b60018152602081017f6d0000000000000000000000000000000000000000000000000000000000000081529050611233565b6040808252810161220c8161233b565b60308152602081017f496e76616c696420696e636c7573696f6e2070726f6f6620666f722063726f7381527f7320636861696e206d6573736167652e0000000000000000000000000000000060208201529050611880565b602080825281016111be8161237d565b67ffffffffffffffff9182169190811690828201908111156111be576111be611980565b634e487b7160e01b600052603260045260246000fdfea26469706673582212209046d260e6ecf02a9b545045265133ebd2a8a091d8cfe42d8fe9829451348f2664736f6c634300081c0033a26469706673582212206e103cacd124a8fe27302bed1a8f438aeb426147a4772aa9bf577e6fe456dce864736f6c634300081c0033", + ABI: "[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ECDSAInvalidSignature\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"}],\"name\":\"ECDSAInvalidSignatureLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"ECDSAInvalidSignatureS\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotInitializing\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"OwnableInvalidOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"OwnableUnauthorizedAccount\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newAddress\",\"type\":\"address\"}],\"name\":\"ImportantContractAddressUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"version\",\"type\":\"uint64\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"messageBusAddress\",\"type\":\"address\"}],\"name\":\"LogManagementContractCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"requester\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"requestReport\",\"type\":\"string\"}],\"name\":\"NetworkSecretRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"attester\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"requester\",\"type\":\"address\"}],\"name\":\"NetworkSecretResponded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"rollupHash\",\"type\":\"bytes32\"}],\"name\":\"RollupAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"enclaveID\",\"type\":\"address\"}],\"name\":\"SequencerEnclaveGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"enclaveID\",\"type\":\"address\"}],\"name\":\"SequencerEnclaveRevoked\",\"type\":\"event\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"Hash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"Signature\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"LastSequenceNumber\",\"type\":\"uint256\"}],\"internalType\":\"structStructs.MetaRollup\",\"name\":\"r\",\"type\":\"tuple\"}],\"name\":\"AddRollup\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_addr\",\"type\":\"address\"}],\"name\":\"Attested\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"sequence\",\"type\":\"uint64\"}],\"internalType\":\"structStructs.ValueTransferMessage\",\"name\":\"_msg\",\"type\":\"tuple\"},{\"internalType\":\"bytes32[]\",\"name\":\"proof\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes32\",\"name\":\"root\",\"type\":\"bytes32\"}],\"name\":\"ExtractNativeValue\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"GetChallengePeriod\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"GetImportantContractKeys\",\"outputs\":[{\"internalType\":\"string[]\",\"name\":\"\",\"type\":\"string[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"rollupHash\",\"type\":\"bytes32\"}],\"name\":\"GetRollupByHash\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"Hash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"Signature\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"LastSequenceNumber\",\"type\":\"uint256\"}],\"internalType\":\"structStructs.MetaRollup\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"number\",\"type\":\"uint256\"}],\"name\":\"GetRollupByNumber\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"Hash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"Signature\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"LastSequenceNumber\",\"type\":\"uint256\"}],\"internalType\":\"structStructs.MetaRollup\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"number\",\"type\":\"uint256\"}],\"name\":\"GetUniqueForkID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"Hash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"Signature\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"LastSequenceNumber\",\"type\":\"uint256\"}],\"internalType\":\"structStructs.MetaRollup\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_addr\",\"type\":\"address\"}],\"name\":\"GrantSequencerEnclave\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_enclaveID\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_initSecret\",\"type\":\"bytes\"},{\"internalType\":\"string\",\"name\":\"_genesisAttestation\",\"type\":\"string\"}],\"name\":\"InitializeNetworkSecret\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_addr\",\"type\":\"address\"}],\"name\":\"IsSequencerEnclave\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"IsWithdrawalAvailable\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"requestReport\",\"type\":\"string\"}],\"name\":\"RequestNetworkSecret\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"attesterID\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"requesterID\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"attesterSig\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"responseSecret\",\"type\":\"bytes\"},{\"internalType\":\"bool\",\"name\":\"verifyAttester\",\"type\":\"bool\"}],\"name\":\"RespondNetworkSecret\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"RetrieveAllBridgeFunds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_addr\",\"type\":\"address\"}],\"name\":\"RevokeSequencerEnclave\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_delay\",\"type\":\"uint256\"}],\"name\":\"SetChallengePeriod\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"newAddress\",\"type\":\"address\"}],\"name\":\"SetImportantContractAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_lastBatchHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"providedBlockHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"blockNum\",\"type\":\"uint256\"},{\"internalType\":\"bytes[]\",\"name\":\"crossChainHashes\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"rollupNumber\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"forkID\",\"type\":\"bytes32\"}],\"name\":\"addCrossChainMessagesRoot\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"name\":\"importantContractAddresses\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"importantContractKeys\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes[]\",\"name\":\"crossChainHashes\",\"type\":\"bytes[]\"}],\"name\":\"isBundleAvailable\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"isBundleSaved\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"isWithdrawalSpent\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastBatchHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastBatchSeqNo\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"merkleMessageBus\",\"outputs\":[{\"internalType\":\"contractIMerkleTreeMessageBus\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"messageBus\",\"outputs\":[{\"internalType\":\"contractIMessageBus\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", + Bin: "0x6080604052348015600f57600080fd5b50601733601b565b608c565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b61551c8061009b6000396000f3fe608060405234801561001057600080fd5b50600436106101ef5760003560e01c8063728109961161010f578063a1a227fa116100a2578063db5d91b111610071578063db5d91b1146104a6578063e34fbfc8146104d2578063e874eb20146104e5578063f2fde38b146104f857600080fd5b8063a1a227fa14610450578063a4ab2faa14610470578063a52f433c14610483578063d4fab8871461049357600080fd5b806384154826116100de57806384154826146103ca57806387059edb146103ed5780638da5cb5b1461040057806398077e861461043057600080fd5b806372810996146103865780638129fc1c1461038e57806381be5385146103965780638236a7ba146103a957600080fd5b8063476657381161018757806368e103831161015657806368e10383146103435780636a30d26c146103565780636b9707d61461036b578063715018a61461037e57600080fd5b806347665738146102e95780635024621f146102fc5780635371a2161461030f578063568699c81461032257600080fd5b80632f0cb9e3116101c35780632f0cb9e3146102435780633e60a22f1461027357806343348b2f146102b4578063440c953b146102e057600080fd5b80620ddd27146101f457806303e72e4814610213578063073b6ef3146102285780631aca00ab1461023b575b600080fd5b6101fd600e5481565b60405161020a9190611b1e565b60405180910390f35b610226610221366004611c54565b61050b565b005b610226610236366004611dc9565b610613565b600f546101fd565b610266610251366004611e97565b600c6020526000908152604090205460ff1681565b60405161020a9190611ebe565b6102a7610281366004611ecc565b80516020818301810180516003825292820191909301209152546001600160a01b031681565b60405161020a9190611f18565b6102666102c2366004611f26565b6001600160a01b031660009081526020819052604090205460ff1690565b6101fd60055481565b6102266102f7366004611f26565b6108a1565b61022661030a366004611e97565b610941565b61022661031d366004611fab565b61094e565b610335610330366004611e97565b610af3565b60405161020a9291906120ad565b6102266103513660046120cd565b610b49565b61035e610bed565b60405161020a91906121d0565b610226610379366004611f26565b610cc6565b610226610d56565b610226610d6a565b610226610def565b6102266103a43660046121f6565b610fca565b6103bc6103b7366004611e97565b6110c5565b60405161020a929190612231565b6102666103d8366004611e97565b600d6020526000908152604090205460ff1681565b6103bc6103fb366004611e97565b6111ad565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03166102a7565b61044361043e366004611e97565b611224565b60405161020a919061223f565b600a54610463906001600160a01b031681565b60405161020a9190612292565b61026661047e3660046122a0565b6112d0565b600454610100900460ff16610266565b6102266104a13660046122ee565b61134e565b6102666104b4366004611f26565b6001600160a01b031660009081526001602052604090205460ff1690565b6102266104e0366004612395565b611456565b600b54610463906001600160a01b031681565b610226610506366004611f26565b61149d565b6105136114f4565b60006001600160a01b031660038360405161052e91906123ff565b908152604051908190036020019020546001600160a01b03160361058a57600280546001810182556000919091527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0161058883826124db565b505b8060038360405161059b91906123ff565b90815260405190819003602001812080546001600160a01b039390931673ffffffffffffffffffffffffffffffffffffffff19909316929092179091557f17b2f9f5748931099ffee882b5b64f4a560b5c55da9b4f4e396dae3bb9f98cb590610607908490849061259b565b60405180910390a15050565b61061e8660ff6125d1565b43106106455760405162461bcd60e51b815260040161063c90612616565b60405180910390fd5b8543036106645760405162461bcd60e51b815260040161063c90612680565b854060008190036106875760405162461bcd60e51b815260040161063c906126c2565b8781146106a65760405162461bcd60e51b815260040161063c90612704565b60008381526008602052604090205482146106d35760405162461bcd60e51b815260040161063c90612746565b60006107418a8a8a8a6040516020016106ef94939291906127ae565b6040516020818303038152906040528051906020012087878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061156892505050565b6001600160a01b03811660009081526001602052604090205490915060ff1661077c5760405162461bcd60e51b815260040161063c90612824565b600e8a90556000805b885181101561087b57600b5489516001600160a01b039091169063b6aed0cb908b90849081106107b7576107b7612834565b60200260200101516107c890612854565b600f546107d590426125d1565b6040518363ffffffff1660e01b81526004016107f292919061288a565b600060405180830381600087803b15801561080c57600080fd5b505af1158015610820573d6000803e3d6000fd5b505050508189828151811061083757610837612834565b602002602001015161084890612854565b60405160200161085992919061288a565b60408051601f1981840301815291905280516020909101209150600101610785565b506000908152600d60205260409020805460ff1916600117905550505050505050505050565b6108a96114f4565b6001600160a01b03811660009081526020819052604090205460ff166108e15760405162461bcd60e51b815260040161063c906128d7565b6001600160a01b038116600090815260016020819052604091829020805460ff19169091179055517ffe64c7181f0fc60e300dc02cca368cdfa94d7ca45902de3b9a9d80070e76093690610936908390611f18565b60405180910390a150565b6109496114f4565b600f55565b600b546040517fb201246f0000000000000000000000000000000000000000000000000000000081526001600160a01b039091169063b201246f9061099d908790879087908790600401612a02565b60006040518083038186803b1580156109b557600080fd5b505afa1580156109c9573d6000803e3d6000fd5b505050506000846040516020016109e09190612a3b565b60408051601f1981840301815291815281516020928301206000818152600c90935291205490915060ff1615610a285760405162461bcd60e51b815260040161063c90612a7b565b6001600c600087604051602001610a3f9190612a3b565b60408051808303601f190181529181528151602092830120835282820193909352908201600020805460ff191693151593909317909255600a546001600160a01b0316916399a3ad2191610a9891908901908901611f26565b87604001356040518363ffffffff1660e01b8152600401610aba929190612a8b565b600060405180830381600087803b158015610ad457600080fd5b505af1158015610ae8573d6000803e3d6000fd5b505050505050505050565b604080516060808201835260008083526020830191909152918101829052600080610b1d856111ad565b9150915081610b325760009590945092505050565b600094855260086020526040909420549492505050565b60045460ff1615610b6c5760405162461bcd60e51b815260040161063c90612af1565b60048054600160ff1991821681179092556001600160a01b0387166000908152602081815260408083208054851686179055908490529081902080549092169092179055517ffe64c7181f0fc60e300dc02cca368cdfa94d7ca45902de3b9a9d80070e76093690610bde908790611f18565b60405180910390a15050505050565b60606002805480602002602001604051908101604052809291908181526020016000905b82821015610cbd578382906000526020600020018054610c309061241f565b80601f0160208091040260200160405190810160405280929190818152602001828054610c5c9061241f565b8015610ca95780601f10610c7e57610100808354040283529160200191610ca9565b820191906000526020600020905b815481529060010190602001808311610c8c57829003601f168201915b505050505081526020019060010190610c11565b50505050905090565b610cce6114f4565b6001600160a01b03811660009081526001602052604090205460ff16610d065760405162461bcd60e51b815260040161063c90612b33565b6001600160a01b03811660009081526001602052604090819020805460ff19169055517f0f279980343c7ca542fde9fa5396555068efb5cd560d9cf9c191aa2911079b4790610936908390611f18565b610d5e6114f4565b610d686000611594565b565b610d726114f4565b600a546040517f36d2da900000000000000000000000000000000000000000000000000000000081526001600160a01b03909116906336d2da9090610dbb903390600401611f18565b600060405180830381600087803b158015610dd557600080fd5b505af1158015610de9573d6000803e3d6000fd5b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff16159067ffffffffffffffff16600081158015610e3a5750825b905060008267ffffffffffffffff166001148015610e575750303b155b905081158015610e65575080155b15610e9c576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610ed057845468ff00000000000000001916680100000000000000001785555b610ed933611612565b60006005556001600955604051610eef90611b09565b604051809103906000f080158015610f0b573d6000803e3d6000fd5b50600b80546001600160a01b039290921673ffffffffffffffffffffffffffffffffffffffff199283168117909155600a805490921681179091556040517fbd726cf82ac9c3260b1495107182e336e0654b25c10915648c0cc15b2bb72cbf91610f7491611f18565b60405180910390a18315610fc357845468ff0000000000000000191685556040517fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290610bde90600190612b5e565b5050505050565b60006110188235610fde6020850185612b6c565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061156892505050565b6001600160a01b03811660009081526020819052604090205490915060ff166110535760405162461bcd60e51b815260040161063c906128d7565b6001600160a01b03811660009081526001602052604090205460ff1661108b5760405162461bcd60e51b815260040161063c90612b33565b61109482611623565b6040517fd6555bff8670bd3008dc064c30bb56d6ac7cb14ae801e36146fe4e7c6a504a589061060790843590611b1e565b6040805160608082018352600080835260208084018390528385018290528582526006815284822085519384019095528454835260018501805492958694939092840191906111139061241f565b80601f016020809104026020016040519081016040528092919081815260200182805461113f9061241f565b801561118c5780601f106111615761010080835404028352916020019161118c565b820191906000526020600020905b81548152906001019060200180831161116f57829003601f168201915b50505091835250506002919091015460209091015280519094149492505050565b6040805160608082018352600080835260208301919091529181018290526000838152600760205260408120549081900361121157505060408051606081018252600080825282516020818101855282825283015291810182905290939092509050565b61121a816110c5565b9250925050915091565b6002818154811061123457600080fd5b90600052602060002001600091509050805461124f9061241f565b80601f016020809104026020016040519081016040528092919081815260200182805461127b9061241f565b80156112c85780601f1061129d576101008083540402835291602001916112c8565b820191906000526020600020905b8154815290600101906020018083116112ab57829003601f168201915b505050505081565b600080805b835181101561133557818482815181106112f1576112f1612834565b602002602001015161130290612854565b60405160200161131392919061288a565b60408051601f19818403018152919052805160209091012091506001016112d5565b506000908152600d602052604090205460ff1692915050565b6001600160a01b03851660009081526020819052604090205460ff16806113875760405162461bcd60e51b815260040161063c90612c19565b81156113ff5760006113bb8787866040516020016113a793929190612c51565b6040516020818303038152906040526116c7565b905060006113c98287611568565b9050876001600160a01b0316816001600160a01b0316146113fc5760405162461bcd60e51b815260040161063c90612ccd565b50505b6001600160a01b03808616600081815260208190526040808220805460ff191660011790555191928916917fb869e23ebc7c717d76e345eee8ec282612603e45c44f7ae5494b197c8d9d1be19190a3505050505050565b336001600160a01b03167f0b0ecdedd12079aa2d6c5e0186026c711cb0c8d04f1b724ba5880fb6328d43018383604051611491929190612cfd565b60405180910390a25050565b6114a56114f4565b6001600160a01b0381166114e85760006040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161063c9190611f18565b6114f181611594565b50565b336115267f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b031614610d6857336040517f118cdaa700000000000000000000000000000000000000000000000000000000815260040161063c9190611f18565b6000806000806115788686611702565b925092509250611588828261174f565b50909150505b92915050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300805473ffffffffffffffffffffffffffffffffffffffff1981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b61161a611855565b6114f1816118bc565b80356000908152600660205260409020819061163f8282612e72565b50506009546000908152600760205260409020813590819055611663600143612e7c565b4060405160200161167592919061288a565b60408051601f1981840301815291815281516020928301206009805460009081526008909452918320558054916116ab83612e8f565b9190505550600554816040013511156114f15760400135600555565b60006116d382516118c4565b826040516020016116e5929190612ea8565b604051602081830303815290604052805190602001209050919050565b6000806000835160410361173c5760208401516040850151606086015160001a61172e88828585611965565b955095509550505050611748565b50508151600091506002905b9250925092565b600082600381111561176357611763612ee4565b0361176c575050565b600182600381111561178057611780612ee4565b036117b7576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60028260038111156117cb576117cb612ee4565b03611804576040517ffce698f700000000000000000000000000000000000000000000000000000000815261063c908290600401611b1e565b600382600381111561181857611818612ee4565b0361185157806040517fd78bce0c00000000000000000000000000000000000000000000000000000000815260040161063c9190611b1e565b5050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005468010000000000000000900460ff16610d68576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6114a5611855565b606060006118d183611a27565b600101905060008167ffffffffffffffff8111156118f1576118f1611b2c565b6040519080825280601f01601f19166020018201604052801561191b576020820181803683370190505b5090508181016020015b600019017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8504945084611925575b509392505050565b600080807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411156119a05750600091506003905082611a1d565b6000600188888888604051600081526020016040526040516119c59493929190612f03565b6020604051602081039080840390855afa1580156119e7573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116611a1357506000925060019150829050611a1d565b9250600091508190505b9450945094915050565b6000807a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310611a70577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef81000000008310611a9c576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310611aba57662386f26fc10000830492506010015b6305f5e1008310611ad2576305f5e100830492506008015b6127108310611ae657612710830492506004015b60648310611af8576064830492506002015b600a831061158e5760010192915050565b6125ae80612f3983390190565b805b82525050565b6020810161158e8284611b16565b634e487b7160e01b600052604160045260246000fd5b601f19601f830116810181811067ffffffffffffffff82111715611b6857611b68611b2c565b6040525050565b6000611b7a60405190565b9050611b868282611b42565b919050565b600067ffffffffffffffff821115611ba557611ba5611b2c565b601f19601f83011660200192915050565b82818337506000910152565b6000611bd5611bd084611b8b565b611b6f565b9050828152838383011115611bec57611bec600080fd5b611bfa836020830184611bb6565b9392505050565b600082601f830112611c1557611c15600080fd5b611bfa83833560208501611bc2565b60006001600160a01b03821661158e565b611c3e81611c24565b81146114f157600080fd5b803561158e81611c35565b60008060408385031215611c6a57611c6a600080fd5b823567ffffffffffffffff811115611c8457611c84600080fd5b611c9085828601611c01565b925050611ca08460208501611c49565b90509250929050565b80611c3e565b803561158e81611ca9565b600067ffffffffffffffff821115611cd457611cd4611b2c565b5060209081020190565b6000611cec611bd084611cba565b83815290506020808201908402830185811115611d0b57611d0b600080fd5b835b81811015611d4a57803567ffffffffffffffff811115611d2f57611d2f600080fd5b611d3b88828801611c01565b84525060209283019201611d0d565b5050509392505050565b600082601f830112611d6857611d68600080fd5b611bfa83833560208501611cde565b60008083601f840112611d8c57611d8c600080fd5b50813567ffffffffffffffff811115611da757611da7600080fd5b602083019150836001820283011115611dc257611dc2600080fd5b9250929050565b60008060008060008060008060e0898b031215611de857611de8600080fd5b611df28a8a611caf565b9750611e018a60208b01611caf565b9650611e108a60408b01611caf565b9550606089013567ffffffffffffffff811115611e2f57611e2f600080fd5b611e3b8b828c01611d54565b955050608089013567ffffffffffffffff811115611e5b57611e5b600080fd5b611e678b828c01611d77565b9450945050611e798a60a08b01611caf565b9150611e888a60c08b01611caf565b90509295985092959890939650565b600060208284031215611eac57611eac600080fd5b611bfa8383611caf565b801515611b18565b6020810161158e8284611eb6565b600060208284031215611ee157611ee1600080fd5b813567ffffffffffffffff811115611efb57611efb600080fd5b611f0784828501611c01565b949350505050565b611b1881611c24565b6020810161158e8284611f0f565b600060208284031215611f3b57611f3b600080fd5b611bfa8383611c49565b600060808284031215611f5a57611f5a600080fd5b50919050565b60008083601f840112611f7557611f75600080fd5b50813567ffffffffffffffff811115611f9057611f90600080fd5b602083019150836020820283011115611dc257611dc2600080fd5b60008060008060c08587031215611fc457611fc4600080fd5b611fce8686611f45565b9350608085013567ffffffffffffffff811115611fed57611fed600080fd5b611ff987828801611f60565b935093505061200b8660a08701611caf565b905092959194509250565b60005b83811015612031578181015183820152602001612019565b50506000910152565b6000612044825190565b80845260208401935061205b818560208601612016565b601f01601f19169290920192915050565b805160009060608401906120808582611b16565b5060208301518482036020860152612098828261203a565b915050604083015161195d6040860182611b16565b604081016120bb8285611b16565b8181036020830152611f07818461206c565b6000806000806000606086880312156120e8576120e8600080fd5b6120f28787611c49565b9450602086013567ffffffffffffffff81111561211157612111600080fd5b61211d88828901611d77565b9450945050604086013567ffffffffffffffff81111561213f5761213f600080fd5b61214b88828901611d77565b92509250509295509295909350565b6000611bfa838361203a565b60200190565b6000612176825190565b808452602084019350836020820285016121908560200190565b60005b848110156121c457838303885281516121ac848261215a565b93505060208201602098909801979150600101612193565b50909695505050505050565b60208082528101611bfa818461216c565b600060608284031215611f5a57611f5a600080fd5b60006020828403121561220b5761220b600080fd5b813567ffffffffffffffff81111561222557612225600080fd5b611f07848285016121e1565b604081016120bb8285611eb6565b60208082528101611bfa818461203a565b600061158e6001600160a01b038316612267565b90565b6001600160a01b031690565b600061158e82612250565b600061158e82612273565b611b188161227e565b6020810161158e8284612289565b6000602082840312156122b5576122b5600080fd5b813567ffffffffffffffff8111156122cf576122cf600080fd5b611f0784828501611d54565b801515611c3e565b803561158e816122db565b600080600080600060a0868803121561230957612309600080fd5b6123138787611c49565b94506123228760208801611c49565b9350604086013567ffffffffffffffff81111561234157612341600080fd5b61234d88828901611c01565b935050606086013567ffffffffffffffff81111561236d5761236d600080fd5b61237988828901611c01565b92505061238987608088016122e3565b90509295509295909350565b600080602083850312156123ab576123ab600080fd5b823567ffffffffffffffff8111156123c5576123c5600080fd5b6123d185828601611d77565b92509250509250929050565b60006123e7825190565b6123f5818560208601612016565b9290920192915050565b61158e81836123dd565b634e487b7160e01b600052602260045260246000fd5b60028104600182168061243357607f821691505b602082108103611f5a57611f5a612409565b600061158e6122648381565b61245a83612445565b815460001960089490940293841b1916921b91909117905550565b6000612482818484612451565b505050565b818110156118515761249a600082612475565b600101612487565b601f821115612482576000818152602090206020601f850104810160208510156124c95750805b610fc36020601f860104830182612487565b815167ffffffffffffffff8111156124f5576124f5611b2c565b6124ff825461241f565b61250a8282856124a2565b506020601f82116001811461253f57600083156125275750848201515b600019600885021c1981166002850217855550610fc3565b600084815260208120601f198516915b8281101561256f578785015182556020948501946001909201910161254f565b508482101561258c5783870151600019601f87166008021c191681555b50505050600202600101905550565b604080825281016125ac818561203a565b9050611bfa6020830184611f0f565b634e487b7160e01b600052601160045260246000fd5b8082018082111561158e5761158e6125bb565b60158152602081017f426c6f636b2062696e64696e6720746f6f206f6c64000000000000000000000081529050612166565b6020808252810161158e816125e4565b60368152602081017f43616e6e6f742062696e6420746f2074686520626c6f636b207468617420697381527f206265696e672063757272656e746c79206d696e656400000000000000000000602082015290505b60400190565b6020808252810161158e81612626565b60128152602081017f556e6b6e6f776e20626c6f636b2068617368000000000000000000000000000081529050612166565b6020808252810161158e81612690565b60168152602081017f426c6f636b2062696e64696e67206d69736d617463680000000000000000000081529050612166565b6020808252810161158e816126d2565b600e8152602081017f496e76616c696420666f726b494400000000000000000000000000000000000081529050612166565b6020808252810161158e81612714565b6000612760825190565b8084526020840193508360208202850161277a8560200190565b60005b848110156121c45783830388528151612796848261215a565b9350506020820160209890980197915060010161277d565b608081016127bc8287611b16565b6127c96020830186611b16565b6127d66040830185611b16565b81810360608301526127e88184612756565b9695505050505050565b60178152602081017f61646472657373206e6f7420612073657175656e63657200000000000000000081529050612166565b6020808252810161158e816127f2565b634e487b7160e01b600052603260045260246000fd5b600061158e825190565b600061285e825190565b6020830161286b8161284a565b9250506020811015611f5a576000196020919091036008021b16919050565b604081016128988285611b16565b611bfa6020830184611b16565b60168152602081017f656e636c6176654944206e6f742061747465737465640000000000000000000081529050612166565b6020808252810161158e816128a5565b50600061158e6020830183611c49565b50600061158e6020830183611caf565b67ffffffffffffffff8116611c3e565b803561158e81612907565b50600061158e6020830183612917565b67ffffffffffffffff8116611b18565b61294c81806128e7565b6129568382611f0f565b5061296460208201826128e7565b6129716020840182611f0f565b5061297f60408201826128f7565b61298c6040840182611b16565b5061299a6060820182612922565b6124826060840182612932565b82818337505050565b81835260208301925060007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311156129eb576129eb600080fd5b6020830292506129fc8385846129a7565b50500190565b60c08101612a108287612942565b8181036080830152612a238185876129b0565b9050612a3260a0830184611b16565b95945050505050565b6080810161158e8284612942565b60188152602081017f7769746864726177616c20616c7265616479207370656e74000000000000000081529050612166565b6020808252810161158e81612a49565b604081016128988285611f0f565b60228152602081017f6e6574776f726b2073656372657420616c726561647920696e697469616c697a81527f65640000000000000000000000000000000000000000000000000000000000006020820152905061267a565b6020808252810161158e81612a99565b60198152602081017f656e636c6176654944206e6f7420612073657175656e6365720000000000000081529050612166565b6020808252810161158e81612b01565b600067ffffffffffffffff821661158e565b611b1881612b43565b6020810161158e8284612b55565b6000808335601e1936859003018112612b8757612b87600080fd5b8301915050803567ffffffffffffffff811115612ba657612ba6600080fd5b602082019150600181023603821315611dc257611dc2600080fd5b60238152602081017f726573706f6e64696e67206174746573746572206973206e6f7420617474657381527f74656400000000000000000000000000000000000000000000000000000000006020820152905061267a565b6020808252810161158e81612bc1565b600061158e8260601b90565b600061158e82612c29565b611b18612c4c82611c24565b612c35565b612c5b8185612c40565b601401612c688184612c40565b601401611f0781836123dd565b602c8152602081017f63616c63756c61746564206164647265737320616e642061747465737465724981527f4420646f6e74206d6174636800000000000000000000000000000000000000006020820152905061267a565b6020808252810161158e81612c75565b818352602083019250612cf1828483611bb6565b50601f01601f19160190565b60208082528101611f07818486612cdd565b6000813561158e81611ca9565b60008161158e565b612d2d82612d1c565b612d3961226482612d1c565b8255505050565b8267ffffffffffffffff811115612d5957612d59611b2c565b612d63825461241f565b612d6e8282856124a2565b506000601f821160018114612da35760008315612d8b5750848201355b600019600885021c1981166002850217855550612dfd565b600084815260209020601f19841690835b82811015612dd45787850135825560209485019460019092019101612db4565b5084821015612df1576000196008601f8716021c19878501351681555b50506001600284020184555b505050505050565b612482838383612d40565b612e1982612445565b80612d39565b8180612e2a81612d0f565b9050612e368184612d24565b5050612e456020830183612b6c565b612e53818360018601612e05565b50506040820180612e6382612d0f565b9050610de98160028501612e10565b6118518282612e1f565b8181038181111561158e5761158e6125bb565b600060018201612ea157612ea16125bb565b5060010190565b7f19457468657265756d205369676e6564204d6573736167653a0a0000000000008152601a01612ed881846123dd565b9050611bfa81836123dd565b634e487b7160e01b600052602160045260246000fd5b60ff8116611b18565b60808101612f118287611b16565b612f1e6020830186612efa565b612f2b6040830185611b16565b612a326060830184611b1656fe608060405234801561001057600080fd5b5061001a33610027565b610022610098565b61014a565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100e85760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101475780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b612455806101596000396000f3fe6080604052600436106101115760003560e01c80638da5cb5b116100a5578063b1454caa11610074578063b6aed0cb11610059578063b6aed0cb1461038b578063e138a8d2146103ab578063f2fde38b146103cb57610185565b8063b1454caa1461034b578063b201246f1461036b57610185565b80638da5cb5b146102a65780639730886d146102eb57806399a3ad211461030b578063ab53bddc1461032b57610185565b8063346633fb116100e1578063346633fb1461023e57806336d2da9014610251578063485cc95514610271578063715018a61461029157610185565b8062a1b815146101a65780630fcfbd11146101d15780630fe9188e146101f157806333a88c721461021157610185565b36610185576040517f346633fb000000000000000000000000000000000000000000000000000000008152309063346633fb90349061015690339083906004016111ea565b6000604051808303818588803b15801561016f57600080fd5b505af1158015610183573d6000803e3d6000fd5b005b60405162461bcd60e51b815260040161019d90611239565b60405180910390fd5b3480156101b257600080fd5b506101bb6103eb565b6040516101c89190611249565b60405180910390f35b3480156101dd57600080fd5b506101bb6101ec366004611272565b610477565b3480156101fd57600080fd5b5061018361020c3660046112c5565b6104d6565b34801561021d57600080fd5b5061023161022c366004611272565b61051c565b6040516101c891906112ec565b61018361024c36600461130e565b61056e565b34801561025d57600080fd5b5061018361026c366004611346565b6106bd565b34801561027d57600080fd5b5061018361028c366004611365565b61073c565b34801561029d57600080fd5b506101836108a7565b3480156102b257600080fd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03166040516101c89190611394565b3480156102f757600080fd5b506101836103063660046113a2565b6108bb565b34801561031757600080fd5b5061018361032636600461130e565b610a27565b34801561033757600080fd5b5061018361034636600461130e565b610aa7565b61035e61035936600461146b565b610b70565b6040516101c891906114f8565b34801561037757600080fd5b50610183610386366004611566565b610c7d565b34801561039757600080fd5b506101836103a63660046115d1565b610d7e565b3480156103b757600080fd5b506101836103c63660046115f1565b610dc4565b3480156103d757600080fd5b506101836103e6366004611346565b610f0f565b600354604080517f1a90a21900000000000000000000000000000000000000000000000000000000815290516000926001600160a01b031691631a90a2199160048083019260209291908290030181865afa15801561044e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104729190611679565b905090565b6000808260405160200161048b9190611837565b60408051601f198184030181529181528151602092830120600081815292839052912054909150806104cf5760405162461bcd60e51b815260040161019d90611886565b9392505050565b6104de610f66565b600081815260046020526040812054900361050b5760405162461bcd60e51b815260040161019d906118c8565b600090815260046020526040812055565b600080826040516020016105309190611837565b60408051601f19818403018152918152815160209283012060008181529283905291205490915080158015906105665750428111155b949350505050565b60003411801561057d57508034145b6105995760405162461bcd60e51b815260040161019d90611930565b60035434906001600160a01b03161561065d5760006105b66103eb565b9050803410156105d85760405162461bcd60e51b815260040161019d90611970565b6105e28134611996565b6003546040519193506000916001600160a01b039091169083908381818185875af1925050503d8060008114610634576040519150601f19603f3d011682016040523d82523d6000602084013e610639565b606091505b505090508061065a5760405162461bcd60e51b815260040161019d90611a01565b50505b600061066833610fda565b9050836001600160a01b0316336001600160a01b03167f50c536ac33a920f00755865b831d17bf4cff0b2e0345f65b16d52bfc004068b684846040516106af929190611a11565b60405180910390a350505050565b6106c5610f66565b6000816001600160a01b03164760405160006040518083038185875af1925050503d8060008114610712576040519150601f19603f3d011682016040523d82523d6000602084013e610717565b606091505b50509050806107385760405162461bcd60e51b815260040161019d90611a5e565b5050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff16159067ffffffffffffffff166000811580156107875750825b905060008267ffffffffffffffff1660011480156107a45750303b155b9050811580156107b2575080155b156107e9576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561081d57845468ff00000000000000001916680100000000000000001785555b61082687611038565b6003805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038816179055831561089e57845468ff0000000000000000191685556040517fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29061089590600190611a92565b60405180910390a15b50505050505050565b6108af610f66565b6108b96000611049565b565b60006108c8600130611aa0565b90506108fb7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316336001600160a01b031614806109225750336001600160a01b038216145b61093e5760405162461bcd60e51b815260040161019d90611af5565b600061094a8342611b05565b905060008460405160200161095f9190611837565b60408051601f198184030181529181528151602092830120600081815292839052912054909150156109a35760405162461bcd60e51b815260040161019d90611b70565b6000818152602081815260408220849055600191906109c490880188611346565b6001600160a01b0316815260208101919091526040016000908120906109f06080880160608901611b80565b63ffffffff1681526020808201929092526040016000908120805460018101825590825291902086916004020161089e8282611fbe565b610a2f610f66565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114610a7c576040519150601f19603f3d011682016040523d82523d6000602084013e610a81565b606091505b5050905080610aa25760405162461bcd60e51b815260040161019d90611a5e565b505050565b6000610ab4600130611aa0565b9050610ae77f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316336001600160a01b03161480610b0e5750336001600160a01b038216145b610b2a5760405162461bcd60e51b815260040161019d90611af5565b826001600160a01b03167fcd9850463422a7449c406a036e35e5edb6fbe35a64c9f12a2354be98a750c0d383604051610b639190611249565b60405180910390a2505050565b6003546000906001600160a01b031615610c26576000610b8e6103eb565b905080341015610bb05760405162461bcd60e51b815260040161019d90612020565b6003546040516000916001600160a01b03169083908381818185875af1925050503d8060008114610bfd576040519150601f19603f3d011682016040523d82523d6000602084013e610c02565b606091505b5050905080610c235760405162461bcd60e51b815260040161019d90611a01565b50505b610c2f33610fda565b90507fb93c37389233beb85a3a726c3f15c2d15533ee74cb602f20f490dfffef77593733828888888888604051610c6c9796959493929190612030565b60405180910390a195945050505050565b6000818152600460205260408120549003610caa5760405162461bcd60e51b815260040161019d906120eb565b600081815260046020526040902054421015610cd85760405162461bcd60e51b815260040161019d90612137565b600084604051602001610ceb91906121bc565b60405160208183030381529060405280519060200120604051602001610d1191906121fc565b604051602081830303815290604052805190602001209050610d5b84848484604051602001610d40919061221b565b604051602081830303815290604052805190602001206110c7565b610d775760405162461bcd60e51b815260040161019d90612285565b5050505050565b610d86610f66565b60008281526004602052604090205415610db25760405162461bcd60e51b815260040161019d906122ed565b60009182526004602052604090912055565b6000818152600460205260408120549003610df15760405162461bcd60e51b815260040161019d906120eb565b600081815260046020526040902054421015610e1f5760405162461bcd60e51b815260040161019d90612137565b6000610e2e6020860186611346565b610e3e60408701602088016122fd565b610e4e6060880160408901611b80565b610e5e6080890160608a01611b80565b610e6b60808a018a611cd7565b610e7b60c08c0160a08d0161231c565b604051602001610e919796959493929190612030565b604051602081830303815290604052805190602001209050600081604051602001610ebc919061236d565b604051602081830303815290604052805190602001209050610eeb85858584604051602001610d40919061221b565b610f075760405162461bcd60e51b815260040161019d906123d5565b505050505050565b610f17610f66565b6001600160a01b038116610f5a5760006040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161019d9190611394565b610f6381611049565b50565b33610f987f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146108b957336040517f118cdaa700000000000000000000000000000000000000000000000000000000815260040161019d9190611394565b6001600160a01b0381166000908152600260205260408120805467ffffffffffffffff16916001919061100d83856123e5565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550919050565b6110406110df565b610f6381611146565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300805473ffffffffffffffffffffffffffffffffffffffff1981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b6000826110d586868561114e565b1495945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005468010000000000000000900460ff166108b9576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f176110df565b600081815b848110156111875761117d8287878481811061117157611171612409565b90506020020135611190565b9150600101611153565b50949350505050565b60008183106111ac5760008281526020849052604090206111bb565b60008381526020839052604090205b90505b92915050565b60006001600160a01b0382166111be565b6111de816111c4565b82525050565b806111de565b604081016111f882856111d5565b6104cf60208301846111e4565b600b8152602081017f756e737570706f72746564000000000000000000000000000000000000000000815290505b60200190565b602080825281016111be81611205565b602081016111be82846111e4565b600060c0828403121561126c5761126c600080fd5b50919050565b60006020828403121561128757611287600080fd5b813567ffffffffffffffff8111156112a1576112a1600080fd5b61056684828501611257565b805b8114610f6357600080fd5b80356111be816112ad565b6000602082840312156112da576112da600080fd5b6111bb83836112ba565b8015156111de565b602081016111be82846112e4565b6112af816111c4565b80356111be816112fa565b6000806040838503121561132457611324600080fd5b61132e8484611303565b915061133d84602085016112ba565b90509250929050565b60006020828403121561135b5761135b600080fd5b6111bb8383611303565b6000806040838503121561137b5761137b600080fd5b6113858484611303565b915061133d8460208501611303565b602081016111be82846111d5565b600080604083850312156113b8576113b8600080fd5b823567ffffffffffffffff8111156113d2576113d2600080fd5b6113de85828601611257565b92505061133d84602085016112ba565b63ffffffff81166112af565b80356111be816113ee565b60008083601f84011261141a5761141a600080fd5b50813567ffffffffffffffff81111561143557611435600080fd5b60208301915083600182028301111561145057611450600080fd5b9250929050565b60ff81166112af565b80356111be81611457565b60008060008060006080868803121561148657611486600080fd5b61149087876113fa565b945061149f87602088016113fa565b9350604086013567ffffffffffffffff8111156114be576114be600080fd5b6114ca88828901611405565b93509350506114dc8760608801611460565b90509295509295909350565b67ffffffffffffffff81166111de565b602081016111be82846114e8565b60006080828403121561126c5761126c600080fd5b60008083601f84011261153057611530600080fd5b50813567ffffffffffffffff81111561154b5761154b600080fd5b60208301915083602082028301111561145057611450600080fd5b60008060008060c0858703121561157f5761157f600080fd5b6115898686611506565b9350608085013567ffffffffffffffff8111156115a8576115a8600080fd5b6115b48782880161151b565b93509350506115c68660a087016112ba565b905092959194509250565b600080604083850312156115e7576115e7600080fd5b61132e84846112ba565b6000806000806060858703121561160a5761160a600080fd5b843567ffffffffffffffff81111561162457611624600080fd5b61163087828801611257565b945050602085013567ffffffffffffffff81111561165057611650600080fd5b61165c8782880161151b565b93509350506115c686604087016112ba565b80516111be816112ad565b60006020828403121561168e5761168e600080fd5b6111bb838361166e565b5060006111be6020830183611303565b67ffffffffffffffff81166112af565b80356111be816116a8565b5060006111be60208301836116b8565b5060006111be60208301836113fa565b63ffffffff81166111de565b6000808335601e193685900301811261170a5761170a600080fd5b830160208101925035905067ffffffffffffffff81111561172d5761172d600080fd5b3681900382131561145057611450600080fd5b82818337506000910152565b818352602083019250611760828483611740565b50601f01601f19160190565b5060006111be6020830183611460565b60ff81166111de565b600060c083016117958380611698565b61179f85826111d5565b506117ad60208401846116c3565b6117ba60208601826114e8565b506117c860408401846116d3565b6117d560408601826116e3565b506117e360608401846116d3565b6117f060608601826116e3565b506117fe60808401846116ef565b858303608087015261181183828461174c565b9250505061182260a084018461176c565b61182f60a086018261177c565b509392505050565b602080825281016111bb8184611785565b60218152602081017f54686973206d65737361676520776173206e65766572207375626d69747465648152601760f91b602082015290505b60400190565b602080825281016111be81611848565b601a8152602081017f537461746520726f6f7420646f6573206e6f742065786973742e00000000000081529050611233565b602080825281016111be81611896565b60308152602081017f417474656d7074696e6720746f2073656e642076616c756520776974686f757481527f2070726f766964696e672045746865720000000000000000000000000000000060208201529050611880565b602080825281016111be816118d8565b60208082527f496e73756666696369656e742066756e647320746f2073656e642076616c75659101908152611233565b602080825281016111be81611940565b634e487b7160e01b600052601160045260246000fd5b818103818111156111be576111be611980565b60248152602081017f4661696c656420746f2073656e64206665657320746f206665657320636f6e7481527f726163740000000000000000000000000000000000000000000000000000000060208201529050611880565b602080825281016111be816119a9565b60408101611a1f82856111e4565b6104cf60208301846114e8565b60148152602081017f6661696c65642073656e64696e672076616c756500000000000000000000000081529050611233565b602080825281016111be81611a2c565b60006111be82611a7c565b90565b67ffffffffffffffff1690565b6111de81611a6e565b602081016111be8284611a89565b6001600160a01b039182169190811690828203908111156111be576111be611980565b60118152602081017f4e6f74206f776e6572206f722073656c6600000000000000000000000000000081529050611233565b602080825281016111be81611ac3565b808201808211156111be576111be611980565b60218152602081017f4d657373616765207375626d6974746564206d6f7265207468616e206f6e636581527f210000000000000000000000000000000000000000000000000000000000000060208201529050611880565b602080825281016111be81611b18565b600060208284031215611b9557611b95600080fd5b6111bb83836113fa565b600081356111be816112fa565b60006001600160a01b03835b81169019929092169190911792915050565b60006111be826111c4565b60006111be82611bca565b611be982611bd5565b611bf4818354611bac565b8255505050565b600081356111be816116a8565b60007bffffffffffffffff0000000000000000000000000000000000000000611bb88460a01b90565b60006111be67ffffffffffffffff8316611a7c565b611c4f82611c31565b611bf4818354611c08565b600081356111be816113ee565b60007fffffffff00000000000000000000000000000000000000000000000000000000611bb88460e01b90565b600063ffffffff82166111be565b611cab82611c94565b611bf4818354611c67565b600063ffffffff83611bb8565b611ccc82611c94565b611bf4818354611cb6565b6000808335601e1936859003018112611cf257611cf2600080fd5b8301915050803567ffffffffffffffff811115611d1157611d11600080fd5b60208201915060018102360382131561145057611450600080fd5b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052602260045260246000fd5b600281046001821680611d6c57607f821691505b60208210810361126c5761126c611d42565b60006111be611a798381565b611d9383611d7e565b815460001960089490940293841b1916921b91909117905550565b6000610aa2818484611d8a565b8181101561073857611dce600082611dae565b600101611dbb565b601f821115610aa2576000818152602090206020601f85010481016020851015611dfd5750805b610d776020601f860104830182611dbb565b8267ffffffffffffffff811115611e2857611e28611d2c565b611e328254611d58565b611e3d828285611dd6565b506000601f821160018114611e725760008315611e5a5750848201355b600019600885021c1981166002850217855550610f07565b600084815260209020601f19841690835b82811015611ea35787850135825560209485019460019092019101611e83565b5084821015611ec0576000196008601f8716021c19878501351681555b5050505060020260010190555050565b610aa2838383611e0f565b600081356111be81611457565b600060ff82166111be565b611efc82611ee8565b815460ff191660ff821617611bf4565b808280611f1881611b9f565b9050611f248184611be0565b50506020830180611f3482611bfb565b9050611f408184611c46565b50506040830180611f5082611c5a565b9050611f5c8184611ca2565b5050506060820180611f6d82611c5a565b9050611f7c8160018501611cc3565b5050611f8b6080830183611cd7565b611f99818360028601611ed0565b505060a0820180611fa982611edb565b9050611fb88160038501611ef3565b50505050565b6107388282611f0c565b60258152602081017f496e73756666696369656e742066756e647320746f207075626c697368206d6581527f737361676500000000000000000000000000000000000000000000000000000060208201529050611880565b602080825281016111be81611fc8565b60c0810161203e828a6111d5565b61204b60208301896114e8565b61205860408301886116e3565b61206560608301876116e3565b818103608083015261207881858761174c565b905061208760a083018461177c565b98975050505050505050565b602a8152602081017f526f6f74206973206e6f74207075626c6973686564206f6e2074686973206d6581527f7373616765206275732e0000000000000000000000000000000000000000000060208201529050611880565b602080825281016111be81612093565b60218152602081017f526f6f74206973206e6f7420636f6e736964657265642066696e616c207965748152601760f91b60208201529050611880565b602080825281016111be816120fb565b5060006111be60208301836112ba565b6121618180611698565b61216b83826111d5565b506121796020820182611698565b61218660208401826111d5565b506121946040820182612147565b6121a160408401826111e4565b506121af60608201826116c3565b610aa260608401826114e8565b608081016111be8284612157565b60018152602081017f760000000000000000000000000000000000000000000000000000000000000081529050611233565b6040808252810161220c816121ca565b90506111be60208301846111e4565b61222581836111e4565b602001919050565b60338152602081017f496e76616c696420696e636c7573696f6e2070726f6f6620666f722076616c7581527f65207472616e73666572206d6573736167652e0000000000000000000000000060208201529050611880565b602080825281016111be8161222d565b60258152602081017f526f6f7420616c726561647920616464656420746f20746865206d657373616781527f652062757300000000000000000000000000000000000000000000000000000060208201529050611880565b602080825281016111be81612295565b60006020828403121561231257612312600080fd5b6111bb83836116b8565b60006020828403121561233157612331600080fd5b6111bb8383611460565b60018152602081017f6d0000000000000000000000000000000000000000000000000000000000000081529050611233565b6040808252810161220c8161233b565b60308152602081017f496e76616c696420696e636c7573696f6e2070726f6f6620666f722063726f7381527f7320636861696e206d6573736167652e0000000000000000000000000000000060208201529050611880565b602080825281016111be8161237d565b67ffffffffffffffff9182169190811690828201908111156111be576111be611980565b634e487b7160e01b600052603260045260246000fdfea26469706673582212209046d260e6ecf02a9b545045265133ebd2a8a091d8cfe42d8fe9829451348f2664736f6c634300081c0033a2646970667358221220101b62990bb77813fedaf26fccfbe1484c6f6ffffdafd582c8320a8b7f985f8464736f6c634300081c0033", } // ManagementContractABI is the input ABI used to generate the binding from. @@ -248,6 +248,37 @@ func (_ManagementContract *ManagementContractCallerSession) Attested(_addr commo return _ManagementContract.Contract.Attested(&_ManagementContract.CallOpts, _addr) } +// GetChallengePeriod is a free data retrieval call binding the contract method 0x1aca00ab. +// +// Solidity: function GetChallengePeriod() view returns(uint256) +func (_ManagementContract *ManagementContractCaller) GetChallengePeriod(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _ManagementContract.contract.Call(opts, &out, "GetChallengePeriod") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// GetChallengePeriod is a free data retrieval call binding the contract method 0x1aca00ab. +// +// Solidity: function GetChallengePeriod() view returns(uint256) +func (_ManagementContract *ManagementContractSession) GetChallengePeriod() (*big.Int, error) { + return _ManagementContract.Contract.GetChallengePeriod(&_ManagementContract.CallOpts) +} + +// GetChallengePeriod is a free data retrieval call binding the contract method 0x1aca00ab. +// +// Solidity: function GetChallengePeriod() view returns(uint256) +func (_ManagementContract *ManagementContractCallerSession) GetChallengePeriod() (*big.Int, error) { + return _ManagementContract.Contract.GetChallengePeriod(&_ManagementContract.CallOpts) +} + // GetImportantContractKeys is a free data retrieval call binding the contract method 0x6a30d26c. // // Solidity: function GetImportantContractKeys() view returns(string[]) @@ -915,6 +946,27 @@ func (_ManagementContract *ManagementContractTransactorSession) RevokeSequencerE return _ManagementContract.Contract.RevokeSequencerEnclave(&_ManagementContract.TransactOpts, _addr) } +// SetChallengePeriod is a paid mutator transaction binding the contract method 0x5024621f. +// +// Solidity: function SetChallengePeriod(uint256 _delay) returns() +func (_ManagementContract *ManagementContractTransactor) SetChallengePeriod(opts *bind.TransactOpts, _delay *big.Int) (*types.Transaction, error) { + return _ManagementContract.contract.Transact(opts, "SetChallengePeriod", _delay) +} + +// SetChallengePeriod is a paid mutator transaction binding the contract method 0x5024621f. +// +// Solidity: function SetChallengePeriod(uint256 _delay) returns() +func (_ManagementContract *ManagementContractSession) SetChallengePeriod(_delay *big.Int) (*types.Transaction, error) { + return _ManagementContract.Contract.SetChallengePeriod(&_ManagementContract.TransactOpts, _delay) +} + +// SetChallengePeriod is a paid mutator transaction binding the contract method 0x5024621f. +// +// Solidity: function SetChallengePeriod(uint256 _delay) returns() +func (_ManagementContract *ManagementContractTransactorSession) SetChallengePeriod(_delay *big.Int) (*types.Transaction, error) { + return _ManagementContract.Contract.SetChallengePeriod(&_ManagementContract.TransactOpts, _delay) +} + // SetImportantContractAddress is a paid mutator transaction binding the contract method 0x03e72e48. // // Solidity: function SetImportantContractAddress(string key, address newAddress) returns() diff --git a/contracts/scripts/delay/001_set_challenge_period.ts b/contracts/scripts/delay/001_set_challenge_period.ts new file mode 100644 index 000000000..156884fbf --- /dev/null +++ b/contracts/scripts/delay/001_set_challenge_period.ts @@ -0,0 +1,39 @@ +import { ethers } from "hardhat"; +import { ManagementContract } from "../../typechain-types"; + +const setChallengePeriod = async function (mgmtContractAddr: string, challengPeriod: number) { + const managementContract = await ethers.getContractAt( + "ManagementContract", + mgmtContractAddr + ) as ManagementContract; + + + console.log(`Setting challenge period to: ${challengPeriod}`); + const tx = await managementContract.SetChallengePeriod(BigInt(challengPeriod)); + await tx.wait(); + console.log(`Successfully set challenge period to: ${challengPeriod}`); + + const mgmtContractChallengePeriod = await managementContract.GetChallengePeriod(); + if (BigInt(challengPeriod) !== mgmtContractChallengePeriod) { + throw new Error(`Failed to set the challenge period to: ${challengPeriod}. Returned value is: ${mgmtContractChallengePeriod}`); + } +} + +const mgmtContractAddr = process.env.MGMT_CONTRACT_ADDRESS; +const challengePeriod = process.env.L1_CHALLENGE_PERIOD ? + Number(process.env.L1_CHALLENGE_PERIOD) : 0; + + +if (!mgmtContractAddr) { + console.error("Missing required environment variables: MGMT_CONTRACT_ADDRESS"); + process.exit(1); +} + +setChallengePeriod(mgmtContractAddr, challengePeriod) + .then(() => process.exit(0)) + .catch((error) => { + console.error(error); + process.exit(1); + }); + +export default setChallengePeriod; \ No newline at end of file diff --git a/contracts/src/management/ManagementContract.sol b/contracts/src/management/ManagementContract.sol index 8585ceee3..f22751fed 100644 --- a/contracts/src/management/ManagementContract.sol +++ b/contracts/src/management/ManagementContract.sol @@ -60,6 +60,8 @@ contract ManagementContract is Initializable, OwnableUpgradeable { bytes32 public lastBatchHash; + uint256 private challengePeriod; + function initialize() public initializer { __Ownable_init(msg.sender); lastBatchSeqNo = 0; @@ -118,7 +120,7 @@ contract ManagementContract is Initializable, OwnableUpgradeable { require(block.number < (blockNum + 255), "Block binding too old"); require(block.number != blockNum, "Cannot bind to the block that is being currently mined"); - bytes32 knownBlockHash = blockhash(blockNum); + bytes32 knownBlockHash = blockhash(blockNum); require(knownBlockHash != 0x0, "Unknown block hash"); require(knownBlockHash == providedBlockHash, "Block binding mismatch"); require(rollups.toUniqueForkID[rollupNumber] == forkID, "Invalid forkID"); @@ -131,14 +133,15 @@ contract ManagementContract is Initializable, OwnableUpgradeable { bytes32 bundleHash = bytes32(0); for(uint256 i = 0; i < crossChainHashes.length; i++) { - merkleMessageBus.addStateRoot(bytes32(crossChainHashes[i]), block.timestamp); //todo: change the activation time. + merkleMessageBus.addStateRoot( + bytes32(crossChainHashes[i]), block.timestamp + challengePeriod + ); bundleHash = keccak256(abi.encode(bundleHash, bytes32(crossChainHashes[i]))); } isBundleSaved[bundleHash] = true; } -// TODO: ensure challenge period is added on top of block timestamp. function pushCrossChainMessages(Structs.HeaderCrossChainData calldata crossChainData) internal { uint256 messagesLength = crossChainData.messages.length; for (uint256 i = 0; i < messagesLength; ++i) { @@ -263,4 +266,14 @@ contract ManagementContract is Initializable, OwnableUpgradeable { function GetImportantContractKeys() public view returns(string[] memory) { return importantContractKeys; } -} \ No newline at end of file + + // Return the challenge period delay for message bus root + function GetChallengePeriod() public view returns (uint256) { + return challengePeriod; + } + + // Sets the challenge period for message bus root (owner only) + function SetChallengePeriod(uint256 _delay) public onlyOwner { + challengePeriod = _delay; + } +} diff --git a/testnet/launcher/l1challengeperiod/cmd/cli.go b/testnet/launcher/l1challengeperiod/cmd/cli.go new file mode 100644 index 000000000..3302f7237 --- /dev/null +++ b/testnet/launcher/l1challengeperiod/cmd/cli.go @@ -0,0 +1,35 @@ +package main + +import ( + "flag" +) + +// L1ChallengePeriodConfigCLI represents the configurations needed to grant enclaves sequencer roles over CLI +type L1ChallengePeriodConfigCLI struct { + l1HTTPURL string + privateKey string + mgmtContractAddress string + dockerImage string + challengePeriod int +} + +// ParseConfigCLI returns a NodeConfigCLI based the cli params and defaults. +func ParseConfigCLI() *L1ChallengePeriodConfigCLI { + cfg := &L1ChallengePeriodConfigCLI{} + flagUsageMap := getFlagUsageMap() + + l1HTTPURL := flag.String(l1HTTPURLFlag, "http://eth2network:8025", flagUsageMap[l1HTTPURLFlag]) + privateKey := flag.String(privateKeyFlag, "", flagUsageMap[privateKeyFlag]) + mgmtContractAddress := flag.String(mgmtContractAddressFlag, "", flagUsageMap[mgmtContractAddressFlag]) + dockerImage := flag.String(dockerImageFlag, "testnetobscuronet.azurecr.io/obscuronet/hardhatdeployer:latest", flagUsageMap[dockerImageFlag]) + challengePeriod := flag.Int(challengePeriodFlag, 0, flagUsageMap[challengePeriodFlag]) + flag.Parse() + + cfg.l1HTTPURL = *l1HTTPURL + cfg.privateKey = *privateKey + cfg.mgmtContractAddress = *mgmtContractAddress + cfg.dockerImage = *dockerImage + cfg.challengePeriod = *challengePeriod + + return cfg +} diff --git a/testnet/launcher/l1challengeperiod/cmd/cli_flags.go b/testnet/launcher/l1challengeperiod/cmd/cli_flags.go new file mode 100644 index 000000000..06ff7b69a --- /dev/null +++ b/testnet/launcher/l1challengeperiod/cmd/cli_flags.go @@ -0,0 +1,24 @@ +package main + +// Flag names. +const ( + l1HTTPURLFlag = "l1_http_url" + privateKeyFlag = "private_key" + mgmtContractAddressFlag = "management_contract_addr" + dockerImageFlag = "docker_image" + contractsEnvFileFlag = "contracts_env_file" + challengePeriodFlag = "l1_challenge_period" +) + +// Returns a map of the flag usages. +// While we could just use constants instead of a map, this approach allows us to test that all the expected flags are defined. +func getFlagUsageMap() map[string]string { + return map[string]string{ + l1HTTPURLFlag: "Layer 1 network http RPC addr", + privateKeyFlag: "L1 and L2 private key used in the node", + mgmtContractAddressFlag: "L1 management contract address", + dockerImageFlag: "Docker image to run", + contractsEnvFileFlag: "If set, it will write the contract addresses to the file", + challengePeriodFlag: "L1 delay when setting message bus root for the challenge period", + } +} diff --git a/testnet/launcher/l1challengeperiod/cmd/main.go b/testnet/launcher/l1challengeperiod/cmd/main.go new file mode 100644 index 000000000..2bfde1263 --- /dev/null +++ b/testnet/launcher/l1challengeperiod/cmd/main.go @@ -0,0 +1,40 @@ +package main + +import ( + "fmt" + "os" + + l1cp "github.com/ten-protocol/go-ten/testnet/launcher/l1challengeperiod" +) + +func main() { + cliConfig := ParseConfigCLI() + + l1challengeperiod, err := l1cp.NewSetChallengePeriod( + l1cp.NewChallengePeriodConfig( + l1cp.WithL1HTTPURL(cliConfig.l1HTTPURL), + l1cp.WithPrivateKey(cliConfig.privateKey), + l1cp.WithDockerImage(cliConfig.dockerImage), + l1cp.WithMgmtContractAddress(cliConfig.mgmtContractAddress), + l1cp.WithChallengePeriod(cliConfig.challengePeriod), + ), + ) + if err != nil { + fmt.Println("unable to configure l1 contract deployer - %w", err) + os.Exit(1) + } + + err = l1challengeperiod.Start() + if err != nil { + fmt.Println("unable to start l1 contract deployer - %w", err) + os.Exit(1) + } + + err = l1challengeperiod.WaitForFinish() + if err != nil { + fmt.Println("unexpected error waiting for set challenge period script to finish - %w", err) + os.Exit(1) + } + fmt.Println("L1 challenge period was successfully set...") + os.Exit(0) +} diff --git a/testnet/launcher/l1challengeperiod/config.go b/testnet/launcher/l1challengeperiod/config.go new file mode 100644 index 000000000..b75ae5ba3 --- /dev/null +++ b/testnet/launcher/l1challengeperiod/config.go @@ -0,0 +1,55 @@ +package l1grantsequencers + +// Option is a function that applies configs to a Config Object +type Option = func(c *Config) + +// Config holds the properties that configure the package +type Config struct { + l1HTTPURL string + privateKey string + mgmtContractAddress string + dockerImage string + challengePeriod int + + // debugEnabled bool +} + +func NewChallengePeriodConfig(opts ...Option) *Config { + defaultConfig := &Config{} + + for _, opt := range opts { + opt(defaultConfig) + } + + return defaultConfig +} + +func WithL1HTTPURL(s string) Option { + return func(c *Config) { + c.l1HTTPURL = s + } +} + +func WithPrivateKey(s string) Option { + return func(c *Config) { + c.privateKey = s + } +} + +func WithMgmtContractAddress(s string) Option { + return func(c *Config) { + c.mgmtContractAddress = s + } +} + +func WithDockerImage(s string) Option { + return func(c *Config) { + c.dockerImage = s + } +} + +func WithChallengePeriod(i int) Option { + return func(c *Config) { + c.challengePeriod = i + } +} diff --git a/testnet/launcher/l1challengeperiod/docker.go b/testnet/launcher/l1challengeperiod/docker.go new file mode 100644 index 000000000..6c3bf7d91 --- /dev/null +++ b/testnet/launcher/l1challengeperiod/docker.go @@ -0,0 +1,105 @@ +package l1grantsequencers + +import ( + "bytes" + "context" + "fmt" + "io" + "strconv" + "time" + + "github.com/docker/docker/api/types" + "github.com/docker/docker/client" + "github.com/ten-protocol/go-ten/go/common/docker" +) + +type SetChallengePeriod struct { + cfg *Config + containerID string +} + +func NewSetChallengePeriod(cfg *Config) (*SetChallengePeriod, error) { + return &SetChallengePeriod{ + cfg: cfg, + }, nil +} + +func (s *SetChallengePeriod) Start() error { + var err error + cmds := []string{ + "npx", + "hardhat", + "run", + "--network", + "layer1", + "scripts/delay/001_set_challenge_period.ts", + } + + envs := map[string]string{ + "NETWORK_JSON": fmt.Sprintf(`{ + "layer1": { + "url": "%s", + "live": false, + "saveDeployments": true, + "accounts": [ "%s" ] + } + }`, s.cfg.l1HTTPURL, s.cfg.privateKey), + "MGMT_CONTRACT_ADDRESS": s.cfg.mgmtContractAddress, + "L1_CHALLENGE_PERIOD": strconv.Itoa(s.cfg.challengePeriod), + } + + containerID, err := docker.StartNewContainer( + "set-challenge-period", + s.cfg.dockerImage, + cmds, + nil, + envs, + nil, + nil, + false, + ) + if err != nil { + return err + } + s.containerID = containerID + return nil +} + +func (s *SetChallengePeriod) WaitForFinish() error { + cli, err := client.NewClientWithOpts(client.FromEnv) + if err != nil { + return fmt.Errorf("failed to create docker client: %w", err) + } + defer cli.Close() + + // make sure the container has finished execution + err = docker.WaitForContainerToFinish(s.containerID, 15*time.Minute) + if err != nil { + fmt.Println("Error waiting for container to finish: ", err) + s.PrintLogs(cli) + return err + } + + return nil +} + +func (s *SetChallengePeriod) PrintLogs(cli *client.Client) { + logsOptions := types.ContainerLogsOptions{ + ShowStdout: true, + ShowStderr: true, + } + + // Read the container logs + out, err := cli.ContainerLogs(context.Background(), s.containerID, logsOptions) + if err != nil { + fmt.Printf("Error printing out container %s logs... %v\n", s.containerID, err) + } + defer out.Close() + + var buf bytes.Buffer + _, err = io.Copy(&buf, out) + if err != nil { + fmt.Printf("Error getting logs for container %s\n", s.containerID) + } + fmt.Println(buf.String()) +}