diff --git a/contracts/generated/PublicCallbacks/PublicCallbacks.go b/contracts/generated/PublicCallbacks/PublicCallbacks.go index 737e9fd2b9..cf886e7b83 100644 --- a/contracts/generated/PublicCallbacks/PublicCallbacks.go +++ b/contracts/generated/PublicCallbacks/PublicCallbacks.go @@ -32,7 +32,7 @@ var ( // PublicCallbacksMetaData contains all meta data concerning the PublicCallbacks contract. var PublicCallbacksMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotInitializing\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"callbackId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"gasBefore\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"gasAfter\",\"type\":\"uint256\"}],\"name\":\"CallbackExecuted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"version\",\"type\":\"uint64\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"callbacks\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"baseFee\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"executeNextCallbacks\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"callbackId\",\"type\":\"uint256\"}],\"name\":\"reattemptCallback\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"callback\",\"type\":\"bytes\"}],\"name\":\"register\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"payable\",\"type\":\"function\"}]", - Bin: "0x6080604052348015600f57600080fd5b506016601a565b60ca565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161560695760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b039081161460c75780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b611013806100d96000396000f3fe6080604052600436106100595760003560e01c806382fbdc9c1161004357806382fbdc9c146100ae578063929d34e9146100ce578063a67e1760146100ee57600080fd5b8062e0d3b51461005e5780638129fc1c14610097575b600080fd5b34801561006a57600080fd5b5061007e610079366004610a7a565b610103565b60405161008e9493929190610b15565b60405180910390f35b3480156100a357600080fd5b506100ac6101be565b005b6100c16100bc366004610bac565b610300565b60405161008e9190610bf4565b3480156100da57600080fd5b506100ac6100e9366004610a7a565b610368565b3480156100fa57600080fd5b506100ac61050d565b600060208190529081526040902080546001820180546001600160a01b03909216929161012f90610c18565b80601f016020809104026020016040519081016040528092919081815260200182805461015b90610c18565b80156101a85780601f1061017d576101008083540402835291602001916101a8565b820191906000526020600020905b81548152906001019060200180831161018b57829003601f168201915b5050505050908060020154908060030154905084565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff16159067ffffffffffffffff166000811580156102095750825b905060008267ffffffffffffffff1660011480156102265750303b155b905081158015610234575080155b1561026b576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561029f57845468ff00000000000000001916680100000000000000001785555b6000600181905560025583156102f957845468ff0000000000000000191685556040517fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2906102f090600190610c68565b60405180910390a15b5050505050565b600080341161032a5760405162461bcd60e51b815260040161032190610caa565b60405180910390fd5b6152086103363461055f565b116103535760405162461bcd60e51b815260040161032190610cba565b61035f3384843461056b565b90505b92915050565b60008181526020818152604080832081516080810190925280546001600160a01b0316825260018101805492939192918401916103a490610c18565b80601f01602080910402602001604051908101604052809291908181526020018280546103d090610c18565b801561041d5780601f106103f25761010080835404028352916020019161041d565b820191906000526020600020905b81548152906001019060200180831161040057829003601f168201915b50505050508152602001600282015481526020016003820154815250509050600081600001516001600160a01b0316826020015160405161045e9190610d3d565b6000604051808303816000865af19150503d806000811461049b576040519150601f19603f3d011682016040523d82523d6000602084013e6104a0565b606091505b50509050806104c15760405162461bcd60e51b815260040161032190610d79565b6000838152602081905260408120805473ffffffffffffffffffffffffffffffffffffffff19168155906104f86001830182610a25565b50600060028201819055600390910155505050565b600061051a600130610d9f565b9050336001600160a01b038216146105445760405162461bcd60e51b815260040161032190610df4565b6002546001541461055c57610557610654565b610544565b50565b60006103624883610e1a565b60006040518060800160405280866001600160a01b0316815260200185858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052509385525050506020820185905248604090920191909152600180548291826105e083610e2e565b9091555081526020808201929092526040016000208251815473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b039091161781559082015160018201906106319082610ef3565b506040820151600282015560609091015160039091015550600154949350505050565b6002546001540361066157565b60008061066c610777565b91509150600082606001519050600081846040015161068b9190610e1a565b905060005a9050600085600001516001600160a01b03168387602001516040516106b59190610d3d565b60006040518083038160008787f1925050503d80600081146106f3576040519150601f19603f3d011682016040523d82523d6000602084013e6106f8565b606091505b5050905060005a9050600061070d8285610fb3565b905060008186111561073157866107248388610fb3565b61072e9190610fc6565b90505b6000818a604001516107439190610fb3565b8a5190915085156107565761075661088f565b61076183828c6108f0565b61076a826109f4565b5050505050505050505050565b6107ab604051806080016040528060006001600160a01b031681526020016060815260200160008152602001600081525090565b60025460008181526020818152604080832081516080810190925280546001600160a01b03168252600181018054949591949193859290840191906107ef90610c18565b80601f016020809104026020016040519081016040528092919081815260200182805461081b90610c18565b80156108685780601f1061083d57610100808354040283529160200191610868565b820191906000526020600020905b81548152906001019060200180831161084b57829003601f168201915b50505050508152602001600282015481526020016003820154815250509150915091509091565b6002546000908152602081905260408120805473ffffffffffffffffffffffffffffffffffffffff19168155906108c96001830182610a25565b50600060028281018290556003909201819055815491906108e983610e2e565b9190505550565b6000826001600160a01b0316846188b890846040516024016109129190610bf4565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f5ea3955800000000000000000000000000000000000000000000000000000000179052516109759190610d3d565b600060405180830381858888f193505050503d80600081146109b3576040519150601f19603f3d011682016040523d82523d6000602084013e6109b8565b606091505b50509050806109ee57604051419085156108fc029086906000818181858888f193505050501580156102f9573d6000803e3d6000fd5b50505050565b604051419082156108fc029083906000818181858888f19350505050158015610a21573d6000803e3d6000fd5b5050565b508054610a3190610c18565b6000825580601f10610a41575050565b601f01602090049060005260206000209081019061055c91905b80821115610a6f5760008155600101610a5b565b5090565b8035610362565b600060208284031215610a8f57610a8f600080fd5b61035f8383610a73565b60006001600160a01b038216610362565b610ab381610a99565b82525050565b60005b83811015610ad4578181015183820152602001610abc565b50506000910152565b6000610ae7825190565b808452602084019350610afe818560208601610ab9565b601f01601f19169290920192915050565b80610ab3565b60808101610b238287610aaa565b8181036020830152610b358186610add565b9050610b446040830185610b0f565b610b516060830184610b0f565b95945050505050565b60008083601f840112610b6f57610b6f600080fd5b50813567ffffffffffffffff811115610b8a57610b8a600080fd5b602083019150836001820283011115610ba557610ba5600080fd5b9250929050565b60008060208385031215610bc257610bc2600080fd5b823567ffffffffffffffff811115610bdc57610bdc600080fd5b610be885828601610b5a565b92509250509250929050565b602081016103628284610b0f565b634e487b7160e01b600052602260045260246000fd5b600281046001821680610c2c57607f821691505b602082108103610c3e57610c3e610c02565b50919050565b600061036282610c52565b90565b67ffffffffffffffff1690565b610ab381610c44565b602081016103628284610c5f565b600d8152602081017f4e6f2076616c75652073656e7400000000000000000000000000000000000000815290505b60200190565b6020808252810161036281610c76565b6020808252810161036281602481527f47617320746f6f206c6f7720636f6d706172656420746f20636f7374206f662060208201527f63616c6c00000000000000000000000000000000000000000000000000000000604082015260600190565b6000610d25825190565b610d33818560208601610ab9565b9290920192915050565b6103628183610d1b565b60198152602081017f43616c6c6261636b20657865637574696f6e206661696c65640000000000000081529050610ca4565b6020808252810161036281610d47565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b0391821691908116908282039081111561036257610362610d89565b60088152602081017f4e6f742073656c6600000000000000000000000000000000000000000000000081529050610ca4565b6020808252810161036281610dc2565b634e487b7160e01b600052601260045260246000fd5b600082610e2957610e29610e04565b500490565b600060018201610e4057610e40610d89565b5060010190565b634e487b7160e01b600052604160045260246000fd5b6000610362610c4f8381565b610e7283610e5d565b815460001960089490940293841b1916921b91909117905550565b6000610e9a818484610e69565b505050565b81811015610a2157610eb2600082610e8d565b600101610e9f565b601f821115610e9a576000818152602090206020601f85010481016020851015610ee15750805b6102f96020601f860104830182610e9f565b815167ffffffffffffffff811115610f0d57610f0d610e47565b610f178254610c18565b610f22828285610eba565b506020601f821160018114610f575760008315610f3f5750848201515b600019600885021c19811660028502178555506102f9565b600084815260208120601f198516915b82811015610f875787850151825560209485019460019092019101610f67565b5084821015610fa45783870151600019601f87166008021c191681555b50505050600202600101905550565b8181038181111561036257610362610d89565b818102811582820484141761036257610362610d8956fea2646970667358221220a0816b74121dc3e64792067f88c4f0488058073d1d1bdd5b221af40124cdf1a564736f6c634300081c0033", + Bin: "0x6080604052348015600f57600080fd5b506016601a565b60ca565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161560695760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b039081161460c75780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b611017806100d96000396000f3fe6080604052600436106100595760003560e01c806382fbdc9c1161004357806382fbdc9c146100ae578063929d34e9146100ce578063a67e1760146100ee57600080fd5b8062e0d3b51461005e5780638129fc1c14610097575b600080fd5b34801561006a57600080fd5b5061007e610079366004610a7a565b610103565b60405161008e9493929190610b15565b60405180910390f35b3480156100a357600080fd5b506100ac6101be565b005b6100c16100bc366004610bac565b610300565b60405161008e9190610bf4565b3480156100da57600080fd5b506100ac6100e9366004610a7a565b610368565b3480156100fa57600080fd5b506100ac61050d565b600060208190529081526040902080546001820180546001600160a01b03909216929161012f90610c18565b80601f016020809104026020016040519081016040528092919081815260200182805461015b90610c18565b80156101a85780601f1061017d576101008083540402835291602001916101a8565b820191906000526020600020905b81548152906001019060200180831161018b57829003601f168201915b5050505050908060020154908060030154905084565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff16159067ffffffffffffffff166000811580156102095750825b905060008267ffffffffffffffff1660011480156102265750303b155b905081158015610234575080155b1561026b576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561029f57845468ff00000000000000001916680100000000000000001785555b6000600181905560025583156102f957845468ff0000000000000000191685556040517fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2906102f090600190610c68565b60405180910390a15b5050505050565b600080341161032a5760405162461bcd60e51b815260040161032190610caa565b60405180910390fd5b6152086103363461055f565b116103535760405162461bcd60e51b815260040161032190610cba565b61035f3384843461056b565b90505b92915050565b60008181526020818152604080832081516080810190925280546001600160a01b0316825260018101805492939192918401916103a490610c18565b80601f01602080910402602001604051908101604052809291908181526020018280546103d090610c18565b801561041d5780601f106103f25761010080835404028352916020019161041d565b820191906000526020600020905b81548152906001019060200180831161040057829003601f168201915b50505050508152602001600282015481526020016003820154815250509050600081600001516001600160a01b0316826020015160405161045e9190610d3d565b6000604051808303816000865af19150503d806000811461049b576040519150601f19603f3d011682016040523d82523d6000602084013e6104a0565b606091505b50509050806104c15760405162461bcd60e51b815260040161032190610d79565b6000838152602081905260408120805473ffffffffffffffffffffffffffffffffffffffff19168155906104f86001830182610a25565b50600060028201819055600390910155505050565b600061051a600130610d9f565b9050336001600160a01b038216146105445760405162461bcd60e51b815260040161032190610df4565b6002546001541461055c57610557610654565b610544565b50565b60006103624883610e1a565b60006040518060800160405280866001600160a01b0316815260200185858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052509385525050506020820185905248604090920191909152600180548291826105e083610e2e565b9091555081526020808201929092526040016000208251815473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b039091161781559082015160018201906106319082610ef7565b506040820151600282015560609091015160039091015550600154949350505050565b6002546001540361066157565b60008061066c61077f565b91509150600082606001519050600081846040015161068b9190610e1a565b905060005a9050600085600001516001600160a01b03168387602001516040516106b59190610d3d565b60006040518083038160008787f1925050503d80600081146106f3576040519150601f19603f3d011682016040523d82523d6000602084013e6106f8565b606091505b5050905060005a9050600061070d8285610fb7565b905060008186111561073157866107248388610fb7565b61072e9190610fca565b90505b6000818a604001516107439190610fb7565b8a51909150851561075657610756610897565b61075e6108e3565b61076983828c6108fa565b610772826109da565b5050505050505050505050565b6107b3604051806080016040528060006001600160a01b031681526020016060815260200160008152602001600081525090565b60025460008181526020818152604080832081516080810190925280546001600160a01b03168252600181018054949591949193859290840191906107f790610c18565b80601f016020809104026020016040519081016040528092919081815260200182805461082390610c18565b80156108705780601f1061084557610100808354040283529160200191610870565b820191906000526020600020905b81548152906001019060200180831161085357829003601f168201915b50505050508152602001600282015481526020016003820154815250509150915091509091565b6002546000908152602081905260408120805473ffffffffffffffffffffffffffffffffffffffff19168155906108d16001830182610a25565b50600060028201819055600390910155565b600280549060006108f383610e2e565b9190505550565b6000826001600160a01b0316846188b8908460405160240161091c9190610bf4565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f5ea39558000000000000000000000000000000000000000000000000000000001790525161097f9190610d3d565b600060405180830381858888f193505050503d80600081146109bd576040519150601f19603f3d011682016040523d82523d6000602084013e6109c2565b606091505b50509050806109d4576109d4846109da565b50505050565b806000036109e55750565b60405141908290600081818185875af1925050503d80600081146109d4576040519150601f19603f3d011682016040523d82523d6000602084013e6109d4565b508054610a3190610c18565b6000825580601f10610a41575050565b601f01602090049060005260206000209081019061055c91905b80821115610a6f5760008155600101610a5b565b5090565b8035610362565b600060208284031215610a8f57610a8f600080fd5b61035f8383610a73565b60006001600160a01b038216610362565b610ab381610a99565b82525050565b60005b83811015610ad4578181015183820152602001610abc565b50506000910152565b6000610ae7825190565b808452602084019350610afe818560208601610ab9565b601f01601f19169290920192915050565b80610ab3565b60808101610b238287610aaa565b8181036020830152610b358186610add565b9050610b446040830185610b0f565b610b516060830184610b0f565b95945050505050565b60008083601f840112610b6f57610b6f600080fd5b50813567ffffffffffffffff811115610b8a57610b8a600080fd5b602083019150836001820283011115610ba557610ba5600080fd5b9250929050565b60008060208385031215610bc257610bc2600080fd5b823567ffffffffffffffff811115610bdc57610bdc600080fd5b610be885828601610b5a565b92509250509250929050565b602081016103628284610b0f565b634e487b7160e01b600052602260045260246000fd5b600281046001821680610c2c57607f821691505b602082108103610c3e57610c3e610c02565b50919050565b600061036282610c52565b90565b67ffffffffffffffff1690565b610ab381610c44565b602081016103628284610c5f565b600d8152602081017f4e6f2076616c75652073656e7400000000000000000000000000000000000000815290505b60200190565b6020808252810161036281610c76565b6020808252810161036281602481527f47617320746f6f206c6f7720636f6d706172656420746f20636f7374206f662060208201527f63616c6c00000000000000000000000000000000000000000000000000000000604082015260600190565b6000610d25825190565b610d33818560208601610ab9565b9290920192915050565b6103628183610d1b565b60198152602081017f43616c6c6261636b20657865637574696f6e206661696c65640000000000000081529050610ca4565b6020808252810161036281610d47565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b0391821691908116908282039081111561036257610362610d89565b60088152602081017f4e6f742073656c6600000000000000000000000000000000000000000000000081529050610ca4565b6020808252810161036281610dc2565b634e487b7160e01b600052601260045260246000fd5b600082610e2957610e29610e04565b500490565b600060018201610e4057610e40610d89565b5060010190565b634e487b7160e01b600052604160045260246000fd5b6000610362610c4f8381565b610e7283610e5d565b815460001960089490940293841b1916921b91909117905550565b6000610e9a818484610e69565b505050565b81811015610eba57610eb2600082610e8d565b600101610e9f565b5050565b601f821115610e9a576000818152602090206020601f85010481016020851015610ee55750805b6102f96020601f860104830182610e9f565b815167ffffffffffffffff811115610f1157610f11610e47565b610f1b8254610c18565b610f26828285610ebe565b506020601f821160018114610f5b5760008315610f435750848201515b600019600885021c19811660028502178555506102f9565b600084815260208120601f198516915b82811015610f8b5787850151825560209485019460019092019101610f6b565b5084821015610fa85783870151600019601f87166008021c191681555b50505050600202600101905550565b8181038181111561036257610362610d89565b818102811582820484141761036257610362610d8956fea264697066735822122008c491fc746109bf6d844f1a3820d634711f140a52c8d4923fc72a652b9ad03464736f6c634300081c0033", } // PublicCallbacksABI is the input ABI used to generate the binding from. diff --git a/contracts/generated/PublicCallbacksTest/PublicCallbacksTest.go b/contracts/generated/PublicCallbacksTest/PublicCallbacksTest.go index 7c7b4a2cfa..326fdbcc79 100644 --- a/contracts/generated/PublicCallbacksTest/PublicCallbacksTest.go +++ b/contracts/generated/PublicCallbacksTest/PublicCallbacksTest.go @@ -31,8 +31,8 @@ var ( // PublicCallbacksTestMetaData contains all meta data concerning the PublicCallbacksTest contract. var PublicCallbacksTestMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_callbacks\",\"type\":\"address\"}],\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"callbacks\",\"outputs\":[{\"internalType\":\"contractIPublicCallbacks\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expectedGas\",\"type\":\"uint256\"}],\"name\":\"handleCallback\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isLastCallSuccess\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", - Bin: "0x608060408190526000805460ff60a01b191690556104263881900390819083398101604081905261002f91610152565b600080546001600160a81b0319166001600160a01b038316179055610052610058565b50610215565b6000610064483461018e565b9050600063a072d7b060e01b8260405160240161008191906101a2565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925260005491516320bef72760e21b81529092506001600160a01b03909116906382fbdc9c9034906100e7908590600401610204565b6000604051808303818588803b15801561010057600080fd5b505af1158015610114573d6000803e3d6000fd5b50505050505050565b60006001600160a01b0382165b92915050565b6101398161011d565b811461014457600080fd5b50565b805161012a81610130565b60006020828403121561016757610167600080fd5b6101718383610147565b9392505050565b634e487b7160e01b600052601260045260246000fd5b60008261019d5761019d610178565b500490565b8181526020810161012a565b60005b838110156101c95781810151838201526020016101b1565b50506000910152565b60006101dc825190565b8084526020840193506101f38185602086016101ae565b601f01601f19169290920192915050565b6020808252810161017181846101d2565b610202806102246000396000f3fe608060405234801561001057600080fd5b50600436106100405760003560e01c8062b1278314610045578063a072d7b01461007b578063ee1d587214610090575b600080fd5b6000546100659073ffffffffffffffffffffffffffffffffffffffff1681565b6040516100729190610139565b60405180910390f35b61008e61008936600461014e565b6100aa565b005b600054600160a01b900460ff16604051610072919061017c565b60005a90506100bb610834836101b9565b81106100f057600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16600160a01b1790555b5050565b600073ffffffffffffffffffffffffffffffffffffffff82165b92915050565b600061010e826100f4565b600061010e82610114565b6101338161011f565b82525050565b6020810161010e828461012a565b803561010e565b60006020828403121561016357610163600080fd5b61016d8383610147565b9392505050565b801515610133565b6020810161010e8284610174565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8181038181111561010e5761010e61018a56fea26469706673582212201e5e3094271cbbd280e851d389154c4d4b4127dd8d067ffb902752f665e57e5c64736f6c634300081c0033", + ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_callbacks\",\"type\":\"address\"}],\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"callbacks\",\"outputs\":[{\"internalType\":\"contractIPublicCallbacks\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"handleAllCallbacksRan\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expectedGas\",\"type\":\"uint256\"}],\"name\":\"handleCallback\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"handleCallbackFail\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isLastCallSuccess\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", + Bin: "0x608060408190526000805461ffff60a01b1916905561064b3881900390819083398101604081905261003091610285565b600080546001600160b01b0319166001600160a01b038316179055610053610059565b50610348565b6000486100676003346102c1565b61007191906102c1565b9050600063a072d7b060e01b8260405160240161008e91906102d5565b60408051601f19818403018152918152602080830180516001600160e01b039081166001600160e01b031990961695909517905281516004808252602480830185528284018051881663a4c016fb60e01b179052845191825281019093529082018051909416629e79db60e81b17909352600054919350906001600160a01b03166382fbdc9c61011f6003346102c1565b856040518363ffffffff1660e01b815260040161013c9190610337565b6000604051808303818588803b15801561015557600080fd5b505af1158015610169573d6000803e3d6000fd5b50506000546001600160a01b031692506382fbdc9c915061018d90506003346102c1565b846040518363ffffffff1660e01b81526004016101aa9190610337565b6000604051808303818588803b1580156101c357600080fd5b505af11580156101d7573d6000803e3d6000fd5b50506000546001600160a01b031692506382fbdc9c91506101fb90506003346102c1565b836040518363ffffffff1660e01b81526004016102189190610337565b6000604051808303818588803b15801561023157600080fd5b505af1158015610245573d6000803e3d6000fd5b505050505050505050565b60006001600160a01b0382165b92915050565b61026c81610250565b811461027757600080fd5b50565b805161025d81610263565b60006020828403121561029a5761029a600080fd5b6102a4838361027a565b9392505050565b634e487b7160e01b600052601260045260246000fd5b6000826102d0576102d06102ab565b500490565b8181526020810161025d565b60005b838110156102fc5781810151838201526020016102e4565b50506000910152565b600061030f825190565b8084526020840193506103268185602086016102e1565b601f01601f19169290920192915050565b602080825281016102a48184610305565b6102f4806103576000396000f3fe608060405234801561001057600080fd5b50600436106100665760003560e01c8063a072d7b011610050578063a072d7b0146100d6578063a4c016fb146100e9578063ee1d5872146100f157600080fd5b8062b127831461006b5780639e79db00146100a1575b600080fd5b60005461008b9073ffffffffffffffffffffffffffffffffffffffff1681565b60405161009891906101f0565b60405180910390f35b6100d4600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16600160a81b179055565b005b6100d46100e4366004610205565b610106565b6100d4610135565b6100f9610183565b6040516100989190610233565b60005a905061011761083483610270565b8110610131576000805460ff60a01b1916600160a01b1790555b5050565b6000805460ff60a01b1916600160a01b1790556040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017a90610283565b60405180910390fd5b60008054600160a81b900460ff1680156101a65750600054600160a01b900460ff165b905090565b600073ffffffffffffffffffffffffffffffffffffffff82165b92915050565b60006101c5826101ab565b60006101c5826101cb565b6101ea816101d6565b82525050565b602081016101c582846101e1565b80356101c5565b60006020828403121561021a5761021a600080fd5b61022483836101fe565b9392505050565b8015156101ea565b602081016101c5828461022b565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b818103818111156101c5576101c5610241565b602080825281016101c581601681527f5468697320697320612074657374206661696c7572650000000000000000000060208201526040019056fea2646970667358221220a632c12aa58f6a033122d8091a6fa1620beb5a3506b1d4afefb839156694dfec64736f6c634300081c0033", } // PublicCallbacksTestABI is the input ABI used to generate the binding from. @@ -264,6 +264,27 @@ func (_PublicCallbacksTest *PublicCallbacksTestCallerSession) IsLastCallSuccess( return _PublicCallbacksTest.Contract.IsLastCallSuccess(&_PublicCallbacksTest.CallOpts) } +// HandleAllCallbacksRan is a paid mutator transaction binding the contract method 0x9e79db00. +// +// Solidity: function handleAllCallbacksRan() returns() +func (_PublicCallbacksTest *PublicCallbacksTestTransactor) HandleAllCallbacksRan(opts *bind.TransactOpts) (*types.Transaction, error) { + return _PublicCallbacksTest.contract.Transact(opts, "handleAllCallbacksRan") +} + +// HandleAllCallbacksRan is a paid mutator transaction binding the contract method 0x9e79db00. +// +// Solidity: function handleAllCallbacksRan() returns() +func (_PublicCallbacksTest *PublicCallbacksTestSession) HandleAllCallbacksRan() (*types.Transaction, error) { + return _PublicCallbacksTest.Contract.HandleAllCallbacksRan(&_PublicCallbacksTest.TransactOpts) +} + +// HandleAllCallbacksRan is a paid mutator transaction binding the contract method 0x9e79db00. +// +// Solidity: function handleAllCallbacksRan() returns() +func (_PublicCallbacksTest *PublicCallbacksTestTransactorSession) HandleAllCallbacksRan() (*types.Transaction, error) { + return _PublicCallbacksTest.Contract.HandleAllCallbacksRan(&_PublicCallbacksTest.TransactOpts) +} + // HandleCallback is a paid mutator transaction binding the contract method 0xa072d7b0. // // Solidity: function handleCallback(uint256 expectedGas) returns() @@ -284,3 +305,24 @@ func (_PublicCallbacksTest *PublicCallbacksTestSession) HandleCallback(expectedG func (_PublicCallbacksTest *PublicCallbacksTestTransactorSession) HandleCallback(expectedGas *big.Int) (*types.Transaction, error) { return _PublicCallbacksTest.Contract.HandleCallback(&_PublicCallbacksTest.TransactOpts, expectedGas) } + +// HandleCallbackFail is a paid mutator transaction binding the contract method 0xa4c016fb. +// +// Solidity: function handleCallbackFail() returns() +func (_PublicCallbacksTest *PublicCallbacksTestTransactor) HandleCallbackFail(opts *bind.TransactOpts) (*types.Transaction, error) { + return _PublicCallbacksTest.contract.Transact(opts, "handleCallbackFail") +} + +// HandleCallbackFail is a paid mutator transaction binding the contract method 0xa4c016fb. +// +// Solidity: function handleCallbackFail() returns() +func (_PublicCallbacksTest *PublicCallbacksTestSession) HandleCallbackFail() (*types.Transaction, error) { + return _PublicCallbacksTest.Contract.HandleCallbackFail(&_PublicCallbacksTest.TransactOpts) +} + +// HandleCallbackFail is a paid mutator transaction binding the contract method 0xa4c016fb. +// +// Solidity: function handleCallbackFail() returns() +func (_PublicCallbacksTest *PublicCallbacksTestTransactorSession) HandleCallbackFail() (*types.Transaction, error) { + return _PublicCallbacksTest.Contract.HandleCallbackFail(&_PublicCallbacksTest.TransactOpts) +} diff --git a/contracts/generated/SystemDeployer/SystemDeployer.go b/contracts/generated/SystemDeployer/SystemDeployer.go index d292107c60..8ca5038720 100644 --- a/contracts/generated/SystemDeployer/SystemDeployer.go +++ b/contracts/generated/SystemDeployer/SystemDeployer.go @@ -32,7 +32,7 @@ var ( // SystemDeployerMetaData contains all meta data concerning the SystemDeployer contract. var SystemDeployerMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"eoaAdmin\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"contractAddress\",\"type\":\"address\"}],\"name\":\"SystemContractDeployed\",\"type\":\"event\"}]", - Bin: "0x608060405234801561001057600080fd5b50604051615baf380380615baf83398101604081905261002f916103e7565b61003881610060565b6000610044828261011d565b905061005082826101e2565b610059826102a2565b50506105c4565b600060405161006e90610373565b604051809103906000f08015801561008a573d6000803e3d6000fd5b509050600063c4d66de860e01b836040516024016100a8919061041c565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050905060006100f083858461032f60201b60201c565b9050600080516020615b8f8339815191528160405161010f919061045e565b60405180910390a150505050565b60008060405161012c90610380565b604051809103906000f080158015610148573d6000803e3d6000fd5b509050600063da35a26f60e01b8486604051602401610168929190610483565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050905060006101b083878461032f60201b60201c565b9050600080516020615b8f833981519152816040516101cf91906104b7565b60405180910390a1925050505b92915050565b60006040516101f09061038d565b604051809103906000f08015801561020c573d6000803e3d6000fd5b509050600063485cc95560e01b848460405160240161022c9291906104c7565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b0383818316178352505050509050600061027483868461032f60201b60201c565b9050600080516020615b8f8339815191528160405161029391906104f4565b60405180910390a15050505050565b60006040516102b09061039a565b604051809103906000f0801580156102cc573d6000803e3d6000fd5b506040805160048152602481019091526020810180516001600160e01b0390811663204a7f0760e21b17909152919250906000906103109084908690859061032f16565b9050600080516020615b8f8339815191528160405161010f9190610528565b600080848484604051610341906103a7565b61034d9392919061058e565b604051809103906000f080158015610369573d6000803e3d6000fd5b5095945050505050565b610e368061061183390190565b6107c68061144783390190565b611c0c80611c0d83390190565b6110ec8061381983390190565b61128a8061490583390190565b60006001600160a01b0382166101dc565b6103ce816103b4565b81146103d957600080fd5b50565b80516101dc816103c5565b6000602082840312156103fc576103fc600080fd5b61040683836103dc565b9392505050565b610416816103b4565b82525050565b602081016101dc828461040d565b60198152602081017f5472616e73616374696f6e73506f737450726f636573736f7200000000000000815290505b60200190565b6040808252810161046e8161042a565b90506101dc602083018461040d565b80610416565b60408101610491828561047d565b610406602083018461040d565b6004815260208101634665657360e01b81529050610458565b6040808252810161046e8161049e565b60408101610491828561040d565b600a815260208101694d65737361676542757360b01b81529050610458565b6040808252810161046e816104d5565b600f8152602081016e5075626c696343616c6c6261636b7360881b81529050610458565b6040808252810161046e81610504565b60005b8381101561055357818101518382015260200161053b565b50506000910152565b6000610566825190565b80845260208401935061057d818560208601610538565b601f01601f19169290920192915050565b6060810161059c828661040d565b6105a9602083018561040d565b81810360408301526105bb818461055c565b95945050505050565b603f806105d26000396000f3fe6080604052600080fdfea26469706673582212207680b1b2c07c0701492930f06a4a43093ffb1d104422ab868d3329305f79774564736f6c634300081c00336080604052348015600f57600080fd5b50610e178061001f6000396000f3fe608060405234801561001057600080fd5b50600436106100c95760003560e01c806364c55a9d11610081578063c4d66de81161005b578063c4d66de8146101c8578063d547741f146101db578063ee546fd8146101ee57600080fd5b806364c55a9d1461017657806391d1485414610189578063a217fddf146101c057600080fd5b80632f2ff15d116100b25780632f2ff15d1461012757806336568abe1461013c578063508a50f41461014f57600080fd5b806301ffc9a7146100ce578063248a9ca3146100f7575b600080fd5b6100e16100dc366004610835565b610265565b6040516100ee9190610865565b60405180910390f35b61011a610105366004610884565b60009081526020819052604090206001015490565b6040516100ee91906108a9565b61013a6101353660046108dc565b6102fe565b005b61013a61014a3660046108dc565b610329565b61011a7ff16bb8781ef1311f8fe06747bcbe481e695502acdcb0cb8c03aa03899e39a59881565b61013a610184366004610966565b61037a565b6100e16101973660046108dc565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b61011a600081565b61013a6101d63660046109ae565b6104ca565b61013a6101e93660046108dc565b61063a565b61013a6101fc3660046109ae565b6001805480820182556000919091527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf60180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b0000000000000000000000000000000000000000000000000000000014806102f857507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6000828152602081905260409020600101546103198161065f565b610323838361066c565b50505050565b6001600160a01b038116331461036b576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103758282610716565b505050565b60006103876001306109e3565b9050336001600160a01b038216146103ba5760405162461bcd60e51b81526004016103b190610a3a565b60405180910390fd5b60008290036103db5760405162461bcd60e51b81526004016103b190610a7c565b6040517f3357352afe45ddda257f56623a512152c527b6f11555ec2fb2fdbbe72ddece419061040b9084906108a9565b60405180910390a160005b6001548110156103235760006001828154811061043557610435610a8c565b6000918252602090912001546040517f9f9976af0000000000000000000000000000000000000000000000000000000081526001600160a01b0390911691508190639f9976af9061048c9088908890600401610d83565b600060405180830381600087803b1580156104a657600080fd5b505af11580156104ba573d6000803e3d6000fd5b5050505050806001019050610416565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff16159067ffffffffffffffff166000811580156105155750825b905060008267ffffffffffffffff1660011480156105325750303b155b905081158015610540575080155b15610577576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156105ab57845468ff00000000000000001916680100000000000000001785555b6105b660008761066c565b506105e17ff16bb8781ef1311f8fe06747bcbe481e695502acdcb0cb8c03aa03899e39a5988761066c565b50831561063257845468ff0000000000000000191685556040517fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29061062990600190610db8565b60405180910390a15b505050505050565b6000828152602081905260409020600101546106558161065f565b6103238383610716565b6106698133610799565b50565b6000828152602081815260408083206001600160a01b038516845290915281205460ff1661070e576000838152602081815260408083206001600160a01b03861684529091529020805460ff191660011790556106c63390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45060016102f8565b5060006102f8565b6000828152602081815260408083206001600160a01b038516845290915281205460ff161561070e576000838152602081815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45060016102f8565b6000828152602081815260408083206001600160a01b038516845290915290205460ff166107f75780826040517fe2517d3f0000000000000000000000000000000000000000000000000000000081526004016103b1929190610dc6565b5050565b7fffffffff0000000000000000000000000000000000000000000000000000000081165b811461066957600080fd5b80356102f8816107fb565b60006020828403121561084a5761084a600080fd5b610854838361082a565b9392505050565b8015155b82525050565b602081016102f8828461085b565b8061081f565b80356102f881610873565b60006020828403121561089957610899600080fd5b6108548383610879565b8061085f565b602081016102f882846108a3565b60006001600160a01b0382166102f8565b61081f816108b7565b80356102f8816108c8565b600080604083850312156108f2576108f2600080fd5b6108fc8484610879565b915061090b84602085016108d1565b90509250929050565b60008083601f84011261092957610929600080fd5b50813567ffffffffffffffff81111561094457610944600080fd5b60208301915083602082028301111561095f5761095f600080fd5b9250929050565b6000806020838503121561097c5761097c600080fd5b823567ffffffffffffffff81111561099657610996600080fd5b6109a285828601610914565b92509250509250929050565b6000602082840312156109c3576109c3600080fd5b61085483836108d1565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b039182169190811690828203908111156102f8576102f86109cd565b60088152602081017f4e6f742073656c66000000000000000000000000000000000000000000000000815290505b60200190565b602080825281016102f881610a06565b601a8152602081017f4e6f207472616e73616374696f6e7320746f20636f6e7665727400000000000081529050610a34565b602080825281016102f881610a4a565b634e487b7160e01b600052603260045260246000fd5b60ff811661081f565b80356102f881610aa2565b5060006102f86020830183610aab565b60ff811661085f565b5060006102f86020830183610879565b5060006102f860208301836108d1565b61085f816108b7565b6000808335601e1936859003018112610b1357610b13600080fd5b830160208101925035905067ffffffffffffffff811115610b3657610b36600080fd5b3681900382131561095f5761095f600080fd5b82818337506000910152565b818352602083019250610b69828483610b49565b50601f01601f19160190565b80151561081f565b80356102f881610b75565b5060006102f86020830183610b7d565b67ffffffffffffffff811661081f565b80356102f881610b98565b5060006102f86020830183610ba8565b67ffffffffffffffff811661085f565b60006101408301610be48380610ab6565b610bee8582610ac6565b50610bfc6020840184610acf565b610c0960208601826108a3565b50610c176040840184610acf565b610c2460408601826108a3565b50610c326060840184610acf565b610c3f60608601826108a3565b50610c4d6080840184610adf565b610c5a6080860182610aef565b50610c6860a0840184610acf565b610c7560a08601826108a3565b50610c8360c0840184610af8565b85830360c0870152610c96838284610b55565b92505050610ca760e0840184610adf565b610cb460e0860182610aef565b50610cc3610100840184610b88565b610cd161010086018261085b565b50610ce0610120840184610bb3565b610cee610120860182610bc3565b509392505050565b60006108548383610bd3565b6000823561013e1936849003018112610d1d57610d1d600080fd5b90910192915050565b818352602083019250600083602084028101838060005b87811015610d76578484038952610d548284610d02565b610d5e8582610cf6565b94505060208201602099909901989150600101610d3d565b5091979650505050505050565b60208082528101610d95818486610d26565b949350505050565b600067ffffffffffffffff82166102f8565b61085f81610d9d565b602081016102f88284610daf565b60408101610dd48285610aef565b61085460208301846108a356fea2646970667358221220c3cf3852209ad93e14f2c95a1ee81360a00fe52f5b9883259bae9ca4c33a0aa064736f6c634300081c00336080604052348015600f57600080fd5b506016601a565b60ca565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161560695760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b039081161460c75780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b6106ed806100d96000396000f3fe60806040526004361061007f5760003560e01c8063afe997ea1161004e578063afe997ea1461012c578063da35a26f14610141578063f1d44d5114610161578063f2fde38b1461018157600080fd5b806323aa2a9d1461008b578063715018a6146100ad5780638da5cb5b146100c25780639003adfe1461011057600080fd5b3661008657005b600080fd5b34801561009757600080fd5b506100ab6100a6366004610575565b6101a1565b005b3480156100b957600080fd5b506100ab6101ae565b3480156100ce57600080fd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031660405161010791906105bb565b60405180910390f35b34801561011c57600080fd5b50475b60405161010791906105cf565b34801561013857600080fd5b506100ab6101c2565b34801561014d57600080fd5b506100ab61015c3660046105f1565b610225565b34801561016d57600080fd5b5061011f61017c366004610575565b61036d565b34801561018d57600080fd5b506100ab61019c366004610629565b610383565b6101a96103e0565b600055565b6101b66103e0565b6101c06000610454565b565b6101ca6103e0565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015610222573d6000803e3d6000fd5b50565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff16159067ffffffffffffffff166000811580156102705750825b905060008267ffffffffffffffff16600114801561028d5750303b155b90508115801561029b575080155b156102d2576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561030657845468ff00000000000000001916680100000000000000001785555b61030f866104dd565b6000879055831561036457845468ff0000000000000000191685556040517fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29061035b90600190610663565b60405180910390a15b50505050505050565b60008160005461037d91906106a0565b92915050565b61038b6103e0565b6001600160a01b0381166103d75760006040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016103ce91906105bb565b60405180910390fd5b61022281610454565b336104127f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146101c057336040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016103ce91906105bb565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080547fffffffffffffffffffffffff000000000000000000000000000000000000000081166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b6104e56104ee565b61022281610555565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005468010000000000000000900460ff166101c0576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61038b6104ee565b805b811461022257600080fd5b803561037d8161055d565b60006020828403121561058a5761058a600080fd5b610594838361056a565b9392505050565b60006001600160a01b03821661037d565b6105b58161059b565b82525050565b6020810161037d82846105ac565b806105b5565b6020810161037d82846105c9565b61055f8161059b565b803561037d816105dd565b6000806040838503121561060757610607600080fd5b610611848461056a565b915061062084602085016105e6565b90509250929050565b60006020828403121561063e5761063e600080fd5b61059483836105e6565b600067ffffffffffffffff821661037d565b6105b581610648565b6020810161037d828461065a565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b818102811582820484141761037d5761037d61067156fea26469706673582212203b15352e8f587de7fab730ebe897ce1d19b5fb0f5a07f4e8af1cc73861e46f5864736f6c634300081c0033608060405234801561001057600080fd5b5061001a33610027565b610022610098565b61014a565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100e85760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101475780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b611ab3806101596000396000f3fe6080604052600436106100c05760003560e01c8063715018a61161007457806399a3ad211161004e57806399a3ad2114610285578063b1454caa146102a5578063f2fde38b146102c557610134565b8063715018a61461020b5780638da5cb5b146102205780639730886d1461026557610134565b8063346633fb116100a5578063346633fb146101b857806336d2da90146101cb578063485cc955146101eb57610134565b80630fcfbd111461015557806333a88c721461018b57610134565b36610134576040517f346633fb000000000000000000000000000000000000000000000000000000008152309063346633fb9034906101059033908390600401610d37565b6000604051808303818588803b15801561011e57600080fd5b505af1158015610132573d6000803e3d6000fd5b005b60405162461bcd60e51b815260040161014c90610d86565b60405180910390fd5b34801561016157600080fd5b50610175610170366004610db1565b6102e5565b6040516101829190610dec565b60405180910390f35b34801561019757600080fd5b506101ab6101a6366004610db1565b610344565b6040516101829190610e02565b6101326101c6366004610e40565b610396565b3480156101d757600080fd5b506101326101e6366004610e78565b6104e5565b3480156101f757600080fd5b50610132610206366004610e97565b610564565b34801561021757600080fd5b506101326106cf565b34801561022c57600080fd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03166040516101829190610ec6565b34801561027157600080fd5b50610132610280366004610ed4565b6106e3565b34801561029157600080fd5b506101326102a0366004610e40565b61084f565b6102b86102b3366004610f9d565b6108cf565b604051610182919061102a565b3480156102d157600080fd5b506101326102e0366004610e78565b6109d7565b600080826040516020016102f991906111d7565b60408051601f1981840301815291815281516020928301206000818152928390529120549091508061033d5760405162461bcd60e51b815260040161014c90611242565b9392505050565b6000808260405160200161035891906111d7565b60408051601f198184030181529181528151602092830120600081815292839052912054909150801580159061038e5750428111155b949350505050565b6000341180156103a557508034145b6103c15760405162461bcd60e51b815260040161014c906112aa565b60035434906001600160a01b0316156104855760006103de610a2e565b9050803410156104005760405162461bcd60e51b815260040161014c906112ea565b61040a8134611310565b6003546040519193506000916001600160a01b039091169083908381818185875af1925050503d806000811461045c576040519150601f19603f3d011682016040523d82523d6000602084013e610461565b606091505b50509050806104825760405162461bcd60e51b815260040161014c9061137b565b50505b600061049033610abf565b9050836001600160a01b0316336001600160a01b03167f50c536ac33a920f00755865b831d17bf4cff0b2e0345f65b16d52bfc004068b684846040516104d792919061138b565b60405180910390a350505050565b6104ed610b1d565b6000816001600160a01b03164760405160006040518083038185875af1925050503d806000811461053a576040519150601f19603f3d011682016040523d82523d6000602084013e61053f565b606091505b50509050806105605760405162461bcd60e51b815260040161014c906113d8565b5050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff16159067ffffffffffffffff166000811580156105af5750825b905060008267ffffffffffffffff1660011480156105cc5750303b155b9050811580156105da575080155b15610611576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561064557845468ff00000000000000001916680100000000000000001785555b61064e87610b91565b6003805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03881617905583156106c657845468ff0000000000000000191685556040517fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2906106bd9060019061140c565b60405180910390a15b50505050505050565b6106d7610b1d565b6106e16000610ba2565b565b60006106f060013061141a565b90506107237f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316336001600160a01b0316148061074a5750336001600160a01b038216145b6107665760405162461bcd60e51b815260040161014c9061146f565b6000610772834261147f565b905060008460405160200161078791906111d7565b60408051601f198184030181529181528151602092830120600081815292839052912054909150156107cb5760405162461bcd60e51b815260040161014c906114ea565b6000818152602081815260408220849055600191906107ec90880188610e78565b6001600160a01b03168152602081019190915260400160009081209061081860808801606089016114fa565b63ffffffff168152602080820192909252604001600090812080546001810182559082529190208691600402016106c68282611943565b610857610b1d565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146108a4576040519150601f19603f3d011682016040523d82523d6000602084013e6108a9565b606091505b50509050806108ca5760405162461bcd60e51b815260040161014c906113d8565b505050565b6003546000906001600160a01b031615610980576108ec83610c20565b34101561090b5760405162461bcd60e51b815260040161014c906119a5565b6003546040516000916001600160a01b03169034908381818185875af1925050503d8060008114610958576040519150601f19603f3d011682016040523d82523d6000602084013e61095d565b606091505b505090508061097e5760405162461bcd60e51b815260040161014c9061137b565b505b61098933610abf565b90507fb93c37389233beb85a3a726c3f15c2d15533ee74cb602f20f490dfffef775937338288888888886040516109c697969594939291906119b5565b60405180910390a195945050505050565b6109df610b1d565b6001600160a01b038116610a225760006040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161014c9190610ec6565b610a2b81610ba2565b50565b6003546040517ff1d44d510000000000000000000000000000000000000000000000000000000081526000916001600160a01b03169063f1d44d5190610a7990602090600401611a21565b602060405180830381865afa158015610a96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aba9190611a3a565b905090565b6001600160a01b0381166000908152600260205260408120805467ffffffffffffffff169160019190610af28385611a59565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550919050565b33610b4f7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146106e157336040517f118cdaa700000000000000000000000000000000000000000000000000000000815260040161014c9190610ec6565b610b99610ca2565b610a2b81610d09565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300805473ffffffffffffffffffffffffffffffffffffffff1981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b6003546000906001600160a01b031663f1d44d51610c3f60118561147f565b6040518263ffffffff1660e01b8152600401610c5b9190610dec565b602060405180830381865afa158015610c78573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c9c9190611a3a565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005468010000000000000000900460ff166106e1576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109df610ca2565b60006001600160a01b038216610c9c565b610d2b81610d11565b82525050565b80610d2b565b60408101610d458285610d22565b61033d6020830184610d31565b600b8152602081017f756e737570706f72746564000000000000000000000000000000000000000000815290505b60200190565b60208082528101610c9c81610d52565b600060c08284031215610dab57610dab600080fd5b50919050565b600060208284031215610dc657610dc6600080fd5b813567ffffffffffffffff811115610de057610de0600080fd5b61038e84828501610d96565b60208101610c9c8284610d31565b801515610d2b565b60208101610c9c8284610dfa565b610e1981610d11565b8114610a2b57600080fd5b8035610c9c81610e10565b80610e19565b8035610c9c81610e2f565b60008060408385031215610e5657610e56600080fd5b610e608484610e24565b9150610e6f8460208501610e35565b90509250929050565b600060208284031215610e8d57610e8d600080fd5b61033d8383610e24565b60008060408385031215610ead57610ead600080fd5b610eb78484610e24565b9150610e6f8460208501610e24565b60208101610c9c8284610d22565b60008060408385031215610eea57610eea600080fd5b823567ffffffffffffffff811115610f0457610f04600080fd5b610f1085828601610d96565b925050610e6f8460208501610e35565b63ffffffff8116610e19565b8035610c9c81610f20565b60008083601f840112610f4c57610f4c600080fd5b50813567ffffffffffffffff811115610f6757610f67600080fd5b602083019150836001820283011115610f8257610f82600080fd5b9250929050565b60ff8116610e19565b8035610c9c81610f89565b600080600080600060808688031215610fb857610fb8600080fd5b610fc28787610f2c565b9450610fd18760208801610f2c565b9350604086013567ffffffffffffffff811115610ff057610ff0600080fd5b610ffc88828901610f37565b935093505061100e8760608801610f92565b90509295509295909350565b67ffffffffffffffff8116610d2b565b60208101610c9c828461101a565b506000610c9c6020830183610e24565b67ffffffffffffffff8116610e19565b8035610c9c81611048565b506000610c9c6020830183611058565b506000610c9c6020830183610f2c565b63ffffffff8116610d2b565b6000808335601e19368590030181126110aa576110aa600080fd5b830160208101925035905067ffffffffffffffff8111156110cd576110cd600080fd5b36819003821315610f8257610f82600080fd5b82818337506000910152565b8183526020830192506111008284836110e0565b50601f01601f19160190565b506000610c9c6020830183610f92565b60ff8116610d2b565b600060c083016111358380611038565b61113f8582610d22565b5061114d6020840184611063565b61115a602086018261101a565b506111686040840184611073565b6111756040860182611083565b506111836060840184611073565b6111906060860182611083565b5061119e608084018461108f565b85830360808701526111b18382846110ec565b925050506111c260a084018461110c565b6111cf60a086018261111c565b509392505050565b6020808252810161033d8184611125565b60218152602081017f54686973206d65737361676520776173206e65766572207375626d697474656481527f2e00000000000000000000000000000000000000000000000000000000000000602082015290505b60400190565b60208082528101610c9c816111e8565b60308152602081017f417474656d7074696e6720746f2073656e642076616c756520776974686f757481527f2070726f766964696e67204574686572000000000000000000000000000000006020820152905061123c565b60208082528101610c9c81611252565b60208082527f496e73756666696369656e742066756e647320746f2073656e642076616c75659101908152610d80565b60208082528101610c9c816112ba565b634e487b7160e01b600052601160045260246000fd5b81810381811115610c9c57610c9c6112fa565b60248152602081017f4661696c656420746f2073656e64206665657320746f206665657320636f6e7481527f72616374000000000000000000000000000000000000000000000000000000006020820152905061123c565b60208082528101610c9c81611323565b604081016113998285610d31565b61033d602083018461101a565b60148152602081017f6661696c65642073656e64696e672076616c756500000000000000000000000081529050610d80565b60208082528101610c9c816113a6565b6000610c9c826113f6565b90565b67ffffffffffffffff1690565b610d2b816113e8565b60208101610c9c8284611403565b6001600160a01b03918216919081169082820390811115610c9c57610c9c6112fa565b60118152602081017f4e6f74206f776e6572206f722073656c6600000000000000000000000000000081529050610d80565b60208082528101610c9c8161143d565b80820180821115610c9c57610c9c6112fa565b60218152602081017f4d657373616765207375626d6974746564206d6f7265207468616e206f6e636581527f21000000000000000000000000000000000000000000000000000000000000006020820152905061123c565b60208082528101610c9c81611492565b60006020828403121561150f5761150f600080fd5b61033d8383610f2c565b60008135610c9c81610e10565b60006001600160a01b03835b81169019929092169190911792915050565b6000610c9c82610d11565b6000610c9c82611544565b6115638261154f565b61156e818354611526565b8255505050565b60008135610c9c81611048565b60007bffffffffffffffff00000000000000000000000000000000000000006115328460a01b90565b6000610c9c67ffffffffffffffff83166113f6565b6115c9826115ab565b61156e818354611582565b60008135610c9c81610f20565b60007fffffffff000000000000000000000000000000000000000000000000000000006115328460e01b90565b600063ffffffff8216610c9c565b6116258261160e565b61156e8183546115e1565b600063ffffffff83611532565b6116468261160e565b61156e818354611630565b6000808335601e193685900301811261166c5761166c600080fd5b8301915050803567ffffffffffffffff81111561168b5761168b600080fd5b602082019150600181023603821315610f8257610f82600080fd5b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052602260045260246000fd5b6002810460018216806116e657607f821691505b602082108103610dab57610dab6116bc565b6000610c9c6113f38381565b61170d836116f8565b815460001960089490940293841b1916921b91909117905550565b60006108ca818484611704565b8181101561056057611748600082611728565b600101611735565b601f8211156108ca576000818152602090206020601f850104810160208510156117775750805b6117896020601f860104830182611735565b5050505050565b8267ffffffffffffffff8111156117a9576117a96116a6565b6117b382546116d2565b6117be828285611750565b506000601f8211600181146117f357600083156117db5750848201355b600019600885021c198116600285021785555061184d565b600084815260209020601f19841690835b828110156118245787850135825560209485019460019092019101611804565b5084821015611841576000196008601f8716021c19878501351681555b50506001600284020184555b505050505050565b6108ca838383611790565b60008135610c9c81610f89565b600060ff8216610c9c565b6118818261186d565b815460ff191660ff82161761156e565b80828061189d81611519565b90506118a9818461155a565b505060208301806118b982611575565b90506118c581846115c0565b505060408301806118d5826115d4565b90506118e1818461161c565b50505060608201806118f2826115d4565b9050611901816001850161163d565b50506119106080830183611651565b61191e818360028601611855565b505060a082018061192e82611860565b905061193d8160038501611878565b50505050565b6105608282611891565b60258152602081017f496e73756666696369656e742066756e647320746f207075626c697368206d6581527f73736167650000000000000000000000000000000000000000000000000000006020820152905061123c565b60208082528101610c9c8161194d565b60c081016119c3828a610d22565b6119d0602083018961101a565b6119dd6040830188611083565b6119ea6060830187611083565b81810360808301526119fd8185876110ec565b9050611a0c60a083018461111c565b98975050505050505050565b610d2b816116f8565b60208101610c9c8284611a18565b8051610c9c81610e2f565b600060208284031215611a4f57611a4f600080fd5b61033d8383611a2f565b67ffffffffffffffff918216919081169082820190811115610c9c57610c9c6112fa56fea26469706673582212201f500c1ed66462b882c75dccce6728c6e38010a1e90ea1306d187fe1d8d0d83b64736f6c634300081c00336080604052348015600f57600080fd5b506016601a565b60ca565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161560695760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b039081161460c75780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b611013806100d96000396000f3fe6080604052600436106100595760003560e01c806382fbdc9c1161004357806382fbdc9c146100ae578063929d34e9146100ce578063a67e1760146100ee57600080fd5b8062e0d3b51461005e5780638129fc1c14610097575b600080fd5b34801561006a57600080fd5b5061007e610079366004610a7a565b610103565b60405161008e9493929190610b15565b60405180910390f35b3480156100a357600080fd5b506100ac6101be565b005b6100c16100bc366004610bac565b610300565b60405161008e9190610bf4565b3480156100da57600080fd5b506100ac6100e9366004610a7a565b610368565b3480156100fa57600080fd5b506100ac61050d565b600060208190529081526040902080546001820180546001600160a01b03909216929161012f90610c18565b80601f016020809104026020016040519081016040528092919081815260200182805461015b90610c18565b80156101a85780601f1061017d576101008083540402835291602001916101a8565b820191906000526020600020905b81548152906001019060200180831161018b57829003601f168201915b5050505050908060020154908060030154905084565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff16159067ffffffffffffffff166000811580156102095750825b905060008267ffffffffffffffff1660011480156102265750303b155b905081158015610234575080155b1561026b576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561029f57845468ff00000000000000001916680100000000000000001785555b6000600181905560025583156102f957845468ff0000000000000000191685556040517fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2906102f090600190610c68565b60405180910390a15b5050505050565b600080341161032a5760405162461bcd60e51b815260040161032190610caa565b60405180910390fd5b6152086103363461055f565b116103535760405162461bcd60e51b815260040161032190610cba565b61035f3384843461056b565b90505b92915050565b60008181526020818152604080832081516080810190925280546001600160a01b0316825260018101805492939192918401916103a490610c18565b80601f01602080910402602001604051908101604052809291908181526020018280546103d090610c18565b801561041d5780601f106103f25761010080835404028352916020019161041d565b820191906000526020600020905b81548152906001019060200180831161040057829003601f168201915b50505050508152602001600282015481526020016003820154815250509050600081600001516001600160a01b0316826020015160405161045e9190610d3d565b6000604051808303816000865af19150503d806000811461049b576040519150601f19603f3d011682016040523d82523d6000602084013e6104a0565b606091505b50509050806104c15760405162461bcd60e51b815260040161032190610d79565b6000838152602081905260408120805473ffffffffffffffffffffffffffffffffffffffff19168155906104f86001830182610a25565b50600060028201819055600390910155505050565b600061051a600130610d9f565b9050336001600160a01b038216146105445760405162461bcd60e51b815260040161032190610df4565b6002546001541461055c57610557610654565b610544565b50565b60006103624883610e1a565b60006040518060800160405280866001600160a01b0316815260200185858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052509385525050506020820185905248604090920191909152600180548291826105e083610e2e565b9091555081526020808201929092526040016000208251815473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b039091161781559082015160018201906106319082610ef3565b506040820151600282015560609091015160039091015550600154949350505050565b6002546001540361066157565b60008061066c610777565b91509150600082606001519050600081846040015161068b9190610e1a565b905060005a9050600085600001516001600160a01b03168387602001516040516106b59190610d3d565b60006040518083038160008787f1925050503d80600081146106f3576040519150601f19603f3d011682016040523d82523d6000602084013e6106f8565b606091505b5050905060005a9050600061070d8285610fb3565b905060008186111561073157866107248388610fb3565b61072e9190610fc6565b90505b6000818a604001516107439190610fb3565b8a5190915085156107565761075661088f565b61076183828c6108f0565b61076a826109f4565b5050505050505050505050565b6107ab604051806080016040528060006001600160a01b031681526020016060815260200160008152602001600081525090565b60025460008181526020818152604080832081516080810190925280546001600160a01b03168252600181018054949591949193859290840191906107ef90610c18565b80601f016020809104026020016040519081016040528092919081815260200182805461081b90610c18565b80156108685780601f1061083d57610100808354040283529160200191610868565b820191906000526020600020905b81548152906001019060200180831161084b57829003601f168201915b50505050508152602001600282015481526020016003820154815250509150915091509091565b6002546000908152602081905260408120805473ffffffffffffffffffffffffffffffffffffffff19168155906108c96001830182610a25565b50600060028281018290556003909201819055815491906108e983610e2e565b9190505550565b6000826001600160a01b0316846188b890846040516024016109129190610bf4565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f5ea3955800000000000000000000000000000000000000000000000000000000179052516109759190610d3d565b600060405180830381858888f193505050503d80600081146109b3576040519150601f19603f3d011682016040523d82523d6000602084013e6109b8565b606091505b50509050806109ee57604051419085156108fc029086906000818181858888f193505050501580156102f9573d6000803e3d6000fd5b50505050565b604051419082156108fc029083906000818181858888f19350505050158015610a21573d6000803e3d6000fd5b5050565b508054610a3190610c18565b6000825580601f10610a41575050565b601f01602090049060005260206000209081019061055c91905b80821115610a6f5760008155600101610a5b565b5090565b8035610362565b600060208284031215610a8f57610a8f600080fd5b61035f8383610a73565b60006001600160a01b038216610362565b610ab381610a99565b82525050565b60005b83811015610ad4578181015183820152602001610abc565b50506000910152565b6000610ae7825190565b808452602084019350610afe818560208601610ab9565b601f01601f19169290920192915050565b80610ab3565b60808101610b238287610aaa565b8181036020830152610b358186610add565b9050610b446040830185610b0f565b610b516060830184610b0f565b95945050505050565b60008083601f840112610b6f57610b6f600080fd5b50813567ffffffffffffffff811115610b8a57610b8a600080fd5b602083019150836001820283011115610ba557610ba5600080fd5b9250929050565b60008060208385031215610bc257610bc2600080fd5b823567ffffffffffffffff811115610bdc57610bdc600080fd5b610be885828601610b5a565b92509250509250929050565b602081016103628284610b0f565b634e487b7160e01b600052602260045260246000fd5b600281046001821680610c2c57607f821691505b602082108103610c3e57610c3e610c02565b50919050565b600061036282610c52565b90565b67ffffffffffffffff1690565b610ab381610c44565b602081016103628284610c5f565b600d8152602081017f4e6f2076616c75652073656e7400000000000000000000000000000000000000815290505b60200190565b6020808252810161036281610c76565b6020808252810161036281602481527f47617320746f6f206c6f7720636f6d706172656420746f20636f7374206f662060208201527f63616c6c00000000000000000000000000000000000000000000000000000000604082015260600190565b6000610d25825190565b610d33818560208601610ab9565b9290920192915050565b6103628183610d1b565b60198152602081017f43616c6c6261636b20657865637574696f6e206661696c65640000000000000081529050610ca4565b6020808252810161036281610d47565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b0391821691908116908282039081111561036257610362610d89565b60088152602081017f4e6f742073656c6600000000000000000000000000000000000000000000000081529050610ca4565b6020808252810161036281610dc2565b634e487b7160e01b600052601260045260246000fd5b600082610e2957610e29610e04565b500490565b600060018201610e4057610e40610d89565b5060010190565b634e487b7160e01b600052604160045260246000fd5b6000610362610c4f8381565b610e7283610e5d565b815460001960089490940293841b1916921b91909117905550565b6000610e9a818484610e69565b505050565b81811015610a2157610eb2600082610e8d565b600101610e9f565b601f821115610e9a576000818152602090206020601f85010481016020851015610ee15750805b6102f96020601f860104830182610e9f565b815167ffffffffffffffff811115610f0d57610f0d610e47565b610f178254610c18565b610f22828285610eba565b506020601f821160018114610f575760008315610f3f5750848201515b600019600885021c19811660028502178555506102f9565b600084815260208120601f198516915b82811015610f875787850151825560209485019460019092019101610f67565b5084821015610fa45783870151600019601f87166008021c191681555b50505050600202600101905550565b8181038181111561036257610362610d89565b818102811582820484141761036257610362610d8956fea2646970667358221220a0816b74121dc3e64792067f88c4f0488058073d1d1bdd5b221af40124cdf1a564736f6c634300081c003360a060405260405161128a38038061128a8339810160408190526100229161046a565b828161002e8282610089565b50508160405161003d9061031d565b61004791906104df565b604051809103906000f080158015610063573d6000803e3d6000fd5b506001600160a01b031660805261008161007c60805190565b6100e8565b505050610534565b6100928261014b565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156100dc576100d782826101c5565b505050565b6100e461023e565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61012860008051602061126a833981519152546001600160a01b031690565b826040516101379291906104ed565b60405180910390a16101488161025f565b50565b806001600160a01b03163b6000036101815780604051634c9c8ce360e01b815260040161017891906104df565b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060600080846001600160a01b0316846040516101e2919061052a565b600060405180830381855af49150503d806000811461021d576040519150601f19603f3d011682016040523d82523d6000602084013e610222565b606091505b50909250905061023385838361029e565b925050505b92915050565b341561025d5760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b038116610289576000604051633173bdd160e11b815260040161017891906104df565b8060008051602061126a8339815191526101a4565b6060826102b3576102ae826102f4565b6102ed565b81511580156102ca57506001600160a01b0384163b155b156102ea5783604051639996b31560e01b815260040161017891906104df565b50805b9392505050565b8051156103045780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b6106eb80610b7f83390190565b60006001600160a01b038216610238565b6103448161032a565b811461014857600080fd5b80516102388161033b565b634e487b7160e01b600052604160045260246000fd5b601f19601f83011681016001600160401b03811182821017156103955761039561035a565b6040525050565b60006103a760405190565b90506103b38282610370565b919050565b60006001600160401b038211156103d1576103d161035a565b601f19601f83011660200192915050565b60005b838110156103fd5781810151838201526020016103e5565b50506000910152565b6000610419610414846103b8565b61039c565b905082815283838301111561043057610430600080fd5b6102ed8360208301846103e2565b600082601f83011261045257610452600080fd5b8151610462848260208601610406565b949350505050565b60008060006060848603121561048257610482600080fd5b61048c858561034f565b925061049b856020860161034f565b60408501519092506001600160401b038111156104ba576104ba600080fd5b6104c68682870161043e565b9150509250925092565b6104d98161032a565b82525050565b6020810161023882846104d0565b604081016104fb82856104d0565b6102ed60208301846104d0565b6000610512825190565b6105208185602086016103e2565b9290920192915050565b6102388183610508565b60805161063161054e6000396000601001526106316000f3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036100c5576000357fffffffff00000000000000000000000000000000000000000000000000000000167f4f1ef28600000000000000000000000000000000000000000000000000000000146100bb576040517fd2b576ec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6100c36100cd565b565b6100c36100fc565b6000806100dd36600481846103cf565b8101906100ea9190610539565b915091506100f8828261010c565b5050565b6100c3610107610167565b61019f565b610115826101c3565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561015f5761015a828261026b565b505050565b6100f86102e3565b600061019a7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b3660008037600080366000845af43d6000803e8080156101be573d6000f35b3d6000fd5b806001600160a01b03163b60000361021257806040517f4c9c8ce3000000000000000000000000000000000000000000000000000000008152600401610209919061059d565b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6060600080846001600160a01b03168460405161028891906105f1565b600060405180830381855af49150503d80600081146102c3576040519150601f19603f3d011682016040523d82523d6000602084013e6102c8565b606091505b50915091506102d885838361031b565b925050505b92915050565b34156100c3576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060826103305761032b8261038a565b610383565b815115801561034757506001600160a01b0384163b155b1561038057836040517f9996b315000000000000000000000000000000000000000000000000000000008152600401610209919061059d565b50805b9392505050565b80511561039a5780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b600080858511156103e2576103e2600080fd5b838611156103f2576103f2600080fd5b5050820193919092039150565b60006001600160a01b0382166102dd565b610419816103ff565b81146103cc57600080fd5b80356102dd81610410565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b601f19601f830116810181811067ffffffffffffffff821117156104845761048461042f565b6040525050565b600061049660405190565b90506104a2828261045e565b919050565b600067ffffffffffffffff8211156104c1576104c161042f565b601f19601f83011660200192915050565b82818337506000910152565b60006104f16104ec846104a7565b61048b565b905082815283838301111561050857610508600080fd5b6103838360208301846104d2565b600082601f83011261052a5761052a600080fd5b610383838335602085016104de565b6000806040838503121561054f5761054f600080fd5b6105598484610424565b9150602083013567ffffffffffffffff81111561057857610578600080fd5b61058485828601610516565b9150509250929050565b610597816103ff565b82525050565b602081016102dd828461058e565b60005b838110156105c65781810151838201526020016105ae565b50506000910152565b60006105d9825190565b6105e78185602086016105ab565b9290920192915050565b6102dd81836105cf56fea264697066735822122010d1880687d5a44f0a558c272f84fabbd9bf65d697170ee3f6681c2467feb26164736f6c634300081c0033608060405234801561001057600080fd5b506040516106eb3803806106eb83398101604081905261002f916100f8565b806001600160a01b038116610063576000604051631e4fbdf760e01b815260040161005a919061012d565b60405180910390fd5b61006c81610073565b505061013b565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006001600160a01b0382165b92915050565b6100df816100c3565b81146100ea57600080fd5b50565b80516100d0816100d6565b60006020828403121561010d5761010d600080fd5b61011783836100ed565b9392505050565b610127816100c3565b82525050565b602081016100d0828461011e565b6105a18061014a6000396000f3fe60806040526004361061005a5760003560e01c80639623609d116100435780639623609d146100a5578063ad3cb1cc146100b8578063f2fde38b1461010e57600080fd5b8063715018a61461005f5780638da5cb5b14610076575b600080fd5b34801561006b57600080fd5b5061007461012e565b005b34801561008257600080fd5b506000546001600160a01b031660405161009c91906102fa565b60405180910390f35b6100746100b3366004610457565b610142565b3480156100c457600080fd5b506101016040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b60405161009c9190610513565b34801561011a57600080fd5b50610074610129366004610524565b6101ca565b61013661022a565b6101406000610270565b565b61014a61022a565b6040517f4f1ef2860000000000000000000000000000000000000000000000000000000081526001600160a01b03841690634f1ef2869034906101939086908690600401610543565b6000604051808303818588803b1580156101ac57600080fd5b505af11580156101c0573d6000803e3d6000fd5b5050505050505050565b6101d261022a565b6001600160a01b03811661021e5760006040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161021591906102fa565b60405180910390fd5b61022781610270565b50565b6000546001600160a01b0316331461014057336040517f118cdaa700000000000000000000000000000000000000000000000000000000815260040161021591906102fa565b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006001600160a01b0382165b92915050565b6102f4816102d8565b82525050565b602081016102e582846102eb565b60006102e5826102d8565b61031c81610308565b811461022757600080fd5b80356102e581610313565b61031c816102d8565b80356102e581610332565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b601f19601f830116810181811067ffffffffffffffff8211171561039b5761039b610346565b6040525050565b60006103ad60405190565b90506103b98282610375565b919050565b600067ffffffffffffffff8211156103d8576103d8610346565b601f19601f83011660200192915050565b82818337506000910152565b6000610408610403846103be565b6103a2565b905082815283838301111561041f5761041f600080fd5b61042d8360208301846103e9565b9392505050565b600082601f83011261044857610448600080fd5b61042d838335602085016103f5565b60008060006060848603121561046f5761046f600080fd5b6104798585610327565b9250610488856020860161033b565b9150604084013567ffffffffffffffff8111156104a7576104a7600080fd5b6104b386828701610434565b9150509250925092565b60005b838110156104d85781810151838201526020016104c0565b50506000910152565b60006104eb825190565b8084526020840193506105028185602086016104bd565b601f01601f19169290920192915050565b6020808252810161042d81846104e1565b60006020828403121561053957610539600080fd5b61042d838361033b565b6040810161055182856102eb565b818103602083015261056381846104e1565b94935050505056fea264697066735822122096c3a562b6861bd964d97d99d95931f7343ac03c64bc04aeab6287f6e42e45eb64736f6c634300081c0033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103bd64e14789a915ea657e42f2dbf0b973227708fa64b58766287637985d1ade69", + Bin: "0x608060405234801561001057600080fd5b50604051615bb3380380615bb383398101604081905261002f916103e7565b61003881610060565b6000610044828261011d565b905061005082826101e2565b610059826102a2565b50506105c4565b600060405161006e90610373565b604051809103906000f08015801561008a573d6000803e3d6000fd5b509050600063c4d66de860e01b836040516024016100a8919061041c565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050905060006100f083858461032f60201b60201c565b9050600080516020615b938339815191528160405161010f919061045e565b60405180910390a150505050565b60008060405161012c90610380565b604051809103906000f080158015610148573d6000803e3d6000fd5b509050600063da35a26f60e01b8486604051602401610168929190610483565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050905060006101b083878461032f60201b60201c565b9050600080516020615b93833981519152816040516101cf91906104b7565b60405180910390a1925050505b92915050565b60006040516101f09061038d565b604051809103906000f08015801561020c573d6000803e3d6000fd5b509050600063485cc95560e01b848460405160240161022c9291906104c7565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b0383818316178352505050509050600061027483868461032f60201b60201c565b9050600080516020615b938339815191528160405161029391906104f4565b60405180910390a15050505050565b60006040516102b09061039a565b604051809103906000f0801580156102cc573d6000803e3d6000fd5b506040805160048152602481019091526020810180516001600160e01b0390811663204a7f0760e21b17909152919250906000906103109084908690859061032f16565b9050600080516020615b938339815191528160405161010f9190610528565b600080848484604051610341906103a7565b61034d9392919061058e565b604051809103906000f080158015610369573d6000803e3d6000fd5b5095945050505050565b610e368061061183390190565b6107c68061144783390190565b611c0c80611c0d83390190565b6110f08061381983390190565b61128a8061490983390190565b60006001600160a01b0382166101dc565b6103ce816103b4565b81146103d957600080fd5b50565b80516101dc816103c5565b6000602082840312156103fc576103fc600080fd5b61040683836103dc565b9392505050565b610416816103b4565b82525050565b602081016101dc828461040d565b60198152602081017f5472616e73616374696f6e73506f737450726f636573736f7200000000000000815290505b60200190565b6040808252810161046e8161042a565b90506101dc602083018461040d565b80610416565b60408101610491828561047d565b610406602083018461040d565b6004815260208101634665657360e01b81529050610458565b6040808252810161046e8161049e565b60408101610491828561040d565b600a815260208101694d65737361676542757360b01b81529050610458565b6040808252810161046e816104d5565b600f8152602081016e5075626c696343616c6c6261636b7360881b81529050610458565b6040808252810161046e81610504565b60005b8381101561055357818101518382015260200161053b565b50506000910152565b6000610566825190565b80845260208401935061057d818560208601610538565b601f01601f19169290920192915050565b6060810161059c828661040d565b6105a9602083018561040d565b81810360408301526105bb818461055c565b95945050505050565b603f806105d26000396000f3fe6080604052600080fdfea2646970667358221220f167613ef4e3f7e46b3b1dd1274a3d54289e4151c0baa0cfd458f522d9f7d93264736f6c634300081c00336080604052348015600f57600080fd5b50610e178061001f6000396000f3fe608060405234801561001057600080fd5b50600436106100c95760003560e01c806364c55a9d11610081578063c4d66de81161005b578063c4d66de8146101c8578063d547741f146101db578063ee546fd8146101ee57600080fd5b806364c55a9d1461017657806391d1485414610189578063a217fddf146101c057600080fd5b80632f2ff15d116100b25780632f2ff15d1461012757806336568abe1461013c578063508a50f41461014f57600080fd5b806301ffc9a7146100ce578063248a9ca3146100f7575b600080fd5b6100e16100dc366004610835565b610265565b6040516100ee9190610865565b60405180910390f35b61011a610105366004610884565b60009081526020819052604090206001015490565b6040516100ee91906108a9565b61013a6101353660046108dc565b6102fe565b005b61013a61014a3660046108dc565b610329565b61011a7ff16bb8781ef1311f8fe06747bcbe481e695502acdcb0cb8c03aa03899e39a59881565b61013a610184366004610966565b61037a565b6100e16101973660046108dc565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b61011a600081565b61013a6101d63660046109ae565b6104ca565b61013a6101e93660046108dc565b61063a565b61013a6101fc3660046109ae565b6001805480820182556000919091527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf60180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b0000000000000000000000000000000000000000000000000000000014806102f857507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6000828152602081905260409020600101546103198161065f565b610323838361066c565b50505050565b6001600160a01b038116331461036b576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103758282610716565b505050565b60006103876001306109e3565b9050336001600160a01b038216146103ba5760405162461bcd60e51b81526004016103b190610a3a565b60405180910390fd5b60008290036103db5760405162461bcd60e51b81526004016103b190610a7c565b6040517f3357352afe45ddda257f56623a512152c527b6f11555ec2fb2fdbbe72ddece419061040b9084906108a9565b60405180910390a160005b6001548110156103235760006001828154811061043557610435610a8c565b6000918252602090912001546040517f9f9976af0000000000000000000000000000000000000000000000000000000081526001600160a01b0390911691508190639f9976af9061048c9088908890600401610d83565b600060405180830381600087803b1580156104a657600080fd5b505af11580156104ba573d6000803e3d6000fd5b5050505050806001019050610416565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff16159067ffffffffffffffff166000811580156105155750825b905060008267ffffffffffffffff1660011480156105325750303b155b905081158015610540575080155b15610577576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156105ab57845468ff00000000000000001916680100000000000000001785555b6105b660008761066c565b506105e17ff16bb8781ef1311f8fe06747bcbe481e695502acdcb0cb8c03aa03899e39a5988761066c565b50831561063257845468ff0000000000000000191685556040517fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29061062990600190610db8565b60405180910390a15b505050505050565b6000828152602081905260409020600101546106558161065f565b6103238383610716565b6106698133610799565b50565b6000828152602081815260408083206001600160a01b038516845290915281205460ff1661070e576000838152602081815260408083206001600160a01b03861684529091529020805460ff191660011790556106c63390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45060016102f8565b5060006102f8565b6000828152602081815260408083206001600160a01b038516845290915281205460ff161561070e576000838152602081815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45060016102f8565b6000828152602081815260408083206001600160a01b038516845290915290205460ff166107f75780826040517fe2517d3f0000000000000000000000000000000000000000000000000000000081526004016103b1929190610dc6565b5050565b7fffffffff0000000000000000000000000000000000000000000000000000000081165b811461066957600080fd5b80356102f8816107fb565b60006020828403121561084a5761084a600080fd5b610854838361082a565b9392505050565b8015155b82525050565b602081016102f8828461085b565b8061081f565b80356102f881610873565b60006020828403121561089957610899600080fd5b6108548383610879565b8061085f565b602081016102f882846108a3565b60006001600160a01b0382166102f8565b61081f816108b7565b80356102f8816108c8565b600080604083850312156108f2576108f2600080fd5b6108fc8484610879565b915061090b84602085016108d1565b90509250929050565b60008083601f84011261092957610929600080fd5b50813567ffffffffffffffff81111561094457610944600080fd5b60208301915083602082028301111561095f5761095f600080fd5b9250929050565b6000806020838503121561097c5761097c600080fd5b823567ffffffffffffffff81111561099657610996600080fd5b6109a285828601610914565b92509250509250929050565b6000602082840312156109c3576109c3600080fd5b61085483836108d1565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b039182169190811690828203908111156102f8576102f86109cd565b60088152602081017f4e6f742073656c66000000000000000000000000000000000000000000000000815290505b60200190565b602080825281016102f881610a06565b601a8152602081017f4e6f207472616e73616374696f6e7320746f20636f6e7665727400000000000081529050610a34565b602080825281016102f881610a4a565b634e487b7160e01b600052603260045260246000fd5b60ff811661081f565b80356102f881610aa2565b5060006102f86020830183610aab565b60ff811661085f565b5060006102f86020830183610879565b5060006102f860208301836108d1565b61085f816108b7565b6000808335601e1936859003018112610b1357610b13600080fd5b830160208101925035905067ffffffffffffffff811115610b3657610b36600080fd5b3681900382131561095f5761095f600080fd5b82818337506000910152565b818352602083019250610b69828483610b49565b50601f01601f19160190565b80151561081f565b80356102f881610b75565b5060006102f86020830183610b7d565b67ffffffffffffffff811661081f565b80356102f881610b98565b5060006102f86020830183610ba8565b67ffffffffffffffff811661085f565b60006101408301610be48380610ab6565b610bee8582610ac6565b50610bfc6020840184610acf565b610c0960208601826108a3565b50610c176040840184610acf565b610c2460408601826108a3565b50610c326060840184610acf565b610c3f60608601826108a3565b50610c4d6080840184610adf565b610c5a6080860182610aef565b50610c6860a0840184610acf565b610c7560a08601826108a3565b50610c8360c0840184610af8565b85830360c0870152610c96838284610b55565b92505050610ca760e0840184610adf565b610cb460e0860182610aef565b50610cc3610100840184610b88565b610cd161010086018261085b565b50610ce0610120840184610bb3565b610cee610120860182610bc3565b509392505050565b60006108548383610bd3565b6000823561013e1936849003018112610d1d57610d1d600080fd5b90910192915050565b818352602083019250600083602084028101838060005b87811015610d76578484038952610d548284610d02565b610d5e8582610cf6565b94505060208201602099909901989150600101610d3d565b5091979650505050505050565b60208082528101610d95818486610d26565b949350505050565b600067ffffffffffffffff82166102f8565b61085f81610d9d565b602081016102f88284610daf565b60408101610dd48285610aef565b61085460208301846108a356fea2646970667358221220c3cf3852209ad93e14f2c95a1ee81360a00fe52f5b9883259bae9ca4c33a0aa064736f6c634300081c00336080604052348015600f57600080fd5b506016601a565b60ca565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161560695760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b039081161460c75780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b6106ed806100d96000396000f3fe60806040526004361061007f5760003560e01c8063afe997ea1161004e578063afe997ea1461012c578063da35a26f14610141578063f1d44d5114610161578063f2fde38b1461018157600080fd5b806323aa2a9d1461008b578063715018a6146100ad5780638da5cb5b146100c25780639003adfe1461011057600080fd5b3661008657005b600080fd5b34801561009757600080fd5b506100ab6100a6366004610575565b6101a1565b005b3480156100b957600080fd5b506100ab6101ae565b3480156100ce57600080fd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031660405161010791906105bb565b60405180910390f35b34801561011c57600080fd5b50475b60405161010791906105cf565b34801561013857600080fd5b506100ab6101c2565b34801561014d57600080fd5b506100ab61015c3660046105f1565b610225565b34801561016d57600080fd5b5061011f61017c366004610575565b61036d565b34801561018d57600080fd5b506100ab61019c366004610629565b610383565b6101a96103e0565b600055565b6101b66103e0565b6101c06000610454565b565b6101ca6103e0565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015610222573d6000803e3d6000fd5b50565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff16159067ffffffffffffffff166000811580156102705750825b905060008267ffffffffffffffff16600114801561028d5750303b155b90508115801561029b575080155b156102d2576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561030657845468ff00000000000000001916680100000000000000001785555b61030f866104dd565b6000879055831561036457845468ff0000000000000000191685556040517fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29061035b90600190610663565b60405180910390a15b50505050505050565b60008160005461037d91906106a0565b92915050565b61038b6103e0565b6001600160a01b0381166103d75760006040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016103ce91906105bb565b60405180910390fd5b61022281610454565b336104127f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146101c057336040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016103ce91906105bb565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080547fffffffffffffffffffffffff000000000000000000000000000000000000000081166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b6104e56104ee565b61022281610555565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005468010000000000000000900460ff166101c0576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61038b6104ee565b805b811461022257600080fd5b803561037d8161055d565b60006020828403121561058a5761058a600080fd5b610594838361056a565b9392505050565b60006001600160a01b03821661037d565b6105b58161059b565b82525050565b6020810161037d82846105ac565b806105b5565b6020810161037d82846105c9565b61055f8161059b565b803561037d816105dd565b6000806040838503121561060757610607600080fd5b610611848461056a565b915061062084602085016105e6565b90509250929050565b60006020828403121561063e5761063e600080fd5b61059483836105e6565b600067ffffffffffffffff821661037d565b6105b581610648565b6020810161037d828461065a565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b818102811582820484141761037d5761037d61067156fea26469706673582212203b15352e8f587de7fab730ebe897ce1d19b5fb0f5a07f4e8af1cc73861e46f5864736f6c634300081c0033608060405234801561001057600080fd5b5061001a33610027565b610022610098565b61014a565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100e85760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101475780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b611ab3806101596000396000f3fe6080604052600436106100c05760003560e01c8063715018a61161007457806399a3ad211161004e57806399a3ad2114610285578063b1454caa146102a5578063f2fde38b146102c557610134565b8063715018a61461020b5780638da5cb5b146102205780639730886d1461026557610134565b8063346633fb116100a5578063346633fb146101b857806336d2da90146101cb578063485cc955146101eb57610134565b80630fcfbd111461015557806333a88c721461018b57610134565b36610134576040517f346633fb000000000000000000000000000000000000000000000000000000008152309063346633fb9034906101059033908390600401610d37565b6000604051808303818588803b15801561011e57600080fd5b505af1158015610132573d6000803e3d6000fd5b005b60405162461bcd60e51b815260040161014c90610d86565b60405180910390fd5b34801561016157600080fd5b50610175610170366004610db1565b6102e5565b6040516101829190610dec565b60405180910390f35b34801561019757600080fd5b506101ab6101a6366004610db1565b610344565b6040516101829190610e02565b6101326101c6366004610e40565b610396565b3480156101d757600080fd5b506101326101e6366004610e78565b6104e5565b3480156101f757600080fd5b50610132610206366004610e97565b610564565b34801561021757600080fd5b506101326106cf565b34801561022c57600080fd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03166040516101829190610ec6565b34801561027157600080fd5b50610132610280366004610ed4565b6106e3565b34801561029157600080fd5b506101326102a0366004610e40565b61084f565b6102b86102b3366004610f9d565b6108cf565b604051610182919061102a565b3480156102d157600080fd5b506101326102e0366004610e78565b6109d7565b600080826040516020016102f991906111d7565b60408051601f1981840301815291815281516020928301206000818152928390529120549091508061033d5760405162461bcd60e51b815260040161014c90611242565b9392505050565b6000808260405160200161035891906111d7565b60408051601f198184030181529181528151602092830120600081815292839052912054909150801580159061038e5750428111155b949350505050565b6000341180156103a557508034145b6103c15760405162461bcd60e51b815260040161014c906112aa565b60035434906001600160a01b0316156104855760006103de610a2e565b9050803410156104005760405162461bcd60e51b815260040161014c906112ea565b61040a8134611310565b6003546040519193506000916001600160a01b039091169083908381818185875af1925050503d806000811461045c576040519150601f19603f3d011682016040523d82523d6000602084013e610461565b606091505b50509050806104825760405162461bcd60e51b815260040161014c9061137b565b50505b600061049033610abf565b9050836001600160a01b0316336001600160a01b03167f50c536ac33a920f00755865b831d17bf4cff0b2e0345f65b16d52bfc004068b684846040516104d792919061138b565b60405180910390a350505050565b6104ed610b1d565b6000816001600160a01b03164760405160006040518083038185875af1925050503d806000811461053a576040519150601f19603f3d011682016040523d82523d6000602084013e61053f565b606091505b50509050806105605760405162461bcd60e51b815260040161014c906113d8565b5050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff16159067ffffffffffffffff166000811580156105af5750825b905060008267ffffffffffffffff1660011480156105cc5750303b155b9050811580156105da575080155b15610611576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561064557845468ff00000000000000001916680100000000000000001785555b61064e87610b91565b6003805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03881617905583156106c657845468ff0000000000000000191685556040517fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2906106bd9060019061140c565b60405180910390a15b50505050505050565b6106d7610b1d565b6106e16000610ba2565b565b60006106f060013061141a565b90506107237f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316336001600160a01b0316148061074a5750336001600160a01b038216145b6107665760405162461bcd60e51b815260040161014c9061146f565b6000610772834261147f565b905060008460405160200161078791906111d7565b60408051601f198184030181529181528151602092830120600081815292839052912054909150156107cb5760405162461bcd60e51b815260040161014c906114ea565b6000818152602081815260408220849055600191906107ec90880188610e78565b6001600160a01b03168152602081019190915260400160009081209061081860808801606089016114fa565b63ffffffff168152602080820192909252604001600090812080546001810182559082529190208691600402016106c68282611943565b610857610b1d565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146108a4576040519150601f19603f3d011682016040523d82523d6000602084013e6108a9565b606091505b50509050806108ca5760405162461bcd60e51b815260040161014c906113d8565b505050565b6003546000906001600160a01b031615610980576108ec83610c20565b34101561090b5760405162461bcd60e51b815260040161014c906119a5565b6003546040516000916001600160a01b03169034908381818185875af1925050503d8060008114610958576040519150601f19603f3d011682016040523d82523d6000602084013e61095d565b606091505b505090508061097e5760405162461bcd60e51b815260040161014c9061137b565b505b61098933610abf565b90507fb93c37389233beb85a3a726c3f15c2d15533ee74cb602f20f490dfffef775937338288888888886040516109c697969594939291906119b5565b60405180910390a195945050505050565b6109df610b1d565b6001600160a01b038116610a225760006040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161014c9190610ec6565b610a2b81610ba2565b50565b6003546040517ff1d44d510000000000000000000000000000000000000000000000000000000081526000916001600160a01b03169063f1d44d5190610a7990602090600401611a21565b602060405180830381865afa158015610a96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aba9190611a3a565b905090565b6001600160a01b0381166000908152600260205260408120805467ffffffffffffffff169160019190610af28385611a59565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550919050565b33610b4f7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146106e157336040517f118cdaa700000000000000000000000000000000000000000000000000000000815260040161014c9190610ec6565b610b99610ca2565b610a2b81610d09565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300805473ffffffffffffffffffffffffffffffffffffffff1981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b6003546000906001600160a01b031663f1d44d51610c3f60118561147f565b6040518263ffffffff1660e01b8152600401610c5b9190610dec565b602060405180830381865afa158015610c78573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c9c9190611a3a565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005468010000000000000000900460ff166106e1576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109df610ca2565b60006001600160a01b038216610c9c565b610d2b81610d11565b82525050565b80610d2b565b60408101610d458285610d22565b61033d6020830184610d31565b600b8152602081017f756e737570706f72746564000000000000000000000000000000000000000000815290505b60200190565b60208082528101610c9c81610d52565b600060c08284031215610dab57610dab600080fd5b50919050565b600060208284031215610dc657610dc6600080fd5b813567ffffffffffffffff811115610de057610de0600080fd5b61038e84828501610d96565b60208101610c9c8284610d31565b801515610d2b565b60208101610c9c8284610dfa565b610e1981610d11565b8114610a2b57600080fd5b8035610c9c81610e10565b80610e19565b8035610c9c81610e2f565b60008060408385031215610e5657610e56600080fd5b610e608484610e24565b9150610e6f8460208501610e35565b90509250929050565b600060208284031215610e8d57610e8d600080fd5b61033d8383610e24565b60008060408385031215610ead57610ead600080fd5b610eb78484610e24565b9150610e6f8460208501610e24565b60208101610c9c8284610d22565b60008060408385031215610eea57610eea600080fd5b823567ffffffffffffffff811115610f0457610f04600080fd5b610f1085828601610d96565b925050610e6f8460208501610e35565b63ffffffff8116610e19565b8035610c9c81610f20565b60008083601f840112610f4c57610f4c600080fd5b50813567ffffffffffffffff811115610f6757610f67600080fd5b602083019150836001820283011115610f8257610f82600080fd5b9250929050565b60ff8116610e19565b8035610c9c81610f89565b600080600080600060808688031215610fb857610fb8600080fd5b610fc28787610f2c565b9450610fd18760208801610f2c565b9350604086013567ffffffffffffffff811115610ff057610ff0600080fd5b610ffc88828901610f37565b935093505061100e8760608801610f92565b90509295509295909350565b67ffffffffffffffff8116610d2b565b60208101610c9c828461101a565b506000610c9c6020830183610e24565b67ffffffffffffffff8116610e19565b8035610c9c81611048565b506000610c9c6020830183611058565b506000610c9c6020830183610f2c565b63ffffffff8116610d2b565b6000808335601e19368590030181126110aa576110aa600080fd5b830160208101925035905067ffffffffffffffff8111156110cd576110cd600080fd5b36819003821315610f8257610f82600080fd5b82818337506000910152565b8183526020830192506111008284836110e0565b50601f01601f19160190565b506000610c9c6020830183610f92565b60ff8116610d2b565b600060c083016111358380611038565b61113f8582610d22565b5061114d6020840184611063565b61115a602086018261101a565b506111686040840184611073565b6111756040860182611083565b506111836060840184611073565b6111906060860182611083565b5061119e608084018461108f565b85830360808701526111b18382846110ec565b925050506111c260a084018461110c565b6111cf60a086018261111c565b509392505050565b6020808252810161033d8184611125565b60218152602081017f54686973206d65737361676520776173206e65766572207375626d697474656481527f2e00000000000000000000000000000000000000000000000000000000000000602082015290505b60400190565b60208082528101610c9c816111e8565b60308152602081017f417474656d7074696e6720746f2073656e642076616c756520776974686f757481527f2070726f766964696e67204574686572000000000000000000000000000000006020820152905061123c565b60208082528101610c9c81611252565b60208082527f496e73756666696369656e742066756e647320746f2073656e642076616c75659101908152610d80565b60208082528101610c9c816112ba565b634e487b7160e01b600052601160045260246000fd5b81810381811115610c9c57610c9c6112fa565b60248152602081017f4661696c656420746f2073656e64206665657320746f206665657320636f6e7481527f72616374000000000000000000000000000000000000000000000000000000006020820152905061123c565b60208082528101610c9c81611323565b604081016113998285610d31565b61033d602083018461101a565b60148152602081017f6661696c65642073656e64696e672076616c756500000000000000000000000081529050610d80565b60208082528101610c9c816113a6565b6000610c9c826113f6565b90565b67ffffffffffffffff1690565b610d2b816113e8565b60208101610c9c8284611403565b6001600160a01b03918216919081169082820390811115610c9c57610c9c6112fa565b60118152602081017f4e6f74206f776e6572206f722073656c6600000000000000000000000000000081529050610d80565b60208082528101610c9c8161143d565b80820180821115610c9c57610c9c6112fa565b60218152602081017f4d657373616765207375626d6974746564206d6f7265207468616e206f6e636581527f21000000000000000000000000000000000000000000000000000000000000006020820152905061123c565b60208082528101610c9c81611492565b60006020828403121561150f5761150f600080fd5b61033d8383610f2c565b60008135610c9c81610e10565b60006001600160a01b03835b81169019929092169190911792915050565b6000610c9c82610d11565b6000610c9c82611544565b6115638261154f565b61156e818354611526565b8255505050565b60008135610c9c81611048565b60007bffffffffffffffff00000000000000000000000000000000000000006115328460a01b90565b6000610c9c67ffffffffffffffff83166113f6565b6115c9826115ab565b61156e818354611582565b60008135610c9c81610f20565b60007fffffffff000000000000000000000000000000000000000000000000000000006115328460e01b90565b600063ffffffff8216610c9c565b6116258261160e565b61156e8183546115e1565b600063ffffffff83611532565b6116468261160e565b61156e818354611630565b6000808335601e193685900301811261166c5761166c600080fd5b8301915050803567ffffffffffffffff81111561168b5761168b600080fd5b602082019150600181023603821315610f8257610f82600080fd5b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052602260045260246000fd5b6002810460018216806116e657607f821691505b602082108103610dab57610dab6116bc565b6000610c9c6113f38381565b61170d836116f8565b815460001960089490940293841b1916921b91909117905550565b60006108ca818484611704565b8181101561056057611748600082611728565b600101611735565b601f8211156108ca576000818152602090206020601f850104810160208510156117775750805b6117896020601f860104830182611735565b5050505050565b8267ffffffffffffffff8111156117a9576117a96116a6565b6117b382546116d2565b6117be828285611750565b506000601f8211600181146117f357600083156117db5750848201355b600019600885021c198116600285021785555061184d565b600084815260209020601f19841690835b828110156118245787850135825560209485019460019092019101611804565b5084821015611841576000196008601f8716021c19878501351681555b50506001600284020184555b505050505050565b6108ca838383611790565b60008135610c9c81610f89565b600060ff8216610c9c565b6118818261186d565b815460ff191660ff82161761156e565b80828061189d81611519565b90506118a9818461155a565b505060208301806118b982611575565b90506118c581846115c0565b505060408301806118d5826115d4565b90506118e1818461161c565b50505060608201806118f2826115d4565b9050611901816001850161163d565b50506119106080830183611651565b61191e818360028601611855565b505060a082018061192e82611860565b905061193d8160038501611878565b50505050565b6105608282611891565b60258152602081017f496e73756666696369656e742066756e647320746f207075626c697368206d6581527f73736167650000000000000000000000000000000000000000000000000000006020820152905061123c565b60208082528101610c9c8161194d565b60c081016119c3828a610d22565b6119d0602083018961101a565b6119dd6040830188611083565b6119ea6060830187611083565b81810360808301526119fd8185876110ec565b9050611a0c60a083018461111c565b98975050505050505050565b610d2b816116f8565b60208101610c9c8284611a18565b8051610c9c81610e2f565b600060208284031215611a4f57611a4f600080fd5b61033d8383611a2f565b67ffffffffffffffff918216919081169082820190811115610c9c57610c9c6112fa56fea26469706673582212201f500c1ed66462b882c75dccce6728c6e38010a1e90ea1306d187fe1d8d0d83b64736f6c634300081c00336080604052348015600f57600080fd5b506016601a565b60ca565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161560695760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b039081161460c75780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b611017806100d96000396000f3fe6080604052600436106100595760003560e01c806382fbdc9c1161004357806382fbdc9c146100ae578063929d34e9146100ce578063a67e1760146100ee57600080fd5b8062e0d3b51461005e5780638129fc1c14610097575b600080fd5b34801561006a57600080fd5b5061007e610079366004610a7a565b610103565b60405161008e9493929190610b15565b60405180910390f35b3480156100a357600080fd5b506100ac6101be565b005b6100c16100bc366004610bac565b610300565b60405161008e9190610bf4565b3480156100da57600080fd5b506100ac6100e9366004610a7a565b610368565b3480156100fa57600080fd5b506100ac61050d565b600060208190529081526040902080546001820180546001600160a01b03909216929161012f90610c18565b80601f016020809104026020016040519081016040528092919081815260200182805461015b90610c18565b80156101a85780601f1061017d576101008083540402835291602001916101a8565b820191906000526020600020905b81548152906001019060200180831161018b57829003601f168201915b5050505050908060020154908060030154905084565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff16159067ffffffffffffffff166000811580156102095750825b905060008267ffffffffffffffff1660011480156102265750303b155b905081158015610234575080155b1561026b576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561029f57845468ff00000000000000001916680100000000000000001785555b6000600181905560025583156102f957845468ff0000000000000000191685556040517fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2906102f090600190610c68565b60405180910390a15b5050505050565b600080341161032a5760405162461bcd60e51b815260040161032190610caa565b60405180910390fd5b6152086103363461055f565b116103535760405162461bcd60e51b815260040161032190610cba565b61035f3384843461056b565b90505b92915050565b60008181526020818152604080832081516080810190925280546001600160a01b0316825260018101805492939192918401916103a490610c18565b80601f01602080910402602001604051908101604052809291908181526020018280546103d090610c18565b801561041d5780601f106103f25761010080835404028352916020019161041d565b820191906000526020600020905b81548152906001019060200180831161040057829003601f168201915b50505050508152602001600282015481526020016003820154815250509050600081600001516001600160a01b0316826020015160405161045e9190610d3d565b6000604051808303816000865af19150503d806000811461049b576040519150601f19603f3d011682016040523d82523d6000602084013e6104a0565b606091505b50509050806104c15760405162461bcd60e51b815260040161032190610d79565b6000838152602081905260408120805473ffffffffffffffffffffffffffffffffffffffff19168155906104f86001830182610a25565b50600060028201819055600390910155505050565b600061051a600130610d9f565b9050336001600160a01b038216146105445760405162461bcd60e51b815260040161032190610df4565b6002546001541461055c57610557610654565b610544565b50565b60006103624883610e1a565b60006040518060800160405280866001600160a01b0316815260200185858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052509385525050506020820185905248604090920191909152600180548291826105e083610e2e565b9091555081526020808201929092526040016000208251815473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b039091161781559082015160018201906106319082610ef7565b506040820151600282015560609091015160039091015550600154949350505050565b6002546001540361066157565b60008061066c61077f565b91509150600082606001519050600081846040015161068b9190610e1a565b905060005a9050600085600001516001600160a01b03168387602001516040516106b59190610d3d565b60006040518083038160008787f1925050503d80600081146106f3576040519150601f19603f3d011682016040523d82523d6000602084013e6106f8565b606091505b5050905060005a9050600061070d8285610fb7565b905060008186111561073157866107248388610fb7565b61072e9190610fca565b90505b6000818a604001516107439190610fb7565b8a51909150851561075657610756610897565b61075e6108e3565b61076983828c6108fa565b610772826109da565b5050505050505050505050565b6107b3604051806080016040528060006001600160a01b031681526020016060815260200160008152602001600081525090565b60025460008181526020818152604080832081516080810190925280546001600160a01b03168252600181018054949591949193859290840191906107f790610c18565b80601f016020809104026020016040519081016040528092919081815260200182805461082390610c18565b80156108705780601f1061084557610100808354040283529160200191610870565b820191906000526020600020905b81548152906001019060200180831161085357829003601f168201915b50505050508152602001600282015481526020016003820154815250509150915091509091565b6002546000908152602081905260408120805473ffffffffffffffffffffffffffffffffffffffff19168155906108d16001830182610a25565b50600060028201819055600390910155565b600280549060006108f383610e2e565b9190505550565b6000826001600160a01b0316846188b8908460405160240161091c9190610bf4565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f5ea39558000000000000000000000000000000000000000000000000000000001790525161097f9190610d3d565b600060405180830381858888f193505050503d80600081146109bd576040519150601f19603f3d011682016040523d82523d6000602084013e6109c2565b606091505b50509050806109d4576109d4846109da565b50505050565b806000036109e55750565b60405141908290600081818185875af1925050503d80600081146109d4576040519150601f19603f3d011682016040523d82523d6000602084013e6109d4565b508054610a3190610c18565b6000825580601f10610a41575050565b601f01602090049060005260206000209081019061055c91905b80821115610a6f5760008155600101610a5b565b5090565b8035610362565b600060208284031215610a8f57610a8f600080fd5b61035f8383610a73565b60006001600160a01b038216610362565b610ab381610a99565b82525050565b60005b83811015610ad4578181015183820152602001610abc565b50506000910152565b6000610ae7825190565b808452602084019350610afe818560208601610ab9565b601f01601f19169290920192915050565b80610ab3565b60808101610b238287610aaa565b8181036020830152610b358186610add565b9050610b446040830185610b0f565b610b516060830184610b0f565b95945050505050565b60008083601f840112610b6f57610b6f600080fd5b50813567ffffffffffffffff811115610b8a57610b8a600080fd5b602083019150836001820283011115610ba557610ba5600080fd5b9250929050565b60008060208385031215610bc257610bc2600080fd5b823567ffffffffffffffff811115610bdc57610bdc600080fd5b610be885828601610b5a565b92509250509250929050565b602081016103628284610b0f565b634e487b7160e01b600052602260045260246000fd5b600281046001821680610c2c57607f821691505b602082108103610c3e57610c3e610c02565b50919050565b600061036282610c52565b90565b67ffffffffffffffff1690565b610ab381610c44565b602081016103628284610c5f565b600d8152602081017f4e6f2076616c75652073656e7400000000000000000000000000000000000000815290505b60200190565b6020808252810161036281610c76565b6020808252810161036281602481527f47617320746f6f206c6f7720636f6d706172656420746f20636f7374206f662060208201527f63616c6c00000000000000000000000000000000000000000000000000000000604082015260600190565b6000610d25825190565b610d33818560208601610ab9565b9290920192915050565b6103628183610d1b565b60198152602081017f43616c6c6261636b20657865637574696f6e206661696c65640000000000000081529050610ca4565b6020808252810161036281610d47565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b0391821691908116908282039081111561036257610362610d89565b60088152602081017f4e6f742073656c6600000000000000000000000000000000000000000000000081529050610ca4565b6020808252810161036281610dc2565b634e487b7160e01b600052601260045260246000fd5b600082610e2957610e29610e04565b500490565b600060018201610e4057610e40610d89565b5060010190565b634e487b7160e01b600052604160045260246000fd5b6000610362610c4f8381565b610e7283610e5d565b815460001960089490940293841b1916921b91909117905550565b6000610e9a818484610e69565b505050565b81811015610eba57610eb2600082610e8d565b600101610e9f565b5050565b601f821115610e9a576000818152602090206020601f85010481016020851015610ee55750805b6102f96020601f860104830182610e9f565b815167ffffffffffffffff811115610f1157610f11610e47565b610f1b8254610c18565b610f26828285610ebe565b506020601f821160018114610f5b5760008315610f435750848201515b600019600885021c19811660028502178555506102f9565b600084815260208120601f198516915b82811015610f8b5787850151825560209485019460019092019101610f6b565b5084821015610fa85783870151600019601f87166008021c191681555b50505050600202600101905550565b8181038181111561036257610362610d89565b818102811582820484141761036257610362610d8956fea264697066735822122008c491fc746109bf6d844f1a3820d634711f140a52c8d4923fc72a652b9ad03464736f6c634300081c003360a060405260405161128a38038061128a8339810160408190526100229161046a565b828161002e8282610089565b50508160405161003d9061031d565b61004791906104df565b604051809103906000f080158015610063573d6000803e3d6000fd5b506001600160a01b031660805261008161007c60805190565b6100e8565b505050610534565b6100928261014b565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156100dc576100d782826101c5565b505050565b6100e461023e565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61012860008051602061126a833981519152546001600160a01b031690565b826040516101379291906104ed565b60405180910390a16101488161025f565b50565b806001600160a01b03163b6000036101815780604051634c9c8ce360e01b815260040161017891906104df565b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060600080846001600160a01b0316846040516101e2919061052a565b600060405180830381855af49150503d806000811461021d576040519150601f19603f3d011682016040523d82523d6000602084013e610222565b606091505b50909250905061023385838361029e565b925050505b92915050565b341561025d5760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b038116610289576000604051633173bdd160e11b815260040161017891906104df565b8060008051602061126a8339815191526101a4565b6060826102b3576102ae826102f4565b6102ed565b81511580156102ca57506001600160a01b0384163b155b156102ea5783604051639996b31560e01b815260040161017891906104df565b50805b9392505050565b8051156103045780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b6106eb80610b7f83390190565b60006001600160a01b038216610238565b6103448161032a565b811461014857600080fd5b80516102388161033b565b634e487b7160e01b600052604160045260246000fd5b601f19601f83011681016001600160401b03811182821017156103955761039561035a565b6040525050565b60006103a760405190565b90506103b38282610370565b919050565b60006001600160401b038211156103d1576103d161035a565b601f19601f83011660200192915050565b60005b838110156103fd5781810151838201526020016103e5565b50506000910152565b6000610419610414846103b8565b61039c565b905082815283838301111561043057610430600080fd5b6102ed8360208301846103e2565b600082601f83011261045257610452600080fd5b8151610462848260208601610406565b949350505050565b60008060006060848603121561048257610482600080fd5b61048c858561034f565b925061049b856020860161034f565b60408501519092506001600160401b038111156104ba576104ba600080fd5b6104c68682870161043e565b9150509250925092565b6104d98161032a565b82525050565b6020810161023882846104d0565b604081016104fb82856104d0565b6102ed60208301846104d0565b6000610512825190565b6105208185602086016103e2565b9290920192915050565b6102388183610508565b60805161063161054e6000396000601001526106316000f3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036100c5576000357fffffffff00000000000000000000000000000000000000000000000000000000167f4f1ef28600000000000000000000000000000000000000000000000000000000146100bb576040517fd2b576ec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6100c36100cd565b565b6100c36100fc565b6000806100dd36600481846103cf565b8101906100ea9190610539565b915091506100f8828261010c565b5050565b6100c3610107610167565b61019f565b610115826101c3565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561015f5761015a828261026b565b505050565b6100f86102e3565b600061019a7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b3660008037600080366000845af43d6000803e8080156101be573d6000f35b3d6000fd5b806001600160a01b03163b60000361021257806040517f4c9c8ce3000000000000000000000000000000000000000000000000000000008152600401610209919061059d565b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6060600080846001600160a01b03168460405161028891906105f1565b600060405180830381855af49150503d80600081146102c3576040519150601f19603f3d011682016040523d82523d6000602084013e6102c8565b606091505b50915091506102d885838361031b565b925050505b92915050565b34156100c3576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060826103305761032b8261038a565b610383565b815115801561034757506001600160a01b0384163b155b1561038057836040517f9996b315000000000000000000000000000000000000000000000000000000008152600401610209919061059d565b50805b9392505050565b80511561039a5780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b600080858511156103e2576103e2600080fd5b838611156103f2576103f2600080fd5b5050820193919092039150565b60006001600160a01b0382166102dd565b610419816103ff565b81146103cc57600080fd5b80356102dd81610410565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b601f19601f830116810181811067ffffffffffffffff821117156104845761048461042f565b6040525050565b600061049660405190565b90506104a2828261045e565b919050565b600067ffffffffffffffff8211156104c1576104c161042f565b601f19601f83011660200192915050565b82818337506000910152565b60006104f16104ec846104a7565b61048b565b905082815283838301111561050857610508600080fd5b6103838360208301846104d2565b600082601f83011261052a5761052a600080fd5b610383838335602085016104de565b6000806040838503121561054f5761054f600080fd5b6105598484610424565b9150602083013567ffffffffffffffff81111561057857610578600080fd5b61058485828601610516565b9150509250929050565b610597816103ff565b82525050565b602081016102dd828461058e565b60005b838110156105c65781810151838201526020016105ae565b50506000910152565b60006105d9825190565b6105e78185602086016105ab565b9290920192915050565b6102dd81836105cf56fea264697066735822122010d1880687d5a44f0a558c272f84fabbd9bf65d697170ee3f6681c2467feb26164736f6c634300081c0033608060405234801561001057600080fd5b506040516106eb3803806106eb83398101604081905261002f916100f8565b806001600160a01b038116610063576000604051631e4fbdf760e01b815260040161005a919061012d565b60405180910390fd5b61006c81610073565b505061013b565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006001600160a01b0382165b92915050565b6100df816100c3565b81146100ea57600080fd5b50565b80516100d0816100d6565b60006020828403121561010d5761010d600080fd5b61011783836100ed565b9392505050565b610127816100c3565b82525050565b602081016100d0828461011e565b6105a18061014a6000396000f3fe60806040526004361061005a5760003560e01c80639623609d116100435780639623609d146100a5578063ad3cb1cc146100b8578063f2fde38b1461010e57600080fd5b8063715018a61461005f5780638da5cb5b14610076575b600080fd5b34801561006b57600080fd5b5061007461012e565b005b34801561008257600080fd5b506000546001600160a01b031660405161009c91906102fa565b60405180910390f35b6100746100b3366004610457565b610142565b3480156100c457600080fd5b506101016040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b60405161009c9190610513565b34801561011a57600080fd5b50610074610129366004610524565b6101ca565b61013661022a565b6101406000610270565b565b61014a61022a565b6040517f4f1ef2860000000000000000000000000000000000000000000000000000000081526001600160a01b03841690634f1ef2869034906101939086908690600401610543565b6000604051808303818588803b1580156101ac57600080fd5b505af11580156101c0573d6000803e3d6000fd5b5050505050505050565b6101d261022a565b6001600160a01b03811661021e5760006040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161021591906102fa565b60405180910390fd5b61022781610270565b50565b6000546001600160a01b0316331461014057336040517f118cdaa700000000000000000000000000000000000000000000000000000000815260040161021591906102fa565b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006001600160a01b0382165b92915050565b6102f4816102d8565b82525050565b602081016102e582846102eb565b60006102e5826102d8565b61031c81610308565b811461022757600080fd5b80356102e581610313565b61031c816102d8565b80356102e581610332565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b601f19601f830116810181811067ffffffffffffffff8211171561039b5761039b610346565b6040525050565b60006103ad60405190565b90506103b98282610375565b919050565b600067ffffffffffffffff8211156103d8576103d8610346565b601f19601f83011660200192915050565b82818337506000910152565b6000610408610403846103be565b6103a2565b905082815283838301111561041f5761041f600080fd5b61042d8360208301846103e9565b9392505050565b600082601f83011261044857610448600080fd5b61042d838335602085016103f5565b60008060006060848603121561046f5761046f600080fd5b6104798585610327565b9250610488856020860161033b565b9150604084013567ffffffffffffffff8111156104a7576104a7600080fd5b6104b386828701610434565b9150509250925092565b60005b838110156104d85781810151838201526020016104c0565b50506000910152565b60006104eb825190565b8084526020840193506105028185602086016104bd565b601f01601f19169290920192915050565b6020808252810161042d81846104e1565b60006020828403121561053957610539600080fd5b61042d838361033b565b6040810161055182856102eb565b818103602083015261056381846104e1565b94935050505056fea264697066735822122096c3a562b6861bd964d97d99d95931f7343ac03c64bc04aeab6287f6e42e45eb64736f6c634300081c0033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103bd64e14789a915ea657e42f2dbf0b973227708fa64b58766287637985d1ade69", } // SystemDeployerABI is the input ABI used to generate the binding from. diff --git a/contracts/src/system/PublicCallbacks.sol b/contracts/src/system/PublicCallbacks.sol index 74edefe59f..d8f90d59a6 100644 --- a/contracts/src/system/PublicCallbacks.sol +++ b/contracts/src/system/PublicCallbacks.sol @@ -49,6 +49,9 @@ contract PublicCallbacks is Initializable { function popCurrentCallback() internal { delete callbacks[lastUnusedCallbackId]; + } + + function moveToNextCallback() internal { lastUnusedCallbackId++; } @@ -106,13 +109,13 @@ contract PublicCallbacks is Initializable { if (prepaidGas > gasUsed) { gasRefundValue = (prepaidGas - gasUsed) * baseFee; } - uint256 paymentToCoinbase = callback.value - gasRefundValue; address target = callback.target; if (success) { popCurrentCallback(); } + moveToNextCallback(); internalRefund(gasRefundValue, target, callbackId); payForCallback(paymentToCoinbase); @@ -124,11 +127,18 @@ contract PublicCallbacks is Initializable { // slight buffer. (bool success, ) = to.call{value: gasRefund, gas: 35000}(abi.encodeWithSignature("handleRefund(uint256)", callbackId)); if (!success) { - block.coinbase.transfer(gasRefund); // if they dont accept the refund, we gift it to coinbase. + // if they dont accept the refund, we gift it to coinbase. + payForCallback(gasRefund); } } function payForCallback(uint256 gasPayment) internal { - block.coinbase.transfer(gasPayment); + if (gasPayment == 0) { + return; + } + // We don't care about success, should always happen. + // If not, contract is upgradable and we can recover. + // solc-ignore-next-line unused-call-retval + block.coinbase.call{value: gasPayment}(""); } } \ No newline at end of file diff --git a/contracts/src/testing/PublicCallBacksTest.sol b/contracts/src/testing/PublicCallBacksTest.sol index 64739dc7db..1704c8010c 100644 --- a/contracts/src/testing/PublicCallBacksTest.sol +++ b/contracts/src/testing/PublicCallBacksTest.sol @@ -9,10 +9,12 @@ contract PublicCallbacksTest { constructor(address _callbacks) payable { callbacks = IPublicCallbacks(_callbacks); lastCallSuccess = false; + allCallbacksRan = false; testRegisterCallback(); } bool lastCallSuccess = false; + bool allCallbacksRan = false; // This function will be called back by the system function handleCallback(uint256 expectedGas) external { @@ -22,21 +24,34 @@ contract PublicCallbacksTest { } // Handle the callback here // For testing we'll just allow it to succeed - + } + + function handleCallbackFail() external { + lastCallSuccess = true; + require(false, "This is a test failure"); + } + + function handleAllCallbacksRan() external { + allCallbacksRan = true; } // Test function that registers a callback function testRegisterCallback() internal { // Encode the callback data - calling handleCallback() // Calculate expected gas based on value sent - uint256 expectedGas = msg.value / block.basefee; + uint256 expectedGas = (msg.value/3) / block.basefee; bytes memory callbackData = abi.encodeWithSelector(this.handleCallback.selector, expectedGas); + bytes memory callbackDataFail = abi.encodeWithSelector(this.handleCallbackFail.selector); + bytes memory callbackDataAllCallbacksRan = abi.encodeWithSelector(this.handleAllCallbacksRan.selector); + // Register the callback, forwarding any value sent to this call - callbacks.register{value: msg.value}(callbackData); + callbacks.register{value: msg.value/3}(callbackData); + callbacks.register{value: msg.value/3}(callbackDataFail); + callbacks.register{value: msg.value/3}(callbackDataAllCallbacksRan); } function isLastCallSuccess() external view returns (bool) { - return lastCallSuccess; + return allCallbacksRan && lastCallSuccess; } }