diff --git a/kroma-bindings/bindings/validatormanager.go b/kroma-bindings/bindings/validatormanager.go index 940e4c1c4..635bfc6c8 100644 --- a/kroma-bindings/bindings/validatormanager.go +++ b/kroma-bindings/bindings/validatormanager.go @@ -31,23 +31,23 @@ var ( // IValidatorManagerConstructorParams is an auto generated low-level Go binding around an user-defined struct. type IValidatorManagerConstructorParams struct { - L2Oracle common.Address - AssetManager common.Address - TrustedValidator common.Address - CommissionRateMinChangeSeconds *big.Int - RoundDurationSeconds *big.Int - JailPeriodSeconds *big.Int - JailThreshold *big.Int - MaxOutputFinalizations *big.Int - BaseReward *big.Int - MinRegisterAmount *big.Int - MinActivateAmount *big.Int + L2Oracle common.Address + AssetManager common.Address + TrustedValidator common.Address + CommissionChangeDelaySeconds *big.Int + RoundDurationSeconds *big.Int + JailPeriodSeconds *big.Int + JailThreshold *big.Int + MaxOutputFinalizations *big.Int + BaseReward *big.Int + MinRegisterAmount *big.Int + MinActivateAmount *big.Int } // ValidatorManagerMetaData contains all meta data concerning the ValidatorManager contract. var ValidatorManagerMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_constructorParams\",\"type\":\"tuple\",\"internalType\":\"structIValidatorManager.ConstructorParams\",\"components\":[{\"name\":\"_l2Oracle\",\"type\":\"address\",\"internalType\":\"contractL2OutputOracle\"},{\"name\":\"_assetManager\",\"type\":\"address\",\"internalType\":\"contractAssetManager\"},{\"name\":\"_trustedValidator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_commissionRateMinChangeSeconds\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"_roundDurationSeconds\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"_jailPeriodSeconds\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"_jailThreshold\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"_maxOutputFinalizations\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"_baseReward\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"_minRegisterAmount\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"_minActivateAmount\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ASSET_MANAGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractAssetManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BASE_REWARD\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BOOSTED_REWARD_DENOM\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BOOSTED_REWARD_NUMERATOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"COMMISSION_RATE_DENOM\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"COMMISSION_RATE_MIN_CHANGE_SECONDS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"JAIL_PERIOD_SECONDS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"JAIL_THRESHOLD\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"L2_ORACLE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractL2OutputOracle\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_OUTPUT_FINALIZATIONS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MIN_ACTIVATE_AMOUNT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MIN_REGISTER_AMOUNT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ROUND_DURATION_SECONDS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"TRUSTED_VALIDATOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activateValidator\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"activatedValidatorCount\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activatedValidatorTotalWeight\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint120\",\"internalType\":\"uint120\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"afterSubmitL2Output\",\"inputs\":[{\"name\":\"outputIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"changeCommissionRate\",\"inputs\":[{\"name\":\"newCommissionRate\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"checkSubmissionEligibility\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCommissionMaxChangeRate\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCommissionRate\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStatus\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIValidatorManager.ValidatorStatus\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getWeight\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint120\",\"internalType\":\"uint120\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getWithdrawAccount\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"inJail\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isActive\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"jailExpiresAt\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"nextValidator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"noSubmissionCount\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerValidator\",\"inputs\":[{\"name\":\"assets\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"commissionRate\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"commissionMaxChangeRate\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"withdrawAccount\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slash\",\"inputs\":[{\"name\":\"outputIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"winner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"loser\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"tryUnjail\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"force\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateValidatorTree\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"tryRemove\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"ChallengeRewardDistributed\",\"inputs\":[{\"name\":\"outputIndex\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint128\",\"indexed\":false,\"internalType\":\"uint128\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardDistributed\",\"inputs\":[{\"name\":\"outputIndex\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"validator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"validatorReward\",\"type\":\"uint128\",\"indexed\":false,\"internalType\":\"uint128\"},{\"name\":\"baseReward\",\"type\":\"uint128\",\"indexed\":false,\"internalType\":\"uint128\"},{\"name\":\"boostedReward\",\"type\":\"uint128\",\"indexed\":false,\"internalType\":\"uint128\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Slashed\",\"inputs\":[{\"name\":\"outputIndex\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"loser\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint128\",\"indexed\":false,\"internalType\":\"uint128\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorActivated\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"activatedAt\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorCommissionRateChanged\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldCommissionRate\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"},{\"name\":\"newCommissionRate\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorJailed\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"expiresAt\",\"type\":\"uint128\",\"indexed\":false,\"internalType\":\"uint128\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRegistered\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"activated\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"},{\"name\":\"commissionRate\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"},{\"name\":\"commissionMaxChangeRate\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"},{\"name\":\"assets\",\"type\":\"uint128\",\"indexed\":false,\"internalType\":\"uint128\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorStopped\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"stopsAt\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorUnjailed\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"CommissionChangeRateExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ImproperValidatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientAsset\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidConstructorParams\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxCommissionChangeRateExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxCommissionRateExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotAllowedCaller\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotElapsedCommissionChangePeriod\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotElapsedJailPeriod\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotSelectedPriorityValidator\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SameCommissionRate\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZeroAddress\",\"inputs\":[]}]", - Bin: "0x6101e06040523480156200001257600080fd5b506040516200528638038062005286833981016040819052620000359162000171565b8061014001516001600160801b03168161012001516001600160801b031611156200007357604051631510b77f60e01b815260040160405180910390fd5b80516001600160a01b0390811660809081526020830151821660a0908152604084015190921660c0908152610120808501516001600160801b0390811660e09081526101408088015183166101009081526060890151841690945294870151821690945293850151841661016052908401518316610180529083015182166101a05290910151166101c05262000264565b60405161016081016001600160401b03811182821017156200013657634e487b7160e01b600052604160045260246000fd5b60405290565b80516001600160a01b03811681146200015457600080fd5b919050565b80516001600160801b03811681146200015457600080fd5b600061016082840312156200018557600080fd5b6200018f62000104565b6200019a836200013c565b8152620001aa602084016200013c565b6020820152620001bd604084016200013c565b6040820152620001d06060840162000159565b6060820152620001e36080840162000159565b6080820152620001f660a0840162000159565b60a08201526200020960c0840162000159565b60c08201526200021c60e0840162000159565b60e08201526101006200023181850162000159565b908201526101206200024584820162000159565b908201526101406200025984820162000159565b908201529392505050565b60805160a05160c05160e05161010051610120516101405161016051610180516101a0516101c051614e8a620003fc600039600081816102e60152818161430e01528181614350015261463d01526000818161077201526125be0152600081816103660152612b1601526000818161050b0152612e7001526000818161038d0152610bd70152600081816106e80152610e630152600081816105f7015281816109940152611cd40152600081816102bf0152818161087f01526119e701526000818161033f0152610c3401526000818161045d015281816108b3015281816109c801528181610a6d01528181610d51015281816116b9015281816118bf01528181611c5101528181611dd4015281816127d50152818161291201526145b801526000818161024a01528181610b3e015281816110a90152818161121a01528181611466015281816114f8015281816115a401528181611790015281816123b301528181612439015281816124bd01528181612643015281816126ea01528181612a6f01528181612c110152612cc50152614e8a6000f3fe608060405234801561001057600080fd5b50600436106102405760003560e01c8063970531c111610145578063be119347116100bd578063cdff5e191161008c578063dff221b511610071578063dff221b51461070a578063e0cc26a21461073b578063e7816b7f1461076d57600080fd5b8063cdff5e19146106c6578063dea15254146106e357600080fd5b8063be1193471461065e578063be995dc214610671578063c2d9b68414610684578063c5398584146106b357600080fd5b8063ac6c525111610114578063b2653fe3116100f9578063b2653fe3146105f2578063b91b2723146102b2578063b9551f821461061957600080fd5b8063ac6c52511461052d578063af6ca762146105a257600080fd5b8063970531c1146104a55780639d6b2e37146104e05780639f8a13d7146104f3578063abeba4491461050657600080fd5b80633ee4d4a3116101d857806356b65e97116101a75780636874e0421161018c5780636874e0421461045857806388576dc91461047f578063891aab741461049257600080fd5b806356b65e97146103f85780635bab847f1461044557600080fd5b80633ee4d4a31461033a57806342223ae9146103615780634cca5e6c1461038857806354fd4d50146103af57600080fd5b806322009af61161021457806322009af6146102e1578063263a34021461030857806330ccebb5146103125780633a5490461461033257600080fd5b80621c2ff6146102455780630763fa7e14610289578063110d6069146102b25780631796e52e146102ba575b600080fd5b61026c7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b610291602881565b6040516fffffffffffffffffffffffffffffffff9091168152602001610280565b610291606481565b6102917f000000000000000000000000000000000000000000000000000000000000000081565b6102917f000000000000000000000000000000000000000000000000000000000000000081565b610310610794565b005b61032561032036600461496b565b61081f565b60405161028091906149b7565b61026c610b28565b61026c7f000000000000000000000000000000000000000000000000000000000000000081565b6102917f000000000000000000000000000000000000000000000000000000000000000081565b6102917f000000000000000000000000000000000000000000000000000000000000000081565b6103eb6040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b60405161028091906149f8565b61043561040636600461496b565b6001600160a01b03166000908152600560205260409020546fffffffffffffffffffffffffffffffff16151590565b6040519015158152602001610280565b610310610453366004614a79565b610c56565b61026c7f000000000000000000000000000000000000000000000000000000000000000081565b61031061048d366004614ac8565b610dcb565b6103106104a036600461496b565b61109e565b6102916104b336600461496b565b6001600160a01b03166000908152600560205260409020546fffffffffffffffffffffffffffffffff1690565b6103106104ee366004614a79565b6111b1565b61043561050136600461496b565b611428565b6102917f000000000000000000000000000000000000000000000000000000000000000081565b61058261053b36600461496b565b6001600160a01b031660009081526003602090815260408083205463ffffffff168352600290915290206001015461010090046effffffffffffffffffffffffffffff1690565b6040516effffffffffffffffffffffffffffff9091168152602001610280565b6001805468010000000000000000900463ffffffff166000908152600260205260409020015470010000000000000000000000000000000090046effffffffffffffffffffffffffffff16610582565b6102917f000000000000000000000000000000000000000000000000000000000000000081565b61064c61062736600461496b565b6001600160a01b03166000908152600460205260409020546301000000900460ff1690565b60405160ff9091168152602001610280565b61031061066c366004614ae3565b61145b565b61031061067f366004614afc565b6115a2565b61026c61069236600461496b565b6001600160a01b039081166000908152600460205260409020600101541690565b6103106106c1366004614b5c565b611992565b6106ce611d71565b60405163ffffffff9091168152602001610280565b6102917f000000000000000000000000000000000000000000000000000000000000000081565b61064c61071836600461496b565b6001600160a01b0316600090815260046020526040902054610100900460ff1690565b61064c61074936600461496b565b6001600160a01b031660009081526004602052604090205462010000900460ff1690565b6102917f000000000000000000000000000000000000000000000000000000000000000081565b600361079f3361081f565b60058111156107b0576107b0614988565b1415806107dd5750336000908152600560205260409020546fffffffffffffffffffffffffffffffff1615155b15610814576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61081d33611d96565b565b6001600160a01b03811660009081526004602052604081205460ff1661084757506000919050565b6040517f981cee530000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301527f00000000000000000000000000000000000000000000000000000000000000006fffffffffffffffffffffffffffffffff16917f00000000000000000000000000000000000000000000000000000000000000009091169063981cee5390602401602060405180830381865afa1580156108fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109209190614bb4565b6fffffffffffffffffffffffffffffffff16101561094057506001919050565b6001600160a01b03828116600081815260036020526040908190205490517f12188543000000000000000000000000000000000000000000000000000000008152600481019290925263ffffffff161515917f00000000000000000000000000000000000000000000000000000000000000006fffffffffffffffffffffffffffffffff16917f000000000000000000000000000000000000000000000000000000000000000090911690631218854390602401602060405180830381865afa158015610a11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a359190614bb4565b6040517f8abf0af00000000000000000000000000000000000000000000000000000000081526001600160a01b0386811660048301527f00000000000000000000000000000000000000000000000000000000000000001690638abf0af090602401602060405180830381865afa158015610ab4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ad89190614bb4565b610ae29190614c00565b6fffffffffffffffffffffffffffffffff161015610b115780610b085750600292915050565b50600492915050565b80610b1f5750600392915050565b50600592915050565b600080546001600160a01b031615610c315760007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166380446bd26040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b9a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bbe9190614c31565b9050804210610c20576000610bd38242614c4a565b90507f00000000000000000000000000000000000000000000000000000000000000006fffffffffffffffffffffffffffffffff16811115610c1e576001600160a01b039250505090565b505b50506000546001600160a01b031690565b507f000000000000000000000000000000000000000000000000000000000000000090565b6000610c618361081f565b9050818015610c9c57506001816005811115610c7f57610c7f614988565b1480610c9c57506004816005811115610c9a57610c9a614988565b145b15610cfa57610cac600184611e8e565b15610cf557826001600160a01b03167fdee7e7274fb1911def379ceda542a2723358c99d6d1f89fcbdbe9e9d638d996142604051610cec91815260200190565b60405180910390a25b505050565b6004816005811115610d0e57610d0e614988565b10610cf5576040517f8abf0af00000000000000000000000000000000000000000000000000000000081526001600160a01b038085166004830152610dc59185917f00000000000000000000000000000000000000000000000000000000000000001690638abf0af090602401602060405180830381865afa158015610d98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dbc9190614bb4565b60019190612031565b50505050565b6002610dd63361081f565b6005811115610de757610de7614988565b1080610e135750336000908152600560205260409020546fffffffffffffffffffffffffffffffff1615155b15610e4a576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33600090815260046020526040902080544290610ea2907f00000000000000000000000000000000000000000000000000000000000000009064010000000090046fffffffffffffffffffffffffffffffff16614c61565b6fffffffffffffffffffffffffffffffff161115610eec576040517f7d7a4d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606460ff83161115610f2a576040517f406b265300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805460ff620100009091048116908316819003610f73576040517f150393f200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008160ff168460ff1611610f9157610f8c8483614c95565b610f9b565b610f9b8285614c95565b835490915060ff630100000090910481169082161115610fe7576040517f9ed4fa4a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82547fffffffffffffffffffffffff00000000000000000000000000000000ff00ffff166201000060ff8681169182027fffffffffffffffffffffffff00000000000000000000000000000000ffffffff1692909217640100000000426fffffffffffffffffffffffffffffffff1602178555604080519285168352602083019190915233917fc0b29b9b824f7a62d93fde5832bb8307fd62594d0a08d96d533407a0a147ec48910160405180910390a250505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611100576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061110a610b28565b90506001600160a01b03808216148015906111375750806001600160a01b0316826001600160a01b031614155b1561116e576040517fc625317600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61117782611428565b6111ad576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050565b6001600160a01b0382166000908152600560205260409020546fffffffffffffffffffffffffffffffff16611212576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80156112e9577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639e45e8f46040518163ffffffff1660e01b8152600401602060405180830381865afa158015611276573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061129a9190614cb8565b6001600160a01b0316336001600160a01b0316146112e4576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61139a565b336001600160a01b0383161461132b576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038216600090815260056020526040902054426fffffffffffffffffffffffffffffffff9091161115611391576040517f1dfc20f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61139a82612346565b6001600160a01b03821660008181526005602052604080822080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000169055517f9390b453426557da5ebdc31f19a37753ca04addf656d32f35232211bb2af3f199190a260036114098361081f565b600581111561141a5761141a614988565b036111ad576111ad82611d96565b600060056114358361081f565b600581111561144657611446614988565b0361145357506001919050565b506000919050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146114bd576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6114c56123ae565b506040517fb0ea09a8000000000000000000000000000000000000000000000000000000008152600481018290526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b0ea09a890602401602060405180830381865afa158015611547573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061156b9190614cb8565b6000549091506001600160a01b03908116908216036115925761158d81612346565b61159a565b61159a612ae9565b6111ad612bbe565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639e45e8f46040518163ffffffff1660e01b8152600401602060405180830381865afa158015611600573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116249190614cb8565b6001600160a01b0316336001600160a01b03161461166e576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f3ecf0ced0000000000000000000000000000000000000000000000000000000081526001600160a01b038281166004830152600060248301819052600160448401529182917f00000000000000000000000000000000000000000000000000000000000000001690633ecf0ced9060640160408051808303816000875af1158015611701573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117259190614cd5565b90925090506001600160a01b038316857f1237821480ce4d75f917bc39d1641eb17a5e09a2d5bf982cdd8cb2561aa28e686117608486614c61565b6040516fffffffffffffffffffffffffffffffff909116815260200160405180910390a361178d83612e58565b847f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f403838d6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118109190614c31565b1161186857600085815260066020526040902080546fffffffffffffffffffffffffffffffff8082168401167fffffffffffffffffffffffffffffffff0000000000000000000000000000000090911617905561198b565b6040517f3ecf0ced0000000000000000000000000000000000000000000000000000000081526001600160a01b0385811660048301526fffffffffffffffffffffffffffffffff83166024830152600060448301527f00000000000000000000000000000000000000000000000000000000000000001690633ecf0ced9060640160408051808303816000875af1158015611907573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061192b9190614cd5565b5050611938846000610c56565b6040516fffffffffffffffffffffffffffffffff821681526001600160a01b0385169086907fd537f9e63e8da05cdb52f795e1c79d7b163e2517d5229375474dbe60b48cfa149060200160405180910390a35b5050505050565b600061199d3361081f565b60058111156119ae576119ae614988565b146119e5576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006fffffffffffffffffffffffffffffffff16846fffffffffffffffffffffffffffffffff161015611a63576040517f24f21b1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606460ff84161115611aa1576040517f406b265300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606460ff83161115611adf576040517f4143808b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038116611b1f576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360008181526004602081905260409182902080546fffffffffffffffffffffffffffffffff428116640100000000027fffffffffffffffffffffffff00000000000000000000000000000000ffffffff60ff8a8116630100000002919091167fffffffffffffffffffffffff0000000000000000000000000000000000ffffff918c1662010000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff00909516949094176001908117919091169390931717835590820180546001600160a01b038881167fffffffffffffffffffffffff00000000000000000000000000000000000000009092169190911790915593517fd7f1a3d80000000000000000000000000000000000000000000000000000000081529283019490945292871660248201527f00000000000000000000000000000000000000000000000000000000000000009091169063d7f1a3d8906044016020604051808303816000875af1158015611c9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cc09190614bb4565b506fffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811690861610801590611d0957611d0933611d96565b60408051821515815260ff87811660208301528616818301526fffffffffffffffffffffffffffffffff88166060820152905133917f04ba0c4d7cbac9138f7b73ec9fef796e4ad320bf5fb204f080f81fd59c2d48b9919081900360800190a2505050505050565b600154600090611d919063ffffffff640100000000820481169116614d04565b905090565b6040517f8abf0af00000000000000000000000000000000000000000000000000000000081526001600160a01b038083166004830152611e489183917f00000000000000000000000000000000000000000000000000000000000000001690638abf0af090602401602060405180830381865afa158015611e1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e3f9190614bb4565b60019190612f7b565b806001600160a01b03167ff33a24861b76047debce215c7ae4915a9befc5d870e97efbd4152df23c72112a42604051611e8391815260200190565b60405180910390a250565b6001600160a01b038116600090815260028301602052604081205463ffffffff16808203611ec057600091505061202b565b6001600160a01b03831660009081526002850160209081526040808320805463ffffffff1916905563ffffffff8481168452600180890190935292208054910154740100000000000000000000000000000000000000009091049091169061010090046effffffffffffffffffffffffffffff165b63ffffffff821615611fd75763ffffffff91821660009081526001808801602052604090912090810180546effffffffffffffffffffffffffffff7001000000000000000000000000000000008083048216869003909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9091161790555474010000000000000000000000000000000000000000900490911690611f35565b611fe18684613500565b50508354600163ffffffff64010000000080840482168301909116027fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff9092169190911785559150505b92915050565b6001600160a01b038216600090815260028401602052604081205463ffffffff1680820361206357600091505061233f565b63ffffffff80821660009081526001808801602052604090912090810180546effffffffffffffffffffffffffffff8781166101008181027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff85161790945593549290910416927401000000000000000000000000000000000000000090910416908210156122135763ffffffff83166000908152600188810160205260409091200180547fff000000000000000000000000000000ffffffffffffffffffffffffffffffff8116848803700100000000000000000000000000000000928390046effffffffffffffffffffffffffffff908116820116909202179091555b63ffffffff8216156122035763ffffffff91821660009081526001808a01602052604090912090810180546effffffffffffffffffffffffffffff70010000000000000000000000000000000080830482168601909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9091161790555474010000000000000000000000000000000000000000900490911690612162565b5061220e8784613c8c565b612337565b63ffffffff83166000908152600188810160205260409091200180547fff000000000000000000000000000000ffffffffffffffffffffffffffffffff8116878503700100000000000000000000000000000000928390046effffffffffffffffffffffffffffff90811682900316909202179091555b63ffffffff82161561232c5763ffffffff91821660009081526001808a01602052604090912090810180546effffffffffffffffffffffffffffff7001000000000000000000000000000000008083048216869003909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff909116179055547401000000000000000000000000000000000000000090049091169061228a565b506123378784613e98565b600193505050505b9392505050565b6001600160a01b038116600090815260046020526040902054610100900460ff16156123ab576001600160a01b038116600090815260046020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1690555b50565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f403838d6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561240f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124339190614c31565b905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166369f16eec6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612495573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124b99190614c31565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612519573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061253d9190614cb8565b6001600160a01b031663ad36d6cc836040518263ffffffff1660e01b815260040161256a91815260200190565b602060405180830381865afa158015612587573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125ab9190614d21565b6125b85760009250505090565b6000805b7f00000000000000000000000000000000000000000000000000000000000000006fffffffffffffffffffffffffffffffff16826fffffffffffffffffffffffffffffffff1610801561260f5750828411155b15612a28576040517f33727c4d000000000000000000000000000000000000000000000000000000008152600481018590527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333727c4d90602401602060405180830381865afa158015612692573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126b69190614d21565b15612a28576040517fb0ea09a8000000000000000000000000000000000000000000000000000000008152600481018590527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b0ea09a890602401602060405180830381865afa158015612739573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061275d9190614cb8565b9050600080600061276d846142c3565b6040517fad4294510000000000000000000000000000000000000000000000000000000081526001600160a01b0388811660048301526fffffffffffffffffffffffffffffffff858116602484015284811660448401528316606483015293965091945092507f00000000000000000000000000000000000000000000000000000000000000009091169063ad42945190608401600060405180830381600087803b15801561281b57600080fd5b505af115801561282f573d6000803e3d6000fd5b5050604080516fffffffffffffffffffffffffffffffff8581168252878116602083015286168183015290516001600160a01b03881693508a92507fd74a44a8cd6c73740a70271e07ee96d8a495ff30037ae6381cbcdb8fe7f2a1ea9181900360600190a36000878152600660205260409020546fffffffffffffffffffffffffffffffff168015612a08576040517f3ecf0ced0000000000000000000000000000000000000000000000000000000081526001600160a01b0386811660048301526fffffffffffffffffffffffffffffffff83166024830152600060448301527f00000000000000000000000000000000000000000000000000000000000000001690633ecf0ced9060640160408051808303816000875af115801561295a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061297e9190614cd5565b505060008881526006602090815260409182902080547fffffffffffffffffffffffffffffffff0000000000000000000000000000000016905590516fffffffffffffffffffffffffffffffff831681526001600160a01b038716918a917fd537f9e63e8da05cdb52f795e1c79d7b163e2517d5229375474dbe60b48cfa14910160405180910390a35b612a13856000610c56565b876001019750856001019550505050506125bc565b6fffffffffffffffffffffffffffffffff821615612ade576040517f9902cdc0000000000000000000000000000000000000000000000000000000008152600481018590527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690639902cdc090602401600060405180830381600087803b158015612abb57600080fd5b505af1158015612acf573d6000803e3d6000fd5b50505050600194505050505090565b600094505050505090565b6000546001600160a01b0316612afb57565b600080546001600160a01b03168152600460205260409020547f00000000000000000000000000000000000000000000000000000000000000006fffffffffffffffffffffffffffffffff1661010090910460ff1610612b6a5760005461081d906001600160a01b0316612e58565b600080546001600160a01b03168152600460205260409020805460ff6101008083048216600101909116027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116179055565b6001805468010000000000000000900463ffffffff1660009081526002602052604081209091015470010000000000000000000000000000000090046effffffffffffffffffffffffffffff16905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f403838d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612c6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c919190614c31565b90506000826effffffffffffffffffffffffffffff16118015612cb45750600081115b15612e2c5760006001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663a25ae557612cf5600185614c4a565b6040518263ffffffff1660e01b8152600401612d1391815260200190565b608060405180830381865afa158015612d30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d549190614d3e565b90506000838260200151434144600143612d6e9190614c4a565b6040805160208101969096528501939093527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606092831b1691840191909152607483015240609482015260b4016040516020818303038152906040528051906020012060001c612ddf9190614e10565b9050612dec6001826143ac565b600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055506111ad9050565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555050565b6000612e966fffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001642614e65565b6001600160a01b03831660008181526005602090815260409182902080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff8616908117909155915191825292935090917f95a398f2b6b2ad94f281708c97fe502386fc16adca43daed577a1e992a4cc814910160405180910390a2612f2f600183611e8e565b156111ad57816001600160a01b03167fdee7e7274fb1911def379ceda542a2723358c99d6d1f89fcbdbe9e9d638d996142604051612f6f91815260200190565b60405180910390a25050565b60006040518060e00160405280846001600160a01b03168152602001600063ffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600115158152602001836effffffffffffffffffffffffffffff168152602001836effffffffffffffffffffffffffffff16815250905083600001600081819054906101000a900463ffffffff168092919060010191906101000a81548163ffffffff021916908363ffffffff1602179055505060008460000160009054906101000a900463ffffffff169050818560010160008363ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160000160146101000a81548163ffffffff021916908363ffffffff16021790555060408201518160000160186101000a81548163ffffffff021916908363ffffffff160217905550606082015181600001601c6101000a81548163ffffffff021916908363ffffffff16021790555060808201518160010160006101000a81548160ff02191690831515021790555060a08201518160010160016101000a8154816effffffffffffffffffffffffffffff02191690836effffffffffffffffffffffffffffff16021790555060c08201518160010160106101000a8154816effffffffffffffffffffffffffffff02191690836effffffffffffffffffffffffffffff16021790555090505080856002016000866001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508460000160089054906101000a900463ffffffff1663ffffffff1660000361325657845463ffffffff90911668010000000000000000027fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff90911617909355505050565b845468010000000000000000900463ffffffff165b63ffffffff808216600090815260018089016020526040822090810180546effffffffffffffffffffffffffffff70010000000000000000000000000000000080830482168b01909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff90911617905580549092600160c01b9091041690036133925763ffffffff838116600081815260018a016020526040902080547fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000938616939093029290921790915581547fffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffff16600160c01b9091021781556133898784613c8c565b50505050505050565b8054600160e01b900463ffffffff166000036134685763ffffffff838116600081815260018a8101602052604090912080547fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000948716949094029390931783559190910180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905581547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16600160e01b9091021781556133898784613c8c565b805463ffffffff600160e01b8204811660009081526001808b016020526040808320820154600160c01b909504909316825291902001546effffffffffffffffffffffffffffff700100000000000000000000000000000000928390048116929091041611156134e8578054600160e01b900463ffffffff1691506134fa565b8054600160c01b900463ffffffff1691505b5061326b565b63ffffffff8082166000908152600184016020526040812080549092600160c01b9091041690036137e3578054600160e01b900463ffffffff1660000361369257805474010000000000000000000000000000000000000000900463ffffffff166000036135935782547fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff16835561364e565b600181015460ff16156135fb57805474010000000000000000000000000000000000000000900463ffffffff166000908152600184016020526040902080547fffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffff16905561364e565b805474010000000000000000000000000000000000000000900463ffffffff166000908152600184016020526040902080547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690555b5063ffffffff1660009081526001918201602052604081209081550180547fff00000000000000000000000000000000000000000000000000000000000000169055565b805463ffffffff600160e01b80830482166000908152600180880160209081526040808420547fffffffffffffffffffffffff00000000000000000000000000000000000000009097166001600160a01b0397881617808955859004861684528084208084018054948a0180546effffffffffffffffffffffffffffff6101009788900481169097027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff8216811783559254700100000000000000000000000000000000908190049097169096027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9092167fff000000000000000000000000000000000000000000000000000000000000ff9096169590951717909355915490951682526002880190945292909220805494821663ffffffff199095169490941790935581540490911690613c86565b8054600160e01b900463ffffffff1660000361394a57805463ffffffff600160c01b80830482166000908152600180880160209081526040808420547fffffffffffffffffffffffff00000000000000000000000000000000000000009097166001600160a01b0397881617808955859004861684528084208084018054948a0180546effffffffffffffffffffffffffffff6101009788900481169097027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff8216811783559254700100000000000000000000000000000000908190049097169096027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9092167fff000000000000000000000000000000000000000000000000000000000000ff9096169590951717909355915490951682526002880190945292909220805494821663ffffffff199095169490941790935581540490911690613c86565b805463ffffffff600160e01b82048116600090815260018087016020526040808320820154600160c01b909504909316825291902001546effffffffffffffffffffffffffffff61010092839004811692909104161115613b1857805463ffffffff600160c01b80830482166000908152600180880160209081526040808420547fffffffffffffffffffffffff00000000000000000000000000000000000000009097166001600160a01b03978816178089558581048716855281852080850180548b870180546effffffffffffffffffffffffffffff6101009384900481169093027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff821681178355600160e01b9096048c168a52868a20909801549254700100000000000000000000000000000000908190048316938190048316939093019091169091027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9093167fff000000000000000000000000000000000000000000000000000000000000ff9096169590951791909117909355915490951682526002880190945292909220805494821663ffffffff199095169490941790935581540490911690613c86565b805463ffffffff600160e01b80830482166000908152600180880160209081526040808420547fffffffffffffffffffffffff00000000000000000000000000000000000000009097166001600160a01b03978816178089558581048716855281852080850180548b870180546effffffffffffffffffffffffffffff6101009384900481169093027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff8216811783559354600160c01b9096048c168a52868a2090980154700100000000000000000000000000000000908190048316958190048316959095019091169093027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9091167fff000000000000000000000000000000000000000000000000000000000000ff90961695909517949094179055915490951682526002880190945292909220805494821663ffffffff1990951694909417909355815404909116905b50613500565b63ffffffff80821660009081526001840160205260408082208054740100000000000000000000000000000000000000009004909316825290205b815474010000000000000000000000000000000000000000900463ffffffff1615801590613d1a5750600180820154908301546effffffffffffffffffffffffffffff6101009283900481169290910416115b15610dc557815481547fffffffffffffffffffffffff00000000000000000000000000000000000000008083166001600160a01b03928316178555835416918116919091178255600180840180548483018054610100908190046effffffffffffffffffffffffffffff9081168083027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff80871691909117875584549584900483169384029516949094179092558354929003700100000000000000000000000000000000808404831691909103909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9091161790558354821660009081526002870160209081526040808320805463ffffffff998a1663ffffffff199182161790915587549654909516835280832080549095167401000000000000000000000000000000000000000096879004891617909455945484900486168082529187019094528184208054939093049094168352909120613cc7565b5b63ffffffff8082166000908152600180850160205260408083208054600160e01b810486168552828520840154600160c01b90910490951684529220015490916effffffffffffffffffffffffffffff6101009182900481169190920490911611156140e157600180820154825463ffffffff600160c01b90910416600090815285830160205260409020909101546effffffffffffffffffffffffffffff61010092839004811692909104161115610cf557805463ffffffff600160c01b80830482166000908152600187810160208181526040808520547fffffffffffffffffffffffff0000000000000000000000000000000000000000808a166001600160a01b0392831617808c558890048916875282872080549091169982169990991790985583890180548a548890048916875282872086018054610100908190046effffffffffffffffffffffffffffff9081168083027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff80871691909117909655835494839004821692830294909516939093179091558b548990048a168852838820909601805496909203700100000000000000000000000000000000808804831691909103909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9095169490941790935587548716845260028a0180825283852080549a881663ffffffff199b8c1617905588548690048716808652928252838520549097168452959095529020805490951690921790935590540416613e99565b600180820154825463ffffffff600160e01b90910416600090815285830160205260409020909101546effffffffffffffffffffffffffffff61010092839004811692909104161115610cf557805463ffffffff600160e01b80830482166000908152600187810160208181526040808520547fffffffffffffffffffffffff0000000000000000000000000000000000000000808a166001600160a01b0392831617808c558890048916875282872080549091169982169990991790985583890180548a548890048916875282872086018054610100908190046effffffffffffffffffffffffffffff9081168083027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff80871691909117909655835494839004821692830294909516939093179091558b548990048a168852838820909601805496909203700100000000000000000000000000000000808804831691909103909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9095169490941790935587548716845260028a0180825283852080549a881663ffffffff199b8c1617905588548690048716808652928252838520549097168452959095529020805490951690921790935590540416613e99565b6001600160a01b0381166000908152600460205260408120548190819062010000900460ff16816142f38661457b565b90506000806143386fffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008501168560646146b1565b905061437b6fffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000166064868103906146b1565b915061439e6fffffffffffffffffffffffffffffffff84166064868103906146b1565b919891975095509350505050565b815460009068010000000000000000900463ffffffff165b63ffffffff80821660009081526001808701602052604080832054600160c01b9004909316825291902001546effffffffffffffffffffffffffffff8085167001000000000000000000000000000000009092041611156144455763ffffffff9081166000908152600185016020526040902054600160c01b9004166143c4565b63ffffffff8181166000818152600187810160205260408083208054600160c01b9004909516835282208101549290915291909101547001000000000000000000000000000000009091046effffffffffffffffffffffffffffff908116909403938481166101009092041611156144de5763ffffffff1660009081526001840160205260409020546001600160a01b0316905061202b565b63ffffffff818116600090815260018681016020526040808320808301549054600160e01b9004909416835290912001546101009091046effffffffffffffffffffffffffffff908116909403938481167001000000000000000000000000000000009092041611156145715763ffffffff9081166000908152600185016020526040902054600160e01b9004166143c4565b600091505061202b565b6040517f913f1a9f0000000000000000000000000000000000000000000000000000000081526001600160a01b03828116600483015260009182917f0000000000000000000000000000000000000000000000000000000000000000169063913f1a9f90602401602060405180830381865afa1580156145ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906146239190614bb4565b905060006146666fffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016602860646146b1565b90506146a9816fffffffffffffffffffffffffffffffff16650100000000006146a2856fffffffffffffffffffffffffffffffff166064614765565b919061482c565b949350505050565b6000838302608081901c6fffffffffffffffffffffffffffffffff84161161473a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f55696e743132384d6174683a206d756c446976206f766572666c6f770000000060448201526064015b60405180910390fd5b826fffffffffffffffffffffffffffffffff16818161475b5761475b614de1565b0495945050505050565b600080838310801561477e5760018114614791576147a0565b65010000000000850284900491506147a0565b65010000000000840285900491505b506402ef6c3406818002602890811c808402821c808202831c808302841c808402851c938402851c95909502841c641da06a6e33909502841c6455232d2bb2909202841c640d4ca0c283909302841c643177d95571909102841c64fffe4bcada90960290931c949094019190910103919091030390508183111561202b576501921fb544430392915050565b600080807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff858709858702925082811083820303915050806000036148845783828161487a5761487a614de1565b049250505061233f565b8084116148ed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d6174683a206d756c446976206f766572666c6f7700000000000000000000006044820152606401614731565b60008486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091026000889003889004909101858311909403939093029303949094049190911702949350505050565b6001600160a01b03811681146123ab57600080fd5b60006020828403121561497d57600080fd5b813561233f81614956565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60208101600683106149f2577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b600060208083528351808285015260005b81811015614a2557858101830151858201604001528201614a09565b81811115614a37576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b80151581146123ab57600080fd5b60008060408385031215614a8c57600080fd5b8235614a9781614956565b91506020830135614aa781614a6b565b809150509250929050565b803560ff81168114614ac357600080fd5b919050565b600060208284031215614ada57600080fd5b61233f82614ab2565b600060208284031215614af557600080fd5b5035919050565b600080600060608486031215614b1157600080fd5b833592506020840135614b2381614956565b91506040840135614b3381614956565b809150509250925092565b6fffffffffffffffffffffffffffffffff811681146123ab57600080fd5b60008060008060808587031215614b7257600080fd5b8435614b7d81614b3e565b9350614b8b60208601614ab2565b9250614b9960408601614ab2565b91506060850135614ba981614956565b939692955090935050565b600060208284031215614bc657600080fd5b815161233f81614b3e565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006fffffffffffffffffffffffffffffffff83811690831681811015614c2957614c29614bd1565b039392505050565b600060208284031215614c4357600080fd5b5051919050565b600082821015614c5c57614c5c614bd1565b500390565b60006fffffffffffffffffffffffffffffffff808316818516808303821115614c8c57614c8c614bd1565b01949350505050565b600060ff821660ff841680821015614caf57614caf614bd1565b90039392505050565b600060208284031215614cca57600080fd5b815161233f81614956565b60008060408385031215614ce857600080fd5b8251614cf381614b3e565b6020840151909250614aa781614b3e565b600063ffffffff83811690831681811015614c2957614c29614bd1565b600060208284031215614d3357600080fd5b815161233f81614a6b565b600060808284031215614d5057600080fd5b6040516080810181811067ffffffffffffffff82111715614d9a577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040528251614da881614956565b8152602083810151908201526040830151614dc281614b3e565b60408201526060830151614dd581614b3e565b60608201529392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006effffffffffffffffffffffffffffff80841680614e59577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b92169190910692915050565b60008219821115614e7857614e78614bd1565b50019056fea164736f6c634300080f000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_constructorParams\",\"type\":\"tuple\",\"internalType\":\"structIValidatorManager.ConstructorParams\",\"components\":[{\"name\":\"_l2Oracle\",\"type\":\"address\",\"internalType\":\"contractL2OutputOracle\"},{\"name\":\"_assetManager\",\"type\":\"address\",\"internalType\":\"contractAssetManager\"},{\"name\":\"_trustedValidator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_commissionChangeDelaySeconds\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"_roundDurationSeconds\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"_jailPeriodSeconds\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"_jailThreshold\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"_maxOutputFinalizations\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"_baseReward\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"_minRegisterAmount\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"_minActivateAmount\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ASSET_MANAGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractAssetManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BASE_REWARD\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BOOSTED_REWARD_DENOM\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BOOSTED_REWARD_NUMERATOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"COMMISSION_CHANGE_DELAY_SECONDS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"COMMISSION_RATE_DENOM\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"JAIL_PERIOD_SECONDS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"JAIL_THRESHOLD\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"L2_ORACLE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractL2OutputOracle\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_OUTPUT_FINALIZATIONS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MIN_ACTIVATE_AMOUNT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MIN_REGISTER_AMOUNT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ROUND_DURATION_SECONDS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"TRUSTED_VALIDATOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activateValidator\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"activatedValidatorCount\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activatedValidatorTotalWeight\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint120\",\"internalType\":\"uint120\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"afterSubmitL2Output\",\"inputs\":[{\"name\":\"outputIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"canFinalizeCommissionChangeAt\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"checkSubmissionEligibility\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"finalizeCommissionChange\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getCommissionRate\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPendingCommissionRate\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStatus\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIValidatorManager.ValidatorStatus\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getWeight\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint120\",\"internalType\":\"uint120\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getWithdrawAccount\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"inJail\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initCommissionChange\",\"inputs\":[{\"name\":\"newCommissionRate\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isActive\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"jailExpiresAt\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"nextValidator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"noSubmissionCount\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerValidator\",\"inputs\":[{\"name\":\"assets\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"commissionRate\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"withdrawAccount\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slash\",\"inputs\":[{\"name\":\"outputIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"winner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"loser\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"tryUnjail\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"force\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateValidatorTree\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"tryRemove\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"ChallengeRewardDistributed\",\"inputs\":[{\"name\":\"outputIndex\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint128\",\"indexed\":false,\"internalType\":\"uint128\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardDistributed\",\"inputs\":[{\"name\":\"outputIndex\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"validator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"validatorReward\",\"type\":\"uint128\",\"indexed\":false,\"internalType\":\"uint128\"},{\"name\":\"baseReward\",\"type\":\"uint128\",\"indexed\":false,\"internalType\":\"uint128\"},{\"name\":\"boostedReward\",\"type\":\"uint128\",\"indexed\":false,\"internalType\":\"uint128\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Slashed\",\"inputs\":[{\"name\":\"outputIndex\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"loser\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint128\",\"indexed\":false,\"internalType\":\"uint128\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorActivated\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"activatedAt\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorCommissionChangeFinalized\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldCommissionRate\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"},{\"name\":\"newCommissionRate\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorCommissionChangeInitiated\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldCommissionRate\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"},{\"name\":\"newCommissionRate\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorJailed\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"expiresAt\",\"type\":\"uint128\",\"indexed\":false,\"internalType\":\"uint128\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRegistered\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"activated\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"},{\"name\":\"commissionRate\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"},{\"name\":\"assets\",\"type\":\"uint128\",\"indexed\":false,\"internalType\":\"uint128\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorStopped\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"stopsAt\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorUnjailed\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"ImproperValidatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientAsset\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidConstructorParams\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxCommissionRateExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotAllowedCaller\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotElapsedCommissionChangeDelay\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotElapsedJailPeriod\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotSelectedPriorityValidator\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SameCommissionRate\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZeroAddress\",\"inputs\":[]}]", + Bin: "0x6101e06040523480156200001257600080fd5b50604051620052c8380380620052c8833981016040819052620000359162000171565b8061014001516001600160801b03168161012001516001600160801b031611156200007357604051631510b77f60e01b815260040160405180910390fd5b80516001600160a01b0390811660809081526020830151821660a0908152604084015190921660c0908152610120808501516001600160801b0390811660e09081526101408088015183166101009081526060890151841690945294870151821690945293850151841661016052908401518316610180529083015182166101a05290910151166101c05262000264565b60405161016081016001600160401b03811182821017156200013657634e487b7160e01b600052604160045260246000fd5b60405290565b80516001600160a01b03811681146200015457600080fd5b919050565b80516001600160801b03811681146200015457600080fd5b600061016082840312156200018557600080fd5b6200018f62000104565b6200019a836200013c565b8152620001aa602084016200013c565b6020820152620001bd604084016200013c565b6040820152620001d06060840162000159565b6060820152620001e36080840162000159565b6080820152620001f660a0840162000159565b60a08201526200020960c0840162000159565b60c08201526200021c60e0840162000159565b60e08201526101006200023181850162000159565b908201526101206200024584820162000159565b908201526101406200025984820162000159565b908201529392505050565b60805160a05160c05160e05161010051610120516101405161016051610180516101a0516101c051614ecc620003fc600039600081816103310152818161439d015281816143df01526146cc0152600081816107d1015261264d0152600081816103af0152612ba50152600081816105830152612eff0152600081816103d60152610f63015260008181610536015261187201526000818161066f01528181610a8c0152610d2001526000818161030a015281816108480152610c0b0152600081816103880152610fc00152600081816104a601528181610a0901528181610c3f01528181610d5401528181610df9015281816110dd01528181611b2701528181611d2d01528181611e6301528181612864015281816129a1015261464701526000818161028001528181610eca015281816111620152818161144e015281816118d40152818161196601528181611a1201528181611bfe01528181612442015281816124c80152818161254c015281816126d20152818161277901528181612afe01528181612ca00152612d540152614ecc6000f3fe608060405234801561001057600080fd5b50600436106102765760003560e01c8063970531c111610160578063b91b2723116100d8578063c2d9b6841161008c578063dff221b511610071578063dff221b514610769578063e0cc26a21461079a578063e7816b7f146107cc57600080fd5b8063c2d9b6841461071d578063cdff5e191461074c57600080fd5b8063be119347116100bd578063be119347146106b2578063be995dc2146106c5578063c26148fe146106d857600080fd5b8063b91b2723146102fd578063bde022bb1461069157600080fd5b8063a3433d071161012f578063ac6c525111610114578063ac6c5251146105a5578063af6ca7621461061a578063b2653fe31461066a57600080fd5b8063a3433d071461056b578063abeba4491461057e57600080fd5b8063970531c1146104e35780639d6b2e371461051e5780639e449b02146105315780639f8a13d71461055857600080fd5b80633ee4d4a3116101f357806356b65e97116101c25780636874e042116101a75780636874e042146104a1578063891aab74146104c8578063943e4005146104db57600080fd5b806356b65e97146104415780635bab847f1461048e57600080fd5b80633ee4d4a31461038357806342223ae9146103aa5780634cca5e6c146103d157806354fd4d50146103f857600080fd5b80631796e52e1161024a578063263a34021161022f578063263a34021461035357806330ccebb51461035b5780633a5490461461037b57600080fd5b80631796e52e1461030557806322009af61461032c57600080fd5b80621c2ff61461027b578063065643ea146102bf5780630763fa7e146102d4578063110d6069146102fd575b600080fd5b6102a27f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b6102d26102cd366004614a2e565b6107f3565b005b6102dc602881565b6040516fffffffffffffffffffffffffffffffff90911681526020016102b6565b6102dc606481565b6102dc7f000000000000000000000000000000000000000000000000000000000000000081565b6102dc7f000000000000000000000000000000000000000000000000000000000000000081565b6102d2610b20565b61036e610369366004614a77565b610bab565b6040516102b69190614ac3565b6102a2610eb4565b6102a27f000000000000000000000000000000000000000000000000000000000000000081565b6102dc7f000000000000000000000000000000000000000000000000000000000000000081565b6102dc7f000000000000000000000000000000000000000000000000000000000000000081565b6104346040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516102b69190614b04565b61047e61044f366004614a77565b6001600160a01b03166000908152600560205260409020546fffffffffffffffffffffffffffffffff16151590565b60405190151581526020016102b6565b6102d261049c366004614b85565b610fe2565b6102a27f000000000000000000000000000000000000000000000000000000000000000081565b6102d26104d6366004614a77565b611157565b6102d261126a565b6102dc6104f1366004614a77565b6001600160a01b03166000908152600560205260409020546fffffffffffffffffffffffffffffffff1690565b6102d261052c366004614b85565b6113e5565b6102dc7f000000000000000000000000000000000000000000000000000000000000000081565b61047e610566366004614a77565b61165c565b6102d2610579366004614bbe565b61168f565b6102dc7f000000000000000000000000000000000000000000000000000000000000000081565b6105fa6105b3366004614a77565b6001600160a01b031660009081526003602090815260408083205463ffffffff168352600290915290206001015461010090046effffffffffffffffffffffffffffff1690565b6040516effffffffffffffffffffffffffffff90911681526020016102b6565b6001805468010000000000000000900463ffffffff166000908152600260205260409020015470010000000000000000000000000000000090046effffffffffffffffffffffffffffff166105fa565b6102dc7f000000000000000000000000000000000000000000000000000000000000000081565b6106a461069f366004614a77565b611853565b6040519081526020016102b6565b6102d26106c0366004614bd9565b6118c9565b6102d26106d3366004614bf2565b611a10565b61070b6106e6366004614a77565b6001600160a01b03166000908152600460205260409020546301000000900460ff1690565b60405160ff90911681526020016102b6565b6102a261072b366004614a77565b6001600160a01b039081166000908152600460205260409020600101541690565b610754611e00565b60405163ffffffff90911681526020016102b6565b61070b610777366004614a77565b6001600160a01b0316600090815260046020526040902054610100900460ff1690565b61070b6107a8366004614a77565b6001600160a01b031660009081526004602052604090205462010000900460ff1690565b6102dc7f000000000000000000000000000000000000000000000000000000000000000081565b60006107fe33610bab565b600581111561080f5761080f614a94565b14610846576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006fffffffffffffffffffffffffffffffff16836fffffffffffffffffffffffffffffffff1610156108c4576040517f24f21b1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606460ff83161115610902576040517f406b265300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038116610942576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33600081815260046020819052604091829020805460017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff009091166201000060ff8916021781178255810180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038781169190911790915592517fd7f1a3d8000000000000000000000000000000000000000000000000000000008152918201939093526fffffffffffffffffffffffffffffffff861660248201527f00000000000000000000000000000000000000000000000000000000000000009091169063d7f1a3d8906044016020604051808303816000875af1158015610a54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a789190614c19565b506fffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811690851610801590610ac157610ac133611e25565b60408051821515815260ff861660208201526fffffffffffffffffffffffffffffffff871681830152905133917f36f43e5c63d19ec0a34168ec0838b5bfae77656b9f5b94b896e9d2172a41f4fe919081900360600190a25050505050565b6003610b2b33610bab565b6005811115610b3c57610b3c614a94565b141580610b695750336000908152600560205260409020546fffffffffffffffffffffffffffffffff1615155b15610ba0576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ba933611e25565b565b6001600160a01b03811660009081526004602052604081205460ff16610bd357506000919050565b6040517f981cee530000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301527f00000000000000000000000000000000000000000000000000000000000000006fffffffffffffffffffffffffffffffff16917f00000000000000000000000000000000000000000000000000000000000000009091169063981cee5390602401602060405180830381865afa158015610c88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cac9190614c19565b6fffffffffffffffffffffffffffffffff161015610ccc57506001919050565b6001600160a01b03828116600081815260036020526040908190205490517f12188543000000000000000000000000000000000000000000000000000000008152600481019290925263ffffffff161515917f00000000000000000000000000000000000000000000000000000000000000006fffffffffffffffffffffffffffffffff16917f000000000000000000000000000000000000000000000000000000000000000090911690631218854390602401602060405180830381865afa158015610d9d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dc19190614c19565b6040517f8abf0af00000000000000000000000000000000000000000000000000000000081526001600160a01b0386811660048301527f00000000000000000000000000000000000000000000000000000000000000001690638abf0af090602401602060405180830381865afa158015610e40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e649190614c19565b610e6e9190614c65565b6fffffffffffffffffffffffffffffffff161015610e9d5780610e945750600292915050565b50600492915050565b80610eab5750600392915050565b50600592915050565b600080546001600160a01b031615610fbd5760007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166380446bd26040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f26573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f4a9190614c96565b9050804210610fac576000610f5f8242614caf565b90507f00000000000000000000000000000000000000000000000000000000000000006fffffffffffffffffffffffffffffffff16811115610faa576001600160a01b039250505090565b505b50506000546001600160a01b031690565b507f000000000000000000000000000000000000000000000000000000000000000090565b6000610fed83610bab565b90508180156110285750600181600581111561100b5761100b614a94565b14806110285750600481600581111561102657611026614a94565b145b1561108657611038600184611f1d565b1561108157826001600160a01b03167fdee7e7274fb1911def379ceda542a2723358c99d6d1f89fcbdbe9e9d638d99614260405161107891815260200190565b60405180910390a25b505050565b600481600581111561109a5761109a614a94565b10611081576040517f8abf0af00000000000000000000000000000000000000000000000000000000081526001600160a01b0380851660048301526111519185917f00000000000000000000000000000000000000000000000000000000000000001690638abf0af090602401602060405180830381865afa158015611124573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111489190614c19565b600191906120c0565b50505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146111b9576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006111c3610eb4565b90506001600160a01b03808216148015906111f05750806001600160a01b0316826001600160a01b031614155b15611227576040517fc625317600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6112308261165c565b611266576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050565b600261127533610bab565b600581111561128657611286614a94565b10806112b25750336000908152600560205260409020546fffffffffffffffffffffffffffffffff1615155b156112e9576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6112f233611853565b42101561132b576040517f82225faf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360008181526004602090815260409182902080547fffffffffffffffffffffffff0000000000000000000000000000000000ffffff6301000000820460ff90811662010000818102939093167fffffffffffffffffffffffff000000000000000000000000000000000000ffff851617855586519290930416808252938101829052919492939092917fa40865ec905b139b9cdbd0566756b576b074c47d9dde9f62388b1d66d3e72a64910160405180910390a2505050565b6001600160a01b0382166000908152600560205260409020546fffffffffffffffffffffffffffffffff16611446576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b801561151d577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639e45e8f46040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114ce9190614cc6565b6001600160a01b0316336001600160a01b031614611518576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6115ce565b336001600160a01b0383161461155f576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038216600090815260056020526040902054426fffffffffffffffffffffffffffffffff90911611156115c5576040517f1dfc20f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6115ce826123d5565b6001600160a01b03821660008181526005602052604080822080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000169055517f9390b453426557da5ebdc31f19a37753ca04addf656d32f35232211bb2af3f199190a2600361163d83610bab565b600581111561164e5761164e614a94565b036112665761126682611e25565b6000600561166983610bab565b600581111561167a5761167a614a94565b0361168757506001919050565b506000919050565b600261169a33610bab565b60058111156116ab576116ab614a94565b10806116d75750336000908152600560205260409020546fffffffffffffffffffffffffffffffff1615155b1561170e576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336000908152600460205260409020606460ff8316111561175b576040517f406b265300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805460ff6201000090910481169083168190036117a4576040517f150393f200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81547fffffffffffffffffffffffff0000000000000000000000000000000000ffffff16630100000060ff8581169182027fffffffffffffffffffffffff00000000000000000000000000000000ffffffff1692909217640100000000426fffffffffffffffffffffffffffffffff1602178455604080519284168352602083019190915233917f9d9fe61047777339f4f4cb36a1f75ee90e3c6aa90c13abd3ffa07f6f86e0a3079101611078565b6001600160a01b0381166000908152600460205260408120546118b1907f00000000000000000000000000000000000000000000000000000000000000009064010000000090046fffffffffffffffffffffffffffffffff16614ce3565b6fffffffffffffffffffffffffffffffff1692915050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461192b576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61193361243d565b506040517fb0ea09a8000000000000000000000000000000000000000000000000000000008152600481018290526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b0ea09a890602401602060405180830381865afa1580156119b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119d99190614cc6565b6000549091506001600160a01b0390811690821603611a00576119fb816123d5565b611a08565b611a08612b78565b611266612c4d565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639e45e8f46040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a6e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a929190614cc6565b6001600160a01b0316336001600160a01b031614611adc576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f3ecf0ced0000000000000000000000000000000000000000000000000000000081526001600160a01b038281166004830152600060248301819052600160448401529182917f00000000000000000000000000000000000000000000000000000000000000001690633ecf0ced9060640160408051808303816000875af1158015611b6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b939190614d17565b90925090506001600160a01b038316857f1237821480ce4d75f917bc39d1641eb17a5e09a2d5bf982cdd8cb2561aa28e68611bce8486614ce3565b6040516fffffffffffffffffffffffffffffffff909116815260200160405180910390a3611bfb83612ee7565b847f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f403838d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c5a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c7e9190614c96565b11611cd657600085815260066020526040902080546fffffffffffffffffffffffffffffffff8082168401167fffffffffffffffffffffffffffffffff00000000000000000000000000000000909116179055611df9565b6040517f3ecf0ced0000000000000000000000000000000000000000000000000000000081526001600160a01b0385811660048301526fffffffffffffffffffffffffffffffff83166024830152600060448301527f00000000000000000000000000000000000000000000000000000000000000001690633ecf0ced9060640160408051808303816000875af1158015611d75573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d999190614d17565b5050611da6846000610fe2565b6040516fffffffffffffffffffffffffffffffff821681526001600160a01b0385169086907fd537f9e63e8da05cdb52f795e1c79d7b163e2517d5229375474dbe60b48cfa149060200160405180910390a35b5050505050565b600154600090611e209063ffffffff640100000000820481169116614d46565b905090565b6040517f8abf0af00000000000000000000000000000000000000000000000000000000081526001600160a01b038083166004830152611ed79183917f00000000000000000000000000000000000000000000000000000000000000001690638abf0af090602401602060405180830381865afa158015611eaa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ece9190614c19565b6001919061300a565b806001600160a01b03167ff33a24861b76047debce215c7ae4915a9befc5d870e97efbd4152df23c72112a42604051611f1291815260200190565b60405180910390a250565b6001600160a01b038116600090815260028301602052604081205463ffffffff16808203611f4f5760009150506120ba565b6001600160a01b03831660009081526002850160209081526040808320805463ffffffff1916905563ffffffff8481168452600180890190935292208054910154740100000000000000000000000000000000000000009091049091169061010090046effffffffffffffffffffffffffffff165b63ffffffff8216156120665763ffffffff91821660009081526001808801602052604090912090810180546effffffffffffffffffffffffffffff7001000000000000000000000000000000008083048216869003909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9091161790555474010000000000000000000000000000000000000000900490911690611fc4565b612070868461358f565b50508354600163ffffffff64010000000080840482168301909116027fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff9092169190911785559150505b92915050565b6001600160a01b038216600090815260028401602052604081205463ffffffff168082036120f25760009150506123ce565b63ffffffff80821660009081526001808801602052604090912090810180546effffffffffffffffffffffffffffff8781166101008181027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff85161790945593549290910416927401000000000000000000000000000000000000000090910416908210156122a25763ffffffff83166000908152600188810160205260409091200180547fff000000000000000000000000000000ffffffffffffffffffffffffffffffff8116848803700100000000000000000000000000000000928390046effffffffffffffffffffffffffffff908116820116909202179091555b63ffffffff8216156122925763ffffffff91821660009081526001808a01602052604090912090810180546effffffffffffffffffffffffffffff70010000000000000000000000000000000080830482168601909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff90911617905554740100000000000000000000000000000000000000009004909116906121f1565b5061229d8784613d1b565b6123c6565b63ffffffff83166000908152600188810160205260409091200180547fff000000000000000000000000000000ffffffffffffffffffffffffffffffff8116878503700100000000000000000000000000000000928390046effffffffffffffffffffffffffffff90811682900316909202179091555b63ffffffff8216156123bb5763ffffffff91821660009081526001808a01602052604090912090810180546effffffffffffffffffffffffffffff7001000000000000000000000000000000008083048216869003909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9091161790555474010000000000000000000000000000000000000000900490911690612319565b506123c68784613f27565b600193505050505b9392505050565b6001600160a01b038116600090815260046020526040902054610100900460ff161561243a576001600160a01b038116600090815260046020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1690555b50565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f403838d6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561249e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124c29190614c96565b905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166369f16eec6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612524573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125489190614c96565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156125a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125cc9190614cc6565b6001600160a01b031663ad36d6cc836040518263ffffffff1660e01b81526004016125f991815260200190565b602060405180830381865afa158015612616573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061263a9190614d63565b6126475760009250505090565b6000805b7f00000000000000000000000000000000000000000000000000000000000000006fffffffffffffffffffffffffffffffff16826fffffffffffffffffffffffffffffffff1610801561269e5750828411155b15612ab7576040517f33727c4d000000000000000000000000000000000000000000000000000000008152600481018590527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333727c4d90602401602060405180830381865afa158015612721573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127459190614d63565b15612ab7576040517fb0ea09a8000000000000000000000000000000000000000000000000000000008152600481018590527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b0ea09a890602401602060405180830381865afa1580156127c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127ec9190614cc6565b905060008060006127fc84614352565b6040517fad4294510000000000000000000000000000000000000000000000000000000081526001600160a01b0388811660048301526fffffffffffffffffffffffffffffffff858116602484015284811660448401528316606483015293965091945092507f00000000000000000000000000000000000000000000000000000000000000009091169063ad42945190608401600060405180830381600087803b1580156128aa57600080fd5b505af11580156128be573d6000803e3d6000fd5b5050604080516fffffffffffffffffffffffffffffffff8581168252878116602083015286168183015290516001600160a01b03881693508a92507fd74a44a8cd6c73740a70271e07ee96d8a495ff30037ae6381cbcdb8fe7f2a1ea9181900360600190a36000878152600660205260409020546fffffffffffffffffffffffffffffffff168015612a97576040517f3ecf0ced0000000000000000000000000000000000000000000000000000000081526001600160a01b0386811660048301526fffffffffffffffffffffffffffffffff83166024830152600060448301527f00000000000000000000000000000000000000000000000000000000000000001690633ecf0ced9060640160408051808303816000875af11580156129e9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a0d9190614d17565b505060008881526006602090815260409182902080547fffffffffffffffffffffffffffffffff0000000000000000000000000000000016905590516fffffffffffffffffffffffffffffffff831681526001600160a01b038716918a917fd537f9e63e8da05cdb52f795e1c79d7b163e2517d5229375474dbe60b48cfa14910160405180910390a35b612aa2856000610fe2565b8760010197508560010195505050505061264b565b6fffffffffffffffffffffffffffffffff821615612b6d576040517f9902cdc0000000000000000000000000000000000000000000000000000000008152600481018590527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690639902cdc090602401600060405180830381600087803b158015612b4a57600080fd5b505af1158015612b5e573d6000803e3d6000fd5b50505050600194505050505090565b600094505050505090565b6000546001600160a01b0316612b8a57565b600080546001600160a01b03168152600460205260409020547f00000000000000000000000000000000000000000000000000000000000000006fffffffffffffffffffffffffffffffff1661010090910460ff1610612bf957600054610ba9906001600160a01b0316612ee7565b600080546001600160a01b03168152600460205260409020805460ff6101008083048216600101909116027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116179055565b6001805468010000000000000000900463ffffffff1660009081526002602052604081209091015470010000000000000000000000000000000090046effffffffffffffffffffffffffffff16905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f403838d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612cfc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d209190614c96565b90506000826effffffffffffffffffffffffffffff16118015612d435750600081115b15612ebb5760006001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663a25ae557612d84600185614caf565b6040518263ffffffff1660e01b8152600401612da291815260200190565b608060405180830381865afa158015612dbf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612de39190614d80565b90506000838260200151434144600143612dfd9190614caf565b6040805160208101969096528501939093527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606092831b1691840191909152607483015240609482015260b4016040516020818303038152906040528051906020012060001c612e6e9190614e52565b9050612e7b60018261443b565b600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055506112669050565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555050565b6000612f256fffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001642614ea7565b6001600160a01b03831660008181526005602090815260409182902080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff8616908117909155915191825292935090917f95a398f2b6b2ad94f281708c97fe502386fc16adca43daed577a1e992a4cc814910160405180910390a2612fbe600183611f1d565b1561126657816001600160a01b03167fdee7e7274fb1911def379ceda542a2723358c99d6d1f89fcbdbe9e9d638d996142604051612ffe91815260200190565b60405180910390a25050565b60006040518060e00160405280846001600160a01b03168152602001600063ffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600115158152602001836effffffffffffffffffffffffffffff168152602001836effffffffffffffffffffffffffffff16815250905083600001600081819054906101000a900463ffffffff168092919060010191906101000a81548163ffffffff021916908363ffffffff1602179055505060008460000160009054906101000a900463ffffffff169050818560010160008363ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160000160146101000a81548163ffffffff021916908363ffffffff16021790555060408201518160000160186101000a81548163ffffffff021916908363ffffffff160217905550606082015181600001601c6101000a81548163ffffffff021916908363ffffffff16021790555060808201518160010160006101000a81548160ff02191690831515021790555060a08201518160010160016101000a8154816effffffffffffffffffffffffffffff02191690836effffffffffffffffffffffffffffff16021790555060c08201518160010160106101000a8154816effffffffffffffffffffffffffffff02191690836effffffffffffffffffffffffffffff16021790555090505080856002016000866001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508460000160089054906101000a900463ffffffff1663ffffffff166000036132e557845463ffffffff90911668010000000000000000027fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff90911617909355505050565b845468010000000000000000900463ffffffff165b63ffffffff808216600090815260018089016020526040822090810180546effffffffffffffffffffffffffffff70010000000000000000000000000000000080830482168b01909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff90911617905580549092600160c01b9091041690036134215763ffffffff838116600081815260018a016020526040902080547fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000938616939093029290921790915581547fffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffff16600160c01b9091021781556134188784613d1b565b50505050505050565b8054600160e01b900463ffffffff166000036134f75763ffffffff838116600081815260018a8101602052604090912080547fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000948716949094029390931783559190910180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905581547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16600160e01b9091021781556134188784613d1b565b805463ffffffff600160e01b8204811660009081526001808b016020526040808320820154600160c01b909504909316825291902001546effffffffffffffffffffffffffffff70010000000000000000000000000000000092839004811692909104161115613577578054600160e01b900463ffffffff169150613589565b8054600160c01b900463ffffffff1691505b506132fa565b63ffffffff8082166000908152600184016020526040812080549092600160c01b909104169003613872578054600160e01b900463ffffffff1660000361372157805474010000000000000000000000000000000000000000900463ffffffff166000036136225782547fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff1683556136dd565b600181015460ff161561368a57805474010000000000000000000000000000000000000000900463ffffffff166000908152600184016020526040902080547fffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffff1690556136dd565b805474010000000000000000000000000000000000000000900463ffffffff166000908152600184016020526040902080547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690555b5063ffffffff1660009081526001918201602052604081209081550180547fff00000000000000000000000000000000000000000000000000000000000000169055565b805463ffffffff600160e01b80830482166000908152600180880160209081526040808420547fffffffffffffffffffffffff00000000000000000000000000000000000000009097166001600160a01b0397881617808955859004861684528084208084018054948a0180546effffffffffffffffffffffffffffff6101009788900481169097027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff8216811783559254700100000000000000000000000000000000908190049097169096027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9092167fff000000000000000000000000000000000000000000000000000000000000ff9096169590951717909355915490951682526002880190945292909220805494821663ffffffff199095169490941790935581540490911690613d15565b8054600160e01b900463ffffffff166000036139d957805463ffffffff600160c01b80830482166000908152600180880160209081526040808420547fffffffffffffffffffffffff00000000000000000000000000000000000000009097166001600160a01b0397881617808955859004861684528084208084018054948a0180546effffffffffffffffffffffffffffff6101009788900481169097027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff8216811783559254700100000000000000000000000000000000908190049097169096027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9092167fff000000000000000000000000000000000000000000000000000000000000ff9096169590951717909355915490951682526002880190945292909220805494821663ffffffff199095169490941790935581540490911690613d15565b805463ffffffff600160e01b82048116600090815260018087016020526040808320820154600160c01b909504909316825291902001546effffffffffffffffffffffffffffff61010092839004811692909104161115613ba757805463ffffffff600160c01b80830482166000908152600180880160209081526040808420547fffffffffffffffffffffffff00000000000000000000000000000000000000009097166001600160a01b03978816178089558581048716855281852080850180548b870180546effffffffffffffffffffffffffffff6101009384900481169093027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff821681178355600160e01b9096048c168a52868a20909801549254700100000000000000000000000000000000908190048316938190048316939093019091169091027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9093167fff000000000000000000000000000000000000000000000000000000000000ff9096169590951791909117909355915490951682526002880190945292909220805494821663ffffffff199095169490941790935581540490911690613d15565b805463ffffffff600160e01b80830482166000908152600180880160209081526040808420547fffffffffffffffffffffffff00000000000000000000000000000000000000009097166001600160a01b03978816178089558581048716855281852080850180548b870180546effffffffffffffffffffffffffffff6101009384900481169093027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff8216811783559354600160c01b9096048c168a52868a2090980154700100000000000000000000000000000000908190048316958190048316959095019091169093027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9091167fff000000000000000000000000000000000000000000000000000000000000ff90961695909517949094179055915490951682526002880190945292909220805494821663ffffffff1990951694909417909355815404909116905b5061358f565b63ffffffff80821660009081526001840160205260408082208054740100000000000000000000000000000000000000009004909316825290205b815474010000000000000000000000000000000000000000900463ffffffff1615801590613da95750600180820154908301546effffffffffffffffffffffffffffff6101009283900481169290910416115b1561115157815481547fffffffffffffffffffffffff00000000000000000000000000000000000000008083166001600160a01b03928316178555835416918116919091178255600180840180548483018054610100908190046effffffffffffffffffffffffffffff9081168083027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff80871691909117875584549584900483169384029516949094179092558354929003700100000000000000000000000000000000808404831691909103909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9091161790558354821660009081526002870160209081526040808320805463ffffffff998a1663ffffffff199182161790915587549654909516835280832080549095167401000000000000000000000000000000000000000096879004891617909455945484900486168082529187019094528184208054939093049094168352909120613d56565b5b63ffffffff8082166000908152600180850160205260408083208054600160e01b810486168552828520840154600160c01b90910490951684529220015490916effffffffffffffffffffffffffffff61010091829004811691909204909116111561417057600180820154825463ffffffff600160c01b90910416600090815285830160205260409020909101546effffffffffffffffffffffffffffff6101009283900481169290910416111561108157805463ffffffff600160c01b80830482166000908152600187810160208181526040808520547fffffffffffffffffffffffff0000000000000000000000000000000000000000808a166001600160a01b0392831617808c558890048916875282872080549091169982169990991790985583890180548a548890048916875282872086018054610100908190046effffffffffffffffffffffffffffff9081168083027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff80871691909117909655835494839004821692830294909516939093179091558b548990048a168852838820909601805496909203700100000000000000000000000000000000808804831691909103909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9095169490941790935587548716845260028a0180825283852080549a881663ffffffff199b8c1617905588548690048716808652928252838520549097168452959095529020805490951690921790935590540416613f28565b600180820154825463ffffffff600160e01b90910416600090815285830160205260409020909101546effffffffffffffffffffffffffffff6101009283900481169290910416111561108157805463ffffffff600160e01b80830482166000908152600187810160208181526040808520547fffffffffffffffffffffffff0000000000000000000000000000000000000000808a166001600160a01b0392831617808c558890048916875282872080549091169982169990991790985583890180548a548890048916875282872086018054610100908190046effffffffffffffffffffffffffffff9081168083027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff80871691909117909655835494839004821692830294909516939093179091558b548990048a168852838820909601805496909203700100000000000000000000000000000000808804831691909103909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9095169490941790935587548716845260028a0180825283852080549a881663ffffffff199b8c1617905588548690048716808652928252838520549097168452959095529020805490951690921790935590540416613f28565b6001600160a01b0381166000908152600460205260408120548190819062010000900460ff16816143828661460a565b90506000806143c76fffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000850116856064614740565b905061440a6fffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016606486810390614740565b915061442d6fffffffffffffffffffffffffffffffff8416606486810390614740565b919891975095509350505050565b815460009068010000000000000000900463ffffffff165b63ffffffff80821660009081526001808701602052604080832054600160c01b9004909316825291902001546effffffffffffffffffffffffffffff8085167001000000000000000000000000000000009092041611156144d45763ffffffff9081166000908152600185016020526040902054600160c01b900416614453565b63ffffffff8181166000818152600187810160205260408083208054600160c01b9004909516835282208101549290915291909101547001000000000000000000000000000000009091046effffffffffffffffffffffffffffff9081169094039384811661010090920416111561456d5763ffffffff1660009081526001840160205260409020546001600160a01b031690506120ba565b63ffffffff818116600090815260018681016020526040808320808301549054600160e01b9004909416835290912001546101009091046effffffffffffffffffffffffffffff908116909403938481167001000000000000000000000000000000009092041611156146005763ffffffff9081166000908152600185016020526040902054600160e01b900416614453565b60009150506120ba565b6040517f913f1a9f0000000000000000000000000000000000000000000000000000000081526001600160a01b03828116600483015260009182917f0000000000000000000000000000000000000000000000000000000000000000169063913f1a9f90602401602060405180830381865afa15801561468e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906146b29190614c19565b905060006146f56fffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001660286064614740565b9050614738816fffffffffffffffffffffffffffffffff1665010000000000614731856fffffffffffffffffffffffffffffffff1660646147f4565b91906148bb565b949350505050565b6000838302608081901c6fffffffffffffffffffffffffffffffff8416116147c9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f55696e743132384d6174683a206d756c446976206f766572666c6f770000000060448201526064015b60405180910390fd5b826fffffffffffffffffffffffffffffffff1681816147ea576147ea614e23565b0495945050505050565b600080838310801561480d57600181146148205761482f565b650100000000008502849004915061482f565b65010000000000840285900491505b506402ef6c3406818002602890811c808402821c808202831c808302841c808402851c938402851c95909502841c641da06a6e33909502841c6455232d2bb2909202841c640d4ca0c283909302841c643177d95571909102841c64fffe4bcada90960290931c94909401919091010391909103039050818311156120ba576501921fb544430392915050565b600080807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff858709858702925082811083820303915050806000036149135783828161490957614909614e23565b04925050506123ce565b80841161497c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d6174683a206d756c446976206f766572666c6f77000000000000000000000060448201526064016147c0565b60008486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091026000889003889004909101858311909403939093029303949094049190911702949350505050565b6fffffffffffffffffffffffffffffffff8116811461243a57600080fd5b803560ff81168114614a1457600080fd5b919050565b6001600160a01b038116811461243a57600080fd5b600080600060608486031215614a4357600080fd5b8335614a4e816149e5565b9250614a5c60208501614a03565b91506040840135614a6c81614a19565b809150509250925092565b600060208284031215614a8957600080fd5b81356123ce81614a19565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6020810160068310614afe577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b600060208083528351808285015260005b81811015614b3157858101830151858201604001528201614b15565b81811115614b43576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b801515811461243a57600080fd5b60008060408385031215614b9857600080fd5b8235614ba381614a19565b91506020830135614bb381614b77565b809150509250929050565b600060208284031215614bd057600080fd5b6123ce82614a03565b600060208284031215614beb57600080fd5b5035919050565b600080600060608486031215614c0757600080fd5b833592506020840135614a5c81614a19565b600060208284031215614c2b57600080fd5b81516123ce816149e5565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006fffffffffffffffffffffffffffffffff83811690831681811015614c8e57614c8e614c36565b039392505050565b600060208284031215614ca857600080fd5b5051919050565b600082821015614cc157614cc1614c36565b500390565b600060208284031215614cd857600080fd5b81516123ce81614a19565b60006fffffffffffffffffffffffffffffffff808316818516808303821115614d0e57614d0e614c36565b01949350505050565b60008060408385031215614d2a57600080fd5b8251614d35816149e5565b6020840151909250614bb3816149e5565b600063ffffffff83811690831681811015614c8e57614c8e614c36565b600060208284031215614d7557600080fd5b81516123ce81614b77565b600060808284031215614d9257600080fd5b6040516080810181811067ffffffffffffffff82111715614ddc577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040528251614dea81614a19565b8152602083810151908201526040830151614e04816149e5565b60408201526060830151614e17816149e5565b60608201529392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006effffffffffffffffffffffffffffff80841680614e9b577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b92169190910692915050565b60008219821115614eba57614eba614c36565b50019056fea164736f6c634300080f000a", } // ValidatorManagerABI is the input ABI used to generate the binding from. @@ -341,12 +341,12 @@ func (_ValidatorManager *ValidatorManagerCallerSession) BOOSTEDREWARDNUMERATOR() return _ValidatorManager.Contract.BOOSTEDREWARDNUMERATOR(&_ValidatorManager.CallOpts) } -// COMMISSIONRATEDENOM is a free data retrieval call binding the contract method 0xb91b2723. +// COMMISSIONCHANGEDELAYSECONDS is a free data retrieval call binding the contract method 0x9e449b02. // -// Solidity: function COMMISSION_RATE_DENOM() view returns(uint128) -func (_ValidatorManager *ValidatorManagerCaller) COMMISSIONRATEDENOM(opts *bind.CallOpts) (*big.Int, error) { +// Solidity: function COMMISSION_CHANGE_DELAY_SECONDS() view returns(uint128) +func (_ValidatorManager *ValidatorManagerCaller) COMMISSIONCHANGEDELAYSECONDS(opts *bind.CallOpts) (*big.Int, error) { var out []interface{} - err := _ValidatorManager.contract.Call(opts, &out, "COMMISSION_RATE_DENOM") + err := _ValidatorManager.contract.Call(opts, &out, "COMMISSION_CHANGE_DELAY_SECONDS") if err != nil { return *new(*big.Int), err @@ -358,26 +358,26 @@ func (_ValidatorManager *ValidatorManagerCaller) COMMISSIONRATEDENOM(opts *bind. } -// COMMISSIONRATEDENOM is a free data retrieval call binding the contract method 0xb91b2723. +// COMMISSIONCHANGEDELAYSECONDS is a free data retrieval call binding the contract method 0x9e449b02. // -// Solidity: function COMMISSION_RATE_DENOM() view returns(uint128) -func (_ValidatorManager *ValidatorManagerSession) COMMISSIONRATEDENOM() (*big.Int, error) { - return _ValidatorManager.Contract.COMMISSIONRATEDENOM(&_ValidatorManager.CallOpts) +// Solidity: function COMMISSION_CHANGE_DELAY_SECONDS() view returns(uint128) +func (_ValidatorManager *ValidatorManagerSession) COMMISSIONCHANGEDELAYSECONDS() (*big.Int, error) { + return _ValidatorManager.Contract.COMMISSIONCHANGEDELAYSECONDS(&_ValidatorManager.CallOpts) } -// COMMISSIONRATEDENOM is a free data retrieval call binding the contract method 0xb91b2723. +// COMMISSIONCHANGEDELAYSECONDS is a free data retrieval call binding the contract method 0x9e449b02. // -// Solidity: function COMMISSION_RATE_DENOM() view returns(uint128) -func (_ValidatorManager *ValidatorManagerCallerSession) COMMISSIONRATEDENOM() (*big.Int, error) { - return _ValidatorManager.Contract.COMMISSIONRATEDENOM(&_ValidatorManager.CallOpts) +// Solidity: function COMMISSION_CHANGE_DELAY_SECONDS() view returns(uint128) +func (_ValidatorManager *ValidatorManagerCallerSession) COMMISSIONCHANGEDELAYSECONDS() (*big.Int, error) { + return _ValidatorManager.Contract.COMMISSIONCHANGEDELAYSECONDS(&_ValidatorManager.CallOpts) } -// COMMISSIONRATEMINCHANGESECONDS is a free data retrieval call binding the contract method 0xdea15254. +// COMMISSIONRATEDENOM is a free data retrieval call binding the contract method 0xb91b2723. // -// Solidity: function COMMISSION_RATE_MIN_CHANGE_SECONDS() view returns(uint128) -func (_ValidatorManager *ValidatorManagerCaller) COMMISSIONRATEMINCHANGESECONDS(opts *bind.CallOpts) (*big.Int, error) { +// Solidity: function COMMISSION_RATE_DENOM() view returns(uint128) +func (_ValidatorManager *ValidatorManagerCaller) COMMISSIONRATEDENOM(opts *bind.CallOpts) (*big.Int, error) { var out []interface{} - err := _ValidatorManager.contract.Call(opts, &out, "COMMISSION_RATE_MIN_CHANGE_SECONDS") + err := _ValidatorManager.contract.Call(opts, &out, "COMMISSION_RATE_DENOM") if err != nil { return *new(*big.Int), err @@ -389,18 +389,18 @@ func (_ValidatorManager *ValidatorManagerCaller) COMMISSIONRATEMINCHANGESECONDS( } -// COMMISSIONRATEMINCHANGESECONDS is a free data retrieval call binding the contract method 0xdea15254. +// COMMISSIONRATEDENOM is a free data retrieval call binding the contract method 0xb91b2723. // -// Solidity: function COMMISSION_RATE_MIN_CHANGE_SECONDS() view returns(uint128) -func (_ValidatorManager *ValidatorManagerSession) COMMISSIONRATEMINCHANGESECONDS() (*big.Int, error) { - return _ValidatorManager.Contract.COMMISSIONRATEMINCHANGESECONDS(&_ValidatorManager.CallOpts) +// Solidity: function COMMISSION_RATE_DENOM() view returns(uint128) +func (_ValidatorManager *ValidatorManagerSession) COMMISSIONRATEDENOM() (*big.Int, error) { + return _ValidatorManager.Contract.COMMISSIONRATEDENOM(&_ValidatorManager.CallOpts) } -// COMMISSIONRATEMINCHANGESECONDS is a free data retrieval call binding the contract method 0xdea15254. +// COMMISSIONRATEDENOM is a free data retrieval call binding the contract method 0xb91b2723. // -// Solidity: function COMMISSION_RATE_MIN_CHANGE_SECONDS() view returns(uint128) -func (_ValidatorManager *ValidatorManagerCallerSession) COMMISSIONRATEMINCHANGESECONDS() (*big.Int, error) { - return _ValidatorManager.Contract.COMMISSIONRATEMINCHANGESECONDS(&_ValidatorManager.CallOpts) +// Solidity: function COMMISSION_RATE_DENOM() view returns(uint128) +func (_ValidatorManager *ValidatorManagerCallerSession) COMMISSIONRATEDENOM() (*big.Int, error) { + return _ValidatorManager.Contract.COMMISSIONRATEDENOM(&_ValidatorManager.CallOpts) } // JAILPERIODSECONDS is a free data retrieval call binding the contract method 0xabeba449. @@ -713,6 +713,37 @@ func (_ValidatorManager *ValidatorManagerCallerSession) ActivatedValidatorTotalW return _ValidatorManager.Contract.ActivatedValidatorTotalWeight(&_ValidatorManager.CallOpts) } +// CanFinalizeCommissionChangeAt is a free data retrieval call binding the contract method 0xbde022bb. +// +// Solidity: function canFinalizeCommissionChangeAt(address validator) view returns(uint256) +func (_ValidatorManager *ValidatorManagerCaller) CanFinalizeCommissionChangeAt(opts *bind.CallOpts, validator common.Address) (*big.Int, error) { + var out []interface{} + err := _ValidatorManager.contract.Call(opts, &out, "canFinalizeCommissionChangeAt", validator) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// CanFinalizeCommissionChangeAt is a free data retrieval call binding the contract method 0xbde022bb. +// +// Solidity: function canFinalizeCommissionChangeAt(address validator) view returns(uint256) +func (_ValidatorManager *ValidatorManagerSession) CanFinalizeCommissionChangeAt(validator common.Address) (*big.Int, error) { + return _ValidatorManager.Contract.CanFinalizeCommissionChangeAt(&_ValidatorManager.CallOpts, validator) +} + +// CanFinalizeCommissionChangeAt is a free data retrieval call binding the contract method 0xbde022bb. +// +// Solidity: function canFinalizeCommissionChangeAt(address validator) view returns(uint256) +func (_ValidatorManager *ValidatorManagerCallerSession) CanFinalizeCommissionChangeAt(validator common.Address) (*big.Int, error) { + return _ValidatorManager.Contract.CanFinalizeCommissionChangeAt(&_ValidatorManager.CallOpts, validator) +} + // CheckSubmissionEligibility is a free data retrieval call binding the contract method 0x891aab74. // // Solidity: function checkSubmissionEligibility(address validator) view returns() @@ -742,12 +773,12 @@ func (_ValidatorManager *ValidatorManagerCallerSession) CheckSubmissionEligibili return _ValidatorManager.Contract.CheckSubmissionEligibility(&_ValidatorManager.CallOpts, validator) } -// GetCommissionMaxChangeRate is a free data retrieval call binding the contract method 0xb9551f82. +// GetCommissionRate is a free data retrieval call binding the contract method 0xe0cc26a2. // -// Solidity: function getCommissionMaxChangeRate(address validator) view returns(uint8) -func (_ValidatorManager *ValidatorManagerCaller) GetCommissionMaxChangeRate(opts *bind.CallOpts, validator common.Address) (uint8, error) { +// Solidity: function getCommissionRate(address validator) view returns(uint8) +func (_ValidatorManager *ValidatorManagerCaller) GetCommissionRate(opts *bind.CallOpts, validator common.Address) (uint8, error) { var out []interface{} - err := _ValidatorManager.contract.Call(opts, &out, "getCommissionMaxChangeRate", validator) + err := _ValidatorManager.contract.Call(opts, &out, "getCommissionRate", validator) if err != nil { return *new(uint8), err @@ -759,26 +790,26 @@ func (_ValidatorManager *ValidatorManagerCaller) GetCommissionMaxChangeRate(opts } -// GetCommissionMaxChangeRate is a free data retrieval call binding the contract method 0xb9551f82. +// GetCommissionRate is a free data retrieval call binding the contract method 0xe0cc26a2. // -// Solidity: function getCommissionMaxChangeRate(address validator) view returns(uint8) -func (_ValidatorManager *ValidatorManagerSession) GetCommissionMaxChangeRate(validator common.Address) (uint8, error) { - return _ValidatorManager.Contract.GetCommissionMaxChangeRate(&_ValidatorManager.CallOpts, validator) +// Solidity: function getCommissionRate(address validator) view returns(uint8) +func (_ValidatorManager *ValidatorManagerSession) GetCommissionRate(validator common.Address) (uint8, error) { + return _ValidatorManager.Contract.GetCommissionRate(&_ValidatorManager.CallOpts, validator) } -// GetCommissionMaxChangeRate is a free data retrieval call binding the contract method 0xb9551f82. +// GetCommissionRate is a free data retrieval call binding the contract method 0xe0cc26a2. // -// Solidity: function getCommissionMaxChangeRate(address validator) view returns(uint8) -func (_ValidatorManager *ValidatorManagerCallerSession) GetCommissionMaxChangeRate(validator common.Address) (uint8, error) { - return _ValidatorManager.Contract.GetCommissionMaxChangeRate(&_ValidatorManager.CallOpts, validator) +// Solidity: function getCommissionRate(address validator) view returns(uint8) +func (_ValidatorManager *ValidatorManagerCallerSession) GetCommissionRate(validator common.Address) (uint8, error) { + return _ValidatorManager.Contract.GetCommissionRate(&_ValidatorManager.CallOpts, validator) } -// GetCommissionRate is a free data retrieval call binding the contract method 0xe0cc26a2. +// GetPendingCommissionRate is a free data retrieval call binding the contract method 0xc26148fe. // -// Solidity: function getCommissionRate(address validator) view returns(uint8) -func (_ValidatorManager *ValidatorManagerCaller) GetCommissionRate(opts *bind.CallOpts, validator common.Address) (uint8, error) { +// Solidity: function getPendingCommissionRate(address validator) view returns(uint8) +func (_ValidatorManager *ValidatorManagerCaller) GetPendingCommissionRate(opts *bind.CallOpts, validator common.Address) (uint8, error) { var out []interface{} - err := _ValidatorManager.contract.Call(opts, &out, "getCommissionRate", validator) + err := _ValidatorManager.contract.Call(opts, &out, "getPendingCommissionRate", validator) if err != nil { return *new(uint8), err @@ -790,18 +821,18 @@ func (_ValidatorManager *ValidatorManagerCaller) GetCommissionRate(opts *bind.Ca } -// GetCommissionRate is a free data retrieval call binding the contract method 0xe0cc26a2. +// GetPendingCommissionRate is a free data retrieval call binding the contract method 0xc26148fe. // -// Solidity: function getCommissionRate(address validator) view returns(uint8) -func (_ValidatorManager *ValidatorManagerSession) GetCommissionRate(validator common.Address) (uint8, error) { - return _ValidatorManager.Contract.GetCommissionRate(&_ValidatorManager.CallOpts, validator) +// Solidity: function getPendingCommissionRate(address validator) view returns(uint8) +func (_ValidatorManager *ValidatorManagerSession) GetPendingCommissionRate(validator common.Address) (uint8, error) { + return _ValidatorManager.Contract.GetPendingCommissionRate(&_ValidatorManager.CallOpts, validator) } -// GetCommissionRate is a free data retrieval call binding the contract method 0xe0cc26a2. +// GetPendingCommissionRate is a free data retrieval call binding the contract method 0xc26148fe. // -// Solidity: function getCommissionRate(address validator) view returns(uint8) -func (_ValidatorManager *ValidatorManagerCallerSession) GetCommissionRate(validator common.Address) (uint8, error) { - return _ValidatorManager.Contract.GetCommissionRate(&_ValidatorManager.CallOpts, validator) +// Solidity: function getPendingCommissionRate(address validator) view returns(uint8) +func (_ValidatorManager *ValidatorManagerCallerSession) GetPendingCommissionRate(validator common.Address) (uint8, error) { + return _ValidatorManager.Contract.GetPendingCommissionRate(&_ValidatorManager.CallOpts, validator) } // GetStatus is a free data retrieval call binding the contract method 0x30ccebb5. @@ -1125,46 +1156,67 @@ func (_ValidatorManager *ValidatorManagerTransactorSession) AfterSubmitL2Output( return _ValidatorManager.Contract.AfterSubmitL2Output(&_ValidatorManager.TransactOpts, outputIndex) } -// ChangeCommissionRate is a paid mutator transaction binding the contract method 0x88576dc9. +// FinalizeCommissionChange is a paid mutator transaction binding the contract method 0x943e4005. +// +// Solidity: function finalizeCommissionChange() returns() +func (_ValidatorManager *ValidatorManagerTransactor) FinalizeCommissionChange(opts *bind.TransactOpts) (*types.Transaction, error) { + return _ValidatorManager.contract.Transact(opts, "finalizeCommissionChange") +} + +// FinalizeCommissionChange is a paid mutator transaction binding the contract method 0x943e4005. +// +// Solidity: function finalizeCommissionChange() returns() +func (_ValidatorManager *ValidatorManagerSession) FinalizeCommissionChange() (*types.Transaction, error) { + return _ValidatorManager.Contract.FinalizeCommissionChange(&_ValidatorManager.TransactOpts) +} + +// FinalizeCommissionChange is a paid mutator transaction binding the contract method 0x943e4005. // -// Solidity: function changeCommissionRate(uint8 newCommissionRate) returns() -func (_ValidatorManager *ValidatorManagerTransactor) ChangeCommissionRate(opts *bind.TransactOpts, newCommissionRate uint8) (*types.Transaction, error) { - return _ValidatorManager.contract.Transact(opts, "changeCommissionRate", newCommissionRate) +// Solidity: function finalizeCommissionChange() returns() +func (_ValidatorManager *ValidatorManagerTransactorSession) FinalizeCommissionChange() (*types.Transaction, error) { + return _ValidatorManager.Contract.FinalizeCommissionChange(&_ValidatorManager.TransactOpts) } -// ChangeCommissionRate is a paid mutator transaction binding the contract method 0x88576dc9. +// InitCommissionChange is a paid mutator transaction binding the contract method 0xa3433d07. // -// Solidity: function changeCommissionRate(uint8 newCommissionRate) returns() -func (_ValidatorManager *ValidatorManagerSession) ChangeCommissionRate(newCommissionRate uint8) (*types.Transaction, error) { - return _ValidatorManager.Contract.ChangeCommissionRate(&_ValidatorManager.TransactOpts, newCommissionRate) +// Solidity: function initCommissionChange(uint8 newCommissionRate) returns() +func (_ValidatorManager *ValidatorManagerTransactor) InitCommissionChange(opts *bind.TransactOpts, newCommissionRate uint8) (*types.Transaction, error) { + return _ValidatorManager.contract.Transact(opts, "initCommissionChange", newCommissionRate) } -// ChangeCommissionRate is a paid mutator transaction binding the contract method 0x88576dc9. +// InitCommissionChange is a paid mutator transaction binding the contract method 0xa3433d07. // -// Solidity: function changeCommissionRate(uint8 newCommissionRate) returns() -func (_ValidatorManager *ValidatorManagerTransactorSession) ChangeCommissionRate(newCommissionRate uint8) (*types.Transaction, error) { - return _ValidatorManager.Contract.ChangeCommissionRate(&_ValidatorManager.TransactOpts, newCommissionRate) +// Solidity: function initCommissionChange(uint8 newCommissionRate) returns() +func (_ValidatorManager *ValidatorManagerSession) InitCommissionChange(newCommissionRate uint8) (*types.Transaction, error) { + return _ValidatorManager.Contract.InitCommissionChange(&_ValidatorManager.TransactOpts, newCommissionRate) } -// RegisterValidator is a paid mutator transaction binding the contract method 0xc5398584. +// InitCommissionChange is a paid mutator transaction binding the contract method 0xa3433d07. // -// Solidity: function registerValidator(uint128 assets, uint8 commissionRate, uint8 commissionMaxChangeRate, address withdrawAccount) returns() -func (_ValidatorManager *ValidatorManagerTransactor) RegisterValidator(opts *bind.TransactOpts, assets *big.Int, commissionRate uint8, commissionMaxChangeRate uint8, withdrawAccount common.Address) (*types.Transaction, error) { - return _ValidatorManager.contract.Transact(opts, "registerValidator", assets, commissionRate, commissionMaxChangeRate, withdrawAccount) +// Solidity: function initCommissionChange(uint8 newCommissionRate) returns() +func (_ValidatorManager *ValidatorManagerTransactorSession) InitCommissionChange(newCommissionRate uint8) (*types.Transaction, error) { + return _ValidatorManager.Contract.InitCommissionChange(&_ValidatorManager.TransactOpts, newCommissionRate) } -// RegisterValidator is a paid mutator transaction binding the contract method 0xc5398584. +// RegisterValidator is a paid mutator transaction binding the contract method 0x065643ea. // -// Solidity: function registerValidator(uint128 assets, uint8 commissionRate, uint8 commissionMaxChangeRate, address withdrawAccount) returns() -func (_ValidatorManager *ValidatorManagerSession) RegisterValidator(assets *big.Int, commissionRate uint8, commissionMaxChangeRate uint8, withdrawAccount common.Address) (*types.Transaction, error) { - return _ValidatorManager.Contract.RegisterValidator(&_ValidatorManager.TransactOpts, assets, commissionRate, commissionMaxChangeRate, withdrawAccount) +// Solidity: function registerValidator(uint128 assets, uint8 commissionRate, address withdrawAccount) returns() +func (_ValidatorManager *ValidatorManagerTransactor) RegisterValidator(opts *bind.TransactOpts, assets *big.Int, commissionRate uint8, withdrawAccount common.Address) (*types.Transaction, error) { + return _ValidatorManager.contract.Transact(opts, "registerValidator", assets, commissionRate, withdrawAccount) } -// RegisterValidator is a paid mutator transaction binding the contract method 0xc5398584. +// RegisterValidator is a paid mutator transaction binding the contract method 0x065643ea. // -// Solidity: function registerValidator(uint128 assets, uint8 commissionRate, uint8 commissionMaxChangeRate, address withdrawAccount) returns() -func (_ValidatorManager *ValidatorManagerTransactorSession) RegisterValidator(assets *big.Int, commissionRate uint8, commissionMaxChangeRate uint8, withdrawAccount common.Address) (*types.Transaction, error) { - return _ValidatorManager.Contract.RegisterValidator(&_ValidatorManager.TransactOpts, assets, commissionRate, commissionMaxChangeRate, withdrawAccount) +// Solidity: function registerValidator(uint128 assets, uint8 commissionRate, address withdrawAccount) returns() +func (_ValidatorManager *ValidatorManagerSession) RegisterValidator(assets *big.Int, commissionRate uint8, withdrawAccount common.Address) (*types.Transaction, error) { + return _ValidatorManager.Contract.RegisterValidator(&_ValidatorManager.TransactOpts, assets, commissionRate, withdrawAccount) +} + +// RegisterValidator is a paid mutator transaction binding the contract method 0x065643ea. +// +// Solidity: function registerValidator(uint128 assets, uint8 commissionRate, address withdrawAccount) returns() +func (_ValidatorManager *ValidatorManagerTransactorSession) RegisterValidator(assets *big.Int, commissionRate uint8, withdrawAccount common.Address) (*types.Transaction, error) { + return _ValidatorManager.Contract.RegisterValidator(&_ValidatorManager.TransactOpts, assets, commissionRate, withdrawAccount) } // Slash is a paid mutator transaction binding the contract method 0xbe995dc2. @@ -1839,9 +1891,155 @@ func (_ValidatorManager *ValidatorManagerFilterer) ParseValidatorActivated(log t return event, nil } -// ValidatorManagerValidatorCommissionRateChangedIterator is returned from FilterValidatorCommissionRateChanged and is used to iterate over the raw logs and unpacked data for ValidatorCommissionRateChanged events raised by the ValidatorManager contract. -type ValidatorManagerValidatorCommissionRateChangedIterator struct { - Event *ValidatorManagerValidatorCommissionRateChanged // Event containing the contract specifics and raw log +// ValidatorManagerValidatorCommissionChangeFinalizedIterator is returned from FilterValidatorCommissionChangeFinalized and is used to iterate over the raw logs and unpacked data for ValidatorCommissionChangeFinalized events raised by the ValidatorManager contract. +type ValidatorManagerValidatorCommissionChangeFinalizedIterator struct { + Event *ValidatorManagerValidatorCommissionChangeFinalized // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ValidatorManagerValidatorCommissionChangeFinalizedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ValidatorManagerValidatorCommissionChangeFinalized) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ValidatorManagerValidatorCommissionChangeFinalized) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ValidatorManagerValidatorCommissionChangeFinalizedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ValidatorManagerValidatorCommissionChangeFinalizedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ValidatorManagerValidatorCommissionChangeFinalized represents a ValidatorCommissionChangeFinalized event raised by the ValidatorManager contract. +type ValidatorManagerValidatorCommissionChangeFinalized struct { + Validator common.Address + OldCommissionRate uint8 + NewCommissionRate uint8 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterValidatorCommissionChangeFinalized is a free log retrieval operation binding the contract event 0xa40865ec905b139b9cdbd0566756b576b074c47d9dde9f62388b1d66d3e72a64. +// +// Solidity: event ValidatorCommissionChangeFinalized(address indexed validator, uint8 oldCommissionRate, uint8 newCommissionRate) +func (_ValidatorManager *ValidatorManagerFilterer) FilterValidatorCommissionChangeFinalized(opts *bind.FilterOpts, validator []common.Address) (*ValidatorManagerValidatorCommissionChangeFinalizedIterator, error) { + + var validatorRule []interface{} + for _, validatorItem := range validator { + validatorRule = append(validatorRule, validatorItem) + } + + logs, sub, err := _ValidatorManager.contract.FilterLogs(opts, "ValidatorCommissionChangeFinalized", validatorRule) + if err != nil { + return nil, err + } + return &ValidatorManagerValidatorCommissionChangeFinalizedIterator{contract: _ValidatorManager.contract, event: "ValidatorCommissionChangeFinalized", logs: logs, sub: sub}, nil +} + +// WatchValidatorCommissionChangeFinalized is a free log subscription operation binding the contract event 0xa40865ec905b139b9cdbd0566756b576b074c47d9dde9f62388b1d66d3e72a64. +// +// Solidity: event ValidatorCommissionChangeFinalized(address indexed validator, uint8 oldCommissionRate, uint8 newCommissionRate) +func (_ValidatorManager *ValidatorManagerFilterer) WatchValidatorCommissionChangeFinalized(opts *bind.WatchOpts, sink chan<- *ValidatorManagerValidatorCommissionChangeFinalized, validator []common.Address) (event.Subscription, error) { + + var validatorRule []interface{} + for _, validatorItem := range validator { + validatorRule = append(validatorRule, validatorItem) + } + + logs, sub, err := _ValidatorManager.contract.WatchLogs(opts, "ValidatorCommissionChangeFinalized", validatorRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ValidatorManagerValidatorCommissionChangeFinalized) + if err := _ValidatorManager.contract.UnpackLog(event, "ValidatorCommissionChangeFinalized", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseValidatorCommissionChangeFinalized is a log parse operation binding the contract event 0xa40865ec905b139b9cdbd0566756b576b074c47d9dde9f62388b1d66d3e72a64. +// +// Solidity: event ValidatorCommissionChangeFinalized(address indexed validator, uint8 oldCommissionRate, uint8 newCommissionRate) +func (_ValidatorManager *ValidatorManagerFilterer) ParseValidatorCommissionChangeFinalized(log types.Log) (*ValidatorManagerValidatorCommissionChangeFinalized, error) { + event := new(ValidatorManagerValidatorCommissionChangeFinalized) + if err := _ValidatorManager.contract.UnpackLog(event, "ValidatorCommissionChangeFinalized", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ValidatorManagerValidatorCommissionChangeInitiatedIterator is returned from FilterValidatorCommissionChangeInitiated and is used to iterate over the raw logs and unpacked data for ValidatorCommissionChangeInitiated events raised by the ValidatorManager contract. +type ValidatorManagerValidatorCommissionChangeInitiatedIterator struct { + Event *ValidatorManagerValidatorCommissionChangeInitiated // Event containing the contract specifics and raw log contract *bind.BoundContract // Generic contract to use for unpacking event data event string // Event name to use for unpacking event data @@ -1855,7 +2053,7 @@ type ValidatorManagerValidatorCommissionRateChangedIterator struct { // Next advances the iterator to the subsequent event, returning whether there // are any more events found. In case of a retrieval or parsing error, false is // returned and Error() can be queried for the exact failure. -func (it *ValidatorManagerValidatorCommissionRateChangedIterator) Next() bool { +func (it *ValidatorManagerValidatorCommissionChangeInitiatedIterator) Next() bool { // If the iterator failed, stop iterating if it.fail != nil { return false @@ -1864,7 +2062,7 @@ func (it *ValidatorManagerValidatorCommissionRateChangedIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(ValidatorManagerValidatorCommissionRateChanged) + it.Event = new(ValidatorManagerValidatorCommissionChangeInitiated) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1879,7 +2077,7 @@ func (it *ValidatorManagerValidatorCommissionRateChangedIterator) Next() bool { // Iterator still in progress, wait for either a data or an error event select { case log := <-it.logs: - it.Event = new(ValidatorManagerValidatorCommissionRateChanged) + it.Event = new(ValidatorManagerValidatorCommissionChangeInitiated) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1895,53 +2093,53 @@ func (it *ValidatorManagerValidatorCommissionRateChangedIterator) Next() bool { } // Error returns any retrieval or parsing error occurred during filtering. -func (it *ValidatorManagerValidatorCommissionRateChangedIterator) Error() error { +func (it *ValidatorManagerValidatorCommissionChangeInitiatedIterator) Error() error { return it.fail } // Close terminates the iteration process, releasing any pending underlying // resources. -func (it *ValidatorManagerValidatorCommissionRateChangedIterator) Close() error { +func (it *ValidatorManagerValidatorCommissionChangeInitiatedIterator) Close() error { it.sub.Unsubscribe() return nil } -// ValidatorManagerValidatorCommissionRateChanged represents a ValidatorCommissionRateChanged event raised by the ValidatorManager contract. -type ValidatorManagerValidatorCommissionRateChanged struct { +// ValidatorManagerValidatorCommissionChangeInitiated represents a ValidatorCommissionChangeInitiated event raised by the ValidatorManager contract. +type ValidatorManagerValidatorCommissionChangeInitiated struct { Validator common.Address OldCommissionRate uint8 NewCommissionRate uint8 Raw types.Log // Blockchain specific contextual infos } -// FilterValidatorCommissionRateChanged is a free log retrieval operation binding the contract event 0xc0b29b9b824f7a62d93fde5832bb8307fd62594d0a08d96d533407a0a147ec48. +// FilterValidatorCommissionChangeInitiated is a free log retrieval operation binding the contract event 0x9d9fe61047777339f4f4cb36a1f75ee90e3c6aa90c13abd3ffa07f6f86e0a307. // -// Solidity: event ValidatorCommissionRateChanged(address indexed validator, uint8 oldCommissionRate, uint8 newCommissionRate) -func (_ValidatorManager *ValidatorManagerFilterer) FilterValidatorCommissionRateChanged(opts *bind.FilterOpts, validator []common.Address) (*ValidatorManagerValidatorCommissionRateChangedIterator, error) { +// Solidity: event ValidatorCommissionChangeInitiated(address indexed validator, uint8 oldCommissionRate, uint8 newCommissionRate) +func (_ValidatorManager *ValidatorManagerFilterer) FilterValidatorCommissionChangeInitiated(opts *bind.FilterOpts, validator []common.Address) (*ValidatorManagerValidatorCommissionChangeInitiatedIterator, error) { var validatorRule []interface{} for _, validatorItem := range validator { validatorRule = append(validatorRule, validatorItem) } - logs, sub, err := _ValidatorManager.contract.FilterLogs(opts, "ValidatorCommissionRateChanged", validatorRule) + logs, sub, err := _ValidatorManager.contract.FilterLogs(opts, "ValidatorCommissionChangeInitiated", validatorRule) if err != nil { return nil, err } - return &ValidatorManagerValidatorCommissionRateChangedIterator{contract: _ValidatorManager.contract, event: "ValidatorCommissionRateChanged", logs: logs, sub: sub}, nil + return &ValidatorManagerValidatorCommissionChangeInitiatedIterator{contract: _ValidatorManager.contract, event: "ValidatorCommissionChangeInitiated", logs: logs, sub: sub}, nil } -// WatchValidatorCommissionRateChanged is a free log subscription operation binding the contract event 0xc0b29b9b824f7a62d93fde5832bb8307fd62594d0a08d96d533407a0a147ec48. +// WatchValidatorCommissionChangeInitiated is a free log subscription operation binding the contract event 0x9d9fe61047777339f4f4cb36a1f75ee90e3c6aa90c13abd3ffa07f6f86e0a307. // -// Solidity: event ValidatorCommissionRateChanged(address indexed validator, uint8 oldCommissionRate, uint8 newCommissionRate) -func (_ValidatorManager *ValidatorManagerFilterer) WatchValidatorCommissionRateChanged(opts *bind.WatchOpts, sink chan<- *ValidatorManagerValidatorCommissionRateChanged, validator []common.Address) (event.Subscription, error) { +// Solidity: event ValidatorCommissionChangeInitiated(address indexed validator, uint8 oldCommissionRate, uint8 newCommissionRate) +func (_ValidatorManager *ValidatorManagerFilterer) WatchValidatorCommissionChangeInitiated(opts *bind.WatchOpts, sink chan<- *ValidatorManagerValidatorCommissionChangeInitiated, validator []common.Address) (event.Subscription, error) { var validatorRule []interface{} for _, validatorItem := range validator { validatorRule = append(validatorRule, validatorItem) } - logs, sub, err := _ValidatorManager.contract.WatchLogs(opts, "ValidatorCommissionRateChanged", validatorRule) + logs, sub, err := _ValidatorManager.contract.WatchLogs(opts, "ValidatorCommissionChangeInitiated", validatorRule) if err != nil { return nil, err } @@ -1951,8 +2149,8 @@ func (_ValidatorManager *ValidatorManagerFilterer) WatchValidatorCommissionRateC select { case log := <-logs: // New log arrived, parse the event and forward to the user - event := new(ValidatorManagerValidatorCommissionRateChanged) - if err := _ValidatorManager.contract.UnpackLog(event, "ValidatorCommissionRateChanged", log); err != nil { + event := new(ValidatorManagerValidatorCommissionChangeInitiated) + if err := _ValidatorManager.contract.UnpackLog(event, "ValidatorCommissionChangeInitiated", log); err != nil { return err } event.Raw = log @@ -1973,12 +2171,12 @@ func (_ValidatorManager *ValidatorManagerFilterer) WatchValidatorCommissionRateC }), nil } -// ParseValidatorCommissionRateChanged is a log parse operation binding the contract event 0xc0b29b9b824f7a62d93fde5832bb8307fd62594d0a08d96d533407a0a147ec48. +// ParseValidatorCommissionChangeInitiated is a log parse operation binding the contract event 0x9d9fe61047777339f4f4cb36a1f75ee90e3c6aa90c13abd3ffa07f6f86e0a307. // -// Solidity: event ValidatorCommissionRateChanged(address indexed validator, uint8 oldCommissionRate, uint8 newCommissionRate) -func (_ValidatorManager *ValidatorManagerFilterer) ParseValidatorCommissionRateChanged(log types.Log) (*ValidatorManagerValidatorCommissionRateChanged, error) { - event := new(ValidatorManagerValidatorCommissionRateChanged) - if err := _ValidatorManager.contract.UnpackLog(event, "ValidatorCommissionRateChanged", log); err != nil { +// Solidity: event ValidatorCommissionChangeInitiated(address indexed validator, uint8 oldCommissionRate, uint8 newCommissionRate) +func (_ValidatorManager *ValidatorManagerFilterer) ParseValidatorCommissionChangeInitiated(log types.Log) (*ValidatorManagerValidatorCommissionChangeInitiated, error) { + event := new(ValidatorManagerValidatorCommissionChangeInitiated) + if err := _ValidatorManager.contract.UnpackLog(event, "ValidatorCommissionChangeInitiated", log); err != nil { return nil, err } event.Raw = log @@ -2199,17 +2397,16 @@ func (it *ValidatorManagerValidatorRegisteredIterator) Close() error { // ValidatorManagerValidatorRegistered represents a ValidatorRegistered event raised by the ValidatorManager contract. type ValidatorManagerValidatorRegistered struct { - Validator common.Address - Activated bool - CommissionRate uint8 - CommissionMaxChangeRate uint8 - Assets *big.Int - Raw types.Log // Blockchain specific contextual infos + Validator common.Address + Activated bool + CommissionRate uint8 + Assets *big.Int + Raw types.Log // Blockchain specific contextual infos } -// FilterValidatorRegistered is a free log retrieval operation binding the contract event 0x04ba0c4d7cbac9138f7b73ec9fef796e4ad320bf5fb204f080f81fd59c2d48b9. +// FilterValidatorRegistered is a free log retrieval operation binding the contract event 0x36f43e5c63d19ec0a34168ec0838b5bfae77656b9f5b94b896e9d2172a41f4fe. // -// Solidity: event ValidatorRegistered(address indexed validator, bool activated, uint8 commissionRate, uint8 commissionMaxChangeRate, uint128 assets) +// Solidity: event ValidatorRegistered(address indexed validator, bool activated, uint8 commissionRate, uint128 assets) func (_ValidatorManager *ValidatorManagerFilterer) FilterValidatorRegistered(opts *bind.FilterOpts, validator []common.Address) (*ValidatorManagerValidatorRegisteredIterator, error) { var validatorRule []interface{} @@ -2224,9 +2421,9 @@ func (_ValidatorManager *ValidatorManagerFilterer) FilterValidatorRegistered(opt return &ValidatorManagerValidatorRegisteredIterator{contract: _ValidatorManager.contract, event: "ValidatorRegistered", logs: logs, sub: sub}, nil } -// WatchValidatorRegistered is a free log subscription operation binding the contract event 0x04ba0c4d7cbac9138f7b73ec9fef796e4ad320bf5fb204f080f81fd59c2d48b9. +// WatchValidatorRegistered is a free log subscription operation binding the contract event 0x36f43e5c63d19ec0a34168ec0838b5bfae77656b9f5b94b896e9d2172a41f4fe. // -// Solidity: event ValidatorRegistered(address indexed validator, bool activated, uint8 commissionRate, uint8 commissionMaxChangeRate, uint128 assets) +// Solidity: event ValidatorRegistered(address indexed validator, bool activated, uint8 commissionRate, uint128 assets) func (_ValidatorManager *ValidatorManagerFilterer) WatchValidatorRegistered(opts *bind.WatchOpts, sink chan<- *ValidatorManagerValidatorRegistered, validator []common.Address) (event.Subscription, error) { var validatorRule []interface{} @@ -2266,9 +2463,9 @@ func (_ValidatorManager *ValidatorManagerFilterer) WatchValidatorRegistered(opts }), nil } -// ParseValidatorRegistered is a log parse operation binding the contract event 0x04ba0c4d7cbac9138f7b73ec9fef796e4ad320bf5fb204f080f81fd59c2d48b9. +// ParseValidatorRegistered is a log parse operation binding the contract event 0x36f43e5c63d19ec0a34168ec0838b5bfae77656b9f5b94b896e9d2172a41f4fe. // -// Solidity: event ValidatorRegistered(address indexed validator, bool activated, uint8 commissionRate, uint8 commissionMaxChangeRate, uint128 assets) +// Solidity: event ValidatorRegistered(address indexed validator, bool activated, uint8 commissionRate, uint128 assets) func (_ValidatorManager *ValidatorManagerFilterer) ParseValidatorRegistered(log types.Log) (*ValidatorManagerValidatorRegistered, error) { event := new(ValidatorManagerValidatorRegistered) if err := _ValidatorManager.contract.UnpackLog(event, "ValidatorRegistered", log); err != nil { diff --git a/kroma-bindings/bindings/validatormanager_more.go b/kroma-bindings/bindings/validatormanager_more.go index 11da0b213..42688e3d7 100644 --- a/kroma-bindings/bindings/validatormanager_more.go +++ b/kroma-bindings/bindings/validatormanager_more.go @@ -13,7 +13,8 @@ const ValidatorManagerStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contr var ValidatorManagerStorageLayout = new(solc.StorageLayout) -var ValidatorManagerDeployedBin = "0x608060405234801561001057600080fd5b50600436106102405760003560e01c8063970531c111610145578063be119347116100bd578063cdff5e191161008c578063dff221b511610071578063dff221b51461070a578063e0cc26a21461073b578063e7816b7f1461076d57600080fd5b8063cdff5e19146106c6578063dea15254146106e357600080fd5b8063be1193471461065e578063be995dc214610671578063c2d9b68414610684578063c5398584146106b357600080fd5b8063ac6c525111610114578063b2653fe3116100f9578063b2653fe3146105f2578063b91b2723146102b2578063b9551f821461061957600080fd5b8063ac6c52511461052d578063af6ca762146105a257600080fd5b8063970531c1146104a55780639d6b2e37146104e05780639f8a13d7146104f3578063abeba4491461050657600080fd5b80633ee4d4a3116101d857806356b65e97116101a75780636874e0421161018c5780636874e0421461045857806388576dc91461047f578063891aab741461049257600080fd5b806356b65e97146103f85780635bab847f1461044557600080fd5b80633ee4d4a31461033a57806342223ae9146103615780634cca5e6c1461038857806354fd4d50146103af57600080fd5b806322009af61161021457806322009af6146102e1578063263a34021461030857806330ccebb5146103125780633a5490461461033257600080fd5b80621c2ff6146102455780630763fa7e14610289578063110d6069146102b25780631796e52e146102ba575b600080fd5b61026c7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b610291602881565b6040516fffffffffffffffffffffffffffffffff9091168152602001610280565b610291606481565b6102917f000000000000000000000000000000000000000000000000000000000000000081565b6102917f000000000000000000000000000000000000000000000000000000000000000081565b610310610794565b005b61032561032036600461496b565b61081f565b60405161028091906149b7565b61026c610b28565b61026c7f000000000000000000000000000000000000000000000000000000000000000081565b6102917f000000000000000000000000000000000000000000000000000000000000000081565b6102917f000000000000000000000000000000000000000000000000000000000000000081565b6103eb6040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b60405161028091906149f8565b61043561040636600461496b565b6001600160a01b03166000908152600560205260409020546fffffffffffffffffffffffffffffffff16151590565b6040519015158152602001610280565b610310610453366004614a79565b610c56565b61026c7f000000000000000000000000000000000000000000000000000000000000000081565b61031061048d366004614ac8565b610dcb565b6103106104a036600461496b565b61109e565b6102916104b336600461496b565b6001600160a01b03166000908152600560205260409020546fffffffffffffffffffffffffffffffff1690565b6103106104ee366004614a79565b6111b1565b61043561050136600461496b565b611428565b6102917f000000000000000000000000000000000000000000000000000000000000000081565b61058261053b36600461496b565b6001600160a01b031660009081526003602090815260408083205463ffffffff168352600290915290206001015461010090046effffffffffffffffffffffffffffff1690565b6040516effffffffffffffffffffffffffffff9091168152602001610280565b6001805468010000000000000000900463ffffffff166000908152600260205260409020015470010000000000000000000000000000000090046effffffffffffffffffffffffffffff16610582565b6102917f000000000000000000000000000000000000000000000000000000000000000081565b61064c61062736600461496b565b6001600160a01b03166000908152600460205260409020546301000000900460ff1690565b60405160ff9091168152602001610280565b61031061066c366004614ae3565b61145b565b61031061067f366004614afc565b6115a2565b61026c61069236600461496b565b6001600160a01b039081166000908152600460205260409020600101541690565b6103106106c1366004614b5c565b611992565b6106ce611d71565b60405163ffffffff9091168152602001610280565b6102917f000000000000000000000000000000000000000000000000000000000000000081565b61064c61071836600461496b565b6001600160a01b0316600090815260046020526040902054610100900460ff1690565b61064c61074936600461496b565b6001600160a01b031660009081526004602052604090205462010000900460ff1690565b6102917f000000000000000000000000000000000000000000000000000000000000000081565b600361079f3361081f565b60058111156107b0576107b0614988565b1415806107dd5750336000908152600560205260409020546fffffffffffffffffffffffffffffffff1615155b15610814576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61081d33611d96565b565b6001600160a01b03811660009081526004602052604081205460ff1661084757506000919050565b6040517f981cee530000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301527f00000000000000000000000000000000000000000000000000000000000000006fffffffffffffffffffffffffffffffff16917f00000000000000000000000000000000000000000000000000000000000000009091169063981cee5390602401602060405180830381865afa1580156108fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109209190614bb4565b6fffffffffffffffffffffffffffffffff16101561094057506001919050565b6001600160a01b03828116600081815260036020526040908190205490517f12188543000000000000000000000000000000000000000000000000000000008152600481019290925263ffffffff161515917f00000000000000000000000000000000000000000000000000000000000000006fffffffffffffffffffffffffffffffff16917f000000000000000000000000000000000000000000000000000000000000000090911690631218854390602401602060405180830381865afa158015610a11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a359190614bb4565b6040517f8abf0af00000000000000000000000000000000000000000000000000000000081526001600160a01b0386811660048301527f00000000000000000000000000000000000000000000000000000000000000001690638abf0af090602401602060405180830381865afa158015610ab4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ad89190614bb4565b610ae29190614c00565b6fffffffffffffffffffffffffffffffff161015610b115780610b085750600292915050565b50600492915050565b80610b1f5750600392915050565b50600592915050565b600080546001600160a01b031615610c315760007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166380446bd26040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b9a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bbe9190614c31565b9050804210610c20576000610bd38242614c4a565b90507f00000000000000000000000000000000000000000000000000000000000000006fffffffffffffffffffffffffffffffff16811115610c1e576001600160a01b039250505090565b505b50506000546001600160a01b031690565b507f000000000000000000000000000000000000000000000000000000000000000090565b6000610c618361081f565b9050818015610c9c57506001816005811115610c7f57610c7f614988565b1480610c9c57506004816005811115610c9a57610c9a614988565b145b15610cfa57610cac600184611e8e565b15610cf557826001600160a01b03167fdee7e7274fb1911def379ceda542a2723358c99d6d1f89fcbdbe9e9d638d996142604051610cec91815260200190565b60405180910390a25b505050565b6004816005811115610d0e57610d0e614988565b10610cf5576040517f8abf0af00000000000000000000000000000000000000000000000000000000081526001600160a01b038085166004830152610dc59185917f00000000000000000000000000000000000000000000000000000000000000001690638abf0af090602401602060405180830381865afa158015610d98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dbc9190614bb4565b60019190612031565b50505050565b6002610dd63361081f565b6005811115610de757610de7614988565b1080610e135750336000908152600560205260409020546fffffffffffffffffffffffffffffffff1615155b15610e4a576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33600090815260046020526040902080544290610ea2907f00000000000000000000000000000000000000000000000000000000000000009064010000000090046fffffffffffffffffffffffffffffffff16614c61565b6fffffffffffffffffffffffffffffffff161115610eec576040517f7d7a4d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606460ff83161115610f2a576040517f406b265300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805460ff620100009091048116908316819003610f73576040517f150393f200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008160ff168460ff1611610f9157610f8c8483614c95565b610f9b565b610f9b8285614c95565b835490915060ff630100000090910481169082161115610fe7576040517f9ed4fa4a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82547fffffffffffffffffffffffff00000000000000000000000000000000ff00ffff166201000060ff8681169182027fffffffffffffffffffffffff00000000000000000000000000000000ffffffff1692909217640100000000426fffffffffffffffffffffffffffffffff1602178555604080519285168352602083019190915233917fc0b29b9b824f7a62d93fde5832bb8307fd62594d0a08d96d533407a0a147ec48910160405180910390a250505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611100576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061110a610b28565b90506001600160a01b03808216148015906111375750806001600160a01b0316826001600160a01b031614155b1561116e576040517fc625317600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61117782611428565b6111ad576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050565b6001600160a01b0382166000908152600560205260409020546fffffffffffffffffffffffffffffffff16611212576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80156112e9577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639e45e8f46040518163ffffffff1660e01b8152600401602060405180830381865afa158015611276573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061129a9190614cb8565b6001600160a01b0316336001600160a01b0316146112e4576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61139a565b336001600160a01b0383161461132b576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038216600090815260056020526040902054426fffffffffffffffffffffffffffffffff9091161115611391576040517f1dfc20f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61139a82612346565b6001600160a01b03821660008181526005602052604080822080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000169055517f9390b453426557da5ebdc31f19a37753ca04addf656d32f35232211bb2af3f199190a260036114098361081f565b600581111561141a5761141a614988565b036111ad576111ad82611d96565b600060056114358361081f565b600581111561144657611446614988565b0361145357506001919050565b506000919050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146114bd576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6114c56123ae565b506040517fb0ea09a8000000000000000000000000000000000000000000000000000000008152600481018290526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b0ea09a890602401602060405180830381865afa158015611547573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061156b9190614cb8565b6000549091506001600160a01b03908116908216036115925761158d81612346565b61159a565b61159a612ae9565b6111ad612bbe565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639e45e8f46040518163ffffffff1660e01b8152600401602060405180830381865afa158015611600573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116249190614cb8565b6001600160a01b0316336001600160a01b03161461166e576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f3ecf0ced0000000000000000000000000000000000000000000000000000000081526001600160a01b038281166004830152600060248301819052600160448401529182917f00000000000000000000000000000000000000000000000000000000000000001690633ecf0ced9060640160408051808303816000875af1158015611701573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117259190614cd5565b90925090506001600160a01b038316857f1237821480ce4d75f917bc39d1641eb17a5e09a2d5bf982cdd8cb2561aa28e686117608486614c61565b6040516fffffffffffffffffffffffffffffffff909116815260200160405180910390a361178d83612e58565b847f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f403838d6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118109190614c31565b1161186857600085815260066020526040902080546fffffffffffffffffffffffffffffffff8082168401167fffffffffffffffffffffffffffffffff0000000000000000000000000000000090911617905561198b565b6040517f3ecf0ced0000000000000000000000000000000000000000000000000000000081526001600160a01b0385811660048301526fffffffffffffffffffffffffffffffff83166024830152600060448301527f00000000000000000000000000000000000000000000000000000000000000001690633ecf0ced9060640160408051808303816000875af1158015611907573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061192b9190614cd5565b5050611938846000610c56565b6040516fffffffffffffffffffffffffffffffff821681526001600160a01b0385169086907fd537f9e63e8da05cdb52f795e1c79d7b163e2517d5229375474dbe60b48cfa149060200160405180910390a35b5050505050565b600061199d3361081f565b60058111156119ae576119ae614988565b146119e5576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006fffffffffffffffffffffffffffffffff16846fffffffffffffffffffffffffffffffff161015611a63576040517f24f21b1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606460ff84161115611aa1576040517f406b265300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606460ff83161115611adf576040517f4143808b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038116611b1f576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360008181526004602081905260409182902080546fffffffffffffffffffffffffffffffff428116640100000000027fffffffffffffffffffffffff00000000000000000000000000000000ffffffff60ff8a8116630100000002919091167fffffffffffffffffffffffff0000000000000000000000000000000000ffffff918c1662010000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff00909516949094176001908117919091169390931717835590820180546001600160a01b038881167fffffffffffffffffffffffff00000000000000000000000000000000000000009092169190911790915593517fd7f1a3d80000000000000000000000000000000000000000000000000000000081529283019490945292871660248201527f00000000000000000000000000000000000000000000000000000000000000009091169063d7f1a3d8906044016020604051808303816000875af1158015611c9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cc09190614bb4565b506fffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811690861610801590611d0957611d0933611d96565b60408051821515815260ff87811660208301528616818301526fffffffffffffffffffffffffffffffff88166060820152905133917f04ba0c4d7cbac9138f7b73ec9fef796e4ad320bf5fb204f080f81fd59c2d48b9919081900360800190a2505050505050565b600154600090611d919063ffffffff640100000000820481169116614d04565b905090565b6040517f8abf0af00000000000000000000000000000000000000000000000000000000081526001600160a01b038083166004830152611e489183917f00000000000000000000000000000000000000000000000000000000000000001690638abf0af090602401602060405180830381865afa158015611e1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e3f9190614bb4565b60019190612f7b565b806001600160a01b03167ff33a24861b76047debce215c7ae4915a9befc5d870e97efbd4152df23c72112a42604051611e8391815260200190565b60405180910390a250565b6001600160a01b038116600090815260028301602052604081205463ffffffff16808203611ec057600091505061202b565b6001600160a01b03831660009081526002850160209081526040808320805463ffffffff1916905563ffffffff8481168452600180890190935292208054910154740100000000000000000000000000000000000000009091049091169061010090046effffffffffffffffffffffffffffff165b63ffffffff821615611fd75763ffffffff91821660009081526001808801602052604090912090810180546effffffffffffffffffffffffffffff7001000000000000000000000000000000008083048216869003909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9091161790555474010000000000000000000000000000000000000000900490911690611f35565b611fe18684613500565b50508354600163ffffffff64010000000080840482168301909116027fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff9092169190911785559150505b92915050565b6001600160a01b038216600090815260028401602052604081205463ffffffff1680820361206357600091505061233f565b63ffffffff80821660009081526001808801602052604090912090810180546effffffffffffffffffffffffffffff8781166101008181027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff85161790945593549290910416927401000000000000000000000000000000000000000090910416908210156122135763ffffffff83166000908152600188810160205260409091200180547fff000000000000000000000000000000ffffffffffffffffffffffffffffffff8116848803700100000000000000000000000000000000928390046effffffffffffffffffffffffffffff908116820116909202179091555b63ffffffff8216156122035763ffffffff91821660009081526001808a01602052604090912090810180546effffffffffffffffffffffffffffff70010000000000000000000000000000000080830482168601909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9091161790555474010000000000000000000000000000000000000000900490911690612162565b5061220e8784613c8c565b612337565b63ffffffff83166000908152600188810160205260409091200180547fff000000000000000000000000000000ffffffffffffffffffffffffffffffff8116878503700100000000000000000000000000000000928390046effffffffffffffffffffffffffffff90811682900316909202179091555b63ffffffff82161561232c5763ffffffff91821660009081526001808a01602052604090912090810180546effffffffffffffffffffffffffffff7001000000000000000000000000000000008083048216869003909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff909116179055547401000000000000000000000000000000000000000090049091169061228a565b506123378784613e98565b600193505050505b9392505050565b6001600160a01b038116600090815260046020526040902054610100900460ff16156123ab576001600160a01b038116600090815260046020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1690555b50565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f403838d6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561240f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124339190614c31565b905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166369f16eec6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612495573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124b99190614c31565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612519573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061253d9190614cb8565b6001600160a01b031663ad36d6cc836040518263ffffffff1660e01b815260040161256a91815260200190565b602060405180830381865afa158015612587573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125ab9190614d21565b6125b85760009250505090565b6000805b7f00000000000000000000000000000000000000000000000000000000000000006fffffffffffffffffffffffffffffffff16826fffffffffffffffffffffffffffffffff1610801561260f5750828411155b15612a28576040517f33727c4d000000000000000000000000000000000000000000000000000000008152600481018590527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333727c4d90602401602060405180830381865afa158015612692573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126b69190614d21565b15612a28576040517fb0ea09a8000000000000000000000000000000000000000000000000000000008152600481018590527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b0ea09a890602401602060405180830381865afa158015612739573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061275d9190614cb8565b9050600080600061276d846142c3565b6040517fad4294510000000000000000000000000000000000000000000000000000000081526001600160a01b0388811660048301526fffffffffffffffffffffffffffffffff858116602484015284811660448401528316606483015293965091945092507f00000000000000000000000000000000000000000000000000000000000000009091169063ad42945190608401600060405180830381600087803b15801561281b57600080fd5b505af115801561282f573d6000803e3d6000fd5b5050604080516fffffffffffffffffffffffffffffffff8581168252878116602083015286168183015290516001600160a01b03881693508a92507fd74a44a8cd6c73740a70271e07ee96d8a495ff30037ae6381cbcdb8fe7f2a1ea9181900360600190a36000878152600660205260409020546fffffffffffffffffffffffffffffffff168015612a08576040517f3ecf0ced0000000000000000000000000000000000000000000000000000000081526001600160a01b0386811660048301526fffffffffffffffffffffffffffffffff83166024830152600060448301527f00000000000000000000000000000000000000000000000000000000000000001690633ecf0ced9060640160408051808303816000875af115801561295a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061297e9190614cd5565b505060008881526006602090815260409182902080547fffffffffffffffffffffffffffffffff0000000000000000000000000000000016905590516fffffffffffffffffffffffffffffffff831681526001600160a01b038716918a917fd537f9e63e8da05cdb52f795e1c79d7b163e2517d5229375474dbe60b48cfa14910160405180910390a35b612a13856000610c56565b876001019750856001019550505050506125bc565b6fffffffffffffffffffffffffffffffff821615612ade576040517f9902cdc0000000000000000000000000000000000000000000000000000000008152600481018590527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690639902cdc090602401600060405180830381600087803b158015612abb57600080fd5b505af1158015612acf573d6000803e3d6000fd5b50505050600194505050505090565b600094505050505090565b6000546001600160a01b0316612afb57565b600080546001600160a01b03168152600460205260409020547f00000000000000000000000000000000000000000000000000000000000000006fffffffffffffffffffffffffffffffff1661010090910460ff1610612b6a5760005461081d906001600160a01b0316612e58565b600080546001600160a01b03168152600460205260409020805460ff6101008083048216600101909116027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116179055565b6001805468010000000000000000900463ffffffff1660009081526002602052604081209091015470010000000000000000000000000000000090046effffffffffffffffffffffffffffff16905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f403838d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612c6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c919190614c31565b90506000826effffffffffffffffffffffffffffff16118015612cb45750600081115b15612e2c5760006001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663a25ae557612cf5600185614c4a565b6040518263ffffffff1660e01b8152600401612d1391815260200190565b608060405180830381865afa158015612d30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d549190614d3e565b90506000838260200151434144600143612d6e9190614c4a565b6040805160208101969096528501939093527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606092831b1691840191909152607483015240609482015260b4016040516020818303038152906040528051906020012060001c612ddf9190614e10565b9050612dec6001826143ac565b600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055506111ad9050565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555050565b6000612e966fffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001642614e65565b6001600160a01b03831660008181526005602090815260409182902080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff8616908117909155915191825292935090917f95a398f2b6b2ad94f281708c97fe502386fc16adca43daed577a1e992a4cc814910160405180910390a2612f2f600183611e8e565b156111ad57816001600160a01b03167fdee7e7274fb1911def379ceda542a2723358c99d6d1f89fcbdbe9e9d638d996142604051612f6f91815260200190565b60405180910390a25050565b60006040518060e00160405280846001600160a01b03168152602001600063ffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600115158152602001836effffffffffffffffffffffffffffff168152602001836effffffffffffffffffffffffffffff16815250905083600001600081819054906101000a900463ffffffff168092919060010191906101000a81548163ffffffff021916908363ffffffff1602179055505060008460000160009054906101000a900463ffffffff169050818560010160008363ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160000160146101000a81548163ffffffff021916908363ffffffff16021790555060408201518160000160186101000a81548163ffffffff021916908363ffffffff160217905550606082015181600001601c6101000a81548163ffffffff021916908363ffffffff16021790555060808201518160010160006101000a81548160ff02191690831515021790555060a08201518160010160016101000a8154816effffffffffffffffffffffffffffff02191690836effffffffffffffffffffffffffffff16021790555060c08201518160010160106101000a8154816effffffffffffffffffffffffffffff02191690836effffffffffffffffffffffffffffff16021790555090505080856002016000866001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508460000160089054906101000a900463ffffffff1663ffffffff1660000361325657845463ffffffff90911668010000000000000000027fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff90911617909355505050565b845468010000000000000000900463ffffffff165b63ffffffff808216600090815260018089016020526040822090810180546effffffffffffffffffffffffffffff70010000000000000000000000000000000080830482168b01909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff90911617905580549092600160c01b9091041690036133925763ffffffff838116600081815260018a016020526040902080547fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000938616939093029290921790915581547fffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffff16600160c01b9091021781556133898784613c8c565b50505050505050565b8054600160e01b900463ffffffff166000036134685763ffffffff838116600081815260018a8101602052604090912080547fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000948716949094029390931783559190910180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905581547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16600160e01b9091021781556133898784613c8c565b805463ffffffff600160e01b8204811660009081526001808b016020526040808320820154600160c01b909504909316825291902001546effffffffffffffffffffffffffffff700100000000000000000000000000000000928390048116929091041611156134e8578054600160e01b900463ffffffff1691506134fa565b8054600160c01b900463ffffffff1691505b5061326b565b63ffffffff8082166000908152600184016020526040812080549092600160c01b9091041690036137e3578054600160e01b900463ffffffff1660000361369257805474010000000000000000000000000000000000000000900463ffffffff166000036135935782547fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff16835561364e565b600181015460ff16156135fb57805474010000000000000000000000000000000000000000900463ffffffff166000908152600184016020526040902080547fffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffff16905561364e565b805474010000000000000000000000000000000000000000900463ffffffff166000908152600184016020526040902080547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690555b5063ffffffff1660009081526001918201602052604081209081550180547fff00000000000000000000000000000000000000000000000000000000000000169055565b805463ffffffff600160e01b80830482166000908152600180880160209081526040808420547fffffffffffffffffffffffff00000000000000000000000000000000000000009097166001600160a01b0397881617808955859004861684528084208084018054948a0180546effffffffffffffffffffffffffffff6101009788900481169097027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff8216811783559254700100000000000000000000000000000000908190049097169096027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9092167fff000000000000000000000000000000000000000000000000000000000000ff9096169590951717909355915490951682526002880190945292909220805494821663ffffffff199095169490941790935581540490911690613c86565b8054600160e01b900463ffffffff1660000361394a57805463ffffffff600160c01b80830482166000908152600180880160209081526040808420547fffffffffffffffffffffffff00000000000000000000000000000000000000009097166001600160a01b0397881617808955859004861684528084208084018054948a0180546effffffffffffffffffffffffffffff6101009788900481169097027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff8216811783559254700100000000000000000000000000000000908190049097169096027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9092167fff000000000000000000000000000000000000000000000000000000000000ff9096169590951717909355915490951682526002880190945292909220805494821663ffffffff199095169490941790935581540490911690613c86565b805463ffffffff600160e01b82048116600090815260018087016020526040808320820154600160c01b909504909316825291902001546effffffffffffffffffffffffffffff61010092839004811692909104161115613b1857805463ffffffff600160c01b80830482166000908152600180880160209081526040808420547fffffffffffffffffffffffff00000000000000000000000000000000000000009097166001600160a01b03978816178089558581048716855281852080850180548b870180546effffffffffffffffffffffffffffff6101009384900481169093027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff821681178355600160e01b9096048c168a52868a20909801549254700100000000000000000000000000000000908190048316938190048316939093019091169091027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9093167fff000000000000000000000000000000000000000000000000000000000000ff9096169590951791909117909355915490951682526002880190945292909220805494821663ffffffff199095169490941790935581540490911690613c86565b805463ffffffff600160e01b80830482166000908152600180880160209081526040808420547fffffffffffffffffffffffff00000000000000000000000000000000000000009097166001600160a01b03978816178089558581048716855281852080850180548b870180546effffffffffffffffffffffffffffff6101009384900481169093027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff8216811783559354600160c01b9096048c168a52868a2090980154700100000000000000000000000000000000908190048316958190048316959095019091169093027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9091167fff000000000000000000000000000000000000000000000000000000000000ff90961695909517949094179055915490951682526002880190945292909220805494821663ffffffff1990951694909417909355815404909116905b50613500565b63ffffffff80821660009081526001840160205260408082208054740100000000000000000000000000000000000000009004909316825290205b815474010000000000000000000000000000000000000000900463ffffffff1615801590613d1a5750600180820154908301546effffffffffffffffffffffffffffff6101009283900481169290910416115b15610dc557815481547fffffffffffffffffffffffff00000000000000000000000000000000000000008083166001600160a01b03928316178555835416918116919091178255600180840180548483018054610100908190046effffffffffffffffffffffffffffff9081168083027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff80871691909117875584549584900483169384029516949094179092558354929003700100000000000000000000000000000000808404831691909103909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9091161790558354821660009081526002870160209081526040808320805463ffffffff998a1663ffffffff199182161790915587549654909516835280832080549095167401000000000000000000000000000000000000000096879004891617909455945484900486168082529187019094528184208054939093049094168352909120613cc7565b5b63ffffffff8082166000908152600180850160205260408083208054600160e01b810486168552828520840154600160c01b90910490951684529220015490916effffffffffffffffffffffffffffff6101009182900481169190920490911611156140e157600180820154825463ffffffff600160c01b90910416600090815285830160205260409020909101546effffffffffffffffffffffffffffff61010092839004811692909104161115610cf557805463ffffffff600160c01b80830482166000908152600187810160208181526040808520547fffffffffffffffffffffffff0000000000000000000000000000000000000000808a166001600160a01b0392831617808c558890048916875282872080549091169982169990991790985583890180548a548890048916875282872086018054610100908190046effffffffffffffffffffffffffffff9081168083027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff80871691909117909655835494839004821692830294909516939093179091558b548990048a168852838820909601805496909203700100000000000000000000000000000000808804831691909103909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9095169490941790935587548716845260028a0180825283852080549a881663ffffffff199b8c1617905588548690048716808652928252838520549097168452959095529020805490951690921790935590540416613e99565b600180820154825463ffffffff600160e01b90910416600090815285830160205260409020909101546effffffffffffffffffffffffffffff61010092839004811692909104161115610cf557805463ffffffff600160e01b80830482166000908152600187810160208181526040808520547fffffffffffffffffffffffff0000000000000000000000000000000000000000808a166001600160a01b0392831617808c558890048916875282872080549091169982169990991790985583890180548a548890048916875282872086018054610100908190046effffffffffffffffffffffffffffff9081168083027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff80871691909117909655835494839004821692830294909516939093179091558b548990048a168852838820909601805496909203700100000000000000000000000000000000808804831691909103909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9095169490941790935587548716845260028a0180825283852080549a881663ffffffff199b8c1617905588548690048716808652928252838520549097168452959095529020805490951690921790935590540416613e99565b6001600160a01b0381166000908152600460205260408120548190819062010000900460ff16816142f38661457b565b90506000806143386fffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008501168560646146b1565b905061437b6fffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000166064868103906146b1565b915061439e6fffffffffffffffffffffffffffffffff84166064868103906146b1565b919891975095509350505050565b815460009068010000000000000000900463ffffffff165b63ffffffff80821660009081526001808701602052604080832054600160c01b9004909316825291902001546effffffffffffffffffffffffffffff8085167001000000000000000000000000000000009092041611156144455763ffffffff9081166000908152600185016020526040902054600160c01b9004166143c4565b63ffffffff8181166000818152600187810160205260408083208054600160c01b9004909516835282208101549290915291909101547001000000000000000000000000000000009091046effffffffffffffffffffffffffffff908116909403938481166101009092041611156144de5763ffffffff1660009081526001840160205260409020546001600160a01b0316905061202b565b63ffffffff818116600090815260018681016020526040808320808301549054600160e01b9004909416835290912001546101009091046effffffffffffffffffffffffffffff908116909403938481167001000000000000000000000000000000009092041611156145715763ffffffff9081166000908152600185016020526040902054600160e01b9004166143c4565b600091505061202b565b6040517f913f1a9f0000000000000000000000000000000000000000000000000000000081526001600160a01b03828116600483015260009182917f0000000000000000000000000000000000000000000000000000000000000000169063913f1a9f90602401602060405180830381865afa1580156145ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906146239190614bb4565b905060006146666fffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016602860646146b1565b90506146a9816fffffffffffffffffffffffffffffffff16650100000000006146a2856fffffffffffffffffffffffffffffffff166064614765565b919061482c565b949350505050565b6000838302608081901c6fffffffffffffffffffffffffffffffff84161161473a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f55696e743132384d6174683a206d756c446976206f766572666c6f770000000060448201526064015b60405180910390fd5b826fffffffffffffffffffffffffffffffff16818161475b5761475b614de1565b0495945050505050565b600080838310801561477e5760018114614791576147a0565b65010000000000850284900491506147a0565b65010000000000840285900491505b506402ef6c3406818002602890811c808402821c808202831c808302841c808402851c938402851c95909502841c641da06a6e33909502841c6455232d2bb2909202841c640d4ca0c283909302841c643177d95571909102841c64fffe4bcada90960290931c949094019190910103919091030390508183111561202b576501921fb544430392915050565b600080807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff858709858702925082811083820303915050806000036148845783828161487a5761487a614de1565b049250505061233f565b8084116148ed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d6174683a206d756c446976206f766572666c6f7700000000000000000000006044820152606401614731565b60008486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091026000889003889004909101858311909403939093029303949094049190911702949350505050565b6001600160a01b03811681146123ab57600080fd5b60006020828403121561497d57600080fd5b813561233f81614956565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60208101600683106149f2577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b600060208083528351808285015260005b81811015614a2557858101830151858201604001528201614a09565b81811115614a37576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b80151581146123ab57600080fd5b60008060408385031215614a8c57600080fd5b8235614a9781614956565b91506020830135614aa781614a6b565b809150509250929050565b803560ff81168114614ac357600080fd5b919050565b600060208284031215614ada57600080fd5b61233f82614ab2565b600060208284031215614af557600080fd5b5035919050565b600080600060608486031215614b1157600080fd5b833592506020840135614b2381614956565b91506040840135614b3381614956565b809150509250925092565b6fffffffffffffffffffffffffffffffff811681146123ab57600080fd5b60008060008060808587031215614b7257600080fd5b8435614b7d81614b3e565b9350614b8b60208601614ab2565b9250614b9960408601614ab2565b91506060850135614ba981614956565b939692955090935050565b600060208284031215614bc657600080fd5b815161233f81614b3e565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006fffffffffffffffffffffffffffffffff83811690831681811015614c2957614c29614bd1565b039392505050565b600060208284031215614c4357600080fd5b5051919050565b600082821015614c5c57614c5c614bd1565b500390565b60006fffffffffffffffffffffffffffffffff808316818516808303821115614c8c57614c8c614bd1565b01949350505050565b600060ff821660ff841680821015614caf57614caf614bd1565b90039392505050565b600060208284031215614cca57600080fd5b815161233f81614956565b60008060408385031215614ce857600080fd5b8251614cf381614b3e565b6020840151909250614aa781614b3e565b600063ffffffff83811690831681811015614c2957614c29614bd1565b600060208284031215614d3357600080fd5b815161233f81614a6b565b600060808284031215614d5057600080fd5b6040516080810181811067ffffffffffffffff82111715614d9a577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040528251614da881614956565b8152602083810151908201526040830151614dc281614b3e565b60408201526060830151614dd581614b3e565b60608201529392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006effffffffffffffffffffffffffffff80841680614e59577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b92169190910692915050565b60008219821115614e7857614e78614bd1565b50019056fea164736f6c634300080f000a" +var ValidatorManagerDeployedBin = "0x608060405234801561001057600080fd5b50600436106102765760003560e01c8063970531c111610160578063b91b2723116100d8578063c2d9b6841161008c578063dff221b511610071578063dff221b514610769578063e0cc26a21461079a578063e7816b7f146107cc57600080fd5b8063c2d9b6841461071d578063cdff5e191461074c57600080fd5b8063be119347116100bd578063be119347146106b2578063be995dc2146106c5578063c26148fe146106d857600080fd5b8063b91b2723146102fd578063bde022bb1461069157600080fd5b8063a3433d071161012f578063ac6c525111610114578063ac6c5251146105a5578063af6ca7621461061a578063b2653fe31461066a57600080fd5b8063a3433d071461056b578063abeba4491461057e57600080fd5b8063970531c1146104e35780639d6b2e371461051e5780639e449b02146105315780639f8a13d71461055857600080fd5b80633ee4d4a3116101f357806356b65e97116101c25780636874e042116101a75780636874e042146104a1578063891aab74146104c8578063943e4005146104db57600080fd5b806356b65e97146104415780635bab847f1461048e57600080fd5b80633ee4d4a31461038357806342223ae9146103aa5780634cca5e6c146103d157806354fd4d50146103f857600080fd5b80631796e52e1161024a578063263a34021161022f578063263a34021461035357806330ccebb51461035b5780633a5490461461037b57600080fd5b80631796e52e1461030557806322009af61461032c57600080fd5b80621c2ff61461027b578063065643ea146102bf5780630763fa7e146102d4578063110d6069146102fd575b600080fd5b6102a27f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b6102d26102cd366004614a2e565b6107f3565b005b6102dc602881565b6040516fffffffffffffffffffffffffffffffff90911681526020016102b6565b6102dc606481565b6102dc7f000000000000000000000000000000000000000000000000000000000000000081565b6102dc7f000000000000000000000000000000000000000000000000000000000000000081565b6102d2610b20565b61036e610369366004614a77565b610bab565b6040516102b69190614ac3565b6102a2610eb4565b6102a27f000000000000000000000000000000000000000000000000000000000000000081565b6102dc7f000000000000000000000000000000000000000000000000000000000000000081565b6102dc7f000000000000000000000000000000000000000000000000000000000000000081565b6104346040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516102b69190614b04565b61047e61044f366004614a77565b6001600160a01b03166000908152600560205260409020546fffffffffffffffffffffffffffffffff16151590565b60405190151581526020016102b6565b6102d261049c366004614b85565b610fe2565b6102a27f000000000000000000000000000000000000000000000000000000000000000081565b6102d26104d6366004614a77565b611157565b6102d261126a565b6102dc6104f1366004614a77565b6001600160a01b03166000908152600560205260409020546fffffffffffffffffffffffffffffffff1690565b6102d261052c366004614b85565b6113e5565b6102dc7f000000000000000000000000000000000000000000000000000000000000000081565b61047e610566366004614a77565b61165c565b6102d2610579366004614bbe565b61168f565b6102dc7f000000000000000000000000000000000000000000000000000000000000000081565b6105fa6105b3366004614a77565b6001600160a01b031660009081526003602090815260408083205463ffffffff168352600290915290206001015461010090046effffffffffffffffffffffffffffff1690565b6040516effffffffffffffffffffffffffffff90911681526020016102b6565b6001805468010000000000000000900463ffffffff166000908152600260205260409020015470010000000000000000000000000000000090046effffffffffffffffffffffffffffff166105fa565b6102dc7f000000000000000000000000000000000000000000000000000000000000000081565b6106a461069f366004614a77565b611853565b6040519081526020016102b6565b6102d26106c0366004614bd9565b6118c9565b6102d26106d3366004614bf2565b611a10565b61070b6106e6366004614a77565b6001600160a01b03166000908152600460205260409020546301000000900460ff1690565b60405160ff90911681526020016102b6565b6102a261072b366004614a77565b6001600160a01b039081166000908152600460205260409020600101541690565b610754611e00565b60405163ffffffff90911681526020016102b6565b61070b610777366004614a77565b6001600160a01b0316600090815260046020526040902054610100900460ff1690565b61070b6107a8366004614a77565b6001600160a01b031660009081526004602052604090205462010000900460ff1690565b6102dc7f000000000000000000000000000000000000000000000000000000000000000081565b60006107fe33610bab565b600581111561080f5761080f614a94565b14610846576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006fffffffffffffffffffffffffffffffff16836fffffffffffffffffffffffffffffffff1610156108c4576040517f24f21b1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606460ff83161115610902576040517f406b265300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038116610942576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33600081815260046020819052604091829020805460017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff009091166201000060ff8916021781178255810180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038781169190911790915592517fd7f1a3d8000000000000000000000000000000000000000000000000000000008152918201939093526fffffffffffffffffffffffffffffffff861660248201527f00000000000000000000000000000000000000000000000000000000000000009091169063d7f1a3d8906044016020604051808303816000875af1158015610a54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a789190614c19565b506fffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811690851610801590610ac157610ac133611e25565b60408051821515815260ff861660208201526fffffffffffffffffffffffffffffffff871681830152905133917f36f43e5c63d19ec0a34168ec0838b5bfae77656b9f5b94b896e9d2172a41f4fe919081900360600190a25050505050565b6003610b2b33610bab565b6005811115610b3c57610b3c614a94565b141580610b695750336000908152600560205260409020546fffffffffffffffffffffffffffffffff1615155b15610ba0576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ba933611e25565b565b6001600160a01b03811660009081526004602052604081205460ff16610bd357506000919050565b6040517f981cee530000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301527f00000000000000000000000000000000000000000000000000000000000000006fffffffffffffffffffffffffffffffff16917f00000000000000000000000000000000000000000000000000000000000000009091169063981cee5390602401602060405180830381865afa158015610c88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cac9190614c19565b6fffffffffffffffffffffffffffffffff161015610ccc57506001919050565b6001600160a01b03828116600081815260036020526040908190205490517f12188543000000000000000000000000000000000000000000000000000000008152600481019290925263ffffffff161515917f00000000000000000000000000000000000000000000000000000000000000006fffffffffffffffffffffffffffffffff16917f000000000000000000000000000000000000000000000000000000000000000090911690631218854390602401602060405180830381865afa158015610d9d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dc19190614c19565b6040517f8abf0af00000000000000000000000000000000000000000000000000000000081526001600160a01b0386811660048301527f00000000000000000000000000000000000000000000000000000000000000001690638abf0af090602401602060405180830381865afa158015610e40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e649190614c19565b610e6e9190614c65565b6fffffffffffffffffffffffffffffffff161015610e9d5780610e945750600292915050565b50600492915050565b80610eab5750600392915050565b50600592915050565b600080546001600160a01b031615610fbd5760007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166380446bd26040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f26573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f4a9190614c96565b9050804210610fac576000610f5f8242614caf565b90507f00000000000000000000000000000000000000000000000000000000000000006fffffffffffffffffffffffffffffffff16811115610faa576001600160a01b039250505090565b505b50506000546001600160a01b031690565b507f000000000000000000000000000000000000000000000000000000000000000090565b6000610fed83610bab565b90508180156110285750600181600581111561100b5761100b614a94565b14806110285750600481600581111561102657611026614a94565b145b1561108657611038600184611f1d565b1561108157826001600160a01b03167fdee7e7274fb1911def379ceda542a2723358c99d6d1f89fcbdbe9e9d638d99614260405161107891815260200190565b60405180910390a25b505050565b600481600581111561109a5761109a614a94565b10611081576040517f8abf0af00000000000000000000000000000000000000000000000000000000081526001600160a01b0380851660048301526111519185917f00000000000000000000000000000000000000000000000000000000000000001690638abf0af090602401602060405180830381865afa158015611124573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111489190614c19565b600191906120c0565b50505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146111b9576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006111c3610eb4565b90506001600160a01b03808216148015906111f05750806001600160a01b0316826001600160a01b031614155b15611227576040517fc625317600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6112308261165c565b611266576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050565b600261127533610bab565b600581111561128657611286614a94565b10806112b25750336000908152600560205260409020546fffffffffffffffffffffffffffffffff1615155b156112e9576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6112f233611853565b42101561132b576040517f82225faf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360008181526004602090815260409182902080547fffffffffffffffffffffffff0000000000000000000000000000000000ffffff6301000000820460ff90811662010000818102939093167fffffffffffffffffffffffff000000000000000000000000000000000000ffff851617855586519290930416808252938101829052919492939092917fa40865ec905b139b9cdbd0566756b576b074c47d9dde9f62388b1d66d3e72a64910160405180910390a2505050565b6001600160a01b0382166000908152600560205260409020546fffffffffffffffffffffffffffffffff16611446576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b801561151d577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639e45e8f46040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114ce9190614cc6565b6001600160a01b0316336001600160a01b031614611518576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6115ce565b336001600160a01b0383161461155f576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038216600090815260056020526040902054426fffffffffffffffffffffffffffffffff90911611156115c5576040517f1dfc20f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6115ce826123d5565b6001600160a01b03821660008181526005602052604080822080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000169055517f9390b453426557da5ebdc31f19a37753ca04addf656d32f35232211bb2af3f199190a2600361163d83610bab565b600581111561164e5761164e614a94565b036112665761126682611e25565b6000600561166983610bab565b600581111561167a5761167a614a94565b0361168757506001919050565b506000919050565b600261169a33610bab565b60058111156116ab576116ab614a94565b10806116d75750336000908152600560205260409020546fffffffffffffffffffffffffffffffff1615155b1561170e576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336000908152600460205260409020606460ff8316111561175b576040517f406b265300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805460ff6201000090910481169083168190036117a4576040517f150393f200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81547fffffffffffffffffffffffff0000000000000000000000000000000000ffffff16630100000060ff8581169182027fffffffffffffffffffffffff00000000000000000000000000000000ffffffff1692909217640100000000426fffffffffffffffffffffffffffffffff1602178455604080519284168352602083019190915233917f9d9fe61047777339f4f4cb36a1f75ee90e3c6aa90c13abd3ffa07f6f86e0a3079101611078565b6001600160a01b0381166000908152600460205260408120546118b1907f00000000000000000000000000000000000000000000000000000000000000009064010000000090046fffffffffffffffffffffffffffffffff16614ce3565b6fffffffffffffffffffffffffffffffff1692915050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461192b576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61193361243d565b506040517fb0ea09a8000000000000000000000000000000000000000000000000000000008152600481018290526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b0ea09a890602401602060405180830381865afa1580156119b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119d99190614cc6565b6000549091506001600160a01b0390811690821603611a00576119fb816123d5565b611a08565b611a08612b78565b611266612c4d565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639e45e8f46040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a6e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a929190614cc6565b6001600160a01b0316336001600160a01b031614611adc576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f3ecf0ced0000000000000000000000000000000000000000000000000000000081526001600160a01b038281166004830152600060248301819052600160448401529182917f00000000000000000000000000000000000000000000000000000000000000001690633ecf0ced9060640160408051808303816000875af1158015611b6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b939190614d17565b90925090506001600160a01b038316857f1237821480ce4d75f917bc39d1641eb17a5e09a2d5bf982cdd8cb2561aa28e68611bce8486614ce3565b6040516fffffffffffffffffffffffffffffffff909116815260200160405180910390a3611bfb83612ee7565b847f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f403838d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c5a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c7e9190614c96565b11611cd657600085815260066020526040902080546fffffffffffffffffffffffffffffffff8082168401167fffffffffffffffffffffffffffffffff00000000000000000000000000000000909116179055611df9565b6040517f3ecf0ced0000000000000000000000000000000000000000000000000000000081526001600160a01b0385811660048301526fffffffffffffffffffffffffffffffff83166024830152600060448301527f00000000000000000000000000000000000000000000000000000000000000001690633ecf0ced9060640160408051808303816000875af1158015611d75573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d999190614d17565b5050611da6846000610fe2565b6040516fffffffffffffffffffffffffffffffff821681526001600160a01b0385169086907fd537f9e63e8da05cdb52f795e1c79d7b163e2517d5229375474dbe60b48cfa149060200160405180910390a35b5050505050565b600154600090611e209063ffffffff640100000000820481169116614d46565b905090565b6040517f8abf0af00000000000000000000000000000000000000000000000000000000081526001600160a01b038083166004830152611ed79183917f00000000000000000000000000000000000000000000000000000000000000001690638abf0af090602401602060405180830381865afa158015611eaa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ece9190614c19565b6001919061300a565b806001600160a01b03167ff33a24861b76047debce215c7ae4915a9befc5d870e97efbd4152df23c72112a42604051611f1291815260200190565b60405180910390a250565b6001600160a01b038116600090815260028301602052604081205463ffffffff16808203611f4f5760009150506120ba565b6001600160a01b03831660009081526002850160209081526040808320805463ffffffff1916905563ffffffff8481168452600180890190935292208054910154740100000000000000000000000000000000000000009091049091169061010090046effffffffffffffffffffffffffffff165b63ffffffff8216156120665763ffffffff91821660009081526001808801602052604090912090810180546effffffffffffffffffffffffffffff7001000000000000000000000000000000008083048216869003909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9091161790555474010000000000000000000000000000000000000000900490911690611fc4565b612070868461358f565b50508354600163ffffffff64010000000080840482168301909116027fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff9092169190911785559150505b92915050565b6001600160a01b038216600090815260028401602052604081205463ffffffff168082036120f25760009150506123ce565b63ffffffff80821660009081526001808801602052604090912090810180546effffffffffffffffffffffffffffff8781166101008181027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff85161790945593549290910416927401000000000000000000000000000000000000000090910416908210156122a25763ffffffff83166000908152600188810160205260409091200180547fff000000000000000000000000000000ffffffffffffffffffffffffffffffff8116848803700100000000000000000000000000000000928390046effffffffffffffffffffffffffffff908116820116909202179091555b63ffffffff8216156122925763ffffffff91821660009081526001808a01602052604090912090810180546effffffffffffffffffffffffffffff70010000000000000000000000000000000080830482168601909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff90911617905554740100000000000000000000000000000000000000009004909116906121f1565b5061229d8784613d1b565b6123c6565b63ffffffff83166000908152600188810160205260409091200180547fff000000000000000000000000000000ffffffffffffffffffffffffffffffff8116878503700100000000000000000000000000000000928390046effffffffffffffffffffffffffffff90811682900316909202179091555b63ffffffff8216156123bb5763ffffffff91821660009081526001808a01602052604090912090810180546effffffffffffffffffffffffffffff7001000000000000000000000000000000008083048216869003909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9091161790555474010000000000000000000000000000000000000000900490911690612319565b506123c68784613f27565b600193505050505b9392505050565b6001600160a01b038116600090815260046020526040902054610100900460ff161561243a576001600160a01b038116600090815260046020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1690555b50565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f403838d6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561249e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124c29190614c96565b905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166369f16eec6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612524573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125489190614c96565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156125a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125cc9190614cc6565b6001600160a01b031663ad36d6cc836040518263ffffffff1660e01b81526004016125f991815260200190565b602060405180830381865afa158015612616573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061263a9190614d63565b6126475760009250505090565b6000805b7f00000000000000000000000000000000000000000000000000000000000000006fffffffffffffffffffffffffffffffff16826fffffffffffffffffffffffffffffffff1610801561269e5750828411155b15612ab7576040517f33727c4d000000000000000000000000000000000000000000000000000000008152600481018590527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333727c4d90602401602060405180830381865afa158015612721573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127459190614d63565b15612ab7576040517fb0ea09a8000000000000000000000000000000000000000000000000000000008152600481018590527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b0ea09a890602401602060405180830381865afa1580156127c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127ec9190614cc6565b905060008060006127fc84614352565b6040517fad4294510000000000000000000000000000000000000000000000000000000081526001600160a01b0388811660048301526fffffffffffffffffffffffffffffffff858116602484015284811660448401528316606483015293965091945092507f00000000000000000000000000000000000000000000000000000000000000009091169063ad42945190608401600060405180830381600087803b1580156128aa57600080fd5b505af11580156128be573d6000803e3d6000fd5b5050604080516fffffffffffffffffffffffffffffffff8581168252878116602083015286168183015290516001600160a01b03881693508a92507fd74a44a8cd6c73740a70271e07ee96d8a495ff30037ae6381cbcdb8fe7f2a1ea9181900360600190a36000878152600660205260409020546fffffffffffffffffffffffffffffffff168015612a97576040517f3ecf0ced0000000000000000000000000000000000000000000000000000000081526001600160a01b0386811660048301526fffffffffffffffffffffffffffffffff83166024830152600060448301527f00000000000000000000000000000000000000000000000000000000000000001690633ecf0ced9060640160408051808303816000875af11580156129e9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a0d9190614d17565b505060008881526006602090815260409182902080547fffffffffffffffffffffffffffffffff0000000000000000000000000000000016905590516fffffffffffffffffffffffffffffffff831681526001600160a01b038716918a917fd537f9e63e8da05cdb52f795e1c79d7b163e2517d5229375474dbe60b48cfa14910160405180910390a35b612aa2856000610fe2565b8760010197508560010195505050505061264b565b6fffffffffffffffffffffffffffffffff821615612b6d576040517f9902cdc0000000000000000000000000000000000000000000000000000000008152600481018590527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690639902cdc090602401600060405180830381600087803b158015612b4a57600080fd5b505af1158015612b5e573d6000803e3d6000fd5b50505050600194505050505090565b600094505050505090565b6000546001600160a01b0316612b8a57565b600080546001600160a01b03168152600460205260409020547f00000000000000000000000000000000000000000000000000000000000000006fffffffffffffffffffffffffffffffff1661010090910460ff1610612bf957600054610ba9906001600160a01b0316612ee7565b600080546001600160a01b03168152600460205260409020805460ff6101008083048216600101909116027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116179055565b6001805468010000000000000000900463ffffffff1660009081526002602052604081209091015470010000000000000000000000000000000090046effffffffffffffffffffffffffffff16905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f403838d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612cfc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d209190614c96565b90506000826effffffffffffffffffffffffffffff16118015612d435750600081115b15612ebb5760006001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663a25ae557612d84600185614caf565b6040518263ffffffff1660e01b8152600401612da291815260200190565b608060405180830381865afa158015612dbf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612de39190614d80565b90506000838260200151434144600143612dfd9190614caf565b6040805160208101969096528501939093527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606092831b1691840191909152607483015240609482015260b4016040516020818303038152906040528051906020012060001c612e6e9190614e52565b9050612e7b60018261443b565b600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055506112669050565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555050565b6000612f256fffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001642614ea7565b6001600160a01b03831660008181526005602090815260409182902080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff8616908117909155915191825292935090917f95a398f2b6b2ad94f281708c97fe502386fc16adca43daed577a1e992a4cc814910160405180910390a2612fbe600183611f1d565b1561126657816001600160a01b03167fdee7e7274fb1911def379ceda542a2723358c99d6d1f89fcbdbe9e9d638d996142604051612ffe91815260200190565b60405180910390a25050565b60006040518060e00160405280846001600160a01b03168152602001600063ffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600115158152602001836effffffffffffffffffffffffffffff168152602001836effffffffffffffffffffffffffffff16815250905083600001600081819054906101000a900463ffffffff168092919060010191906101000a81548163ffffffff021916908363ffffffff1602179055505060008460000160009054906101000a900463ffffffff169050818560010160008363ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160000160146101000a81548163ffffffff021916908363ffffffff16021790555060408201518160000160186101000a81548163ffffffff021916908363ffffffff160217905550606082015181600001601c6101000a81548163ffffffff021916908363ffffffff16021790555060808201518160010160006101000a81548160ff02191690831515021790555060a08201518160010160016101000a8154816effffffffffffffffffffffffffffff02191690836effffffffffffffffffffffffffffff16021790555060c08201518160010160106101000a8154816effffffffffffffffffffffffffffff02191690836effffffffffffffffffffffffffffff16021790555090505080856002016000866001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508460000160089054906101000a900463ffffffff1663ffffffff166000036132e557845463ffffffff90911668010000000000000000027fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff90911617909355505050565b845468010000000000000000900463ffffffff165b63ffffffff808216600090815260018089016020526040822090810180546effffffffffffffffffffffffffffff70010000000000000000000000000000000080830482168b01909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff90911617905580549092600160c01b9091041690036134215763ffffffff838116600081815260018a016020526040902080547fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000938616939093029290921790915581547fffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffff16600160c01b9091021781556134188784613d1b565b50505050505050565b8054600160e01b900463ffffffff166000036134f75763ffffffff838116600081815260018a8101602052604090912080547fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000948716949094029390931783559190910180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905581547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16600160e01b9091021781556134188784613d1b565b805463ffffffff600160e01b8204811660009081526001808b016020526040808320820154600160c01b909504909316825291902001546effffffffffffffffffffffffffffff70010000000000000000000000000000000092839004811692909104161115613577578054600160e01b900463ffffffff169150613589565b8054600160c01b900463ffffffff1691505b506132fa565b63ffffffff8082166000908152600184016020526040812080549092600160c01b909104169003613872578054600160e01b900463ffffffff1660000361372157805474010000000000000000000000000000000000000000900463ffffffff166000036136225782547fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff1683556136dd565b600181015460ff161561368a57805474010000000000000000000000000000000000000000900463ffffffff166000908152600184016020526040902080547fffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffff1690556136dd565b805474010000000000000000000000000000000000000000900463ffffffff166000908152600184016020526040902080547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690555b5063ffffffff1660009081526001918201602052604081209081550180547fff00000000000000000000000000000000000000000000000000000000000000169055565b805463ffffffff600160e01b80830482166000908152600180880160209081526040808420547fffffffffffffffffffffffff00000000000000000000000000000000000000009097166001600160a01b0397881617808955859004861684528084208084018054948a0180546effffffffffffffffffffffffffffff6101009788900481169097027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff8216811783559254700100000000000000000000000000000000908190049097169096027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9092167fff000000000000000000000000000000000000000000000000000000000000ff9096169590951717909355915490951682526002880190945292909220805494821663ffffffff199095169490941790935581540490911690613d15565b8054600160e01b900463ffffffff166000036139d957805463ffffffff600160c01b80830482166000908152600180880160209081526040808420547fffffffffffffffffffffffff00000000000000000000000000000000000000009097166001600160a01b0397881617808955859004861684528084208084018054948a0180546effffffffffffffffffffffffffffff6101009788900481169097027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff8216811783559254700100000000000000000000000000000000908190049097169096027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9092167fff000000000000000000000000000000000000000000000000000000000000ff9096169590951717909355915490951682526002880190945292909220805494821663ffffffff199095169490941790935581540490911690613d15565b805463ffffffff600160e01b82048116600090815260018087016020526040808320820154600160c01b909504909316825291902001546effffffffffffffffffffffffffffff61010092839004811692909104161115613ba757805463ffffffff600160c01b80830482166000908152600180880160209081526040808420547fffffffffffffffffffffffff00000000000000000000000000000000000000009097166001600160a01b03978816178089558581048716855281852080850180548b870180546effffffffffffffffffffffffffffff6101009384900481169093027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff821681178355600160e01b9096048c168a52868a20909801549254700100000000000000000000000000000000908190048316938190048316939093019091169091027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9093167fff000000000000000000000000000000000000000000000000000000000000ff9096169590951791909117909355915490951682526002880190945292909220805494821663ffffffff199095169490941790935581540490911690613d15565b805463ffffffff600160e01b80830482166000908152600180880160209081526040808420547fffffffffffffffffffffffff00000000000000000000000000000000000000009097166001600160a01b03978816178089558581048716855281852080850180548b870180546effffffffffffffffffffffffffffff6101009384900481169093027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff8216811783559354600160c01b9096048c168a52868a2090980154700100000000000000000000000000000000908190048316958190048316959095019091169093027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9091167fff000000000000000000000000000000000000000000000000000000000000ff90961695909517949094179055915490951682526002880190945292909220805494821663ffffffff1990951694909417909355815404909116905b5061358f565b63ffffffff80821660009081526001840160205260408082208054740100000000000000000000000000000000000000009004909316825290205b815474010000000000000000000000000000000000000000900463ffffffff1615801590613da95750600180820154908301546effffffffffffffffffffffffffffff6101009283900481169290910416115b1561115157815481547fffffffffffffffffffffffff00000000000000000000000000000000000000008083166001600160a01b03928316178555835416918116919091178255600180840180548483018054610100908190046effffffffffffffffffffffffffffff9081168083027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff80871691909117875584549584900483169384029516949094179092558354929003700100000000000000000000000000000000808404831691909103909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9091161790558354821660009081526002870160209081526040808320805463ffffffff998a1663ffffffff199182161790915587549654909516835280832080549095167401000000000000000000000000000000000000000096879004891617909455945484900486168082529187019094528184208054939093049094168352909120613d56565b5b63ffffffff8082166000908152600180850160205260408083208054600160e01b810486168552828520840154600160c01b90910490951684529220015490916effffffffffffffffffffffffffffff61010091829004811691909204909116111561417057600180820154825463ffffffff600160c01b90910416600090815285830160205260409020909101546effffffffffffffffffffffffffffff6101009283900481169290910416111561108157805463ffffffff600160c01b80830482166000908152600187810160208181526040808520547fffffffffffffffffffffffff0000000000000000000000000000000000000000808a166001600160a01b0392831617808c558890048916875282872080549091169982169990991790985583890180548a548890048916875282872086018054610100908190046effffffffffffffffffffffffffffff9081168083027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff80871691909117909655835494839004821692830294909516939093179091558b548990048a168852838820909601805496909203700100000000000000000000000000000000808804831691909103909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9095169490941790935587548716845260028a0180825283852080549a881663ffffffff199b8c1617905588548690048716808652928252838520549097168452959095529020805490951690921790935590540416613f28565b600180820154825463ffffffff600160e01b90910416600090815285830160205260409020909101546effffffffffffffffffffffffffffff6101009283900481169290910416111561108157805463ffffffff600160e01b80830482166000908152600187810160208181526040808520547fffffffffffffffffffffffff0000000000000000000000000000000000000000808a166001600160a01b0392831617808c558890048916875282872080549091169982169990991790985583890180548a548890048916875282872086018054610100908190046effffffffffffffffffffffffffffff9081168083027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff80871691909117909655835494839004821692830294909516939093179091558b548990048a168852838820909601805496909203700100000000000000000000000000000000808804831691909103909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9095169490941790935587548716845260028a0180825283852080549a881663ffffffff199b8c1617905588548690048716808652928252838520549097168452959095529020805490951690921790935590540416613f28565b6001600160a01b0381166000908152600460205260408120548190819062010000900460ff16816143828661460a565b90506000806143c76fffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000850116856064614740565b905061440a6fffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016606486810390614740565b915061442d6fffffffffffffffffffffffffffffffff8416606486810390614740565b919891975095509350505050565b815460009068010000000000000000900463ffffffff165b63ffffffff80821660009081526001808701602052604080832054600160c01b9004909316825291902001546effffffffffffffffffffffffffffff8085167001000000000000000000000000000000009092041611156144d45763ffffffff9081166000908152600185016020526040902054600160c01b900416614453565b63ffffffff8181166000818152600187810160205260408083208054600160c01b9004909516835282208101549290915291909101547001000000000000000000000000000000009091046effffffffffffffffffffffffffffff9081169094039384811661010090920416111561456d5763ffffffff1660009081526001840160205260409020546001600160a01b031690506120ba565b63ffffffff818116600090815260018681016020526040808320808301549054600160e01b9004909416835290912001546101009091046effffffffffffffffffffffffffffff908116909403938481167001000000000000000000000000000000009092041611156146005763ffffffff9081166000908152600185016020526040902054600160e01b900416614453565b60009150506120ba565b6040517f913f1a9f0000000000000000000000000000000000000000000000000000000081526001600160a01b03828116600483015260009182917f0000000000000000000000000000000000000000000000000000000000000000169063913f1a9f90602401602060405180830381865afa15801561468e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906146b29190614c19565b905060006146f56fffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001660286064614740565b9050614738816fffffffffffffffffffffffffffffffff1665010000000000614731856fffffffffffffffffffffffffffffffff1660646147f4565b91906148bb565b949350505050565b6000838302608081901c6fffffffffffffffffffffffffffffffff8416116147c9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f55696e743132384d6174683a206d756c446976206f766572666c6f770000000060448201526064015b60405180910390fd5b826fffffffffffffffffffffffffffffffff1681816147ea576147ea614e23565b0495945050505050565b600080838310801561480d57600181146148205761482f565b650100000000008502849004915061482f565b65010000000000840285900491505b506402ef6c3406818002602890811c808402821c808202831c808302841c808402851c938402851c95909502841c641da06a6e33909502841c6455232d2bb2909202841c640d4ca0c283909302841c643177d95571909102841c64fffe4bcada90960290931c94909401919091010391909103039050818311156120ba576501921fb544430392915050565b600080807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff858709858702925082811083820303915050806000036149135783828161490957614909614e23565b04925050506123ce565b80841161497c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d6174683a206d756c446976206f766572666c6f77000000000000000000000060448201526064016147c0565b60008486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091026000889003889004909101858311909403939093029303949094049190911702949350505050565b6fffffffffffffffffffffffffffffffff8116811461243a57600080fd5b803560ff81168114614a1457600080fd5b919050565b6001600160a01b038116811461243a57600080fd5b600080600060608486031215614a4357600080fd5b8335614a4e816149e5565b9250614a5c60208501614a03565b91506040840135614a6c81614a19565b809150509250925092565b600060208284031215614a8957600080fd5b81356123ce81614a19565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6020810160068310614afe577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b600060208083528351808285015260005b81811015614b3157858101830151858201604001528201614b15565b81811115614b43576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b801515811461243a57600080fd5b60008060408385031215614b9857600080fd5b8235614ba381614a19565b91506020830135614bb381614b77565b809150509250929050565b600060208284031215614bd057600080fd5b6123ce82614a03565b600060208284031215614beb57600080fd5b5035919050565b600080600060608486031215614c0757600080fd5b833592506020840135614a5c81614a19565b600060208284031215614c2b57600080fd5b81516123ce816149e5565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006fffffffffffffffffffffffffffffffff83811690831681811015614c8e57614c8e614c36565b039392505050565b600060208284031215614ca857600080fd5b5051919050565b600082821015614cc157614cc1614c36565b500390565b600060208284031215614cd857600080fd5b81516123ce81614a19565b60006fffffffffffffffffffffffffffffffff808316818516808303821115614d0e57614d0e614c36565b01949350505050565b60008060408385031215614d2a57600080fd5b8251614d35816149e5565b6020840151909250614bb3816149e5565b600063ffffffff83811690831681811015614c8e57614c8e614c36565b600060208284031215614d7557600080fd5b81516123ce81614b77565b600060808284031215614d9257600080fd5b6040516080810181811067ffffffffffffffff82111715614ddc577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040528251614dea81614a19565b8152602083810151908201526040830151614e04816149e5565b60408201526060830151614e17816149e5565b60608201529392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006effffffffffffffffffffffffffffff80841680614e9b577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b92169190910692915050565b60008219821115614eba57614eba614c36565b50019056fea164736f6c634300080f000a" + func init() { if err := json.Unmarshal([]byte(ValidatorManagerStorageLayoutJSON), ValidatorManagerStorageLayout); err != nil { diff --git a/kroma-chain-ops/genesis/config.go b/kroma-chain-ops/genesis/config.go index c7e0bf823..a285406e5 100644 --- a/kroma-chain-ops/genesis/config.go +++ b/kroma-chain-ops/genesis/config.go @@ -283,9 +283,8 @@ type DeployConfig struct { ValidatorManagerMinRegisterAmount *hexutil.Big `json:"validatorManagerMinRegisterAmount"` // ValidatorManagerMinActivateAmount is the amount of the minimum activation amount. ValidatorManagerMinActivateAmount *hexutil.Big `json:"validatorManagerMinActivateAmount"` - // ValidatorManagerCommissionMinChangeSeconds is the minimum duration of commission change in - // seconds. - ValidatorManagerCommissionMinChangeSeconds uint64 `json:"validatorManagerCommissionMinChangeSeconds"` + // ValidatorManagerCommissionChangeDelaySeconds is the delay to finalize the commission rate change in seconds. + ValidatorManagerCommissionChangeDelaySeconds uint64 `json:"validatorManagerCommissionChangeDelaySeconds"` // ValidatorManagerRoundDurationSeconds is the duration of one submission round in seconds. ValidatorManagerRoundDurationSeconds uint64 `json:"validatorManagerRoundDurationSeconds"` // ValidatorManagerJailPeriodSeconds is the duration of jail period in seconds. @@ -550,8 +549,8 @@ func (d *DeployConfig) Check() error { if d.ValidatorManagerMinActivateAmount.ToInt().Cmp(d.ValidatorManagerMinRegisterAmount.ToInt()) < 0 { return fmt.Errorf("%w: ValidatorManagerMinActivateAmount must equal or more than ValidatorManagerMinRegisterAmount", ErrInvalidDeployConfig) } - if d.ValidatorManagerCommissionMinChangeSeconds == 0 { - return fmt.Errorf("%w: ValidatorManagerCommissionMinChangeSeconds cannot be 0", ErrInvalidDeployConfig) + if d.ValidatorManagerCommissionChangeDelaySeconds == 0 { + return fmt.Errorf("%w: ValidatorManagerCommissionChangeDelaySeconds cannot be 0", ErrInvalidDeployConfig) } if d.ValidatorManagerRoundDurationSeconds == 0 { return fmt.Errorf("%w: ValidatorManagerRoundDurationSeconds cannot be 0", ErrInvalidDeployConfig) diff --git a/kroma-chain-ops/genesis/testdata/allocs-l1.json b/kroma-chain-ops/genesis/testdata/allocs-l1.json index 7571e1b5b..ba46a790d 100644 --- a/kroma-chain-ops/genesis/testdata/allocs-l1.json +++ b/kroma-chain-ops/genesis/testdata/allocs-l1.json @@ -1,13 +1,6 @@ { - "root": "6ae38f1e46aae454deed28dbf846a3b9f76e07f93617a6a750f235e0e4b141dc", + "root": "8d838c3caf76ea46c50889a8b10d4fb013b2d8c8b7fbeeaf698f87ca59259c23", "accounts": { - "0x0000000000000000000000000000000000000000": { - "balance": "205973168175896875", - "nonce": 0, - "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "key": "0x5380c7b7ae81a58eb98d9c78de4a1fd7fd9535fc953ed2be602daaa41767312a" - }, "0x0000000000000000000000000000000000000001": { "balance": "1", "nonce": 0, @@ -209,7 +202,7 @@ "key": "0x7694289e56b3885be351656b2b6cd001557c52e00baa368c33676c4a1431e6dc" }, "0x3fab184622dc19b6109349b94811493bf2a45362": { - "balance": "993186300000000000", + "balance": "993186900000000000", "nonce": 1, "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", @@ -330,8 +323,8 @@ "balance": "0", "nonce": 1, "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "codeHash": "0xed8f8393fbf2207d66a02ad64853f8cbf030bc3ae50c8409470e8feaca52425e", - "code": "0x608060405234801561001057600080fd5b50600436106102255760003560e01c80638ee4b6021161012a578063b91b2723116100bd578063cdff5e191161008c578063dff221b511610071578063dff221b5146106c0578063e0cc26a2146106f1578063e7816b7f1461072357600080fd5b8063cdff5e191461067c578063dea152541461069957600080fd5b8063b91b272314610297578063b9551f8214610611578063be11934714610656578063be995dc21461066957600080fd5b8063abeba449116100f9578063abeba449146104fe578063ac6c525114610525578063af6ca7621461059a578063b2653fe3146105ea57600080fd5b80638ee4b6021461048a578063970531c11461049d5780639d6b2e37146104d85780639f8a13d7146104eb57600080fd5b80633ee4d4a3116101bd57806356b65e971161018c5780636874e042116101715780636874e0421461043d57806388576dc914610464578063891aab741461047757600080fd5b806356b65e97146103dd5780635bab847f1461042a57600080fd5b80633ee4d4a31461031f57806342223ae9146103465780634cca5e6c1461036d57806354fd4d501461039457600080fd5b806322009af6116101f957806322009af6146102c6578063263a3402146102ed57806330ccebb5146102f75780633a5490461461031757600080fd5b80621c2ff61461022a5780630763fa7e1461026e578063110d6069146102975780631796e52e1461029f575b600080fd5b6102517f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c981565b6040516001600160a01b0390911681526020015b60405180910390f35b610276602881565b6040516fffffffffffffffffffffffffffffffff9091168152602001610265565b610276606481565b6102767f000000000000000000000000000000000000000000000000000000000000003281565b6102767f000000000000000000000000000000000000000000000000000000000000001481565b6102f561074a565b005b61030a6103053660046148c8565b6107d5565b6040516102659190614914565b610251610ade565b6102517f00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c881565b6102767f000000000000000000000000000000000000000000000000000000000000000281565b6102767f000000000000000000000000000000000000000000000000000000000000000481565b6103d06040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516102659190614955565b61041a6103eb3660046148c8565b6001600160a01b03166000908152600560205260409020546fffffffffffffffffffffffffffffffff16151590565b6040519015158152602001610265565b6102f56104383660046149d6565b610c0c565b6102517f0000000000000000000000000b306bf915c4d645ff596e518faf3f9669b9701681565b6102f5610472366004614a25565b610d81565b6102f56104853660046148c8565b611054565b6102f5610498366004614a5e565b611167565b6102766104ab3660046148c8565b6001600160a01b03166000908152600560205260409020546fffffffffffffffffffffffffffffffff1690565b6102f56104e63660046149d6565b6114ed565b61041a6104f93660046148c8565b611764565b6102767f000000000000000000000000000000000000000000000000000000000000007881565b61057a6105333660046148c8565b6001600160a01b031660009081526003602090815260408083205463ffffffff168352600290915290206001015461010090046effffffffffffffffffffffffffffff1690565b6040516effffffffffffffffffffffffffffff9091168152602001610265565b6001805468010000000000000000900463ffffffff166000908152600260205260409020015470010000000000000000000000000000000090046effffffffffffffffffffffffffffff1661057a565b6102767f000000000000000000000000000000000000000000000000000000000000006481565b61064461061f3660046148c8565b6001600160a01b03166000908152600460205260409020546301000000900460ff1690565b60405160ff9091168152602001610265565b6102f5610664366004614aa3565b611797565b6102f5610677366004614abc565b6118de565b610684611cce565b60405163ffffffff9091168152602001610265565b6102767f000000000000000000000000000000000000000000000000000000000000007881565b6106446106ce3660046148c8565b6001600160a01b0316600090815260046020526040902054610100900460ff1690565b6106446106ff3660046148c8565b6001600160a01b031660009081526004602052604090205462010000900460ff1690565b6102767f000000000000000000000000000000000000000000000000000000000000000a81565b6003610755336107d5565b6005811115610766576107666148e5565b1415806107935750336000908152600560205260409020546fffffffffffffffffffffffffffffffff1615155b156107ca576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6107d333611cf3565b565b6001600160a01b03811660009081526004602052604081205460ff166107fd57506000919050565b6040517f981cee530000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301527f00000000000000000000000000000000000000000000000000000000000000326fffffffffffffffffffffffffffffffff16917f0000000000000000000000000b306bf915c4d645ff596e518faf3f9669b970169091169063981cee5390602401602060405180830381865afa1580156108b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108d69190614afe565b6fffffffffffffffffffffffffffffffff1610156108f657506001919050565b6001600160a01b03828116600081815260036020526040908190205490517f12188543000000000000000000000000000000000000000000000000000000008152600481019290925263ffffffff161515917f00000000000000000000000000000000000000000000000000000000000000646fffffffffffffffffffffffffffffffff16917f0000000000000000000000000b306bf915c4d645ff596e518faf3f9669b9701690911690631218854390602401602060405180830381865afa1580156109c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109eb9190614afe565b6040517f8abf0af00000000000000000000000000000000000000000000000000000000081526001600160a01b0386811660048301527f0000000000000000000000000b306bf915c4d645ff596e518faf3f9669b970161690638abf0af090602401602060405180830381865afa158015610a6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a8e9190614afe565b610a989190614b4a565b6fffffffffffffffffffffffffffffffff161015610ac75780610abe5750600292915050565b50600492915050565b80610ad55750600392915050565b50600592915050565b600080546001600160a01b031615610be75760007f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b03166380446bd26040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b749190614b7b565b9050804210610bd6576000610b898242614b94565b90507f00000000000000000000000000000000000000000000000000000000000000046fffffffffffffffffffffffffffffffff16811115610bd4576001600160a01b039250505090565b505b50506000546001600160a01b031690565b507f00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c890565b6000610c17836107d5565b9050818015610c5257506001816005811115610c3557610c356148e5565b1480610c5257506004816005811115610c5057610c506148e5565b145b15610cb057610c62600184611deb565b15610cab57826001600160a01b03167fdee7e7274fb1911def379ceda542a2723358c99d6d1f89fcbdbe9e9d638d996142604051610ca291815260200190565b60405180910390a25b505050565b6004816005811115610cc457610cc46148e5565b10610cab576040517f8abf0af00000000000000000000000000000000000000000000000000000000081526001600160a01b038085166004830152610d7b9185917f0000000000000000000000000b306bf915c4d645ff596e518faf3f9669b970161690638abf0af090602401602060405180830381865afa158015610d4e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d729190614afe565b60019190611f8e565b50505050565b6002610d8c336107d5565b6005811115610d9d57610d9d6148e5565b1080610dc95750336000908152600560205260409020546fffffffffffffffffffffffffffffffff1615155b15610e00576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33600090815260046020526040902080544290610e58907f00000000000000000000000000000000000000000000000000000000000000789064010000000090046fffffffffffffffffffffffffffffffff16614bab565b6fffffffffffffffffffffffffffffffff161115610ea2576040517f7d7a4d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606460ff83161115610ee0576040517f406b265300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805460ff620100009091048116908316819003610f29576040517f150393f200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008160ff168460ff1611610f4757610f428483614bdf565b610f51565b610f518285614bdf565b835490915060ff630100000090910481169082161115610f9d576040517f9ed4fa4a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82547fffffffffffffffffffffffff00000000000000000000000000000000ff00ffff166201000060ff8681169182027fffffffffffffffffffffffff00000000000000000000000000000000ffffffff1692909217640100000000426fffffffffffffffffffffffffffffffff1602178555604080519285168352602083019190915233917fc0b29b9b824f7a62d93fde5832bb8307fd62594d0a08d96d533407a0a147ec48910160405180910390a250505050565b336001600160a01b037f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c916146110b6576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006110c0610ade565b90506001600160a01b03808216148015906110ed5750806001600160a01b0316826001600160a01b031614155b15611124576040517fc625317600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61112d82611764565b611163576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050565b6000611172336107d5565b6005811115611183576111836148e5565b146111ba576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000326fffffffffffffffffffffffffffffffff16836fffffffffffffffffffffffffffffffff161015611238576040517f24f21b1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606460ff83161115611276576040517f406b265300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606460ff821611156112b4576040517f4143808b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360008181526004602081905260409182902080546fffffffffffffffffffffffffffffffff4216640100000000027fffffffffffffffffffffffff00000000000000000000000000000000ffffffff60ff888116630100000002919091167fffffffffffffffffffffffff0000000000000000000000000000000000ffffff918a1662010000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff0090941693909317600117169190911717815591517fd7f1a3d800000000000000000000000000000000000000000000000000000000815291927f0000000000000000000000000b306bf915c4d645ff596e518faf3f9669b970166001600160a01b03169263d7f1a3d8926113fa92918991016001600160a01b039290921682526fffffffffffffffffffffffffffffffff16602082015260400190565b6020604051808303816000875af1158015611419573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061143d9190614afe565b506fffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000648116908516108015906114865761148633611cf3565b60408051821515815260ff86811660208301528516818301526fffffffffffffffffffffffffffffffff87166060820152905133917f04ba0c4d7cbac9138f7b73ec9fef796e4ad320bf5fb204f080f81fd59c2d48b9919081900360800190a25050505050565b6001600160a01b0382166000908152600560205260409020546fffffffffffffffffffffffffffffffff1661154e576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8015611625577f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b0316639e45e8f46040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115d69190614c02565b6001600160a01b0316336001600160a01b031614611620576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6116d6565b336001600160a01b03831614611667576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038216600090815260056020526040902054426fffffffffffffffffffffffffffffffff90911611156116cd576040517f1dfc20f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6116d6826122a3565b6001600160a01b03821660008181526005602052604080822080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000169055517f9390b453426557da5ebdc31f19a37753ca04addf656d32f35232211bb2af3f199190a26003611745836107d5565b6005811115611756576117566148e5565b036111635761116382611cf3565b60006005611771836107d5565b6005811115611782576117826148e5565b0361178f57506001919050565b506000919050565b336001600160a01b037f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c916146117f9576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61180161230b565b506040517fb0ea09a8000000000000000000000000000000000000000000000000000000008152600481018290526000907f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b03169063b0ea09a890602401602060405180830381865afa158015611883573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118a79190614c02565b6000549091506001600160a01b03908116908216036118ce576118c9816122a3565b6118d6565b6118d6612a46565b611163612b1b565b7f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b0316639e45e8f46040518163ffffffff1660e01b8152600401602060405180830381865afa15801561193c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119609190614c02565b6001600160a01b0316336001600160a01b0316146119aa576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f3ecf0ced0000000000000000000000000000000000000000000000000000000081526001600160a01b038281166004830152600060248301819052600160448401529182917f0000000000000000000000000b306bf915c4d645ff596e518faf3f9669b970161690633ecf0ced9060640160408051808303816000875af1158015611a3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a619190614c1f565b90925090506001600160a01b038316857f1237821480ce4d75f917bc39d1641eb17a5e09a2d5bf982cdd8cb2561aa28e68611a9c8486614bab565b6040516fffffffffffffffffffffffffffffffff909116815260200160405180910390a3611ac983612db5565b847f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663f403838d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b28573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b4c9190614b7b565b11611ba457600085815260066020526040902080546fffffffffffffffffffffffffffffffff8082168401167fffffffffffffffffffffffffffffffff00000000000000000000000000000000909116179055611cc7565b6040517f3ecf0ced0000000000000000000000000000000000000000000000000000000081526001600160a01b0385811660048301526fffffffffffffffffffffffffffffffff83166024830152600060448301527f0000000000000000000000000b306bf915c4d645ff596e518faf3f9669b970161690633ecf0ced9060640160408051808303816000875af1158015611c43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c679190614c1f565b5050611c74846000610c0c565b6040516fffffffffffffffffffffffffffffffff821681526001600160a01b0385169086907fd537f9e63e8da05cdb52f795e1c79d7b163e2517d5229375474dbe60b48cfa149060200160405180910390a35b5050505050565b600154600090611cee9063ffffffff640100000000820481169116614c4e565b905090565b6040517f8abf0af00000000000000000000000000000000000000000000000000000000081526001600160a01b038083166004830152611da59183917f0000000000000000000000000b306bf915c4d645ff596e518faf3f9669b970161690638abf0af090602401602060405180830381865afa158015611d78573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d9c9190614afe565b60019190612ed8565b806001600160a01b03167ff33a24861b76047debce215c7ae4915a9befc5d870e97efbd4152df23c72112a42604051611de091815260200190565b60405180910390a250565b6001600160a01b038116600090815260028301602052604081205463ffffffff16808203611e1d576000915050611f88565b6001600160a01b03831660009081526002850160209081526040808320805463ffffffff1916905563ffffffff8481168452600180890190935292208054910154740100000000000000000000000000000000000000009091049091169061010090046effffffffffffffffffffffffffffff165b63ffffffff821615611f345763ffffffff91821660009081526001808801602052604090912090810180546effffffffffffffffffffffffffffff7001000000000000000000000000000000008083048216869003909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9091161790555474010000000000000000000000000000000000000000900490911690611e92565b611f3e868461345d565b50508354600163ffffffff64010000000080840482168301909116027fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff9092169190911785559150505b92915050565b6001600160a01b038216600090815260028401602052604081205463ffffffff16808203611fc057600091505061229c565b63ffffffff80821660009081526001808801602052604090912090810180546effffffffffffffffffffffffffffff8781166101008181027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff85161790945593549290910416927401000000000000000000000000000000000000000090910416908210156121705763ffffffff83166000908152600188810160205260409091200180547fff000000000000000000000000000000ffffffffffffffffffffffffffffffff8116848803700100000000000000000000000000000000928390046effffffffffffffffffffffffffffff908116820116909202179091555b63ffffffff8216156121605763ffffffff91821660009081526001808a01602052604090912090810180546effffffffffffffffffffffffffffff70010000000000000000000000000000000080830482168601909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff90911617905554740100000000000000000000000000000000000000009004909116906120bf565b5061216b8784613be9565b612294565b63ffffffff83166000908152600188810160205260409091200180547fff000000000000000000000000000000ffffffffffffffffffffffffffffffff8116878503700100000000000000000000000000000000928390046effffffffffffffffffffffffffffff90811682900316909202179091555b63ffffffff8216156122895763ffffffff91821660009081526001808a01602052604090912090810180546effffffffffffffffffffffffffffff7001000000000000000000000000000000008083048216869003909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff90911617905554740100000000000000000000000000000000000000009004909116906121e7565b506122948784613df5565b600193505050505b9392505050565b6001600160a01b038116600090815260046020526040902054610100900460ff1615612308576001600160a01b038116600090815260046020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1690555b50565b6000807f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663f403838d6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561236c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123909190614b7b565b905060007f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b03166369f16eec6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156123f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124169190614b7b565b90507f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612476573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061249a9190614c02565b6001600160a01b031663ad36d6cc836040518263ffffffff1660e01b81526004016124c791815260200190565b602060405180830381865afa1580156124e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125089190614c6b565b6125155760009250505090565b6000805b7f000000000000000000000000000000000000000000000000000000000000000a6fffffffffffffffffffffffffffffffff16826fffffffffffffffffffffffffffffffff1610801561256c5750828411155b15612985576040517f33727c4d000000000000000000000000000000000000000000000000000000008152600481018590527f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b0316906333727c4d90602401602060405180830381865afa1580156125ef573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126139190614c6b565b15612985576040517fb0ea09a8000000000000000000000000000000000000000000000000000000008152600481018590527f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b03169063b0ea09a890602401602060405180830381865afa158015612696573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126ba9190614c02565b905060008060006126ca84614220565b6040517fad4294510000000000000000000000000000000000000000000000000000000081526001600160a01b0388811660048301526fffffffffffffffffffffffffffffffff858116602484015284811660448401528316606483015293965091945092507f0000000000000000000000000b306bf915c4d645ff596e518faf3f9669b970169091169063ad42945190608401600060405180830381600087803b15801561277857600080fd5b505af115801561278c573d6000803e3d6000fd5b5050604080516fffffffffffffffffffffffffffffffff8581168252878116602083015286168183015290516001600160a01b03881693508a92507fd74a44a8cd6c73740a70271e07ee96d8a495ff30037ae6381cbcdb8fe7f2a1ea9181900360600190a36000878152600660205260409020546fffffffffffffffffffffffffffffffff168015612965576040517f3ecf0ced0000000000000000000000000000000000000000000000000000000081526001600160a01b0386811660048301526fffffffffffffffffffffffffffffffff83166024830152600060448301527f0000000000000000000000000b306bf915c4d645ff596e518faf3f9669b970161690633ecf0ced9060640160408051808303816000875af11580156128b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128db9190614c1f565b505060008881526006602090815260409182902080547fffffffffffffffffffffffffffffffff0000000000000000000000000000000016905590516fffffffffffffffffffffffffffffffff831681526001600160a01b038716918a917fd537f9e63e8da05cdb52f795e1c79d7b163e2517d5229375474dbe60b48cfa14910160405180910390a35b612970856000610c0c565b87600101975085600101955050505050612519565b6fffffffffffffffffffffffffffffffff821615612a3b576040517f9902cdc0000000000000000000000000000000000000000000000000000000008152600481018590527f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031690639902cdc090602401600060405180830381600087803b158015612a1857600080fd5b505af1158015612a2c573d6000803e3d6000fd5b50505050600194505050505090565b600094505050505090565b6000546001600160a01b0316612a5857565b600080546001600160a01b03168152600460205260409020547f00000000000000000000000000000000000000000000000000000000000000026fffffffffffffffffffffffffffffffff1661010090910460ff1610612ac7576000546107d3906001600160a01b0316612db5565b600080546001600160a01b03168152600460205260409020805460ff6101008083048216600101909116027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116179055565b6001805468010000000000000000900463ffffffff1660009081526002602052604081209091015470010000000000000000000000000000000090046effffffffffffffffffffffffffffff16905060007f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663f403838d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612bca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bee9190614b7b565b90506000826effffffffffffffffffffffffffffff16118015612c115750600081115b15612d895760006001600160a01b037f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c91663a25ae557612c52600185614b94565b6040518263ffffffff1660e01b8152600401612c7091815260200190565b608060405180830381865afa158015612c8d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cb19190614c88565b90506000838260200151434144600143612ccb9190614b94565b6040805160208101969096528501939093527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606092831b1691840191909152607483015240609482015260b4016040516020818303038152906040528051906020012060001c612d3c9190614d5a565b9050612d49600182614309565b600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055506111639050565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555050565b6000612df36fffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000781642614daf565b6001600160a01b03831660008181526005602090815260409182902080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff8616908117909155915191825292935090917f95a398f2b6b2ad94f281708c97fe502386fc16adca43daed577a1e992a4cc814910160405180910390a2612e8c600183611deb565b1561116357816001600160a01b03167fdee7e7274fb1911def379ceda542a2723358c99d6d1f89fcbdbe9e9d638d996142604051612ecc91815260200190565b60405180910390a25050565b60006040518060e00160405280846001600160a01b03168152602001600063ffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600115158152602001836effffffffffffffffffffffffffffff168152602001836effffffffffffffffffffffffffffff16815250905083600001600081819054906101000a900463ffffffff168092919060010191906101000a81548163ffffffff021916908363ffffffff1602179055505060008460000160009054906101000a900463ffffffff169050818560010160008363ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160000160146101000a81548163ffffffff021916908363ffffffff16021790555060408201518160000160186101000a81548163ffffffff021916908363ffffffff160217905550606082015181600001601c6101000a81548163ffffffff021916908363ffffffff16021790555060808201518160010160006101000a81548160ff02191690831515021790555060a08201518160010160016101000a8154816effffffffffffffffffffffffffffff02191690836effffffffffffffffffffffffffffff16021790555060c08201518160010160106101000a8154816effffffffffffffffffffffffffffff02191690836effffffffffffffffffffffffffffff16021790555090505080856002016000866001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508460000160089054906101000a900463ffffffff1663ffffffff166000036131b357845463ffffffff90911668010000000000000000027fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff90911617909355505050565b845468010000000000000000900463ffffffff165b63ffffffff808216600090815260018089016020526040822090810180546effffffffffffffffffffffffffffff70010000000000000000000000000000000080830482168b01909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff90911617905580549092600160c01b9091041690036132ef5763ffffffff838116600081815260018a016020526040902080547fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000938616939093029290921790915581547fffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffff16600160c01b9091021781556132e68784613be9565b50505050505050565b8054600160e01b900463ffffffff166000036133c55763ffffffff838116600081815260018a8101602052604090912080547fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000948716949094029390931783559190910180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905581547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16600160e01b9091021781556132e68784613be9565b805463ffffffff600160e01b8204811660009081526001808b016020526040808320820154600160c01b909504909316825291902001546effffffffffffffffffffffffffffff70010000000000000000000000000000000092839004811692909104161115613445578054600160e01b900463ffffffff169150613457565b8054600160c01b900463ffffffff1691505b506131c8565b63ffffffff8082166000908152600184016020526040812080549092600160c01b909104169003613740578054600160e01b900463ffffffff166000036135ef57805474010000000000000000000000000000000000000000900463ffffffff166000036134f05782547fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff1683556135ab565b600181015460ff161561355857805474010000000000000000000000000000000000000000900463ffffffff166000908152600184016020526040902080547fffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffff1690556135ab565b805474010000000000000000000000000000000000000000900463ffffffff166000908152600184016020526040902080547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690555b5063ffffffff1660009081526001918201602052604081209081550180547fff00000000000000000000000000000000000000000000000000000000000000169055565b805463ffffffff600160e01b80830482166000908152600180880160209081526040808420547fffffffffffffffffffffffff00000000000000000000000000000000000000009097166001600160a01b0397881617808955859004861684528084208084018054948a0180546effffffffffffffffffffffffffffff6101009788900481169097027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff8216811783559254700100000000000000000000000000000000908190049097169096027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9092167fff000000000000000000000000000000000000000000000000000000000000ff9096169590951717909355915490951682526002880190945292909220805494821663ffffffff199095169490941790935581540490911690613be3565b8054600160e01b900463ffffffff166000036138a757805463ffffffff600160c01b80830482166000908152600180880160209081526040808420547fffffffffffffffffffffffff00000000000000000000000000000000000000009097166001600160a01b0397881617808955859004861684528084208084018054948a0180546effffffffffffffffffffffffffffff6101009788900481169097027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff8216811783559254700100000000000000000000000000000000908190049097169096027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9092167fff000000000000000000000000000000000000000000000000000000000000ff9096169590951717909355915490951682526002880190945292909220805494821663ffffffff199095169490941790935581540490911690613be3565b805463ffffffff600160e01b82048116600090815260018087016020526040808320820154600160c01b909504909316825291902001546effffffffffffffffffffffffffffff61010092839004811692909104161115613a7557805463ffffffff600160c01b80830482166000908152600180880160209081526040808420547fffffffffffffffffffffffff00000000000000000000000000000000000000009097166001600160a01b03978816178089558581048716855281852080850180548b870180546effffffffffffffffffffffffffffff6101009384900481169093027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff821681178355600160e01b9096048c168a52868a20909801549254700100000000000000000000000000000000908190048316938190048316939093019091169091027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9093167fff000000000000000000000000000000000000000000000000000000000000ff9096169590951791909117909355915490951682526002880190945292909220805494821663ffffffff199095169490941790935581540490911690613be3565b805463ffffffff600160e01b80830482166000908152600180880160209081526040808420547fffffffffffffffffffffffff00000000000000000000000000000000000000009097166001600160a01b03978816178089558581048716855281852080850180548b870180546effffffffffffffffffffffffffffff6101009384900481169093027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff8216811783559354600160c01b9096048c168a52868a2090980154700100000000000000000000000000000000908190048316958190048316959095019091169093027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9091167fff000000000000000000000000000000000000000000000000000000000000ff90961695909517949094179055915490951682526002880190945292909220805494821663ffffffff1990951694909417909355815404909116905b5061345d565b63ffffffff80821660009081526001840160205260408082208054740100000000000000000000000000000000000000009004909316825290205b815474010000000000000000000000000000000000000000900463ffffffff1615801590613c775750600180820154908301546effffffffffffffffffffffffffffff6101009283900481169290910416115b15610d7b57815481547fffffffffffffffffffffffff00000000000000000000000000000000000000008083166001600160a01b03928316178555835416918116919091178255600180840180548483018054610100908190046effffffffffffffffffffffffffffff9081168083027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff80871691909117875584549584900483169384029516949094179092558354929003700100000000000000000000000000000000808404831691909103909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9091161790558354821660009081526002870160209081526040808320805463ffffffff998a1663ffffffff199182161790915587549654909516835280832080549095167401000000000000000000000000000000000000000096879004891617909455945484900486168082529187019094528184208054939093049094168352909120613c24565b5b63ffffffff8082166000908152600180850160205260408083208054600160e01b810486168552828520840154600160c01b90910490951684529220015490916effffffffffffffffffffffffffffff61010091829004811691909204909116111561403e57600180820154825463ffffffff600160c01b90910416600090815285830160205260409020909101546effffffffffffffffffffffffffffff61010092839004811692909104161115610cab57805463ffffffff600160c01b80830482166000908152600187810160208181526040808520547fffffffffffffffffffffffff0000000000000000000000000000000000000000808a166001600160a01b0392831617808c558890048916875282872080549091169982169990991790985583890180548a548890048916875282872086018054610100908190046effffffffffffffffffffffffffffff9081168083027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff80871691909117909655835494839004821692830294909516939093179091558b548990048a168852838820909601805496909203700100000000000000000000000000000000808804831691909103909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9095169490941790935587548716845260028a0180825283852080549a881663ffffffff199b8c1617905588548690048716808652928252838520549097168452959095529020805490951690921790935590540416613df6565b600180820154825463ffffffff600160e01b90910416600090815285830160205260409020909101546effffffffffffffffffffffffffffff61010092839004811692909104161115610cab57805463ffffffff600160e01b80830482166000908152600187810160208181526040808520547fffffffffffffffffffffffff0000000000000000000000000000000000000000808a166001600160a01b0392831617808c558890048916875282872080549091169982169990991790985583890180548a548890048916875282872086018054610100908190046effffffffffffffffffffffffffffff9081168083027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff80871691909117909655835494839004821692830294909516939093179091558b548990048a168852838820909601805496909203700100000000000000000000000000000000808804831691909103909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9095169490941790935587548716845260028a0180825283852080549a881663ffffffff199b8c1617905588548690048716808652928252838520549097168452959095529020805490951690921790935590540416613df6565b6001600160a01b0381166000908152600460205260408120548190819062010000900460ff1681614250866144d8565b90506000806142956fffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000001485011685606461460e565b90506142d86fffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000141660648681039061460e565b91506142fb6fffffffffffffffffffffffffffffffff841660648681039061460e565b919891975095509350505050565b815460009068010000000000000000900463ffffffff165b63ffffffff80821660009081526001808701602052604080832054600160c01b9004909316825291902001546effffffffffffffffffffffffffffff8085167001000000000000000000000000000000009092041611156143a25763ffffffff9081166000908152600185016020526040902054600160c01b900416614321565b63ffffffff8181166000818152600187810160205260408083208054600160c01b9004909516835282208101549290915291909101547001000000000000000000000000000000009091046effffffffffffffffffffffffffffff9081169094039384811661010090920416111561443b5763ffffffff1660009081526001840160205260409020546001600160a01b03169050611f88565b63ffffffff818116600090815260018681016020526040808320808301549054600160e01b9004909416835290912001546101009091046effffffffffffffffffffffffffffff908116909403938481167001000000000000000000000000000000009092041611156144ce5763ffffffff9081166000908152600185016020526040902054600160e01b900416614321565b6000915050611f88565b6040517f913f1a9f0000000000000000000000000000000000000000000000000000000081526001600160a01b03828116600483015260009182917f0000000000000000000000000b306bf915c4d645ff596e518faf3f9669b97016169063913f1a9f90602401602060405180830381865afa15801561455c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145809190614afe565b905060006145c36fffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000014166028606461460e565b9050614606816fffffffffffffffffffffffffffffffff16650100000000006145ff856fffffffffffffffffffffffffffffffff1660646146c2565b9190614789565b949350505050565b6000838302608081901c6fffffffffffffffffffffffffffffffff841611614697576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f55696e743132384d6174683a206d756c446976206f766572666c6f770000000060448201526064015b60405180910390fd5b826fffffffffffffffffffffffffffffffff1681816146b8576146b8614d2b565b0495945050505050565b60008083831080156146db57600181146146ee576146fd565b65010000000000850284900491506146fd565b65010000000000840285900491505b506402ef6c3406818002602890811c808402821c808202831c808302841c808402851c938402851c95909502841c641da06a6e33909502841c6455232d2bb2909202841c640d4ca0c283909302841c643177d95571909102841c64fffe4bcada90960290931c9490940191909101039190910303905081831115611f88576501921fb544430392915050565b600080807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff858709858702925082811083820303915050806000036147e1578382816147d7576147d7614d2b565b049250505061229c565b80841161484a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d6174683a206d756c446976206f766572666c6f770000000000000000000000604482015260640161468e565b60008486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091026000889003889004909101858311909403939093029303949094049190911702949350505050565b6001600160a01b038116811461230857600080fd5b6000602082840312156148da57600080fd5b813561229c816148b3565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b602081016006831061494f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b600060208083528351808285015260005b8181101561498257858101830151858201604001528201614966565b81811115614994576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b801515811461230857600080fd5b600080604083850312156149e957600080fd5b82356149f4816148b3565b91506020830135614a04816149c8565b809150509250929050565b803560ff81168114614a2057600080fd5b919050565b600060208284031215614a3757600080fd5b61229c82614a0f565b6fffffffffffffffffffffffffffffffff8116811461230857600080fd5b600080600060608486031215614a7357600080fd5b8335614a7e81614a40565b9250614a8c60208501614a0f565b9150614a9a60408501614a0f565b90509250925092565b600060208284031215614ab557600080fd5b5035919050565b600080600060608486031215614ad157600080fd5b833592506020840135614ae3816148b3565b91506040840135614af3816148b3565b809150509250925092565b600060208284031215614b1057600080fd5b815161229c81614a40565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006fffffffffffffffffffffffffffffffff83811690831681811015614b7357614b73614b1b565b039392505050565b600060208284031215614b8d57600080fd5b5051919050565b600082821015614ba657614ba6614b1b565b500390565b60006fffffffffffffffffffffffffffffffff808316818516808303821115614bd657614bd6614b1b565b01949350505050565b600060ff821660ff841680821015614bf957614bf9614b1b565b90039392505050565b600060208284031215614c1457600080fd5b815161229c816148b3565b60008060408385031215614c3257600080fd5b8251614c3d81614a40565b6020840151909250614a0481614a40565b600063ffffffff83811690831681811015614b7357614b73614b1b565b600060208284031215614c7d57600080fd5b815161229c816149c8565b600060808284031215614c9a57600080fd5b6040516080810181811067ffffffffffffffff82111715614ce4577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040528251614cf2816148b3565b8152602083810151908201526040830151614d0c81614a40565b60408201526060830151614d1f81614a40565b60608201529392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006effffffffffffffffffffffffffffff80841680614da3577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b92169190910692915050565b60008219821115614dc257614dc2614b1b565b50019056fea164736f6c634300080f000a", + "codeHash": "0x40dcc1ea74a410b70e21a7894e27d57737d1e73bf36634e581fac40f476ea800", + "code": "0x608060405234801561001057600080fd5b50600436106102765760003560e01c8063970531c111610160578063b91b2723116100d8578063c2d9b6841161008c578063dff221b511610071578063dff221b514610769578063e0cc26a21461079a578063e7816b7f146107cc57600080fd5b8063c2d9b6841461071d578063cdff5e191461074c57600080fd5b8063be119347116100bd578063be119347146106b2578063be995dc2146106c5578063c26148fe146106d857600080fd5b8063b91b2723146102fd578063bde022bb1461069157600080fd5b8063a3433d071161012f578063ac6c525111610114578063ac6c5251146105a5578063af6ca7621461061a578063b2653fe31461066a57600080fd5b8063a3433d071461056b578063abeba4491461057e57600080fd5b8063970531c1146104e35780639d6b2e371461051e5780639e449b02146105315780639f8a13d71461055857600080fd5b80633ee4d4a3116101f357806356b65e97116101c25780636874e042116101a75780636874e042146104a1578063891aab74146104c8578063943e4005146104db57600080fd5b806356b65e97146104415780635bab847f1461048e57600080fd5b80633ee4d4a31461038357806342223ae9146103aa5780634cca5e6c146103d157806354fd4d50146103f857600080fd5b80631796e52e1161024a578063263a34021161022f578063263a34021461035357806330ccebb51461035b5780633a5490461461037b57600080fd5b80631796e52e1461030557806322009af61461032c57600080fd5b80621c2ff61461027b578063065643ea146102bf5780630763fa7e146102d4578063110d6069146102fd575b600080fd5b6102a27f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c981565b6040516001600160a01b0390911681526020015b60405180910390f35b6102d26102cd366004614a2e565b6107f3565b005b6102dc602881565b6040516fffffffffffffffffffffffffffffffff90911681526020016102b6565b6102dc606481565b6102dc7f000000000000000000000000000000000000000000000000000000000000003281565b6102dc7f000000000000000000000000000000000000000000000000000000000000001481565b6102d2610b20565b61036e610369366004614a77565b610bab565b6040516102b69190614ac3565b6102a2610eb4565b6102a27f00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c881565b6102dc7f000000000000000000000000000000000000000000000000000000000000000281565b6102dc7f000000000000000000000000000000000000000000000000000000000000000481565b6104346040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516102b69190614b04565b61047e61044f366004614a77565b6001600160a01b03166000908152600560205260409020546fffffffffffffffffffffffffffffffff16151590565b60405190151581526020016102b6565b6102d261049c366004614b85565b610fe2565b6102a27f0000000000000000000000000b306bf915c4d645ff596e518faf3f9669b9701681565b6102d26104d6366004614a77565b611157565b6102d261126a565b6102dc6104f1366004614a77565b6001600160a01b03166000908152600560205260409020546fffffffffffffffffffffffffffffffff1690565b6102d261052c366004614b85565b6113e5565b6102dc7f000000000000000000000000000000000000000000000000000000000000007881565b61047e610566366004614a77565b61165c565b6102d2610579366004614bbe565b61168f565b6102dc7f000000000000000000000000000000000000000000000000000000000000007881565b6105fa6105b3366004614a77565b6001600160a01b031660009081526003602090815260408083205463ffffffff168352600290915290206001015461010090046effffffffffffffffffffffffffffff1690565b6040516effffffffffffffffffffffffffffff90911681526020016102b6565b6001805468010000000000000000900463ffffffff166000908152600260205260409020015470010000000000000000000000000000000090046effffffffffffffffffffffffffffff166105fa565b6102dc7f000000000000000000000000000000000000000000000000000000000000006481565b6106a461069f366004614a77565b611853565b6040519081526020016102b6565b6102d26106c0366004614bd9565b6118c9565b6102d26106d3366004614bf2565b611a10565b61070b6106e6366004614a77565b6001600160a01b03166000908152600460205260409020546301000000900460ff1690565b60405160ff90911681526020016102b6565b6102a261072b366004614a77565b6001600160a01b039081166000908152600460205260409020600101541690565b610754611e00565b60405163ffffffff90911681526020016102b6565b61070b610777366004614a77565b6001600160a01b0316600090815260046020526040902054610100900460ff1690565b61070b6107a8366004614a77565b6001600160a01b031660009081526004602052604090205462010000900460ff1690565b6102dc7f000000000000000000000000000000000000000000000000000000000000000a81565b60006107fe33610bab565b600581111561080f5761080f614a94565b14610846576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000326fffffffffffffffffffffffffffffffff16836fffffffffffffffffffffffffffffffff1610156108c4576040517f24f21b1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606460ff83161115610902576040517f406b265300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038116610942576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33600081815260046020819052604091829020805460017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff009091166201000060ff8916021781178255810180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038781169190911790915592517fd7f1a3d8000000000000000000000000000000000000000000000000000000008152918201939093526fffffffffffffffffffffffffffffffff861660248201527f0000000000000000000000000b306bf915c4d645ff596e518faf3f9669b970169091169063d7f1a3d8906044016020604051808303816000875af1158015610a54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a789190614c19565b506fffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000064811690851610801590610ac157610ac133611e25565b60408051821515815260ff861660208201526fffffffffffffffffffffffffffffffff871681830152905133917f36f43e5c63d19ec0a34168ec0838b5bfae77656b9f5b94b896e9d2172a41f4fe919081900360600190a25050505050565b6003610b2b33610bab565b6005811115610b3c57610b3c614a94565b141580610b695750336000908152600560205260409020546fffffffffffffffffffffffffffffffff1615155b15610ba0576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ba933611e25565b565b6001600160a01b03811660009081526004602052604081205460ff16610bd357506000919050565b6040517f981cee530000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301527f00000000000000000000000000000000000000000000000000000000000000326fffffffffffffffffffffffffffffffff16917f0000000000000000000000000b306bf915c4d645ff596e518faf3f9669b970169091169063981cee5390602401602060405180830381865afa158015610c88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cac9190614c19565b6fffffffffffffffffffffffffffffffff161015610ccc57506001919050565b6001600160a01b03828116600081815260036020526040908190205490517f12188543000000000000000000000000000000000000000000000000000000008152600481019290925263ffffffff161515917f00000000000000000000000000000000000000000000000000000000000000646fffffffffffffffffffffffffffffffff16917f0000000000000000000000000b306bf915c4d645ff596e518faf3f9669b9701690911690631218854390602401602060405180830381865afa158015610d9d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dc19190614c19565b6040517f8abf0af00000000000000000000000000000000000000000000000000000000081526001600160a01b0386811660048301527f0000000000000000000000000b306bf915c4d645ff596e518faf3f9669b970161690638abf0af090602401602060405180830381865afa158015610e40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e649190614c19565b610e6e9190614c65565b6fffffffffffffffffffffffffffffffff161015610e9d5780610e945750600292915050565b50600492915050565b80610eab5750600392915050565b50600592915050565b600080546001600160a01b031615610fbd5760007f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b03166380446bd26040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f26573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f4a9190614c96565b9050804210610fac576000610f5f8242614caf565b90507f00000000000000000000000000000000000000000000000000000000000000046fffffffffffffffffffffffffffffffff16811115610faa576001600160a01b039250505090565b505b50506000546001600160a01b031690565b507f00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c890565b6000610fed83610bab565b90508180156110285750600181600581111561100b5761100b614a94565b14806110285750600481600581111561102657611026614a94565b145b1561108657611038600184611f1d565b1561108157826001600160a01b03167fdee7e7274fb1911def379ceda542a2723358c99d6d1f89fcbdbe9e9d638d99614260405161107891815260200190565b60405180910390a25b505050565b600481600581111561109a5761109a614a94565b10611081576040517f8abf0af00000000000000000000000000000000000000000000000000000000081526001600160a01b0380851660048301526111519185917f0000000000000000000000000b306bf915c4d645ff596e518faf3f9669b970161690638abf0af090602401602060405180830381865afa158015611124573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111489190614c19565b600191906120c0565b50505050565b336001600160a01b037f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c916146111b9576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006111c3610eb4565b90506001600160a01b03808216148015906111f05750806001600160a01b0316826001600160a01b031614155b15611227576040517fc625317600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6112308261165c565b611266576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050565b600261127533610bab565b600581111561128657611286614a94565b10806112b25750336000908152600560205260409020546fffffffffffffffffffffffffffffffff1615155b156112e9576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6112f233611853565b42101561132b576040517f82225faf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360008181526004602090815260409182902080547fffffffffffffffffffffffff0000000000000000000000000000000000ffffff6301000000820460ff90811662010000818102939093167fffffffffffffffffffffffff000000000000000000000000000000000000ffff851617855586519290930416808252938101829052919492939092917fa40865ec905b139b9cdbd0566756b576b074c47d9dde9f62388b1d66d3e72a64910160405180910390a2505050565b6001600160a01b0382166000908152600560205260409020546fffffffffffffffffffffffffffffffff16611446576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b801561151d577f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b0316639e45e8f46040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114ce9190614cc6565b6001600160a01b0316336001600160a01b031614611518576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6115ce565b336001600160a01b0383161461155f576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038216600090815260056020526040902054426fffffffffffffffffffffffffffffffff90911611156115c5576040517f1dfc20f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6115ce826123d5565b6001600160a01b03821660008181526005602052604080822080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000169055517f9390b453426557da5ebdc31f19a37753ca04addf656d32f35232211bb2af3f199190a2600361163d83610bab565b600581111561164e5761164e614a94565b036112665761126682611e25565b6000600561166983610bab565b600581111561167a5761167a614a94565b0361168757506001919050565b506000919050565b600261169a33610bab565b60058111156116ab576116ab614a94565b10806116d75750336000908152600560205260409020546fffffffffffffffffffffffffffffffff1615155b1561170e576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336000908152600460205260409020606460ff8316111561175b576040517f406b265300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805460ff6201000090910481169083168190036117a4576040517f150393f200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81547fffffffffffffffffffffffff0000000000000000000000000000000000ffffff16630100000060ff8581169182027fffffffffffffffffffffffff00000000000000000000000000000000ffffffff1692909217640100000000426fffffffffffffffffffffffffffffffff1602178455604080519284168352602083019190915233917f9d9fe61047777339f4f4cb36a1f75ee90e3c6aa90c13abd3ffa07f6f86e0a3079101611078565b6001600160a01b0381166000908152600460205260408120546118b1907f00000000000000000000000000000000000000000000000000000000000000789064010000000090046fffffffffffffffffffffffffffffffff16614ce3565b6fffffffffffffffffffffffffffffffff1692915050565b336001600160a01b037f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c9161461192b576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61193361243d565b506040517fb0ea09a8000000000000000000000000000000000000000000000000000000008152600481018290526000907f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b03169063b0ea09a890602401602060405180830381865afa1580156119b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119d99190614cc6565b6000549091506001600160a01b0390811690821603611a00576119fb816123d5565b611a08565b611a08612b78565b611266612c4d565b7f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b0316639e45e8f46040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a6e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a929190614cc6565b6001600160a01b0316336001600160a01b031614611adc576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f3ecf0ced0000000000000000000000000000000000000000000000000000000081526001600160a01b038281166004830152600060248301819052600160448401529182917f0000000000000000000000000b306bf915c4d645ff596e518faf3f9669b970161690633ecf0ced9060640160408051808303816000875af1158015611b6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b939190614d17565b90925090506001600160a01b038316857f1237821480ce4d75f917bc39d1641eb17a5e09a2d5bf982cdd8cb2561aa28e68611bce8486614ce3565b6040516fffffffffffffffffffffffffffffffff909116815260200160405180910390a3611bfb83612ee7565b847f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663f403838d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c5a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c7e9190614c96565b11611cd657600085815260066020526040902080546fffffffffffffffffffffffffffffffff8082168401167fffffffffffffffffffffffffffffffff00000000000000000000000000000000909116179055611df9565b6040517f3ecf0ced0000000000000000000000000000000000000000000000000000000081526001600160a01b0385811660048301526fffffffffffffffffffffffffffffffff83166024830152600060448301527f0000000000000000000000000b306bf915c4d645ff596e518faf3f9669b970161690633ecf0ced9060640160408051808303816000875af1158015611d75573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d999190614d17565b5050611da6846000610fe2565b6040516fffffffffffffffffffffffffffffffff821681526001600160a01b0385169086907fd537f9e63e8da05cdb52f795e1c79d7b163e2517d5229375474dbe60b48cfa149060200160405180910390a35b5050505050565b600154600090611e209063ffffffff640100000000820481169116614d46565b905090565b6040517f8abf0af00000000000000000000000000000000000000000000000000000000081526001600160a01b038083166004830152611ed79183917f0000000000000000000000000b306bf915c4d645ff596e518faf3f9669b970161690638abf0af090602401602060405180830381865afa158015611eaa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ece9190614c19565b6001919061300a565b806001600160a01b03167ff33a24861b76047debce215c7ae4915a9befc5d870e97efbd4152df23c72112a42604051611f1291815260200190565b60405180910390a250565b6001600160a01b038116600090815260028301602052604081205463ffffffff16808203611f4f5760009150506120ba565b6001600160a01b03831660009081526002850160209081526040808320805463ffffffff1916905563ffffffff8481168452600180890190935292208054910154740100000000000000000000000000000000000000009091049091169061010090046effffffffffffffffffffffffffffff165b63ffffffff8216156120665763ffffffff91821660009081526001808801602052604090912090810180546effffffffffffffffffffffffffffff7001000000000000000000000000000000008083048216869003909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9091161790555474010000000000000000000000000000000000000000900490911690611fc4565b612070868461358f565b50508354600163ffffffff64010000000080840482168301909116027fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff9092169190911785559150505b92915050565b6001600160a01b038216600090815260028401602052604081205463ffffffff168082036120f25760009150506123ce565b63ffffffff80821660009081526001808801602052604090912090810180546effffffffffffffffffffffffffffff8781166101008181027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff85161790945593549290910416927401000000000000000000000000000000000000000090910416908210156122a25763ffffffff83166000908152600188810160205260409091200180547fff000000000000000000000000000000ffffffffffffffffffffffffffffffff8116848803700100000000000000000000000000000000928390046effffffffffffffffffffffffffffff908116820116909202179091555b63ffffffff8216156122925763ffffffff91821660009081526001808a01602052604090912090810180546effffffffffffffffffffffffffffff70010000000000000000000000000000000080830482168601909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff90911617905554740100000000000000000000000000000000000000009004909116906121f1565b5061229d8784613d1b565b6123c6565b63ffffffff83166000908152600188810160205260409091200180547fff000000000000000000000000000000ffffffffffffffffffffffffffffffff8116878503700100000000000000000000000000000000928390046effffffffffffffffffffffffffffff90811682900316909202179091555b63ffffffff8216156123bb5763ffffffff91821660009081526001808a01602052604090912090810180546effffffffffffffffffffffffffffff7001000000000000000000000000000000008083048216869003909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9091161790555474010000000000000000000000000000000000000000900490911690612319565b506123c68784613f27565b600193505050505b9392505050565b6001600160a01b038116600090815260046020526040902054610100900460ff161561243a576001600160a01b038116600090815260046020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1690555b50565b6000807f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663f403838d6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561249e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124c29190614c96565b905060007f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b03166369f16eec6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612524573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125489190614c96565b90507f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156125a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125cc9190614cc6565b6001600160a01b031663ad36d6cc836040518263ffffffff1660e01b81526004016125f991815260200190565b602060405180830381865afa158015612616573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061263a9190614d63565b6126475760009250505090565b6000805b7f000000000000000000000000000000000000000000000000000000000000000a6fffffffffffffffffffffffffffffffff16826fffffffffffffffffffffffffffffffff1610801561269e5750828411155b15612ab7576040517f33727c4d000000000000000000000000000000000000000000000000000000008152600481018590527f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b0316906333727c4d90602401602060405180830381865afa158015612721573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127459190614d63565b15612ab7576040517fb0ea09a8000000000000000000000000000000000000000000000000000000008152600481018590527f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b03169063b0ea09a890602401602060405180830381865afa1580156127c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127ec9190614cc6565b905060008060006127fc84614352565b6040517fad4294510000000000000000000000000000000000000000000000000000000081526001600160a01b0388811660048301526fffffffffffffffffffffffffffffffff858116602484015284811660448401528316606483015293965091945092507f0000000000000000000000000b306bf915c4d645ff596e518faf3f9669b970169091169063ad42945190608401600060405180830381600087803b1580156128aa57600080fd5b505af11580156128be573d6000803e3d6000fd5b5050604080516fffffffffffffffffffffffffffffffff8581168252878116602083015286168183015290516001600160a01b03881693508a92507fd74a44a8cd6c73740a70271e07ee96d8a495ff30037ae6381cbcdb8fe7f2a1ea9181900360600190a36000878152600660205260409020546fffffffffffffffffffffffffffffffff168015612a97576040517f3ecf0ced0000000000000000000000000000000000000000000000000000000081526001600160a01b0386811660048301526fffffffffffffffffffffffffffffffff83166024830152600060448301527f0000000000000000000000000b306bf915c4d645ff596e518faf3f9669b970161690633ecf0ced9060640160408051808303816000875af11580156129e9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a0d9190614d17565b505060008881526006602090815260409182902080547fffffffffffffffffffffffffffffffff0000000000000000000000000000000016905590516fffffffffffffffffffffffffffffffff831681526001600160a01b038716918a917fd537f9e63e8da05cdb52f795e1c79d7b163e2517d5229375474dbe60b48cfa14910160405180910390a35b612aa2856000610fe2565b8760010197508560010195505050505061264b565b6fffffffffffffffffffffffffffffffff821615612b6d576040517f9902cdc0000000000000000000000000000000000000000000000000000000008152600481018590527f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031690639902cdc090602401600060405180830381600087803b158015612b4a57600080fd5b505af1158015612b5e573d6000803e3d6000fd5b50505050600194505050505090565b600094505050505090565b6000546001600160a01b0316612b8a57565b600080546001600160a01b03168152600460205260409020547f00000000000000000000000000000000000000000000000000000000000000026fffffffffffffffffffffffffffffffff1661010090910460ff1610612bf957600054610ba9906001600160a01b0316612ee7565b600080546001600160a01b03168152600460205260409020805460ff6101008083048216600101909116027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116179055565b6001805468010000000000000000900463ffffffff1660009081526002602052604081209091015470010000000000000000000000000000000090046effffffffffffffffffffffffffffff16905060007f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663f403838d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612cfc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d209190614c96565b90506000826effffffffffffffffffffffffffffff16118015612d435750600081115b15612ebb5760006001600160a01b037f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c91663a25ae557612d84600185614caf565b6040518263ffffffff1660e01b8152600401612da291815260200190565b608060405180830381865afa158015612dbf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612de39190614d80565b90506000838260200151434144600143612dfd9190614caf565b6040805160208101969096528501939093527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606092831b1691840191909152607483015240609482015260b4016040516020818303038152906040528051906020012060001c612e6e9190614e52565b9050612e7b60018261443b565b600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055506112669050565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555050565b6000612f256fffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000781642614ea7565b6001600160a01b03831660008181526005602090815260409182902080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff8616908117909155915191825292935090917f95a398f2b6b2ad94f281708c97fe502386fc16adca43daed577a1e992a4cc814910160405180910390a2612fbe600183611f1d565b1561126657816001600160a01b03167fdee7e7274fb1911def379ceda542a2723358c99d6d1f89fcbdbe9e9d638d996142604051612ffe91815260200190565b60405180910390a25050565b60006040518060e00160405280846001600160a01b03168152602001600063ffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600115158152602001836effffffffffffffffffffffffffffff168152602001836effffffffffffffffffffffffffffff16815250905083600001600081819054906101000a900463ffffffff168092919060010191906101000a81548163ffffffff021916908363ffffffff1602179055505060008460000160009054906101000a900463ffffffff169050818560010160008363ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160000160146101000a81548163ffffffff021916908363ffffffff16021790555060408201518160000160186101000a81548163ffffffff021916908363ffffffff160217905550606082015181600001601c6101000a81548163ffffffff021916908363ffffffff16021790555060808201518160010160006101000a81548160ff02191690831515021790555060a08201518160010160016101000a8154816effffffffffffffffffffffffffffff02191690836effffffffffffffffffffffffffffff16021790555060c08201518160010160106101000a8154816effffffffffffffffffffffffffffff02191690836effffffffffffffffffffffffffffff16021790555090505080856002016000866001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508460000160089054906101000a900463ffffffff1663ffffffff166000036132e557845463ffffffff90911668010000000000000000027fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff90911617909355505050565b845468010000000000000000900463ffffffff165b63ffffffff808216600090815260018089016020526040822090810180546effffffffffffffffffffffffffffff70010000000000000000000000000000000080830482168b01909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff90911617905580549092600160c01b9091041690036134215763ffffffff838116600081815260018a016020526040902080547fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000938616939093029290921790915581547fffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffff16600160c01b9091021781556134188784613d1b565b50505050505050565b8054600160e01b900463ffffffff166000036134f75763ffffffff838116600081815260018a8101602052604090912080547fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000948716949094029390931783559190910180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905581547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16600160e01b9091021781556134188784613d1b565b805463ffffffff600160e01b8204811660009081526001808b016020526040808320820154600160c01b909504909316825291902001546effffffffffffffffffffffffffffff70010000000000000000000000000000000092839004811692909104161115613577578054600160e01b900463ffffffff169150613589565b8054600160c01b900463ffffffff1691505b506132fa565b63ffffffff8082166000908152600184016020526040812080549092600160c01b909104169003613872578054600160e01b900463ffffffff1660000361372157805474010000000000000000000000000000000000000000900463ffffffff166000036136225782547fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff1683556136dd565b600181015460ff161561368a57805474010000000000000000000000000000000000000000900463ffffffff166000908152600184016020526040902080547fffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffff1690556136dd565b805474010000000000000000000000000000000000000000900463ffffffff166000908152600184016020526040902080547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690555b5063ffffffff1660009081526001918201602052604081209081550180547fff00000000000000000000000000000000000000000000000000000000000000169055565b805463ffffffff600160e01b80830482166000908152600180880160209081526040808420547fffffffffffffffffffffffff00000000000000000000000000000000000000009097166001600160a01b0397881617808955859004861684528084208084018054948a0180546effffffffffffffffffffffffffffff6101009788900481169097027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff8216811783559254700100000000000000000000000000000000908190049097169096027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9092167fff000000000000000000000000000000000000000000000000000000000000ff9096169590951717909355915490951682526002880190945292909220805494821663ffffffff199095169490941790935581540490911690613d15565b8054600160e01b900463ffffffff166000036139d957805463ffffffff600160c01b80830482166000908152600180880160209081526040808420547fffffffffffffffffffffffff00000000000000000000000000000000000000009097166001600160a01b0397881617808955859004861684528084208084018054948a0180546effffffffffffffffffffffffffffff6101009788900481169097027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff8216811783559254700100000000000000000000000000000000908190049097169096027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9092167fff000000000000000000000000000000000000000000000000000000000000ff9096169590951717909355915490951682526002880190945292909220805494821663ffffffff199095169490941790935581540490911690613d15565b805463ffffffff600160e01b82048116600090815260018087016020526040808320820154600160c01b909504909316825291902001546effffffffffffffffffffffffffffff61010092839004811692909104161115613ba757805463ffffffff600160c01b80830482166000908152600180880160209081526040808420547fffffffffffffffffffffffff00000000000000000000000000000000000000009097166001600160a01b03978816178089558581048716855281852080850180548b870180546effffffffffffffffffffffffffffff6101009384900481169093027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff821681178355600160e01b9096048c168a52868a20909801549254700100000000000000000000000000000000908190048316938190048316939093019091169091027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9093167fff000000000000000000000000000000000000000000000000000000000000ff9096169590951791909117909355915490951682526002880190945292909220805494821663ffffffff199095169490941790935581540490911690613d15565b805463ffffffff600160e01b80830482166000908152600180880160209081526040808420547fffffffffffffffffffffffff00000000000000000000000000000000000000009097166001600160a01b03978816178089558581048716855281852080850180548b870180546effffffffffffffffffffffffffffff6101009384900481169093027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff8216811783559354600160c01b9096048c168a52868a2090980154700100000000000000000000000000000000908190048316958190048316959095019091169093027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9091167fff000000000000000000000000000000000000000000000000000000000000ff90961695909517949094179055915490951682526002880190945292909220805494821663ffffffff1990951694909417909355815404909116905b5061358f565b63ffffffff80821660009081526001840160205260408082208054740100000000000000000000000000000000000000009004909316825290205b815474010000000000000000000000000000000000000000900463ffffffff1615801590613da95750600180820154908301546effffffffffffffffffffffffffffff6101009283900481169290910416115b1561115157815481547fffffffffffffffffffffffff00000000000000000000000000000000000000008083166001600160a01b03928316178555835416918116919091178255600180840180548483018054610100908190046effffffffffffffffffffffffffffff9081168083027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff80871691909117875584549584900483169384029516949094179092558354929003700100000000000000000000000000000000808404831691909103909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9091161790558354821660009081526002870160209081526040808320805463ffffffff998a1663ffffffff199182161790915587549654909516835280832080549095167401000000000000000000000000000000000000000096879004891617909455945484900486168082529187019094528184208054939093049094168352909120613d56565b5b63ffffffff8082166000908152600180850160205260408083208054600160e01b810486168552828520840154600160c01b90910490951684529220015490916effffffffffffffffffffffffffffff61010091829004811691909204909116111561417057600180820154825463ffffffff600160c01b90910416600090815285830160205260409020909101546effffffffffffffffffffffffffffff6101009283900481169290910416111561108157805463ffffffff600160c01b80830482166000908152600187810160208181526040808520547fffffffffffffffffffffffff0000000000000000000000000000000000000000808a166001600160a01b0392831617808c558890048916875282872080549091169982169990991790985583890180548a548890048916875282872086018054610100908190046effffffffffffffffffffffffffffff9081168083027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff80871691909117909655835494839004821692830294909516939093179091558b548990048a168852838820909601805496909203700100000000000000000000000000000000808804831691909103909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9095169490941790935587548716845260028a0180825283852080549a881663ffffffff199b8c1617905588548690048716808652928252838520549097168452959095529020805490951690921790935590540416613f28565b600180820154825463ffffffff600160e01b90910416600090815285830160205260409020909101546effffffffffffffffffffffffffffff6101009283900481169290910416111561108157805463ffffffff600160e01b80830482166000908152600187810160208181526040808520547fffffffffffffffffffffffff0000000000000000000000000000000000000000808a166001600160a01b0392831617808c558890048916875282872080549091169982169990991790985583890180548a548890048916875282872086018054610100908190046effffffffffffffffffffffffffffff9081168083027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff80871691909117909655835494839004821692830294909516939093179091558b548990048a168852838820909601805496909203700100000000000000000000000000000000808804831691909103909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9095169490941790935587548716845260028a0180825283852080549a881663ffffffff199b8c1617905588548690048716808652928252838520549097168452959095529020805490951690921790935590540416613f28565b6001600160a01b0381166000908152600460205260408120548190819062010000900460ff16816143828661460a565b90506000806143c76fffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000014850116856064614740565b905061440a6fffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000001416606486810390614740565b915061442d6fffffffffffffffffffffffffffffffff8416606486810390614740565b919891975095509350505050565b815460009068010000000000000000900463ffffffff165b63ffffffff80821660009081526001808701602052604080832054600160c01b9004909316825291902001546effffffffffffffffffffffffffffff8085167001000000000000000000000000000000009092041611156144d45763ffffffff9081166000908152600185016020526040902054600160c01b900416614453565b63ffffffff8181166000818152600187810160205260408083208054600160c01b9004909516835282208101549290915291909101547001000000000000000000000000000000009091046effffffffffffffffffffffffffffff9081169094039384811661010090920416111561456d5763ffffffff1660009081526001840160205260409020546001600160a01b031690506120ba565b63ffffffff818116600090815260018681016020526040808320808301549054600160e01b9004909416835290912001546101009091046effffffffffffffffffffffffffffff908116909403938481167001000000000000000000000000000000009092041611156146005763ffffffff9081166000908152600185016020526040902054600160e01b900416614453565b60009150506120ba565b6040517f913f1a9f0000000000000000000000000000000000000000000000000000000081526001600160a01b03828116600483015260009182917f0000000000000000000000000b306bf915c4d645ff596e518faf3f9669b97016169063913f1a9f90602401602060405180830381865afa15801561468e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906146b29190614c19565b905060006146f56fffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000141660286064614740565b9050614738816fffffffffffffffffffffffffffffffff1665010000000000614731856fffffffffffffffffffffffffffffffff1660646147f4565b91906148bb565b949350505050565b6000838302608081901c6fffffffffffffffffffffffffffffffff8416116147c9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f55696e743132384d6174683a206d756c446976206f766572666c6f770000000060448201526064015b60405180910390fd5b826fffffffffffffffffffffffffffffffff1681816147ea576147ea614e23565b0495945050505050565b600080838310801561480d57600181146148205761482f565b650100000000008502849004915061482f565b65010000000000840285900491505b506402ef6c3406818002602890811c808402821c808202831c808302841c808402851c938402851c95909502841c641da06a6e33909502841c6455232d2bb2909202841c640d4ca0c283909302841c643177d95571909102841c64fffe4bcada90960290931c94909401919091010391909103039050818311156120ba576501921fb544430392915050565b600080807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff858709858702925082811083820303915050806000036149135783828161490957614909614e23565b04925050506123ce565b80841161497c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d6174683a206d756c446976206f766572666c6f77000000000000000000000060448201526064016147c0565b60008486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091026000889003889004909101858311909403939093029303949094049190911702949350505050565b6fffffffffffffffffffffffffffffffff8116811461243a57600080fd5b803560ff81168114614a1457600080fd5b919050565b6001600160a01b038116811461243a57600080fd5b600080600060608486031215614a4357600080fd5b8335614a4e816149e5565b9250614a5c60208501614a03565b91506040840135614a6c81614a19565b809150509250925092565b600060208284031215614a8957600080fd5b81356123ce81614a19565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6020810160068310614afe577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b600060208083528351808285015260005b81811015614b3157858101830151858201604001528201614b15565b81811115614b43576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b801515811461243a57600080fd5b60008060408385031215614b9857600080fd5b8235614ba381614a19565b91506020830135614bb381614b77565b809150509250929050565b600060208284031215614bd057600080fd5b6123ce82614a03565b600060208284031215614beb57600080fd5b5035919050565b600080600060608486031215614c0757600080fd5b833592506020840135614a5c81614a19565b600060208284031215614c2b57600080fd5b81516123ce816149e5565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006fffffffffffffffffffffffffffffffff83811690831681811015614c8e57614c8e614c36565b039392505050565b600060208284031215614ca857600080fd5b5051919050565b600082821015614cc157614cc1614c36565b500390565b600060208284031215614cd857600080fd5b81516123ce81614a19565b60006fffffffffffffffffffffffffffffffff808316818516808303821115614d0e57614d0e614c36565b01949350505050565b60008060408385031215614d2a57600080fd5b8251614d35816149e5565b6020840151909250614bb3816149e5565b600063ffffffff83811690831681811015614c8e57614c8e614c36565b600060208284031215614d7557600080fd5b81516123ce81614b77565b600060808284031215614d9257600080fd5b6040516080810181811067ffffffffffffffff82111715614ddc577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040528251614dea81614a19565b8152602083810151908201526040830151614e04816149e5565b60408201526060830151614e17816149e5565b60608201529392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006effffffffffffffffffffffffffffff80841680614e9b577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b92169190910692915050565b60008219821115614eba57614eba614c36565b50019056fea164736f6c634300080f000a", "key": "0x60229d8572100b3ab5a8141d15bf4603349edc37075f6b048fb50d7c27fcb6a1" }, "0x82e01223d51eb87e16a03e24687edf0f294da6f1": { @@ -354,6 +347,13 @@ }, "key": "0x52f57297d97a84de7bdf53a239d5f1c446e6ff8e4e0d175868a241ddff7729d8" }, + "0x8fade2d6b1c46206605109f0214d17b84e46361b": { + "balance": "115792089237316195423570985008687907853269984665640564039455789925137596828552", + "nonce": 2, + "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "key": "0xb3e30270d4a7cc8c3e8a54d040acd70de5e89371fef68890ba36321e9685e739" + }, "0x959922be3caee4b8cd9a407cc3ac1c251c2007b1": { "balance": "0", "nonce": 1, @@ -519,13 +519,6 @@ "code": "0x608060405234801561001057600080fd5b50600436106100365760003560e01c80634292dc3e1461003b57806354fd4d5014610063575b600080fd5b61004e61004936600461576f565b6100ac565b60405190151581526020015b60405180910390f35b61009f6040518060400160405280600581526020017f302e312e3500000000000000000000000000000000000000000000000000000081525081565b60405161005a91906157e3565b60006100b661560c565b848460008181106100c9576100c9615856565b9050602002013570ffffffffffffffffffffffffffffffffff16816000600681106100f6576100f6615856565b602002015260888585600181811061011057610110615856565b90506020020135600116901b60888686600081811061013157610131615856565b90506020020135901c61014491906158b4565b60208201528484600281811061015c5761015c615856565b9050602002013570ffffffffffffffffffffffffffffffffff168160026006811061018957610189615856565b60200201526088858560038181106101a3576101a3615856565b90506020020135600116901b6088868660028181106101c4576101c4615856565b90506020020135901c6101d791906158b4565b606080830191909152608084811c908301526fffffffffffffffffffffffffffffffff841660a08301526040805160028082529281019091526000918291829182918291816020015b60408051808201909152600080825260208201528152602001906001900390816102205750506040805160028082526060820190925291925060009190602082015b61026a61562a565b81526020019060019003908161026257905050905061028a8d8d896104fb565b85519399509097509095509350869083906000906102aa576102aa615856565b6020026020010151600001818152505083826000815181106102ce576102ce615856565b6020026020010151602001818152505084826001815181106102f2576102f2615856565b60200260200101516000018181525050828260018151811061031657610316615856565b6020026020010151602001818152505061032e614a63565b8160008151811061034157610341615856565b6020026020010181905250610354614b0e565b8160018151811061036757610367615856565b602002602001018190525061037c8282614bb5565b6103905760009750505050505050506104f2565b8a8a60008181106103a3576103a3615856565b90506020020135826000815181106103bd576103bd615856565b6020908102919091010151528a8a60018181106103dc576103dc615856565b90506020020135826000815181106103f6576103f6615856565b602002602001015160200181815250508a8a600281811061041957610419615856565b905060200201358260018151811061043357610433615856565b6020908102919091010151528a8a600381811061045257610452615856565b905060200201358260018151811061046c5761046c615856565b60200260200101516020018181525050610484614a63565b8160008151811061049757610497615856565b60200260200101819052506104aa614b0e565b816001815181106104bd576104bd615856565b60200260200101819052506104d28282614bb5565b6104e65760009750505050505050506104f2565b60019750505050505050505b95945050505050565b60008060008061050961564f565b61051161566e565b6000806105667f2754b04f3f510d0e86a0d0e811f0fc16f92b722514e1729066d2abf90811d6f27f1816b0f9909a5a979bd34c559e57b4096bee5cce7eb668bc0a9805677f40dc858b845b6020020151614e89565b90925090506105c07f174fa57071f8f6e53fcb31a5ecc33274ec76e4e186eeb0b64255d2f314cd50b27f1c399365e85e4de2761ebcf350da85ff4518cc82f7cef64a477a7a5fd11d4a448b60015b60200201518585614eef565b90925090506106127f259a4d5cd83279b6dc9ca2008b669f82e91f23804e2524c5087a2452d52c33bd7f303abddb7ae0f35e3a6bd39314b347c3c3a433f72833dda1998ad2176258baa38b60026105b4565b90925090506106647f252b158900f31a7c0c00b924e7d3c8d61a60c5e9fd2b83251ba73d1dc0b680f57f29c8c2b3f0d74267bc2b0f9f3568838cdb0eee4719391790d93d0015c00ce5af8b60036105b4565b90925090506106b67f0c25f9f3c38b6a128d7d38c5625a3976d389b5f9f33098bb419968e4d18e150e7f21fb777462c7f4af71940423babc7f882f0c97be9620ef84f6f11974ee0edb8e8b60046105b4565b90925090506107087f2280a0fd7dbf95c450830906ffc607a373d5b9b56b9101138e925ad557eb355a7f0697ab7e9a5377e2759ab6d1283301ccae9c72bad14946a9513ee19be1ec825e8b60056105b4565b6020860152845261073b7f00b54142d3712f03ff5c15914a3dce82c0d8a8d537e165e2342048adf14e34aa846000614f3b565b8351602085015161074f9190856002614f87565b600091505b600482116107ed576107db8b8b61076c8560026158fb565b6107779060006158b4565b81811061078657610786615856565b905060200201358c8c85600261079c91906158fb565b6107a79060016158b4565b8181106107b6576107b6615856565b90506020020135858560036107cb91906158fb565b6107d69060056158b4565b614f87565b816107e581615938565b925050610754565b6107f8836014614ff7565b6040850152600091505b600d8211610896576108848b8b61081a8560026158fb565b61082590600a6158b4565b81811061083457610834615856565b905060200201358c8c85600261084a91906158fb565b61085590600b6158b4565b81811061086457610864615856565b905060200201358585600361087991906158fb565b6107d69060016158b4565b8161088e81615938565b925050610802565b6108a183602b614ff7565b60608501526108b1836001614ff7565b6080850152600091505b600982116109205761090e8b8b6108d38560026158fb565b6108de9060266158b4565b8181106108ed576108ed615856565b905060200201358c8c85600261090391906158fb565b6108559060276158b4565b8161091881615938565b9250506108bb565b61092b83601f614ff7565b60a0850152600091505b6003821161099a576109888b8b61094d8560026158fb565b61095890603a6158b4565b81811061096757610967615856565b905060200201358c8c85600261097d91906158fb565b61085590603b6158b4565b8161099281615938565b925050610935565b6109a583600d614ff7565b60c0850152600091505b60468211610a1857610a068b8b6109c78560016158fb565b6109d29060426158b4565b8181106109e1576109e1615856565b90506020020135848460026109f691906158fb565b610a019060016158b4565b614f3b565b81610a1081615938565b9250506109af565b610a2383608f614ff7565b60e0850152600091505b60038211610a9257610a808b8b610a458560026158fb565b610a509060896158b4565b818110610a5f57610a5f615856565b905060200201358c8c856002610a7591906158fb565b61085590608a6158b4565b81610a8a81615938565b925050610a2d565b610a9d83600d614ff7565b61010085015260c0840151600080516020615a46833981519152907f1dba8b5bdd64ef6ce29a9039aca3c0e524395c43b9227b96c75090cc6cc7ec97900961012085015260c0840151600080516020615a46833981519152907f24a1fcd63e9f03b27281db85fe631ec8e5c466f8178a4ee94d4942b7ccd90e1c900961014085015260c0840151600080516020615a46833981519152907f20bab6e5f766b4edf82399e9c5ff0e40d4b6875321a3d8020e18521d8f5c7241900961016085015260c0840151610b70906304000000615059565b610180850152600080516020615a46833981519152610b90600182615970565b610180860151086101a08501819052600080516020615a46833981519152907f30644e66c81e03716be83b486d6feabcc7ddd0fe6cbf5e72d585d142f7829b05096101c0850152600080516020615a46833981519152610bf1600182615970565b60c0860151089150610c0b84600e5b6020020151836150c0565b6101c08501526101a0840151600080516020615a46833981519152907f07baaa5b7af9cf52cd226bc56865f0f99ef8fcd4219060f09f43e9a148b5ab68096101e0850152600080516020615a46833981519152610c887f20bab6e5f766b4edf82399e9c5ff0e40d4b6875321a3d8020e18521d8f5c724182615970565b60c0860151089150610c9b84600f610c00565b6101e08501526101a0840151600080516020615a46833981519152907f1c699f652457365bf2fc4fa2c5c63d6c4349b03cb46d633d7a2655c5da4b900a09610200850152600080516020615a46833981519152610d187f19277f31ecb5bfe8604677099c09556812b0b5c50cceb2b584098183a5a6c5c882615970565b60c0860151089150610d2b846010610c00565b6102008501526101a0840151600080516020615a46833981519152907f205cdbaf03903a5c23e60eef0df90673bc65a25762694c501e3281153b4e588a09610220850152600080516020615a46833981519152610da87f082a7bd4c0a7e4352229d332c27a160da18f0d7c651f3047df41b80345532f6e82615970565b60c0860151089150610dbb846011610c00565b6102208501526101a0840151600080516020615a46833981519152907f27db73b1a831278e143aab90091db38afdea3294c4ba05d1c697a392eb09cc7909610240850152600080516020615a46833981519152610e387f26501ebfe559ea5826f023d3e76e4b66f170cd940408eb5590a4075c80b498d682615970565b60c0860151089150610e4b846012610c00565b6102408501526101a0840151600080516020615a46833981519152907f0204822d629ab653697f028f5fa17d23ac2ba08c60c7112d98ebd28f325f0af609610260850152600080516020615a46833981519152610ec87f0d5eb4c216db2c3262de3f6a2ef71a9be95ff21a7a1a50ed069d6131e7d54e5f82615970565b60c0860151089150610edb846013610c00565b6102608501526101a0840151600080516020615a46833981519152907f2622622a60c0d9327ccf066a0f1fce13c48601b976affd1f41c2a72a9f77da6409610280850152600080516020615a46833981519152610f587f24a1fcd63e9f03b27281db85fe631ec8e5c466f8178a4ee94d4942b7ccd90e1c82615970565b60c0860151089150610f6b846014610c00565b6102808501526102008401516101e0850151600080516020615a468339815191529190089150600080516020615a46833981519152846011602002015183089150600080516020615a46833981519152846012602002015183089150600080516020615a46833981519152846013602002015183086101e085015261103c8b8b604a818110610ffc57610ffc615856565b905060200201358c8c604881811061101657611016615856565b905060200201358d8d604981811061103057611030615856565b905060200201356150f0565b915061107b8b8b604b81811061105457611054615856565b905060200201358c8c604381811061106e5761106e615856565b90506020020135846150f0565b91506110ad8b8b604c81811061109357611093615856565b905060200201358c8c604481811061106e5761106e615856565b91506110df8b8b604d8181106110c5576110c5615856565b905060200201358c8c604581811061106e5761106e615856565b91506111118b8b604e8181106110f7576110f7615856565b905060200201358c8c604681811061106e5761106e615856565b91506111438b8b604f81811061112957611129615856565b905060200201358c8c604781811061106e5761106e615856565b610200850152600080516020615a468339815191528b8b604481811061116b5761116b615856565b905060200201358c8c604381811061118557611185615856565b905060200201350991506111ca8b8b60508181106111a5576111a5615856565b9050602002013583866010605481106111c0576111c0615856565b60200201516150f0565b610200850152600080516020615a468339815191528b8b60468181106111f2576111f2615856565b905060200201358c8c604581811061120c5761120c615856565b9050602002013509915061122c8b8b60518181106111a5576111a5615856565b610200850152600080516020615a468339815191528b8b606181811061125457611254615856565b90506020020135600080516020615a468339815191526112749190615970565b6001089150600080516020615a468339815191528285600e602002015109610220850152600080516020615a468339815191528b8b60648181106112ba576112ba615856565b905060200201358c8c60648181106112d4576112d4615856565b90506020020135099150600080516020615a468339815191528b8b606481811061130057611300615856565b90506020020135600080516020615a468339815191526113209190615970565b83089150600080516020615a4683398151915282856014602002015109610240850152600080516020615a468339815191528b8b606381811061136557611365615856565b90506020020135600080516020615a468339815191526113859190615970565b8c8c606481811061139857611398615856565b90506020020135089150600080516020615a4683398151915284600e6020020151830961026085015260c08401516060850151600080516020615a468339815191529190096102a08501526101e0840151610280850151600080516020615a468339815191529190089150600080516020615a4683398151915261142a83600080516020615a46833981519152615970565b6001086101e08501526080840151600080516020615a46833981519152908c8c604381811061145b5761145b615856565b90506020020135086102c08501526114a68b8b605b81811061147f5761147f615856565b905060200201358560036054811061149957611499615856565b60200201518660166111c0565b9150600080516020615a468339815191528b8b60628181106114ca576114ca615856565b9050602002013583096102e08501526102a08401516102c0850151600080516020615a468339815191529190089150600080516020615a468339815191528b8b606181811061151b5761151b615856565b9050602002013583096102c08501526102a0840151600080516020615a46833981519152907f09226b6e22c6f0ca64ec26aad4c86e715b5f898e5e963f25870e56bbe533e9a2096103008501526080840151600080516020615a46833981519152908c8c604481811061159057611590615856565b90506020020135086103208501526115db8b8b605c8181106115b4576115b4615856565b90506020020135856003605481106115ce576115ce615856565b60200201518660196111c0565b9150600080516020615a46833981519152846017602002015183096102e0850152610300840151610320850151600080516020615a468339815191529190089150600080516020615a46833981519152846016602002015183096102c0850152610300840151600080516020615a46833981519152907f09226b6e22c6f0ca64ec26aad4c86e715b5f898e5e963f25870e56bbe533e9a2096103008501526080840151600080516020615a46833981519152908c8c60458181106116a1576116a1615856565b90506020020135086103208501526116c58b8b605d8181106115b4576115b4615856565b9150600080516020615a46833981519152846017602002015183096102e0850152610300840151610320850151600080516020615a468339815191529190089150600080516020615a46833981519152846016602002015183096102c0850152610300840151600080516020615a46833981519152907f09226b6e22c6f0ca64ec26aad4c86e715b5f898e5e963f25870e56bbe533e9a2096103008501526102c0840151600080516020615a46833981519152906117839082615970565b6102e0860151089150600080516020615a4683398151915284600f602002015183096102c08501526102a0840151600080516020615a46833981519152907f18afdf23e9bd9302673fc1e076a492d4d65bd18ebc4d854ed189139bab313e5290096102a08501526080840151600080516020615a46833981519152908c8c604681811061181257611812615856565b90506020020135086102e085015261185d8b8b605e81811061183657611836615856565b905060200201358560036054811061185057611850615856565b60200201518660176111c0565b9150600080516020615a468339815191528b8b606581811061188157611881615856565b9050602002013583096103008501526102a08401516102e0850151600080516020615a468339815191529190089150600080516020615a468339815191528b8b60648181106118d2576118d2615856565b9050602002013583096102e08501526102a0840151600080516020615a46833981519152907f09226b6e22c6f0ca64ec26aad4c86e715b5f898e5e963f25870e56bbe533e9a2096102a08501526080840151600080516020615a46833981519152908c8c604781811061194757611947615856565b905060200201350861032085015261196b8b8b605f8181106115b4576115b4615856565b9150600080516020615a46833981519152846018602002015183096103008501526102a0840151610320850151600080516020615a468339815191529190089150600080516020615a46833981519152846017602002015183096102e08501526102a0840151600080516020615a46833981519152907f09226b6e22c6f0ca64ec26aad4c86e715b5f898e5e963f25870e56bbe533e9a2096102a08501526080840151600080516020615a46833981519152908c8c6042818110611a3157611a31615856565b9050602002013508610320850152611a558b8b60608181106115b4576115b4615856565b9150600080516020615a46833981519152846018602002015183096103008501526102a0840151610320850151600080516020615a468339815191529190089150600080516020615a46833981519152846017602002015183096102e08501526102a0840151600080516020615a46833981519152907f09226b6e22c6f0ca64ec26aad4c86e715b5f898e5e963f25870e56bbe533e9a2096102a08501526102e0840151600080516020615a4683398151915290611b139082615970565b610300860151089150600080516020615a4683398151915284600f602002015183096102a08501526060840151600080516020615a46833981519152908c8c6068818110611b6357611b63615856565b90506020020135089150600080516020615a46833981519152828c8c6067818110611b9057611b90615856565b90506020020135096102e08501526080840151600080516020615a46833981519152908c8c606a818110611bc657611bc6615856565b90506020020135089150600080516020615a46833981519152828560176020020151096102e0850152600080516020615a468339815191528b8b6052818110611c1157611c11615856565b905060200201358c8c6043818110611c2b57611c2b615856565b90506020020135096103008501526040840151600080516020615a468339815191529060000960408501819052610300850151600080516020615a468339815191529108610300850152600080516020615a468339815191528b8b6053818110611c9757611c97615856565b9050602002013585600260548110611cb157611cb1615856565b602002015108610320850152600080516020615a468339815191528b8b606a818110611cdf57611cdf615856565b90506020020135600080516020615a46833981519152611cff9190615970565b8c8c6068818110611d1257611d12615856565b9050602002013508610340850152600080516020615a468339815191528b8b6066818110611d4257611d42615856565b90506020020135600080516020615a46833981519152611d629190615970565b6001089150600080516020615a468339815191528285600e602002015109610360850152600080516020615a468339815191528b8b6066818110611da857611da8615856565b905060200201358c8c6066818110611dc257611dc2615856565b90506020020135099150600080516020615a468339815191528b8b6066818110611dee57611dee615856565b90506020020135600080516020615a46833981519152611e0e9190615970565b83089150600080516020615a46833981519152828560146020020151096103808501526060840151610300850151600080516020615a468339815191529190089150600080516020615a46833981519152828c8c6066818110611e7357611e73615856565b90506020020135096103008501526080840151610320850151600080516020615a468339815191529190086103208501819052610300850151600080516020615a468339815191529190099150600080516020615a46833981519152611ee783600080516020615a46833981519152615970565b6102e0860151089150600080516020615a4683398151915284600f602002015183096102e08501526103408401516101c0850151600080516020615a46833981519152919009610300850152600080516020615a468339815191528b8b6069818110611f5557611f55615856565b90506020020135600080516020615a46833981519152611f759190615970565b8c8c6068818110611f8857611f88615856565b90506020020135089150600080516020615a468339815191528285601a6020020151099150600080516020615a4683398151915284600f602002015183096103408501526060840151600080516020615a46833981519152908c8c606d818110611ff457611ff4615856565b90506020020135089150600080516020615a46833981519152828c8c606c81811061202157612021615856565b90506020020135096103a08501526080840151600080516020615a46833981519152908c8c606f81811061205757612057615856565b90506020020135089150600080516020615a468339815191528285601d6020020151096103a08501526120ca8b8b605281811061209657612096615856565b905060200201358c8c60448181106120b0576120b0615856565b90506020020135866002605481106111c0576111c0615856565b6103c0850152600080516020615a468339815191528b8b606f8181106120f2576120f2615856565b90506020020135600080516020615a468339815191526121129190615970565b8c8c606d81811061212557612125615856565b90506020020135086103e0850152600080516020615a468339815191528b8b606b81811061215557612155615856565b90506020020135600080516020615a468339815191526121759190615970565b6001089150600080516020615a468339815191528285600e602002015109610400850152600080516020615a468339815191528b8b606b8181106121bb576121bb615856565b905060200201358c8c606b8181106121d5576121d5615856565b90506020020135099150600080516020615a468339815191528b8b606b81811061220157612201615856565b90506020020135600080516020615a468339815191526122219190615970565b83089150600080516020615a468339815191528285601460200201510961042085015260608401516103c0850151600080516020615a468339815191529190089150600080516020615a46833981519152828c8c606b81811061228657612286615856565b90506020020135099150600080516020615a46833981519152846019602002015183099150600080516020615a468339815191526122d283600080516020615a46833981519152615970565b6103a0860151089150600080516020615a4683398151915284600f602002015183096103a08501526103e08401516101c0850151600080516020615a468339815191529190096103c0850152600080516020615a468339815191528b8b606e81811061234057612340615856565b90506020020135600080516020615a468339815191526123609190615970565b8c8c606d81811061237357612373615856565b90506020020135089150600080516020615a468339815191528285601f6020020151099150600080516020615a4683398151915284600f602002015183096103e08501526060840151600080516020615a46833981519152908c8c60728181106123df576123df615856565b90506020020135089150600080516020615a46833981519152828c8c607181811061240c5761240c615856565b90506020020135096104408501526080840151600080516020615a46833981519152908c8c607481811061244257612442615856565b90506020020135089150600080516020615a468339815191528285602260200201510961044085015261249b8b8b605281811061248157612481615856565b905060200201358c8c60458181106120b0576120b0615856565b610460850152600080516020615a468339815191528b8b60748181106124c3576124c3615856565b90506020020135600080516020615a468339815191526124e39190615970565b8c8c60728181106124f6576124f6615856565b9050602002013508610480850152600080516020615a468339815191528b8b607081811061252657612526615856565b90506020020135600080516020615a468339815191526125469190615970565b6001089150600080516020615a468339815191528285600e6020020151096104a0850152600080516020615a468339815191528b8b607081811061258c5761258c615856565b905060200201358c8c60708181106125a6576125a6615856565b90506020020135099150600080516020615a468339815191528b8b60708181106125d2576125d2615856565b90506020020135600080516020615a468339815191526125f29190615970565b83089150600080516020615a46833981519152828560146020020151096104c08501526060840151610460850151600080516020615a468339815191529190089150600080516020615a46833981519152828c8c607081811061265757612657615856565b90506020020135099150600080516020615a46833981519152846019602002015183099150600080516020615a468339815191526126a383600080516020615a46833981519152615970565b610440860151089150600080516020615a4683398151915284600f602002015183096104408501526104808401516101c0850151600080516020615a46833981519152919009610460850152600080516020615a468339815191528b8b607381811061271157612711615856565b90506020020135600080516020615a468339815191526127319190615970565b8c8c607281811061274457612744615856565b90506020020135089150600080516020615a46833981519152828560246020020151099150600080516020615a4683398151915284600f602002015183096104808501526060840151600080516020615a46833981519152908c8c60778181106127b0576127b0615856565b90506020020135089150600080516020615a46833981519152828c8c60768181106127dd576127dd615856565b90506020020135096104e08501526080840151600080516020615a46833981519152908c8c607981811061281357612813615856565b90506020020135089150600080516020615a46833981519152828560276020020151096104e085015261286c8b8b605281811061285257612852615856565b905060200201358c8c60468181106120b0576120b0615856565b610500850152600080516020615a468339815191528b8b607981811061289457612894615856565b90506020020135600080516020615a468339815191526128b49190615970565b8c8c60778181106128c7576128c7615856565b9050602002013508610520850152600080516020615a468339815191528b8b60758181106128f7576128f7615856565b90506020020135600080516020615a468339815191526129179190615970565b6001089150600080516020615a468339815191528285600e602002015109610540850152600080516020615a468339815191528b8b607581811061295d5761295d615856565b905060200201358c8c607581811061297757612977615856565b90506020020135099150600080516020615a468339815191528b8b60758181106129a3576129a3615856565b90506020020135600080516020615a468339815191526129c39190615970565b83089150600080516020615a46833981519152828560146020020151096105608501526060840151610500850151600080516020615a468339815191529190089150600080516020615a46833981519152828c8c6075818110612a2857612a28615856565b90506020020135099150600080516020615a46833981519152846019602002015183099150600080516020615a46833981519152612a7483600080516020615a46833981519152615970565b6104e0860151089150600080516020615a4683398151915284600f602002015183096103208501526105208401516101c0850151600080516020615a468339815191529190096104e0850152600080516020615a468339815191528b8b6078818110612ae257612ae2615856565b90506020020135600080516020615a46833981519152612b029190615970565b8c8c6077818110612b1557612b15615856565b90506020020135089150600080516020615a46833981519152828560296020020151099150600080516020615a4683398151915284600f602002015183096105008501526060840151600080516020615a46833981519152908c8c607c818110612b8157612b81615856565b90506020020135089150600080516020615a46833981519152828c8c607b818110612bae57612bae615856565b90506020020135096105208501526080840151600080516020615a46833981519152908c8c607e818110612be457612be4615856565b90506020020135089150600080516020615a4683398151915282856029602002015109610520850152612c3d8b8b6054818110612c2357612c23615856565b905060200201358c8c60438181106120b0576120b0615856565b610580850152600080516020615a468339815191528b8b6055818110612c6557612c65615856565b9050602002013585600260548110612c7f57612c7f615856565b6020020151086105a0850152600080516020615a468339815191528b8b607e818110612cad57612cad615856565b90506020020135600080516020615a46833981519152612ccd9190615970565b8c8c607c818110612ce057612ce0615856565b90506020020135086105c0850152600080516020615a468339815191528b8b607a818110612d1057612d10615856565b90506020020135600080516020615a46833981519152612d309190615970565b6001089150600080516020615a468339815191528285600e6020020151096105e0850152600080516020615a468339815191528b8b607a818110612d7657612d76615856565b905060200201358c8c607a818110612d9057612d90615856565b90506020020135099150600080516020615a468339815191528b8b607a818110612dbc57612dbc615856565b90506020020135600080516020615a46833981519152612ddc9190615970565b83089150600080516020615a46833981519152828560146020020151096106008501526060840151610580850151600080516020615a468339815191529190089150600080516020615a46833981519152828c8c607a818110612e4157612e41615856565b905060200201350961058085015260808401516105a0850151600080516020615a468339815191529190089150600080516020615a468339815191528285602c6020020151099150600080516020615a46833981519152612eb083600080516020615a46833981519152615970565b610520860151089150600080516020615a4683398151915284600f602002015183096105208501526105c08401516101c0850151600080516020615a46833981519152919009610580850152600080516020615a468339815191528b8b607d818110612f1e57612f1e615856565b90506020020135600080516020615a46833981519152612f3e9190615970565b8c8c607c818110612f5157612f51615856565b90506020020135089150600080516020615a468339815191528285602e6020020151099150600080516020615a4683398151915284600f602002015183096105a08501526060840151600080516020615a46833981519152908c8c6081818110612fbd57612fbd615856565b90506020020135089150600080516020615a46833981519152828c8c6080818110612fea57612fea615856565b90506020020135096105c08501526080840151600080516020615a46833981519152908c8c608381811061302057613020615856565b90506020020135089150600080516020615a468339815191528285602e6020020151096105c085015261305f8b8b6056818110612c2357612c23615856565b610620850152600080516020615a468339815191528b8b605781811061308757613087615856565b90506020020135856002605481106130a1576130a1615856565b602002015108610640850152600080516020615a468339815191528b8b60838181106130cf576130cf615856565b90506020020135600080516020615a468339815191526130ef9190615970565b8c8c608181811061310257613102615856565b9050602002013508610660850152600080516020615a468339815191528b8b607f81811061313257613132615856565b90506020020135600080516020615a468339815191526131529190615970565b6001089150600080516020615a468339815191528285600e602002015109610680850152600080516020615a468339815191528b8b607f81811061319857613198615856565b905060200201358c8c607f8181106131b2576131b2615856565b90506020020135099150600080516020615a468339815191528b8b607f8181106131de576131de615856565b90506020020135600080516020615a468339815191526131fe9190615970565b83089150600080516020615a46833981519152828560146020020151096106a08501526060840151610620850151600080516020615a468339815191529190089150600080516020615a46833981519152828c8c607f81811061326357613263615856565b90506020020135096106208501526080840151610640850151600080516020615a468339815191529190089150600080516020615a46833981519152828560316020020151099150600080516020615a468339815191526132d283600080516020615a46833981519152615970565b6105c0860151089150600080516020615a4683398151915284600f602002015183096105c08501526106608401516101c0850151600080516020615a46833981519152919009610620850152600080516020615a468339815191528b8b608281811061334057613340615856565b90506020020135600080516020615a468339815191526133609190615970565b8c8c608181811061337357613373615856565b90506020020135089150600080516020615a46833981519152828560336020020151099150600080516020615a4683398151915284600f602002015183096106408501526060840151600080516020615a46833981519152908c8c60868181106133df576133df615856565b90506020020135089150600080516020615a46833981519152828c8c608581811061340c5761340c615856565b90506020020135096106608501526080840151600080516020615a46833981519152908c8c608881811061344257613442615856565b90506020020135089150600080516020615a46833981519152828560336020020151096106608501526134818b8b6058818110612c2357612c23615856565b6106c0850152600080516020615a468339815191528b8b60598181106134a9576134a9615856565b90506020020135856002605481106134c3576134c3615856565b6020020151086040850152600080516020615a468339815191528b8b60888181106134f0576134f0615856565b90506020020135600080516020615a468339815191526135109190615970565b8c8c608681811061352357613523615856565b90506020020135086106e0850152600080516020615a468339815191528b8b608481811061355357613553615856565b90506020020135600080516020615a468339815191526135739190615970565b6001089150600080516020615a468339815191528285600e602002015109610700850152600080516020615a468339815191528b8b60848181106135b9576135b9615856565b905060200201358c8c60848181106135d3576135d3615856565b90506020020135099150600080516020615a468339815191528b8b60848181106135ff576135ff615856565b90506020020135600080516020615a4683398151915261361f9190615970565b83089150600080516020615a468339815191528285601460200201510961028085015260608401516106c0850151600080516020615a468339815191529190089150600080516020615a46833981519152828c8c608481811061368457613684615856565b9050602002013509606085015260808401516040850151600080516020615a468339815191529190089150600080516020615a46833981519152828560036020020151099150600080516020615a468339815191526136f183600080516020615a46833981519152615970565b610660860151089150600080516020615a4683398151915284600f6020020151830960408501526106e08401516101c0850151600080516020615a468339815191529190096060850152600080516020615a468339815191528b8b608781811061375d5761375d615856565b90506020020135600080516020615a4683398151915261377d9190615970565b8c8c608681811061379057613790615856565b90506020020135089150600080516020615a46833981519152828560376020020151099150600080516020615a4683398151915284600f60200201518309608085015260a08401516137e69060008660106111c0565b915061381b8480600560200201517f35342d2c29302f2827192b2a24232226251f1e1d21201a18171c1b15161312118561511d565b915061383984806005602002015168ff040302143832312e8561511d565b915061384c8285600d60200201516150c0565b6040850152610100840151600080516020615a4683398151915290800960608501819052610100850151600080516020615a46833981519152910960808501526138d68b8b608f8181106138a2576138a2615856565b905060200201358c8c60908181106138bc576138bc615856565b905060200201358660046054811061055c5761055c615856565b90925090506138ef848c8c65ffff088b038d86866151a0565b909250905061393282828d8d608981811061390c5761390c615856565b905060200201358e8e608a81811061392657613926615856565b905060200201356152a8565b6101e08601526101c08501526101608401516080850151600080516020615a4683398151915291900960a085015260e08401516080850151600080516020615a46833981519152919009610160850181905260e0850151600080516020615a4683398151915291096101a0850181905260e0850151600080516020615a468339815191529109610200850181905260e0850151600080516020615a468339815191529109610220850181905260e0850151600080516020615a468339815191529109610240850181905260e0850151600080516020615a468339815191529109610260850152600080516020615a468339815191528b8b6087818110613a3a57613a3a615856565b9050602002013585601360548110613a5457613a54615856565b6020020151099150613a75848c8c6bffff0b6e0d731078117d128286615316565b9150613ab28b8b6069818110613a8d57613a8d615856565b9050602002013585600460548110613aa757613aa7615856565b6020020151846150f0565b6102808501526101408401516060850151600080516020615a46833981519152919009610140850152613b188b8b6063818110613af157613af1615856565b9050602002013585600360548110613b0b57613b0b615856565b60200201518660146111c0565b610280850152610120840151610100850151600080516020615a4683398151915291900961012085015260e0840151610100850151600080516020615a468339815191529190096102a0850152600091505b6008821015613c1957600080516020615a4683398151915284613b8e8460006158fb565b613b999060076158b4565b60548110613ba957613ba9615856565b602002015185613bba8560016158fb565b613bc59060156158b4565b60548110613bd557613bd5615856565b60200201510984613be78460016158fb565b613bf29060166158b4565b60548110613c0257613c02615856565b602002015281613c1181615938565b925050613b6a565b600080516020615a468339815191528b8b6085818110613c3b57613c3b615856565b9050602002013585601d60548110613c5557613c55615856565b6020020151099150613c7e848c8c73ffff0848156216651767186c19711a761b7b1c8086615316565b9150600080516020615a46833981519152828560146020020151086102808501526102a08401516060850151600080516020615a46833981519152919008606085015260e0840151600080516020615a468339815191529080096102a0850181905260e0850151600080516020615a4683398151915291096103c0850152600091505b6032821015613db057600080516020615a4683398151915284613d258460006158fb565b613d309060076158b4565b60548110613d4057613d40615856565b602002015185613d518560016158fb565b613d5c90601e6158b4565b60548110613d6c57613d6c615856565b60200201510984613d7e8460016158fb565b613d8990601f6158b4565b60548110613d9957613d99615856565b602002015281613da881615938565b925050613d01565b600080516020615a468339815191528b8b605a818110613dd257613dd2615856565b9050602002013585605060548110613dec57613dec615856565b602002015109610a208501526101808401516109e0850151600080516020615a46833981519152919009610a408501819052610180850151600080516020615a468339815191529109610a608501819052610180850151600080516020615a4683398151915291096101808501526109e08401516040850151613e7291908660516111c0565b9150613ea1848c8c7f3f50405141524253435444554556465747584859495b4a5c4b5d4c5e4d5f4e6086615316565b9150613ed0848c8c7f2f7a307c317e327f338134833584368637883849394a3a4b3b4c3c4d3d4e3e4f86615316565b9150613eff848c8c7f1f4620472161226423662468256a266b276d286f29702a722b742c752d772e7986615316565b9150613f16848c8c67ffff074315441e4586615316565b9150600080516020615a468339815191528b8b6042818110613f3a57613f3a615856565b9050602002013583089150600080516020615a468339815191528285601460200201510860408501526106c0840151610260850151600080516020615a468339815191529190086102608501526106a08401516103a0850151600080516020615a46833981519152919008610280850152610660840151610240850151600080516020615a46833981519152919008610240850152610640840151610380850151600080516020615a46833981519152919008610380850152610600840151610220850151600080516020615a468339815191529190086102208501526105e0840151610360850151600080516020615a468339815191529190086103608501526105a0840151610200850151600080516020615a46833981519152919008610200850152610580840151610340850151600080516020615a468339815191529190086103408501526105408401516101a0850151600080516020615a468339815191529190086101a0850152610520840151610320850151600080516020615a468339815191529190086103208501526104e0840151610160850151600080516020615a468339815191529190086101608501526104c0840151610300850151600080516020615a468339815191529190086103008501526104808401516080850151600080516020615a4683398151915291900860808501526104608401516102e0850151600080516020615a468339815191529190086102e08501526104408401516102c0850151600080516020615a468339815191529190086102c08501526104208401516060850151600080516020615a468339815191529190086060850152610400840151610100850151600080516020615a4683398151915291900861010085015261420d8b8b608f8181106141d9576141d9615856565b905060200201358c8c60908181106141f3576141f3615856565b905060200201358660056054811061055c5761055c615856565b9092509050614240848c8c7f182c192e1a301b321c341436098b03260a8d040a0b0e0d121016111a121e132286866151a0565b9092509050614267848c8c73ffff4f3a523c533e0c405038068908081628172a86866151a0565b90925090506142b97f22cbc20a434be99c890d0fbf8c441feaf0dfb2178561a82783b0e74fad5d91eb7f186f16fd4e05464ed8a90fea4fac4fa3a80944bcaf19d9f536f8a67e301e75f386604e6105b4565b909250905061430b7f034336e9ed495c46a1c3ca745bad166bbb675c8ee31092792d0b3d435d3da0a77f120d0016a186defe5e27918247f5fb2c6f578d8ed259080a6a91ed9e503bc79c86604d6105b4565b909250905061435d7f2c4cbb935d4c9990fcaae8d9b0a244ee3f5327a7ca816aa58a58a40c8e00457e7f130d42ccd64a2e29acce747d0e976a363ab4b22f78b8a11b13ca81cf3549943986604c6105b4565b90925090506143af7f05ba13020527a88585e1f01f1d23dd68ee0d64cad4dcb82fce758883bafc1ef27f01696dcfadbe9736c07870ef063e349b30fddbd9ce85ccc7f7b19d1b18ddaf4b86604b6105b4565b90925090506144017f1adae7001a26c1f2f5640d6c60724b413dc22ae2ed96aaaccc659021a3ae1a307f2e6ff83e2f71937c1be92fe36ad1280cb68bcdf07699ee52e4d5540fef5a4bf386604a6105b4565b90925090506144537f1b9a33b5b4544142fd3f804b5f9457c34a4ff7da0852efc4b8d4241954ef859b7f2dc9f73c2504de7a2996b6c20aac9e53a6d6bee0e32ccdd44562c3498bd57a4e8660496105b4565b90925090506144a57f2bf75d9dd944249cd720ee71585980774cb83905b860feb5af3da42ca043b1157f07b4ff44a8e4250bf3ce16c06e8430b585a7a1e85243febe565a7929db37cc9f8660486105b4565b90925090506144f77f2444b554a3ef28ed5743cf5883acf229c2d774bf5076626197ca3093666a7fe57f2f54a38842d7fb7870618b48df360608f1a801e01dfa34b49e5964dc43f989bf8660476105b4565b90925090506145497f25d344a083be7e69cb907b8705b3bab3417d4a23f06d43ca7b287028a88ec5837f2c03f591ec6858cdff27cadaac1a67a1dc9ab7877f898686efe7033e7fd02a168660466105b4565b909250905061459b7f2fd1b96dd6e1ac88d9b5d438bace1ce6e7fe07412454779502af65284fef7e227f2fe224e0009d4ab99131c7c1cc045d0d0d7a50d6757fc12e4cfd720abc066d058660456105b4565b90925090506145ed7f2bf75d9dd944249cd720ee71585980774cb83905b860feb5af3da42ca043b1157f07b4ff44a8e4250bf3ce16c06e8430b585a7a1e85243febe565a7929db37cc9f8660446105b4565b909250905061463f7f1969a5f2f2d86eecccfdee75c39368f79759667bf445eed2f9d2d72c859011bf7f055449f64bace3dadff58d914f1647a98729c5476b53b66f1ff472b9537d183c8660436105b4565b90925090506146917f2fd08ae291ca0c95ada3f562b9f9be896737fd57493c4cefa087979abda4d2d67f04a6506069e2d39e944abcc54e70e881ccdd429ed4c1017fbe1099efeb70465f8660426105b4565b90925090506146e37f0ce55ceb7e62f5d45b387d78d357bc9a8423737e1c47b079a6cd4b64748aca117f2f92a53112cbb38374218eafba1349b77d3647f0423a3b48c8cc622f53c9c3e48660416105b4565b90925090506147357f229f748a69bee4ae7fdc62af12994ec2bd7f47b607216d282cc1f96054dac0787f015e9c5665a513c49920a46fbf7e607586f5b394f7487e045d45e99b7104f4778660406105b4565b90925090506147877f1fbdd7e6e58f01eb5a63b5922c2c6babed9c93d98d28363d97f78cd474cd4f1a7f23a726f04321315f0a8d73d3b596905c3e72eb5a899bd281f18abf3d674d1cfe86603f6105b4565b90925090506147d97f250ebdee646f64bb4af9f5f55fd76ae257408de7f0786f4817032e2581aeb8477f0ec875e3938bc9be9eab457a7d1655c96e5573e0d5c047692c45c3e4eaaa5a4386603e6105b4565b909250905061482b7f2617cd43f1512cc7ec9c2b728bbf4cf18de4b4f30912c811a6bd6d7a90eb35807f0c6dd39b0cb2bde148a8aa1dd84b71f6e47365a1cd726b8428c166e2d6f9e2d886603d6105b4565b909250905061487d7f24f6a4c5ff09d31cca15502ee379d50685bfe70be297201f44d4d967deb8be147f13e3df7f2f1cd670e9f473583298014f5286eb1f2402750ece5f75825484678286603c6105b4565b90925090506148cf7f0102612ad204a0291df816e0cbd8bfb60d03a26493db681420f83add5da28c3e7f0a229f00ff3a8cfce146e4c3ab5447e9d300c83f88e2072c860e05da3b9d60cc86603b6105b4565b90925090506149217f138c357f0a9847d66feca030756c854971c8783fb6a2c2547db480cda037781c7f2c03ebe8c2606106b122920dfe0a42293421ddff6bd205db46eacc956ff2a8a186603a6105b4565b90925090506149737f04a6e8bdc030c8594e55d7fb89399e76dba4d5e9bf60fb6e1fbdb2c0ffed69267f1094abfe954af52dbe746c8cf9aaabad56aa7e4da6a9294a1736fe685fee312f8660396105b4565b90925090506149c57f175a2d1aaf07ee184a955e35f3deac123ef1088b68c38bace37056dcfc9d304d7f150856c3d1750c2578b823cb3c7d74ed3e94c1cfece7e1bfdaaff36eea788fb98660386105b4565b90925090506149f0848c8c77ffff070015021e041f06250c28102b142e18311c3420372486866151a0565b85516020870151929450909250614a0a91849184916152a8565b60208601528452614a1f60016002868161055c565b85516020870151929450909250614a379184846153b8565b602086018190528186526101c08601516101e090960151959d959c50909a509850929650505050505050565b614a6b61562a565b80517f186282957db913abd99f91db59fe69922e95040603ef44c0bd7aa3adeef8f5ac905280517f17944351223333f260ddc3b4af45191b856689eda9eab5cbcddbbe570ce860d2602091820152810180517f298adc7396bd3865cbf6d6df91bae406694e6d2215baa893bdeadb63052895f49052517f297772d34bc9aa8ae56162486363ffe417b02dc7e8c207fc2cc20203e67a02ad9060015b602002015290565b614b1661562a565b80517f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2905280517f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed602091820152810180517f275dc4a288d1afb3cbb1ac09187524c7db36395df7be3b99e673b13a075a65ec9052517f1d9befcd05a5323e6da4d435f3b617cdb3af83285c2df711ef39c01571827f9d906001614b06565b60008083516006614bc691906158fb565b905060008167ffffffffffffffff811115614be357614be36158cc565b604051908082528060200260200182016040528015614c0c578160200160208202803683370190505b509050614c1761568d565b60008551875114614c2757600080fd5b60005b8751811015614e6057878181518110614c4557614c45615856565b60200260200101516000015184826006614c5f91906158fb565b614c6a9060006158b4565b81518110614c7a57614c7a615856565b602002602001018181525050878181518110614c9857614c98615856565b60200260200101516020015184826006614cb291906158fb565b614cbd9060016158b4565b81518110614ccd57614ccd615856565b602002602001018181525050868181518110614ceb57614ceb615856565b6020908102919091010151515184614d048360066158fb565b614d0f9060026158b4565b81518110614d1f57614d1f615856565b602002602001018181525050868181518110614d3d57614d3d615856565b60209081029190910181015151015184614d588360066158fb565b614d639060036158b4565b81518110614d7357614d73615856565b602002602001018181525050868181518110614d9157614d91615856565b602002602001015160200151600060028110614daf57614daf615856565b602002015184614dc08360066158fb565b614dcb9060046158b4565b81518110614ddb57614ddb615856565b602002602001018181525050868181518110614df957614df9615856565b602002602001015160200151600160028110614e1757614e17615856565b602002015184614e288360066158fb565b614e339060056158b4565b81518110614e4357614e43615856565b602090810291909101015280614e5881615938565b915050614c2a565b50602082602086026020860160085afa905080614e7c57600080fd5b5051151595945050505050565b600080614e946156ab565b6000614eb3604051806040016040528060008152602001600081525090565b8783526020830187905260408084018790528160608560075afa915081614ed957600080fd5b8051602090910151909890975095505050505050565b600080614efa6156c9565b87815260208101879052604081018690526060810185905260808101849052614f22816153fd565b6060810151608090910151909890975095505050505050565b60028282614f4881615938565b935060908110614f5a57614f5a615856565b6020020152828282614f6b81615938565b935060908110614f7d57614f7d615856565b6020020152505050565b60018282614f9481615938565b935060908110614fa657614fa6615856565b6020020152838282614fb781615938565b935060908110614fc957614fc9615856565b6020020152828282614fda81615938565b935060908110614fec57614fec615856565b602002015250505050565b600080838363ffffffff166090811061501257615012615856565b60200201818152505060006150448484602061502e9190615987565b6150399060016159b3565b63ffffffff16615438565b5190506150508161546e565b93525090919050565b600061506361560c565b61506b61568d565b6020808352828101819052604083018190526060830186905260808301859052600080516020615a4683398151915260a08401526000908260c08560055afa9050806150b657600080fd5b5051949350505050565b6000816000036150cf57600080fd5b600080516020615a468339815191526150e7836155e2565b84099392505050565b6000600080516020615a4683398151915282600080516020615a4683398151915285870908949350505050565b6000805b60208110156151965760ff80851690811461517d5760089490941c93600080516020615a4683398151915287826054811061515e5761515e615856565b6020020151600080516020615a46833981519152868909089350615183565b50615196565b5061518f6001826158b4565b9050615121565b5090949350505050565b6000806151ab6156c9565b606081018590526080810184905260005b602081101561528d5760ff80881690811461527457601088901c9760081c60ff168a8a838181106151ef576151ef615856565b905060200201358460006005811061520957615209615856565b60200201528a8a61521b8460016158b4565b81811061522a5761522a615856565b905060200201358460016005811061524457615244615856565b60200201528b816054811061525b5761525b615856565b6020020151604085015261526e846153fd565b5061527a565b5061528d565b506152866002826158b4565b90506151bc565b50606081015160809091015190999098509650505050505050565b60008060006152ca604051806040016040528060008152602001600081525090565b6152d26156e7565b888152602081018890526040808201889052606082018790528260808360065afa9250826152ff57600080fd5b508051602090910151909890975095505050505050565b6000805b60208110156153ad5760ff80851690811461539457601085901c9460081c60ff16600080516020615a4683398151915285600080516020615a468339815191528b846054811061536c5761536c615856565b60200201518b8b8781811061538357615383615856565b90506020020135090894505061539a565b506153ad565b506153a66002826158b4565b905061531a565b509095945050505050565b6000806153f08686866153eb877f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47615970565b6152a8565b9150915094509492505050565b600060406020830160608460075afa90508061541857600080fd5b60406060830160806020850160065afa90508061543457600080fd5b5050565b61544061568d565b6000602082848660026107d05a03fa9050808061545957fe5b5080615467576154676159db565b5092915050565b6000816155c18160008190506008817eff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff16901b6008827fff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff0016901c1790506010817dffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff16901b6010827fffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff000016901c1790506020817bffffffff00000000ffffffff00000000ffffffff00000000ffffffff16901b6020827fffffffff00000000ffffffff00000000ffffffff00000000ffffffff0000000016901c17905060408177ffffffffffffffff0000000000000000ffffffffffffffff16901b6040827fffffffffffffffff0000000000000000ffffffffffffffff000000000000000016901c179050608081901b608082901c179050919050565b90506155db600080516020615a4683398151915282615a0a565b9392505050565b6000615606826156016002600080516020615a46833981519152615970565b615059565b92915050565b6040518060c001604052806006906020820280368337509192915050565b604051806040016040528061563d615705565b815260200161564a615705565b905290565b60405180610a8001604052806054906020820280368337509192915050565b6040518061120001604052806090906020820280368337509192915050565b60405180602001604052806001906020820280368337509192915050565b60405180606001604052806003906020820280368337509192915050565b6040518060a001604052806005906020820280368337509192915050565b60405180608001604052806004906020820280368337509192915050565b60405180604001604052806002906020820280368337509192915050565b60008083601f84011261573557600080fd5b50813567ffffffffffffffff81111561574d57600080fd5b6020830191508360208260051b850101111561576857600080fd5b9250929050565b60008060008060006060868803121561578757600080fd5b853567ffffffffffffffff8082111561579f57600080fd5b6157ab89838a01615723565b909750955060208801359150808211156157c457600080fd5b506157d188828901615723565b96999598509660400135949350505050565b600060208083528351808285015260005b81811015615810578581018301518582016040015282016157f4565b81811115615822576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082198211156158c7576158c7615885565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561593357615933615885565b500290565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361596957615969615885565b5060010190565b60008282101561598257615982615885565b500390565b600063ffffffff808316818516818304811182151516156159aa576159aa615885565b02949350505050565b600063ffffffff8083168185168083038211156159d2576159d2615885565b01949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b600082615a40577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b50069056fe30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001a164736f6c634300080f000a", "key": "0xe645f3e3dba1eb870eb045c6df181f42832b2ef1c0ba7b9eaac56d015a81bc52" }, - "0xc9061efaf8e1d218d2dd360bb451f4d68761ca5b": { - "balance": "115792089237316195423570985008687907853269984665640564039455583849457825464927", - "nonce": 2, - "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "key": "0x248e1a275a8edc93eae615c274d80200606473e707a1a2dac216a1061dee6eb2" - }, "0xcf7ed3acca5a467e9e704c703e8d87f634fb0fc9": { "balance": "0", "nonce": 1, @@ -575,7 +568,7 @@ "key": "0x798c6047767c10f653ca157a7f66a592a1d6ca550cae352912be0b0745336afd" }, "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266": { - "balance": "797887038450543329", + "balance": "797784809473117174", "nonce": 58, "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", diff --git a/kroma-chain-ops/genesis/testdata/test-deploy-config-full.json b/kroma-chain-ops/genesis/testdata/test-deploy-config-full.json index 19853bc71..3204ca3bf 100644 --- a/kroma-chain-ops/genesis/testdata/test-deploy-config-full.json +++ b/kroma-chain-ops/genesis/testdata/test-deploy-config-full.json @@ -63,7 +63,7 @@ "validatorManagerTrustedValidator": "0x70997970c51812dc3a010c7d01b50e0d17dc79c8", "validatorManagerMinRegisterAmount": "0x1", "validatorManagerMinActivateAmount": "0x2", - "validatorManagerCommissionMinChangeSeconds": 2, + "validatorManagerCommissionChangeDelaySeconds": 2, "validatorManagerRoundDurationSeconds": 4, "validatorManagerJailPeriodSeconds": 2, "validatorManagerJailThreshold": 2, diff --git a/kroma-devnet/devnet/__init__.py b/kroma-devnet/devnet/__init__.py index 750dce208..3de905c27 100644 --- a/kroma-devnet/devnet/__init__.py +++ b/kroma-devnet/devnet/__init__.py @@ -294,8 +294,23 @@ def devnet_deploy(paths): # TODO(seolaoh): set termination index of ValidatorPool to a smaller value when V2 goes live log.info("Register to ValidatorManager contract to be a validator...") - run_command(['docker', 'compose', 'exec', 'kroma-validator', 'kroma-validator', 'register', - '--amount', '100', '--commission-rate', '5', '--commission-max-change-rate', '5'], cwd=paths.ops_bedrock_dir) + run_command( + [ + 'docker', + 'compose', + 'exec', + 'kroma-validator', + 'kroma-validator', + 'register', + '--amount', + '100', + '--commission-rate', + '5', + '--withdraw-account', + '0x70997970C51812dc3A010C7d01b50e0d17dc79C8', + ], + cwd=paths.ops_bedrock_dir, + ) # [Kroma: END] log.info('Bringing up `artifact-server`') diff --git a/kroma-validator/cmd/README.md b/kroma-validator/cmd/README.md index d50da0b0b..4d8f5b2fa 100644 --- a/kroma-validator/cmd/README.md +++ b/kroma-validator/cmd/README.md @@ -62,10 +62,10 @@ The following commands are available in Validator System V2: - `register` - Register as new validator to `ValidatorManager`. - `--amount [value]` - _(Required)_ The amount of tokens to delegate initially (in Wei). - `--commission-rate [value]` - _(Required)_ The initial commission rate of the validator (in %). - - `--commission-max-change-rate [value]` - _(Required)_ The max change rate of the commission of the validator (in %). + - `--withdraw-account [value]` - _(Required)_ The address to withdraw deposited asset token. ```bash - kroma-validator register --amount 100000000 --commission-rate 5 --commission-max-change-rate 5 + kroma-validator register --amount 100000000 --commission-rate 5 --withdraw-account 0x0000000000000000000000000000000000000001 ``` - `activate` - Activate the validator in `ValidatorManager` to be eligible to submit output roots and create challenges. @@ -80,11 +80,17 @@ The following commands are available in Validator System V2: kroma-validator unjail ``` -- `changeCommissionRate` - Change the commission rate of the validator in `ValidatorManager`. +- `changeCommissionRate init` - Initiate the commission rate change of the validator in `ValidatorManager`. - `--commission-rate [value]` - _(Required)_ The new commission rate of the validator (in %). ```bash - kroma-validator changeCommissionRate --commission-rate 5 + kroma-validator changeCommissionRate init --commission-rate 5 + ``` + +- `changeCommissionRate finalize` - Finalize the commission rate change of the validator in `ValidatorManager`. + + ```bash + kroma-validator changeCommissionRate finalize ``` - `delegate` - Self-delegate asset tokens to the `AssetManager`. diff --git a/kroma-validator/cmd/main.go b/kroma-validator/cmd/main.go index 4ad71fcba..fc60fcf36 100644 --- a/kroma-validator/cmd/main.go +++ b/kroma-validator/cmd/main.go @@ -63,7 +63,6 @@ func main() { Flags: []cli.Flag{ cmd.TokenAmountFlag, cmd.CommissionRateFlag, - cmd.CommissionMaxChangeRateFlag, cmd.WithdrawAccountFlag, }, Action: cmd.Register, @@ -79,10 +78,21 @@ func main() { Action: cmd.Unjail, }, { - Name: "changeCommissionRate", - Usage: "(EXPERIMENTAL) Change the commission rate of the validator in ValidatorManager", - Flags: []cli.Flag{cmd.CommissionRateFlag}, - Action: cmd.ChangeCommissionRate, + Name: "changeCommissionRate", + Usage: "(EXPERIMENTAL) Change the commission rate of the validator in ValidatorManager", + Subcommands: []*cli.Command{ + { + Name: "init", + Usage: "(EXPERIMENTAL) Initiate the commission rate change", + Flags: []cli.Flag{cmd.CommissionRateFlag}, + Action: cmd.InitCommissionChange, + }, + { + Name: "finalize", + Usage: "(EXPERIMENTAL) Finalize the commission rate change", + Action: cmd.FinalizeCommissionChange, + }, + }, }, { Name: "delegate", diff --git a/kroma-validator/cmd/validator/cmd.go b/kroma-validator/cmd/validator/cmd.go index c09312418..e2399674b 100644 --- a/kroma-validator/cmd/validator/cmd.go +++ b/kroma-validator/cmd/validator/cmd.go @@ -172,7 +172,6 @@ func Register(ctx *cli.Context) error { } commissionRate := uint8(ctx.Uint64("commission-rate")) - commissionMaxChangeRate := uint8(ctx.Uint64("commission-max-change-rate")) withdrawAccount, err := opservice.ParseAddress(ctx.String(WithdrawAccountFlag.Name)) if err != nil { return fmt.Errorf("failed to parse withdraw address: %w", err) @@ -183,7 +182,7 @@ func Register(ctx *cli.Context) error { return fmt.Errorf("failed to get ValidatorManager ABI: %w", err) } - txData, err := valMgrAbi.Pack("registerValidator", assets, commissionRate, commissionMaxChangeRate, withdrawAccount) + txData, err := valMgrAbi.Pack("registerValidator", assets, commissionRate, withdrawAccount) if err != nil { return fmt.Errorf("failed to create register validator transaction data: %w", err) } @@ -257,7 +256,7 @@ func Unjail(ctx *cli.Context) error { return nil } -func ChangeCommissionRate(ctx *cli.Context) error { +func InitCommissionChange(ctx *cli.Context) error { commissionRate := uint8(ctx.Uint64("commission-rate")) txManager, err := newTxManager(ctx) @@ -270,9 +269,37 @@ func ChangeCommissionRate(ctx *cli.Context) error { return fmt.Errorf("failed to get ValidatorManager ABI: %w", err) } - txData, err := valMgrAbi.Pack("changeCommissionRate", commissionRate) + txData, err := valMgrAbi.Pack("initCommissionChange", commissionRate) if err != nil { - return fmt.Errorf("failed to create change commission rate transaction data: %w", err) + return fmt.Errorf("failed to create init commission change transaction data: %w", err) + } + + valMgrAddr, err := opservice.ParseAddress(ctx.String(flags.ValMgrAddressFlag.Name)) + if err != nil { + return fmt.Errorf("failed to parse ValidatorManager address: %w", err) + } + + if err = sendTransaction(txManager, valMgrAddr, txData, "0"); err != nil { + return err + } + + return nil +} + +func FinalizeCommissionChange(ctx *cli.Context) error { + txManager, err := newTxManager(ctx) + if err != nil { + return err + } + + valMgrAbi, err := bindings.ValidatorManagerMetaData.GetAbi() + if err != nil { + return fmt.Errorf("failed to get ValidatorManager ABI: %w", err) + } + + txData, err := valMgrAbi.Pack("finalizeCommissionChange") + if err != nil { + return fmt.Errorf("failed to create finalize commission change transaction data: %w", err) } valMgrAddr, err := opservice.ParseAddress(ctx.String(flags.ValMgrAddressFlag.Name)) diff --git a/kroma-validator/cmd/validator/flags.go b/kroma-validator/cmd/validator/flags.go index 35e764649..44a47d0ec 100644 --- a/kroma-validator/cmd/validator/flags.go +++ b/kroma-validator/cmd/validator/flags.go @@ -28,12 +28,6 @@ var CommissionRateFlag = &cli.Uint64Flag{ Required: true, } -var CommissionMaxChangeRateFlag = &cli.Uint64Flag{ - Name: "commission-max-change-rate", - Usage: "The maximum changeable commission rate at once (in percentage). Maximum 100.", - Required: true, -} - var WithdrawAccountFlag = &cli.StringFlag{ Name: "withdraw-account", Usage: "Address to withdraw deposited asset token", diff --git a/op-e2e/actions/l2_validator.go b/op-e2e/actions/l2_validator.go index 5d31ec4f8..30ba0716a 100644 --- a/op-e2e/actions/l2_validator.go +++ b/op-e2e/actions/l2_validator.go @@ -181,7 +181,6 @@ func (v *L2Validator) ActRegisterValidator(t Testing, assets *big.Int) { "registerValidator", assets, uint8(10), - uint8(2), v.address, ) require.NoError(t, err) diff --git a/op-e2e/e2eutils/validator/validator.go b/op-e2e/e2eutils/validator/validator.go index 03d3bc673..dbdf9792f 100644 --- a/op-e2e/e2eutils/validator/validator.go +++ b/op-e2e/e2eutils/validator/validator.go @@ -95,7 +95,7 @@ func (h *Helper) RegisterToValMgr(priv *ecdsa.PrivateKey, amount *big.Int, withd _, err = wait.ForReceiptOK(context.Background(), h.l1Client, tx.Hash()) require.NoError(h.t, err) - tx, err = h.ValMgrContract.RegisterValidator(transactOpts, amount, uint8(10), uint8(2), withdrawAddr) + tx, err = h.ValMgrContract.RegisterValidator(transactOpts, amount, uint8(10), withdrawAddr) require.NoError(h.t, err) _, err = wait.ForReceiptOK(context.Background(), h.l1Client, tx.Hash()) diff --git a/packages/contracts/.gas-snapshot b/packages/contracts/.gas-snapshot index b422ee9de..51af06008 100644 --- a/packages/contracts/.gas-snapshot +++ b/packages/contracts/.gas-snapshot @@ -1,28 +1,28 @@ AssetManagerTest:test_constructor_largeSlashingRate_reverts() (gas: 56130) AssetManagerTest:test_constructor_succeeds() (gas: 35234) -AssetManagerTest:test_delegateKghBatch_succeeds() (gas: 1020627) -AssetManagerTest:test_delegateKgh_succeeds() (gas: 432560) +AssetManagerTest:test_delegateKghBatch_succeeds() (gas: 1020038) +AssetManagerTest:test_delegateKgh_succeeds() (gas: 431968) AssetManagerTest:test_delegateKgh_withoutValidatorDelegation_reverts() (gas: 81093) -AssetManagerTest:test_delegate_succeeds() (gas: 349667) +AssetManagerTest:test_delegate_succeeds() (gas: 349078) AssetManagerTest:test_delegate_withoutValidatorDelegation_reverts() (gas: 26463) -AssetManagerTest:test_finalizeClaimValidatorReward_succeeds() (gas: 624863) -AssetManagerTest:test_finalizeUndelegateKgh_noReward_succeeds() (gas: 532380) -AssetManagerTest:test_finalizeUndelegateKgh_rewardExists_succeeds() (gas: 757142) -AssetManagerTest:test_finalizeUndelegateKgh_undelegationPeriodNotElapsed_reverts() (gas: 511697) -AssetManagerTest:test_finalizeUndelegate_succeeds() (gas: 661077) -AssetManagerTest:test_finalizeUndelegate_undelegationPeriodNotElapsed_reverts() (gas: 697426) +AssetManagerTest:test_finalizeClaimValidatorReward_succeeds() (gas: 633870) +AssetManagerTest:test_finalizeUndelegateKgh_noReward_succeeds() (gas: 531908) +AssetManagerTest:test_finalizeUndelegateKgh_rewardExists_succeeds() (gas: 756687) +AssetManagerTest:test_finalizeUndelegateKgh_undelegationPeriodNotElapsed_reverts() (gas: 511106) +AssetManagerTest:test_finalizeUndelegate_succeeds() (gas: 660623) +AssetManagerTest:test_finalizeUndelegate_undelegationPeriodNotElapsed_reverts() (gas: 696858) AssetManagerTest:test_finalizeUndelegate_withNoPendingShares_reverts() (gas: 17874) -AssetManagerTest:test_finalizeUndelegate_zeroRequest_reverts() (gas: 701322) -AssetManagerTest:test_initClaimValidatorReward_succeeds() (gas: 647301) +AssetManagerTest:test_finalizeUndelegate_zeroRequest_reverts() (gas: 700754) +AssetManagerTest:test_initClaimValidatorReward_succeeds() (gas: 656308) AssetManagerTest:test_initUndelegateKghBatch_noShares_reverts() (gas: 19046) -AssetManagerTest:test_initUndelegateKghBatch_succeeds() (gas: 9572864) +AssetManagerTest:test_initUndelegateKghBatch_succeeds() (gas: 9572410) AssetManagerTest:test_initUndelegateKgh_noShares_reverts() (gas: 18002) -AssetManagerTest:test_initUndelegateKgh_succeeds() (gas: 804248) -AssetManagerTest:test_initUndelegate_exactAmount_succeeds() (gas: 751931) -AssetManagerTest:test_initUndelegate_exceedsMaxAmount_reverts() (gas: 526306) -AssetManagerTest:test_initUndelegate_removedFromValidatorTree_succeeds() (gas: 518401) -AssetManagerTest:test_initUndelegate_self_succeeds() (gas: 639973) -AssetManagerTest:test_initUndelegate_succeeds() (gas: 693716) +AssetManagerTest:test_initUndelegateKgh_succeeds() (gas: 803677) +AssetManagerTest:test_initUndelegate_exactAmount_succeeds() (gas: 751365) +AssetManagerTest:test_initUndelegate_exceedsMaxAmount_reverts() (gas: 525740) +AssetManagerTest:test_initUndelegate_removedFromValidatorTree_succeeds() (gas: 517931) +AssetManagerTest:test_initUndelegate_self_succeeds() (gas: 639518) +AssetManagerTest:test_initUndelegate_succeeds() (gas: 693148) ColosseumTest:test_bisect_cancelChallenge_senderNotChallenger_reverts() (gas: 2926854) ColosseumTest:test_bisect_cancelChallenge_succeeds() (gas: 2711230) ColosseumTest:test_bisect_finalizedOutput_reverts() (gas: 462505) @@ -63,12 +63,12 @@ ColosseumTest:test_isInCreationPeriod_succeeds() (gas: 43125) ColosseumTest:test_proveFault_cancelChallenge_succeeds() (gas: 2884832) ColosseumTest:test_proveFault_finalizedOutput_reverts() (gas: 654060) ColosseumTest:test_proveFault_succeeds() (gas: 2434097) -Colosseum_ValidatorSystemUpgrade_Test:test_challengerTimeout_callValidatorManager_succeeds() (gas: 506895) -Colosseum_ValidatorSystemUpgrade_Test:test_createChallenge_callValidatorManager_succeeds() (gas: 428356) -Colosseum_ValidatorSystemUpgrade_Test:test_createChallenge_notSatisfyCondition_reverts() (gas: 92151) -Colosseum_ValidatorSystemUpgrade_Test:test_dismissChallenge_callValidatorManager_succeeds() (gas: 2528793) -Colosseum_ValidatorSystemUpgrade_Test:test_forceDeleteOutput_callValidatorManager_succeeds() (gas: 694995) -Colosseum_ValidatorSystemUpgrade_Test:test_proveFault_callValidatorManager_succeeds() (gas: 2512111) +Colosseum_ValidatorSystemUpgrade_Test:test_challengerTimeout_callValidatorManager_succeeds() (gas: 506930) +Colosseum_ValidatorSystemUpgrade_Test:test_createChallenge_callValidatorManager_succeeds() (gas: 428378) +Colosseum_ValidatorSystemUpgrade_Test:test_createChallenge_notSatisfyCondition_reverts() (gas: 92173) +Colosseum_ValidatorSystemUpgrade_Test:test_dismissChallenge_callValidatorManager_succeeds() (gas: 2528837) +Colosseum_ValidatorSystemUpgrade_Test:test_forceDeleteOutput_callValidatorManager_succeeds() (gas: 695039) +Colosseum_ValidatorSystemUpgrade_Test:test_proveFault_callValidatorManager_succeeds() (gas: 2512155) CrossDomainMessenger_BaseGas_Test:test_baseGas_succeeds() (gas: 11763) CrossDomainOwnable2_Test:test_onlyOwner_notMessenger_reverts() (gas: 8496) CrossDomainOwnable2_Test:test_onlyOwner_notOwner2_reverts() (gas: 57515) @@ -417,51 +417,51 @@ UpgradeGovernorTest:test_initialize_succeeds() (gas: 85053) UpgradeGovernorTest:test_queueProposal_succeeds() (gas: 280037) UpgradeGovernorTest:test_voteProposal_overPeriod_reverts() (gas: 152674) UpgradeGovernorTest:test_voteProposal_succeeds() (gas: 198054) -ValidatorManagerTest:test_activateValidator_alreadyActivated_reverts() (gas: 296937) -ValidatorManagerTest:test_activateValidator_exited_reverts() (gas: 350024) -ValidatorManagerTest:test_activateValidator_inJail_reverts() (gas: 1093909) -ValidatorManagerTest:test_activateValidator_notValidator_reverts() (gas: 19928) -ValidatorManagerTest:test_activateValidator_registered_reverts() (gas: 203893) -ValidatorManagerTest:test_activateValidator_succeeds() (gas: 384925) -ValidatorManagerTest:test_activatedValidatorTotalWeight_succeeds() (gas: 600026) -ValidatorManagerTest:test_afterSubmitL2Output_distributeReward_succeeds() (gas: 7368492) -ValidatorManagerTest:test_afterSubmitL2Output_resetNoSubmissionCount_succeeds() (gas: 799528) -ValidatorManagerTest:test_afterSubmitL2Output_senderNotL2OO_reverts() (gas: 15890) -ValidatorManagerTest:test_afterSubmitL2Output_tryJail_succeeds() (gas: 923180) -ValidatorManagerTest:test_afterSubmitL2Output_updatePriorityValidator_succeeds() (gas: 960848) -ValidatorManagerTest:test_changeCommissionRate_exited_reverts() (gas: 352038) -ValidatorManagerTest:test_changeCommissionRate_inJail_reverts() (gas: 933469) -ValidatorManagerTest:test_changeCommissionRate_largeChangeRate_reverts() (gas: 309259) -ValidatorManagerTest:test_changeCommissionRate_largeCommissionRate_reverts() (gas: 305154) -ValidatorManagerTest:test_changeCommissionRate_minChangeSecNotElapsed_reverts() (gas: 299594) -ValidatorManagerTest:test_changeCommissionRate_sameCommissionRate_reverts() (gas: 307017) -ValidatorManagerTest:test_changeCommissionRate_succeeds() (gas: 314949) -ValidatorManagerTest:test_changeCommissionRate_twice_succeeds() (gas: 334634) -ValidatorManagerTest:test_checkSubmissionEligibility_inJail_reverts() (gas: 938122) -ValidatorManagerTest:test_checkSubmissionEligibility_notSatisfyCondition_reverts() (gas: 22076) -ValidatorManagerTest:test_checkSubmissionEligibility_notSelected_reverts() (gas: 66802) -ValidatorManagerTest:test_checkSubmissionEligibility_priorityRound_succeeds() (gas: 300403) -ValidatorManagerTest:test_checkSubmissionEligibility_publicRound_inJail_reverts() (gas: 941385) -ValidatorManagerTest:test_checkSubmissionEligibility_publicRound_notSatisfyCondition_reverts() (gas: 71183) -ValidatorManagerTest:test_checkSubmissionEligibility_publicRound_succeeds() (gas: 349727) -ValidatorManagerTest:test_checkSubmissionEligibility_senderNotL2OO_reverts() (gas: 15649) -ValidatorManagerTest:test_constructor_smallMinActivateAmount_reverts() (gas: 62041) -ValidatorManagerTest:test_constructor_succeeds() (gas: 41721) -ValidatorManagerTest:test_getStatus_registered_succeeds() (gas: 375788) -ValidatorManagerTest:test_registerValidator_active_succeeds() (gas: 320438) -ValidatorManagerTest:test_registerValidator_alreadyInitiated_reverts() (gas: 320670) -ValidatorManagerTest:test_registerValidator_largeCommissionMaxChangeRate_reverts() (gas: 54630) -ValidatorManagerTest:test_registerValidator_largeCommissionRate_reverts() (gas: 54596) -ValidatorManagerTest:test_registerValidator_registered_succeeds() (gas: 215413) -ValidatorManagerTest:test_registerValidator_smallAsset_reverts() (gas: 54706) -ValidatorManagerTest:test_registerValidator_withdrawZeroAddr_reverts() (gas: 52581) -ValidatorManagerTest:test_slash_notColosseum_reverts() (gas: 26416) -ValidatorManagerTest:test_slash_succeeds() (gas: 14521532) -ValidatorManagerTest:test_tryUnjail_force_senderNotColosseum_reverts() (gas: 927018) -ValidatorManagerTest:test_tryUnjail_notInJail_reverts() (gas: 18375) -ValidatorManagerTest:test_tryUnjail_periodNotElapsed_reverts() (gas: 926063) -ValidatorManagerTest:test_tryUnjail_senderNotSelf_reverts() (gas: 925870) -ValidatorManagerTest:test_tryUnjail_succeeds() (gas: 1013093) +ValidatorManagerTest:test_activateValidator_alreadyActivated_reverts() (gas: 296300) +ValidatorManagerTest:test_activateValidator_exited_reverts() (gas: 349569) +ValidatorManagerTest:test_activateValidator_inJail_reverts() (gas: 1092749) +ValidatorManagerTest:test_activateValidator_notValidator_reverts() (gas: 19927) +ValidatorManagerTest:test_activateValidator_registered_reverts() (gas: 203256) +ValidatorManagerTest:test_activateValidator_succeeds() (gas: 384314) +ValidatorManagerTest:test_activatedValidatorTotalWeight_succeeds() (gas: 598492) +ValidatorManagerTest:test_afterSubmitL2Output_distributeReward_succeeds() (gas: 7368047) +ValidatorManagerTest:test_afterSubmitL2Output_resetNoSubmissionCount_succeeds() (gas: 798392) +ValidatorManagerTest:test_afterSubmitL2Output_senderNotL2OO_reverts() (gas: 15912) +ValidatorManagerTest:test_afterSubmitL2Output_tryJail_succeeds() (gas: 922087) +ValidatorManagerTest:test_afterSubmitL2Output_updatePriorityValidator_succeeds() (gas: 959746) +ValidatorManagerTest:test_checkSubmissionEligibility_inJail_reverts() (gas: 936984) +ValidatorManagerTest:test_checkSubmissionEligibility_notSatisfyCondition_reverts() (gas: 22098) +ValidatorManagerTest:test_checkSubmissionEligibility_notSelected_reverts() (gas: 66757) +ValidatorManagerTest:test_checkSubmissionEligibility_priorityRound_succeeds() (gas: 299879) +ValidatorManagerTest:test_checkSubmissionEligibility_publicRound_inJail_reverts() (gas: 940225) +ValidatorManagerTest:test_checkSubmissionEligibility_publicRound_notSatisfyCondition_reverts() (gas: 71138) +ValidatorManagerTest:test_checkSubmissionEligibility_publicRound_succeeds() (gas: 349048) +ValidatorManagerTest:test_checkSubmissionEligibility_senderNotL2OO_reverts() (gas: 15627) +ValidatorManagerTest:test_constructor_smallMinActivateAmount_reverts() (gas: 62076) +ValidatorManagerTest:test_constructor_succeeds() (gas: 41678) +ValidatorManagerTest:test_finalizeCommissionChange_changeDelayNotElapsed_reverts() (gas: 318483) +ValidatorManagerTest:test_finalizeCommissionChange_exited_reverts() (gas: 351506) +ValidatorManagerTest:test_finalizeCommissionChange_inJail_reverts() (gas: 932259) +ValidatorManagerTest:test_finalizeCommissionChange_succeeds() (gas: 335019) +ValidatorManagerTest:test_getStatus_registered_succeeds() (gas: 375222) +ValidatorManagerTest:test_initCommissionChange_exited_reverts() (gas: 351575) +ValidatorManagerTest:test_initCommissionChange_inJail_reverts() (gas: 932409) +ValidatorManagerTest:test_initCommissionChange_largeCommissionRate_reverts() (gas: 298747) +ValidatorManagerTest:test_initCommissionChange_sameCommissionRate_reverts() (gas: 300641) +ValidatorManagerTest:test_initCommissionChange_succeeds() (gas: 309900) +ValidatorManagerTest:test_registerValidator_active_succeeds() (gas: 313889) +ValidatorManagerTest:test_registerValidator_alreadyInitiated_reverts() (gas: 319932) +ValidatorManagerTest:test_registerValidator_largeCommissionRate_reverts() (gas: 54446) +ValidatorManagerTest:test_registerValidator_registered_succeeds() (gas: 214534) +ValidatorManagerTest:test_registerValidator_smallAsset_reverts() (gas: 54600) +ValidatorManagerTest:test_registerValidator_withdrawZeroAddr_reverts() (gas: 52399) +ValidatorManagerTest:test_slash_notColosseum_reverts() (gas: 26371) +ValidatorManagerTest:test_slash_succeeds() (gas: 14520465) +ValidatorManagerTest:test_tryUnjail_force_senderNotColosseum_reverts() (gas: 925948) +ValidatorManagerTest:test_tryUnjail_notInJail_reverts() (gas: 18409) +ValidatorManagerTest:test_tryUnjail_periodNotElapsed_reverts() (gas: 924959) +ValidatorManagerTest:test_tryUnjail_senderNotSelf_reverts() (gas: 924789) +ValidatorManagerTest:test_tryUnjail_succeeds() (gas: 1012101) ValidatorPoolTest:test_addPendingBond_insufficientBalances_reverts() (gas: 301266) ValidatorPoolTest:test_addPendingBond_noBond_reverts() (gas: 29957) ValidatorPoolTest:test_addPendingBond_succeeds() (gas: 371202) diff --git a/packages/contracts/contracts/L1/ValidatorManager.sol b/packages/contracts/contracts/L1/ValidatorManager.sol index 1679b72a2..8823185ff 100644 --- a/packages/contracts/contracts/L1/ValidatorManager.sol +++ b/packages/contracts/contracts/L1/ValidatorManager.sol @@ -66,9 +66,9 @@ contract ValidatorManager is ISemver, IValidatorManager { uint128 public immutable MIN_ACTIVATE_AMOUNT; /** - * @notice The minimum duration to change the commission rate of the validator (in seconds). + * @notice The delay to finalize the commission rate change of the validator (in seconds). */ - uint128 public immutable COMMISSION_RATE_MIN_CHANGE_SECONDS; + uint128 public immutable COMMISSION_CHANGE_DELAY_SECONDS; /** * @notice The duration of a submission round for one output (in seconds). @@ -159,7 +159,7 @@ contract ValidatorManager is ISemver, IValidatorManager { TRUSTED_VALIDATOR = _constructorParams._trustedValidator; MIN_REGISTER_AMOUNT = _constructorParams._minRegisterAmount; MIN_ACTIVATE_AMOUNT = _constructorParams._minActivateAmount; - COMMISSION_RATE_MIN_CHANGE_SECONDS = _constructorParams._commissionRateMinChangeSeconds; + COMMISSION_CHANGE_DELAY_SECONDS = _constructorParams._commissionChangeDelaySeconds; // Note that this value MUST be (SUBMISSION_INTERVAL * L2_BLOCK_TIME) / 2. ROUND_DURATION_SECONDS = _constructorParams._roundDurationSeconds; JAIL_PERIOD_SECONDS = _constructorParams._jailPeriodSeconds; @@ -174,7 +174,6 @@ contract ValidatorManager is ISemver, IValidatorManager { function registerValidator( uint128 assets, uint8 commissionRate, - uint8 commissionMaxChangeRate, address withdrawAccount ) external { if (getStatus(msg.sender) != ValidatorStatus.NONE) revert ImproperValidatorStatus(); @@ -183,16 +182,11 @@ contract ValidatorManager is ISemver, IValidatorManager { if (commissionRate > COMMISSION_RATE_DENOM) revert MaxCommissionRateExceeded(); - if (commissionMaxChangeRate > COMMISSION_RATE_DENOM) - revert MaxCommissionChangeRateExceeded(); - if (withdrawAccount == address(0)) revert ZeroAddress(); Validator storage validatorInfo = _validatorInfo[msg.sender]; validatorInfo.isInitiated = true; validatorInfo.commissionRate = commissionRate; - validatorInfo.commissionMaxChangeRate = commissionMaxChangeRate; - validatorInfo.commissionRateChangedAt = uint128(block.timestamp); validatorInfo.withdrawAccount = withdrawAccount; ASSET_MANAGER.delegateToRegister(msg.sender, assets); @@ -202,13 +196,7 @@ contract ValidatorManager is ISemver, IValidatorManager { _activateValidator(msg.sender); } - emit ValidatorRegistered( - msg.sender, - ready, - commissionRate, - commissionMaxChangeRate, - assets - ); + emit ValidatorRegistered(msg.sender, ready, commissionRate, assets); } /** @@ -243,32 +231,42 @@ contract ValidatorManager is ISemver, IValidatorManager { /** * @inheritdoc IValidatorManager */ - function changeCommissionRate(uint8 newCommissionRate) external { + function initCommissionChange(uint8 newCommissionRate) external { if (getStatus(msg.sender) < ValidatorStatus.REGISTERED || inJail(msg.sender)) revert ImproperValidatorStatus(); Validator storage validatorInfo = _validatorInfo[msg.sender]; - if ( - validatorInfo.commissionRateChangedAt + COMMISSION_RATE_MIN_CHANGE_SECONDS > - block.timestamp - ) revert NotElapsedCommissionChangePeriod(); - if (newCommissionRate > COMMISSION_RATE_DENOM) revert MaxCommissionRateExceeded(); uint8 oldCommissionRate = validatorInfo.commissionRate; if (newCommissionRate == oldCommissionRate) revert SameCommissionRate(); - uint8 changeRange = newCommissionRate > oldCommissionRate - ? newCommissionRate - oldCommissionRate - : oldCommissionRate - newCommissionRate; - if (changeRange > validatorInfo.commissionMaxChangeRate) - revert CommissionChangeRateExceeded(); + validatorInfo.pendingCommissionRate = newCommissionRate; + validatorInfo.commissionChangeInitTime = uint128(block.timestamp); + + emit ValidatorCommissionChangeInitiated(msg.sender, oldCommissionRate, newCommissionRate); + } + + /** + * @inheritdoc IValidatorManager + */ + function finalizeCommissionChange() external { + if (getStatus(msg.sender) < ValidatorStatus.REGISTERED || inJail(msg.sender)) + revert ImproperValidatorStatus(); + + if (block.timestamp < canFinalizeCommissionChangeAt(msg.sender)) + revert NotElapsedCommissionChangeDelay(); + + Validator storage validatorInfo = _validatorInfo[msg.sender]; + uint8 oldCommissionRate = validatorInfo.commissionRate; + uint8 newCommissionRate = validatorInfo.pendingCommissionRate; validatorInfo.commissionRate = newCommissionRate; - validatorInfo.commissionRateChangedAt = uint128(block.timestamp); + validatorInfo.pendingCommissionRate = 0; + validatorInfo.commissionChangeInitTime = 0; - emit ValidatorCommissionRateChanged(msg.sender, oldCommissionRate, newCommissionRate); + emit ValidatorCommissionChangeFinalized(msg.sender, oldCommissionRate, newCommissionRate); } /** @@ -348,14 +346,14 @@ contract ValidatorManager is ISemver, IValidatorManager { } /** - * @notice Returns the commission max change rate of given validator. + * @notice Returns the pending commission rate of given validator. * * @param validator Address of the validator. * - * @return The commission max change rate of given validator. + * @return The pending commission rate of given validator. */ - function getCommissionMaxChangeRate(address validator) external view returns (uint8) { - return _validatorInfo[validator].commissionMaxChangeRate; + function getPendingCommissionRate(address validator) external view returns (uint8) { + return _validatorInfo[validator].pendingCommissionRate; } /** @@ -492,6 +490,17 @@ contract ValidatorManager is ISemver, IValidatorManager { return _validatorInfo[validator].noSubmissionCount; } + /** + * @notice Returns when commission change of given validator can be finalized. + * + * @param validator Address of the validator. + * + * @return When commission change of given validator can be finalized. + */ + function canFinalizeCommissionChangeAt(address validator) public view returns (uint256) { + return _validatorInfo[validator].commissionChangeInitTime + COMMISSION_CHANGE_DELAY_SECONDS; + } + /** * @notice Returns the total weight of activated validators. * diff --git a/packages/contracts/contracts/L1/interfaces/IValidatorManager.sol b/packages/contracts/contracts/L1/interfaces/IValidatorManager.sol index 4d645720e..33646470e 100644 --- a/packages/contracts/contracts/L1/interfaces/IValidatorManager.sol +++ b/packages/contracts/contracts/L1/interfaces/IValidatorManager.sol @@ -40,27 +40,26 @@ interface IValidatorManager { /** * @notice Constructs the constructor parameters of ValidatorManager contract. * - * @custom:field _l2Oracle Address of the L2OutputOracle contract. - * @custom:field _assetManager Address of the AssetManager contract. - * @custom:field _trustedValidator Address of the trusted validator. - * @custom:field _commissionRateMinChangeSeconds The minimum duration to change the commission - * rate in seconds. - * @custom:field _roundDurationSeconds The duration of one submission round in - * seconds. - * @custom:field _jailPeriodSeconds The minimum duration to get out of jail in - * seconds. - * @custom:field _jailThreshold The maximum allowed number of output - * non-submissions before jailed. - * @custom:field _maxOutputFinalizations Max number of finalized outputs. - * @custom:field _baseReward Base reward for the validator. - * @custom:field _minRegisterAmount Minimum amount to register as a validator. - * @custom:field _minActivateAmount Minimum amount to activate a validator. + * @custom:field _l2Oracle Address of the L2OutputOracle contract. + * @custom:field _assetManager Address of the AssetManager contract. + * @custom:field _trustedValidator Address of the trusted validator. + * @custom:field _commissionChangeDelaySeconds The delay to finalize the commission rate change + * in seconds. + * @custom:field _roundDurationSeconds The duration of one submission round in seconds. + * @custom:field _jailPeriodSeconds The minimum duration to get out of jail in + * seconds. + * @custom:field _jailThreshold The maximum allowed number of output + * non-submissions before jailed. + * @custom:field _maxOutputFinalizations Max number of finalized outputs. + * @custom:field _baseReward Base reward for the validator. + * @custom:field _minRegisterAmount Minimum amount to register as a validator. + * @custom:field _minActivateAmount Minimum amount to activate a validator. */ struct ConstructorParams { L2OutputOracle _l2Oracle; AssetManager _assetManager; address _trustedValidator; - uint128 _commissionRateMinChangeSeconds; + uint128 _commissionChangeDelaySeconds; uint128 _roundDurationSeconds; uint128 _jailPeriodSeconds; uint128 _jailThreshold; @@ -73,21 +72,21 @@ interface IValidatorManager { /** * @notice Constructs the information of a validator. * - * @custom:field isInitiated Whether the validator is initiated. - * @custom:field noSubmissionCount Number of counts that the validator did not submit the - * output in priority round. - * @custom:field commissionRate Commission rate of validator. - * @custom:field commissionMaxChangeRate Maximum changeable commission rate at once. - * @custom:field commissionRateChangedAt Last timestamp when the commission rate was changed. - * @custom:field withdrawAccount An account where assets can be withdrawn to. Only this - * account can withdraw the assets. + * @custom:field isInitiated Whether the validator is initiated. + * @custom:field noSubmissionCount Number of counts that the validator did not submit the + * output in priority round. + * @custom:field commissionRate Commission rate of validator. + * @custom:field pendingCommissionRate Pending commission rate of validator. + * @custom:field commissionChangeInitTime Timestamp of commission change initialization. + * @custom:field withdrawAccount An account where assets can be withdrawn to. Only this + * account can withdraw the assets. */ struct Validator { bool isInitiated; uint8 noSubmissionCount; uint8 commissionRate; - uint8 commissionMaxChangeRate; - uint128 commissionRateChangedAt; + uint8 pendingCommissionRate; + uint128 commissionChangeInitTime; address withdrawAccount; } @@ -97,14 +96,12 @@ interface IValidatorManager { * @param validator Address of the validator. * @param activated If the validator is activated or not. * @param commissionRate The commission rate the validator sets. - * @param commissionMaxChangeRate Maximum changeable commission rate at once. * @param assets The number of assets the validator self-delegates. */ event ValidatorRegistered( address indexed validator, bool activated, uint8 commissionRate, - uint8 commissionMaxChangeRate, uint128 assets ); @@ -125,13 +122,26 @@ interface IValidatorManager { event ValidatorStopped(address indexed validator, uint256 stopsAt); /** - * @notice Emitted when a validator changed commission rate. + * @notice Emitted when a validator initiated commission rate change. * * @param validator Address of the validator. * @param oldCommissionRate The old commission rate. * @param newCommissionRate The new commission rate. */ - event ValidatorCommissionRateChanged( + event ValidatorCommissionChangeInitiated( + address indexed validator, + uint8 oldCommissionRate, + uint8 newCommissionRate + ); + + /** + * @notice Emitted when a validator finalized commission rate change. + * + * @param validator Address of the validator. + * @param oldCommissionRate The old commission rate. + * @param newCommissionRate The new commission rate. + */ + event ValidatorCommissionChangeFinalized( address indexed validator, uint8 oldCommissionRate, uint8 newCommissionRate @@ -216,30 +226,20 @@ interface IValidatorManager { */ error MaxCommissionRateExceeded(); - /** - * @notice Reverts when the commission max change rate exceeds the max value. - */ - error MaxCommissionChangeRateExceeded(); - - /** - * @notice Reverts when the address is zero address. - */ - error ZeroAddress(); - /** * @notice Reverts when try to change commission rate with same value as previous. */ error SameCommissionRate(); /** - * @notice Reverts when try to change commission rate beyond max change rate. + * @notice Reverts when the delay of commission rate change finalization has not elapsed. */ - error CommissionChangeRateExceeded(); + error NotElapsedCommissionChangeDelay(); /** - * @notice Reverts when the min change seconds of commission has not elapsed. + * @notice Reverts when the address is zero address. */ - error NotElapsedCommissionChangePeriod(); + error ZeroAddress(); /** * @notice Reverts when try to unjail before jail period elapsed. @@ -255,16 +255,14 @@ interface IValidatorManager { * @notice Registers as a validator with assets at least MIN_REGISTER_AMOUNT. The validator with * assets more than MIN_ACTIVATE_AMOUNT can be activated at the same time. * - * @param assets The amount of assets to self-delegate. - * @param commissionRate The commission rate the validator sets. - * @param commissionMaxChangeRate Maximum changeable commission rate at once. - * @param withdrawAccount An account where assets can be withdrawn to. Only this account - * can withdraw the assets. + * @param assets The amount of assets to self-delegate. + * @param commissionRate The commission rate the validator sets. + * @param withdrawAccount An account where assets can be withdrawn to. Only this account can + * withdraw the assets. */ function registerValidator( uint128 assets, uint8 commissionRate, - uint8 commissionMaxChangeRate, address withdrawAccount ) external; @@ -284,14 +282,19 @@ interface IValidatorManager { function afterSubmitL2Output(uint256 outputIndex) external; /** - * @notice Changes the commission rate of a validator. An exited or jailed validator cannot - * change it, and a validator can change it after COMMISION_RATE_MIN_CHANGE_SECONDS - * elapsed since the last changed time. Also, the validator can only make changes within - * the commissionMaxChangeRate that the validator set initially. + * @notice Initiates the commission rate change of a validator. An exited or jailed validator + * cannot initiate it. * * @param newCommissionRate The new commission rate to apply. */ - function changeCommissionRate(uint8 newCommissionRate) external; + function initCommissionChange(uint8 newCommissionRate) external; + + /** + * @notice Finalizes the commission rate change of a validator. An exited or jailed validator + * cannot finalize it, and a validator can finalize it after + * COMMISION_CHANGE_DELAY_SECONDS elapsed since the initialization of commission change. + */ + function finalizeCommissionChange() external; /** * @notice Attempts to unjail a validator. Only Colosseum can set force to true, otherwise only diff --git a/packages/contracts/contracts/test/AssetManager.t.sol b/packages/contracts/contracts/test/AssetManager.t.sol index eaa3e80c9..e29342609 100644 --- a/packages/contracts/contracts/test/AssetManager.t.sol +++ b/packages/contracts/contracts/test/AssetManager.t.sol @@ -183,7 +183,7 @@ contract AssetManagerTest is ValidatorSystemUpgrade_Initializer { vm.startPrank(validator); kro.approve(address(assetManager), kroAmount); // Self delegation - valMgr.registerValidator(kroAmount, 0, 10, withdrawAcc); + valMgr.registerValidator(kroAmount, 0, withdrawAcc); vm.stopPrank(); vm.startPrank(delegator); @@ -198,7 +198,7 @@ contract AssetManagerTest is ValidatorSystemUpgrade_Initializer { vm.startPrank(validator); kro.approve(address(assetManager), 100e18); // Self delegation - valMgr.registerValidator(100e18, 0, 0, withdrawAcc); + valMgr.registerValidator(100e18, 0, withdrawAcc); vm.stopPrank(); kgh.mint(delegator, tokenId); @@ -213,7 +213,7 @@ contract AssetManagerTest is ValidatorSystemUpgrade_Initializer { kro.transfer(address(validator), 100e18); vm.startPrank(validator); kro.approve(address(assetManager), 100e18); - valMgr.registerValidator(100e18, 0, 10, withdrawAcc); + valMgr.registerValidator(100e18, 0, withdrawAcc); vm.stopPrank(); uint256[] memory tokenIds = new uint256[](kghCounts); @@ -528,10 +528,12 @@ contract AssetManagerTest is ValidatorSystemUpgrade_Initializer { _submitOutputRoot(validator); vm.warp(mockOracle.finalizedAt(mockOracle.latestOutputIndex())); - vm.warp(block.timestamp + commissionRateMinChangeSeconds); // Set commission rate to 10% - vm.prank(validator); - valMgr.changeCommissionRate(10); + vm.startPrank(validator); + valMgr.initCommissionChange(10); + vm.warp(block.timestamp + commissionChangeDelaySeconds); + valMgr.finalizeCommissionChange(); + vm.stopPrank(); vm.startPrank(address(mockOracle)); valMgr.afterSubmitL2Output(mockOracle.latestOutputIndex()); diff --git a/packages/contracts/contracts/test/CommonTest.t.sol b/packages/contracts/contracts/test/CommonTest.t.sol index 8eb933ffa..35bc98413 100644 --- a/packages/contracts/contracts/test/CommonTest.t.sol +++ b/packages/contracts/contracts/test/CommonTest.t.sol @@ -242,7 +242,7 @@ contract L2OutputOracle_Initializer is UpgradeGovernor_Initializer { uint128 internal minSlashingAmount = 1e18; // ValidatorManager constructor arguments - uint128 internal commissionRateMinChangeSeconds = 7 days; + uint128 internal commissionChangeDelaySeconds = 7 days; uint128 internal jailPeriodSeconds = 7 days; uint128 internal jailThreshold = 2; uint128 internal maxOutputFinalizations = 10; @@ -350,7 +350,7 @@ contract L2OutputOracle_Initializer is UpgradeGovernor_Initializer { _l2Oracle: oracle, _assetManager: assetMgr, _trustedValidator: trusted, - _commissionRateMinChangeSeconds: commissionRateMinChangeSeconds, + _commissionChangeDelaySeconds: commissionChangeDelaySeconds, _roundDurationSeconds: uint128(roundDuration), _jailPeriodSeconds: jailPeriodSeconds, _jailThreshold: jailThreshold, @@ -405,7 +405,7 @@ contract L2OutputOracle_Initializer is UpgradeGovernor_Initializer { function _registerValidator(address validator, uint128 assets) internal { vm.startPrank(validator); assetToken.approve(address(assetMgr), uint256(assets)); - valMgr.registerValidator(assets, 10, 5, withdrawAcc); + valMgr.registerValidator(assets, 10, withdrawAcc); vm.stopPrank(); } diff --git a/packages/contracts/contracts/test/ValidatorManager.t.sol b/packages/contracts/contracts/test/ValidatorManager.t.sol index 8f2c1b44f..e12148726 100644 --- a/packages/contracts/contracts/test/ValidatorManager.t.sol +++ b/packages/contracts/contracts/test/ValidatorManager.t.sol @@ -69,10 +69,6 @@ contract MockValidatorManager is ValidatorManager { function nextPriorityValidator() external view returns (address) { return _nextPriorityValidator; } - - function commissionRateChangedAt(address validator) external view returns (uint128) { - return _validatorInfo[validator].commissionRateChangedAt; - } } contract ValidatorManagerTest is ValidatorSystemUpgrade_Initializer { @@ -85,7 +81,6 @@ contract ValidatorManagerTest is ValidatorSystemUpgrade_Initializer { address indexed validator, bool activated, uint8 commissionRate, - uint8 commissionMaxChangeRate, uint128 assets ); @@ -93,7 +88,13 @@ contract ValidatorManagerTest is ValidatorSystemUpgrade_Initializer { event ValidatorStopped(address indexed validator, uint256 stopsAt); - event ValidatorCommissionRateChanged( + event ValidatorCommissionChangeInitiated( + address indexed validator, + uint8 oldCommissionRate, + uint8 newCommissionRate + ); + + event ValidatorCommissionChangeFinalized( address indexed validator, uint8 oldCommissionRate, uint8 newCommissionRate @@ -182,7 +183,7 @@ contract ValidatorManagerTest is ValidatorSystemUpgrade_Initializer { assertEq(valMgr.TRUSTED_VALIDATOR(), trusted); assertEq(valMgr.MIN_REGISTER_AMOUNT(), minRegisterAmount); assertEq(valMgr.MIN_ACTIVATE_AMOUNT(), minActivateAmount); - assertEq(valMgr.COMMISSION_RATE_MIN_CHANGE_SECONDS(), commissionRateMinChangeSeconds); + assertEq(valMgr.COMMISSION_CHANGE_DELAY_SECONDS(), commissionChangeDelaySeconds); assertEq(valMgr.ROUND_DURATION_SECONDS(), roundDuration); assertEq(valMgr.JAIL_PERIOD_SECONDS(), jailPeriodSeconds); assertEq(valMgr.JAIL_THRESHOLD(), jailThreshold); @@ -202,23 +203,20 @@ contract ValidatorManagerTest is ValidatorSystemUpgrade_Initializer { uint128 assets = minActivateAmount; uint8 commissionRate = 10; - uint8 commissionMaxChangeRate = 5; vm.startPrank(trusted); assetToken.approve(address(assetMgr), uint256(assets)); vm.expectEmit(true, false, false, true, address(valMgr)); emit ValidatorActivated(trusted, block.timestamp); vm.expectEmit(true, true, false, true, address(valMgr)); - emit ValidatorRegistered(trusted, true, commissionRate, commissionMaxChangeRate, assets); - valMgr.registerValidator(assets, commissionRate, commissionMaxChangeRate, withdrawAcc); + emit ValidatorRegistered(trusted, true, commissionRate, assets); + valMgr.registerValidator(assets, commissionRate, withdrawAcc); vm.stopPrank(); assertEq(assetToken.balanceOf(trusted), trustedBalance - assets); assertEq(assetMgr.totalKroAssets(trusted), assets); assertEq(valMgr.getCommissionRate(trusted), commissionRate); - assertEq(valMgr.getCommissionMaxChangeRate(trusted), commissionMaxChangeRate); assertEq(valMgr.getWithdrawAccount(trusted), withdrawAcc); - assertEq(mockValMgr.commissionRateChangedAt(trusted), block.timestamp); assertTrue(valMgr.getStatus(trusted) == IValidatorManager.ValidatorStatus.ACTIVE); assertEq(valMgr.activatedValidatorCount(), count + 1); @@ -230,13 +228,12 @@ contract ValidatorManagerTest is ValidatorSystemUpgrade_Initializer { uint128 assets = minActivateAmount - 1; uint8 commissionRate = 10; - uint8 commissionMaxChangeRate = 5; vm.startPrank(trusted); assetToken.approve(address(assetMgr), uint256(assets)); vm.expectEmit(true, true, false, true, address(valMgr)); - emit ValidatorRegistered(trusted, false, commissionRate, commissionMaxChangeRate, assets); - valMgr.registerValidator(assets, commissionRate, commissionMaxChangeRate, withdrawAcc); + emit ValidatorRegistered(trusted, false, commissionRate, assets); + valMgr.registerValidator(assets, commissionRate, withdrawAcc); vm.stopPrank(); assertTrue(valMgr.getStatus(trusted) == IValidatorManager.ValidatorStatus.REGISTERED); @@ -252,7 +249,7 @@ contract ValidatorManagerTest is ValidatorSystemUpgrade_Initializer { vm.startPrank(trusted); assetToken.approve(address(assetMgr), uint256(assets)); vm.expectRevert(IValidatorManager.ImproperValidatorStatus.selector); - valMgr.registerValidator(assets, 10, 5, withdrawAcc); + valMgr.registerValidator(assets, 10, withdrawAcc); } function test_registerValidator_smallAsset_reverts() external { @@ -261,7 +258,7 @@ contract ValidatorManagerTest is ValidatorSystemUpgrade_Initializer { vm.startPrank(trusted); assetToken.approve(address(assetMgr), uint256(assets)); vm.expectRevert(IValidatorManager.InsufficientAsset.selector); - valMgr.registerValidator(assets, 10, 5, withdrawAcc); + valMgr.registerValidator(assets, 10, withdrawAcc); } function test_registerValidator_largeCommissionRate_reverts() external { @@ -270,16 +267,7 @@ contract ValidatorManagerTest is ValidatorSystemUpgrade_Initializer { vm.startPrank(trusted); assetToken.approve(address(assetMgr), uint256(assets)); vm.expectRevert(IValidatorManager.MaxCommissionRateExceeded.selector); - valMgr.registerValidator(assets, 101, 5, withdrawAcc); - } - - function test_registerValidator_largeCommissionMaxChangeRate_reverts() external { - uint128 assets = minRegisterAmount; - - vm.startPrank(trusted); - assetToken.approve(address(assetMgr), uint256(assets)); - vm.expectRevert(IValidatorManager.MaxCommissionChangeRateExceeded.selector); - valMgr.registerValidator(assets, 10, 101, withdrawAcc); + valMgr.registerValidator(assets, 101, withdrawAcc); } function test_registerValidator_withdrawZeroAddr_reverts() external { @@ -288,7 +276,7 @@ contract ValidatorManagerTest is ValidatorSystemUpgrade_Initializer { vm.startPrank(trusted); assetToken.approve(address(assetMgr), uint256(assets)); vm.expectRevert(IValidatorManager.ZeroAddress.selector); - valMgr.registerValidator(assets, 10, 5, address(0)); + valMgr.registerValidator(assets, 10, address(0)); } function test_activateValidator_succeeds() external { @@ -548,111 +536,109 @@ contract ValidatorManagerTest is ValidatorSystemUpgrade_Initializer { valMgr.afterSubmitL2Output(0); } - function test_changeCommissionRate_succeeds() public { + function test_initCommissionChange_succeeds() public { _registerValidator(asserter, minActivateAmount); uint8 commissionRate = valMgr.getCommissionRate(asserter); - uint8 commissionMaxChangeRate = valMgr.getCommissionMaxChangeRate(asserter); - uint8 newCommissionRate = commissionRate + commissionMaxChangeRate; + uint8 newCommissionRate = commissionRate + 1; - vm.warp( - mockValMgr.commissionRateChangedAt(asserter) + - valMgr.COMMISSION_RATE_MIN_CHANGE_SECONDS() - ); vm.prank(asserter); - vm.expectEmit(false, false, false, true, address(valMgr)); - emit ValidatorCommissionRateChanged(asserter, commissionRate, newCommissionRate); - valMgr.changeCommissionRate(newCommissionRate); - - assertEq(valMgr.getCommissionRate(asserter), newCommissionRate); - } - - function test_changeCommissionRate_twice_succeeds() external { - test_changeCommissionRate_succeeds(); - - uint8 commissionRate = valMgr.getCommissionRate(asserter); - uint8 commissionMaxChangeRate = valMgr.getCommissionMaxChangeRate(asserter); - uint8 newCommissionRate = commissionRate - commissionMaxChangeRate; + vm.expectEmit(true, false, false, true, address(valMgr)); + emit ValidatorCommissionChangeInitiated(asserter, commissionRate, newCommissionRate); + valMgr.initCommissionChange(newCommissionRate); - vm.warp( - mockValMgr.commissionRateChangedAt(asserter) + - valMgr.COMMISSION_RATE_MIN_CHANGE_SECONDS() + assertEq(valMgr.getPendingCommissionRate(asserter), newCommissionRate); + assertEq( + valMgr.canFinalizeCommissionChangeAt(asserter), + block.timestamp + valMgr.COMMISSION_CHANGE_DELAY_SECONDS() ); - vm.prank(asserter); - valMgr.changeCommissionRate(newCommissionRate); - - assertEq(valMgr.getCommissionRate(asserter), newCommissionRate); } - function test_changeCommissionRate_exited_reverts() external { + function test_initCommissionChange_exited_reverts() external { _registerValidator(trusted, minActivateAmount); + uint128 kroShares = assetMgr.getKroTotalShareBalance(trusted, trusted); vm.prank(trusted); assetMgr.initUndelegate(trusted, kroShares); - assertTrue(valMgr.getStatus(trusted) == IValidatorManager.ValidatorStatus.EXITED); vm.prank(asserter); vm.expectRevert(IValidatorManager.ImproperValidatorStatus.selector); - valMgr.changeCommissionRate(15); + valMgr.initCommissionChange(15); } - function test_changeCommissionRate_inJail_reverts() external { + function test_initCommissionChange_inJail_reverts() external { test_afterSubmitL2Output_tryJail_succeeds(); vm.prank(asserter); vm.expectRevert(IValidatorManager.ImproperValidatorStatus.selector); - valMgr.changeCommissionRate(15); + valMgr.initCommissionChange(15); } - function test_changeCommissionRate_minChangeSecNotElapsed_reverts() external { + function test_initCommissionChange_largeCommissionRate_reverts() external { _registerValidator(asserter, minActivateAmount); vm.prank(asserter); - vm.expectRevert(IValidatorManager.NotElapsedCommissionChangePeriod.selector); - valMgr.changeCommissionRate(15); + vm.expectRevert(IValidatorManager.MaxCommissionRateExceeded.selector); + valMgr.initCommissionChange(101); } - function test_changeCommissionRate_largeCommissionRate_reverts() external { + function test_initCommissionChange_sameCommissionRate_reverts() external { _registerValidator(asserter, minActivateAmount); - vm.warp( - mockValMgr.commissionRateChangedAt(asserter) + - valMgr.COMMISSION_RATE_MIN_CHANGE_SECONDS() - ); + uint8 commissionRate = valMgr.getCommissionRate(asserter); vm.prank(asserter); - vm.expectRevert(IValidatorManager.MaxCommissionRateExceeded.selector); - valMgr.changeCommissionRate(101); + vm.expectRevert(IValidatorManager.SameCommissionRate.selector); + valMgr.initCommissionChange(commissionRate); } - function test_changeCommissionRate_sameCommissionRate_reverts() external { - _registerValidator(asserter, minActivateAmount); + function test_finalizeCommissionChange_succeeds() public { + test_initCommissionChange_succeeds(); - uint8 commissionRate = valMgr.getCommissionRate(asserter); + uint8 oldCommissionRate = valMgr.getCommissionRate(asserter); + uint8 newCommissionRate = valMgr.getPendingCommissionRate(asserter); + + vm.warp(valMgr.canFinalizeCommissionChangeAt(asserter)); + vm.prank(asserter); + vm.expectEmit(true, false, false, true, address(valMgr)); + emit ValidatorCommissionChangeFinalized(asserter, oldCommissionRate, newCommissionRate); + valMgr.finalizeCommissionChange(); - vm.warp( - mockValMgr.commissionRateChangedAt(asserter) + - valMgr.COMMISSION_RATE_MIN_CHANGE_SECONDS() + assertEq(valMgr.getCommissionRate(asserter), newCommissionRate); + assertEq(valMgr.getPendingCommissionRate(asserter), 0); + assertEq( + valMgr.canFinalizeCommissionChangeAt(asserter), + valMgr.COMMISSION_CHANGE_DELAY_SECONDS() ); + } + + function test_finalizeCommissionChange_exited_reverts() external { + _registerValidator(trusted, minActivateAmount); + + uint128 kroShares = assetMgr.getKroTotalShareBalance(trusted, trusted); + vm.prank(trusted); + assetMgr.initUndelegate(trusted, kroShares); + assertTrue(valMgr.getStatus(trusted) == IValidatorManager.ValidatorStatus.EXITED); + vm.prank(asserter); - vm.expectRevert(IValidatorManager.SameCommissionRate.selector); - valMgr.changeCommissionRate(commissionRate); + vm.expectRevert(IValidatorManager.ImproperValidatorStatus.selector); + valMgr.finalizeCommissionChange(); } - function test_changeCommissionRate_largeChangeRate_reverts() external { - _registerValidator(asserter, minActivateAmount); + function test_finalizeCommissionChange_inJail_reverts() external { + test_afterSubmitL2Output_tryJail_succeeds(); - uint8 commissionRate = valMgr.getCommissionRate(asserter); - uint8 commissionMaxChangeRate = valMgr.getCommissionMaxChangeRate(asserter); - uint8 newCommissionRate = commissionRate + commissionMaxChangeRate + 1; + vm.prank(asserter); + vm.expectRevert(IValidatorManager.ImproperValidatorStatus.selector); + valMgr.finalizeCommissionChange(); + } + + function test_finalizeCommissionChange_changeDelayNotElapsed_reverts() external { + test_initCommissionChange_succeeds(); - vm.warp( - mockValMgr.commissionRateChangedAt(asserter) + - valMgr.COMMISSION_RATE_MIN_CHANGE_SECONDS() - ); vm.prank(asserter); - vm.expectRevert(IValidatorManager.CommissionChangeRateExceeded.selector); - valMgr.changeCommissionRate(newCommissionRate); + vm.expectRevert(IValidatorManager.NotElapsedCommissionChangeDelay.selector); + valMgr.finalizeCommissionChange(); } function test_tryUnjail_succeeds() external { diff --git a/packages/contracts/deploy-config/devnetL1-template.json b/packages/contracts/deploy-config/devnetL1-template.json index 513511835..838534f17 100644 --- a/packages/contracts/deploy-config/devnetL1-template.json +++ b/packages/contracts/deploy-config/devnetL1-template.json @@ -43,7 +43,7 @@ "validatorManagerTrustedValidator": "0x70997970C51812dc3A010C7d01b50e0d17dc79C8", "validatorManagerMinRegisterAmount": "0x32", "validatorManagerMinActivateAmount": "0x64", - "validatorManagerCommissionMinChangeSeconds": 120, + "validatorManagerCommissionChangeDelaySeconds": 120, "validatorManagerRoundDurationSeconds": 4, "validatorManagerJailPeriodSeconds": 120, "validatorManagerJailThreshold": 2, diff --git a/packages/contracts/deploy/L1/021-ValidatorManager.ts b/packages/contracts/deploy/L1/021-ValidatorManager.ts index 31a4db4d6..7e8cfb235 100644 --- a/packages/contracts/deploy/L1/021-ValidatorManager.ts +++ b/packages/contracts/deploy/L1/021-ValidatorManager.ts @@ -33,8 +33,8 @@ const deployFn: DeployFunction = async (hre) => { _l2Oracle: l2OutputOracleProxyAddress, _assetManager: assetManagerProxyAddress, _trustedValidator: hre.deployConfig.validatorManagerTrustedValidator, - _commissionRateMinChangeSeconds: - hre.deployConfig.validatorManagerCommissionMinChangeSeconds, + _commissionChangeDelaySeconds: + hre.deployConfig.validatorManagerCommissionChangeDelaySeconds, _roundDurationSeconds: hre.deployConfig.validatorManagerRoundDurationSeconds, _jailPeriodSeconds: hre.deployConfig.validatorManagerJailPeriodSeconds, @@ -75,8 +75,8 @@ const deployFn: DeployFunction = async (hre) => { ) await assertContractVariable( contract, - 'COMMISSION_RATE_MIN_CHANGE_SECONDS', - hre.deployConfig.validatorManagerCommissionMinChangeSeconds + 'COMMISSION_CHANGE_DELAY_SECONDS', + hre.deployConfig.validatorManagerCommissionChangeDelaySeconds ) await assertContractVariable( contract, diff --git a/packages/contracts/src/deploy-config.ts b/packages/contracts/src/deploy-config.ts index e323d007e..da0f00097 100644 --- a/packages/contracts/src/deploy-config.ts +++ b/packages/contracts/src/deploy-config.ts @@ -112,9 +112,9 @@ interface RequiredDeployConfig { validatorManagerMinActivateAmount: string /** - * The minimum duration of commission change in seconds. + * The delay to finalize the commission rate change in seconds. */ - validatorManagerCommissionMinChangeSeconds: number + validatorManagerCommissionChangeDelaySeconds: number /** * The duration of one submission round in seconds. @@ -412,7 +412,7 @@ export const deployConfigSpec: { validatorManagerMinActivateAmount: { type: 'string', // uint128 }, - validatorManagerCommissionMinChangeSeconds: { + validatorManagerCommissionChangeDelaySeconds: { type: 'number', }, validatorManagerRoundDurationSeconds: {