diff --git a/wemix/bind/gen_ballotStorage_abi.go b/wemix/bind/gen_ballotStorage_abi.go index e5200641f416..4f1f77dea49f 100644 --- a/wemix/bind/gen_ballotStorage_abi.go +++ b/wemix/bind/gen_ballotStorage_abi.go @@ -34,7 +34,7 @@ var BallotStorageMetaData = &bind.MetaData{ Sigs: map[string]string{ "5c60da1b": "implementation()", }, - Bin: "0x608060405234801561001057600080fd5b5060405161077238038061077283398101604081905261002f91610326565b604080516020810190915260008152819061006b60017f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbd61034f565b60008051602061072b8339815191521461008757610087610374565b6100938282600061009b565b505050610405565b6100a4836100d1565b6000825111806100b15750805b156100cc576100ca838361011160201b61008b1760201c565b505b505050565b6100da8161013d565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6060610136838360405180606001604052806027815260200161074b602791396101fd565b9392505050565b610150816102db60201b6100b71760201c565b6101b75760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084015b60405180910390fd5b806101dc60008051602061072b83398151915260001b6102ea60201b6100c61760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b60606001600160a01b0384163b6102655760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b60648201526084016101ae565b600080856001600160a01b03168560405161028091906103b6565b600060405180830381855af49150503d80600081146102bb576040519150601f19603f3d011682016040523d82523d6000602084013e6102c0565b606091505b5090925090506102d18282866102ed565b9695505050505050565b6001600160a01b03163b151590565b90565b606083156102fc575081610136565b82511561030c5782518084602001fd5b8160405162461bcd60e51b81526004016101ae91906103d2565b60006020828403121561033857600080fd5b81516001600160a01b038116811461013657600080fd5b60008282101561036f57634e487b7160e01b600052601160045260246000fd5b500390565b634e487b7160e01b600052600160045260246000fd5b60005b838110156103a557818101518382015260200161038d565b838111156100ca5750506000910152565b600082516103c881846020870161038a565b9190910192915050565b60208152600082518060208401526103f181604085016020870161038a565b601f01601f19169190910160400192915050565b610317806104146000396000f3fe6080604052600436106100225760003560e01c80635c60da1b1461003957610031565b366100315761002f61006a565b005b61002f61006a565b34801561004557600080fd5b5061004e61007c565b6040516001600160a01b03909116815260200160405180910390f35b61007a6100756100c9565b6100fc565b565b60006100866100c9565b905090565b60606100b083836040518060600160405280602781526020016102bb60279139610120565b9392505050565b6001600160a01b03163b151590565b90565b60006100867f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b3660008037600080366000845af43d6000803e80801561011b573d6000f35b3d6000fd5b60606001600160a01b0384163b61018d5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b60648201526084015b60405180910390fd5b600080856001600160a01b0316856040516101a8919061026b565b600060405180830381855af49150503d80600081146101e3576040519150601f19603f3d011682016040523d82523d6000602084013e6101e8565b606091505b50915091506101f8828286610202565b9695505050505050565b606083156102115750816100b0565b8251156102215782518084602001fd5b8160405162461bcd60e51b81526004016101849190610287565b60005b8381101561025657818101518382015260200161023e565b83811115610265576000848401525b50505050565b6000825161027d81846020870161023b565b9190910192915050565b60208152600082518060208401526102a681604085016020870161023b565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220ee902ae1ebb19baf0a3fcf922eb15a905dba5a97ac0a363ad62a66403d3450e564736f6c634300080e0033360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564", + Bin: "0x608060405234801561001057600080fd5b5060405161077238038061077283398101604081905261002f91610326565b604080516020810190915260008152819061006b60017f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbd61034f565b60008051602061072b8339815191521461008757610087610374565b6100938282600061009b565b505050610405565b6100a4836100d1565b6000825111806100b15750805b156100cc576100ca838361011160201b61008b1760201c565b505b505050565b6100da8161013d565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6060610136838360405180606001604052806027815260200161074b602791396101fd565b9392505050565b610150816102db60201b6100b71760201c565b6101b75760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084015b60405180910390fd5b806101dc60008051602061072b83398151915260001b6102ea60201b6100c61760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b60606001600160a01b0384163b6102655760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b60648201526084016101ae565b600080856001600160a01b03168560405161028091906103b6565b600060405180830381855af49150503d80600081146102bb576040519150601f19603f3d011682016040523d82523d6000602084013e6102c0565b606091505b5090925090506102d18282866102ed565b9695505050505050565b6001600160a01b03163b151590565b90565b606083156102fc575081610136565b82511561030c5782518084602001fd5b8160405162461bcd60e51b81526004016101ae91906103d2565b60006020828403121561033857600080fd5b81516001600160a01b038116811461013657600080fd5b60008282101561036f57634e487b7160e01b600052601160045260246000fd5b500390565b634e487b7160e01b600052600160045260246000fd5b60005b838110156103a557818101518382015260200161038d565b838111156100ca5750506000910152565b600082516103c881846020870161038a565b9190910192915050565b60208152600082518060208401526103f181604085016020870161038a565b601f01601f19169190910160400192915050565b610317806104146000396000f3fe6080604052600436106100225760003560e01c80635c60da1b1461003957610031565b366100315761002f61006a565b005b61002f61006a565b34801561004557600080fd5b5061004e61007c565b6040516001600160a01b03909116815260200160405180910390f35b61007a6100756100c9565b6100fc565b565b60006100866100c9565b905090565b60606100b083836040518060600160405280602781526020016102bb60279139610120565b9392505050565b6001600160a01b03163b151590565b90565b60006100867f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b3660008037600080366000845af43d6000803e80801561011b573d6000f35b3d6000fd5b60606001600160a01b0384163b61018d5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b60648201526084015b60405180910390fd5b600080856001600160a01b0316856040516101a8919061026b565b600060405180830381855af49150503d80600081146101e3576040519150601f19603f3d011682016040523d82523d6000602084013e6101e8565b606091505b50915091506101f8828286610202565b9695505050505050565b606083156102115750816100b0565b8251156102215782518084602001fd5b8160405162461bcd60e51b81526004016101849190610287565b60005b8381101561025657818101518382015260200161023e565b83811115610265576000848401525b50505050565b6000825161027d81846020870161023b565b9190910192915050565b60208152600082518060208401526102a681604085016020870161023b565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122026a0c3bf8d61795fa77c2e5c0518466767e28fbd375e5c37c58704270cbb48b364736f6c634300080e0033360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564", } // BallotStorageABI is the input ABI used to generate the binding from. @@ -706,7 +706,7 @@ func (_BallotStorage *BallotStorageFilterer) ParseUpgraded(log types.Log) (*Ball // BallotStorageImpMetaData contains all meta data concerning the BallotStorageImp contract. var BallotStorageImpMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"previousAdmin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"AdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"ballotId\",\"type\":\"uint256\"}],\"name\":\"BallotCanceled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"ballotId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"ballotType\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"creator\",\"type\":\"address\"}],\"name\":\"BallotCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"ballotId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"state\",\"type\":\"uint256\"}],\"name\":\"BallotFinalized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"ballotId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"startTime\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"endTime\",\"type\":\"uint256\"}],\"name\":\"BallotStarted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"ballotId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"updatedBy\",\"type\":\"address\"}],\"name\":\"BallotUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"beacon\",\"type\":\"address\"}],\"name\":\"BeaconUpgraded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previous\",\"type\":\"address\"}],\"name\":\"SetPrevBallotStorage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"SetRegistry\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"voteid\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"ballotId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"decision\",\"type\":\"uint256\"}],\"name\":\"Voted\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"BALLOT_STORAGE_NAME\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ECOSYSTEM_NAME\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ENV_STORAGE_NAME\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"GOV_NAME\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAINTENANCE_NAME\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"REWARD_POOL_NAME\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"STAKING_NAME\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"STAKING_REWARD_NAME\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_ballotId\",\"type\":\"uint256\"}],\"name\":\"cancelBallot\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_ballotType\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_duration\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_creator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_newGovernanceAddress\",\"type\":\"address\"}],\"name\":\"createBallotForAddress\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_unlockAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_slashing\",\"type\":\"uint256\"}],\"name\":\"createBallotForExit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_ballotType\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_duration\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_creator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_oldStakerAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_newStakerAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_newVoterAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_newRewardAddress\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_newNodeName\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_newNodeId\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_newNodeIp\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_newNodePort\",\"type\":\"uint256\"}],\"name\":\"createBallotForMember\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_ballotType\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_duration\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_creator\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"_envVariableName\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"_envVariableType\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_envVariableValue\",\"type\":\"bytes\"}],\"name\":\"createBallotForVariable\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_voteId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_ballotId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_voter\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_decision\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_power\",\"type\":\"uint256\"}],\"name\":\"createVote\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_ballotId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_ballotState\",\"type\":\"uint256\"}],\"name\":\"finalizeBallot\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_id\",\"type\":\"uint256\"}],\"name\":\"getBallotAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"newGovernanceAddress\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_id\",\"type\":\"uint256\"}],\"name\":\"getBallotBasic\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"startTime\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"endTime\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"ballotType\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"creator\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"memo\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"totalVoters\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"powerOfAccepts\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"powerOfRejects\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"state\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"isFinalized\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"duration\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getBallotCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_id\",\"type\":\"uint256\"}],\"name\":\"getBallotForExit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"unlockAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"slashing\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_id\",\"type\":\"uint256\"}],\"name\":\"getBallotMember\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"oldStakerAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"newStakerAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"newVoterAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"newRewardAddress\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"newNodeName\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"newNodeId\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"newNodeIp\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"newNodePort\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"lockAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_id\",\"type\":\"uint256\"}],\"name\":\"getBallotPeriod\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"startTime\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"endTime\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"duration\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_id\",\"type\":\"uint256\"}],\"name\":\"getBallotState\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"ballotType\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"state\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"isFinalized\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_id\",\"type\":\"uint256\"}],\"name\":\"getBallotVariable\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"envVariableName\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"envVariableType\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"envVariableValue\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_id\",\"type\":\"uint256\"}],\"name\":\"getBallotVotingInfo\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"totalVoters\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"powerOfAccepts\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"powerOfRejects\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getMaxVotingDuration\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getMinVotingDuration\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getPreviousBallotStorage\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTime\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_voteId\",\"type\":\"uint256\"}],\"name\":\"getVote\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"voteId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"ballotId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"decision\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"power\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"time\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint56\",\"name\":\"_ballotId\",\"type\":\"uint56\"},{\"internalType\":\"address\",\"name\":\"_voter\",\"type\":\"address\"}],\"name\":\"hasAlreadyVoted\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_registry\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isDisabled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proxiableUUID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"reg\",\"outputs\":[{\"internalType\":\"contractIRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"setPreviousBallotStorage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_addr\",\"type\":\"address\"}],\"name\":\"setRegistry\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_ballotId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_startTime\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_endTime\",\"type\":\"uint256\"}],\"name\":\"startBallot\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_ballotId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_duration\",\"type\":\"uint256\"}],\"name\":\"updateBallotDuration\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_ballotId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_lockAmount\",\"type\":\"uint256\"}],\"name\":\"updateBallotMemberLockAmount\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_ballotId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_memo\",\"type\":\"bytes\"}],\"name\":\"updateBallotMemo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImp\",\"type\":\"address\"}],\"name\":\"upgradeBallotStorage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"}],\"name\":\"upgradeTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"upgradeToAndCall\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"}]", + ABI: "[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"previousAdmin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"AdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"ballotId\",\"type\":\"uint256\"}],\"name\":\"BallotCanceled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"ballotId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"ballotType\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"creator\",\"type\":\"address\"}],\"name\":\"BallotCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"ballotId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"state\",\"type\":\"uint256\"}],\"name\":\"BallotFinalized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"ballotId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"startTime\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"endTime\",\"type\":\"uint256\"}],\"name\":\"BallotStarted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"ballotId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"updatedBy\",\"type\":\"address\"}],\"name\":\"BallotUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"beacon\",\"type\":\"address\"}],\"name\":\"BeaconUpgraded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previous\",\"type\":\"address\"}],\"name\":\"SetPrevBallotStorage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"SetRegistry\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"voteid\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"ballotId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"decision\",\"type\":\"uint256\"}],\"name\":\"Voted\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"BALLOT_STORAGE_NAME\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ECOSYSTEM_NAME\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ENV_STORAGE_NAME\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"GOV_NAME\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAINTENANCE_NAME\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"REWARD_POOL_NAME\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"STAKING_NAME\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"STAKING_REWARD_NAME\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_ballotId\",\"type\":\"uint256\"}],\"name\":\"cancelBallot\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_ballotType\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_duration\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_creator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_newGovernanceAddress\",\"type\":\"address\"}],\"name\":\"createBallotForAddress\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_ballotType\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_duration\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_creator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_calldata\",\"type\":\"bytes\"}],\"name\":\"createBallotForExecute\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_unlockAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_slashing\",\"type\":\"uint256\"}],\"name\":\"createBallotForExit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_ballotType\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_duration\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_creator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_oldStakerAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_newStakerAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_newVoterAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_newRewardAddress\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_newNodeName\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_newNodeId\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_newNodeIp\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_newNodePort\",\"type\":\"uint256\"}],\"name\":\"createBallotForMember\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_ballotType\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_duration\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_creator\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"_envVariableName\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"_envVariableType\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_envVariableValue\",\"type\":\"bytes\"}],\"name\":\"createBallotForVariable\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_voteId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_ballotId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_voter\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_decision\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_power\",\"type\":\"uint256\"}],\"name\":\"createVote\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_ballotId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_ballotState\",\"type\":\"uint256\"}],\"name\":\"finalizeBallot\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_id\",\"type\":\"uint256\"}],\"name\":\"getBallotAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"newGovernanceAddress\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_id\",\"type\":\"uint256\"}],\"name\":\"getBallotBasic\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"startTime\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"endTime\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"ballotType\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"creator\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"memo\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"totalVoters\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"powerOfAccepts\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"powerOfRejects\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"state\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"isFinalized\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"duration\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getBallotCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_id\",\"type\":\"uint256\"}],\"name\":\"getBallotExecute\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_id\",\"type\":\"uint256\"}],\"name\":\"getBallotForExit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"unlockAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"slashing\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_id\",\"type\":\"uint256\"}],\"name\":\"getBallotMember\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"oldStakerAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"newStakerAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"newVoterAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"newRewardAddress\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"newNodeName\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"newNodeId\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"newNodeIp\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"newNodePort\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"lockAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_id\",\"type\":\"uint256\"}],\"name\":\"getBallotPeriod\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"startTime\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"endTime\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"duration\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_id\",\"type\":\"uint256\"}],\"name\":\"getBallotState\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"ballotType\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"state\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"isFinalized\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_id\",\"type\":\"uint256\"}],\"name\":\"getBallotVariable\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"envVariableName\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"envVariableType\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"envVariableValue\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_id\",\"type\":\"uint256\"}],\"name\":\"getBallotVotingInfo\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"totalVoters\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"powerOfAccepts\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"powerOfRejects\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getMaxVotingDuration\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getMinVotingDuration\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getPreviousBallotStorage\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTime\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_voteId\",\"type\":\"uint256\"}],\"name\":\"getVote\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"voteId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"ballotId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"decision\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"power\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"time\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint56\",\"name\":\"_ballotId\",\"type\":\"uint56\"},{\"internalType\":\"address\",\"name\":\"_voter\",\"type\":\"address\"}],\"name\":\"hasAlreadyVoted\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_registry\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isDisabled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proxiableUUID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"reg\",\"outputs\":[{\"internalType\":\"contractIRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"setPreviousBallotStorage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_addr\",\"type\":\"address\"}],\"name\":\"setRegistry\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_ballotId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_startTime\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_endTime\",\"type\":\"uint256\"}],\"name\":\"startBallot\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_ballotId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_duration\",\"type\":\"uint256\"}],\"name\":\"updateBallotDuration\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_ballotId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_lockAmount\",\"type\":\"uint256\"}],\"name\":\"updateBallotMemberLockAmount\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_ballotId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_memo\",\"type\":\"bytes\"}],\"name\":\"updateBallotMemo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImp\",\"type\":\"address\"}],\"name\":\"upgradeBallotStorage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"}],\"name\":\"upgradeTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"upgradeToAndCall\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"}]", Sigs: map[string]string{ "9986e4b9": "BALLOT_STORAGE_NAME()", "34125c84": "ECOSYSTEM_NAME()", @@ -718,6 +718,7 @@ var BallotStorageImpMetaData = &bind.MetaData{ "5a731cca": "STAKING_REWARD_NAME()", "155ca224": "cancelBallot(uint256)", "0a3a63fe": "createBallotForAddress(uint256,uint256,uint256,address,address)", + "aea83e40": "createBallotForExecute(uint256,uint256,uint256,address,address,uint256,bytes)", "22640859": "createBallotForExit(uint256,uint256,uint256)", "daacbb95": "createBallotForMember(uint256,uint256,uint256,address,address,address,address,address,bytes,bytes,bytes,uint256)", "4a57823e": "createBallotForVariable(uint256,uint256,uint256,address,bytes32,uint256,bytes)", @@ -726,6 +727,7 @@ var BallotStorageImpMetaData = &bind.MetaData{ "7efa9ae3": "getBallotAddress(uint256)", "02b385fb": "getBallotBasic(uint256)", "b4741495": "getBallotCount()", + "060e6a99": "getBallotExecute(uint256)", "8c7be692": "getBallotForExit(uint256)", "73df4e01": "getBallotMember(uint256)", "09970688": "getBallotPeriod(uint256)", @@ -755,7 +757,7 @@ var BallotStorageImpMetaData = &bind.MetaData{ "3659cfe6": "upgradeTo(address)", "4f1ef286": "upgradeToAndCall(address,bytes)", }, - Bin: "0x60a0604052306080523480156200001557600080fd5b506200002062000026565b620000e8565b600054610100900460ff1615620000935760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff9081161015620000e6576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6080516144aa6200012060003960008181611147015281816111870152818161132d0152818161136d015261140001526144aa6000f3fe60806040526004361061027d5760003560e01c80636c78d2cf1161014f578063a91e59ba116100c1578063c4d66de81161007a578063c4d66de814610872578063ce04b9d414610892578063daacbb95146108a7578063f2fde38b146108c7578063f51a88e2146108e7578063f680e5551461090757600080fd5b8063a91e59ba146107bf578063a91ee0dc146107df578063b23c676c146107ff578063b47414951461081d578063bce0dbc114610832578063c0b6f1861461085257600080fd5b80637bf46530116101135780637bf46530146106b95780637efa9ae3146106da5780638c7be692146107135780638da5cb5b1461075d57806396462b9c1461077b5780639986e4b91461079b57600080fd5b80636c78d2cf146105ee578063715018a61461061757806372d0ec921461062c578063738fdd1a1461064c57806373df4e011461068457600080fd5b80633659cfe6116101f357806356ba988e116101ac57806356ba988e146104cd5780635a55c1f0146104ed5780635a731cca14610548578063656bc6331461056c578063688ca5b21461058c5780636c57f5a9146105c957600080fd5b80633659cfe6146104305780634a57823e146104505780634bd1ed76146104705780634f1ef2861461049257806352d1902d146104a5578063557ed1ba146104ba57600080fd5b80631d940da2116102455780631d940da2146103625780631e0cba0d1461039157806322640859146103af5780632a74f38c146103cf5780632f40992e146103ef57806334125c841461041057600080fd5b806302b385fb1461028257806309970688146102c25780630a3a63fe146102fd578063155ca2241461032b5780631c1501711461034d575b600080fd5b34801561028e57600080fd5b506102a261029d366004613acc565b610958565b6040516102b99b9a99989796959493929190613b3d565b60405180910390f35b3480156102ce57600080fd5b506102e26102dd366004613acc565b610b23565b604080519384526020840192909252908201526060016102b9565b34801561030957600080fd5b5061031d610318366004613bd1565b610c83565b6040519081526020016102b9565b34801561033757600080fd5b5061034b610346366004613acc565b610d9b565b005b34801561035957600080fd5b5061031d610efc565b34801561036e57600080fd5b5061038261037d366004613acc565b610f6c565b6040516102b993929190613c27565b34801561039d57600080fd5b5061031d665374616b696e6760c81b81565b3480156103bb57600080fd5b5061034b6103ca366004613c4f565b611024565b3480156103db57600080fd5b5061034b6103ea366004613c7b565b6110a3565b3480156103fb57600080fd5b5061031d6914995dd85c99141bdbdb60b21b81565b34801561041c57600080fd5b5061031d6845636f73797374656d60b81b81565b34801561043c57600080fd5b5061034b61044b366004613c7b565b61113d565b34801561045c57600080fd5b5061031d61046b366004613d3b565b61121c565b34801561047c57600080fd5b5061031d6a4d61696e74656e616e636560a81b81565b61034b6104a0366004613dbb565b611323565b3480156104b157600080fd5b5061031d6113f3565b3480156104c657600080fd5b504261031d565b3480156104d957600080fd5b506102e26104e8366004613acc565b6114a6565b3480156104f957600080fd5b5061050d610508366004613acc565b6115f7565b6040805196875260208701959095526001600160a01b03909316938501939093526060840152608083019190915260a082015260c0016102b9565b34801561055457600080fd5b5061031d6c14dd185ada5b99d4995dd85c99609a1b81565b34801561057857600080fd5b5061034b610587366004613e0b565b6116c5565b34801561059857600080fd5b506105ac6105a7366004613acc565b6118d8565b6040805193845260208401929092521515908201526060016102b9565b3480156105d557600080fd5b506105de611a2e565b60405190151581526020016102b9565b3480156105fa57600080fd5b5061031d7111dbdd995c9b985b98d950dbdb9d1c9858dd60721b81565b34801561062357600080fd5b5061034b611a52565b34801561063857600080fd5b5061034b610647366004613e0b565b611a66565b34801561065857600080fd5b5060655461066c906001600160a01b031681565b6040516001600160a01b0390911681526020016102b9565b34801561069057600080fd5b506106a461069f366004613acc565b611c00565b6040516102b999989796959493929190613e2d565b3480156106c557600080fd5b5061031d69456e7653746f7261676560b01b81565b3480156106e657600080fd5b5061066c6106f5366004613acc565b6000908152606860205260409020600101546001600160a01b031690565b34801561071f57600080fd5b5061074861072e366004613acc565b6000908152606e6020526040902080546001909101549091565b604080519283526020830191909152016102b9565b34801561076957600080fd5b506033546001600160a01b031661066c565b34801561078757600080fd5b5061034b610796366004613eac565b611e0d565b3480156107a757600080fd5b5061031d6c42616c6c6f7453746f7261676560981b81565b3480156107cb57600080fd5b5061034b6107da366004613e0b565b6120f8565b3480156107eb57600080fd5b5061034b6107fa366004613c7b565b612276565b34801561080b57600080fd5b50606c546001600160a01b031661066c565b34801561082957600080fd5b50606d5461031d565b34801561083e57600080fd5b5061034b61084d366004613ef5565b61231e565b34801561085e57600080fd5b5061034b61086d366004613c4f565b612463565b34801561087e57600080fd5b5061034b61088d366004613c7b565b612643565b34801561089e57600080fd5b5061031d61275d565b3480156108b357600080fd5b5061034b6108c2366004613f26565b6127a4565b3480156108d357600080fd5b5061034b6108e2366004613c7b565b612ab4565b3480156108f357600080fd5b5061034b610902366004613c7b565b612b2a565b34801561091357600080fd5b506105de610922366004614040565b66ffffffffffffff82166000908152606b602090815260408083206001600160a01b038516845290915290205460ff1692915050565b60008060008060606000806000806000806000606660008e815260200190815260200160002060405180610180016040529081600082015481526020016001820154815260200160028201548152602001600382015481526020016004820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020016005820180546109f190614085565b80601f0160208091040260200160405190810160405280929190818152602001828054610a1d90614085565b8015610a6a5780601f10610a3f57610100808354040283529160200191610a6a565b820191906000526020600020905b815481529060010190602001808311610a4d57829003601f168201915b5050505050815260200160068201548152602001600782015481526020016008820154815260200160098201548152602001600a820160009054906101000a900460ff16151515158152602001600b82015481525050905080602001519b5080604001519a5080606001519950806080015198508060a0015197508060c0015196508060e00151955080610100015194508061012001519350806101400151925080610160015191505091939597999b90929496989a50565b6000818152606660209081526040808320815161018081018352815481526001820154938101939093526002810154918301919091526003810154606083015260048101546001600160a01b031660808301526005810180548493849384939192909160a0840191610b9490614085565b80601f0160208091040260200160405190810160405280929190818152602001828054610bc090614085565b8015610c0d5780601f10610be257610100808354040283529160200191610c0d565b820191906000526020600020905b815481529060010190602001808311610bf057829003601f168201915b5050505050815260200160068201548152602001600782015481526020016008820154815260200160098201548152602001600a820160009054906101000a900460ff16151515158152602001600b82015481525050905080602001519350806040015192508061016001519150509193909250565b600033610c8e612b4a565b6001600160a01b031614610cbd5760405162461bcd60e51b8152600401610cb4906140bf565b60405180910390fd5b610cc5612b6a565b6001600160a01b0316306001600160a01b031614610cf55760405162461bcd60e51b8152600401610cb4906140e6565b60048514610d155760405162461bcd60e51b8152600401610cb49061410b565b6001600160a01b038216610d3b5760405162461bcd60e51b8152600401610cb490614138565b610d4786868686612b85565b506040805180820182528681526001600160a01b0392831660208083019182526000898152606890915292909220905181559051600190910180546001600160a01b03191691909216179055509192915050565b8033610da5612b4a565b6001600160a01b03161480610dd357506000818152606660205260409020600401546001600160a01b031633145b610def5760405162461bcd60e51b8152600401610cb4906140bf565b610df7612b6a565b6001600160a01b0316306001600160a01b031614610e275760405162461bcd60e51b8152600401610cb4906140e6565b6000828152606660205260409020548214610e545760405162461bcd60e51b8152600401610cb490614163565b6000828152606660205260409020600a015460ff1615610e865760405162461bcd60e51b8152600401610cb49061418f565b600160008381526066602052604090206009015414610eb75760405162461bcd60e51b8152600401610cb4906141ba565b60008281526066602052604090206005600982015560405183907fd5e541d004c50564e5e05fcbc6be2916c68d817507693dc3774c69dde4ce13dc90600090a2505050565b6000610f06612e40565b6001600160a01b03166333be496e6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f6791906141e3565b905090565b600081815260696020526040902060018101546002820154600383018054929391926060929190610f9c90614085565b80601f0160208091040260200160405190810160405280929190818152602001828054610fc890614085565b80156110155780601f10610fea57610100808354040283529160200191611015565b820191906000526020600020905b815481529060010190602001808311610ff857829003601f168201915b50505050509150509193909250565b3361102d612b4a565b6001600160a01b0316146110535760405162461bcd60e51b8152600401610cb4906140bf565b61105b612b6a565b6001600160a01b0316306001600160a01b03161461108b5760405162461bcd60e51b8152600401610cb4906140e6565b6000928352606e602052604090922090815560010155565b6110ab612e58565b6001600160a01b0381166110f35760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606401610cb4565b606c80546001600160a01b0319166001600160a01b0383169081179091556040517f3d809312b6e303291a93b307c7ddbd0960c094f5f0fb4e3ba0758775013edeb390600090a250565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036111855760405162461bcd60e51b8152600401610cb4906141fc565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166111ce60008051602061442e833981519152546001600160a01b031690565b6001600160a01b0316146111f45760405162461bcd60e51b8152600401610cb490614248565b6111fd81612eb2565b6040805160008082526020820190925261121991839190612eba565b50565b600033611227612b4a565b6001600160a01b03161461124d5760405162461bcd60e51b8152600401610cb4906140bf565b611255612b6a565b6001600160a01b0316306001600160a01b0316146112855760405162461bcd60e51b8152600401610cb4906140e6565b61129087858461302a565b6112ac5760405162461bcd60e51b8152600401610cb490614138565b6112b888888888612b85565b6040805160808101825289815260208082018781528284018781526060840187815260008e81526069855295909520845181559151600183015551600282015592518051929384939092611313926003850192910190613a33565b50999a9950505050505050505050565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361136b5760405162461bcd60e51b8152600401610cb4906141fc565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166113b460008051602061442e833981519152546001600160a01b031690565b6001600160a01b0316146113da5760405162461bcd60e51b8152600401610cb490614248565b6113e382612eb2565b6113ef82826001612eba565b5050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146114935760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610cb4565b5060008051602061442e83398151915290565b6000818152606660209081526040808320815161018081018352815481526001820154938101939093526002810154918301919091526003810154606083015260048101546001600160a01b031660808301526005810180548493849384939192909160a084019161151790614085565b80601f016020809104026020016040519081016040528092919081815260200182805461154390614085565b80156115905780601f1061156557610100808354040283529160200191611590565b820191906000526020600020905b81548152906001019060200180831161157357829003601f168201915b505050918352505060068201546020820152600782015460408201526008820154606082015260098201546080820152600a82015460ff16151560a0820152600b9091015460c09182015281015160e0820151610100909201519097919650945092505050565b6000818152606a60205260408120548190819081908190819087146116535760405162461bcd60e51b81526020600482015260126024820152711b9bdd08195e1a5cdd1959081d9bdd19525960721b6044820152606401610cb4565b50505060009384525050606a6020908152604092839020835160c0810185528154808252600183015493820184905260028301546001600160a01b031695820186905260038301546060830181905260048401546080840181905260059094015460a090930183905290969395945092565b81336116cf612b4a565b6001600160a01b031614806116fd57506000818152606660205260409020600401546001600160a01b031633145b6117195760405162461bcd60e51b8152600401610cb4906140bf565b611721612b6a565b6001600160a01b0316306001600160a01b0316146117515760405162461bcd60e51b8152600401610cb4906140e6565b818061175b610efc565b11156117a95760405162461bcd60e51b815260206004820152601c60248201527f556e646572206d696e2076616c7565206f6620206475726174696f6e000000006044820152606401610cb4565b6117b161275d565b8111156118005760405162461bcd60e51b815260206004820152601a60248201527f4f766572206d61782076616c7565206f66206475726174696f6e0000000000006044820152606401610cb4565b600084815260666020526040902054841461182d5760405162461bcd60e51b8152600401610cb490614163565b6000848152606660205260409020600a015460ff161561185f5760405162461bcd60e51b8152600401610cb49061418f565b6001600085815260666020526040902060090154146118905760405162461bcd60e51b8152600401610cb4906141ba565b600084815260666020526040808220600b810186905590519091339187917ff0855c0e0ad9b8a162b87f2e4e07d4b2a3f0a45126b15ff4a78b217ad19a901a91a35050505050565b6000818152606660209081526040808320815161018081018352815481526001820154938101939093526002810154918301919091526003810154606083015260048101546001600160a01b031660808301526005810180548493849384939192909160a084019161194990614085565b80601f016020809104026020016040519081016040528092919081815260200182805461197590614085565b80156119c25780601f10611997576101008083540402835291602001916119c2565b820191906000526020600020905b8154815290600101906020018083116119a557829003601f168201915b50505091835250506006820154602082015260078201546040820152600882015460608083019190915260098301546080830152600a83015460ff16151560a0830152600b9092015460c090910152810151610120820151610140909201519097919650945092505050565b6000611a38612b6a565b6001600160a01b0316306001600160a01b03161415905090565b611a5a612e58565b611a64600061310a565b565b33611a6f612b4a565b6001600160a01b031614611a955760405162461bcd60e51b8152600401610cb4906140bf565b611a9d612b6a565b6001600160a01b0316306001600160a01b031614611acd5760405162461bcd60e51b8152600401610cb4906140e6565b6000828152606660205260409020548214611afa5760405162461bcd60e51b8152600401610cb490614163565b6000828152606760205260409020548214611b575760405162461bcd60e51b815260206004820152601860248201527f6e6f7420657869737465642042616c6c6f744d656d62657200000000000000006044820152606401610cb4565b6000828152606660205260409020600a015460ff1615611b895760405162461bcd60e51b8152600401610cb49061418f565b600160008381526066602052604090206009015414611bba5760405162461bcd60e51b8152600401610cb4906141ba565b6000828152606760205260408082206009810184905590519091339185917ff0855c0e0ad9b8a162b87f2e4e07d4b2a3f0a45126b15ff4a78b217ad19a901a91a3505050565b600081815260676020526040812060018101546002820154600383015460048401546005850180546001600160a01b039586169794861696938616959092169360609384938493839291611c5390614085565b80601f0160208091040260200160405190810160405280929190818152602001828054611c7f90614085565b8015611ccc5780601f10611ca157610100808354040283529160200191611ccc565b820191906000526020600020905b815481529060010190602001808311611caf57829003601f168201915b50505050509550806006018054611ce290614085565b80601f0160208091040260200160405190810160405280929190818152602001828054611d0e90614085565b8015611d5b5780601f10611d3057610100808354040283529160200191611d5b565b820191906000526020600020905b815481529060010190602001808311611d3e57829003601f168201915b50505050509450806007018054611d7190614085565b80601f0160208091040260200160405190810160405280929190818152602001828054611d9d90614085565b8015611dea5780601f10611dbf57610100808354040283529160200191611dea565b820191906000526020600020905b815481529060010190602001808311611dcd57829003601f168201915b505050505093508060080154925080600901549150509193959799909294969850565b33611e16612b4a565b6001600160a01b031614611e3c5760405162461bcd60e51b8152600401610cb4906140bf565b611e44612b6a565b6001600160a01b0316306001600160a01b031614611e745760405162461bcd60e51b8152600401610cb4906140e6565b6001821480611e835750600282145b611ec25760405162461bcd60e51b815260206004820152601060248201526f24b73b30b634b2103232b1b4b9b4b7b760811b6044820152606401610cb4565b6000848152606660205260409020548414611eef5760405162461bcd60e51b8152600401610cb490614163565b6000858152606a6020526040902054859003611f465760405162461bcd60e51b8152602060048201526016602482015275185b1c9958591e48195e1a5cdd1959081d9bdd19525960521b6044820152606401610cb4565b6000848152606b602090815260408083206001600160a01b038716845290915290205460ff1615611fa95760405162461bcd60e51b815260206004820152600d60248201526c185b1c9958591e481d9bdd1959609a1b6044820152606401610cb4565b6002600085815260666020526040902060090154146120015760405162461bcd60e51b81526020600482015260146024820152734e6f7420496e50726f677265737320537461746560601b6044820152606401610cb4565b6040518060c00160405280868152602001858152602001846001600160a01b0316815260200183815260200182815260200161203a4290565b90526000868152606a602090815260409182902083518155908301516001820155908201516002820180546001600160a01b0319166001600160a01b03909216919091179055606082015160038201556080820151600482015560a0909101516005909101556120ac8484848461315c565b826001600160a01b031684867f41df84b3b467b06744e40c92613c666324e7c640ce0a41ec06efdf602d367606856040516120e991815260200190565b60405180910390a45050505050565b33612101612b4a565b6001600160a01b0316146121275760405162461bcd60e51b8152600401610cb4906140bf565b61212f612b6a565b6001600160a01b0316306001600160a01b03161461215f5760405162461bcd60e51b8152600401610cb4906140e6565b600082815260666020526040902054821461218c5760405162461bcd60e51b8152600401610cb490614163565b6000828152606660205260409020600a015460ff16156121be5760405162461bcd60e51b8152600401610cb49061418f565b60038114806121cd5750600481145b6122105760405162461bcd60e51b8152602060048201526014602482015273496e76616c69642042616c6c6f7420537461746560601b6044820152606401610cb4565b6000828152606660205260409081902060098101839055600a8101805460ff19166001179055905183907fdc921f027328d7238b58d77649ebcbd0c8b1c494c66ba53dfe53e0de65f6dd9f906122699085815260200190565b60405180910390a2505050565b61227e612e58565b6001600160a01b0381166122d45760405162461bcd60e51b815260206004820152601a60248201527f416464726573732073686f756c64206265206e6f6e2d7a65726f0000000000006044820152606401610cb4565b606580546001600160a01b0319166001600160a01b0383169081179091556040517f278c70ced5f3e0e5eeb385b5ff9cb735748ba00a625147e66065ed48fc1562cd90600090a250565b8133612328612b4a565b6001600160a01b0316148061235657506000818152606660205260409020600401546001600160a01b031633145b6123725760405162461bcd60e51b8152600401610cb4906140bf565b61237a612b6a565b6001600160a01b0316306001600160a01b0316146123aa5760405162461bcd60e51b8152600401610cb4906140e6565b60008381526066602052604090205483146123d75760405162461bcd60e51b8152600401610cb490614163565b6000838152606660205260409020600a015460ff16156124095760405162461bcd60e51b8152600401610cb49061418f565b60008381526066602090815260409091208351909161242f916005840191860190613a33565b50604051339085907ff0855c0e0ad9b8a162b87f2e4e07d4b2a3f0a45126b15ff4a78b217ad19a901a90600090a350505050565b3361246c612b4a565b6001600160a01b0316146124925760405162461bcd60e51b8152600401610cb4906140bf565b61249a612b6a565b6001600160a01b0316306001600160a01b0316146124ca5760405162461bcd60e51b8152600401610cb4906140e6565b81816000821180156124dc5750600081115b61251c5760405162461bcd60e51b815260206004820152601160248201527007374617274206f7220656e64206973203607c1b6044820152606401610cb4565b81811161255a5760405162461bcd60e51b815260206004820152600c60248201526b1cdd185c9d080f8f48195b9960a21b6044820152606401610cb4565b60008581526066602052604090205485146125875760405162461bcd60e51b8152600401610cb490614163565b6000858152606660205260409020600a015460ff16156125b95760405162461bcd60e51b8152600401610cb49061418f565b6001600086815260666020526040902060090154146125ea5760405162461bcd60e51b8152600401610cb4906141ba565b600085815260666020526040902060018101859055600280820185905560098201556040518490869088907fd9938a514dab5cdce149a77493f694bd70c24a4833a278fd4d86fbdf859099c590600090a4505050505050565b600054610100900460ff16158080156126635750600054600160ff909116105b8061267d5750303b15801561267d575060005460ff166001145b6126e05760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610cb4565b6000805460ff191660011790558015612703576000805461ff0019166101001790555b61270b6132c4565b61271482612276565b80156113ef576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b6000612767612e40565b6001600160a01b0316631b27e01b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f43573d6000803e3d6000fd5b336127ad612b4a565b6001600160a01b0316146127d35760405162461bcd60e51b8152600401610cb4906140bf565b6127db612b6a565b6001600160a01b0316306001600160a01b03161461280b5760405162461bcd60e51b8152600401610cb4906140e6565b61281c8b89898989898989896132f3565b6128385760405162461bcd60e51b8152600401610cb490614138565b6128448c8c8c8c612b85565b6128be6040518061014001604052806000815260200160006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b0316815260200160608152602001606081526020016060815260200160008152602001600081525090565b8c8160000181815250508881602001906001600160a01b031690816001600160a01b0316815250508781604001906001600160a01b031690816001600160a01b0316815250508681606001906001600160a01b031690816001600160a01b0316815250508581608001906001600160a01b031690816001600160a01b031681525050848160a00181905250838160c00181905250828160e00181905250818161010001818152505080606760008f81526020019081526020016000206000820151816000015560208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160020160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060608201518160030160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060808201518160040160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060a0820151816005019080519060200190612a54929190613a33565b5060c08201518051612a70916006840191602090910190613a33565b5060e08201518051612a8c916007840191602090910190613a33565b5061010082015160088201556101209091015160099091015550505050505050505050505050565b612abc612e58565b6001600160a01b038116612b215760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610cb4565b6112198161310a565b612b32612e58565b6001600160a01b03811615611219576111fd81612eb2565b6000610f677111dbdd995c9b985b98d950dbdb9d1c9858dd60721b613752565b6000610f676c42616c6c6f7453746f7261676560981b613752565b8180612b8f610efc565b1115612bdd5760405162461bcd60e51b815260206004820152601c60248201527f556e646572206d696e2076616c7565206f6620206475726174696f6e000000006044820152606401610cb4565b612be561275d565b811115612c345760405162461bcd60e51b815260206004820152601a60248201527f4f766572206d61782076616c7565206f66206475726174696f6e0000000000006044820152606401610cb4565b600085815260666020526040902054859003612c8b5760405162461bcd60e51b8152602060048201526016602482015275105b1c9958591e48195e1a5cdd19590818985b1b1bdd60521b6044820152606401610cb4565b612cfa6040518061018001604052806000815260200160008152602001600081526020016000815260200160006001600160a01b031681526020016060815260200160008152602001600081526020016000815260200160008152602001600015158152602001600081525090565b858152606081018590526001600160a01b0383166080820152600161012082015260006101408201819052610160820185905286815260666020908152604091829020835181558184015160018201559183015160028301556060830151600383015560808301516004830180546001600160a01b0319166001600160a01b0390921691909117905560a08301518051849392612d9e926005850192910190613a33565b5060c0820151600682015560e0820151600782015561010082015160088201556101208201516009820155610140820151600a8201805460ff191691151591909117905561016090910151600b90910155606d54612dfd906001614294565b606d556040516001600160a01b03841690869088907fd1ba591c76ef71222e2d30b8277758713cc6eef1de29efaf98a716744ac2420b90600090a4505050505050565b6000610f6769456e7653746f7261676560b01b613752565b6033546001600160a01b03163314611a645760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610cb4565b611219612e58565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615612ef257612eed836137c6565b505050565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015612f4c575060408051601f3d908101601f19168201909252612f49918101906141e3565b60015b612faf5760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608401610cb4565b60008051602061442e833981519152811461301e5760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608401610cb4565b50612eed838383613862565b60006005841461304c5760405162461bcd60e51b8152600401610cb49061410b565b826130a35760405162461bcd60e51b815260206004820152602160248201527f496e76616c696420656e7669726f6e6d656e74207661726961626c65206e616d6044820152606560f81b6064820152608401610cb4565b60008251116130ff5760405162461bcd60e51b815260206004820152602260248201527f496e76616c696420656e7669726f6e6d656e74207661726961626c652076616c604482015261756560f01b6064820152608401610cb4565b5060015b9392505050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600182148061316b5750600282145b6131aa5760405162461bcd60e51b815260206004820152601060248201526f24b73b30b634b2103232b1b4b9b4b7b760811b6044820152606401610cb4565b60008481526066602052604090205484146131d75760405162461bcd60e51b8152600401610cb490614163565b6000848152606b602090815260408083206001600160a01b038716845290915290205460ff161561323a5760405162461bcd60e51b815260206004820152600d60248201526c185b1c9958591e481d9bdd1959609a1b6044820152606401610cb4565b6000848152606660209081526040808320606b83528184206001600160a01b0388168552909252909120805460ff19166001908117909155600682015461328091614294565b6006820155600183036132a75781816007015461329d9190614294565b60078201556132bd565b8181600801546132b79190614294565b60088201555b5050505050565b600054610100900460ff166132eb5760405162461bcd60e51b8152600401610cb4906142ba565b611a6461388d565b600060018a10158015613307575060038a11155b6133235760405162461bcd60e51b8152600401610cb49061410b565b60028a036134e2576001600160a01b0389166133515760405162461bcd60e51b8152600401610cb490614305565b6001600160a01b038816156133785760405162461bcd60e51b8152600401610cb49061433c565b6001600160a01b0387161561339f5760405162461bcd60e51b8152600401610cb490614373565b6001600160a01b038616156133c65760405162461bcd60e51b8152600401610cb4906143aa565b84511561340d5760405162461bcd60e51b8152602060048201526015602482015274496e76616c6964206e6577206e6f6465206e616d6560581b6044820152606401610cb4565b8351156134525760405162461bcd60e51b8152602060048201526013602482015272125b9d985b1a59081b995dc81b9bd919481a59606a1b6044820152606401610cb4565b8251156134975760405162461bcd60e51b81526020600482015260136024820152720496e76616c6964206e6577206e6f646520495606c1b6044820152606401610cb4565b81156134dd5760405162461bcd60e51b8152602060048201526015602482015274125b9d985b1a59081b995dc81b9bd91948141bdc9d605a1b6044820152606401610cb4565b613742565b600085511161352b5760405162461bcd60e51b8152602060048201526015602482015274496e76616c6964206e6577206e6f6465206e616d6560581b6044820152606401610cb4565b83516040146135725760405162461bcd60e51b8152602060048201526013602482015272125b9d985b1a59081b995dc81b9bd919481a59606a1b6044820152606401610cb4565b60008351116135b95760405162461bcd60e51b81526020600482015260136024820152720496e76616c6964206e6577206e6f646520495606c1b6044820152606401610cb4565b600082116136015760405162461bcd60e51b8152602060048201526015602482015274125b9d985b1a59081b995dc81b9bd91948141bdc9d605a1b6044820152606401610cb4565b60018a036136a2576001600160a01b038916156136305760405162461bcd60e51b8152600401610cb490614305565b6001600160a01b0388166136565760405162461bcd60e51b8152600401610cb49061433c565b6001600160a01b03871661367c5760405162461bcd60e51b8152600401610cb490614373565b6001600160a01b0386166134dd5760405162461bcd60e51b8152600401610cb4906143aa565b60038a03613742576001600160a01b0389166136d05760405162461bcd60e51b8152600401610cb490614305565b6001600160a01b0388166136f65760405162461bcd60e51b8152600401610cb49061433c565b6001600160a01b03871661371c5760405162461bcd60e51b8152600401610cb490614373565b6001600160a01b0386166137425760405162461bcd60e51b8152600401610cb4906143aa565b5060019998505050505050505050565b606554604051630d2020dd60e01b8152600481018390526000916001600160a01b031690630d2020dd90602401602060405180830381865afa15801561379c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137c091906143e1565b92915050565b6001600160a01b0381163b6138335760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610cb4565b60008051602061442e83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b61386b836138bd565b6000825111806138785750805b15612eed5761388783836138fd565b50505050565b600054610100900460ff166138b45760405162461bcd60e51b8152600401610cb4906142ba565b611a643361310a565b6138c6816137c6565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6060613103838360405180606001604052806027815260200161444e6027913960606001600160a01b0384163b6139855760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610cb4565b600080856001600160a01b0316856040516139a091906143fe565b600060405180830381855af49150503d80600081146139db576040519150601f19603f3d011682016040523d82523d6000602084013e6139e0565b606091505b50915091506139f08282866139fa565b9695505050505050565b60608315613a09575081613103565b825115613a195782518084602001fd5b8160405162461bcd60e51b8152600401610cb4919061441a565b828054613a3f90614085565b90600052602060002090601f016020900481019282613a615760008555613aa7565b82601f10613a7a57805160ff1916838001178555613aa7565b82800160010185558215613aa7579182015b82811115613aa7578251825591602001919060010190613a8c565b50613ab3929150613ab7565b5090565b5b80821115613ab35760008155600101613ab8565b600060208284031215613ade57600080fd5b5035919050565b60005b83811015613b00578181015183820152602001613ae8565b838111156138875750506000910152565b60008151808452613b29816020860160208601613ae5565b601f01601f19169290920160200192915050565b60006101608d83528c60208401528b604084015260018060a01b038b166060840152806080840152613b718184018b613b11565b60a0840199909952505060c081019590955260e085019390935261010084019190915215156101208301526101409091015295945050505050565b6001600160a01b038116811461121957600080fd5b8035613bcc81613bac565b919050565b600080600080600060a08688031215613be957600080fd5b8535945060208601359350604086013592506060860135613c0981613bac565b91506080860135613c1981613bac565b809150509295509295909350565b838152826020820152606060408201526000613c466060830184613b11565b95945050505050565b600080600060608486031215613c6457600080fd5b505081359360208301359350604090920135919050565b600060208284031215613c8d57600080fd5b813561310381613bac565b634e487b7160e01b600052604160045260246000fd5b600082601f830112613cbf57600080fd5b813567ffffffffffffffff80821115613cda57613cda613c98565b604051601f8301601f19908116603f01168101908282118183101715613d0257613d02613c98565b81604052838152866020858801011115613d1b57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600080600060e0888a031215613d5657600080fd5b8735965060208801359550604088013594506060880135613d7681613bac565b93506080880135925060a0880135915060c088013567ffffffffffffffff811115613da057600080fd5b613dac8a828b01613cae565b91505092959891949750929550565b60008060408385031215613dce57600080fd5b8235613dd981613bac565b9150602083013567ffffffffffffffff811115613df557600080fd5b613e0185828601613cae565b9150509250929050565b60008060408385031215613e1e57600080fd5b50508035926020909101359150565b6001600160a01b038a81168252898116602083015288811660408301528716606082015261012060808201819052600090613e6a83820189613b11565b905082810360a0840152613e7e8188613b11565b905082810360c0840152613e928187613b11565b60e084019590955250506101000152979650505050505050565b600080600080600060a08688031215613ec457600080fd5b85359450602086013593506040860135613edd81613bac565b94979396509394606081013594506080013592915050565b60008060408385031215613f0857600080fd5b82359150602083013567ffffffffffffffff811115613df557600080fd5b6000806000806000806000806000806000806101808d8f031215613f4957600080fd5b8c359b5060208d01359a5060408d01359950613f6760608e01613bc1565b9850613f7560808e01613bc1565b9750613f8360a08e01613bc1565b9650613f9160c08e01613bc1565b9550613f9f60e08e01613bc1565b945067ffffffffffffffff6101008e01351115613fbb57600080fd5b613fcc8e6101008f01358f01613cae565b935067ffffffffffffffff6101208e01351115613fe857600080fd5b613ff98e6101208f01358f01613cae565b925067ffffffffffffffff6101408e0135111561401557600080fd5b6140268e6101408f01358f01613cae565b91506101608d013590509295989b509295989b509295989b565b6000806040838503121561405357600080fd5b823566ffffffffffffff8116811461406a57600080fd5b9150602083013561407a81613bac565b809150509250929050565b600181811c9082168061409957607f821691505b6020821081036140b957634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252600d908201526c2737902832b936b4b9b9b4b7b760991b604082015260600190565b6020808252600b908201526a125cc8111a5cd8589b195960aa1b604082015260600190565b602080825260139082015272496e76616c69642042616c6c6f74205479706560681b604082015260600190565b60208082526011908201527024b73b30b634b2102830b930b6b2ba32b960791b604082015260600190565b6020808252601290820152711b9bdd08195e1a5cdd19590810985b1b1bdd60721b604082015260600190565b602080825260119082015270185b1c9958591e48199a5b985b1a5e9959607a1b604082015260600190565b6020808252600f908201526e4e6f7420526561647920537461746560881b604082015260600190565b6000602082840312156141f557600080fd5b5051919050565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b600082198211156142b557634e487b7160e01b600052601160045260246000fd5b500190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b6020808252601a908201527f496e76616c6964206f6c64207374616b65722061646472657373000000000000604082015260600190565b6020808252601a908201527f496e76616c6964206e6577207374616b65722061646472657373000000000000604082015260600190565b60208082526019908201527f496e76616c6964206e657720766f746572206164647265737300000000000000604082015260600190565b6020808252601a908201527f496e76616c6964206e6577207265776172642061646472657373000000000000604082015260600190565b6000602082840312156143f357600080fd5b815161310381613bac565b60008251614410818460208701613ae5565b9190910192915050565b6020815260006131036020830184613b1156fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220d596f8c32db0e2a432c61e3e481cfa3a0849a6a96ced7f94574bcc375400012264736f6c634300080e0033", + Bin: "0x60a0604052306080523480156200001557600080fd5b506200002062000026565b620000e8565b600054610100900460ff1615620000935760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff9081161015620000e6576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6080516147e26200012060003960008181611296015281816112d60152818161147c015281816114bc015261154f01526147e26000f3fe6080604052600436106102935760003560e01c80636c78d2cf1161015a578063a91ee0dc116100c1578063c4d66de81161007a578063c4d66de8146108d7578063ce04b9d4146108f7578063daacbb951461090c578063f2fde38b1461092c578063f51a88e21461094c578063f680e5551461096c57600080fd5b8063a91ee0dc14610824578063aea83e4014610844578063b23c676c14610864578063b474149514610882578063bce0dbc114610897578063c0b6f186146108b757600080fd5b80637efa9ae3116101135780637efa9ae31461071f5780638c7be692146107585780638da5cb5b146107a257806396462b9c146107c05780639986e4b9146107e0578063a91e59ba1461080457600080fd5b80636c78d2cf14610633578063715018a61461065c57806372d0ec9214610671578063738fdd1a1461069157806373df4e01146106c95780637bf46530146106fe57600080fd5b80633659cfe6116101fe57806356ba988e116101b757806356ba988e146105125780635a55c1f0146105325780635a731cca1461058d578063656bc633146105b1578063688ca5b2146105d15780636c57f5a91461060e57600080fd5b80633659cfe6146104755780634a57823e146104955780634bd1ed76146104b55780634f1ef286146104d757806352d1902d146104ea578063557ed1ba146104ff57600080fd5b80631d940da2116102505780631d940da2146103a75780631e0cba0d146103d657806322640859146103f45780632a74f38c146104145780632f40992e1461043457806334125c841461045557600080fd5b806302b385fb14610298578063060e6a99146102d857806309970688146103075780630a3a63fe14610342578063155ca224146103705780631c15017114610392575b600080fd5b3480156102a457600080fd5b506102b86102b3366004613d6f565b6109bd565b6040516102cf9b9a99989796959493929190613de0565b60405180910390f35b3480156102e457600080fd5b506102f86102f3366004613d6f565b610b88565b6040516102cf93929190613e4f565b34801561031357600080fd5b50610327610322366004613d6f565b610c72565b604080519384526020840192909252908201526060016102cf565b34801561034e57600080fd5b5061036261035d366004613ea4565b610dd2565b6040519081526020016102cf565b34801561037c57600080fd5b5061039061038b366004613d6f565b610eea565b005b34801561039e57600080fd5b5061036261104b565b3480156103b357600080fd5b506103c76103c2366004613d6f565b6110bb565b6040516102cf93929190613efa565b3480156103e257600080fd5b50610362665374616b696e6760c81b81565b34801561040057600080fd5b5061039061040f366004613f19565b611173565b34801561042057600080fd5b5061039061042f366004613f45565b6111f2565b34801561044057600080fd5b506103626914995dd85c99141bdbdb60b21b81565b34801561046157600080fd5b506103626845636f73797374656d60b81b81565b34801561048157600080fd5b50610390610490366004613f45565b61128c565b3480156104a157600080fd5b506103626104b0366004614005565b61136b565b3480156104c157600080fd5b506103626a4d61696e74656e616e636560a81b81565b6103906104e5366004614085565b611472565b3480156104f657600080fd5b50610362611542565b34801561050b57600080fd5b5042610362565b34801561051e57600080fd5b5061032761052d366004613d6f565b6115f5565b34801561053e57600080fd5b5061055261054d366004613d6f565b611746565b6040805196875260208701959095526001600160a01b03909316938501939093526060840152608083019190915260a082015260c0016102cf565b34801561059957600080fd5b506103626c14dd185ada5b99d4995dd85c99609a1b81565b3480156105bd57600080fd5b506103906105cc3660046140d5565b611814565b3480156105dd57600080fd5b506105f16105ec366004613d6f565b611a27565b6040805193845260208401929092521515908201526060016102cf565b34801561061a57600080fd5b50610623611b7d565b60405190151581526020016102cf565b34801561063f57600080fd5b506103627111dbdd995c9b985b98d950dbdb9d1c9858dd60721b81565b34801561066857600080fd5b50610390611ba1565b34801561067d57600080fd5b5061039061068c3660046140d5565b611bb5565b34801561069d57600080fd5b506065546106b1906001600160a01b031681565b6040516001600160a01b0390911681526020016102cf565b3480156106d557600080fd5b506106e96106e4366004613d6f565b611d4f565b6040516102cf999897969594939291906140f7565b34801561070a57600080fd5b5061036269456e7653746f7261676560b01b81565b34801561072b57600080fd5b506106b161073a366004613d6f565b6000908152606860205260409020600101546001600160a01b031690565b34801561076457600080fd5b5061078d610773366004613d6f565b6000908152606e6020526040902080546001909101549091565b604080519283526020830191909152016102cf565b3480156107ae57600080fd5b506033546001600160a01b03166106b1565b3480156107cc57600080fd5b506103906107db366004614176565b611f5c565b3480156107ec57600080fd5b506103626c42616c6c6f7453746f7261676560981b81565b34801561081057600080fd5b5061039061081f3660046140d5565b612247565b34801561083057600080fd5b5061039061083f366004613f45565b6123c5565b34801561085057600080fd5b5061039061085f3660046141bf565b61246d565b34801561087057600080fd5b50606c546001600160a01b03166106b1565b34801561088e57600080fd5b50606d54610362565b3480156108a357600080fd5b506103906108b236600461422d565b6125c1565b3480156108c357600080fd5b506103906108d2366004613f19565b612706565b3480156108e357600080fd5b506103906108f2366004613f45565b6128e6565b34801561090357600080fd5b50610362612a00565b34801561091857600080fd5b5061039061092736600461425e565b612a47565b34801561093857600080fd5b50610390610947366004613f45565b612d57565b34801561095857600080fd5b50610390610967366004613f45565b612dcd565b34801561097857600080fd5b50610623610987366004614378565b66ffffffffffffff82166000908152606b602090815260408083206001600160a01b038516845290915290205460ff1692915050565b60008060008060606000806000806000806000606660008e815260200190815260200160002060405180610180016040529081600082015481526020016001820154815260200160028201548152602001600382015481526020016004820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b03168152602001600582018054610a56906143bd565b80601f0160208091040260200160405190810160405280929190818152602001828054610a82906143bd565b8015610acf5780601f10610aa457610100808354040283529160200191610acf565b820191906000526020600020905b815481529060010190602001808311610ab257829003601f168201915b5050505050815260200160068201548152602001600782015481526020016008820154815260200160098201548152602001600a820160009054906101000a900460ff16151515158152602001600b82015481525050905080602001519b5080604001519a5080606001519950806080015198508060a0015197508060c0015196508060e00151955080610100015194508061012001519350806101400151925080610160015191505091939597999b90929496989a50565b6000818152606f6020908152604080832081516060818101845282546001600160a01b0316825260018301549482019490945260028201805486959486949290840191610bd4906143bd565b80601f0160208091040260200160405190810160405280929190818152602001828054610c00906143bd565b8015610c4d5780601f10610c2257610100808354040283529160200191610c4d565b820191906000526020600020905b815481529060010190602001808311610c3057829003601f168201915b5050509190925250508151602083015160409093015190989297509550909350505050565b6000818152606660209081526040808320815161018081018352815481526001820154938101939093526002810154918301919091526003810154606083015260048101546001600160a01b031660808301526005810180548493849384939192909160a0840191610ce3906143bd565b80601f0160208091040260200160405190810160405280929190818152602001828054610d0f906143bd565b8015610d5c5780601f10610d3157610100808354040283529160200191610d5c565b820191906000526020600020905b815481529060010190602001808311610d3f57829003601f168201915b5050505050815260200160068201548152602001600782015481526020016008820154815260200160098201548152602001600a820160009054906101000a900460ff16151515158152602001600b82015481525050905080602001519350806040015192508061016001519150509193909250565b600033610ddd612ded565b6001600160a01b031614610e0c5760405162461bcd60e51b8152600401610e03906143f7565b60405180910390fd5b610e14612e0d565b6001600160a01b0316306001600160a01b031614610e445760405162461bcd60e51b8152600401610e039061441e565b60048514610e645760405162461bcd60e51b8152600401610e0390614443565b6001600160a01b038216610e8a5760405162461bcd60e51b8152600401610e0390614470565b610e9686868686612e28565b506040805180820182528681526001600160a01b0392831660208083019182526000898152606890915292909220905181559051600190910180546001600160a01b03191691909216179055509192915050565b8033610ef4612ded565b6001600160a01b03161480610f2257506000818152606660205260409020600401546001600160a01b031633145b610f3e5760405162461bcd60e51b8152600401610e03906143f7565b610f46612e0d565b6001600160a01b0316306001600160a01b031614610f765760405162461bcd60e51b8152600401610e039061441e565b6000828152606660205260409020548214610fa35760405162461bcd60e51b8152600401610e039061449b565b6000828152606660205260409020600a015460ff1615610fd55760405162461bcd60e51b8152600401610e03906144c7565b6001600083815260666020526040902060090154146110065760405162461bcd60e51b8152600401610e03906144f2565b60008281526066602052604090206005600982015560405183907fd5e541d004c50564e5e05fcbc6be2916c68d817507693dc3774c69dde4ce13dc90600090a2505050565b60006110556130e3565b6001600160a01b03166333be496e6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611092573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110b6919061451b565b905090565b6000818152606960205260409020600181015460028201546003830180549293919260609291906110eb906143bd565b80601f0160208091040260200160405190810160405280929190818152602001828054611117906143bd565b80156111645780601f1061113957610100808354040283529160200191611164565b820191906000526020600020905b81548152906001019060200180831161114757829003601f168201915b50505050509150509193909250565b3361117c612ded565b6001600160a01b0316146111a25760405162461bcd60e51b8152600401610e03906143f7565b6111aa612e0d565b6001600160a01b0316306001600160a01b0316146111da5760405162461bcd60e51b8152600401610e039061441e565b6000928352606e602052604090922090815560010155565b6111fa6130fb565b6001600160a01b0381166112425760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606401610e03565b606c80546001600160a01b0319166001600160a01b0383169081179091556040517f3d809312b6e303291a93b307c7ddbd0960c094f5f0fb4e3ba0758775013edeb390600090a250565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036112d45760405162461bcd60e51b8152600401610e0390614534565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031661131d600080516020614766833981519152546001600160a01b031690565b6001600160a01b0316146113435760405162461bcd60e51b8152600401610e0390614580565b61134c81613155565b604080516000808252602082019092526113689183919061315d565b50565b600033611376612ded565b6001600160a01b03161461139c5760405162461bcd60e51b8152600401610e03906143f7565b6113a4612e0d565b6001600160a01b0316306001600160a01b0316146113d45760405162461bcd60e51b8152600401610e039061441e565b6113df8785846132cd565b6113fb5760405162461bcd60e51b8152600401610e0390614470565b61140788888888612e28565b6040805160808101825289815260208082018781528284018781526060840187815260008e81526069855295909520845181559151600183015551600282015592518051929384939092611462926003850192910190613cd6565b50999a9950505050505050505050565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036114ba5760405162461bcd60e51b8152600401610e0390614534565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611503600080516020614766833981519152546001600160a01b031690565b6001600160a01b0316146115295760405162461bcd60e51b8152600401610e0390614580565b61153282613155565b61153e8282600161315d565b5050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146115e25760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610e03565b5060008051602061476683398151915290565b6000818152606660209081526040808320815161018081018352815481526001820154938101939093526002810154918301919091526003810154606083015260048101546001600160a01b031660808301526005810180548493849384939192909160a0840191611666906143bd565b80601f0160208091040260200160405190810160405280929190818152602001828054611692906143bd565b80156116df5780601f106116b4576101008083540402835291602001916116df565b820191906000526020600020905b8154815290600101906020018083116116c257829003601f168201915b505050918352505060068201546020820152600782015460408201526008820154606082015260098201546080820152600a82015460ff16151560a0820152600b9091015460c09182015281015160e0820151610100909201519097919650945092505050565b6000818152606a60205260408120548190819081908190819087146117a25760405162461bcd60e51b81526020600482015260126024820152711b9bdd08195e1a5cdd1959081d9bdd19525960721b6044820152606401610e03565b50505060009384525050606a6020908152604092839020835160c0810185528154808252600183015493820184905260028301546001600160a01b031695820186905260038301546060830181905260048401546080840181905260059094015460a090930183905290969395945092565b813361181e612ded565b6001600160a01b0316148061184c57506000818152606660205260409020600401546001600160a01b031633145b6118685760405162461bcd60e51b8152600401610e03906143f7565b611870612e0d565b6001600160a01b0316306001600160a01b0316146118a05760405162461bcd60e51b8152600401610e039061441e565b81806118aa61104b565b11156118f85760405162461bcd60e51b815260206004820152601c60248201527f556e646572206d696e2076616c7565206f6620206475726174696f6e000000006044820152606401610e03565b611900612a00565b81111561194f5760405162461bcd60e51b815260206004820152601a60248201527f4f766572206d61782076616c7565206f66206475726174696f6e0000000000006044820152606401610e03565b600084815260666020526040902054841461197c5760405162461bcd60e51b8152600401610e039061449b565b6000848152606660205260409020600a015460ff16156119ae5760405162461bcd60e51b8152600401610e03906144c7565b6001600085815260666020526040902060090154146119df5760405162461bcd60e51b8152600401610e03906144f2565b600084815260666020526040808220600b810186905590519091339187917ff0855c0e0ad9b8a162b87f2e4e07d4b2a3f0a45126b15ff4a78b217ad19a901a91a35050505050565b6000818152606660209081526040808320815161018081018352815481526001820154938101939093526002810154918301919091526003810154606083015260048101546001600160a01b031660808301526005810180548493849384939192909160a0840191611a98906143bd565b80601f0160208091040260200160405190810160405280929190818152602001828054611ac4906143bd565b8015611b115780601f10611ae657610100808354040283529160200191611b11565b820191906000526020600020905b815481529060010190602001808311611af457829003601f168201915b50505091835250506006820154602082015260078201546040820152600882015460608083019190915260098301546080830152600a83015460ff16151560a0830152600b9092015460c090910152810151610120820151610140909201519097919650945092505050565b6000611b87612e0d565b6001600160a01b0316306001600160a01b03161415905090565b611ba96130fb565b611bb360006133ad565b565b33611bbe612ded565b6001600160a01b031614611be45760405162461bcd60e51b8152600401610e03906143f7565b611bec612e0d565b6001600160a01b0316306001600160a01b031614611c1c5760405162461bcd60e51b8152600401610e039061441e565b6000828152606660205260409020548214611c495760405162461bcd60e51b8152600401610e039061449b565b6000828152606760205260409020548214611ca65760405162461bcd60e51b815260206004820152601860248201527f6e6f7420657869737465642042616c6c6f744d656d62657200000000000000006044820152606401610e03565b6000828152606660205260409020600a015460ff1615611cd85760405162461bcd60e51b8152600401610e03906144c7565b600160008381526066602052604090206009015414611d095760405162461bcd60e51b8152600401610e03906144f2565b6000828152606760205260408082206009810184905590519091339185917ff0855c0e0ad9b8a162b87f2e4e07d4b2a3f0a45126b15ff4a78b217ad19a901a91a3505050565b600081815260676020526040812060018101546002820154600383015460048401546005850180546001600160a01b039586169794861696938616959092169360609384938493839291611da2906143bd565b80601f0160208091040260200160405190810160405280929190818152602001828054611dce906143bd565b8015611e1b5780601f10611df057610100808354040283529160200191611e1b565b820191906000526020600020905b815481529060010190602001808311611dfe57829003601f168201915b50505050509550806006018054611e31906143bd565b80601f0160208091040260200160405190810160405280929190818152602001828054611e5d906143bd565b8015611eaa5780601f10611e7f57610100808354040283529160200191611eaa565b820191906000526020600020905b815481529060010190602001808311611e8d57829003601f168201915b50505050509450806007018054611ec0906143bd565b80601f0160208091040260200160405190810160405280929190818152602001828054611eec906143bd565b8015611f395780601f10611f0e57610100808354040283529160200191611f39565b820191906000526020600020905b815481529060010190602001808311611f1c57829003601f168201915b505050505093508060080154925080600901549150509193959799909294969850565b33611f65612ded565b6001600160a01b031614611f8b5760405162461bcd60e51b8152600401610e03906143f7565b611f93612e0d565b6001600160a01b0316306001600160a01b031614611fc35760405162461bcd60e51b8152600401610e039061441e565b6001821480611fd25750600282145b6120115760405162461bcd60e51b815260206004820152601060248201526f24b73b30b634b2103232b1b4b9b4b7b760811b6044820152606401610e03565b600084815260666020526040902054841461203e5760405162461bcd60e51b8152600401610e039061449b565b6000858152606a60205260409020548590036120955760405162461bcd60e51b8152602060048201526016602482015275185b1c9958591e48195e1a5cdd1959081d9bdd19525960521b6044820152606401610e03565b6000848152606b602090815260408083206001600160a01b038716845290915290205460ff16156120f85760405162461bcd60e51b815260206004820152600d60248201526c185b1c9958591e481d9bdd1959609a1b6044820152606401610e03565b6002600085815260666020526040902060090154146121505760405162461bcd60e51b81526020600482015260146024820152734e6f7420496e50726f677265737320537461746560601b6044820152606401610e03565b6040518060c00160405280868152602001858152602001846001600160a01b031681526020018381526020018281526020016121894290565b90526000868152606a602090815260409182902083518155908301516001820155908201516002820180546001600160a01b0319166001600160a01b03909216919091179055606082015160038201556080820151600482015560a0909101516005909101556121fb848484846133ff565b826001600160a01b031684867f41df84b3b467b06744e40c92613c666324e7c640ce0a41ec06efdf602d3676068560405161223891815260200190565b60405180910390a45050505050565b33612250612ded565b6001600160a01b0316146122765760405162461bcd60e51b8152600401610e03906143f7565b61227e612e0d565b6001600160a01b0316306001600160a01b0316146122ae5760405162461bcd60e51b8152600401610e039061441e565b60008281526066602052604090205482146122db5760405162461bcd60e51b8152600401610e039061449b565b6000828152606660205260409020600a015460ff161561230d5760405162461bcd60e51b8152600401610e03906144c7565b600381148061231c5750600481145b61235f5760405162461bcd60e51b8152602060048201526014602482015273496e76616c69642042616c6c6f7420537461746560601b6044820152606401610e03565b6000828152606660205260409081902060098101839055600a8101805460ff19166001179055905183907fdc921f027328d7238b58d77649ebcbd0c8b1c494c66ba53dfe53e0de65f6dd9f906123b89085815260200190565b60405180910390a2505050565b6123cd6130fb565b6001600160a01b0381166124235760405162461bcd60e51b815260206004820152601a60248201527f416464726573732073686f756c64206265206e6f6e2d7a65726f0000000000006044820152606401610e03565b606580546001600160a01b0319166001600160a01b0383169081179091556040517f278c70ced5f3e0e5eeb385b5ff9cb735748ba00a625147e66065ed48fc1562cd90600090a250565b33612476612ded565b6001600160a01b03161461249c5760405162461bcd60e51b8152600401610e03906143f7565b6124a4612e0d565b6001600160a01b0316306001600160a01b0316146124d45760405162461bcd60e51b8152600401610e039061441e565b600686146124f45760405162461bcd60e51b8152600401610e0390614443565b6001600160a01b0383166125435760405162461bcd60e51b8152602060048201526016602482015275496e76616c696420746172676574206164647265737360501b6044820152606401610e03565b61254f87878787612e28565b604080516060810182526001600160a01b038581168252602080830186815283850186815260008d8152606f845295909520845181546001600160a01b031916941693909317835551600183015592518051929391926125b59260028501920190613cd6565b50505050505050505050565b81336125cb612ded565b6001600160a01b031614806125f957506000818152606660205260409020600401546001600160a01b031633145b6126155760405162461bcd60e51b8152600401610e03906143f7565b61261d612e0d565b6001600160a01b0316306001600160a01b03161461264d5760405162461bcd60e51b8152600401610e039061441e565b600083815260666020526040902054831461267a5760405162461bcd60e51b8152600401610e039061449b565b6000838152606660205260409020600a015460ff16156126ac5760405162461bcd60e51b8152600401610e03906144c7565b6000838152606660209081526040909120835190916126d2916005840191860190613cd6565b50604051339085907ff0855c0e0ad9b8a162b87f2e4e07d4b2a3f0a45126b15ff4a78b217ad19a901a90600090a350505050565b3361270f612ded565b6001600160a01b0316146127355760405162461bcd60e51b8152600401610e03906143f7565b61273d612e0d565b6001600160a01b0316306001600160a01b03161461276d5760405162461bcd60e51b8152600401610e039061441e565b818160008211801561277f5750600081115b6127bf5760405162461bcd60e51b815260206004820152601160248201527007374617274206f7220656e64206973203607c1b6044820152606401610e03565b8181116127fd5760405162461bcd60e51b815260206004820152600c60248201526b1cdd185c9d080f8f48195b9960a21b6044820152606401610e03565b600085815260666020526040902054851461282a5760405162461bcd60e51b8152600401610e039061449b565b6000858152606660205260409020600a015460ff161561285c5760405162461bcd60e51b8152600401610e03906144c7565b60016000868152606660205260409020600901541461288d5760405162461bcd60e51b8152600401610e03906144f2565b600085815260666020526040902060018101859055600280820185905560098201556040518490869088907fd9938a514dab5cdce149a77493f694bd70c24a4833a278fd4d86fbdf859099c590600090a4505050505050565b600054610100900460ff16158080156129065750600054600160ff909116105b806129205750303b158015612920575060005460ff166001145b6129835760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610e03565b6000805460ff1916600117905580156129a6576000805461ff0019166101001790555b6129ae613567565b6129b7826123c5565b801561153e576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b6000612a0a6130e3565b6001600160a01b0316631b27e01b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611092573d6000803e3d6000fd5b33612a50612ded565b6001600160a01b031614612a765760405162461bcd60e51b8152600401610e03906143f7565b612a7e612e0d565b6001600160a01b0316306001600160a01b031614612aae5760405162461bcd60e51b8152600401610e039061441e565b612abf8b8989898989898989613596565b612adb5760405162461bcd60e51b8152600401610e0390614470565b612ae78c8c8c8c612e28565b612b616040518061014001604052806000815260200160006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b0316815260200160608152602001606081526020016060815260200160008152602001600081525090565b8c8160000181815250508881602001906001600160a01b031690816001600160a01b0316815250508781604001906001600160a01b031690816001600160a01b0316815250508681606001906001600160a01b031690816001600160a01b0316815250508581608001906001600160a01b031690816001600160a01b031681525050848160a00181905250838160c00181905250828160e00181905250818161010001818152505080606760008f81526020019081526020016000206000820151816000015560208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160020160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060608201518160030160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060808201518160040160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060a0820151816005019080519060200190612cf7929190613cd6565b5060c08201518051612d13916006840191602090910190613cd6565b5060e08201518051612d2f916007840191602090910190613cd6565b5061010082015160088201556101209091015160099091015550505050505050505050505050565b612d5f6130fb565b6001600160a01b038116612dc45760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610e03565b611368816133ad565b612dd56130fb565b6001600160a01b038116156113685761134c81613155565b60006110b67111dbdd995c9b985b98d950dbdb9d1c9858dd60721b6139f5565b60006110b66c42616c6c6f7453746f7261676560981b6139f5565b8180612e3261104b565b1115612e805760405162461bcd60e51b815260206004820152601c60248201527f556e646572206d696e2076616c7565206f6620206475726174696f6e000000006044820152606401610e03565b612e88612a00565b811115612ed75760405162461bcd60e51b815260206004820152601a60248201527f4f766572206d61782076616c7565206f66206475726174696f6e0000000000006044820152606401610e03565b600085815260666020526040902054859003612f2e5760405162461bcd60e51b8152602060048201526016602482015275105b1c9958591e48195e1a5cdd19590818985b1b1bdd60521b6044820152606401610e03565b612f9d6040518061018001604052806000815260200160008152602001600081526020016000815260200160006001600160a01b031681526020016060815260200160008152602001600081526020016000815260200160008152602001600015158152602001600081525090565b858152606081018590526001600160a01b0383166080820152600161012082015260006101408201819052610160820185905286815260666020908152604091829020835181558184015160018201559183015160028301556060830151600383015560808301516004830180546001600160a01b0319166001600160a01b0390921691909117905560a08301518051849392613041926005850192910190613cd6565b5060c0820151600682015560e0820151600782015561010082015160088201556101208201516009820155610140820151600a8201805460ff191691151591909117905561016090910151600b90910155606d546130a09060016145cc565b606d556040516001600160a01b03841690869088907fd1ba591c76ef71222e2d30b8277758713cc6eef1de29efaf98a716744ac2420b90600090a4505050505050565b60006110b669456e7653746f7261676560b01b6139f5565b6033546001600160a01b03163314611bb35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e03565b6113686130fb565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff16156131955761319083613a69565b505050565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156131ef575060408051601f3d908101601f191682019092526131ec9181019061451b565b60015b6132525760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608401610e03565b60008051602061476683398151915281146132c15760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608401610e03565b50613190838383613b05565b6000600584146132ef5760405162461bcd60e51b8152600401610e0390614443565b826133465760405162461bcd60e51b815260206004820152602160248201527f496e76616c696420656e7669726f6e6d656e74207661726961626c65206e616d6044820152606560f81b6064820152608401610e03565b60008251116133a25760405162461bcd60e51b815260206004820152602260248201527f496e76616c696420656e7669726f6e6d656e74207661726961626c652076616c604482015261756560f01b6064820152608401610e03565b5060015b9392505050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600182148061340e5750600282145b61344d5760405162461bcd60e51b815260206004820152601060248201526f24b73b30b634b2103232b1b4b9b4b7b760811b6044820152606401610e03565b600084815260666020526040902054841461347a5760405162461bcd60e51b8152600401610e039061449b565b6000848152606b602090815260408083206001600160a01b038716845290915290205460ff16156134dd5760405162461bcd60e51b815260206004820152600d60248201526c185b1c9958591e481d9bdd1959609a1b6044820152606401610e03565b6000848152606660209081526040808320606b83528184206001600160a01b0388168552909252909120805460ff191660019081179091556006820154613523916145cc565b60068201556001830361354a5781816007015461354091906145cc565b6007820155613560565b81816008015461355a91906145cc565b60088201555b5050505050565b600054610100900460ff1661358e5760405162461bcd60e51b8152600401610e03906145f2565b611bb3613b30565b600060018a101580156135aa575060038a11155b6135c65760405162461bcd60e51b8152600401610e0390614443565b60028a03613785576001600160a01b0389166135f45760405162461bcd60e51b8152600401610e039061463d565b6001600160a01b0388161561361b5760405162461bcd60e51b8152600401610e0390614674565b6001600160a01b038716156136425760405162461bcd60e51b8152600401610e03906146ab565b6001600160a01b038616156136695760405162461bcd60e51b8152600401610e03906146e2565b8451156136b05760405162461bcd60e51b8152602060048201526015602482015274496e76616c6964206e6577206e6f6465206e616d6560581b6044820152606401610e03565b8351156136f55760405162461bcd60e51b8152602060048201526013602482015272125b9d985b1a59081b995dc81b9bd919481a59606a1b6044820152606401610e03565b82511561373a5760405162461bcd60e51b81526020600482015260136024820152720496e76616c6964206e6577206e6f646520495606c1b6044820152606401610e03565b81156137805760405162461bcd60e51b8152602060048201526015602482015274125b9d985b1a59081b995dc81b9bd91948141bdc9d605a1b6044820152606401610e03565b6139e5565b60008551116137ce5760405162461bcd60e51b8152602060048201526015602482015274496e76616c6964206e6577206e6f6465206e616d6560581b6044820152606401610e03565b83516040146138155760405162461bcd60e51b8152602060048201526013602482015272125b9d985b1a59081b995dc81b9bd919481a59606a1b6044820152606401610e03565b600083511161385c5760405162461bcd60e51b81526020600482015260136024820152720496e76616c6964206e6577206e6f646520495606c1b6044820152606401610e03565b600082116138a45760405162461bcd60e51b8152602060048201526015602482015274125b9d985b1a59081b995dc81b9bd91948141bdc9d605a1b6044820152606401610e03565b60018a03613945576001600160a01b038916156138d35760405162461bcd60e51b8152600401610e039061463d565b6001600160a01b0388166138f95760405162461bcd60e51b8152600401610e0390614674565b6001600160a01b03871661391f5760405162461bcd60e51b8152600401610e03906146ab565b6001600160a01b0386166137805760405162461bcd60e51b8152600401610e03906146e2565b60038a036139e5576001600160a01b0389166139735760405162461bcd60e51b8152600401610e039061463d565b6001600160a01b0388166139995760405162461bcd60e51b8152600401610e0390614674565b6001600160a01b0387166139bf5760405162461bcd60e51b8152600401610e03906146ab565b6001600160a01b0386166139e55760405162461bcd60e51b8152600401610e03906146e2565b5060019998505050505050505050565b606554604051630d2020dd60e01b8152600481018390526000916001600160a01b031690630d2020dd90602401602060405180830381865afa158015613a3f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a639190614719565b92915050565b6001600160a01b0381163b613ad65760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610e03565b60008051602061476683398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b613b0e83613b60565b600082511180613b1b5750805b1561319057613b2a8383613ba0565b50505050565b600054610100900460ff16613b575760405162461bcd60e51b8152600401610e03906145f2565b611bb3336133ad565b613b6981613a69565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606133a683836040518060600160405280602781526020016147866027913960606001600160a01b0384163b613c285760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610e03565b600080856001600160a01b031685604051613c439190614736565b600060405180830381855af49150503d8060008114613c7e576040519150601f19603f3d011682016040523d82523d6000602084013e613c83565b606091505b5091509150613c93828286613c9d565b9695505050505050565b60608315613cac5750816133a6565b825115613cbc5782518084602001fd5b8160405162461bcd60e51b8152600401610e039190614752565b828054613ce2906143bd565b90600052602060002090601f016020900481019282613d045760008555613d4a565b82601f10613d1d57805160ff1916838001178555613d4a565b82800160010185558215613d4a579182015b82811115613d4a578251825591602001919060010190613d2f565b50613d56929150613d5a565b5090565b5b80821115613d565760008155600101613d5b565b600060208284031215613d8157600080fd5b5035919050565b60005b83811015613da3578181015183820152602001613d8b565b83811115613b2a5750506000910152565b60008151808452613dcc816020860160208601613d88565b601f01601f19169290920160200192915050565b60006101608d83528c60208401528b604084015260018060a01b038b166060840152806080840152613e148184018b613db4565b60a0840199909952505060c081019590955260e085019390935261010084019190915215156101208301526101409091015295945050505050565b60018060a01b0384168152826020820152606060408201526000613e766060830184613db4565b95945050505050565b6001600160a01b038116811461136857600080fd5b8035613e9f81613e7f565b919050565b600080600080600060a08688031215613ebc57600080fd5b8535945060208601359350604086013592506060860135613edc81613e7f565b91506080860135613eec81613e7f565b809150509295509295909350565b838152826020820152606060408201526000613e766060830184613db4565b600080600060608486031215613f2e57600080fd5b505081359360208301359350604090920135919050565b600060208284031215613f5757600080fd5b81356133a681613e7f565b634e487b7160e01b600052604160045260246000fd5b600082601f830112613f8957600080fd5b813567ffffffffffffffff80821115613fa457613fa4613f62565b604051601f8301601f19908116603f01168101908282118183101715613fcc57613fcc613f62565b81604052838152866020858801011115613fe557600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600080600060e0888a03121561402057600080fd5b873596506020880135955060408801359450606088013561404081613e7f565b93506080880135925060a0880135915060c088013567ffffffffffffffff81111561406a57600080fd5b6140768a828b01613f78565b91505092959891949750929550565b6000806040838503121561409857600080fd5b82356140a381613e7f565b9150602083013567ffffffffffffffff8111156140bf57600080fd5b6140cb85828601613f78565b9150509250929050565b600080604083850312156140e857600080fd5b50508035926020909101359150565b6001600160a01b038a8116825289811660208301528881166040830152871660608201526101206080820181905260009061413483820189613db4565b905082810360a08401526141488188613db4565b905082810360c084015261415c8187613db4565b60e084019590955250506101000152979650505050505050565b600080600080600060a0868803121561418e57600080fd5b853594506020860135935060408601356141a781613e7f565b94979396509394606081013594506080013592915050565b600080600080600080600060e0888a0312156141da57600080fd5b87359650602088013595506040880135945060608801356141fa81613e7f565b9350608088013561420a81613e7f565b925060a0880135915060c088013567ffffffffffffffff81111561406a57600080fd5b6000806040838503121561424057600080fd5b82359150602083013567ffffffffffffffff8111156140bf57600080fd5b6000806000806000806000806000806000806101808d8f03121561428157600080fd5b8c359b5060208d01359a5060408d0135995061429f60608e01613e94565b98506142ad60808e01613e94565b97506142bb60a08e01613e94565b96506142c960c08e01613e94565b95506142d760e08e01613e94565b945067ffffffffffffffff6101008e013511156142f357600080fd5b6143048e6101008f01358f01613f78565b935067ffffffffffffffff6101208e0135111561432057600080fd5b6143318e6101208f01358f01613f78565b925067ffffffffffffffff6101408e0135111561434d57600080fd5b61435e8e6101408f01358f01613f78565b91506101608d013590509295989b509295989b509295989b565b6000806040838503121561438b57600080fd5b823566ffffffffffffff811681146143a257600080fd5b915060208301356143b281613e7f565b809150509250929050565b600181811c908216806143d157607f821691505b6020821081036143f157634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252600d908201526c2737902832b936b4b9b9b4b7b760991b604082015260600190565b6020808252600b908201526a125cc8111a5cd8589b195960aa1b604082015260600190565b602080825260139082015272496e76616c69642042616c6c6f74205479706560681b604082015260600190565b60208082526011908201527024b73b30b634b2102830b930b6b2ba32b960791b604082015260600190565b6020808252601290820152711b9bdd08195e1a5cdd19590810985b1b1bdd60721b604082015260600190565b602080825260119082015270185b1c9958591e48199a5b985b1a5e9959607a1b604082015260600190565b6020808252600f908201526e4e6f7420526561647920537461746560881b604082015260600190565b60006020828403121561452d57600080fd5b5051919050565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b600082198211156145ed57634e487b7160e01b600052601160045260246000fd5b500190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b6020808252601a908201527f496e76616c6964206f6c64207374616b65722061646472657373000000000000604082015260600190565b6020808252601a908201527f496e76616c6964206e6577207374616b65722061646472657373000000000000604082015260600190565b60208082526019908201527f496e76616c6964206e657720766f746572206164647265737300000000000000604082015260600190565b6020808252601a908201527f496e76616c6964206e6577207265776172642061646472657373000000000000604082015260600190565b60006020828403121561472b57600080fd5b81516133a681613e7f565b60008251614748818460208701613d88565b9190910192915050565b6020815260006133a66020830184613db456fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220bdd331e04af737ac7555b052790789cc127a905e71b0a9c92935780e787a3b5464736f6c634300080e0033", } // BallotStorageImpABI is the input ABI used to generate the binding from. @@ -1329,6 +1331,39 @@ func (_BallotStorageImp *BallotStorageImpCallerSession) GetBallotCount() (*big.I return _BallotStorageImp.Contract.GetBallotCount(&_BallotStorageImp.CallOpts) } +// GetBallotExecute is a free data retrieval call binding the contract method 0x060e6a99. +// +// Solidity: function getBallotExecute(uint256 _id) view returns(address, uint256, bytes) +func (_BallotStorageImp *BallotStorageImpCaller) GetBallotExecute(opts *bind.CallOpts, _id *big.Int) (common.Address, *big.Int, []byte, error) { + var out []interface{} + err := _BallotStorageImp.contract.Call(opts, &out, "getBallotExecute", _id) + + if err != nil { + return *new(common.Address), *new(*big.Int), *new([]byte), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + out1 := *abi.ConvertType(out[1], new(*big.Int)).(**big.Int) + out2 := *abi.ConvertType(out[2], new([]byte)).(*[]byte) + + return out0, out1, out2, err + +} + +// GetBallotExecute is a free data retrieval call binding the contract method 0x060e6a99. +// +// Solidity: function getBallotExecute(uint256 _id) view returns(address, uint256, bytes) +func (_BallotStorageImp *BallotStorageImpSession) GetBallotExecute(_id *big.Int) (common.Address, *big.Int, []byte, error) { + return _BallotStorageImp.Contract.GetBallotExecute(&_BallotStorageImp.CallOpts, _id) +} + +// GetBallotExecute is a free data retrieval call binding the contract method 0x060e6a99. +// +// Solidity: function getBallotExecute(uint256 _id) view returns(address, uint256, bytes) +func (_BallotStorageImp *BallotStorageImpCallerSession) GetBallotExecute(_id *big.Int) (common.Address, *big.Int, []byte, error) { + return _BallotStorageImp.Contract.GetBallotExecute(&_BallotStorageImp.CallOpts, _id) +} + // GetBallotForExit is a free data retrieval call binding the contract method 0x8c7be692. // // Solidity: function getBallotForExit(uint256 _id) view returns(uint256 unlockAmount, uint256 slashing) @@ -2040,6 +2075,27 @@ func (_BallotStorageImp *BallotStorageImpTransactorSession) CreateBallotForAddre return _BallotStorageImp.Contract.CreateBallotForAddress(&_BallotStorageImp.TransactOpts, _id, _ballotType, _duration, _creator, _newGovernanceAddress) } +// CreateBallotForExecute is a paid mutator transaction binding the contract method 0xaea83e40. +// +// Solidity: function createBallotForExecute(uint256 _id, uint256 _ballotType, uint256 _duration, address _creator, address _target, uint256 _value, bytes _calldata) returns() +func (_BallotStorageImp *BallotStorageImpTransactor) CreateBallotForExecute(opts *bind.TransactOpts, _id *big.Int, _ballotType *big.Int, _duration *big.Int, _creator common.Address, _target common.Address, _value *big.Int, _calldata []byte) (*types.Transaction, error) { + return _BallotStorageImp.contract.Transact(opts, "createBallotForExecute", _id, _ballotType, _duration, _creator, _target, _value, _calldata) +} + +// CreateBallotForExecute is a paid mutator transaction binding the contract method 0xaea83e40. +// +// Solidity: function createBallotForExecute(uint256 _id, uint256 _ballotType, uint256 _duration, address _creator, address _target, uint256 _value, bytes _calldata) returns() +func (_BallotStorageImp *BallotStorageImpSession) CreateBallotForExecute(_id *big.Int, _ballotType *big.Int, _duration *big.Int, _creator common.Address, _target common.Address, _value *big.Int, _calldata []byte) (*types.Transaction, error) { + return _BallotStorageImp.Contract.CreateBallotForExecute(&_BallotStorageImp.TransactOpts, _id, _ballotType, _duration, _creator, _target, _value, _calldata) +} + +// CreateBallotForExecute is a paid mutator transaction binding the contract method 0xaea83e40. +// +// Solidity: function createBallotForExecute(uint256 _id, uint256 _ballotType, uint256 _duration, address _creator, address _target, uint256 _value, bytes _calldata) returns() +func (_BallotStorageImp *BallotStorageImpTransactorSession) CreateBallotForExecute(_id *big.Int, _ballotType *big.Int, _duration *big.Int, _creator common.Address, _target common.Address, _value *big.Int, _calldata []byte) (*types.Transaction, error) { + return _BallotStorageImp.Contract.CreateBallotForExecute(&_BallotStorageImp.TransactOpts, _id, _ballotType, _duration, _creator, _target, _value, _calldata) +} + // CreateBallotForExit is a paid mutator transaction binding the contract method 0x22640859. // // Solidity: function createBallotForExit(uint256 _id, uint256 _unlockAmount, uint256 _slashing) returns() diff --git a/wemix/bind/gen_envStorage_abi.go b/wemix/bind/gen_envStorage_abi.go index ffe5665b1e2d..fec3f5226216 100644 --- a/wemix/bind/gen_envStorage_abi.go +++ b/wemix/bind/gen_envStorage_abi.go @@ -34,7 +34,7 @@ var EnvStorageMetaData = &bind.MetaData{ Sigs: map[string]string{ "5c60da1b": "implementation()", }, - Bin: "0x608060405234801561001057600080fd5b5060405161077238038061077283398101604081905261002f91610326565b604080516020810190915260008152819061006b60017f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbd61034f565b60008051602061072b8339815191521461008757610087610374565b6100938282600061009b565b505050610405565b6100a4836100d1565b6000825111806100b15750805b156100cc576100ca838361011160201b61008b1760201c565b505b505050565b6100da8161013d565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6060610136838360405180606001604052806027815260200161074b602791396101fd565b9392505050565b610150816102db60201b6100b71760201c565b6101b75760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084015b60405180910390fd5b806101dc60008051602061072b83398151915260001b6102ea60201b6100c61760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b60606001600160a01b0384163b6102655760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b60648201526084016101ae565b600080856001600160a01b03168560405161028091906103b6565b600060405180830381855af49150503d80600081146102bb576040519150601f19603f3d011682016040523d82523d6000602084013e6102c0565b606091505b5090925090506102d18282866102ed565b9695505050505050565b6001600160a01b03163b151590565b90565b606083156102fc575081610136565b82511561030c5782518084602001fd5b8160405162461bcd60e51b81526004016101ae91906103d2565b60006020828403121561033857600080fd5b81516001600160a01b038116811461013657600080fd5b60008282101561036f57634e487b7160e01b600052601160045260246000fd5b500390565b634e487b7160e01b600052600160045260246000fd5b60005b838110156103a557818101518382015260200161038d565b838111156100ca5750506000910152565b600082516103c881846020870161038a565b9190910192915050565b60208152600082518060208401526103f181604085016020870161038a565b601f01601f19169190910160400192915050565b610317806104146000396000f3fe6080604052600436106100225760003560e01c80635c60da1b1461003957610031565b366100315761002f61006a565b005b61002f61006a565b34801561004557600080fd5b5061004e61007c565b6040516001600160a01b03909116815260200160405180910390f35b61007a6100756100c9565b6100fc565b565b60006100866100c9565b905090565b60606100b083836040518060600160405280602781526020016102bb60279139610120565b9392505050565b6001600160a01b03163b151590565b90565b60006100867f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b3660008037600080366000845af43d6000803e80801561011b573d6000f35b3d6000fd5b60606001600160a01b0384163b61018d5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b60648201526084015b60405180910390fd5b600080856001600160a01b0316856040516101a8919061026b565b600060405180830381855af49150503d80600081146101e3576040519150601f19603f3d011682016040523d82523d6000602084013e6101e8565b606091505b50915091506101f8828286610202565b9695505050505050565b606083156102115750816100b0565b8251156102215782518084602001fd5b8160405162461bcd60e51b81526004016101849190610287565b60005b8381101561025657818101518382015260200161023e565b83811115610265576000848401525b50505050565b6000825161027d81846020870161023b565b9190910192915050565b60208152600082518060208401526102a681604085016020870161023b565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122073a93b04f755a8d9dc8a21cd7ced80e99dae623e3f5317cf75e12209357071a664736f6c634300080e0033360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564", + Bin: "0x608060405234801561001057600080fd5b5060405161077238038061077283398101604081905261002f91610326565b604080516020810190915260008152819061006b60017f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbd61034f565b60008051602061072b8339815191521461008757610087610374565b6100938282600061009b565b505050610405565b6100a4836100d1565b6000825111806100b15750805b156100cc576100ca838361011160201b61008b1760201c565b505b505050565b6100da8161013d565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6060610136838360405180606001604052806027815260200161074b602791396101fd565b9392505050565b610150816102db60201b6100b71760201c565b6101b75760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084015b60405180910390fd5b806101dc60008051602061072b83398151915260001b6102ea60201b6100c61760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b60606001600160a01b0384163b6102655760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b60648201526084016101ae565b600080856001600160a01b03168560405161028091906103b6565b600060405180830381855af49150503d80600081146102bb576040519150601f19603f3d011682016040523d82523d6000602084013e6102c0565b606091505b5090925090506102d18282866102ed565b9695505050505050565b6001600160a01b03163b151590565b90565b606083156102fc575081610136565b82511561030c5782518084602001fd5b8160405162461bcd60e51b81526004016101ae91906103d2565b60006020828403121561033857600080fd5b81516001600160a01b038116811461013657600080fd5b60008282101561036f57634e487b7160e01b600052601160045260246000fd5b500390565b634e487b7160e01b600052600160045260246000fd5b60005b838110156103a557818101518382015260200161038d565b838111156100ca5750506000910152565b600082516103c881846020870161038a565b9190910192915050565b60208152600082518060208401526103f181604085016020870161038a565b601f01601f19169190910160400192915050565b610317806104146000396000f3fe6080604052600436106100225760003560e01c80635c60da1b1461003957610031565b366100315761002f61006a565b005b61002f61006a565b34801561004557600080fd5b5061004e61007c565b6040516001600160a01b03909116815260200160405180910390f35b61007a6100756100c9565b6100fc565b565b60006100866100c9565b905090565b60606100b083836040518060600160405280602781526020016102bb60279139610120565b9392505050565b6001600160a01b03163b151590565b90565b60006100867f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b3660008037600080366000845af43d6000803e80801561011b573d6000f35b3d6000fd5b60606001600160a01b0384163b61018d5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b60648201526084015b60405180910390fd5b600080856001600160a01b0316856040516101a8919061026b565b600060405180830381855af49150503d80600081146101e3576040519150601f19603f3d011682016040523d82523d6000602084013e6101e8565b606091505b50915091506101f8828286610202565b9695505050505050565b606083156102115750816100b0565b8251156102215782518084602001fd5b8160405162461bcd60e51b81526004016101849190610287565b60005b8381101561025657818101518382015260200161023e565b83811115610265576000848401525b50505050565b6000825161027d81846020870161023b565b9190910192915050565b60208152600082518060208401526102a681604085016020870161023b565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220a2e4a7da24e6caa52010e79ace6779756ddf3accdb5c5b50a65061413916382164736f6c634300080e0033360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564", } // EnvStorageABI is the input ABI used to generate the binding from. @@ -799,7 +799,7 @@ var EnvStorageImpMetaData = &bind.MetaData{ "3659cfe6": "upgradeTo(address)", "4f1ef286": "upgradeToAndCall(address,bytes)", }, - Bin: "0x60a0604052306080523480156200001557600080fd5b506200002062000026565b620000e8565b603854610100900460ff1615620000935760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60385460ff9081161015620000e6576038805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b60805161366f6200011260003960008181611a1e01528181611aa30152611b7b015261366f6000f3fe6080604052600436106104e05760003560e01c80636fde207a11610281578063a6ed563e1161015a578063c42a0abc116100cc578063e078869f11610085578063e078869f146113d0578063ec3df879146113f0578063f2fde38b14611410578063f38ecf4714611430578063f6fd712914611452578063f82145911461147257600080fd5b8063c42a0abc146112a7578063c6713baf146112db578063c7d3da341461130f578063c95437be14611343578063cdb9f6431461138e578063dc97d962146113a357600080fd5b8063b4d6bd3b1161011e578063b4d6bd3b146111d6578063bd02d0f5146111f6578063be33732a14611223578063c00ace6c14611243578063c031a18014611265578063c0b4fe151461128557600080fd5b8063a6ed563e1461111b578063a91ee0dc14611148578063a9b629b214611168578063aba01fee1461118a578063b128f880146111b457600080fd5b80638c8b887e116101f35780639801bff9116101b75780639801bff914611036578063986e791a146110565780639986e4b914611083578063a36f259b146110a7578063a5d6a581146110c7578063a6868b7d146110e757600080fd5b80638c8b887e14610ee45780638d5cdd7e14610f045780638da5cb5b14610f245780638f6fe72514610f42578063918f86741461102057600080fd5b8063738fdd1a11610245578063738fdd1a14610e0f57806379e8585914610e2f5780637b2bfb0114610e4f5780637bf4653014610e83578063852cf38f14610ea457806388c2801914610ec457600080fd5b80636fde207a14610d4d5780636fe1317714610d6f578063715018a614610d8f57806371c6960d14610da4578063737c59b814610dc457600080fd5b80633659cfe6116103be5780634bd1ed76116103305780635dba8c4a116102e95780635dba8c4a14610b985780636167eb4514610be3578063656e305214610c1757806367d1a2e014610c4b5780636c78d2cf14610d025780636d583ca714610d2b57600080fd5b80634bd1ed7614610ad65780634d273e2814610af85780634f1ef28614610b2c57806352d1902d14610b3f578063539927be14610b545780635a731cca14610b7457600080fd5b80633e8daafe116103825780633e8daafe14610a005780633f35c8fe14610a20578063408d79cf14610a4257806344b8991414610a6257806345b5ec2914610a825780634694641614610aa257600080fd5b80633659cfe6146109135780633690057a14610933578063382944191461097e5780633848207a146109a05780633d4c65f3146109e057600080fd5b8063238737b6116104575780632ed19cd51161041b5780632ed19cd5146107fc5780632f40992e1461081c5780633305508e1461083d57806333be496e1461085d57806333e31184146108a857806334125c84146108f357600080fd5b8063238737b614610709578063278bb12a1461073d5780632b2eaa92146107715780632eb57c65146107bc5780632eccd832146107dc57600080fd5b80630fca11d2116104a95780630fca11d2146105c7578063124cea37146105e7578063185582f1146106075780631b27e01b146106525780631e0cba0d1461069d57806321f8a721146106bb57600080fd5b806215a73b146104e5578063076cd77f1461051a5780630add66dd146105655780630b90a39a146105875780630fc238bf146105a7575b600080fd5b3480156104f157600080fd5b5061050760008051602061351383398151915281565b6040519081526020015b60405180910390f35b34801561052657600080fd5b5060008051602061357383398151915260005260026020527fd7a437163435b79030132855d9146a10e26570f1767311219983e0c430cfa69054610507565b34801561057157600080fd5b50610585610580366004612f22565b611497565b005b34801561059357600080fd5b506105856105a236600461300b565b6115ed565b3480156105b357600080fd5b506105856105c236600461300b565b61162d565b3480156105d357600080fd5b506105856105e2366004612f22565b61166a565b3480156105f357600080fd5b5061058561060236600461300b565b61172f565b34801561061357600080fd5b506000805160206134d383398151915260005260026020527fbc779bbce8d4fef90926dc39b56d9135e8e3795964b3adae769767961d4a94d854610507565b34801561065e57600080fd5b5060008051602061351383398151915260005260026020527f5a1993193b8890c75d83157b2c2c12b144545357ab60021d7429856434de051b54610507565b3480156106a957600080fd5b50610507665374616b696e6760c81b81565b3480156106c757600080fd5b506106f16106d6366004613048565b6000908152600460205260409020546001600160a01b031690565b6040516001600160a01b039091168152602001610511565b34801561071557600080fd5b506105077f1d36f8ce53f59e624857e1d8dc7932d19981a2ea1b8faa4eb8ff843fc3e5a27881565b34801561074957600080fd5b506105077f9b2e0c7fdae148f225bae7deb92d7e7bd24bb77edb12956e8fa7204900dd8a2281565b34801561077d57600080fd5b5060008051602061355383398151915260005260026020527f270fb31b28afd06ad35288bc3cb901686a4c5a15239e966fd9b64269abd226c354610507565b3480156107c857600080fd5b506105856107d7366004613048565b61176c565b3480156107e857600080fd5b506105856107f736600461300b565b6117b3565b34801561080857600080fd5b50610585610817366004613048565b6117f0565b34801561082857600080fd5b506105076914995dd85c99141bdbdb60b21b81565b34801561084957600080fd5b50610585610858366004613048565b611837565b34801561086957600080fd5b506000805160206135fa83398151915260005260026020527f8e8c0bef3b4557d74ba01e0433728c574990153e35cacae69cb26f23a8a4017554610507565b3480156108b457600080fd5b506000805160206134f383398151915260005260026020527ff3497fe1496bfc19eaef6d253f75ec2e9cfe1b4f6080c29192641567c6fc5d8754610507565b3480156108ff57600080fd5b506105076845636f73797374656d60b81b81565b34801561091f57600080fd5b5061058561092e366004613076565b61187e565b34801561093f57600080fd5b506000805160206135da83398151915260005260026020527f14e650c949c7cc3fca2efe79b3711fc734b4df488cc27c4137f35bd0adaae7fa54610507565b34801561098a57600080fd5b5061050760008051602061355383398151915281565b3480156109ac57600080fd5b506109d06109bb366004613048565b60009081526020819052604090205460ff1690565b6040519015158152602001610511565b3480156109ec57600080fd5b506105856109fb36600461300b565b6118d8565b348015610a0c57600080fd5b50610585610a1b36600461300b565b611915565b348015610a2c57600080fd5b506105076000805160206135da83398151915281565b348015610a4e57600080fd5b50610585610a5d36600461300b565b611952565b348015610a6e57600080fd5b50610585610a7d36600461300b565b61198f565b348015610a8e57600080fd5b50610585610a9d36600461300b565b6119cc565b348015610aae57600080fd5b506105077fdd5a41a7fc01f5c6d30816b17f638d6531625f1e1eaa599673ab2f6079f2dd9d81565b348015610ae257600080fd5b506105076a4d61696e74656e616e636560a81b81565b348015610b0457600080fd5b506105077f77884798208df1e64f70968be41ef2d3211ec53613397ca59313416813df088881565b610585610b3a366004613093565b611a14565b348015610b4b57600080fd5b50610507611b6e565b348015610b6057600080fd5b50610585610b6f366004613172565b611c21565b348015610b8057600080fd5b506105076c14dd185ada5b99d4995dd85c99609a1b81565b348015610ba457600080fd5b5060008051602061353383398151915260005260026020527f38eb620cc1355554391bc9d0c224a726d66edf7c3eb2d67af166d6e81fe4456254610507565b348015610bef57600080fd5b506105077f9f1de481f899d76889aa8a2b44cc7b604d42691aa93d4ba618a1a1fd439f505081565b348015610c2357600080fd5b506105077fe10074dceffb75f13bf0ce50145afd35182d63796823f1280ce40e01c19109e781565b348015610c5757600080fd5b5060026020527fc77500645c8acbf6137a0e04460f85359483e3b08db30285cca2957db0c90904547fca55256fa8d248a334a7cb4ca72d9aec97700e81b3784b43c388b9a8d0e2b8e3547f77884798208df1e64f70968be41ef2d3211ec53613397ca59313416813df08886000527fba5524e01c8da4a46e6f70a8f29f4dc63d299ad01d2f01ccae9666cb85f6f7c05460408051938452602084019290925290820152606001610511565b348015610d0e57600080fd5b506105077111dbdd995c9b985b98d950dbdb9d1c9858dd60721b81565b348015610d3757600080fd5b506105076000805160206135fa83398151915281565b348015610d5957600080fd5b5061050760008051602061357383398151915281565b348015610d7b57600080fd5b50610585610d8a366004613048565b611eca565b348015610d9b57600080fd5b50610585611f11565b348015610db057600080fd5b50610585610dbf36600461300b565b611f25565b348015610dd057600080fd5b506000805160206134b383398151915260005260026020527f673c817b54d53459fa437d6b11ba6445e517d8dc789e6b815675ff10e6aeeb5d54610507565b348015610e1b57600080fd5b50609d546106f1906001600160a01b031681565b348015610e3b57600080fd5b50610585610e4a366004613048565b611f62565b348015610e5b57600080fd5b506105077f9346226931826838eedd13d9677fa33551e7c81f604b171ef3fac355458da9aa81565b348015610e8f57600080fd5b5061050769456e7653746f7261676560b01b81565b348015610eb057600080fd5b50610585610ebf366004613048565b611fa9565b348015610ed057600080fd5b50610585610edf36600461323f565b611ff0565b348015610ef057600080fd5b50610585610eff36600461300b565b612164565b348015610f1057600080fd5b50610585610f1f366004613270565b6121ba565b348015610f3057600080fd5b50606b546001600160a01b03166106f1565b348015610f4e57600080fd5b5060026020527fe6679752544e0074a1c9bec26775117fd40d133ce43cc443fb5f2512ebd7c2af547f89fc1b873e9ef0767cf41719c69200c3f894c43d73c49eb537ca60ec0a2d14bc547fa04c555f883d07b5c5fe85061c632b6bfec696b67afa8ad5e9773b89249984b2547fdd5a41a7fc01f5c6d30816b17f638d6531625f1e1eaa599673ab2f6079f2dd9d6000527f286a480438fb7eb9f5465ec436e6de865b71284ceb2be7ff1cea98f38c26308254604080519485526020850193909352918301526060820152608001610511565b34801561102c57600080fd5b5061050761271081565b34801561104257600080fd5b506109d061105136600461323f565b61228f565b34801561106257600080fd5b50611076611071366004613048565b6123ee565b60405161051191906132ea565b34801561108f57600080fd5b506105076c42616c6c6f7453746f7261676560981b81565b3480156110b357600080fd5b506105856110c2366004613048565b612490565b3480156110d357600080fd5b506105856110e236600461300b565b6124d7565b3480156110f357600080fd5b506105077f6c6f69f426081752a5d3e73746599acd2a4cb145d5de4203ca1e3473b281680b81565b34801561112757600080fd5b50610507611136366004613048565b60009081526006602052604090205490565b34801561115457600080fd5b50610585611163366004613076565b612514565b34801561117457600080fd5b5061050760008051602061353383398151915281565b34801561119657600080fd5b5061119f6125bc565b60408051928352602083019190915201610511565b3480156111c057600080fd5b506105076000805160206134d383398151915281565b3480156111e257600080fd5b506105856111f1366004613270565b612626565b34801561120257600080fd5b50610507611211366004613048565b60009081526002602052604090205490565b34801561122f57600080fd5b5061058561123e36600461300b565b6126fd565b34801561124f57600080fd5b506105076000805160206134b383398151915281565b34801561127157600080fd5b50611076611280366004613048565b61274c565b34801561129157600080fd5b506105076000805160206134f383398151915281565b3480156112b357600080fd5b506105077fb38b2c133e931937bd95337c65c8aefa7040ed64bbed732e3e29a4944c65747381565b3480156112e757600080fd5b506105077fc9e15e34073efbcd0328740feaf503caac9124b55b38c73d1a97b53da80a2f6081565b34801561131b57600080fd5b506105077f04f7b94450bbcad85f37ea47cd1062728f884bb2040e357738f8fd53056134bc81565b34801561134f57600080fd5b5060008051602061361a83398151915260005260026020527f38ddebd16170f2328156b72e009b30efe6e74a1b9fc4389d05f50efa2a42c6f854610507565b34801561139a57600080fd5b5061119f612769565b3480156113af57600080fd5b506105076113be366004613048565b60009081526001602052604090205490565b3480156113dc57600080fd5b506105856113eb36600461300b565b6127cf565b3480156113fc57600080fd5b5061058561140b366004613048565b612812565b34801561141c57600080fd5b5061058561142b366004613076565b612859565b34801561143c57600080fd5b5061050760008051602061361a83398151915281565b34801561145e57600080fd5b5061058561146d366004613048565b6128cf565b34801561147e57600080fd5b5061058561148d366004613048565b612916565b905090565b336114a061295d565b6001600160a01b0316146114cf5760405162461bcd60e51b81526004016114c6906132fd565b60405180910390fd5b61271081836114de868861333a565b6114e8919061333a565b6114f2919061333a565b1461153f5760405162461bcd60e51b815260206004820152601e60248201527f57726f6e6720726577617264206469737472756274696f6e20726174696f000060448201526064016114c6565b6115697fc9e15e34073efbcd0328740feaf503caac9124b55b38c73d1a97b53da80a2f608561297d565b6115937f9f1de481f899d76889aa8a2b44cc7b604d42691aa93d4ba618a1a1fd439f50508461297d565b6115bd7f9346226931826838eedd13d9677fa33551e7c81f604b171ef3fac355458da9aa8361297d565b6115e77fdd5a41a7fc01f5c6d30816b17f638d6531625f1e1eaa599673ab2f6079f2dd9d8261297d565b50505050565b336115f661295d565b6001600160a01b03161461161c5760405162461bcd60e51b81526004016114c6906132fd565b61162a61146d826020015190565b50565b3361163661295d565b6001600160a01b03161461165c5760405162461bcd60e51b81526004016114c6906132fd565b61162a61140b826020015190565b3361167361295d565b6001600160a01b0316146116995760405162461bcd60e51b81526004016114c6906132fd565b6116c37f1d36f8ce53f59e624857e1d8dc7932d19981a2ea1b8faa4eb8ff843fc3e5a2788561297d565b6116ed7fb38b2c133e931937bd95337c65c8aefa7040ed64bbed732e3e29a4944c6574738461297d565b6117177f77884798208df1e64f70968be41ef2d3211ec53613397ca59313416813df08888361297d565b6115e760008051602061361a8339815191528261297d565b3361173861295d565b6001600160a01b03161461175e5760405162461bcd60e51b81526004016114c6906132fd565b61162a6110c2826020015190565b3361177561295d565b6001600160a01b03161461179b5760405162461bcd60e51b81526004016114c6906132fd565b61162a6000805160206135738339815191528261297d565b336117bc61295d565b6001600160a01b0316146117e25760405162461bcd60e51b81526004016114c6906132fd565b61162a61148d826020015190565b336117f961295d565b6001600160a01b03161461181f5760405162461bcd60e51b81526004016114c6906132fd565b61162a6000805160206135338339815191528261297d565b3361184061295d565b6001600160a01b0316146118665760405162461bcd60e51b81526004016114c6906132fd565b61162a6000805160206134f38339815191528261297d565b6118866129cc565b6118a181604051806020016040528060008152506000612a26565b6040516001600160a01b038216907f2a74bbaf99cf25202925743012bb137262ab3432c821e1ba94ddbecac2ea970890600090a250565b336118e161295d565b6001600160a01b0316146119075760405162461bcd60e51b81526004016114c6906132fd565b61162a610817826020015190565b3361191e61295d565b6001600160a01b0316146119445760405162461bcd60e51b81526004016114c6906132fd565b61162a610e4a826020015190565b3361195b61295d565b6001600160a01b0316146119815760405162461bcd60e51b81526004016114c6906132fd565b61162a610d8a826020015190565b3361199861295d565b6001600160a01b0316146119be5760405162461bcd60e51b81526004016114c6906132fd565b61162a610858826020015190565b336119d561295d565b6001600160a01b0316146119fb5760405162461bcd60e51b81526004016114c6906132fd565b60208101516040820151611a0f8282612626565b505050565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003611aa15760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b19195b1959d85d1958d85b1b60a21b60648201526084016114c6565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611aea600080516020613593833981519152546001600160a01b031690565b6001600160a01b031614611b555760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b6163746976652070726f787960a01b60648201526084016114c6565b611b5e82612b91565b611b6a82826001612a26565b5050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611c0e5760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c000000000000000060648201526084016114c6565b5060008051602061359383398151915290565b603854610100900460ff1615808015611c415750603854600160ff909116105b80611c5b5750303b158015611c5b575060385460ff166001145b611cbe5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016114c6565b6038805460ff191660011790558015611ce1576038805461ff0019166101001790555b600080516020613593833981519152546001600160a01b03166001600160a01b0316846001600160a01b031603611d705760405162461bcd60e51b815260206004820152602d60248201527f72656769737472792073686f756c64206e6f742062652073616d65206173206960448201526c36b83632b6b2b73a30ba34b7b760991b60648201526084016114c6565b611d78612bc0565b611d8184612514565b60005b8251811015611e7e576000611dbe858381518110611da457611da4613352565b602002602001015160009081526002602052604090205490565b9050838281518110611dd257611dd2613352565b60200260200101516000141580611de857508015155b611e275760405162461bcd60e51b815260206004820152601060248201526f696e76616c6964207661726961626c6560801b60448201526064016114c6565b80600003611e6b57611e6b858381518110611e4457611e44613352565b6020026020010151858481518110611e5e57611e5e613352565b602002602001015161297d565b5080611e7681613368565b915050611d84565b5080156115e7576038805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050565b33611ed361295d565b6001600160a01b031614611ef95760405162461bcd60e51b81526004016114c6906132fd565b61162a60008051602061361a8339815191528261297d565b611f196129cc565b611f236000612bef565b565b33611f2e61295d565b6001600160a01b031614611f545760405162461bcd60e51b81526004016114c6906132fd565b61162a6107d7826020015190565b33611f6b61295d565b6001600160a01b031614611f915760405162461bcd60e51b81526004016114c6906132fd565b61162a6000805160206135da8339815191528261297d565b33611fb261295d565b6001600160a01b031614611fd85760405162461bcd60e51b81526004016114c6906132fd565b61162a6000805160206135138339815191528261297d565b6000805160206135da833981519152820361200e57611b6a81611915565b7fe10074dceffb75f13bf0ce50145afd35182d63796823f1280ce40e01c19109e7820361203e57611b6a816119cc565b7f6c6f69f426081752a5d3e73746599acd2a4cb145d5de4203ca1e3473b281680b820361206e57611b6a816127cf565b6000805160206134d3833981519152820361208c57611b6a816115ed565b6000805160206134f383398151915282036120aa57611b6a8161198f565b60008051602061353383398151915282036120c857611b6a816118d8565b60008051602061355383398151915282036120e657611b6a8161162d565b7f9b2e0c7fdae148f225bae7deb92d7e7bd24bb77edb12956e8fa7204900dd8a22820361211657611b6a81612164565b7f04f7b94450bbcad85f37ea47cd1062728f884bb2040e357738f8fd53056134bc820361214657611b6a816126fd565b60008051602061361a8339815191528203611b6a57611b6a81611952565b3361216d61295d565b6001600160a01b0316146121935760405162461bcd60e51b81526004016114c6906132fd565b60208101516040820151606083015160808401516121b384848484611497565b5050505050565b336121c361295d565b6001600160a01b0316146121e95760405162461bcd60e51b81526004016114c6906132fd565b8082111561225f5760405162461bcd60e51b815260206004820152603e60248201527f4d696e696d756d207374616b696e67206d75737420626520736d616c6c65722060448201527f616e6420657175616c207468616e206d6178696d756d207374616b696e67000060648201526084016114c6565b6122776000805160206135738339815191528361297d565b611b6a6000805160206134b38339815191528261297d565b60007f9b2e0c7fdae148f225bae7deb92d7e7bd24bb77edb12956e8fa7204900dd8a22830361231a57600080600080858060200190518101906122d29190613381565b9350935093509350612710818385876122eb919061333a565b6122f5919061333a565b6122ff919061333a565b146123115760009450505050506123e8565b505050506123e4565b7f6c6f69f426081752a5d3e73746599acd2a4cb145d5de4203ca1e3473b281680b83148061236757507fe10074dceffb75f13bf0ce50145afd35182d63796823f1280ce40e01c19109e783145b156123a1576000808380602001905181019061238391906133b7565b915091508082111561239a576000925050506123e8565b50506123e4565b6000805160206134f383398151915283036123e4576000828060200190518101906123cc91906133db565b90506103e88110156123e25760009150506123e8565b505b5060015b92915050565b600081815260036020526040902080546060919061240b906133f4565b80601f0160208091040260200160405190810160405280929190818152602001828054612437906133f4565b80156124845780601f1061245957610100808354040283529160200191612484565b820191906000526020600020905b81548152906001019060200180831161246757829003601f168201915b50505050509050919050565b3361249961295d565b6001600160a01b0316146124bf5760405162461bcd60e51b81526004016114c6906132fd565b61162a6000805160206135fa8339815191528261297d565b336124e061295d565b6001600160a01b0316146125065760405162461bcd60e51b81526004016114c6906132fd565b61162a610ebf826020015190565b61251c6129cc565b6001600160a01b0381166125725760405162461bcd60e51b815260206004820152601a60248201527f416464726573732073686f756c64206265206e6f6e2d7a65726f00000000000060448201526064016114c6565b609d80546001600160a01b0319166001600160a01b0383169081179091556040517f278c70ced5f3e0e5eeb385b5ff9cb735748ba00a625147e66065ed48fc1562cd90600090a250565b60026020527fd7a437163435b79030132855d9146a10e26570f1767311219983e0c430cfa690546000805160206134b383398151915260009081527f673c817b54d53459fa437d6b11ba6445e517d8dc789e6b815675ff10e6aeeb5d54909182915b915091509091565b3361262f61295d565b6001600160a01b0316146126555760405162461bcd60e51b81526004016114c6906132fd565b808211156126cd576040805162461bcd60e51b81526020600482015260248101919091527f4d696e696d756d206475726174696f6e206d75737420626520736d616c6c657260448201527f20616e6420657175616c207468616e206d6178696d756d206475726174696f6e60648201526084016114c6565b6126e56000805160206135fa8339815191528361297d565b611b6a6000805160206135138339815191528261297d565b3361270661295d565b6001600160a01b03161461272c5760405162461bcd60e51b81526004016114c6906132fd565b60208101516040820151606083015160808401516121b38484848461166a565b600081815260056020526040902080546060919061240b906133f4565b60026020527f8e8c0bef3b4557d74ba01e0433728c574990153e35cacae69cb26f23a8a401755460008051602061351383398151915260009081527f5a1993193b8890c75d83157b2c2c12b144545357ab60021d7429856434de051b549091829161261e565b336127d861295d565b6001600160a01b0316146127fe5760405162461bcd60e51b81526004016114c6906132fd565b60208101516040820151611a0f82826121ba565b3361281b61295d565b6001600160a01b0316146128415760405162461bcd60e51b81526004016114c6906132fd565b61162a6000805160206135538339815191528261297d565b6128616129cc565b6001600160a01b0381166128c65760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016114c6565b61162a81612bef565b336128d861295d565b6001600160a01b0316146128fe5760405162461bcd60e51b81526004016114c6906132fd565b61162a6000805160206134d38339815191528261297d565b3361291f61295d565b6001600160a01b0316146129455760405162461bcd60e51b81526004016114c6906132fd565b61162a6000805160206134b38339815191528261297d565b60006114927111dbdd995c9b985b98d950dbdb9d1c9858dd60721b612c41565b6000828152600260205260409020819055817f58d7c10adfd5778016889c15d422d57f2975b9292415b54fe5d8cd4241200612826040516129c091815260200190565b60405180910390a25050565b606b546001600160a01b03163314611f235760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016114c6565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615612a5957611a0f83612caf565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015612ab3575060408051601f3d908101601f19168201909252612ab0918101906133db565b60015b612b165760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b60648201526084016114c6565b6000805160206135938339815191528114612b855760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b60648201526084016114c6565b50611a0f838383612d4b565b33612b9a61295d565b6001600160a01b03161461162a5760405162461bcd60e51b81526004016114c6906132fd565b603854610100900460ff16612be75760405162461bcd60e51b81526004016114c69061342e565b611f23612d70565b606b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b609d54604051630d2020dd60e01b8152600481018390526000916001600160a01b031690630d2020dd90602401602060405180830381865afa158015612c8b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123e89190613479565b6001600160a01b0381163b612d1c5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084016114c6565b60008051602061359383398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b612d5483612da0565b600082511180612d615750805b15611a0f576115e78383612de0565b603854610100900460ff16612d975760405162461bcd60e51b81526004016114c69061342e565b611f2333612bef565b612da981612caf565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6060612e0583836040518060600160405280602781526020016135b360279139612e0c565b9392505050565b60606001600160a01b0384163b612e745760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b60648201526084016114c6565b600080856001600160a01b031685604051612e8f9190613496565b600060405180830381855af49150503d8060008114612eca576040519150601f19603f3d011682016040523d82523d6000602084013e612ecf565b606091505b5091509150612edf828286612ee9565b9695505050505050565b60608315612ef8575081612e05565b825115612f085782518084602001fd5b8160405162461bcd60e51b81526004016114c691906132ea565b60008060008060808587031215612f3857600080fd5b5050823594602084013594506040840135936060013592509050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612f9357612f93612f54565b604052919050565b600082601f830112612fac57600080fd5b813567ffffffffffffffff811115612fc657612fc6612f54565b612fd9601f8201601f1916602001612f6a565b818152846020838601011115612fee57600080fd5b816020850160208301376000918101602001919091529392505050565b60006020828403121561301d57600080fd5b813567ffffffffffffffff81111561303457600080fd5b61304084828501612f9b565b949350505050565b60006020828403121561305a57600080fd5b5035919050565b6001600160a01b038116811461162a57600080fd5b60006020828403121561308857600080fd5b8135612e0581613061565b600080604083850312156130a657600080fd5b82356130b181613061565b9150602083013567ffffffffffffffff8111156130cd57600080fd5b6130d985828601612f9b565b9150509250929050565b600067ffffffffffffffff8211156130fd576130fd612f54565b5060051b60200190565b600082601f83011261311857600080fd5b8135602061312d613128836130e3565b612f6a565b82815260059290921b8401810191818101908684111561314c57600080fd5b8286015b848110156131675780358352918301918301613150565b509695505050505050565b60008060006060848603121561318757600080fd5b833561319281613061565b925060208481013567ffffffffffffffff808211156131b057600080fd5b818701915087601f8301126131c457600080fd5b81356131d2613128826130e3565b81815260059190911b8301840190848101908a8311156131f157600080fd5b938501935b8285101561320f578435825293850193908501906131f6565b96505050604087013592508083111561322757600080fd5b505061323586828701613107565b9150509250925092565b6000806040838503121561325257600080fd5b82359150602083013567ffffffffffffffff8111156130cd57600080fd5b6000806040838503121561328357600080fd5b50508035926020909101359150565b60005b838110156132ad578181015183820152602001613295565b838111156115e75750506000910152565b600081518084526132d6816020860160208601613292565b601f01601f19169290920160200192915050565b602081526000612e0560208301846132be565b6020808252600d908201526c2737902832b936b4b9b9b4b7b760991b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000821982111561334d5761334d613324565b500190565b634e487b7160e01b600052603260045260246000fd5b60006001820161337a5761337a613324565b5060010190565b6000806000806080858703121561339757600080fd5b505082516020840151604085015160609095015191969095509092509050565b600080604083850312156133ca57600080fd5b505080516020909101519092909150565b6000602082840312156133ed57600080fd5b5051919050565b600181811c9082168061340857607f821691505b60208210810361342857634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60006020828403121561348b57600080fd5b8151612e0581613061565b600082516134a8818460208701613292565b919091019291505056fe18ad4415ef4a621ce1a136395c51ab6c3712bb2e24b79d526059925cea58dcb8829561ab7af084b7efc6600518d2df79b8d95f3f4c3a550f54f8f7ec7d2b80578086da5becff4dfac91a3105821b361078d2d4abba0ccc2401b974cf0dcf05c10c4fbe9dc9de15dd7c0d064975ee1a2f2f9b954fa0e65d4f6cddba94884bdc3e89dd490ecaf395283ed4ff2fd9557ca767fc425dce063451a9b0da6d72f600c3be90e461bbdb9a95a694f7796912ea04244caf7f5b60ad7ded17e16821d3e44c0b09c9badbbeb6c813a598ee910770a39ccda797a1940439bb6e47fc6c87548b360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c65642a268972a70c8c688b62366bdfdd9bb09cf19d3e5b6e7e7bb158e671ffdcedd2c69fc6b7d0efc934fd5a3581c7253a7107a952526bb6dbcd814ef8d8dae1f44a7c1150f0e1a39ff55552d52764f97e6c387e2a247e1df344369f122c4254be2fa2646970667358221220baa5bc7f1d90c081dacd5776c70f2fa86c00d6ba71186486575b670769a2c9f864736f6c634300080e0033", + Bin: "0x60a0604052306080523480156200001557600080fd5b506200002062000026565b620000e8565b603854610100900460ff1615620000935760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60385460ff9081161015620000e6576038805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b60805161366f6200011260003960008181611a1e01528181611aa30152611b7b015261366f6000f3fe6080604052600436106104e05760003560e01c80636fde207a11610281578063a6ed563e1161015a578063c42a0abc116100cc578063e078869f11610085578063e078869f146113d0578063ec3df879146113f0578063f2fde38b14611410578063f38ecf4714611430578063f6fd712914611452578063f82145911461147257600080fd5b8063c42a0abc146112a7578063c6713baf146112db578063c7d3da341461130f578063c95437be14611343578063cdb9f6431461138e578063dc97d962146113a357600080fd5b8063b4d6bd3b1161011e578063b4d6bd3b146111d6578063bd02d0f5146111f6578063be33732a14611223578063c00ace6c14611243578063c031a18014611265578063c0b4fe151461128557600080fd5b8063a6ed563e1461111b578063a91ee0dc14611148578063a9b629b214611168578063aba01fee1461118a578063b128f880146111b457600080fd5b80638c8b887e116101f35780639801bff9116101b75780639801bff914611036578063986e791a146110565780639986e4b914611083578063a36f259b146110a7578063a5d6a581146110c7578063a6868b7d146110e757600080fd5b80638c8b887e14610ee45780638d5cdd7e14610f045780638da5cb5b14610f245780638f6fe72514610f42578063918f86741461102057600080fd5b8063738fdd1a11610245578063738fdd1a14610e0f57806379e8585914610e2f5780637b2bfb0114610e4f5780637bf4653014610e83578063852cf38f14610ea457806388c2801914610ec457600080fd5b80636fde207a14610d4d5780636fe1317714610d6f578063715018a614610d8f57806371c6960d14610da4578063737c59b814610dc457600080fd5b80633659cfe6116103be5780634bd1ed76116103305780635dba8c4a116102e95780635dba8c4a14610b985780636167eb4514610be3578063656e305214610c1757806367d1a2e014610c4b5780636c78d2cf14610d025780636d583ca714610d2b57600080fd5b80634bd1ed7614610ad65780634d273e2814610af85780634f1ef28614610b2c57806352d1902d14610b3f578063539927be14610b545780635a731cca14610b7457600080fd5b80633e8daafe116103825780633e8daafe14610a005780633f35c8fe14610a20578063408d79cf14610a4257806344b8991414610a6257806345b5ec2914610a825780634694641614610aa257600080fd5b80633659cfe6146109135780633690057a14610933578063382944191461097e5780633848207a146109a05780633d4c65f3146109e057600080fd5b8063238737b6116104575780632ed19cd51161041b5780632ed19cd5146107fc5780632f40992e1461081c5780633305508e1461083d57806333be496e1461085d57806333e31184146108a857806334125c84146108f357600080fd5b8063238737b614610709578063278bb12a1461073d5780632b2eaa92146107715780632eb57c65146107bc5780632eccd832146107dc57600080fd5b80630fca11d2116104a95780630fca11d2146105c7578063124cea37146105e7578063185582f1146106075780631b27e01b146106525780631e0cba0d1461069d57806321f8a721146106bb57600080fd5b806215a73b146104e5578063076cd77f1461051a5780630add66dd146105655780630b90a39a146105875780630fc238bf146105a7575b600080fd5b3480156104f157600080fd5b5061050760008051602061351383398151915281565b6040519081526020015b60405180910390f35b34801561052657600080fd5b5060008051602061357383398151915260005260026020527fd7a437163435b79030132855d9146a10e26570f1767311219983e0c430cfa69054610507565b34801561057157600080fd5b50610585610580366004612f22565b611497565b005b34801561059357600080fd5b506105856105a236600461300b565b6115ed565b3480156105b357600080fd5b506105856105c236600461300b565b61162d565b3480156105d357600080fd5b506105856105e2366004612f22565b61166a565b3480156105f357600080fd5b5061058561060236600461300b565b61172f565b34801561061357600080fd5b506000805160206134d383398151915260005260026020527fbc779bbce8d4fef90926dc39b56d9135e8e3795964b3adae769767961d4a94d854610507565b34801561065e57600080fd5b5060008051602061351383398151915260005260026020527f5a1993193b8890c75d83157b2c2c12b144545357ab60021d7429856434de051b54610507565b3480156106a957600080fd5b50610507665374616b696e6760c81b81565b3480156106c757600080fd5b506106f16106d6366004613048565b6000908152600460205260409020546001600160a01b031690565b6040516001600160a01b039091168152602001610511565b34801561071557600080fd5b506105077f1d36f8ce53f59e624857e1d8dc7932d19981a2ea1b8faa4eb8ff843fc3e5a27881565b34801561074957600080fd5b506105077f9b2e0c7fdae148f225bae7deb92d7e7bd24bb77edb12956e8fa7204900dd8a2281565b34801561077d57600080fd5b5060008051602061355383398151915260005260026020527f270fb31b28afd06ad35288bc3cb901686a4c5a15239e966fd9b64269abd226c354610507565b3480156107c857600080fd5b506105856107d7366004613048565b61176c565b3480156107e857600080fd5b506105856107f736600461300b565b6117b3565b34801561080857600080fd5b50610585610817366004613048565b6117f0565b34801561082857600080fd5b506105076914995dd85c99141bdbdb60b21b81565b34801561084957600080fd5b50610585610858366004613048565b611837565b34801561086957600080fd5b506000805160206135fa83398151915260005260026020527f8e8c0bef3b4557d74ba01e0433728c574990153e35cacae69cb26f23a8a4017554610507565b3480156108b457600080fd5b506000805160206134f383398151915260005260026020527ff3497fe1496bfc19eaef6d253f75ec2e9cfe1b4f6080c29192641567c6fc5d8754610507565b3480156108ff57600080fd5b506105076845636f73797374656d60b81b81565b34801561091f57600080fd5b5061058561092e366004613076565b61187e565b34801561093f57600080fd5b506000805160206135da83398151915260005260026020527f14e650c949c7cc3fca2efe79b3711fc734b4df488cc27c4137f35bd0adaae7fa54610507565b34801561098a57600080fd5b5061050760008051602061355383398151915281565b3480156109ac57600080fd5b506109d06109bb366004613048565b60009081526020819052604090205460ff1690565b6040519015158152602001610511565b3480156109ec57600080fd5b506105856109fb36600461300b565b6118d8565b348015610a0c57600080fd5b50610585610a1b36600461300b565b611915565b348015610a2c57600080fd5b506105076000805160206135da83398151915281565b348015610a4e57600080fd5b50610585610a5d36600461300b565b611952565b348015610a6e57600080fd5b50610585610a7d36600461300b565b61198f565b348015610a8e57600080fd5b50610585610a9d36600461300b565b6119cc565b348015610aae57600080fd5b506105077fdd5a41a7fc01f5c6d30816b17f638d6531625f1e1eaa599673ab2f6079f2dd9d81565b348015610ae257600080fd5b506105076a4d61696e74656e616e636560a81b81565b348015610b0457600080fd5b506105077f77884798208df1e64f70968be41ef2d3211ec53613397ca59313416813df088881565b610585610b3a366004613093565b611a14565b348015610b4b57600080fd5b50610507611b6e565b348015610b6057600080fd5b50610585610b6f366004613172565b611c21565b348015610b8057600080fd5b506105076c14dd185ada5b99d4995dd85c99609a1b81565b348015610ba457600080fd5b5060008051602061353383398151915260005260026020527f38eb620cc1355554391bc9d0c224a726d66edf7c3eb2d67af166d6e81fe4456254610507565b348015610bef57600080fd5b506105077f9f1de481f899d76889aa8a2b44cc7b604d42691aa93d4ba618a1a1fd439f505081565b348015610c2357600080fd5b506105077fe10074dceffb75f13bf0ce50145afd35182d63796823f1280ce40e01c19109e781565b348015610c5757600080fd5b5060026020527fc77500645c8acbf6137a0e04460f85359483e3b08db30285cca2957db0c90904547fca55256fa8d248a334a7cb4ca72d9aec97700e81b3784b43c388b9a8d0e2b8e3547f77884798208df1e64f70968be41ef2d3211ec53613397ca59313416813df08886000527fba5524e01c8da4a46e6f70a8f29f4dc63d299ad01d2f01ccae9666cb85f6f7c05460408051938452602084019290925290820152606001610511565b348015610d0e57600080fd5b506105077111dbdd995c9b985b98d950dbdb9d1c9858dd60721b81565b348015610d3757600080fd5b506105076000805160206135fa83398151915281565b348015610d5957600080fd5b5061050760008051602061357383398151915281565b348015610d7b57600080fd5b50610585610d8a366004613048565b611eca565b348015610d9b57600080fd5b50610585611f11565b348015610db057600080fd5b50610585610dbf36600461300b565b611f25565b348015610dd057600080fd5b506000805160206134b383398151915260005260026020527f673c817b54d53459fa437d6b11ba6445e517d8dc789e6b815675ff10e6aeeb5d54610507565b348015610e1b57600080fd5b50609d546106f1906001600160a01b031681565b348015610e3b57600080fd5b50610585610e4a366004613048565b611f62565b348015610e5b57600080fd5b506105077f9346226931826838eedd13d9677fa33551e7c81f604b171ef3fac355458da9aa81565b348015610e8f57600080fd5b5061050769456e7653746f7261676560b01b81565b348015610eb057600080fd5b50610585610ebf366004613048565b611fa9565b348015610ed057600080fd5b50610585610edf36600461323f565b611ff0565b348015610ef057600080fd5b50610585610eff36600461300b565b612164565b348015610f1057600080fd5b50610585610f1f366004613270565b6121ba565b348015610f3057600080fd5b50606b546001600160a01b03166106f1565b348015610f4e57600080fd5b5060026020527fe6679752544e0074a1c9bec26775117fd40d133ce43cc443fb5f2512ebd7c2af547f89fc1b873e9ef0767cf41719c69200c3f894c43d73c49eb537ca60ec0a2d14bc547fa04c555f883d07b5c5fe85061c632b6bfec696b67afa8ad5e9773b89249984b2547fdd5a41a7fc01f5c6d30816b17f638d6531625f1e1eaa599673ab2f6079f2dd9d6000527f286a480438fb7eb9f5465ec436e6de865b71284ceb2be7ff1cea98f38c26308254604080519485526020850193909352918301526060820152608001610511565b34801561102c57600080fd5b5061050761271081565b34801561104257600080fd5b506109d061105136600461323f565b61228f565b34801561106257600080fd5b50611076611071366004613048565b6123ee565b60405161051191906132ea565b34801561108f57600080fd5b506105076c42616c6c6f7453746f7261676560981b81565b3480156110b357600080fd5b506105856110c2366004613048565b612490565b3480156110d357600080fd5b506105856110e236600461300b565b6124d7565b3480156110f357600080fd5b506105077f6c6f69f426081752a5d3e73746599acd2a4cb145d5de4203ca1e3473b281680b81565b34801561112757600080fd5b50610507611136366004613048565b60009081526006602052604090205490565b34801561115457600080fd5b50610585611163366004613076565b612514565b34801561117457600080fd5b5061050760008051602061353383398151915281565b34801561119657600080fd5b5061119f6125bc565b60408051928352602083019190915201610511565b3480156111c057600080fd5b506105076000805160206134d383398151915281565b3480156111e257600080fd5b506105856111f1366004613270565b612626565b34801561120257600080fd5b50610507611211366004613048565b60009081526002602052604090205490565b34801561122f57600080fd5b5061058561123e36600461300b565b6126fd565b34801561124f57600080fd5b506105076000805160206134b383398151915281565b34801561127157600080fd5b50611076611280366004613048565b61274c565b34801561129157600080fd5b506105076000805160206134f383398151915281565b3480156112b357600080fd5b506105077fb38b2c133e931937bd95337c65c8aefa7040ed64bbed732e3e29a4944c65747381565b3480156112e757600080fd5b506105077fc9e15e34073efbcd0328740feaf503caac9124b55b38c73d1a97b53da80a2f6081565b34801561131b57600080fd5b506105077f04f7b94450bbcad85f37ea47cd1062728f884bb2040e357738f8fd53056134bc81565b34801561134f57600080fd5b5060008051602061361a83398151915260005260026020527f38ddebd16170f2328156b72e009b30efe6e74a1b9fc4389d05f50efa2a42c6f854610507565b34801561139a57600080fd5b5061119f612769565b3480156113af57600080fd5b506105076113be366004613048565b60009081526001602052604090205490565b3480156113dc57600080fd5b506105856113eb36600461300b565b6127cf565b3480156113fc57600080fd5b5061058561140b366004613048565b612812565b34801561141c57600080fd5b5061058561142b366004613076565b612859565b34801561143c57600080fd5b5061050760008051602061361a83398151915281565b34801561145e57600080fd5b5061058561146d366004613048565b6128cf565b34801561147e57600080fd5b5061058561148d366004613048565b612916565b905090565b336114a061295d565b6001600160a01b0316146114cf5760405162461bcd60e51b81526004016114c6906132fd565b60405180910390fd5b61271081836114de868861333a565b6114e8919061333a565b6114f2919061333a565b1461153f5760405162461bcd60e51b815260206004820152601e60248201527f57726f6e6720726577617264206469737472756274696f6e20726174696f000060448201526064016114c6565b6115697fc9e15e34073efbcd0328740feaf503caac9124b55b38c73d1a97b53da80a2f608561297d565b6115937f9f1de481f899d76889aa8a2b44cc7b604d42691aa93d4ba618a1a1fd439f50508461297d565b6115bd7f9346226931826838eedd13d9677fa33551e7c81f604b171ef3fac355458da9aa8361297d565b6115e77fdd5a41a7fc01f5c6d30816b17f638d6531625f1e1eaa599673ab2f6079f2dd9d8261297d565b50505050565b336115f661295d565b6001600160a01b03161461161c5760405162461bcd60e51b81526004016114c6906132fd565b61162a61146d826020015190565b50565b3361163661295d565b6001600160a01b03161461165c5760405162461bcd60e51b81526004016114c6906132fd565b61162a61140b826020015190565b3361167361295d565b6001600160a01b0316146116995760405162461bcd60e51b81526004016114c6906132fd565b6116c37f1d36f8ce53f59e624857e1d8dc7932d19981a2ea1b8faa4eb8ff843fc3e5a2788561297d565b6116ed7fb38b2c133e931937bd95337c65c8aefa7040ed64bbed732e3e29a4944c6574738461297d565b6117177f77884798208df1e64f70968be41ef2d3211ec53613397ca59313416813df08888361297d565b6115e760008051602061361a8339815191528261297d565b3361173861295d565b6001600160a01b03161461175e5760405162461bcd60e51b81526004016114c6906132fd565b61162a6110c2826020015190565b3361177561295d565b6001600160a01b03161461179b5760405162461bcd60e51b81526004016114c6906132fd565b61162a6000805160206135738339815191528261297d565b336117bc61295d565b6001600160a01b0316146117e25760405162461bcd60e51b81526004016114c6906132fd565b61162a61148d826020015190565b336117f961295d565b6001600160a01b03161461181f5760405162461bcd60e51b81526004016114c6906132fd565b61162a6000805160206135338339815191528261297d565b3361184061295d565b6001600160a01b0316146118665760405162461bcd60e51b81526004016114c6906132fd565b61162a6000805160206134f38339815191528261297d565b6118866129cc565b6118a181604051806020016040528060008152506000612a26565b6040516001600160a01b038216907f2a74bbaf99cf25202925743012bb137262ab3432c821e1ba94ddbecac2ea970890600090a250565b336118e161295d565b6001600160a01b0316146119075760405162461bcd60e51b81526004016114c6906132fd565b61162a610817826020015190565b3361191e61295d565b6001600160a01b0316146119445760405162461bcd60e51b81526004016114c6906132fd565b61162a610e4a826020015190565b3361195b61295d565b6001600160a01b0316146119815760405162461bcd60e51b81526004016114c6906132fd565b61162a610d8a826020015190565b3361199861295d565b6001600160a01b0316146119be5760405162461bcd60e51b81526004016114c6906132fd565b61162a610858826020015190565b336119d561295d565b6001600160a01b0316146119fb5760405162461bcd60e51b81526004016114c6906132fd565b60208101516040820151611a0f8282612626565b505050565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003611aa15760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b19195b1959d85d1958d85b1b60a21b60648201526084016114c6565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611aea600080516020613593833981519152546001600160a01b031690565b6001600160a01b031614611b555760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b6163746976652070726f787960a01b60648201526084016114c6565b611b5e82612b91565b611b6a82826001612a26565b5050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611c0e5760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c000000000000000060648201526084016114c6565b5060008051602061359383398151915290565b603854610100900460ff1615808015611c415750603854600160ff909116105b80611c5b5750303b158015611c5b575060385460ff166001145b611cbe5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016114c6565b6038805460ff191660011790558015611ce1576038805461ff0019166101001790555b600080516020613593833981519152546001600160a01b03166001600160a01b0316846001600160a01b031603611d705760405162461bcd60e51b815260206004820152602d60248201527f72656769737472792073686f756c64206e6f742062652073616d65206173206960448201526c36b83632b6b2b73a30ba34b7b760991b60648201526084016114c6565b611d78612bc0565b611d8184612514565b60005b8251811015611e7e576000611dbe858381518110611da457611da4613352565b602002602001015160009081526002602052604090205490565b9050838281518110611dd257611dd2613352565b60200260200101516000141580611de857508015155b611e275760405162461bcd60e51b815260206004820152601060248201526f696e76616c6964207661726961626c6560801b60448201526064016114c6565b80600003611e6b57611e6b858381518110611e4457611e44613352565b6020026020010151858481518110611e5e57611e5e613352565b602002602001015161297d565b5080611e7681613368565b915050611d84565b5080156115e7576038805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050565b33611ed361295d565b6001600160a01b031614611ef95760405162461bcd60e51b81526004016114c6906132fd565b61162a60008051602061361a8339815191528261297d565b611f196129cc565b611f236000612bef565b565b33611f2e61295d565b6001600160a01b031614611f545760405162461bcd60e51b81526004016114c6906132fd565b61162a6107d7826020015190565b33611f6b61295d565b6001600160a01b031614611f915760405162461bcd60e51b81526004016114c6906132fd565b61162a6000805160206135da8339815191528261297d565b33611fb261295d565b6001600160a01b031614611fd85760405162461bcd60e51b81526004016114c6906132fd565b61162a6000805160206135138339815191528261297d565b6000805160206135da833981519152820361200e57611b6a81611915565b7fe10074dceffb75f13bf0ce50145afd35182d63796823f1280ce40e01c19109e7820361203e57611b6a816119cc565b7f6c6f69f426081752a5d3e73746599acd2a4cb145d5de4203ca1e3473b281680b820361206e57611b6a816127cf565b6000805160206134d3833981519152820361208c57611b6a816115ed565b6000805160206134f383398151915282036120aa57611b6a8161198f565b60008051602061353383398151915282036120c857611b6a816118d8565b60008051602061355383398151915282036120e657611b6a8161162d565b7f9b2e0c7fdae148f225bae7deb92d7e7bd24bb77edb12956e8fa7204900dd8a22820361211657611b6a81612164565b7f04f7b94450bbcad85f37ea47cd1062728f884bb2040e357738f8fd53056134bc820361214657611b6a816126fd565b60008051602061361a8339815191528203611b6a57611b6a81611952565b3361216d61295d565b6001600160a01b0316146121935760405162461bcd60e51b81526004016114c6906132fd565b60208101516040820151606083015160808401516121b384848484611497565b5050505050565b336121c361295d565b6001600160a01b0316146121e95760405162461bcd60e51b81526004016114c6906132fd565b8082111561225f5760405162461bcd60e51b815260206004820152603e60248201527f4d696e696d756d207374616b696e67206d75737420626520736d616c6c65722060448201527f616e6420657175616c207468616e206d6178696d756d207374616b696e67000060648201526084016114c6565b6122776000805160206135738339815191528361297d565b611b6a6000805160206134b38339815191528261297d565b60007f9b2e0c7fdae148f225bae7deb92d7e7bd24bb77edb12956e8fa7204900dd8a22830361231a57600080600080858060200190518101906122d29190613381565b9350935093509350612710818385876122eb919061333a565b6122f5919061333a565b6122ff919061333a565b146123115760009450505050506123e8565b505050506123e4565b7f6c6f69f426081752a5d3e73746599acd2a4cb145d5de4203ca1e3473b281680b83148061236757507fe10074dceffb75f13bf0ce50145afd35182d63796823f1280ce40e01c19109e783145b156123a1576000808380602001905181019061238391906133b7565b915091508082111561239a576000925050506123e8565b50506123e4565b6000805160206134f383398151915283036123e4576000828060200190518101906123cc91906133db565b90506103e88110156123e25760009150506123e8565b505b5060015b92915050565b600081815260036020526040902080546060919061240b906133f4565b80601f0160208091040260200160405190810160405280929190818152602001828054612437906133f4565b80156124845780601f1061245957610100808354040283529160200191612484565b820191906000526020600020905b81548152906001019060200180831161246757829003601f168201915b50505050509050919050565b3361249961295d565b6001600160a01b0316146124bf5760405162461bcd60e51b81526004016114c6906132fd565b61162a6000805160206135fa8339815191528261297d565b336124e061295d565b6001600160a01b0316146125065760405162461bcd60e51b81526004016114c6906132fd565b61162a610ebf826020015190565b61251c6129cc565b6001600160a01b0381166125725760405162461bcd60e51b815260206004820152601a60248201527f416464726573732073686f756c64206265206e6f6e2d7a65726f00000000000060448201526064016114c6565b609d80546001600160a01b0319166001600160a01b0383169081179091556040517f278c70ced5f3e0e5eeb385b5ff9cb735748ba00a625147e66065ed48fc1562cd90600090a250565b60026020527fd7a437163435b79030132855d9146a10e26570f1767311219983e0c430cfa690546000805160206134b383398151915260009081527f673c817b54d53459fa437d6b11ba6445e517d8dc789e6b815675ff10e6aeeb5d54909182915b915091509091565b3361262f61295d565b6001600160a01b0316146126555760405162461bcd60e51b81526004016114c6906132fd565b808211156126cd576040805162461bcd60e51b81526020600482015260248101919091527f4d696e696d756d206475726174696f6e206d75737420626520736d616c6c657260448201527f20616e6420657175616c207468616e206d6178696d756d206475726174696f6e60648201526084016114c6565b6126e56000805160206135fa8339815191528361297d565b611b6a6000805160206135138339815191528261297d565b3361270661295d565b6001600160a01b03161461272c5760405162461bcd60e51b81526004016114c6906132fd565b60208101516040820151606083015160808401516121b38484848461166a565b600081815260056020526040902080546060919061240b906133f4565b60026020527f8e8c0bef3b4557d74ba01e0433728c574990153e35cacae69cb26f23a8a401755460008051602061351383398151915260009081527f5a1993193b8890c75d83157b2c2c12b144545357ab60021d7429856434de051b549091829161261e565b336127d861295d565b6001600160a01b0316146127fe5760405162461bcd60e51b81526004016114c6906132fd565b60208101516040820151611a0f82826121ba565b3361281b61295d565b6001600160a01b0316146128415760405162461bcd60e51b81526004016114c6906132fd565b61162a6000805160206135538339815191528261297d565b6128616129cc565b6001600160a01b0381166128c65760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016114c6565b61162a81612bef565b336128d861295d565b6001600160a01b0316146128fe5760405162461bcd60e51b81526004016114c6906132fd565b61162a6000805160206134d38339815191528261297d565b3361291f61295d565b6001600160a01b0316146129455760405162461bcd60e51b81526004016114c6906132fd565b61162a6000805160206134b38339815191528261297d565b60006114927111dbdd995c9b985b98d950dbdb9d1c9858dd60721b612c41565b6000828152600260205260409020819055817f58d7c10adfd5778016889c15d422d57f2975b9292415b54fe5d8cd4241200612826040516129c091815260200190565b60405180910390a25050565b606b546001600160a01b03163314611f235760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016114c6565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615612a5957611a0f83612caf565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015612ab3575060408051601f3d908101601f19168201909252612ab0918101906133db565b60015b612b165760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b60648201526084016114c6565b6000805160206135938339815191528114612b855760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b60648201526084016114c6565b50611a0f838383612d4b565b33612b9a61295d565b6001600160a01b03161461162a5760405162461bcd60e51b81526004016114c6906132fd565b603854610100900460ff16612be75760405162461bcd60e51b81526004016114c69061342e565b611f23612d70565b606b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b609d54604051630d2020dd60e01b8152600481018390526000916001600160a01b031690630d2020dd90602401602060405180830381865afa158015612c8b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123e89190613479565b6001600160a01b0381163b612d1c5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084016114c6565b60008051602061359383398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b612d5483612da0565b600082511180612d615750805b15611a0f576115e78383612de0565b603854610100900460ff16612d975760405162461bcd60e51b81526004016114c69061342e565b611f2333612bef565b612da981612caf565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6060612e0583836040518060600160405280602781526020016135b360279139612e0c565b9392505050565b60606001600160a01b0384163b612e745760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b60648201526084016114c6565b600080856001600160a01b031685604051612e8f9190613496565b600060405180830381855af49150503d8060008114612eca576040519150601f19603f3d011682016040523d82523d6000602084013e612ecf565b606091505b5091509150612edf828286612ee9565b9695505050505050565b60608315612ef8575081612e05565b825115612f085782518084602001fd5b8160405162461bcd60e51b81526004016114c691906132ea565b60008060008060808587031215612f3857600080fd5b5050823594602084013594506040840135936060013592509050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612f9357612f93612f54565b604052919050565b600082601f830112612fac57600080fd5b813567ffffffffffffffff811115612fc657612fc6612f54565b612fd9601f8201601f1916602001612f6a565b818152846020838601011115612fee57600080fd5b816020850160208301376000918101602001919091529392505050565b60006020828403121561301d57600080fd5b813567ffffffffffffffff81111561303457600080fd5b61304084828501612f9b565b949350505050565b60006020828403121561305a57600080fd5b5035919050565b6001600160a01b038116811461162a57600080fd5b60006020828403121561308857600080fd5b8135612e0581613061565b600080604083850312156130a657600080fd5b82356130b181613061565b9150602083013567ffffffffffffffff8111156130cd57600080fd5b6130d985828601612f9b565b9150509250929050565b600067ffffffffffffffff8211156130fd576130fd612f54565b5060051b60200190565b600082601f83011261311857600080fd5b8135602061312d613128836130e3565b612f6a565b82815260059290921b8401810191818101908684111561314c57600080fd5b8286015b848110156131675780358352918301918301613150565b509695505050505050565b60008060006060848603121561318757600080fd5b833561319281613061565b925060208481013567ffffffffffffffff808211156131b057600080fd5b818701915087601f8301126131c457600080fd5b81356131d2613128826130e3565b81815260059190911b8301840190848101908a8311156131f157600080fd5b938501935b8285101561320f578435825293850193908501906131f6565b96505050604087013592508083111561322757600080fd5b505061323586828701613107565b9150509250925092565b6000806040838503121561325257600080fd5b82359150602083013567ffffffffffffffff8111156130cd57600080fd5b6000806040838503121561328357600080fd5b50508035926020909101359150565b60005b838110156132ad578181015183820152602001613295565b838111156115e75750506000910152565b600081518084526132d6816020860160208601613292565b601f01601f19169290920160200192915050565b602081526000612e0560208301846132be565b6020808252600d908201526c2737902832b936b4b9b9b4b7b760991b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000821982111561334d5761334d613324565b500190565b634e487b7160e01b600052603260045260246000fd5b60006001820161337a5761337a613324565b5060010190565b6000806000806080858703121561339757600080fd5b505082516020840151604085015160609095015191969095509092509050565b600080604083850312156133ca57600080fd5b505080516020909101519092909150565b6000602082840312156133ed57600080fd5b5051919050565b600181811c9082168061340857607f821691505b60208210810361342857634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60006020828403121561348b57600080fd5b8151612e0581613061565b600082516134a8818460208701613292565b919091019291505056fe18ad4415ef4a621ce1a136395c51ab6c3712bb2e24b79d526059925cea58dcb8829561ab7af084b7efc6600518d2df79b8d95f3f4c3a550f54f8f7ec7d2b80578086da5becff4dfac91a3105821b361078d2d4abba0ccc2401b974cf0dcf05c10c4fbe9dc9de15dd7c0d064975ee1a2f2f9b954fa0e65d4f6cddba94884bdc3e89dd490ecaf395283ed4ff2fd9557ca767fc425dce063451a9b0da6d72f600c3be90e461bbdb9a95a694f7796912ea04244caf7f5b60ad7ded17e16821d3e44c0b09c9badbbeb6c813a598ee910770a39ccda797a1940439bb6e47fc6c87548b360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c65642a268972a70c8c688b62366bdfdd9bb09cf19d3e5b6e7e7bb158e671ffdcedd2c69fc6b7d0efc934fd5a3581c7253a7107a952526bb6dbcd814ef8d8dae1f44a7c1150f0e1a39ff55552d52764f97e6c387e2a247e1df344369f122c4254be2fa2646970667358221220a6ac80bb4700a43754fde07954a1f0033c71e97b16822cfca16e543a7eff568164736f6c634300080e0033", } // EnvStorageImpABI is the input ABI used to generate the binding from. diff --git a/wemix/bind/gen_gov_abi.go b/wemix/bind/gen_gov_abi.go index 3a034fe6bd19..f71bb1c7ce93 100644 --- a/wemix/bind/gen_gov_abi.go +++ b/wemix/bind/gen_gov_abi.go @@ -720,7 +720,7 @@ func (_Gov *GovFilterer) ParseUpgraded(log types.Log) (*GovUpgraded, error) { // GovImpMetaData contains all meta data concerning the GovImp contract. var GovImpMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"previousAdmin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"AdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"beacon\",\"type\":\"address\"}],\"name\":\"BeaconUpgraded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"envName\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"envType\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"envVal\",\"type\":\"bytes\"}],\"name\":\"EnvChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"}],\"name\":\"GovDataMigrated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"}],\"name\":\"MemberAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldAddr\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newAddr\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newVoter\",\"type\":\"address\"}],\"name\":\"MemberChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"}],\"name\":\"MemberRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"}],\"name\":\"MemberUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"ballotId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"}],\"name\":\"NotApplicable\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newPeriod\",\"type\":\"uint256\"}],\"name\":\"SetProposalTimePeriod\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"SetRegistry\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"BALLOT_DURATION_MAX_NAME\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"BALLOT_DURATION_MIN_MAX_NAME\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"BALLOT_DURATION_MIN_NAME\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"BALLOT_STORAGE_NAME\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"BASE_FEE_MAX_CHANGE_RATE_NAME\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"BLOCKS_PER_NAME\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"BLOCK_CREATION_TIME_NAME\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"BLOCK_GASLIMIT_NAME\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"BLOCK_REWARD_AMOUNT_NAME\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"BLOCK_REWARD_DISTRIBUTION_BLOCK_PRODUCER_NAME\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"BLOCK_REWARD_DISTRIBUTION_ECOSYSTEM_NAME\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"BLOCK_REWARD_DISTRIBUTION_MAINTENANCE_NAME\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"BLOCK_REWARD_DISTRIBUTION_METHOD_NAME\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"BLOCK_REWARD_DISTRIBUTION_STAKING_REWARD_NAME\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"DENOMINATOR\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ECOSYSTEM_NAME\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ENV_STORAGE_NAME\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"GASLIMIT_AND_BASE_FEE_NAME\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"GAS_TARGET_PERCENTAGE_NAME\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"GOV_NAME\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAINTENANCE_NAME\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_BASE_FEE_NAME\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_IDLE_BLOCK_INTERVAL_NAME\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_PRIORITY_FEE_PER_GAS_NAME\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"REWARD_POOL_NAME\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"STAKING_MAX_NAME\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"STAKING_MIN_MAX_NAME\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"STAKING_MIN_NAME\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"STAKING_NAME\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"STAKING_REWARD_NAME\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"reward\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"name\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"enode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"ip\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"port\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"lockAmount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"memo\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"duration\",\"type\":\"uint256\"}],\"internalType\":\"structGovImp.MemberInfo\",\"name\":\"info\",\"type\":\"tuple\"}],\"name\":\"addProposalToAddMember\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"ballotIdx\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"envName\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"envType\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"envVal\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"memo\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"duration\",\"type\":\"uint256\"}],\"name\":\"addProposalToChangeEnv\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"ballotIdx\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newGovAddr\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"memo\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"duration\",\"type\":\"uint256\"}],\"name\":\"addProposalToChangeGov\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"ballotIdx\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"reward\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"name\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"enode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"ip\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"port\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"lockAmount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"memo\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"duration\",\"type\":\"uint256\"}],\"internalType\":\"structGovImp.MemberInfo\",\"name\":\"newInfo\",\"type\":\"tuple\"},{\"internalType\":\"address\",\"name\":\"oldStaker\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"unlockAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"slashing\",\"type\":\"uint256\"}],\"name\":\"addProposalToChangeMember\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"ballotIdx\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"lockAmount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"memo\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"duration\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unlockAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"slashing\",\"type\":\"uint256\"}],\"name\":\"addProposalToRemoveMember\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"ballotIdx\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ballotLength\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"checkUnfinalized\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"finalizeEndedVote\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getBallotInVoting\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getMaxStaking\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getMaxVotingDuration\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"idx\",\"type\":\"uint256\"}],\"name\":\"getMember\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"idx\",\"type\":\"uint256\"}],\"name\":\"getMemberFromNodeIdx\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getMemberLength\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getMinStaking\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getMinVotingDuration\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"idx\",\"type\":\"uint256\"}],\"name\":\"getNode\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"name\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"enode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"ip\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"port\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"getNodeIdxFromMember\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNodeLength\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"idx\",\"type\":\"uint256\"}],\"name\":\"getReward\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_addr\",\"type\":\"address\"}],\"name\":\"getStakerAddr\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getThreshold\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"idx\",\"type\":\"uint256\"}],\"name\":\"getVoter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"registry\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"lockAmount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"name\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"enode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"ip\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"port\",\"type\":\"uint256\"}],\"name\":\"init\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"registry\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"oldModifiedBlock\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"oldOwner\",\"type\":\"address\"}],\"name\":\"initMigration\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"registry\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"lockAmount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"initOnce\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"isMember\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"isReward\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"isStaker\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"isVoter\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"lastAddProposalTime\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"oldGov\",\"type\":\"address\"}],\"name\":\"migrateFromLegacy\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"modifiedBlock\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proposal_time_period\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proxiableUUID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"reInit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"reg\",\"outputs\":[{\"internalType\":\"contractIRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"rewardIdx\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newPeriod\",\"type\":\"uint256\"}],\"name\":\"setProposalTimePeriod\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_addr\",\"type\":\"address\"}],\"name\":\"setRegistry\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"stakerIdx\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"}],\"name\":\"upgradeTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"upgradeToAndCall\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"ballotIdx\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"approval\",\"type\":\"bool\"}],\"name\":\"vote\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"voteLength\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"voterIdx\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", + ABI: "[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"previousAdmin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"AdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"beacon\",\"type\":\"address\"}],\"name\":\"BeaconUpgraded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"envName\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"envType\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"envVal\",\"type\":\"bytes\"}],\"name\":\"EnvChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"calldatas\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"returnData\",\"type\":\"bytes\"}],\"name\":\"Executed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"ballotIdx\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"creator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"result\",\"type\":\"bytes\"}],\"name\":\"FailReturnValue\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"}],\"name\":\"GovDataMigrated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"}],\"name\":\"MemberAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldAddr\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newAddr\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newVoter\",\"type\":\"address\"}],\"name\":\"MemberChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"}],\"name\":\"MemberRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"}],\"name\":\"MemberUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"ballotId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"}],\"name\":\"NotApplicable\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newPeriod\",\"type\":\"uint256\"}],\"name\":\"SetProposalTimePeriod\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"SetRegistry\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"BALLOT_DURATION_MAX_NAME\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"BALLOT_DURATION_MIN_MAX_NAME\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"BALLOT_DURATION_MIN_NAME\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"BALLOT_STORAGE_NAME\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"BASE_FEE_MAX_CHANGE_RATE_NAME\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"BLOCKS_PER_NAME\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"BLOCK_CREATION_TIME_NAME\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"BLOCK_GASLIMIT_NAME\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"BLOCK_REWARD_AMOUNT_NAME\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"BLOCK_REWARD_DISTRIBUTION_BLOCK_PRODUCER_NAME\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"BLOCK_REWARD_DISTRIBUTION_ECOSYSTEM_NAME\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"BLOCK_REWARD_DISTRIBUTION_MAINTENANCE_NAME\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"BLOCK_REWARD_DISTRIBUTION_METHOD_NAME\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"BLOCK_REWARD_DISTRIBUTION_STAKING_REWARD_NAME\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"DENOMINATOR\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ECOSYSTEM_NAME\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ENV_STORAGE_NAME\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"GASLIMIT_AND_BASE_FEE_NAME\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"GAS_TARGET_PERCENTAGE_NAME\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"GOV_NAME\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAINTENANCE_NAME\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_BASE_FEE_NAME\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_IDLE_BLOCK_INTERVAL_NAME\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_PRIORITY_FEE_PER_GAS_NAME\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"REWARD_POOL_NAME\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"STAKING_MAX_NAME\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"STAKING_MIN_MAX_NAME\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"STAKING_MIN_NAME\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"STAKING_NAME\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"STAKING_REWARD_NAME\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"reward\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"name\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"enode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"ip\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"port\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"lockAmount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"memo\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"duration\",\"type\":\"uint256\"}],\"internalType\":\"structGovImp.MemberInfo\",\"name\":\"info\",\"type\":\"tuple\"}],\"name\":\"addProposalToAddMember\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"ballotIdx\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"envName\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"envType\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"envVal\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"memo\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"duration\",\"type\":\"uint256\"}],\"name\":\"addProposalToChangeEnv\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"ballotIdx\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newGovAddr\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"memo\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"duration\",\"type\":\"uint256\"}],\"name\":\"addProposalToChangeGov\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"ballotIdx\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"reward\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"name\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"enode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"ip\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"port\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"lockAmount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"memo\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"duration\",\"type\":\"uint256\"}],\"internalType\":\"structGovImp.MemberInfo\",\"name\":\"newInfo\",\"type\":\"tuple\"},{\"internalType\":\"address\",\"name\":\"oldStaker\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"unlockAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"slashing\",\"type\":\"uint256\"}],\"name\":\"addProposalToChangeMember\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"ballotIdx\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_calldata\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_memo\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_duration\",\"type\":\"uint256\"}],\"name\":\"addProposalToExecute\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"lockAmount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"memo\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"duration\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unlockAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"slashing\",\"type\":\"uint256\"}],\"name\":\"addProposalToRemoveMember\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"ballotIdx\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ballotLength\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"checkUnfinalized\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"finalizeEndedVote\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getBallotInVoting\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getMaxStaking\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getMaxVotingDuration\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"idx\",\"type\":\"uint256\"}],\"name\":\"getMember\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"idx\",\"type\":\"uint256\"}],\"name\":\"getMemberFromNodeIdx\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getMemberLength\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getMinStaking\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getMinVotingDuration\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"idx\",\"type\":\"uint256\"}],\"name\":\"getNode\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"name\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"enode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"ip\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"port\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"getNodeIdxFromMember\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNodeLength\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"idx\",\"type\":\"uint256\"}],\"name\":\"getReward\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_addr\",\"type\":\"address\"}],\"name\":\"getStakerAddr\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getThreshold\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"idx\",\"type\":\"uint256\"}],\"name\":\"getVoter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"registry\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"lockAmount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"name\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"enode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"ip\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"port\",\"type\":\"uint256\"}],\"name\":\"init\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"registry\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"oldModifiedBlock\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"oldOwner\",\"type\":\"address\"}],\"name\":\"initMigration\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"registry\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"lockAmount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"initOnce\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"isMember\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"isReward\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"isStaker\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"isVoter\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"lastAddProposalTime\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"oldGov\",\"type\":\"address\"}],\"name\":\"migrateFromLegacy\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"modifiedBlock\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proposal_time_period\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proxiableUUID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"reInit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"reg\",\"outputs\":[{\"internalType\":\"contractIRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"rewardIdx\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newPeriod\",\"type\":\"uint256\"}],\"name\":\"setProposalTimePeriod\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_addr\",\"type\":\"address\"}],\"name\":\"setRegistry\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"stakerIdx\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"upgradeTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"upgradeToAndCall\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"ballotIdx\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"approval\",\"type\":\"bool\"}],\"name\":\"vote\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"voteLength\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"voterIdx\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", Sigs: map[string]string{ "0015a73b": "BALLOT_DURATION_MAX_NAME()", "656e3052": "BALLOT_DURATION_MIN_MAX_NAME()", @@ -756,6 +756,7 @@ var GovImpMetaData = &bind.MetaData{ "40690353": "addProposalToChangeEnv(bytes32,uint256,bytes,bytes,uint256)", "0efa4909": "addProposalToChangeGov(address,bytes,uint256)", "a78a8188": "addProposalToChangeMember((address,address,address,bytes,bytes,bytes,uint256,uint256,bytes,uint256),address,uint256,uint256)", + "404e585d": "addProposalToExecute(address,bytes,bytes,uint256)", "894f5111": "addProposalToRemoveMember(address,uint256,bytes,uint256,uint256,uint256)", "d6f9cfce": "ballotLength()", "1c12b030": "checkUnfinalized()", @@ -802,7 +803,7 @@ var GovImpMetaData = &bind.MetaData{ "e9523fb5": "voteLength()", "cec5b622": "voterIdx(address)", }, - Bin: "0x60a0604052306080523480156200001557600080fd5b506200002062000026565b620000e8565b600054610100900460ff1615620000935760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff9081161015620000e6576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6080516185c86200012060003960008181611e6501528181611ea5015281816129eb01528181612a2b0152612aa701526185c86000f3fe6080604052600436106104675760003560e01c806372016f751161024a578063af6af2ff11610139578063cec5b622116100b6578063e27bdaef1161007a578063e27bdaef14610fb3578063e75235b814610fd3578063e9523fb514610fe8578063f2fde38b14610ffe578063f38ecf471461101e57600080fd5b8063cec5b62214610f10578063d07bff0c14610f3d578063d6f9cfce14610f73578063d965ea0014610f89578063de09b37714610f9e57600080fd5b8063c6713baf116100fd578063c6713baf14610e3d578063c7d3da3414610e71578063c9d27afe14610ea5578063ce04b9d414610ec5578063ce6a54ff14610eda57600080fd5b8063af6af2ff14610d58578063b128f88014610d6d578063c00ace6c14610da1578063c0b4fe1514610dd5578063c42a0abc14610e0957600080fd5b8063a0c12683116101c7578063a8915a3e1161018b578063a8915a3e14610c81578063a91ee0dc14610ca1578063a9b629b214610cc1578063aaf0dd3614610cf5578063ab3545e514610d2257600080fd5b8063a0c1268314610ba8578063a230c52414610bd5578063a6868b7d14610bf5578063a7771ee314610c29578063a78a818814610c6157600080fd5b8063894f51111161020e578063894f511114610b105780638d39e33a14610b305780638da5cb5b14610b50578063918f867414610b6e5780639986e4b914610b8457600080fd5b806372016f7514610a70578063738fdd1a14610a855780637b2bfb0114610aa55780637bf4653014610ad95780637d10dd1b14610afa57600080fd5b80633f35c8fe116103665780635aaa4040116102e35780636d583ca7116102a75780636d583ca71461099b5780636f1e8533146109cf5780636f6de96d14610a075780636fde207a14610a27578063715018a614610a5b57600080fd5b80635aaa4040146108e05780636167eb45146108f5578063656e3052146109295780636ba991811461095d5780636c78d2cf1461097257600080fd5b80634d5ce0381161032a5780634d5ce038146108445780634f0f4aa9146108645780634f1ef2861461089457806352d1902d146108a75780635a731cca146108bc57600080fd5b80633f35c8fe14610766578063406903531461079a57806346946416146107ba5780634bd1ed76146107ee5780634d273e281461081057600080fd5b8063238737b6116103f4578063351bacda116103b8578063351bacda146106b25780633659cfe6146106d257806336e83d83146106f25780633829441914610712578063397e38e71461074657600080fd5b8063238737b6146105f3578063278bb12a146106275780632f40992e1461065b5780633310569c1461067c57806334125c841461069257600080fd5b806316fbe8311161043b57806316fbe8311461054e5780631c12b030146105655780631c1501711461058a5780631c4b774b1461059f5780631e0cba0d146105d557600080fd5b806215a73b1461046c5780630efa4909146104b3578063139d9dd3146104d357806315bf6b4d14610500575b600080fd5b34801561047857600080fd5b506104a07f0c4fbe9dc9de15dd7c0d064975ee1a2f2f9b954fa0e65d4f6cddba94884bdc3e81565b6040519081526020015b60405180910390f35b3480156104bf57600080fd5b506104a06104ce366004617682565b611052565b3480156104df57600080fd5b506104a06104ee3660046176da565b60ab6020526000908152604090205481565b34801561050c57600080fd5b5061053661051b3660046176f7565b6000908152607360205260409020546001600160a01b031690565b6040516001600160a01b0390911681526020016104aa565b34801561055a57600080fd5b506105636113db565b005b34801561057157600080fd5b5061057a61171a565b60405190151581526020016104aa565b34801561059657600080fd5b506104a061176b565b3480156105ab57600080fd5b506105366105ba3660046176f7565b6000908152606a60205260409020546001600160a01b031690565b3480156105e157600080fd5b506104a0665374616b696e6760c81b81565b3480156105ff57600080fd5b506104a07f1d36f8ce53f59e624857e1d8dc7932d19981a2ea1b8faa4eb8ff843fc3e5a27881565b34801561063357600080fd5b506104a07f9b2e0c7fdae148f225bae7deb92d7e7bd24bb77edb12956e8fa7204900dd8a2281565b34801561066757600080fd5b506104a06914995dd85c99141bdbdb60b21b81565b34801561068857600080fd5b506104a060aa5481565b34801561069e57600080fd5b506104a06845636f73797374656d60b81b81565b3480156106be57600080fd5b506105636106cd366004617710565b6117db565b3480156106de57600080fd5b506105636106ed3660046176da565b611e5b565b3480156106fe57600080fd5b506104a061070d366004617876565b611f40565b34801561071e57600080fd5b506104a07fbe90e461bbdb9a95a694f7796912ea04244caf7f5b60ad7ded17e16821d3e44c81565b34801561075257600080fd5b506105636107613660046178b2565b612458565b34801561077257600080fd5b506104a07f2a268972a70c8c688b62366bdfdd9bb09cf19d3e5b6e7e7bb158e671ffdcedd281565b3480156107a657600080fd5b506104a06107b53660046178f4565b612553565b3480156107c657600080fd5b506104a07fdd5a41a7fc01f5c6d30816b17f638d6531625f1e1eaa599673ab2f6079f2dd9d81565b3480156107fa57600080fd5b506104a06a4d61696e74656e616e636560a81b81565b34801561081c57600080fd5b506104a07f77884798208df1e64f70968be41ef2d3211ec53613397ca59313416813df088881565b34801561085057600080fd5b5061057a61085f3660046176da565b6127e7565b34801561087057600080fd5b5061088461087f3660046176f7565b612804565b6040516104aa94939291906179ca565b6105636108a2366004617a15565b6129e1565b3480156108b357600080fd5b506104a0612a9a565b3480156108c857600080fd5b506104a06c14dd185ada5b99d4995dd85c99609a1b81565b3480156108ec57600080fd5b506104a0612b4d565b34801561090157600080fd5b506104a07f9f1de481f899d76889aa8a2b44cc7b604d42691aa93d4ba618a1a1fd439f505081565b34801561093557600080fd5b506104a07fe10074dceffb75f13bf0ce50145afd35182d63796823f1280ce40e01c19109e781565b34801561096957600080fd5b50610563612b94565b34801561097e57600080fd5b506104a07111dbdd995c9b985b98d950dbdb9d1c9858dd60721b81565b3480156109a757600080fd5b506104a07fc69fc6b7d0efc934fd5a3581c7253a7107a952526bb6dbcd814ef8d8dae1f44a81565b3480156109db57600080fd5b5061057a6109ea3660046176da565b6001600160a01b03166000908152606d6020526040902054151590565b348015610a1357600080fd5b50610536610a223660046176da565b612c82565b348015610a3357600080fd5b506104a07f0b09c9badbbeb6c813a598ee910770a39ccda797a1940439bb6e47fc6c87548b81565b348015610a6757600080fd5b50610563612cf1565b348015610a7c57600080fd5b506074546104a0565b348015610a9157600080fd5b50606554610536906001600160a01b031681565b348015610ab157600080fd5b506104a07f9346226931826838eedd13d9677fa33551e7c81f604b171ef3fac355458da9aa81565b348015610ae557600080fd5b506104a069456e7653746f7261676560b01b81565b348015610b0657600080fd5b506104a060665481565b348015610b1c57600080fd5b506104a0610b2b366004617a64565b612d05565b348015610b3c57600080fd5b506104a0610b4b3660046176da565b613063565b348015610b5c57600080fd5b506033546001600160a01b0316610536565b348015610b7a57600080fd5b506104a061271081565b348015610b9057600080fd5b506104a06c42616c6c6f7453746f7261676560981b81565b348015610bb457600080fd5b506104a0610bc33660046176da565b606d6020526000908152604090205481565b348015610be157600080fd5b5061057a610bf03660046176da565b6138f5565b348015610c0157600080fd5b506104a07f6c6f69f426081752a5d3e73746599acd2a4cb145d5de4203ca1e3473b281680b81565b348015610c3557600080fd5b5061057a610c443660046176da565b6001600160a01b0316600090815260686020526040902054151590565b348015610c6d57600080fd5b506104a0610c7c366004617ad8565b613938565b348015610c8d57600080fd5b50610563610c9c366004617b36565b614094565b348015610cad57600080fd5b50610563610cbc3660046176da565b6144fd565b348015610ccd57600080fd5b506104a07f89dd490ecaf395283ed4ff2fd9557ca767fc425dce063451a9b0da6d72f600c381565b348015610d0157600080fd5b506104a0610d103660046176da565b606b6020526000908152604090205481565b348015610d2e57600080fd5b50610536610d3d3660046176f7565b6000908152606c60205260409020546001600160a01b031690565b348015610d6457600080fd5b506104a06145a5565b348015610d7957600080fd5b506104a07f829561ab7af084b7efc6600518d2df79b8d95f3f4c3a550f54f8f7ec7d2b805781565b348015610dad57600080fd5b506104a07f18ad4415ef4a621ce1a136395c51ab6c3712bb2e24b79d526059925cea58dcb881565b348015610de157600080fd5b506104a07f8086da5becff4dfac91a3105821b361078d2d4abba0ccc2401b974cf0dcf05c181565b348015610e1557600080fd5b506104a07fb38b2c133e931937bd95337c65c8aefa7040ed64bbed732e3e29a4944c65747381565b348015610e4957600080fd5b506104a07fc9e15e34073efbcd0328740feaf503caac9124b55b38c73d1a97b53da80a2f6081565b348015610e7d57600080fd5b506104a07f04f7b94450bbcad85f37ea47cd1062728f884bb2040e357738f8fd53056134bc81565b348015610eb157600080fd5b50610563610ec0366004617bf0565b6145ec565b348015610ed157600080fd5b506104a06147e1565b348015610ee657600080fd5b506104a0610ef53660046176da565b6001600160a01b031660009081526072602052604090205490565b348015610f1c57600080fd5b506104a0610f2b3660046176da565b60686020526000908152604090205481565b348015610f4957600080fd5b50610536610f583660046176f7565b6000908152606760205260409020546001600160a01b031690565b348015610f7f57600080fd5b506104a060755481565b348015610f9557600080fd5b506069546104a0565b348015610faa57600080fd5b506077546104a0565b348015610fbf57600080fd5b50610563610fce3660046176f7565b614828565b348015610fdf57600080fd5b506113896104a0565b348015610ff457600080fd5b506104a060765481565b34801561100a57600080fd5b506105636110193660046176da565b6148ae565b34801561102a57600080fd5b506104a07f7c1150f0e1a39ff55552d52764f97e6c387e2a247e1df344369f122c4254be2f81565b600061105c614924565b60405163288c314960e21b81523360048201526001600160a01b03919091169063a230c52490602401602060405180830381865afa1580156110a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110c69190617c20565b6110eb5760405162461bcd60e51b81526004016110e290617c3d565b60405180910390fd5b60006110f633612c82565b60aa546001600160a01b038216600090815260ab6020526040902054919250906111209042617c7a565b101561113e5760405162461bcd60e51b81526004016110e290617c91565b600061114933612c82565b9050611153612b4d565b61115c82614944565b11158015611179575061116d6145a5565b61117682614944565b10155b6111955760405162461bcd60e51b81526004016110e290617cc8565b6001600160a01b0386166111eb5760405162461bcd60e51b815260206004820152601d60248201527f496d706c656d656e746174696f6e2063616e6e6f74206265207a65726f00000060448201526064016110e2565b6111f36149bb565b6001600160a01b0316866001600160a01b03160361124b5760405162461bcd60e51b815260206004820152601560248201527453616d6520636f6e7472616374206164647265737360581b60448201526064016110e2565b856001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156112a5575060408051601f3d908101601f191682019092526112a291810190617cff565b60015b6112c15760405162461bcd60e51b81526004016110e290617d18565b60008051602061850c83398151915281146112ee5760405162461bcd60e51b81526004016110e290617d66565b506075546112fd906001617daf565b92506113076149d7565b6001600160a01b0316630a3a63fe60755460016113249190617daf565b60046040516001600160e01b031960e085901b16815260048101929092526024820152604481018790523360648201526001600160a01b038916608482015260a4016020604051808303816000875af1158015611385573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113a99190617cff565b506113b483866149f2565b5060758290556001600160a01b0316600090815260ab602052604090204290559392505050565b600054600290610100900460ff161580156113fd575060005460ff8083169116105b6114195760405162461bcd60e51b81526004016110e290617dc7565b6000805461ffff191660ff831617610100179055611435614a5d565b60005b6069548110156116e65760008181526071602052604080822081516080810190925280548290829061146990617e15565b80601f016020809104026020016040519081016040528092919081815260200182805461149590617e15565b80156114e25780601f106114b7576101008083540402835291602001916114e2565b820191906000526020600020905b8154815290600101906020018083116114c557829003601f168201915b505050505081526020016001820180546114fb90617e15565b80601f016020809104026020016040519081016040528092919081815260200182805461152790617e15565b80156115745780601f1061154957610100808354040283529160200191611574565b820191906000526020600020905b81548152906001019060200180831161155757829003601f168201915b5050505050815260200160028201805461158d90617e15565b80601f01602080910402602001604051908101604052809291908181526020018280546115b990617e15565b80156116065780601f106115db57610100808354040283529160200191611606565b820191906000526020600020905b8154815290600101906020018083116115e957829003601f168201915b5050505050815260200160038201548152505090506001606e82600001516040516116319190617e49565b90815260405160209181900382018120805460ff191693151593909317909255820151600191606f9161166391617e49565b908152602001604051809103902060006101000a81548160ff021916908315150217905550600160706000836040015184606001516040516020016116a9929190617e65565b60408051808303601f19018152918152815160209283012083529082019290925201600020805460ff191691151591909117905550600101611438565b506000805461ff001916905560405160ff8216815260008051602061852c833981519152906020015b60405180910390a150565b6000607754600014611765576000611733607754614ab7565b509150506000611744607754614b3f565b50915050600119820161176257428110156117625760009250505090565b50505b50600190565b6000611775614bba565b6001600160a01b03166333be496e6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117d69190617cff565b905090565b600054610100900460ff16158080156117fb5750600054600160ff909116105b806118155750303b158015611815575060005460ff166001145b6118315760405162461bcd60e51b81526004016110e290617dc7565b6000805460ff191660011790558015611854576000805461ff0019166101001790555b61185c614bd2565b611864614c01565b61186d846144fd565b43606655600061187b614c30565b90506118856145a5565b841015801561189b575083611898612b4d565b10155b6118b75760405162461bcd60e51b81526004016110e290617e87565b600080600060608060606000806000905060008060208d0191508c51826118de9190617daf565b90505b80821015611e0c57815199506118f8602083617daf565b915080821061190657600080fd5b81519850611915602083617daf565b915080821061192357600080fd5b81519750611932602083617daf565b915080821061194057600080fd5b819650865160206119519190617daf565b61195b9083617daf565b915080821061196957600080fd5b8195508551602061197a9190617daf565b6119849083617daf565b915080821061199257600080fd5b819450845160206119a39190617daf565b6119ad9083617daf565b91508082106119bb57600080fd5b815193506119ca602083617daf565b91506119d7600184617daf565b92506119e28a6138f5565b1580156119f557506119f3896138f5565b155b8015611a075750611a05886127e7565b155b611a445760405162461bcd60e51b815260206004820152600e60248201526d20b63932b0b23c9036b2b6b132b960911b60448201526064016110e2565b886067600085815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555082606860008b6001600160a01b03166001600160a01b031681526020019081526020016000208190555087606a600085815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555082606b60008a6001600160a01b03166001600160a01b031681526020019081526020016000208190555089606c600085815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555082606d60008c6001600160a01b03166001600160a01b0316815260200190815260200160002081905550886001600160a01b03168a6001600160a01b03167f6a2af11b2d73f347f9d5840aea46899e17609730b5cd91bd9c312098038acba660405160405180910390a36040516325d998bb60e01b81526001600160a01b038b811660048301528f91908d16906325d998bb90602401602060405180830381865afa158015611bf3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c179190617cff565b1015611c5c5760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e74207374616b696e6760601b60448201526064016110e2565b611c6887878787614c45565b611c845760405162461bcd60e51b81526004016110e290617eb4565b611c8e8a8f614cf4565b600083815260716020908152604090912088519091611cb19183918b019061742c565b508651611cc790600183019060208a019061742c565b508551611cdd906002830190602089019061742c565b508481600301819055506001606e89604051611cf99190617e49565b908152604051908190036020018120805492151560ff1990931692909217909155600190606f90611d2b908a90617e49565b908152602001604051809103902060006101000a81548160ff0219169083151502179055506001607060008888604051602001611d69929190617e65565b60405160208183030381529060405280519060200120815260200190815260200160002060006101000a81548160ff0219169083151502179055508a6073600086815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555083607260008d6001600160a01b03166001600160a01b0316815260200190815260200160002081905550506118e1565b50506069819055607455505086159550611e55945050505050576000805461ff00191690556040516001815260008051602061852c833981519152906020015b60405180910390a15b50505050565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003611ea35760405162461bcd60e51b81526004016110e290617ee2565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611ed56149bb565b6001600160a01b031614611efb5760405162461bcd60e51b81526004016110e290617f2e565b611f0481614d33565b611f3d8160005b6040519080825280601f01601f191660200182016040528015611f35576020820181803683370190505b506000614dc1565b50565b6000611f4a614924565b60405163288c314960e21b81523360048201526001600160a01b03919091169063a230c52490602401602060405180830381865afa158015611f90573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fb49190617c20565b611fd05760405162461bcd60e51b81526004016110e290617c3d565b6000611fdb33612c82565b60aa546001600160a01b038216600090815260ab6020526040902054919250906120059042617c7a565b10156120235760405162461bcd60e51b81526004016110e290617c91565b600061202e33612c82565b9050612038612b4d565b61204182614944565b1115801561205e57506120526145a5565b61205b82614944565b10155b61207a5760405162461bcd60e51b81526004016110e290617cc8565b602084015184906001600160a01b03166120c65760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b2103b37ba32b960991b60448201526064016110e2565b60008160600151511161210f5760405162461bcd60e51b8152602060048201526011602482015270496e76616c6964206e6f6465206e616d6560781b60448201526064016110e2565b60008160a0015151116121565760405162461bcd60e51b815260206004820152600f60248201526e0496e76616c6964206e6f646520495608c1b60448201526064016110e2565b60008160c001511161219e5760405162461bcd60e51b8152602060048201526011602482015270125b9d985b1a59081b9bd919481c1bdc9d607a1b60448201526064016110e2565b6000816080015151116121e85760405162461bcd60e51b8152602060048201526012602482015271496e76616c6964206e6f646520656e6f646560701b60448201526064016110e2565b6000816101000151511161222d5760405162461bcd60e51b815260206004820152600c60248201526b496e76616c6964206d656d6f60a01b60448201526064016110e2565b6000816101200151116122755760405162461bcd60e51b815260206004820152601060248201526f24b73b30b634b210323ab930ba34b7b760811b60448201526064016110e2565b61227d6145a5565b8160e001511015801561229b5750612293612b4d565b8160e0015111155b6122dd5760405162461bcd60e51b8152602060048201526013602482015272125b9d985b1a59081b1bd8dac8105b5bdd5b9d606a1b60448201526064016110e2565b84516122e8906138f5565b1580156122fd575084516122fb906127e7565b155b61233a5760405162461bcd60e51b815260206004820152600e60248201526d20b63932b0b23c9036b2b6b132b960911b60448201526064016110e2565b84602001516001600160a01b031685600001516001600160a01b031614801561237c575084604001516001600160a01b031685600001516001600160a01b0316145b6123be5760405162461bcd60e51b815260206004820152601360248201527229ba30b5b2b91034b9903737ba103b37ba32b960691b60448201526064016110e2565b6123da856060015186608001518760a001518860c00151614c45565b6123f65760405162461bcd60e51b81526004016110e290617eb4565b607554612404906001617daf565b935061241584600133600089614ea8565b612423848660e00151614f4b565b612432848661010001516149f2565b505060758290556001600160a01b0316600090815260ab60205260409020429055919050565b600054610100900460ff16158080156124785750600054600160ff909116105b806124925750303b158015612492575060005460ff166001145b6124ae5760405162461bcd60e51b81526004016110e290617dc7565b6000805460ff1916600117905580156124d1576000805461ff0019166101001790555b6124d9614bd2565b6124e1614c01565b6124ea846144fd565b60668390556124f8826148ae565b60405133907fab2db0a6f442428b686ffa80eadcaabe7d5ee00049c6ae888a237edd3238d85690600090a28015611e55576000805461ff00191690556040516001815260008051602061852c83398151915290602001611e4c565b600061255d614924565b60405163288c314960e21b81523360048201526001600160a01b03919091169063a230c52490602401602060405180830381865afa1580156125a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125c79190617c20565b6125e35760405162461bcd60e51b81526004016110e290617c3d565b60006125ee33612c82565b60aa546001600160a01b038216600090815260ab6020526040902054919250906126189042617c7a565b10156126365760405162461bcd60e51b81526004016110e290617c91565b600061264133612c82565b905061264b612b4d565b61265482614944565b1115801561267157506126656145a5565b61266e82614944565b10155b61268d5760405162461bcd60e51b81526004016110e290617cc8565b8660011115801561269f575060098711155b6126da5760405162461bcd60e51b815260206004820152600c60248201526b496e76616c6964207479706560a01b60448201526064016110e2565b6126e48887614f89565b6127205760405162461bcd60e51b815260206004820152600d60248201526c496e76616c69642076616c756560981b60448201526064016110e2565b60755461272e906001617daf565b92506127386149d7565b6001600160a01b0316634a57823e84600587338d8d8d6040518863ffffffff1660e01b81526004016127709796959493929190617f7a565b6020604051808303816000875af115801561278f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127b39190617cff565b506127be83866149f2565b5060758290556001600160a01b0316600090815260ab6020526040902042905595945050505050565b6001600160a01b03166000908152606b6020526040902054151590565b60008181526071602052604081206003810154815460609384938493919290916001830191600284019190849061283a90617e15565b80601f016020809104026020016040519081016040528092919081815260200182805461286690617e15565b80156128b35780601f10612888576101008083540402835291602001916128b3565b820191906000526020600020905b81548152906001019060200180831161289657829003601f168201915b505050505093508280546128c690617e15565b80601f01602080910402602001604051908101604052809291908181526020018280546128f290617e15565b801561293f5780601f106129145761010080835404028352916020019161293f565b820191906000526020600020905b81548152906001019060200180831161292257829003601f168201915b5050505050925081805461295290617e15565b80601f016020809104026020016040519081016040528092919081815260200182805461297e90617e15565b80156129cb5780601f106129a0576101008083540402835291602001916129cb565b820191906000526020600020905b8154815290600101906020018083116129ae57829003601f168201915b5050505050915093509350935093509193509193565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003612a295760405162461bcd60e51b81526004016110e290617ee2565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316612a5b6149bb565b6001600160a01b031614612a815760405162461bcd60e51b81526004016110e290617f2e565b612a8a82614d33565b612a9682826001614dc1565b5050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614612b3a5760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c000000000000000060648201526084016110e2565b5060008051602061850c83398151915290565b6000612b57614bba565b6001600160a01b031663737c59b86040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117b2573d6000803e3d6000fd5b612b9c614924565b60405163288c314960e21b81523360048201526001600160a01b03919091169063a230c52490602401602060405180830381865afa158015612be2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c069190617c20565b612c225760405162461bcd60e51b81526004016110e290617c3d565b612c2a61171a565b15612c6d5760405162461bcd60e51b8152602060048201526013602482015272159bdd1a5b99c81a5cc81b9bdd08195b991959606a1b60448201526064016110e2565b607754612c7b906004615008565b6000607755565b6001600160a01b0381166000908152606d602052604081205415612ca4575090565b6001600160a01b03821660009081526068602052604090205415612cec57506001600160a01b038082166000908152606860209081526040808320548352606c909152902054165b919050565b612cf9614a5d565b612d036000615046565b565b6000612d0f614924565b60405163288c314960e21b81523360048201526001600160a01b03919091169063a230c52490602401602060405180830381865afa158015612d55573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d799190617c20565b612d955760405162461bcd60e51b81526004016110e290617c3d565b6000612da033612c82565b60aa546001600160a01b038216600090815260ab602052604090205491925090612dca9042617c7a565b1015612de85760405162461bcd60e51b81526004016110e290617c91565b6000612df333612c82565b9050612dfd612b4d565b612e0682614944565b11158015612e235750612e176145a5565b612e2082614944565b10155b612e3f5760405162461bcd60e51b81526004016110e290617cc8565b6001600160a01b038916612e875760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b60448201526064016110e2565b612e90896138f5565b612ec95760405162461bcd60e51b815260206004820152600a6024820152692737b716b6b2b6b132b960b11b60448201526064016110e2565b6001612ed460695490565b11612f215760405162461bcd60e51b815260206004820152601b60248201527f43616e6e6f742072656d6f7665206120736f6c65206d656d626572000000000060448201526064016110e2565b87612f2b8a614944565b1015612f8c5760405162461bcd60e51b815260206004820152602a60248201527f496e73756666696369656e742062616c616e636520746861742063616e206265604482015269103ab73637b1b5b2b21760b11b60648201526084016110e2565b607554612f9a906001617daf565b604080516101408101825260008082526020808301829052828401829052835182815280820185526060840152835182815280820185526080840152835182815290810190935260a082019290925260c081019190915260e081018a905261010081018990526101208101889052909350613019846002338d85614ea8565b613023848a614f4b565b61302d84896149f2565b613038848787615098565b505060758290556001600160a01b0316600090815260ab602052604090204290559695505050505050565b60008054610100900460ff16158080156130845750600054600160ff909116105b8061309e5750303b15801561309e575060005460ff166001145b6130ba5760405162461bcd60e51b81526004016110e290617dc7565b6000805460ff1916600117905580156130dd576000805461ff0019166101001790555b6130e5614bd2565b6130ed614c01565b6000839050613157816001600160a01b031663738fdd1a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613133573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cbc9190617fc6565b436066819055506131c3816001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561319f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110199190617fc6565b60015b816001600160a01b031663d965ea006040518163ffffffff1660e01b8152600401602060405180830381865afa158015613204573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132289190617cff565b81116137185760405163ab3545e560e01b8152600481018290526001600160a01b0383169063ab3545e590602401602060405180830381865afa158015613273573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132979190617fc6565b6000828152606c6020908152604080832080546001600160a01b0319166001600160a01b039586169081179091558352606d909152908190208390555163341effc360e21b8152600481018390529083169063d07bff0c90602401602060405180830381865afa15801561330f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133339190617fc6565b600082815260676020908152604080832080546001600160a01b0319166001600160a01b03958616908117909155835260689091529081902083905551631c4b774b60e01b81526004810183905290831690631c4b774b90602401602060405180830381865afa1580156133ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133cf9190617fc6565b6000828152606a6020908152604080832080546001600160a01b0319166001600160a01b03959095169485179055928252606b8152828220849055606984905582516080810184526060808252918101829052928301819052820152604051634f0f4aa960e01b8152600481018390526001600160a01b03841690634f0f4aa990602401600060405180830381865afa158015613470573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526134989190810190618033565b6060850181905260408501829052602085018390528385526134bd9392919085615107565b6135095760405162461bcd60e51b815260206004820152601760248201527f6e6f646520696e666f206973206475706c69636174656400000000000000000060448201526064016110e2565b6001606e826000015160405161351f9190617e49565b90815260405160209181900382018120805460ff191693151593909317909255820151600191606f9161355191617e49565b908152602001604051809103902060006101000a81548160ff02191690831515021790555060016070600083604001518460600151604051602001613597929190617e65565b60408051808303601f1901815291815281516020928301208352828201939093529082016000908120805460ff1916941515949094179093558483526071815291208251805184936135ed92849291019061742c565b506020828101518051613606926001850192019061742c565b506040820151805161362291600284019160209091019061742c565b50606091909101516003909101556000828152606c6020818152604080842080546001600160a01b039081168652607284528286208890558786528154607385529583902080546001600160a01b031916968216969096179095556074879055929091529054905163139d9dd360e01b815290821660048201529084169063139d9dd390602401602060405180830381865afa1580156136c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136ea9190617cff565b6000838152606c60209081526040808320546001600160a01b0316835260ab909152902055506001016131c6565b50806001600160a01b0316633310569c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613757573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061377b9190617cff565b60aa81905550806001600160a01b031663d6f9cfce6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156137bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137e39190617cff565b607581905550806001600160a01b031663e9523fb56040518163ffffffff1660e01b8152600401602060405180830381865afa158015613827573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061384b9190617cff565b607681905550806001600160a01b031663de09b3776040518163ffffffff1660e01b8152600401602060405180830381865afa15801561388f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138b39190617cff565b607755506000915080156138ef576000805461ff00191690556040516001815260008051602061852c8339815191529060200160405180910390a15b50919050565b6001600160a01b0381166000908152606d602052604081205415158061393257506001600160a01b03821660009081526068602052604090205415155b92915050565b6000613942614924565b60405163288c314960e21b81523360048201526001600160a01b03919091169063a230c52490602401602060405180830381865afa158015613988573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139ac9190617c20565b6139c85760405162461bcd60e51b81526004016110e290617c3d565b60006139d333612c82565b60aa546001600160a01b038216600090815260ab6020526040902054919250906139fd9042617c7a565b1015613a1b5760405162461bcd60e51b81526004016110e290617c91565b6000613a2633612c82565b9050613a30612b4d565b613a3982614944565b11158015613a565750613a4a6145a5565b613a5382614944565b10155b613a725760405162461bcd60e51b81526004016110e290617cc8565b602087015187906001600160a01b0316613abe5760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b2103b37ba32b960991b60448201526064016110e2565b600081606001515111613b075760405162461bcd60e51b8152602060048201526011602482015270496e76616c6964206e6f6465206e616d6560781b60448201526064016110e2565b60008160a001515111613b4e5760405162461bcd60e51b815260206004820152600f60248201526e0496e76616c6964206e6f646520495608c1b60448201526064016110e2565b60008160c0015111613b965760405162461bcd60e51b8152602060048201526011602482015270125b9d985b1a59081b9bd919481c1bdc9d607a1b60448201526064016110e2565b600081608001515111613be05760405162461bcd60e51b8152602060048201526012602482015271496e76616c6964206e6f646520656e6f646560701b60448201526064016110e2565b60008161010001515111613c255760405162461bcd60e51b815260206004820152600c60248201526b496e76616c6964206d656d6f60a01b60448201526064016110e2565b600081610120015111613c6d5760405162461bcd60e51b815260206004820152601060248201526f24b73b30b634b210323ab930ba34b7b760811b60448201526064016110e2565b613c756145a5565b8160e0015110158015613c935750613c8b612b4d565b8160e0015111155b613cd55760405162461bcd60e51b8152602060048201526013602482015272125b9d985b1a59081b1bd8dac8105b5bdd5b9d606a1b60448201526064016110e2565b6001600160a01b038716613d215760405162461bcd60e51b8152602060048201526013602482015272496e76616c6964206f6c64204164647265737360681b60448201526064016110e2565b613d2a876138f5565b613d635760405162461bcd60e51b815260206004820152600a6024820152692737b716b6b2b6b132b960b11b60448201526064016110e2565b6020808901516001600160a01b038981166000908152606d8452604080822054825260679094529290922054821691161480613db45750866001600160a01b031688602001516001600160a01b0316145b80613dde5750613dc788602001516138f5565b158015613dde5750613ddc88602001516127e7565b155b8015613e6057506040808901516001600160a01b038981166000908152606d6020908152848220548252606a90529290922054821691161480613e365750866001600160a01b031688604001516001600160a01b0316145b80613e605750613e4988604001516138f5565b158015613e605750613e5e88604001516127e7565b155b613e9f5760405162461bcd60e51b815260206004820152601060248201526f20b63932b0b23c90309036b2b6b132b960811b60448201526064016110e2565b336001600160a01b038816148015613ec3575087516001600160a01b038881169116145b15613f185785158015613ed4575084155b613f135760405162461bcd60e51b815260206004820152601060248201526f125b9d985b1a59081c1c9bdc1bdcd85b60821b60448201526064016110e2565b613fc7565b87516001600160a01b03888116911614613fc757613f346145a5565b613f3e8688617daf565b1115613fc75760405162461bcd60e51b815260206004820152604c60248201527f496e76616c696420616d6f756e743a2028756e6c6f636b416d6f756e74202b2060448201527f736c617368696e6729206d75737420626520657175616c206f72206c6f77207460648201526b6f206d696e5374616b696e6760a01b608482015260a4016110e2565b607554613fd5906001617daf565b9350613fe5846003338a8c614ea8565b613ff3848960e00151614f4b565b614002848961010001516149f2565b61400d848787615098565b6075849055336001600160a01b038816148015614036575087516001600160a01b038881169116145b1561407057600061404685614b3f565b925050506140608542834261405b9190617daf565b615230565b61406e856003600180615275565b505b50506001600160a01b0316600090815260ab60205260409020429055949350505050565b600054610100900460ff16158080156140b45750600054600160ff909116105b806140ce5750303b1580156140ce575060005460ff166001145b6140ea5760405162461bcd60e51b81526004016110e290617dc7565b6000805460ff19166001179055801561410d576000805461ff0019166101001790555b614115614bd2565b61411d614c01565b614126876144fd565b61412e6145a5565b8610158015614144575085614141612b4d565b10155b6141605760405162461bcd60e51b81526004016110e290617e87565b600061416a614c30565b6040516325d998bb60e01b815233600482015290915087906001600160a01b038316906325d998bb90602401602060405180830381865afa1580156141b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141d79190617cff565b101561421c5760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e74207374616b696e6760601b60448201526064016110e2565b60405163282d3fdf60e01b8152336004820152602481018890526001600160a01b0382169063282d3fdf90604401600060405180830381600087803b15801561426457600080fd5b505af1158015614278573d6000803e3d6000fd5b5050600160698190557f6bee784efeb983674392298ab585b22866bedf00ebb0eea949d1e66f3f50e71d8054336001600160a01b0319918216811790925560008281526068602090815260408083208690557ff585789965ba69220d5ce3dc1b444eb22ff546f2650694fef8fafe9c26560af98054851686179055606b82528083208690557fdcf345d7f6a8deb7427d0fee62009fa15100353a1c666b51bb5387b25addcfa98054909416909417909255606d825291822083905560748390559190526071815288517f169c6be1b0e6ab5de76b532e587a77340130ac65c5591db02be822dcf1dc0ed69350614373925083918a019061742c565b508551614389906001830190602089019061742c565b50845161439f906002830190602088019061742c565b508381600301819055506001606e886040516143bb9190617e49565b908152604051908190036020018120805492151560ff1990931692909217909155600190606f906143ed908990617e49565b908152602001604051809103902060006101000a81548160ff021916908315150217905550600160706000878760405160200161442b929190617e65565b60408051808303601f1901815291815281516020928301208352828201939093529082016000908120805460ff1916941515949094179093556074543380855260728352838520829055908452607390915281832080546001600160a01b03191682179055436066559051909182917f6a2af11b2d73f347f9d5840aea46899e17609730b5cd91bd9c312098038acba69190a3505080156144f4576000805461ff00191690556040516001815260008051602061852c8339815191529060200160405180910390a15b50505050505050565b614505614a5d565b6001600160a01b03811661455b5760405162461bcd60e51b815260206004820152601a60248201527f416464726573732073686f756c64206265206e6f6e2d7a65726f00000000000060448201526064016110e2565b606580546001600160a01b0319166001600160a01b0383169081179091556040517f278c70ced5f3e0e5eeb385b5ff9cb735748ba00a625147e66065ed48fc1562cd90600090a250565b60006145af614bba565b6001600160a01b031663076cd77f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117b2573d6000803e3d6000fd5b60026078540361463e5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016110e2565b600260785561464b614924565b60405163288c314960e21b81523360048201526001600160a01b03919091169063a230c52490602401602060405180830381865afa158015614691573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906146b59190617c20565b6146d15760405162461bcd60e51b81526004016110e290617c3d565b60006146dc33612c82565b90506146e6612b4d565b6146ef82614944565b1115801561470c57506147006145a5565b61470982614944565b10155b6147285760405162461bcd60e51b81526004016110e290617cc8565b61473061171a565b6147665760405162461bcd60e51b8152602060048201526007602482015266115e1c1a5c995960ca1b60448201526064016110e2565b600061477184615300565b905061477d8484615413565b600080614789866154ed565b9250925050600061479961138990565b905080831015806147aa5750808210155b806147bf57506147ba8284617daf565b612710145b156147d3576147d387858486116000615275565b505060016078555050505050565b60006147eb614bba565b6001600160a01b0316631b27e01b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117b2573d6000803e3d6000fd5b614830614a5d565b610e1081106148795760405162461bcd60e51b81526020600482015260156024820152746e6577506572696f6420697320746f6f206c6f6e6760581b60448201526064016110e2565b60aa8190556040518181527f17c6f1d1ce638844b664872f5c6eecb7d150ec0c41187d7f85826a656ee7946f9060200161170f565b6148b6614a5d565b6001600160a01b03811661491b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016110e2565b611f3d81615046565b60006117d67111dbdd995c9b985b98d950dbdb9d1c9858dd60721b615527565b600061494e614c30565b604051632c9aab9b60e11b81526001600160a01b03848116600483015291909116906359355736906024015b602060405180830381865afa158015614997573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139329190617cff565b60008051602061850c833981519152546001600160a01b031690565b60006117d66c42616c6c6f7453746f7261676560981b615527565b6149fa6149d7565b6001600160a01b031663bce0dbc183836040518363ffffffff1660e01b8152600401614a279291906180c2565b600060405180830381600087803b158015614a4157600080fd5b505af1158015614a55573d6000803e3d6000fd5b505050505050565b6033546001600160a01b03163314612d035760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016110e2565b6000806000614ac46149d7565b6001600160a01b031663688ca5b2856040518263ffffffff1660e01b8152600401614af191815260200190565b606060405180830381865afa158015614b0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614b3291906180db565b9250925092509193909250565b6000806000614b4c6149d7565b6001600160a01b03166309970688856040518263ffffffff1660e01b8152600401614b7991815260200190565b606060405180830381865afa158015614b96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614b329190618109565b60006117d669456e7653746f7261676560b01b615527565b600054610100900460ff16614bf95760405162461bcd60e51b81526004016110e290618137565b612d03615595565b600054610100900460ff16614c285760405162461bcd60e51b81526004016110e290618137565b612d036155c3565b60006117d6665374616b696e6760c81b615527565b604051600190606f90614c59908690617e49565b9081526040519081900360200190205460ff1615614c75575060005b606e85604051614c859190617e49565b9081526040519081900360200190205460ff1615614ca1575060005b60008383604051602001614cb6929190617e65565b60408051601f1981840301815291815281516020928301206000818152607090935291205490915060ff1615614ceb57600091505b50949350505050565b614cfc614c30565b60405163282d3fdf60e01b81526001600160a01b03848116600483015260248201849052919091169063282d3fdf90604401614a27565b614d3b614924565b60405163288c314960e21b81523360048201526001600160a01b03919091169063a230c52490602401602060405180830381865afa158015614d81573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614da59190617c20565b611f3d5760405162461bcd60e51b81526004016110e290617c3d565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615614df957614df4836155f3565b505050565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015614e53575060408051601f3d908101601f19168201909252614e5091810190617cff565b60015b614e6f5760405162461bcd60e51b81526004016110e290617d18565b60008051602061850c8339815191528114614e9c5760405162461bcd60e51b81526004016110e290617d66565b50614df483838361568f565b614eb06149d7565b6001600160a01b031663daacbb95868684610120015187878760000151886020015189604001518a606001518b608001518c60a001518d60c001516040518d63ffffffff1660e01b8152600401614f129c9b9a99989796959493929190618182565b600060405180830381600087803b158015614f2c57600080fd5b505af1158015614f40573d6000803e3d6000fd5b505050505050505050565b614f536149d7565b604051633968764960e11b815260048101849052602481018390526001600160a01b0391909116906372d0ec9290604401614a27565b6000614f93614bba565b6001600160a01b0316639801bff984846040518363ffffffff1660e01b8152600401614fc09291906180c2565b602060405180830381865afa158015614fdd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906150019190617c20565b9392505050565b6150106149d7565b60405163548f2cdd60e11b815260048101849052602481018390526001600160a01b03919091169063a91e59ba90604401614a27565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6150a06149d7565b604051632264085960e01b81526004810185905260248101849052604481018390526001600160a01b0391909116906322640859906064015b600060405180830381600087803b1580156150f357600080fd5b505af11580156144f4573d6000803e3d6000fd5b60006001905084805190602001208260200151805190602001201415801561514e5750606f8560405161513a9190617e49565b9081526040519081900360200190205460ff165b15615157575060005b8580519060200120826000015180519060200120141580156151985750606e866040516151849190617e49565b9081526040519081900360200190205460ff165b156151a1575060005b600084846040516020016151b6929190617e65565b60405160208183030381529060405280519060200120905080836040015184606001516040516020016151ea929190617e65565b604051602081830303815290604052805190602001201415801561521c575060008181526070602052604090205460ff165b1561522657600091505b5095945050505050565b6152386149d7565b60405163605b78c360e11b81526004810185905260248101849052604481018390526001600160a01b03919091169063c0b6f186906064016150d9565b600482156152e457506003600019840161529f57615292856156b4565b61529a575060045b6152e4565b600284036152b05761529a85615bbe565b600384036152c25761529285836160fe565b600484036152d35761529a85616698565b600584036152e4576152e485616748565b6152ee8582615008565b816152f95760006077555b5050505050565b600080600061530e84614ab7565b509092509050600181036153ac576077541561533c5760405162461bcd60e51b81526004016110e29061821f565b600061534785614b3f565b9250505061535361176b565b81101561537657615371854261536761176b565b61405b9042617daf565b6153a1565b8061537f6147e1565b10156153925761537185426153676147e1565b6153a1854261405b8482617daf565b50607784905561540c565b600281036153da5760775484146153d55760405162461bcd60e51b81526004016110e29061821f565b61540c565b60405162461bcd60e51b8152602060048201526007602482015266115e1c1a5c995960ca1b60448201526064016110e2565b5092915050565b600060765460016154249190617daf565b9050600061543133612c82565b9050600061543e60695490565b61544a90612710618262565b905060008461545a57600261545d565b60015b90506154676149d7565b6040516325918ae760e21b815260048101869052602481018890526001600160a01b038581166044830152606482018490526084820185905291909116906396462b9c9060a401600060405180830381600087803b1580156154c857600080fd5b505af11580156154dc573d6000803e3d6000fd5b505050607694909455505050505050565b60008060006154fa6149d7565b6001600160a01b03166356ba988e856040518263ffffffff1660e01b8152600401614b7991815260200190565b606554604051630d2020dd60e01b8152600481018390526000916001600160a01b031690630d2020dd90602401602060405180830381865afa158015615571573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139329190617fc6565b600054610100900460ff166155bc5760405162461bcd60e51b81526004016110e290618137565b6001607855565b600054610100900460ff166155ea5760405162461bcd60e51b81526004016110e290618137565b612d0333615046565b6001600160a01b0381163b6156605760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084016110e2565b60008051602061850c83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6156988361688c565b6000825111806156a55750805b15614df457611e5583836168cc565b60006156c18260016168f1565b6000806000806000806000806156d68a616a0d565b98509850985098509850985098509850506156f0886138f5565b1561574e578960008051602061854c8339815191526040516157369060208082526010908201526f20b63932b0b23c90309036b2b6b132b960811b604082015260600190565b60405180910390a25060009998505050505050505050565b615757866127e7565b1561579f578960008051602061854c8339815191526040516157369060208082526012908201527120b63932b0b23c9030903932bbb0b93232b960711b604082015260600190565b6157a76145a5565b8110806157ba5750806157b8612b4d565b105b156157db578960008051602061854c83398151915260405161573690617e87565b806157e589616ab4565b1015615807578960008051602061854c83398151915260405161573690618284565b866001600160a01b0316886001600160a01b03161415801561583b5750856001600160a01b0316886001600160a01b031614155b15615887578960008051602061854c83398151915260405161573690602080825260169082015275496e76616c6964206d656d626572206164647265737360501b604082015260600190565b6158918882614cf4565b600060695460016158a29190617daf565b9050876067600083815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555080606860008a6001600160a01b03166001600160a01b031681526020019081526020016000208190555086606a600083815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555080606b6000896001600160a01b03166001600160a01b031681526020019081526020016000208190555088606c600083815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555080606d60008b6001600160a01b03166001600160a01b0316815260200190815260200160002081905550600060745460016159db9190617daf565b6000818152607160209081526040909120895192935091615a01918391908b019061742c565b508651615a1790600183019060208a019061742c565b508551615a2d906002830190602089019061742c565b508481600301819055506001606e89604051615a499190617e49565b908152604051908190036020018120805492151560ff1990931692909217909155600190606f90615a7b908a90617e49565b908152602001604051809103902060006101000a81548160ff0219169083151502179055506001607060008888604051602001615ab9929190617e65565b60405160208183030381529060405280519060200120815260200190815260200160002060006101000a81548160ff0219169083151502179055508a6073600084815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555081607260008d6001600160a01b03166001600160a01b0316815260200190815260200160002081905550826069819055508160748190555043606681905550896001600160a01b03168b6001600160a01b03167f6a2af11b2d73f347f9d5840aea46899e17609730b5cd91bd9c312098038acba660405160405180910390a35060019c9b505050505050505050505050565b615bc98160026168f1565b6000615bd482616a0d565b50505050505050509050615be7816138f5565b615c3c578160008051602061854c833981519152604051615c30906020808252601490820152732737ba1030b63932b0b23c90309036b2b6b132b960611b604082015260600190565b60405180910390a25050565b6001600160a01b038082166000818152606d6020818152604080842054606954808652606c8452828620548287526067855283872054606a86529387205497909652939092529094928316939083169216908414615da457606980546000908152606c6020818152604080842080546001600160a01b038c8116808852606d80875285892080549e8a529787528589209087529b821688528488209c909c559486905581546001600160a01b03199081169092558954821690851617909855888452606b8083528185205486548652606a80855283872080548a881689528487528589208054948a529287528589209487528716808952858920939093559087905580548b16905581548a16179055978352606880825288842054945484526067808352898520805489861687528385528b872080548989529386528c8820949095529094168086529985205592905580548616905580549094168517909355919291615e21565b606980546000908152606c6020908152604080832080546001600160a01b03199081169091556001600160a01b038a81168552606d845282852085905585548552606a84528285208054831690558681168552606b8452828520859055945484526067835281842080549091169055928516825260689052908120555b6001606954615e309190617c7a565b6069556000848152607160205260408082209051909190606f90615e58906001850190618364565b908152604051908190036020018120805492151560ff1990931692909217909155600090606e90615e8a908490618364565b90815260405160209181900382018120805460ff19169315159390931790925560038301546000926070928492615ec692600288019201618370565b60408051808303601f1901815291815281516020928301208352828201939093529082016000908120805460ff1916941515949094179093556074546001600160a01b038a168452607290915291205414616020576001600160a01b038087166000908152607260209081526040808320546074548452607383528184205460719093529220805492985092169550829190615f6190617e15565b615f6c9291906174b0565b5060745460009081526071602052604090206001908101805491830191615f9290617e15565b615f9d9291906174b0565b5060745460009081526071602052604090206002908101805491830191615fc390617e15565b615fce9291906174b0565b506074546000908152607160209081526040808320600390810154908501558783526073825280832080546001600160a01b0319166001600160a01b0389169081179091558352607290915290208590555b60748054600090815260736020908152604080832080546001600160a01b03191690556001600160a01b038a1683526072825280832083905592548252607190529081209061606f828261752b565b61607d60018301600061752b565b61608b60028301600061752b565b6003820160009055505060016074546160a49190617c7a565b607455436066556160b58787616aee565b826001600160a01b0316866001600160a01b03167faa91016c21c52c58ac64f23f71bbe75becc9ada603e18ee671d09ff15492d1c160405160405180910390a350505050505050565b600081616110576161108360036168f1565b60008060008060008060008060006161278c616a0d565b985098509850985098509850985098509850616142896138f5565b6161ae578b60008051602061854c833981519152604051616194906020808252601b908201527f4f6c642061646472657373206973206e6f742061206d656d6265720000000000604082015260600190565b60405180910390a260009950505050505050505050613932565b6161c18c8c8b8b8b8b8b8b8b8b8b616cbc565b6161d75760009950505050505050505050613932565b6001600160a01b03808a166000818152606d6020526040902054918a1614616246576000818152606c6020908152604080832080546001600160a01b0319166001600160a01b038e81169182179092558452606d909252808320849055908c1682528120556162468983614cf4565b6001600160a01b038a166000908152607260209081526040808320548084526071909252808320905191929091606e90616281908490618364565b908152604051908190036020018120805492151560ff1990931692909217909155600090606f906162b6906001850190618364565b90815260405160209181900382018120805460ff191693151593909317909255600383015460009260709284926162f292600288019201618370565b60408051808303601f1901815291815281516020928301208352828201939093529101600020805460ff1916921515929092179091558851616339918391908b019061742c565b50865161634f90600183019060208a019061742c565b508551616365906002830190602089019061742c565b506003810185905543606655604051600190606e90616385908b90617e49565b908152604051908190036020018120805492151560ff1990931692909217909155600190606f906163b7908a90617e49565b908152602001604051809103902060006101000a81548160ff02191690831515021790555060016070600088886040516020016163f5929190617e65565b60408051808303601f1901815291815281516020928301208352828201939093529082016000908120805460ff191694151594909417909355858352606a90529020546001600160a01b03908116915089168114616491576000838152606a6020908152604080832080546001600160a01b0319166001600160a01b038e81169182179092558452606b90925280832086905590831682528120555b506000828152606760205260409020546001600160a01b03908116908a16811461654357896067600085815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555082606860008c6001600160a01b03166001600160a01b0316815260200190815260200160002081905550600060686000836001600160a01b03166001600160a01b03168152602001908152602001600020819055505b50896001600160a01b03168b6001600160a01b03161461664357896073600083815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555080607260008c6001600160a01b03166001600160a01b03168152602001908152602001600020819055506000607260008d6001600160a01b03166001600160a01b03168152602001908152602001600020819055506165f48e8c616aee565b886001600160a01b03168a6001600160a01b03168c6001600160a01b03167f15f4d750630db473a85edd9d47c500527a2648cc5e676f39645e52790cf07be060405160405180910390a4616684565b896001600160a01b03168b6001600160a01b03167f1feee1b4fcb797c62645da41c5c6edd5f91d4291de0054da625c42b823594c1f60405160405180910390a35b5060019d9c50505050505050505050505050565b6166a38160046168f1565b60006166ad6149d7565b6001600160a01b0316637efa9ae3836040518263ffffffff1660e01b81526004016166da91815260200190565b602060405180830381865afa1580156166f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061671b9190617fc6565b90506001600160a01b03811615612a965761673581614d33565b616740816000611f0b565b436066555050565b6167538160056168f1565b60008060006167606149d7565b6001600160a01b0316631d940da2856040518263ffffffff1660e01b815260040161678d91815260200190565b600060405180830381865afa1580156167aa573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526167d29190810190618389565b92509250925060006167e2614bba565b6040516388c2801960e01b81529091506001600160a01b038216906388c280199061681390879086906004016180c2565b600060405180830381600087803b15801561682d57600080fd5b505af1158015616841573d6000803e3d6000fd5b50504360665550506040517f701c16c2519cdb79aaac423a84733590e3510d9552055b6ad6908f0ab12b6c299061687d908690869086906183ce565b60405180910390a15050505050565b616895816155f3565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6060615001838360405180606001604052806027815260200161856c60279139617256565b6000806168fd84614ab7565b50915091508282146169475760405162461bcd60e51b8152602060048201526013602482015272496e76616c696420766f74696e67207479706560681b60448201526064016110e2565b6002811461698e5760405162461bcd60e51b8152602060048201526014602482015273496e76616c696420766f74696e6720737461746560601b60448201526064016110e2565b60008061699a866154ed565b92509250506169a861138990565b821015806169b857506113898110155b806169cd57506169c88183617daf565b612710145b614a555760405162461bcd60e51b8152602060048201526011602482015270139bdd081e595d08199a5b985b1a5e9959607a1b60448201526064016110e2565b6000806000806060806060600080616a236149d7565b6001600160a01b03166373df4e018b6040518263ffffffff1660e01b8152600401616a5091815260200190565b600060405180830381865afa158015616a6d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052616a9591908101906183f6565b9850985098509850985098509850985098509193959799909294969850565b6000616abe614c30565b6040516325d998bb60e01b81526001600160a01b03848116600483015291909116906325d998bb9060240161497a565b600080616afa84617333565b91509150616b066145a5565b616b108284617daf565b1115616ba05760405162461bcd60e51b815260206004820152605360248201527f6d696e5374616b696e672076616c7565206d757374206265206772656174657260448201527f207468616e206f7220657175616c20746f207468652073756d206f6620756e6c6064820152726f636b416d6f756e742c20736c617368696e6760681b608482015260a4016110e2565b6000616baa614c30565b604051632c9aab9b60e11b81526001600160a01b038681166004830152919250600091831690635935573690602401602060405180830381865afa158015616bf6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190616c1a9190617cff565b90506000616c266145a5565b616c309083617c7a565b905084821115616cb257616c4486866173b4565b604051634954a85b60e11b81526001600160a01b03878116600483015260248201869052604482018390528416906392a950b690606401600060405180830381600087803b158015616c9557600080fd5b505af1158015616ca9573d6000803e3d6000fd5b505050506144f4565b6144f486836173b4565b60008a616cce57616cce8c60036168f1565b616cd78a6138f5565b616d39578b60008051602061854c833981519152604051616d29906020808252601b908201527f4f6c642061646472657373206973206e6f742061206d656d6265720000000000604082015260600190565b60405180910390a2506000617247565b6001600160a01b03808b166000818152606d6020526040902054918b1614616eb057616d648a6138f5565b15616dc9578c60008051602061854c833981519152604051616db7906020808252601f908201527f6e6577206164647265737320697320616c72656164792061206d656d62657200604082015260600190565b60405180910390a26000915050617247565b886001600160a01b03168a6001600160a01b031614158015616dfd5750876001600160a01b03168a6001600160a01b031614155b15616e48578c60008051602061854c833981519152604051616db790602080825260159082015274496e76616c696420766f746572206164647265737360581b604082015260600190565b616e506145a5565b831080616e63575082616e61612b4d565b105b15616e84578c60008051602061854c833981519152604051616db790617e87565b82616e8e8b616ab4565b1015616eb0578c60008051602061854c833981519152604051616db790618284565b6001600160a01b038b166000908152607260209081526040808320548084526071909252808320815160808101909252805492939282908290616ef290617e15565b80601f0160208091040260200160405190810160405280929190818152602001828054616f1e90617e15565b8015616f6b5780601f10616f4057610100808354040283529160200191616f6b565b820191906000526020600020905b815481529060010190602001808311616f4e57829003601f168201915b50505050508152602001600182018054616f8490617e15565b80601f0160208091040260200160405190810160405280929190818152602001828054616fb090617e15565b8015616ffd5780601f10616fd257610100808354040283529160200191616ffd565b820191906000526020600020905b815481529060010190602001808311616fe057829003601f168201915b5050505050815260200160028201805461701690617e15565b80601f016020809104026020016040519081016040528092919081815260200182805461704290617e15565b801561708f5780601f106170645761010080835404028352916020019161708f565b820191906000526020600020905b81548152906001019060200180831161707257829003601f168201915b5050505050815260200160038201548152505090506170b18989898985615107565b6170e5578e60008051602061854c8339815191526040516170d190617eb4565b60405180910390a260009350505050617247565b506000828152606a60205260409020546001600160a01b03908116908d8116908b16148015906171275750896001600160a01b0316816001600160a01b031614155b801561714657506171378a6138f5565b8061714657506171468a6127e7565b15617192578e60008051602061854c8339815191526040516170d190602080825260169082015275496e76616c696420726577617264206164647265737360501b604082015260600190565b506000828152606760205260409020546001600160a01b03908116908d8116908c16148015906171d457508a6001600160a01b0316816001600160a01b031614155b80156171f357506171e48b6138f5565b806171f357506171f38b6127e7565b1561723f578e60008051602061854c8339815191526040516170d190602080825260169082015275496e76616c696420766f74657273206164647265737360501b604082015260600190565b506001925050505b9b9a5050505050505050505050565b60606001600160a01b0384163b6172be5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b60648201526084016110e2565b600080856001600160a01b0316856040516172d99190617e49565b600060405180830381855af49150503d8060008114617314576040519150601f19603f3d011682016040523d82523d6000602084013e617319565b606091505b50915091506173298282866173f3565b9695505050505050565b60008061733e6149d7565b6001600160a01b0316638c7be692846040518263ffffffff1660e01b815260040161736b91815260200190565b6040805180830381865afa158015617387573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906173ab91906184d4565b91509150915091565b6173bc614c30565b604051637eee288d60e01b81526001600160a01b038481166004830152602482018490529190911690637eee288d90604401614a27565b60608315617402575081615001565b8251156174125782518084602001fd5b8160405162461bcd60e51b81526004016110e291906184f8565b82805461743890617e15565b90600052602060002090601f01602090048101928261745a57600085556174a0565b82601f1061747357805160ff19168380011785556174a0565b828001600101855582156174a0579182015b828111156174a0578251825591602001919060010190617485565b506174ac929150617561565b5090565b8280546174bc90617e15565b90600052602060002090601f0160209004810192826174de57600085556174a0565b82601f106174ef57805485556174a0565b828001600101855582156174a057600052602060002091601f016020900482015b828111156174a0578254825591600101919060010190617510565b50805461753790617e15565b6000825580601f10617547575050565b601f016020900490600052602060002090810190611f3d91905b5b808211156174ac5760008155600101617562565b6001600160a01b0381168114611f3d57600080fd5b8035612cec81617576565b634e487b7160e01b600052604160045260246000fd5b60405161014081016001600160401b03811182821017156175cf576175cf617596565b60405290565b604051601f8201601f191681016001600160401b03811182821017156175fd576175fd617596565b604052919050565b60006001600160401b0382111561761e5761761e617596565b50601f01601f191660200190565b600082601f83011261763d57600080fd5b813561765061764b82617605565b6175d5565b81815284602083860101111561766557600080fd5b816020850160208301376000918101602001919091529392505050565b60008060006060848603121561769757600080fd5b83356176a281617576565b925060208401356001600160401b038111156176bd57600080fd5b6176c98682870161762c565b925050604084013590509250925092565b6000602082840312156176ec57600080fd5b813561500181617576565b60006020828403121561770957600080fd5b5035919050565b60008060006060848603121561772557600080fd5b833561773081617576565b92506020840135915060408401356001600160401b0381111561775257600080fd5b61775e8682870161762c565b9150509250925092565b6000610140828403121561777b57600080fd5b6177836175ac565b905061778e8261758b565b815261779c6020830161758b565b60208201526177ad6040830161758b565b604082015260608201356001600160401b03808211156177cc57600080fd5b6177d88583860161762c565b606084015260808401359150808211156177f157600080fd5b6177fd8583860161762c565b608084015260a084013591508082111561781657600080fd5b6178228583860161762c565b60a084015260c084013560c084015260e084013560e08401526101009150818401358181111561785157600080fd5b61785d8682870161762c565b8385015250505061012080830135818301525092915050565b60006020828403121561788857600080fd5b81356001600160401b0381111561789e57600080fd5b6178aa84828501617768565b949350505050565b6000806000606084860312156178c757600080fd5b83356178d281617576565b92506020840135915060408401356178e981617576565b809150509250925092565b600080600080600060a0868803121561790c57600080fd5b853594506020860135935060408601356001600160401b038082111561793157600080fd5b61793d89838a0161762c565b9450606088013591508082111561795357600080fd5b506179608882890161762c565b95989497509295608001359392505050565b60005b8381101561798d578181015183820152602001617975565b83811115611e555750506000910152565b600081518084526179b6816020860160208601617972565b601f01601f19169290920160200192915050565b6080815260006179dd608083018761799e565b82810360208401526179ef818761799e565b90508281036040840152617a03818661799e565b91505082606083015295945050505050565b60008060408385031215617a2857600080fd5b8235617a3381617576565b915060208301356001600160401b03811115617a4e57600080fd5b617a5a8582860161762c565b9150509250929050565b60008060008060008060c08789031215617a7d57600080fd5b8635617a8881617576565b95506020870135945060408701356001600160401b03811115617aaa57600080fd5b617ab689828a0161762c565b945050606087013592506080870135915060a087013590509295509295509295565b60008060008060808587031215617aee57600080fd5b84356001600160401b03811115617b0457600080fd5b617b1087828801617768565b9450506020850135617b2181617576565b93969395505050506040820135916060013590565b60008060008060008060c08789031215617b4f57600080fd5b8635617b5a81617576565b95506020870135945060408701356001600160401b0380821115617b7d57600080fd5b617b898a838b0161762c565b95506060890135915080821115617b9f57600080fd5b617bab8a838b0161762c565b94506080890135915080821115617bc157600080fd5b50617bce89828a0161762c565b92505060a087013590509295509295509295565b8015158114611f3d57600080fd5b60008060408385031215617c0357600080fd5b823591506020830135617c1581617be2565b809150509250929050565b600060208284031215617c3257600080fd5b815161500181617be2565b6020808252600d908201526c2737902832b936b4b9b9b4b7b760991b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600082821015617c8c57617c8c617c64565b500390565b6020808252601d908201527f43616e6e6f74206164642070726f706f73616c20746f6f206561726c79000000604082015260600190565b60208082526017908201527f496e76616c6964207374616b696e672062616c616e6365000000000000000000604082015260600190565b600060208284031215617d1157600080fd5b5051919050565b6020808252602e908201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960408201526d6f6e206973206e6f74205555505360901b606082015260800190565b60208082526029908201527f45524331393637557067726164653a20756e737570706f727465642070726f786040820152681a58589b195555525160ba1b606082015260800190565b60008219821115617dc257617dc2617c64565b500190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b600181811c90821680617e2957607f821691505b6020821081036138ef57634e487b7160e01b600052602260045260246000fd5b60008251617e5b818460208701617972565b9190910192915050565b60008351617e77818460208801617972565b9190910191825250602001919050565b602080825260139082015272125b9d985b1a59081b1bd8dac8185b5bdd5b9d606a1b604082015260600190565b6020808252601490820152734475706c696361746564206e6f646520696e666f60601b604082015260600190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b87815286602082015285604082015260018060a01b03851660608201528360808201528260a082015260e060c08201526000617fb960e083018461799e565b9998505050505050505050565b600060208284031215617fd857600080fd5b815161500181617576565b8051612cec81617576565b600082601f830112617fff57600080fd5b815161800d61764b82617605565b81815284602083860101111561802257600080fd5b6178aa826020830160208701617972565b6000806000806080858703121561804957600080fd5b84516001600160401b038082111561806057600080fd5b61806c88838901617fee565b9550602087015191508082111561808257600080fd5b61808e88838901617fee565b945060408701519150808211156180a457600080fd5b506180b187828801617fee565b606096909601519497939650505050565b8281526040602082015260006178aa604083018461799e565b6000806000606084860312156180f057600080fd5b835192506020840151915060408401516178e981617be2565b60008060006060848603121561811e57600080fd5b8351925060208401519150604084015190509250925092565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b8c8152602081018c9052604081018b90526001600160a01b038a81166060830152898116608083015288811660a083015287811660c0830152861660e08201526000610180806101008401526181da8184018861799e565b90508281036101208401526181ef818761799e565b9050828103610140840152618204818661799e565b915050826101608301529d9c50505050505050505050505050565b60208082526023908201527f4e6f7720696e20766f74696e67207769746820646966666572656e742062616c6040820152621b1bdd60ea1b606082015260800190565b60008261827f57634e487b7160e01b600052601260045260246000fd5b500490565b60208082526027908201527f496e73756666696369656e742062616c616e636520746861742063616e206265604082015266081b1bd8dad95960ca1b606082015260800190565b8054600090600181811c90808316806182e557607f831692505b6020808410820361830657634e487b7160e01b600052602260045260246000fd5b81801561831a576001811461832b57618358565b60ff19861689528489019650618358565b60008881526020902060005b868110156183505781548b820152908501908301618337565b505084890196505b50505050505092915050565b600061500182846182cb565b600061837c82856182cb565b9283525050602001919050565b60008060006060848603121561839e57600080fd5b835192506020840151915060408401516001600160401b038111156183c257600080fd5b61775e86828701617fee565b8381528260208201526060604082015260006183ed606083018461799e565b95945050505050565b60008060008060008060008060006101208a8c03121561841557600080fd5b61841e8a617fe3565b985061842c60208b01617fe3565b975061843a60408b01617fe3565b965061844860608b01617fe3565b955060808a01516001600160401b038082111561846457600080fd5b6184708d838e01617fee565b965060a08c015191508082111561848657600080fd5b6184928d838e01617fee565b955060c08c01519150808211156184a857600080fd5b506184b58c828d01617fee565b93505060e08a015191506101008a015190509295985092959850929598565b600080604083850312156184e757600080fd5b505080516020909101519092909150565b602081526000615001602083018461799e56fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249885e7f4987c0698db47045ad8cea110b51138f0eecbd94915842328cf6c3dc97d416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212201c4c8ec3cb8aea63f16a3c0701f1b93e96a7d982a5f81c50f3144b30002cec4a64736f6c634300080e0033", + Bin: "0x60a0604052306080523480156200001557600080fd5b506200002062000026565b620000e8565b600054610100900460ff1615620000935760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff9081161015620000e6576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b608051618bd9620001046000396000612c4c0152618bd96000f3fe6080604052600436106104725760003560e01c806372016f751161024a578063af6af2ff11610139578063cec5b622116100b6578063e27bdaef1161007a578063e27bdaef14610fcc578063e75235b814610fec578063e9523fb514611001578063f2fde38b14611017578063f38ecf471461103757600080fd5b8063cec5b62214610f29578063d07bff0c14610f56578063d6f9cfce14610f8c578063d965ea0014610fa2578063de09b37714610fb757600080fd5b8063c6713baf116100fd578063c6713baf14610e56578063c7d3da3414610e8a578063c9d27afe14610ebe578063ce04b9d414610ede578063ce6a54ff14610ef357600080fd5b8063af6af2ff14610d71578063b128f88014610d86578063c00ace6c14610dba578063c0b4fe1514610dee578063c42a0abc14610e2257600080fd5b8063a0c12683116101c7578063a8915a3e1161018b578063a8915a3e14610c9a578063a91ee0dc14610cba578063a9b629b214610cda578063aaf0dd3614610d0e578063ab3545e514610d3b57600080fd5b8063a0c1268314610bc1578063a230c52414610bee578063a6868b7d14610c0e578063a7771ee314610c42578063a78a818814610c7a57600080fd5b8063894f51111161020e578063894f511114610b295780638d39e33a14610b495780638da5cb5b14610b69578063918f867414610b875780639986e4b914610b9d57600080fd5b806372016f7514610a89578063738fdd1a14610a9e5780637b2bfb0114610abe5780637bf4653014610af25780637d10dd1b14610b1357600080fd5b8063404e585d116103665780635aaa4040116102e35780636d583ca7116102a75780636d583ca7146109b45780636f1e8533146109e85780636f6de96d14610a205780636fde207a14610a40578063715018a614610a7457600080fd5b80635aaa4040146108f95780636167eb451461090e578063656e3052146109425780636ba99181146109765780636c78d2cf1461098b57600080fd5b80634d5ce0381161032a5780634d5ce038146108625780634f0f4aa9146108825780634f1ef286146108b257806352d1902d146108c05780635a731cca146108d557600080fd5b8063404e585d146107a557806340690353146107b857806346946416146107d85780634bd1ed761461080c5780634d273e281461082e57600080fd5b8063278bb12a116103f45780633659cfe6116103b85780633659cfe6146106dd57806336e83d83146106fd578063382944191461071d578063397e38e7146107515780633f35c8fe1461077157600080fd5b8063278bb12a146106325780632f40992e146106665780633310569c1461068757806334125c841461069d578063351bacda146106bd57600080fd5b80631c12b0301161043b5780631c12b030146105705780631c150171146105955780631c4b774b146105aa5780631e0cba0d146105e0578063238737b6146105fe57600080fd5b806215a73b146104775780630efa4909146104be578063139d9dd3146104de57806315bf6b4d1461050b57806316fbe83114610559575b600080fd5b34801561048357600080fd5b506104ab7f0c4fbe9dc9de15dd7c0d064975ee1a2f2f9b954fa0e65d4f6cddba94884bdc3e81565b6040519081526020015b60405180910390f35b3480156104ca57600080fd5b506104ab6104d9366004617b48565b61106b565b3480156104ea57600080fd5b506104ab6104f9366004617ba0565b60ab6020526000908152604090205481565b34801561051757600080fd5b50610541610526366004617bbd565b6000908152607360205260409020546001600160a01b031690565b6040516001600160a01b0390911681526020016104b5565b34801561056557600080fd5b5061056e611405565b005b34801561057c57600080fd5b50610585611744565b60405190151581526020016104b5565b3480156105a157600080fd5b506104ab611795565b3480156105b657600080fd5b506105416105c5366004617bbd565b6000908152606a60205260409020546001600160a01b031690565b3480156105ec57600080fd5b506104ab665374616b696e6760c81b81565b34801561060a57600080fd5b506104ab7f1d36f8ce53f59e624857e1d8dc7932d19981a2ea1b8faa4eb8ff843fc3e5a27881565b34801561063e57600080fd5b506104ab7f9b2e0c7fdae148f225bae7deb92d7e7bd24bb77edb12956e8fa7204900dd8a2281565b34801561067257600080fd5b506104ab6914995dd85c99141bdbdb60b21b81565b34801561069357600080fd5b506104ab60aa5481565b3480156106a957600080fd5b506104ab6845636f73797374656d60b81b81565b3480156106c957600080fd5b5061056e6106d8366004617bd6565b611805565b3480156106e957600080fd5b5061056e6106f8366004617ba0565b611e85565b34801561070957600080fd5b506104ab610718366004617d3c565b611ebe565b34801561072957600080fd5b506104ab7fbe90e461bbdb9a95a694f7796912ea04244caf7f5b60ad7ded17e16821d3e44c81565b34801561075d57600080fd5b5061056e61076c366004617d78565b6123d6565b34801561077d57600080fd5b506104ab7f2a268972a70c8c688b62366bdfdd9bb09cf19d3e5b6e7e7bb158e671ffdcedd281565b61056e6107b3366004617dba565b6124d1565b3480156107c457600080fd5b506104ab6107d3366004617e37565b6127b1565b3480156107e457600080fd5b506104ab7fdd5a41a7fc01f5c6d30816b17f638d6531625f1e1eaa599673ab2f6079f2dd9d81565b34801561081857600080fd5b506104ab6a4d61696e74656e616e636560a81b81565b34801561083a57600080fd5b506104ab7f77884798208df1e64f70968be41ef2d3211ec53613397ca59313416813df088881565b34801561086e57600080fd5b5061058561087d366004617ba0565b612a45565b34801561088e57600080fd5b506108a261089d366004617bbd565b612a62565b6040516104b59493929190617f0d565b61056e6106f8366004617f58565b3480156108cc57600080fd5b506104ab612c3f565b3480156108e157600080fd5b506104ab6c14dd185ada5b99d4995dd85c99609a1b81565b34801561090557600080fd5b506104ab612cf2565b34801561091a57600080fd5b506104ab7f9f1de481f899d76889aa8a2b44cc7b604d42691aa93d4ba618a1a1fd439f505081565b34801561094e57600080fd5b506104ab7fe10074dceffb75f13bf0ce50145afd35182d63796823f1280ce40e01c19109e781565b34801561098257600080fd5b5061056e612d39565b34801561099757600080fd5b506104ab7111dbdd995c9b985b98d950dbdb9d1c9858dd60721b81565b3480156109c057600080fd5b506104ab7fc69fc6b7d0efc934fd5a3581c7253a7107a952526bb6dbcd814ef8d8dae1f44a81565b3480156109f457600080fd5b50610585610a03366004617ba0565b6001600160a01b03166000908152606d6020526040902054151590565b348015610a2c57600080fd5b50610541610a3b366004617ba0565b612e27565b348015610a4c57600080fd5b506104ab7f0b09c9badbbeb6c813a598ee910770a39ccda797a1940439bb6e47fc6c87548b81565b348015610a8057600080fd5b5061056e612e96565b348015610a9557600080fd5b506074546104ab565b348015610aaa57600080fd5b50606554610541906001600160a01b031681565b348015610aca57600080fd5b506104ab7f9346226931826838eedd13d9677fa33551e7c81f604b171ef3fac355458da9aa81565b348015610afe57600080fd5b506104ab69456e7653746f7261676560b01b81565b348015610b1f57600080fd5b506104ab60665481565b348015610b3557600080fd5b506104ab610b44366004617fa7565b612eaa565b348015610b5557600080fd5b506104ab610b64366004617ba0565b613208565b348015610b7557600080fd5b506033546001600160a01b0316610541565b348015610b9357600080fd5b506104ab61271081565b348015610ba957600080fd5b506104ab6c42616c6c6f7453746f7261676560981b81565b348015610bcd57600080fd5b506104ab610bdc366004617ba0565b606d6020526000908152604090205481565b348015610bfa57600080fd5b50610585610c09366004617ba0565b613a9a565b348015610c1a57600080fd5b506104ab7f6c6f69f426081752a5d3e73746599acd2a4cb145d5de4203ca1e3473b281680b81565b348015610c4e57600080fd5b50610585610c5d366004617ba0565b6001600160a01b0316600090815260686020526040902054151590565b348015610c8657600080fd5b506104ab610c9536600461801b565b613add565b348015610ca657600080fd5b5061056e610cb5366004618079565b614239565b348015610cc657600080fd5b5061056e610cd5366004617ba0565b6146a2565b348015610ce657600080fd5b506104ab7f89dd490ecaf395283ed4ff2fd9557ca767fc425dce063451a9b0da6d72f600c381565b348015610d1a57600080fd5b506104ab610d29366004617ba0565b606b6020526000908152604090205481565b348015610d4757600080fd5b50610541610d56366004617bbd565b6000908152606c60205260409020546001600160a01b031690565b348015610d7d57600080fd5b506104ab61474a565b348015610d9257600080fd5b506104ab7f829561ab7af084b7efc6600518d2df79b8d95f3f4c3a550f54f8f7ec7d2b805781565b348015610dc657600080fd5b506104ab7f18ad4415ef4a621ce1a136395c51ab6c3712bb2e24b79d526059925cea58dcb881565b348015610dfa57600080fd5b506104ab7f8086da5becff4dfac91a3105821b361078d2d4abba0ccc2401b974cf0dcf05c181565b348015610e2e57600080fd5b506104ab7fb38b2c133e931937bd95337c65c8aefa7040ed64bbed732e3e29a4944c65747381565b348015610e6257600080fd5b506104ab7fc9e15e34073efbcd0328740feaf503caac9124b55b38c73d1a97b53da80a2f6081565b348015610e9657600080fd5b506104ab7f04f7b94450bbcad85f37ea47cd1062728f884bb2040e357738f8fd53056134bc81565b348015610eca57600080fd5b5061056e610ed9366004618133565b614791565b348015610eea57600080fd5b506104ab614986565b348015610eff57600080fd5b506104ab610f0e366004617ba0565b6001600160a01b031660009081526072602052604090205490565b348015610f3557600080fd5b506104ab610f44366004617ba0565b60686020526000908152604090205481565b348015610f6257600080fd5b50610541610f71366004617bbd565b6000908152606760205260409020546001600160a01b031690565b348015610f9857600080fd5b506104ab60755481565b348015610fae57600080fd5b506069546104ab565b348015610fc357600080fd5b506077546104ab565b348015610fd857600080fd5b5061056e610fe7366004617bbd565b6149cd565b348015610ff857600080fd5b506113896104ab565b34801561100d57600080fd5b506104ab60765481565b34801561102357600080fd5b5061056e611032366004617ba0565b614a53565b34801561104357600080fd5b506104ab7f7c1150f0e1a39ff55552d52764f97e6c387e2a247e1df344369f122c4254be2f81565b6000611075614acc565b60405163288c314960e21b81523360048201526001600160a01b03919091169063a230c52490602401602060405180830381865afa1580156110bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110df9190618163565b6111045760405162461bcd60e51b81526004016110fb90618180565b60405180910390fd5b600061110f33612e27565b60aa546001600160a01b038216600090815260ab60205260409020549192509061113990426181bd565b10156111575760405162461bcd60e51b81526004016110fb906181d4565b600061116233612e27565b905061116c612cf2565b61117582614aec565b11158015611192575061118661474a565b61118f82614aec565b10155b6111ae5760405162461bcd60e51b81526004016110fb9061820b565b6001600160a01b0386166112045760405162461bcd60e51b815260206004820152601d60248201527f496d706c656d656e746174696f6e2063616e6e6f74206265207a65726f00000060448201526064016110fb565b600080516020618b1d833981519152546001600160a01b03166001600160a01b0316866001600160a01b0316036112755760405162461bcd60e51b815260206004820152601560248201527453616d6520636f6e7472616374206164647265737360581b60448201526064016110fb565b856001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156112cf575060408051601f3d908101601f191682019092526112cc91810190618242565b60015b6112eb5760405162461bcd60e51b81526004016110fb9061825b565b600080516020618b1d83398151915281146113185760405162461bcd60e51b81526004016110fb906182a9565b506075546113279060016182f2565b9250611331614b63565b6001600160a01b0316630a3a63fe607554600161134e91906182f2565b60046040516001600160e01b031960e085901b16815260048101929092526024820152604481018790523360648201526001600160a01b038916608482015260a4016020604051808303816000875af11580156113af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113d39190618242565b506113de8386614b7e565b5060758290556001600160a01b0316600090815260ab602052604090204290559392505050565b600054600290610100900460ff16158015611427575060005460ff8083169116105b6114435760405162461bcd60e51b81526004016110fb9061830a565b6000805461ffff191660ff83161761010017905561145f614be9565b60005b6069548110156117105760008181526071602052604080822081516080810190925280548290829061149390618358565b80601f01602080910402602001604051908101604052809291908181526020018280546114bf90618358565b801561150c5780601f106114e15761010080835404028352916020019161150c565b820191906000526020600020905b8154815290600101906020018083116114ef57829003601f168201915b5050505050815260200160018201805461152590618358565b80601f016020809104026020016040519081016040528092919081815260200182805461155190618358565b801561159e5780601f106115735761010080835404028352916020019161159e565b820191906000526020600020905b81548152906001019060200180831161158157829003601f168201915b505050505081526020016002820180546115b790618358565b80601f01602080910402602001604051908101604052809291908181526020018280546115e390618358565b80156116305780601f1061160557610100808354040283529160200191611630565b820191906000526020600020905b81548152906001019060200180831161161357829003601f168201915b5050505050815260200160038201548152505090506001606e826000015160405161165b919061838c565b90815260405160209181900382018120805460ff191693151593909317909255820151600191606f9161168d9161838c565b908152602001604051809103902060006101000a81548160ff021916908315150217905550600160706000836040015184606001516040516020016116d39291906183a8565b60408051808303601f19018152918152815160209283012083529082019290925201600020805460ff191691151591909117905550600101611462565b506000805461ff001916905560405160ff82168152600080516020618b3d833981519152906020015b60405180910390a150565b600060775460001461178f57600061175d607754614c43565b50915050600061176e607754614ccb565b50915050600119820161178c574281101561178c5760009250505090565b50505b50600190565b600061179f614d46565b6001600160a01b03166333be496e6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117dc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118009190618242565b905090565b600054610100900460ff16158080156118255750600054600160ff909116105b8061183f5750303b15801561183f575060005460ff166001145b61185b5760405162461bcd60e51b81526004016110fb9061830a565b6000805460ff19166001179055801561187e576000805461ff0019166101001790555b611886614d5e565b61188e614d8d565b611897846146a2565b4360665560006118a5614dbc565b90506118af61474a565b84101580156118c55750836118c2612cf2565b10155b6118e15760405162461bcd60e51b81526004016110fb906183ca565b600080600060608060606000806000905060008060208d0191508c518261190891906182f2565b90505b80821015611e3657815199506119226020836182f2565b915080821061193057600080fd5b8151985061193f6020836182f2565b915080821061194d57600080fd5b8151975061195c6020836182f2565b915080821061196a57600080fd5b8196508651602061197b91906182f2565b61198590836182f2565b915080821061199357600080fd5b819550855160206119a491906182f2565b6119ae90836182f2565b91508082106119bc57600080fd5b819450845160206119cd91906182f2565b6119d790836182f2565b91508082106119e557600080fd5b815193506119f46020836182f2565b9150611a016001846182f2565b9250611a0c8a613a9a565b158015611a1f5750611a1d89613a9a565b155b8015611a315750611a2f88612a45565b155b611a6e5760405162461bcd60e51b815260206004820152600e60248201526d20b63932b0b23c9036b2b6b132b960911b60448201526064016110fb565b886067600085815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555082606860008b6001600160a01b03166001600160a01b031681526020019081526020016000208190555087606a600085815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555082606b60008a6001600160a01b03166001600160a01b031681526020019081526020016000208190555089606c600085815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555082606d60008c6001600160a01b03166001600160a01b0316815260200190815260200160002081905550886001600160a01b03168a6001600160a01b03167f6a2af11b2d73f347f9d5840aea46899e17609730b5cd91bd9c312098038acba660405160405180910390a36040516325d998bb60e01b81526001600160a01b038b811660048301528f91908d16906325d998bb90602401602060405180830381865afa158015611c1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c419190618242565b1015611c865760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e74207374616b696e6760601b60448201526064016110fb565b611c9287878787614dd1565b611cae5760405162461bcd60e51b81526004016110fb906183f7565b611cb88a8f614e80565b600083815260716020908152604090912088519091611cdb9183918b01906178f2565b508651611cf190600183019060208a01906178f2565b508551611d0790600283019060208901906178f2565b508481600301819055506001606e89604051611d23919061838c565b908152604051908190036020018120805492151560ff1990931692909217909155600190606f90611d55908a9061838c565b908152602001604051809103902060006101000a81548160ff0219169083151502179055506001607060008888604051602001611d939291906183a8565b60405160208183030381529060405280519060200120815260200190815260200160002060006101000a81548160ff0219169083151502179055508a6073600086815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555083607260008d6001600160a01b03166001600160a01b03168152602001908152602001600020819055505061190b565b50506069819055607455505086159550611e7f945050505050576000805461ff001916905560405160018152600080516020618b3d833981519152906020015b60405180910390a15b50505050565b60405162461bcd60e51b815260206004820152600e60248201526d496e76616c69642061636365737360901b60448201526064016110fb565b6000611ec8614acc565b60405163288c314960e21b81523360048201526001600160a01b03919091169063a230c52490602401602060405180830381865afa158015611f0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f329190618163565b611f4e5760405162461bcd60e51b81526004016110fb90618180565b6000611f5933612e27565b60aa546001600160a01b038216600090815260ab602052604090205491925090611f8390426181bd565b1015611fa15760405162461bcd60e51b81526004016110fb906181d4565b6000611fac33612e27565b9050611fb6612cf2565b611fbf82614aec565b11158015611fdc5750611fd061474a565b611fd982614aec565b10155b611ff85760405162461bcd60e51b81526004016110fb9061820b565b602084015184906001600160a01b03166120445760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b2103b37ba32b960991b60448201526064016110fb565b60008160600151511161208d5760405162461bcd60e51b8152602060048201526011602482015270496e76616c6964206e6f6465206e616d6560781b60448201526064016110fb565b60008160a0015151116120d45760405162461bcd60e51b815260206004820152600f60248201526e0496e76616c6964206e6f646520495608c1b60448201526064016110fb565b60008160c001511161211c5760405162461bcd60e51b8152602060048201526011602482015270125b9d985b1a59081b9bd919481c1bdc9d607a1b60448201526064016110fb565b6000816080015151116121665760405162461bcd60e51b8152602060048201526012602482015271496e76616c6964206e6f646520656e6f646560701b60448201526064016110fb565b600081610100015151116121ab5760405162461bcd60e51b815260206004820152600c60248201526b496e76616c6964206d656d6f60a01b60448201526064016110fb565b6000816101200151116121f35760405162461bcd60e51b815260206004820152601060248201526f24b73b30b634b210323ab930ba34b7b760811b60448201526064016110fb565b6121fb61474a565b8160e00151101580156122195750612211612cf2565b8160e0015111155b61225b5760405162461bcd60e51b8152602060048201526013602482015272125b9d985b1a59081b1bd8dac8105b5bdd5b9d606a1b60448201526064016110fb565b845161226690613a9a565b15801561227b5750845161227990612a45565b155b6122b85760405162461bcd60e51b815260206004820152600e60248201526d20b63932b0b23c9036b2b6b132b960911b60448201526064016110fb565b84602001516001600160a01b031685600001516001600160a01b03161480156122fa575084604001516001600160a01b031685600001516001600160a01b0316145b61233c5760405162461bcd60e51b815260206004820152601360248201527229ba30b5b2b91034b9903737ba103b37ba32b960691b60448201526064016110fb565b612358856060015186608001518760a001518860c00151614dd1565b6123745760405162461bcd60e51b81526004016110fb906183f7565b6075546123829060016182f2565b935061239384600133600089614ebf565b6123a1848660e00151614f62565b6123b084866101000151614b7e565b505060758290556001600160a01b0316600090815260ab60205260409020429055919050565b600054610100900460ff16158080156123f65750600054600160ff909116105b806124105750303b158015612410575060005460ff166001145b61242c5760405162461bcd60e51b81526004016110fb9061830a565b6000805460ff19166001179055801561244f576000805461ff0019166101001790555b612457614d5e565b61245f614d8d565b612468846146a2565b606683905561247682614a53565b60405133907fab2db0a6f442428b686ffa80eadcaabe7d5ee00049c6ae888a237edd3238d85690600090a28015611e7f576000805461ff001916905560405160018152600080516020618b3d83398151915290602001611e76565b6124d9614acc565b60405163288c314960e21b81523360048201526001600160a01b03919091169063a230c52490602401602060405180830381865afa15801561251f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125439190618163565b61255f5760405162461bcd60e51b81526004016110fb90618180565b600061256a33612e27565b60aa546001600160a01b038216600090815260ab60205260409020549192509061259490426181bd565b10156125b25760405162461bcd60e51b81526004016110fb906181d4565b60006125bd33612e27565b90506125c7612cf2565b6125d082614aec565b111580156125ed57506125e161474a565b6125ea82614aec565b10155b6126095760405162461bcd60e51b81526004016110fb9061820b565b6001600160a01b0386166126575760405162461bcd60e51b81526020600482015260156024820152747461726765742063616e6e6f74206265207a65726f60581b60448201526064016110fb565b3334156126fd576000816001600160a01b0316600060405160006040518083038185875af1925050503d80600081146126ac576040519150601f19603f3d011682016040523d82523d6000602084013e6126b1565b606091505b50509050806126fb5760405162461bcd60e51b815260206004820152601660248201527563726561746f72206973206e6f742070617961626c6560501b60448201526064016110fb565b505b6000607554600161270e91906182f2565b9050612718614b63565b6001600160a01b031663aea83e4082600688868d348e6040518863ffffffff1660e01b81526004016127509796959493929190618425565b600060405180830381600087803b15801561276a57600080fd5b505af115801561277e573d6000803e3d6000fd5b5050505061278c8187614b7e565b60755550506001600160a01b0316600090815260ab6020526040902042905550505050565b60006127bb614acc565b60405163288c314960e21b81523360048201526001600160a01b03919091169063a230c52490602401602060405180830381865afa158015612801573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128259190618163565b6128415760405162461bcd60e51b81526004016110fb90618180565b600061284c33612e27565b60aa546001600160a01b038216600090815260ab60205260409020549192509061287690426181bd565b10156128945760405162461bcd60e51b81526004016110fb906181d4565b600061289f33612e27565b90506128a9612cf2565b6128b282614aec565b111580156128cf57506128c361474a565b6128cc82614aec565b10155b6128eb5760405162461bcd60e51b81526004016110fb9061820b565b866001111580156128fd575060098711155b6129385760405162461bcd60e51b815260206004820152600c60248201526b496e76616c6964207479706560a01b60448201526064016110fb565b6129428887614fa0565b61297e5760405162461bcd60e51b815260206004820152600d60248201526c496e76616c69642076616c756560981b60448201526064016110fb565b60755461298c9060016182f2565b9250612996614b63565b6001600160a01b0316634a57823e84600587338d8d8d6040518863ffffffff1660e01b81526004016129ce9796959493929190618475565b6020604051808303816000875af11580156129ed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a119190618242565b50612a1c8386614b7e565b5060758290556001600160a01b0316600090815260ab6020526040902042905595945050505050565b6001600160a01b03166000908152606b6020526040902054151590565b600081815260716020526040812060038101548154606093849384939192909160018301916002840191908490612a9890618358565b80601f0160208091040260200160405190810160405280929190818152602001828054612ac490618358565b8015612b115780601f10612ae657610100808354040283529160200191612b11565b820191906000526020600020905b815481529060010190602001808311612af457829003601f168201915b50505050509350828054612b2490618358565b80601f0160208091040260200160405190810160405280929190818152602001828054612b5090618358565b8015612b9d5780601f10612b7257610100808354040283529160200191612b9d565b820191906000526020600020905b815481529060010190602001808311612b8057829003601f168201915b50505050509250818054612bb090618358565b80601f0160208091040260200160405190810160405280929190818152602001828054612bdc90618358565b8015612c295780601f10612bfe57610100808354040283529160200191612c29565b820191906000526020600020905b815481529060010190602001808311612c0c57829003601f168201915b5050505050915093509350935093509193509193565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614612cdf5760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c000000000000000060648201526084016110fb565b50600080516020618b1d83398151915290565b6000612cfc614d46565b6001600160a01b031663737c59b86040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117dc573d6000803e3d6000fd5b612d41614acc565b60405163288c314960e21b81523360048201526001600160a01b03919091169063a230c52490602401602060405180830381865afa158015612d87573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dab9190618163565b612dc75760405162461bcd60e51b81526004016110fb90618180565b612dcf611744565b15612e125760405162461bcd60e51b8152602060048201526013602482015272159bdd1a5b99c81a5cc81b9bdd08195b991959606a1b60448201526064016110fb565b607754612e2090600461501f565b6000607755565b6001600160a01b0381166000908152606d602052604081205415612e49575090565b6001600160a01b03821660009081526068602052604090205415612e9157506001600160a01b038082166000908152606860209081526040808320548352606c909152902054165b919050565b612e9e614be9565b612ea8600061505d565b565b6000612eb4614acc565b60405163288c314960e21b81523360048201526001600160a01b03919091169063a230c52490602401602060405180830381865afa158015612efa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f1e9190618163565b612f3a5760405162461bcd60e51b81526004016110fb90618180565b6000612f4533612e27565b60aa546001600160a01b038216600090815260ab602052604090205491925090612f6f90426181bd565b1015612f8d5760405162461bcd60e51b81526004016110fb906181d4565b6000612f9833612e27565b9050612fa2612cf2565b612fab82614aec565b11158015612fc85750612fbc61474a565b612fc582614aec565b10155b612fe45760405162461bcd60e51b81526004016110fb9061820b565b6001600160a01b03891661302c5760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b60448201526064016110fb565b61303589613a9a565b61306e5760405162461bcd60e51b815260206004820152600a6024820152692737b716b6b2b6b132b960b11b60448201526064016110fb565b600161307960695490565b116130c65760405162461bcd60e51b815260206004820152601b60248201527f43616e6e6f742072656d6f7665206120736f6c65206d656d626572000000000060448201526064016110fb565b876130d08a614aec565b10156131315760405162461bcd60e51b815260206004820152602a60248201527f496e73756666696369656e742062616c616e636520746861742063616e206265604482015269103ab73637b1b5b2b21760b11b60648201526084016110fb565b60755461313f9060016182f2565b604080516101408101825260008082526020808301829052828401829052835182815280820185526060840152835182815280820185526080840152835182815290810190935260a082019290925260c081019190915260e081018a9052610100810189905261012081018890529093506131be846002338d85614ebf565b6131c8848a614f62565b6131d28489614b7e565b6131dd8487876150af565b505060758290556001600160a01b0316600090815260ab602052604090204290559695505050505050565b60008054610100900460ff16158080156132295750600054600160ff909116105b806132435750303b158015613243575060005460ff166001145b61325f5760405162461bcd60e51b81526004016110fb9061830a565b6000805460ff191660011790558015613282576000805461ff0019166101001790555b61328a614d5e565b613292614d8d565b60008390506132fc816001600160a01b031663738fdd1a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156132d8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cd591906184b4565b43606681905550613368816001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613344573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061103291906184b4565b60015b816001600160a01b031663d965ea006040518163ffffffff1660e01b8152600401602060405180830381865afa1580156133a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133cd9190618242565b81116138bd5760405163ab3545e560e01b8152600481018290526001600160a01b0383169063ab3545e590602401602060405180830381865afa158015613418573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061343c91906184b4565b6000828152606c6020908152604080832080546001600160a01b0319166001600160a01b039586169081179091558352606d909152908190208390555163341effc360e21b8152600481018390529083169063d07bff0c90602401602060405180830381865afa1580156134b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134d891906184b4565b600082815260676020908152604080832080546001600160a01b0319166001600160a01b03958616908117909155835260689091529081902083905551631c4b774b60e01b81526004810183905290831690631c4b774b90602401602060405180830381865afa158015613550573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061357491906184b4565b6000828152606a6020908152604080832080546001600160a01b0319166001600160a01b03959095169485179055928252606b8152828220849055606984905582516080810184526060808252918101829052928301819052820152604051634f0f4aa960e01b8152600481018390526001600160a01b03841690634f0f4aa990602401600060405180830381865afa158015613615573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261363d9190810190618521565b606085018190526040850182905260208501839052838552613662939291908561511e565b6136ae5760405162461bcd60e51b815260206004820152601760248201527f6e6f646520696e666f206973206475706c69636174656400000000000000000060448201526064016110fb565b6001606e82600001516040516136c4919061838c565b90815260405160209181900382018120805460ff191693151593909317909255820151600191606f916136f69161838c565b908152602001604051809103902060006101000a81548160ff0219169083151502179055506001607060008360400151846060015160405160200161373c9291906183a8565b60408051808303601f1901815291815281516020928301208352828201939093529082016000908120805460ff1916941515949094179093558483526071815291208251805184936137929284929101906178f2565b5060208281015180516137ab92600185019201906178f2565b50604082015180516137c79160028401916020909101906178f2565b50606091909101516003909101556000828152606c6020818152604080842080546001600160a01b039081168652607284528286208890558786528154607385529583902080546001600160a01b031916968216969096179095556074879055929091529054905163139d9dd360e01b815290821660048201529084169063139d9dd390602401602060405180830381865afa15801561386b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061388f9190618242565b6000838152606c60209081526040808320546001600160a01b0316835260ab9091529020555060010161336b565b50806001600160a01b0316633310569c6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156138fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139209190618242565b60aa81905550806001600160a01b031663d6f9cfce6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613964573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139889190618242565b607581905550806001600160a01b031663e9523fb56040518163ffffffff1660e01b8152600401602060405180830381865afa1580156139cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139f09190618242565b607681905550806001600160a01b031663de09b3776040518163ffffffff1660e01b8152600401602060405180830381865afa158015613a34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a589190618242565b60775550600091508015613a94576000805461ff001916905560405160018152600080516020618b3d8339815191529060200160405180910390a15b50919050565b6001600160a01b0381166000908152606d6020526040812054151580613ad757506001600160a01b03821660009081526068602052604090205415155b92915050565b6000613ae7614acc565b60405163288c314960e21b81523360048201526001600160a01b03919091169063a230c52490602401602060405180830381865afa158015613b2d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b519190618163565b613b6d5760405162461bcd60e51b81526004016110fb90618180565b6000613b7833612e27565b60aa546001600160a01b038216600090815260ab602052604090205491925090613ba290426181bd565b1015613bc05760405162461bcd60e51b81526004016110fb906181d4565b6000613bcb33612e27565b9050613bd5612cf2565b613bde82614aec565b11158015613bfb5750613bef61474a565b613bf882614aec565b10155b613c175760405162461bcd60e51b81526004016110fb9061820b565b602087015187906001600160a01b0316613c635760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b2103b37ba32b960991b60448201526064016110fb565b600081606001515111613cac5760405162461bcd60e51b8152602060048201526011602482015270496e76616c6964206e6f6465206e616d6560781b60448201526064016110fb565b60008160a001515111613cf35760405162461bcd60e51b815260206004820152600f60248201526e0496e76616c6964206e6f646520495608c1b60448201526064016110fb565b60008160c0015111613d3b5760405162461bcd60e51b8152602060048201526011602482015270125b9d985b1a59081b9bd919481c1bdc9d607a1b60448201526064016110fb565b600081608001515111613d855760405162461bcd60e51b8152602060048201526012602482015271496e76616c6964206e6f646520656e6f646560701b60448201526064016110fb565b60008161010001515111613dca5760405162461bcd60e51b815260206004820152600c60248201526b496e76616c6964206d656d6f60a01b60448201526064016110fb565b600081610120015111613e125760405162461bcd60e51b815260206004820152601060248201526f24b73b30b634b210323ab930ba34b7b760811b60448201526064016110fb565b613e1a61474a565b8160e0015110158015613e385750613e30612cf2565b8160e0015111155b613e7a5760405162461bcd60e51b8152602060048201526013602482015272125b9d985b1a59081b1bd8dac8105b5bdd5b9d606a1b60448201526064016110fb565b6001600160a01b038716613ec65760405162461bcd60e51b8152602060048201526013602482015272496e76616c6964206f6c64204164647265737360681b60448201526064016110fb565b613ecf87613a9a565b613f085760405162461bcd60e51b815260206004820152600a6024820152692737b716b6b2b6b132b960b11b60448201526064016110fb565b6020808901516001600160a01b038981166000908152606d8452604080822054825260679094529290922054821691161480613f595750866001600160a01b031688602001516001600160a01b0316145b80613f835750613f6c8860200151613a9a565b158015613f835750613f818860200151612a45565b155b801561400557506040808901516001600160a01b038981166000908152606d6020908152848220548252606a90529290922054821691161480613fdb5750866001600160a01b031688604001516001600160a01b0316145b806140055750613fee8860400151613a9a565b15801561400557506140038860400151612a45565b155b6140445760405162461bcd60e51b815260206004820152601060248201526f20b63932b0b23c90309036b2b6b132b960811b60448201526064016110fb565b336001600160a01b038816148015614068575087516001600160a01b038881169116145b156140bd5785158015614079575084155b6140b85760405162461bcd60e51b815260206004820152601060248201526f125b9d985b1a59081c1c9bdc1bdcd85b60821b60448201526064016110fb565b61416c565b87516001600160a01b0388811691161461416c576140d961474a565b6140e386886182f2565b111561416c5760405162461bcd60e51b815260206004820152604c60248201527f496e76616c696420616d6f756e743a2028756e6c6f636b416d6f756e74202b2060448201527f736c617368696e6729206d75737420626520657175616c206f72206c6f77207460648201526b6f206d696e5374616b696e6760a01b608482015260a4016110fb565b60755461417a9060016182f2565b935061418a846003338a8c614ebf565b614198848960e00151614f62565b6141a784896101000151614b7e565b6141b28487876150af565b6075849055336001600160a01b0388161480156141db575087516001600160a01b038881169116145b156142155760006141eb85614ccb565b925050506142058542834261420091906182f2565b615247565b61421385600360018061528c565b505b50506001600160a01b0316600090815260ab60205260409020429055949350505050565b600054610100900460ff16158080156142595750600054600160ff909116105b806142735750303b158015614273575060005460ff166001145b61428f5760405162461bcd60e51b81526004016110fb9061830a565b6000805460ff1916600117905580156142b2576000805461ff0019166101001790555b6142ba614d5e565b6142c2614d8d565b6142cb876146a2565b6142d361474a565b86101580156142e95750856142e6612cf2565b10155b6143055760405162461bcd60e51b81526004016110fb906183ca565b600061430f614dbc565b6040516325d998bb60e01b815233600482015290915087906001600160a01b038316906325d998bb90602401602060405180830381865afa158015614358573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061437c9190618242565b10156143c15760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e74207374616b696e6760601b60448201526064016110fb565b60405163282d3fdf60e01b8152336004820152602481018890526001600160a01b0382169063282d3fdf90604401600060405180830381600087803b15801561440957600080fd5b505af115801561441d573d6000803e3d6000fd5b5050600160698190557f6bee784efeb983674392298ab585b22866bedf00ebb0eea949d1e66f3f50e71d8054336001600160a01b0319918216811790925560008281526068602090815260408083208690557ff585789965ba69220d5ce3dc1b444eb22ff546f2650694fef8fafe9c26560af98054851686179055606b82528083208690557fdcf345d7f6a8deb7427d0fee62009fa15100353a1c666b51bb5387b25addcfa98054909416909417909255606d825291822083905560748390559190526071815288517f169c6be1b0e6ab5de76b532e587a77340130ac65c5591db02be822dcf1dc0ed69350614518925083918a01906178f2565b50855161452e90600183019060208901906178f2565b50845161454490600283019060208801906178f2565b508381600301819055506001606e88604051614560919061838c565b908152604051908190036020018120805492151560ff1990931692909217909155600190606f9061459290899061838c565b908152602001604051809103902060006101000a81548160ff02191690831515021790555060016070600087876040516020016145d09291906183a8565b60408051808303601f1901815291815281516020928301208352828201939093529082016000908120805460ff1916941515949094179093556074543380855260728352838520829055908452607390915281832080546001600160a01b03191682179055436066559051909182917f6a2af11b2d73f347f9d5840aea46899e17609730b5cd91bd9c312098038acba69190a350508015614699576000805461ff001916905560405160018152600080516020618b3d8339815191529060200160405180910390a15b50505050505050565b6146aa614be9565b6001600160a01b0381166147005760405162461bcd60e51b815260206004820152601a60248201527f416464726573732073686f756c64206265206e6f6e2d7a65726f00000000000060448201526064016110fb565b606580546001600160a01b0319166001600160a01b0383169081179091556040517f278c70ced5f3e0e5eeb385b5ff9cb735748ba00a625147e66065ed48fc1562cd90600090a250565b6000614754614d46565b6001600160a01b031663076cd77f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117dc573d6000803e3d6000fd5b6002607854036147e35760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016110fb565b60026078556147f0614acc565b60405163288c314960e21b81523360048201526001600160a01b03919091169063a230c52490602401602060405180830381865afa158015614836573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061485a9190618163565b6148765760405162461bcd60e51b81526004016110fb90618180565b600061488133612e27565b905061488b612cf2565b61489482614aec565b111580156148b157506148a561474a565b6148ae82614aec565b10155b6148cd5760405162461bcd60e51b81526004016110fb9061820b565b6148d5611744565b61490b5760405162461bcd60e51b8152602060048201526007602482015266115e1c1a5c995960ca1b60448201526064016110fb565b6000614916846153bf565b905061492284846154d2565b60008061492e866155ac565b9250925050600061493e61138990565b9050808310158061494f5750808210155b80614964575061495f82846182f2565b612710145b15614978576149788785848611600061528c565b505060016078555050505050565b6000614990614d46565b6001600160a01b0316631b27e01b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117dc573d6000803e3d6000fd5b6149d5614be9565b610e108110614a1e5760405162461bcd60e51b81526020600482015260156024820152746e6577506572696f6420697320746f6f206c6f6e6760581b60448201526064016110fb565b60aa8190556040518181527f17c6f1d1ce638844b664872f5c6eecb7d150ec0c41187d7f85826a656ee7946f90602001611739565b614a5b614be9565b6001600160a01b038116614ac05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016110fb565b614ac98161505d565b50565b60006118007111dbdd995c9b985b98d950dbdb9d1c9858dd60721b6155e6565b6000614af6614dbc565b604051632c9aab9b60e11b81526001600160a01b03848116600483015291909116906359355736906024015b602060405180830381865afa158015614b3f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ad79190618242565b60006118006c42616c6c6f7453746f7261676560981b6155e6565b614b86614b63565b6001600160a01b031663bce0dbc183836040518363ffffffff1660e01b8152600401614bb39291906185b0565b600060405180830381600087803b158015614bcd57600080fd5b505af1158015614be1573d6000803e3d6000fd5b505050505050565b6033546001600160a01b03163314612ea85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016110fb565b6000806000614c50614b63565b6001600160a01b031663688ca5b2856040518263ffffffff1660e01b8152600401614c7d91815260200190565b606060405180830381865afa158015614c9a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614cbe91906185c9565b9250925092509193909250565b6000806000614cd8614b63565b6001600160a01b03166309970688856040518263ffffffff1660e01b8152600401614d0591815260200190565b606060405180830381865afa158015614d22573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614cbe91906185f7565b600061180069456e7653746f7261676560b01b6155e6565b600054610100900460ff16614d855760405162461bcd60e51b81526004016110fb90618625565b612ea8615654565b600054610100900460ff16614db45760405162461bcd60e51b81526004016110fb90618625565b612ea8615682565b6000611800665374616b696e6760c81b6155e6565b604051600190606f90614de590869061838c565b9081526040519081900360200190205460ff1615614e01575060005b606e85604051614e11919061838c565b9081526040519081900360200190205460ff1615614e2d575060005b60008383604051602001614e429291906183a8565b60408051601f1981840301815291815281516020928301206000818152607090935291205490915060ff1615614e7757600091505b50949350505050565b614e88614dbc565b60405163282d3fdf60e01b81526001600160a01b03848116600483015260248201849052919091169063282d3fdf90604401614bb3565b614ec7614b63565b6001600160a01b031663daacbb95868684610120015187878760000151886020015189604001518a606001518b608001518c60a001518d60c001516040518d63ffffffff1660e01b8152600401614f299c9b9a99989796959493929190618670565b600060405180830381600087803b158015614f4357600080fd5b505af1158015614f57573d6000803e3d6000fd5b505050505050505050565b614f6a614b63565b604051633968764960e11b815260048101849052602481018390526001600160a01b0391909116906372d0ec9290604401614bb3565b6000614faa614d46565b6001600160a01b0316639801bff984846040518363ffffffff1660e01b8152600401614fd79291906185b0565b602060405180830381865afa158015614ff4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906150189190618163565b9392505050565b615027614b63565b60405163548f2cdd60e11b815260048101849052602481018390526001600160a01b03919091169063a91e59ba90604401614bb3565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6150b7614b63565b604051632264085960e01b81526004810185905260248101849052604481018390526001600160a01b0391909116906322640859906064015b600060405180830381600087803b15801561510a57600080fd5b505af1158015614699573d6000803e3d6000fd5b6000600190508480519060200120826020015180519060200120141580156151655750606f85604051615151919061838c565b9081526040519081900360200190205460ff165b1561516e575060005b8580519060200120826000015180519060200120141580156151af5750606e8660405161519b919061838c565b9081526040519081900360200190205460ff165b156151b8575060005b600084846040516020016151cd9291906183a8565b60405160208183030381529060405280519060200120905080836040015184606001516040516020016152019291906183a8565b6040516020818303038152906040528051906020012014158015615233575060008181526070602052604090205460ff165b1561523d57600091505b5095945050505050565b61524f614b63565b60405163605b78c360e11b81526004810185905260248101849052604481018390526001600160a01b03919091169063c0b6f186906064016150f0565b6004821561530c5750600360001984016152b6576152a9856156b2565b6152b1575060045b6153a3565b600284036152c7576152b185615bbc565b600384036152d9576152a985836160fc565b600484036152ea576152b185616696565b600584036152fb576152b185616758565b600684036152b1576152b18561689c565b600684036153a357600061531e614b63565b60405163060e6a9960e01b8152600481018890529091506000906001600160a01b0383169063060e6a9990602401600060405180830381865afa158015615369573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052615391919081019061870d565b509150506153a08288836169ef565b50505b6153ad858261501f565b816153b85760006077555b5050505050565b60008060006153cd84614c43565b5090925090506001810361546b57607754156153fb5760405162461bcd60e51b81526004016110fb9061875c565b600061540685614ccb565b92505050615412611795565b811015615435576154308542615426611795565b61420090426182f2565b615460565b8061543e614986565b1015615451576154308542615426614986565b615460854261420084826182f2565b5060778490556154cb565b600281036154995760775484146154945760405162461bcd60e51b81526004016110fb9061875c565b6154cb565b60405162461bcd60e51b8152602060048201526007602482015266115e1c1a5c995960ca1b60448201526064016110fb565b5092915050565b600060765460016154e391906182f2565b905060006154f033612e27565b905060006154fd60695490565b6155099061271061879f565b905060008461551957600261551c565b60015b9050615526614b63565b6040516325918ae760e21b815260048101869052602481018890526001600160a01b038581166044830152606482018490526084820185905291909116906396462b9c9060a401600060405180830381600087803b15801561558757600080fd5b505af115801561559b573d6000803e3d6000fd5b505050607694909455505050505050565b60008060006155b9614b63565b6001600160a01b03166356ba988e856040518263ffffffff1660e01b8152600401614d0591815260200190565b606554604051630d2020dd60e01b8152600481018390526000916001600160a01b031690630d2020dd90602401602060405180830381865afa158015615630573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ad791906184b4565b600054610100900460ff1661567b5760405162461bcd60e51b81526004016110fb90618625565b6001607855565b600054610100900460ff166156a95760405162461bcd60e51b81526004016110fb90618625565b612ea83361505d565b60006156bf826001616b21565b6000806000806000806000806156d48a616c3d565b98509850985098509850985098509850506156ee88613a9a565b1561574c5789600080516020618b5d8339815191526040516157349060208082526010908201526f20b63932b0b23c90309036b2b6b132b960811b604082015260600190565b60405180910390a25060009998505050505050505050565b61575586612a45565b1561579d5789600080516020618b5d8339815191526040516157349060208082526012908201527120b63932b0b23c9030903932bbb0b93232b960711b604082015260600190565b6157a561474a565b8110806157b85750806157b6612cf2565b105b156157d95789600080516020618b5d833981519152604051615734906183ca565b806157e389616ce4565b10156158055789600080516020618b5d833981519152604051615734906187c1565b866001600160a01b0316886001600160a01b0316141580156158395750856001600160a01b0316886001600160a01b031614155b156158855789600080516020618b5d83398151915260405161573490602080825260169082015275496e76616c6964206d656d626572206164647265737360501b604082015260600190565b61588f8882614e80565b600060695460016158a091906182f2565b9050876067600083815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555080606860008a6001600160a01b03166001600160a01b031681526020019081526020016000208190555086606a600083815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555080606b6000896001600160a01b03166001600160a01b031681526020019081526020016000208190555088606c600083815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555080606d60008b6001600160a01b03166001600160a01b0316815260200190815260200160002081905550600060745460016159d991906182f2565b60008181526071602090815260409091208951929350916159ff918391908b01906178f2565b508651615a1590600183019060208a01906178f2565b508551615a2b90600283019060208901906178f2565b508481600301819055506001606e89604051615a47919061838c565b908152604051908190036020018120805492151560ff1990931692909217909155600190606f90615a79908a9061838c565b908152602001604051809103902060006101000a81548160ff0219169083151502179055506001607060008888604051602001615ab79291906183a8565b60405160208183030381529060405280519060200120815260200190815260200160002060006101000a81548160ff0219169083151502179055508a6073600084815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555081607260008d6001600160a01b03166001600160a01b0316815260200190815260200160002081905550826069819055508160748190555043606681905550896001600160a01b03168b6001600160a01b03167f6a2af11b2d73f347f9d5840aea46899e17609730b5cd91bd9c312098038acba660405160405180910390a35060019c9b505050505050505050505050565b615bc7816002616b21565b6000615bd282616c3d565b50505050505050509050615be581613a9a565b615c3a5781600080516020618b5d833981519152604051615c2e906020808252601490820152732737ba1030b63932b0b23c90309036b2b6b132b960611b604082015260600190565b60405180910390a25050565b6001600160a01b038082166000818152606d6020818152604080842054606954808652606c8452828620548287526067855283872054606a86529387205497909652939092529094928316939083169216908414615da257606980546000908152606c6020818152604080842080546001600160a01b038c8116808852606d80875285892080549e8a529787528589209087529b821688528488209c909c559486905581546001600160a01b03199081169092558954821690851617909855888452606b8083528185205486548652606a80855283872080548a881689528487528589208054948a529287528589209487528716808952858920939093559087905580548b16905581548a16179055978352606880825288842054945484526067808352898520805489861687528385528b872080548989529386528c8820949095529094168086529985205592905580548616905580549094168517909355919291615e1f565b606980546000908152606c6020908152604080832080546001600160a01b03199081169091556001600160a01b038a81168552606d845282852085905585548552606a84528285208054831690558681168552606b8452828520859055945484526067835281842080549091169055928516825260689052908120555b6001606954615e2e91906181bd565b6069556000848152607160205260408082209051909190606f90615e569060018501906188a1565b908152604051908190036020018120805492151560ff1990931692909217909155600090606e90615e889084906188a1565b90815260405160209181900382018120805460ff19169315159390931790925560038301546000926070928492615ec4926002880192016188ad565b60408051808303601f1901815291815281516020928301208352828201939093529082016000908120805460ff1916941515949094179093556074546001600160a01b038a16845260729091529120541461601e576001600160a01b038087166000908152607260209081526040808320546074548452607383528184205460719093529220805492985092169550829190615f5f90618358565b615f6a929190617976565b5060745460009081526071602052604090206001908101805491830191615f9090618358565b615f9b929190617976565b5060745460009081526071602052604090206002908101805491830191615fc190618358565b615fcc929190617976565b506074546000908152607160209081526040808320600390810154908501558783526073825280832080546001600160a01b0319166001600160a01b0389169081179091558352607290915290208590555b60748054600090815260736020908152604080832080546001600160a01b03191690556001600160a01b038a1683526072825280832083905592548252607190529081209061606d82826179f1565b61607b6001830160006179f1565b6160896002830160006179f1565b6003820160009055505060016074546160a291906181bd565b607455436066556160b38787616d1e565b826001600160a01b0316866001600160a01b03167faa91016c21c52c58ac64f23f71bbe75becc9ada603e18ee671d09ff15492d1c160405160405180910390a350505050505050565b60008161610e5761610e836003616b21565b60008060008060008060008060006161258c616c3d565b98509850985098509850985098509850985061614089613a9a565b6161ac578b600080516020618b5d833981519152604051616192906020808252601b908201527f4f6c642061646472657373206973206e6f742061206d656d6265720000000000604082015260600190565b60405180910390a260009950505050505050505050613ad7565b6161bf8c8c8b8b8b8b8b8b8b8b8b616eec565b6161d55760009950505050505050505050613ad7565b6001600160a01b03808a166000818152606d6020526040902054918a1614616244576000818152606c6020908152604080832080546001600160a01b0319166001600160a01b038e81169182179092558452606d909252808320849055908c1682528120556162448983614e80565b6001600160a01b038a166000908152607260209081526040808320548084526071909252808320905191929091606e9061627f9084906188a1565b908152604051908190036020018120805492151560ff1990931692909217909155600090606f906162b49060018501906188a1565b90815260405160209181900382018120805460ff191693151593909317909255600383015460009260709284926162f0926002880192016188ad565b60408051808303601f1901815291815281516020928301208352828201939093529101600020805460ff1916921515929092179091558851616337918391908b01906178f2565b50865161634d90600183019060208a01906178f2565b50855161636390600283019060208901906178f2565b506003810185905543606655604051600190606e90616383908b9061838c565b908152604051908190036020018120805492151560ff1990931692909217909155600190606f906163b5908a9061838c565b908152602001604051809103902060006101000a81548160ff02191690831515021790555060016070600088886040516020016163f39291906183a8565b60408051808303601f1901815291815281516020928301208352828201939093529082016000908120805460ff191694151594909417909355858352606a90529020546001600160a01b0390811691508916811461648f576000838152606a6020908152604080832080546001600160a01b0319166001600160a01b038e81169182179092558452606b90925280832086905590831682528120555b506000828152606760205260409020546001600160a01b03908116908a16811461654157896067600085815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555082606860008c6001600160a01b03166001600160a01b0316815260200190815260200160002081905550600060686000836001600160a01b03166001600160a01b03168152602001908152602001600020819055505b50896001600160a01b03168b6001600160a01b03161461664157896073600083815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555080607260008c6001600160a01b03166001600160a01b03168152602001908152602001600020819055506000607260008d6001600160a01b03166001600160a01b03168152602001908152602001600020819055506165f28e8c616d1e565b886001600160a01b03168a6001600160a01b03168c6001600160a01b03167f15f4d750630db473a85edd9d47c500527a2648cc5e676f39645e52790cf07be060405160405180910390a4616682565b896001600160a01b03168b6001600160a01b03167f1feee1b4fcb797c62645da41c5c6edd5f91d4291de0054da625c42b823594c1f60405160405180910390a35b5060019d9c50505050505050505050505050565b6166a1816004616b21565b60006166ab614b63565b6001600160a01b0316637efa9ae3836040518263ffffffff1660e01b81526004016166d891815260200190565b602060405180830381865afa1580156166f5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061671991906184b4565b90506001600160a01b038116156167545761673381617486565b6040805160008082526020820190925261674f91839190617514565b436066555b5050565b616763816005616b21565b6000806000616770614b63565b6001600160a01b0316631d940da2856040518263ffffffff1660e01b815260040161679d91815260200190565b600060405180830381865afa1580156167ba573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526167e291908101906188c6565b92509250925060006167f2614d46565b6040516388c2801960e01b81529091506001600160a01b038216906388c280199061682390879086906004016185b0565b600060405180830381600087803b15801561683d57600080fd5b505af1158015616851573d6000803e3d6000fd5b50504360665550506040517f701c16c2519cdb79aaac423a84733590e3510d9552055b6ad6908f0ab12b6c299061688d908690869086906188ff565b60405180910390a15050505050565b6168a7816006616b21565b60006168b1614b63565b90506000806000836001600160a01b031663060e6a99866040518263ffffffff1660e01b81526004016168e691815260200190565b600060405180830381865afa158015616903573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261692b919081019061870d565b925092509250600080846001600160a01b0316848460405161694d919061838c565b60006040518083038185875af1925050503d806000811461698a576040519150601f19603f3d011682016040523d82523d6000602084013e61698f565b606091505b509150915043606681905550846001600160a01b03168215157f57508e122d767c940c66fc3762dd79760bb534bd2f7c4902ae678853f7dec9af8686856040516169db93929190618927565b60405180910390a381614699576146998688865b806000036169fc57505050565b6040516302b385fb60e01b8152600481018390526000906001600160a01b038516906302b385fb90602401600060405180830381865afa158015616a44573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052616a6c9190810190618952565b505050505050509350505050600080826001600160a01b03168460405160006040518083038185875af1925050503d8060008114616ac6576040519150601f19603f3d011682016040523d82523d6000602084013e616acb565b606091505b509150915081614be157826001600160a01b0316857f2c57f69ad84301745a13b9cc61ef37ef145f0db4f64480f09ccd360cc093dc668684604051616b119291906185b0565b60405180910390a3505050505050565b600080616b2d84614c43565b5091509150828214616b775760405162461bcd60e51b8152602060048201526013602482015272496e76616c696420766f74696e67207479706560681b60448201526064016110fb565b60028114616bbe5760405162461bcd60e51b8152602060048201526014602482015273496e76616c696420766f74696e6720737461746560601b60448201526064016110fb565b600080616bca866155ac565b9250925050616bd861138990565b82101580616be857506113898110155b80616bfd5750616bf881836182f2565b612710145b614be15760405162461bcd60e51b8152602060048201526011602482015270139bdd081e595d08199a5b985b1a5e9959607a1b60448201526064016110fb565b6000806000806060806060600080616c53614b63565b6001600160a01b03166373df4e018b6040518263ffffffff1660e01b8152600401616c8091815260200190565b600060405180830381865afa158015616c9d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052616cc59190810190618a07565b9850985098509850985098509850985098509193959799909294969850565b6000616cee614dbc565b6040516325d998bb60e01b81526001600160a01b03848116600483015291909116906325d998bb90602401614b22565b600080616d2a846175fb565b91509150616d3661474a565b616d4082846182f2565b1115616dd05760405162461bcd60e51b815260206004820152605360248201527f6d696e5374616b696e672076616c7565206d757374206265206772656174657260448201527f207468616e206f7220657175616c20746f207468652073756d206f6620756e6c6064820152726f636b416d6f756e742c20736c617368696e6760681b608482015260a4016110fb565b6000616dda614dbc565b604051632c9aab9b60e11b81526001600160a01b038681166004830152919250600091831690635935573690602401602060405180830381865afa158015616e26573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190616e4a9190618242565b90506000616e5661474a565b616e6090836181bd565b905084821115616ee257616e74868661767c565b604051634954a85b60e11b81526001600160a01b03878116600483015260248201869052604482018390528416906392a950b690606401600060405180830381600087803b158015616ec557600080fd5b505af1158015616ed9573d6000803e3d6000fd5b50505050614699565b614699868361767c565b60008a616efe57616efe8c6003616b21565b616f078a613a9a565b616f69578b600080516020618b5d833981519152604051616f59906020808252601b908201527f4f6c642061646472657373206973206e6f742061206d656d6265720000000000604082015260600190565b60405180910390a2506000617477565b6001600160a01b03808b166000818152606d6020526040902054918b16146170e057616f948a613a9a565b15616ff9578c600080516020618b5d833981519152604051616fe7906020808252601f908201527f6e6577206164647265737320697320616c72656164792061206d656d62657200604082015260600190565b60405180910390a26000915050617477565b886001600160a01b03168a6001600160a01b03161415801561702d5750876001600160a01b03168a6001600160a01b031614155b15617078578c600080516020618b5d833981519152604051616fe790602080825260159082015274496e76616c696420766f746572206164647265737360581b604082015260600190565b61708061474a565b831080617093575082617091612cf2565b105b156170b4578c600080516020618b5d833981519152604051616fe7906183ca565b826170be8b616ce4565b10156170e0578c600080516020618b5d833981519152604051616fe7906187c1565b6001600160a01b038b16600090815260726020908152604080832054808452607190925280832081516080810190925280549293928290829061712290618358565b80601f016020809104026020016040519081016040528092919081815260200182805461714e90618358565b801561719b5780601f106171705761010080835404028352916020019161719b565b820191906000526020600020905b81548152906001019060200180831161717e57829003601f168201915b505050505081526020016001820180546171b490618358565b80601f01602080910402602001604051908101604052809291908181526020018280546171e090618358565b801561722d5780601f106172025761010080835404028352916020019161722d565b820191906000526020600020905b81548152906001019060200180831161721057829003601f168201915b5050505050815260200160028201805461724690618358565b80601f016020809104026020016040519081016040528092919081815260200182805461727290618358565b80156172bf5780601f10617294576101008083540402835291602001916172bf565b820191906000526020600020905b8154815290600101906020018083116172a257829003601f168201915b5050505050815260200160038201548152505090506172e1898989898561511e565b617315578e600080516020618b5d833981519152604051617301906183f7565b60405180910390a260009350505050617477565b506000828152606a60205260409020546001600160a01b03908116908d8116908b16148015906173575750896001600160a01b0316816001600160a01b031614155b801561737657506173678a613a9a565b8061737657506173768a612a45565b156173c2578e600080516020618b5d83398151915260405161730190602080825260169082015275496e76616c696420726577617264206164647265737360501b604082015260600190565b506000828152606760205260409020546001600160a01b03908116908d8116908c161480159061740457508a6001600160a01b0316816001600160a01b031614155b801561742357506174148b613a9a565b8061742357506174238b612a45565b1561746f578e600080516020618b5d83398151915260405161730190602080825260169082015275496e76616c696420766f74657273206164647265737360501b604082015260600190565b506001925050505b9b9a5050505050505050505050565b61748e614acc565b60405163288c314960e21b81523360048201526001600160a01b03919091169063a230c52490602401602060405180830381865afa1580156174d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906174f89190618163565b614ac95760405162461bcd60e51b81526004016110fb90618180565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff161561754c57617547836176bb565b505050565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156175a6575060408051601f3d908101601f191682019092526175a391810190618242565b60015b6175c25760405162461bcd60e51b81526004016110fb9061825b565b600080516020618b1d83398151915281146175ef5760405162461bcd60e51b81526004016110fb906182a9565b50617547838383617757565b600080617606614b63565b6001600160a01b0316638c7be692846040518263ffffffff1660e01b815260040161763391815260200190565b6040805180830381865afa15801561764f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906176739190618ae5565b91509150915091565b617684614dbc565b604051637eee288d60e01b81526001600160a01b038481166004830152602482018490529190911690637eee288d90604401614bb3565b6001600160a01b0381163b6177285760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084016110fb565b600080516020618b1d83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6177608361777c565b60008251118061776d5750805b1561754757611e7f83836177bc565b617785816176bb565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606150188383604051806060016040528060278152602001618b7d6027913960606001600160a01b0384163b6178445760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b60648201526084016110fb565b600080856001600160a01b03168560405161785f919061838c565b600060405180830381855af49150503d806000811461789a576040519150601f19603f3d011682016040523d82523d6000602084013e61789f565b606091505b50915091506178af8282866178b9565b9695505050505050565b606083156178c8575081615018565b8251156178d85782518084602001fd5b8160405162461bcd60e51b81526004016110fb9190618b09565b8280546178fe90618358565b90600052602060002090601f0160209004810192826179205760008555617966565b82601f1061793957805160ff1916838001178555617966565b82800160010185558215617966579182015b8281111561796657825182559160200191906001019061794b565b50617972929150617a27565b5090565b82805461798290618358565b90600052602060002090601f0160209004810192826179a45760008555617966565b82601f106179b55780548555617966565b8280016001018555821561796657600052602060002091601f016020900482015b828111156179665782548255916001019190600101906179d6565b5080546179fd90618358565b6000825580601f10617a0d575050565b601f016020900490600052602060002090810190614ac991905b5b808211156179725760008155600101617a28565b6001600160a01b0381168114614ac957600080fd5b8035612e9181617a3c565b634e487b7160e01b600052604160045260246000fd5b60405161014081016001600160401b0381118282101715617a9557617a95617a5c565b60405290565b604051601f8201601f191681016001600160401b0381118282101715617ac357617ac3617a5c565b604052919050565b60006001600160401b03821115617ae457617ae4617a5c565b50601f01601f191660200190565b600082601f830112617b0357600080fd5b8135617b16617b1182617acb565b617a9b565b818152846020838601011115617b2b57600080fd5b816020850160208301376000918101602001919091529392505050565b600080600060608486031215617b5d57600080fd5b8335617b6881617a3c565b925060208401356001600160401b03811115617b8357600080fd5b617b8f86828701617af2565b925050604084013590509250925092565b600060208284031215617bb257600080fd5b813561501881617a3c565b600060208284031215617bcf57600080fd5b5035919050565b600080600060608486031215617beb57600080fd5b8335617bf681617a3c565b92506020840135915060408401356001600160401b03811115617c1857600080fd5b617c2486828701617af2565b9150509250925092565b60006101408284031215617c4157600080fd5b617c49617a72565b9050617c5482617a51565b8152617c6260208301617a51565b6020820152617c7360408301617a51565b604082015260608201356001600160401b0380821115617c9257600080fd5b617c9e85838601617af2565b60608401526080840135915080821115617cb757600080fd5b617cc385838601617af2565b608084015260a0840135915080821115617cdc57600080fd5b617ce885838601617af2565b60a084015260c084013560c084015260e084013560e084015261010091508184013581811115617d1757600080fd5b617d2386828701617af2565b8385015250505061012080830135818301525092915050565b600060208284031215617d4e57600080fd5b81356001600160401b03811115617d6457600080fd5b617d7084828501617c2e565b949350505050565b600080600060608486031215617d8d57600080fd5b8335617d9881617a3c565b9250602084013591506040840135617daf81617a3c565b809150509250925092565b60008060008060808587031215617dd057600080fd5b8435617ddb81617a3c565b935060208501356001600160401b0380821115617df757600080fd5b617e0388838901617af2565b94506040870135915080821115617e1957600080fd5b50617e2687828801617af2565b949793965093946060013593505050565b600080600080600060a08688031215617e4f57600080fd5b853594506020860135935060408601356001600160401b0380821115617e7457600080fd5b617e8089838a01617af2565b94506060880135915080821115617e9657600080fd5b50617ea388828901617af2565b95989497509295608001359392505050565b60005b83811015617ed0578181015183820152602001617eb8565b83811115611e7f5750506000910152565b60008151808452617ef9816020860160208601617eb5565b601f01601f19169290920160200192915050565b608081526000617f206080830187617ee1565b8281036020840152617f328187617ee1565b90508281036040840152617f468186617ee1565b91505082606083015295945050505050565b60008060408385031215617f6b57600080fd5b8235617f7681617a3c565b915060208301356001600160401b03811115617f9157600080fd5b617f9d85828601617af2565b9150509250929050565b60008060008060008060c08789031215617fc057600080fd5b8635617fcb81617a3c565b95506020870135945060408701356001600160401b03811115617fed57600080fd5b617ff989828a01617af2565b945050606087013592506080870135915060a087013590509295509295509295565b6000806000806080858703121561803157600080fd5b84356001600160401b0381111561804757600080fd5b61805387828801617c2e565b945050602085013561806481617a3c565b93969395505050506040820135916060013590565b60008060008060008060c0878903121561809257600080fd5b863561809d81617a3c565b95506020870135945060408701356001600160401b03808211156180c057600080fd5b6180cc8a838b01617af2565b955060608901359150808211156180e257600080fd5b6180ee8a838b01617af2565b9450608089013591508082111561810457600080fd5b5061811189828a01617af2565b92505060a087013590509295509295509295565b8015158114614ac957600080fd5b6000806040838503121561814657600080fd5b82359150602083013561815881618125565b809150509250929050565b60006020828403121561817557600080fd5b815161501881618125565b6020808252600d908201526c2737902832b936b4b9b9b4b7b760991b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000828210156181cf576181cf6181a7565b500390565b6020808252601d908201527f43616e6e6f74206164642070726f706f73616c20746f6f206561726c79000000604082015260600190565b60208082526017908201527f496e76616c6964207374616b696e672062616c616e6365000000000000000000604082015260600190565b60006020828403121561825457600080fd5b5051919050565b6020808252602e908201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960408201526d6f6e206973206e6f74205555505360901b606082015260800190565b60208082526029908201527f45524331393637557067726164653a20756e737570706f727465642070726f786040820152681a58589b195555525160ba1b606082015260800190565b60008219821115618305576183056181a7565b500190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b600181811c9082168061836c57607f821691505b602082108103613a9457634e487b7160e01b600052602260045260246000fd5b6000825161839e818460208701617eb5565b9190910192915050565b600083516183ba818460208801617eb5565b9190910191825250602001919050565b602080825260139082015272125b9d985b1a59081b1bd8dac8185b5bdd5b9d606a1b604082015260600190565b6020808252601490820152734475706c696361746564206e6f646520696e666f60601b604082015260600190565b878152866020820152856040820152600060018060a01b0380871660608401528086166080840152508360a083015260e060c083015261846860e0830184617ee1565b9998505050505050505050565b87815286602082015285604082015260018060a01b03851660608201528360808201528260a082015260e060c0820152600061846860e0830184617ee1565b6000602082840312156184c657600080fd5b815161501881617a3c565b8051612e9181617a3c565b600082601f8301126184ed57600080fd5b81516184fb617b1182617acb565b81815284602083860101111561851057600080fd5b617d70826020830160208701617eb5565b6000806000806080858703121561853757600080fd5b84516001600160401b038082111561854e57600080fd5b61855a888389016184dc565b9550602087015191508082111561857057600080fd5b61857c888389016184dc565b9450604087015191508082111561859257600080fd5b5061859f878288016184dc565b606096909601519497939650505050565b828152604060208201526000617d706040830184617ee1565b6000806000606084860312156185de57600080fd5b83519250602084015191506040840151617daf81618125565b60008060006060848603121561860c57600080fd5b8351925060208401519150604084015190509250925092565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b8c8152602081018c9052604081018b90526001600160a01b038a81166060830152898116608083015288811660a083015287811660c0830152861660e08201526000610180806101008401526186c881840188617ee1565b90508281036101208401526186dd8187617ee1565b90508281036101408401526186f28186617ee1565b915050826101608301529d9c50505050505050505050505050565b60008060006060848603121561872257600080fd5b835161872d81617a3c565b6020850151604086015191945092506001600160401b0381111561875057600080fd5b617c24868287016184dc565b60208082526023908201527f4e6f7720696e20766f74696e67207769746820646966666572656e742062616c6040820152621b1bdd60ea1b606082015260800190565b6000826187bc57634e487b7160e01b600052601260045260246000fd5b500490565b60208082526027908201527f496e73756666696369656e742062616c616e636520746861742063616e206265604082015266081b1bd8dad95960ca1b606082015260800190565b8054600090600181811c908083168061882257607f831692505b6020808410820361884357634e487b7160e01b600052602260045260246000fd5b818015618857576001811461886857618895565b60ff19861689528489019650618895565b60008881526020902060005b8681101561888d5781548b820152908501908301618874565b505084890196505b50505050505092915050565b60006150188284618808565b60006188b98285618808565b9283525050602001919050565b6000806000606084860312156188db57600080fd5b835192506020840151915060408401516001600160401b0381111561875057600080fd5b83815282602082015260606040820152600061891e6060830184617ee1565b95945050505050565b8381526060602082015260006189406060830185617ee1565b82810360408401526178af8185617ee1565b60008060008060008060008060008060006101608c8e03121561897457600080fd5b8b519a5060208c0151995060408c0151985060608c015161899481617a3c565b60808d01519098506001600160401b038111156189b057600080fd5b6189bc8e828f016184dc565b97505060a08c0151955060c08c0151945060e08c015193506101008c015192506101208c01516189eb81618125565b809250506101408c015190509295989b509295989b9093969950565b60008060008060008060008060006101208a8c031215618a2657600080fd5b618a2f8a6184d1565b9850618a3d60208b016184d1565b9750618a4b60408b016184d1565b9650618a5960608b016184d1565b955060808a01516001600160401b0380821115618a7557600080fd5b618a818d838e016184dc565b965060a08c0151915080821115618a9757600080fd5b618aa38d838e016184dc565b955060c08c0151915080821115618ab957600080fd5b50618ac68c828d016184dc565b93505060e08a015191506101008a015190509295985092959850929598565b60008060408385031215618af857600080fd5b505080516020909101519092909150565b6020815260006150186020830184617ee156fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249885e7f4987c0698db47045ad8cea110b51138f0eecbd94915842328cf6c3dc97d416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212209dfea10b5c3f59723a267d8b27b3a510120d9c4c19c0de8eb23e161703dede8364736f6c634300080e0033", } // GovImpABI is the input ABI used to generate the binding from. @@ -2975,6 +2976,27 @@ func (_GovImp *GovImpTransactorSession) AddProposalToChangeMember(newInfo GovImp return _GovImp.Contract.AddProposalToChangeMember(&_GovImp.TransactOpts, newInfo, oldStaker, unlockAmount, slashing) } +// AddProposalToExecute is a paid mutator transaction binding the contract method 0x404e585d. +// +// Solidity: function addProposalToExecute(address _target, bytes _calldata, bytes _memo, uint256 _duration) payable returns() +func (_GovImp *GovImpTransactor) AddProposalToExecute(opts *bind.TransactOpts, _target common.Address, _calldata []byte, _memo []byte, _duration *big.Int) (*types.Transaction, error) { + return _GovImp.contract.Transact(opts, "addProposalToExecute", _target, _calldata, _memo, _duration) +} + +// AddProposalToExecute is a paid mutator transaction binding the contract method 0x404e585d. +// +// Solidity: function addProposalToExecute(address _target, bytes _calldata, bytes _memo, uint256 _duration) payable returns() +func (_GovImp *GovImpSession) AddProposalToExecute(_target common.Address, _calldata []byte, _memo []byte, _duration *big.Int) (*types.Transaction, error) { + return _GovImp.Contract.AddProposalToExecute(&_GovImp.TransactOpts, _target, _calldata, _memo, _duration) +} + +// AddProposalToExecute is a paid mutator transaction binding the contract method 0x404e585d. +// +// Solidity: function addProposalToExecute(address _target, bytes _calldata, bytes _memo, uint256 _duration) payable returns() +func (_GovImp *GovImpTransactorSession) AddProposalToExecute(_target common.Address, _calldata []byte, _memo []byte, _duration *big.Int) (*types.Transaction, error) { + return _GovImp.Contract.AddProposalToExecute(&_GovImp.TransactOpts, _target, _calldata, _memo, _duration) +} + // AddProposalToRemoveMember is a paid mutator transaction binding the contract method 0x894f5111. // // Solidity: function addProposalToRemoveMember(address staker, uint256 lockAmount, bytes memo, uint256 duration, uint256 unlockAmount, uint256 slashing) returns(uint256 ballotIdx) @@ -3208,44 +3230,44 @@ func (_GovImp *GovImpTransactorSession) TransferOwnership(newOwner common.Addres // UpgradeTo is a paid mutator transaction binding the contract method 0x3659cfe6. // -// Solidity: function upgradeTo(address newImplementation) returns() -func (_GovImp *GovImpTransactor) UpgradeTo(opts *bind.TransactOpts, newImplementation common.Address) (*types.Transaction, error) { - return _GovImp.contract.Transact(opts, "upgradeTo", newImplementation) +// Solidity: function upgradeTo(address ) returns() +func (_GovImp *GovImpTransactor) UpgradeTo(opts *bind.TransactOpts, arg0 common.Address) (*types.Transaction, error) { + return _GovImp.contract.Transact(opts, "upgradeTo", arg0) } // UpgradeTo is a paid mutator transaction binding the contract method 0x3659cfe6. // -// Solidity: function upgradeTo(address newImplementation) returns() -func (_GovImp *GovImpSession) UpgradeTo(newImplementation common.Address) (*types.Transaction, error) { - return _GovImp.Contract.UpgradeTo(&_GovImp.TransactOpts, newImplementation) +// Solidity: function upgradeTo(address ) returns() +func (_GovImp *GovImpSession) UpgradeTo(arg0 common.Address) (*types.Transaction, error) { + return _GovImp.Contract.UpgradeTo(&_GovImp.TransactOpts, arg0) } // UpgradeTo is a paid mutator transaction binding the contract method 0x3659cfe6. // -// Solidity: function upgradeTo(address newImplementation) returns() -func (_GovImp *GovImpTransactorSession) UpgradeTo(newImplementation common.Address) (*types.Transaction, error) { - return _GovImp.Contract.UpgradeTo(&_GovImp.TransactOpts, newImplementation) +// Solidity: function upgradeTo(address ) returns() +func (_GovImp *GovImpTransactorSession) UpgradeTo(arg0 common.Address) (*types.Transaction, error) { + return _GovImp.Contract.UpgradeTo(&_GovImp.TransactOpts, arg0) } // UpgradeToAndCall is a paid mutator transaction binding the contract method 0x4f1ef286. // -// Solidity: function upgradeToAndCall(address newImplementation, bytes data) payable returns() -func (_GovImp *GovImpTransactor) UpgradeToAndCall(opts *bind.TransactOpts, newImplementation common.Address, data []byte) (*types.Transaction, error) { - return _GovImp.contract.Transact(opts, "upgradeToAndCall", newImplementation, data) +// Solidity: function upgradeToAndCall(address , bytes ) payable returns() +func (_GovImp *GovImpTransactor) UpgradeToAndCall(opts *bind.TransactOpts, arg0 common.Address, arg1 []byte) (*types.Transaction, error) { + return _GovImp.contract.Transact(opts, "upgradeToAndCall", arg0, arg1) } // UpgradeToAndCall is a paid mutator transaction binding the contract method 0x4f1ef286. // -// Solidity: function upgradeToAndCall(address newImplementation, bytes data) payable returns() -func (_GovImp *GovImpSession) UpgradeToAndCall(newImplementation common.Address, data []byte) (*types.Transaction, error) { - return _GovImp.Contract.UpgradeToAndCall(&_GovImp.TransactOpts, newImplementation, data) +// Solidity: function upgradeToAndCall(address , bytes ) payable returns() +func (_GovImp *GovImpSession) UpgradeToAndCall(arg0 common.Address, arg1 []byte) (*types.Transaction, error) { + return _GovImp.Contract.UpgradeToAndCall(&_GovImp.TransactOpts, arg0, arg1) } // UpgradeToAndCall is a paid mutator transaction binding the contract method 0x4f1ef286. // -// Solidity: function upgradeToAndCall(address newImplementation, bytes data) payable returns() -func (_GovImp *GovImpTransactorSession) UpgradeToAndCall(newImplementation common.Address, data []byte) (*types.Transaction, error) { - return _GovImp.Contract.UpgradeToAndCall(&_GovImp.TransactOpts, newImplementation, data) +// Solidity: function upgradeToAndCall(address , bytes ) payable returns() +func (_GovImp *GovImpTransactorSession) UpgradeToAndCall(arg0 common.Address, arg1 []byte) (*types.Transaction, error) { + return _GovImp.Contract.UpgradeToAndCall(&_GovImp.TransactOpts, arg0, arg1) } // Vote is a paid mutator transaction binding the contract method 0xc9d27afe. @@ -3684,6 +3706,317 @@ func (_GovImp *GovImpFilterer) ParseEnvChanged(log types.Log) (*GovImpEnvChanged return event, nil } +// GovImpExecutedIterator is returned from FilterExecuted and is used to iterate over the raw logs and unpacked data for Executed events raised by the GovImp contract. +type GovImpExecutedIterator struct { + Event *GovImpExecuted // 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 *GovImpExecutedIterator) 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(GovImpExecuted) + 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(GovImpExecuted) + 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 *GovImpExecutedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *GovImpExecutedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// GovImpExecuted represents a Executed event raised by the GovImp contract. +type GovImpExecuted struct { + Success bool + To common.Address + Value *big.Int + Calldatas []byte + ReturnData []byte + Raw types.Log // Blockchain specific contextual infos +} + +// FilterExecuted is a free log retrieval operation binding the contract event 0x57508e122d767c940c66fc3762dd79760bb534bd2f7c4902ae678853f7dec9af. +// +// Solidity: event Executed(bool indexed success, address indexed to, uint256 value, bytes calldatas, bytes returnData) +func (_GovImp *GovImpFilterer) FilterExecuted(opts *bind.FilterOpts, success []bool, to []common.Address) (*GovImpExecutedIterator, error) { + + var successRule []interface{} + for _, successItem := range success { + successRule = append(successRule, successItem) + } + var toRule []interface{} + for _, toItem := range to { + toRule = append(toRule, toItem) + } + + logs, sub, err := _GovImp.contract.FilterLogs(opts, "Executed", successRule, toRule) + if err != nil { + return nil, err + } + return &GovImpExecutedIterator{contract: _GovImp.contract, event: "Executed", logs: logs, sub: sub}, nil +} + +// WatchExecuted is a free log subscription operation binding the contract event 0x57508e122d767c940c66fc3762dd79760bb534bd2f7c4902ae678853f7dec9af. +// +// Solidity: event Executed(bool indexed success, address indexed to, uint256 value, bytes calldatas, bytes returnData) +func (_GovImp *GovImpFilterer) WatchExecuted(opts *bind.WatchOpts, sink chan<- *GovImpExecuted, success []bool, to []common.Address) (event.Subscription, error) { + + var successRule []interface{} + for _, successItem := range success { + successRule = append(successRule, successItem) + } + var toRule []interface{} + for _, toItem := range to { + toRule = append(toRule, toItem) + } + + logs, sub, err := _GovImp.contract.WatchLogs(opts, "Executed", successRule, toRule) + 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(GovImpExecuted) + if err := _GovImp.contract.UnpackLog(event, "Executed", 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 +} + +// ParseExecuted is a log parse operation binding the contract event 0x57508e122d767c940c66fc3762dd79760bb534bd2f7c4902ae678853f7dec9af. +// +// Solidity: event Executed(bool indexed success, address indexed to, uint256 value, bytes calldatas, bytes returnData) +func (_GovImp *GovImpFilterer) ParseExecuted(log types.Log) (*GovImpExecuted, error) { + event := new(GovImpExecuted) + if err := _GovImp.contract.UnpackLog(event, "Executed", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// GovImpFailReturnValueIterator is returned from FilterFailReturnValue and is used to iterate over the raw logs and unpacked data for FailReturnValue events raised by the GovImp contract. +type GovImpFailReturnValueIterator struct { + Event *GovImpFailReturnValue // 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 *GovImpFailReturnValueIterator) 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(GovImpFailReturnValue) + 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(GovImpFailReturnValue) + 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 *GovImpFailReturnValueIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *GovImpFailReturnValueIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// GovImpFailReturnValue represents a FailReturnValue event raised by the GovImp contract. +type GovImpFailReturnValue struct { + BallotIdx *big.Int + Creator common.Address + Value *big.Int + Result []byte + Raw types.Log // Blockchain specific contextual infos +} + +// FilterFailReturnValue is a free log retrieval operation binding the contract event 0x2c57f69ad84301745a13b9cc61ef37ef145f0db4f64480f09ccd360cc093dc66. +// +// Solidity: event FailReturnValue(uint256 indexed ballotIdx, address indexed creator, uint256 value, bytes result) +func (_GovImp *GovImpFilterer) FilterFailReturnValue(opts *bind.FilterOpts, ballotIdx []*big.Int, creator []common.Address) (*GovImpFailReturnValueIterator, error) { + + var ballotIdxRule []interface{} + for _, ballotIdxItem := range ballotIdx { + ballotIdxRule = append(ballotIdxRule, ballotIdxItem) + } + var creatorRule []interface{} + for _, creatorItem := range creator { + creatorRule = append(creatorRule, creatorItem) + } + + logs, sub, err := _GovImp.contract.FilterLogs(opts, "FailReturnValue", ballotIdxRule, creatorRule) + if err != nil { + return nil, err + } + return &GovImpFailReturnValueIterator{contract: _GovImp.contract, event: "FailReturnValue", logs: logs, sub: sub}, nil +} + +// WatchFailReturnValue is a free log subscription operation binding the contract event 0x2c57f69ad84301745a13b9cc61ef37ef145f0db4f64480f09ccd360cc093dc66. +// +// Solidity: event FailReturnValue(uint256 indexed ballotIdx, address indexed creator, uint256 value, bytes result) +func (_GovImp *GovImpFilterer) WatchFailReturnValue(opts *bind.WatchOpts, sink chan<- *GovImpFailReturnValue, ballotIdx []*big.Int, creator []common.Address) (event.Subscription, error) { + + var ballotIdxRule []interface{} + for _, ballotIdxItem := range ballotIdx { + ballotIdxRule = append(ballotIdxRule, ballotIdxItem) + } + var creatorRule []interface{} + for _, creatorItem := range creator { + creatorRule = append(creatorRule, creatorItem) + } + + logs, sub, err := _GovImp.contract.WatchLogs(opts, "FailReturnValue", ballotIdxRule, creatorRule) + 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(GovImpFailReturnValue) + if err := _GovImp.contract.UnpackLog(event, "FailReturnValue", 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 +} + +// ParseFailReturnValue is a log parse operation binding the contract event 0x2c57f69ad84301745a13b9cc61ef37ef145f0db4f64480f09ccd360cc093dc66. +// +// Solidity: event FailReturnValue(uint256 indexed ballotIdx, address indexed creator, uint256 value, bytes result) +func (_GovImp *GovImpFilterer) ParseFailReturnValue(log types.Log) (*GovImpFailReturnValue, error) { + event := new(GovImpFailReturnValue) + if err := _GovImp.contract.UnpackLog(event, "FailReturnValue", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + // GovImpGovDataMigratedIterator is returned from FilterGovDataMigrated and is used to iterate over the raw logs and unpacked data for GovDataMigrated events raised by the GovImp contract. type GovImpGovDataMigratedIterator struct { Event *GovImpGovDataMigrated // Event containing the contract specifics and raw log diff --git a/wemix/bind/gen_ncpExit_abi.go b/wemix/bind/gen_ncpExit_abi.go index 28dda1ab0da2..a1e325159c7c 100644 --- a/wemix/bind/gen_ncpExit_abi.go +++ b/wemix/bind/gen_ncpExit_abi.go @@ -34,7 +34,7 @@ var NCPExitMetaData = &bind.MetaData{ Sigs: map[string]string{ "5c60da1b": "implementation()", }, - Bin: "0x608060405234801561001057600080fd5b5060405161077238038061077283398101604081905261002f91610326565b604080516020810190915260008152819061006b60017f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbd61034f565b60008051602061072b8339815191521461008757610087610374565b6100938282600061009b565b505050610405565b6100a4836100d1565b6000825111806100b15750805b156100cc576100ca838361011160201b61008b1760201c565b505b505050565b6100da8161013d565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6060610136838360405180606001604052806027815260200161074b602791396101fd565b9392505050565b610150816102db60201b6100b71760201c565b6101b75760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084015b60405180910390fd5b806101dc60008051602061072b83398151915260001b6102ea60201b6100c61760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b60606001600160a01b0384163b6102655760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b60648201526084016101ae565b600080856001600160a01b03168560405161028091906103b6565b600060405180830381855af49150503d80600081146102bb576040519150601f19603f3d011682016040523d82523d6000602084013e6102c0565b606091505b5090925090506102d18282866102ed565b9695505050505050565b6001600160a01b03163b151590565b90565b606083156102fc575081610136565b82511561030c5782518084602001fd5b8160405162461bcd60e51b81526004016101ae91906103d2565b60006020828403121561033857600080fd5b81516001600160a01b038116811461013657600080fd5b60008282101561036f57634e487b7160e01b600052601160045260246000fd5b500390565b634e487b7160e01b600052600160045260246000fd5b60005b838110156103a557818101518382015260200161038d565b838111156100ca5750506000910152565b600082516103c881846020870161038a565b9190910192915050565b60208152600082518060208401526103f181604085016020870161038a565b601f01601f19169190910160400192915050565b610317806104146000396000f3fe6080604052600436106100225760003560e01c80635c60da1b1461003957610031565b366100315761002f61006a565b005b61002f61006a565b34801561004557600080fd5b5061004e61007c565b6040516001600160a01b03909116815260200160405180910390f35b61007a6100756100c9565b6100fc565b565b60006100866100c9565b905090565b60606100b083836040518060600160405280602781526020016102bb60279139610120565b9392505050565b6001600160a01b03163b151590565b90565b60006100867f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b3660008037600080366000845af43d6000803e80801561011b573d6000f35b3d6000fd5b60606001600160a01b0384163b61018d5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b60648201526084015b60405180910390fd5b600080856001600160a01b0316856040516101a8919061026b565b600060405180830381855af49150503d80600081146101e3576040519150601f19603f3d011682016040523d82523d6000602084013e6101e8565b606091505b50915091506101f8828286610202565b9695505050505050565b606083156102115750816100b0565b8251156102215782518084602001fd5b8160405162461bcd60e51b81526004016101849190610287565b60005b8381101561025657818101518382015260200161023e565b83811115610265576000848401525b50505050565b6000825161027d81846020870161023b565b9190910192915050565b60208152600082518060208401526102a681604085016020870161023b565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220e4a9b37c89f90cd2690d55474893040990839e6d9630f2ca907c1c29365285c264736f6c634300080e0033360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564", + Bin: "0x608060405234801561001057600080fd5b5060405161077238038061077283398101604081905261002f91610326565b604080516020810190915260008152819061006b60017f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbd61034f565b60008051602061072b8339815191521461008757610087610374565b6100938282600061009b565b505050610405565b6100a4836100d1565b6000825111806100b15750805b156100cc576100ca838361011160201b61008b1760201c565b505b505050565b6100da8161013d565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6060610136838360405180606001604052806027815260200161074b602791396101fd565b9392505050565b610150816102db60201b6100b71760201c565b6101b75760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084015b60405180910390fd5b806101dc60008051602061072b83398151915260001b6102ea60201b6100c61760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b60606001600160a01b0384163b6102655760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b60648201526084016101ae565b600080856001600160a01b03168560405161028091906103b6565b600060405180830381855af49150503d80600081146102bb576040519150601f19603f3d011682016040523d82523d6000602084013e6102c0565b606091505b5090925090506102d18282866102ed565b9695505050505050565b6001600160a01b03163b151590565b90565b606083156102fc575081610136565b82511561030c5782518084602001fd5b8160405162461bcd60e51b81526004016101ae91906103d2565b60006020828403121561033857600080fd5b81516001600160a01b038116811461013657600080fd5b60008282101561036f57634e487b7160e01b600052601160045260246000fd5b500390565b634e487b7160e01b600052600160045260246000fd5b60005b838110156103a557818101518382015260200161038d565b838111156100ca5750506000910152565b600082516103c881846020870161038a565b9190910192915050565b60208152600082518060208401526103f181604085016020870161038a565b601f01601f19169190910160400192915050565b610317806104146000396000f3fe6080604052600436106100225760003560e01c80635c60da1b1461003957610031565b366100315761002f61006a565b005b61002f61006a565b34801561004557600080fd5b5061004e61007c565b6040516001600160a01b03909116815260200160405180910390f35b61007a6100756100c9565b6100fc565b565b60006100866100c9565b905090565b60606100b083836040518060600160405280602781526020016102bb60279139610120565b9392505050565b6001600160a01b03163b151590565b90565b60006100867f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b3660008037600080366000845af43d6000803e80801561011b573d6000f35b3d6000fd5b60606001600160a01b0384163b61018d5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b60648201526084015b60405180910390fd5b600080856001600160a01b0316856040516101a8919061026b565b600060405180830381855af49150503d80600081146101e3576040519150601f19603f3d011682016040523d82523d6000602084013e6101e8565b606091505b50915091506101f8828286610202565b9695505050505050565b606083156102115750816100b0565b8251156102215782518084602001fd5b8160405162461bcd60e51b81526004016101849190610287565b60005b8381101561025657818101518382015260200161023e565b83811115610265576000848401525b50505050565b6000825161027d81846020870161023b565b9190910192915050565b60208152600082518060208401526102a681604085016020870161023b565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220dd2ff9008a502a6cd20fd850732e8cc379eb87e2d3c001715aada60807a86a9864736f6c634300080e0033360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564", } // NCPExitABI is the input ABI used to generate the binding from. @@ -734,7 +734,7 @@ var NCPExitImpMetaData = &bind.MetaData{ "00fc5701": "withdrawForAdministrator(address,uint256,address)", "b007a5ad": "withdrawForUser(address,address,uint256)", }, - Bin: "0x60a06040523060805234801561001457600080fd5b5061001d610022565b6100e2565b600054610100900460ff161561008e5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff90811610156100e0576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b608051611a67610119600039600081816105ee0152818161062e015281816106ae015281816106ee01526107810152611a676000f3fe6080604052600436106101695760003560e01c8063738fdd1a116100d15780639986e4b91161008a578063c4d66de811610064578063c4d66de814610439578063dd38f90b14610459578063df8089ef14610479578063f2fde38b1461049957600080fd5b80639986e4b9146103d5578063a91ee0dc146103f9578063b007a5ad1461041957600080fd5b8063738fdd1a146102f55780637bf465301461032d578063805c5ccc1461034e5780638408bdb1146103845780638c56c8c3146103975780638da5cb5b146103b757600080fd5b80634bd1ed76116101235780634bd1ed76146102495780634f1ef2861461026b57806352d1902d1461027e5780635a731cca146102935780636c78d2cf146102b7578063715018a6146102e057600080fd5b8062fc5701146101755780631083fc6e146101975780631e0cba0d146101b75780632f40992e146101e857806334125c84146102095780633659cfe61461022957600080fd5b3661017057005b600080fd5b34801561018157600080fd5b50610195610190366004611588565b6104b9565b005b3480156101a357600080fd5b506101956101b23660046115ca565b6105a5565b3480156101c357600080fd5b506101d5665374616b696e6760c81b81565b6040519081526020015b60405180910390f35b3480156101f457600080fd5b506101d56914995dd85c99141bdbdb60b21b81565b34801561021557600080fd5b506101d56845636f73797374656d60b81b81565b34801561023557600080fd5b506101956102443660046115ca565b6105e4565b34801561025557600080fd5b506101d56a4d61696e74656e616e636560a81b81565b6101956102793660046115fd565b6106a4565b34801561028a57600080fd5b506101d5610774565b34801561029f57600080fd5b506101d56c14dd185ada5b99d4995dd85c99609a1b81565b3480156102c357600080fd5b506101d57111dbdd995c9b985b98d950dbdb9d1c9858dd60721b81565b3480156102ec57600080fd5b50610195610827565b34801561030157600080fd5b50606554610315906001600160a01b031681565b6040516001600160a01b0390911681526020016101df565b34801561033957600080fd5b506101d569456e7653746f7261676560b01b81565b34801561035a57600080fd5b506101d56103693660046115ca565b6001600160a01b03166000908152609b602052604090205490565b6101956103923660046116c1565b61083b565b3480156103a357600080fd5b506101956103b23660046115ca565b610929565b3480156103c357600080fd5b506033546001600160a01b0316610315565b3480156103e157600080fd5b506101d56c42616c6c6f7453746f7261676560981b81565b34801561040557600080fd5b506101956104143660046115ca565b61099b565b34801561042557600080fd5b506101956104343660046116f6565b610a13565b34801561044557600080fd5b506101956104543660046115ca565b610c10565b34801561046557600080fd5b506101d56104743660046115ca565b610d5f565b34801561048557600080fd5b506101956104943660046115ca565b610dc1565b3480156104a557600080fd5b506101956104b43660046115ca565b610e33565b6002606654036104e45760405162461bcd60e51b81526004016104db90611737565b60405180910390fd5b60026066556098546001600160a01b031633146105135760405162461bcd60e51b81526004016104db9061176e565b6001600160a01b0383166000908152609b6020908152604080832054609a909252909120548391610543916117b8565b101561054e57600080fd5b6001600160a01b0383166000908152609a60205260409020546105729083906117b8565b6001600160a01b038085166000908152609a602052604090209190915561059b90821683610ea9565b5050600160665550565b6105ad610fc7565b6001600160a01b038116156105e1576105c581611021565b604080516000808252602082019092526105e191839190611029565b50565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361062c5760405162461bcd60e51b81526004016104db906117dd565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166106756000805160206119eb833981519152546001600160a01b031690565b6001600160a01b03161461069b5760405162461bcd60e51b81526004016104db90611829565b6105c581611021565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036106ec5760405162461bcd60e51b81526004016104db906117dd565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166107356000805160206119eb833981519152546001600160a01b031690565b6001600160a01b03161461075b5760405162461bcd60e51b81526004016104db90611829565b61076482611021565b61077082826001611029565b5050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108145760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c000000000000000060648201526084016104db565b506000805160206119eb83398151915290565b61082f610fc7565b6108396000611194565b565b60026066540361085d5760405162461bcd60e51b81526004016104db90611737565b600260665561086a6111e6565b6001600160a01b0316336001600160a01b0316146108f05760405162461bcd60e51b815260206004820152603860248201527f4f6e6c7920676f7665726e616e6365207374616b696e6720636f6e747261637460448201527f2063616e2063616c6c20746869732066756e6374696f6e2e000000000000000060648201526084016104db565b3482146108fc57600080fd5b6001600160a01b039092166000908152609a6020908152604080832093909355609b905220556001606655565b6099546001600160a01b031633146109535760405162461bcd60e51b81526004016104db90611875565b6001600160a01b0381166109795760405162461bcd60e51b81526004016104db906118b7565b609980546001600160a01b0319166001600160a01b0392909216919091179055565b6109a3610fc7565b6001600160a01b0381166109c95760405162461bcd60e51b81526004016104db906118b7565b606580546001600160a01b0319166001600160a01b0383169081179091556040517f278c70ced5f3e0e5eeb385b5ff9cb735748ba00a625147e66065ed48fc1562cd90600090a250565b600260665403610a355760405162461bcd60e51b81526004016104db90611737565b6002606655610a426111e6565b6001600160a01b031663f1b8aa1d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aa391906118ee565b6001600160a01b0316336001600160a01b031614610b135760405162461bcd60e51b815260206004820152602760248201527f4f6e6c79204e63705374616b696e672063616e2063616c6c20746869732066756044820152663731ba34b7b71760c91b60648201526084016104db565b6001600160a01b0383166000908152609b6020526040902054811115610b935760405162461bcd60e51b815260206004820152602f60248201527f5f6c6f636b65645573657242616c616e6365546f4e4350546f74616c5b65786960448201526e1d1398dc17480f8f48185b5bdd5b9d608a1b60648201526084016104db565b6001600160a01b0383166000908152609a6020526040902054610bb79082906117b8565b6001600160a01b0384166000908152609a6020908152604080832093909355609b90522054610be79082906117b8565b6001600160a01b038085166000908152609b602052604090209190915561059b90831682610ea9565b600054610100900460ff1615808015610c305750600054600160ff909116105b80610c4a5750303b158015610c4a575060005460ff166001145b610cad5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016104db565b6000805460ff191660011790558015610cd0576000805461ff0019166101001790555b610cd8611200565b610ce061122f565b610ce98261099b565b603354609880546001600160a01b039092166001600160a01b03199283168117909155609980549092161790558015610770576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b6098546000906001600160a01b03163314610d8c5760405162461bcd60e51b81526004016104db9061176e565b6001600160a01b0382166000908152609b6020908152604080832054609a90925290912054610dbb91906117b8565b92915050565b6099546001600160a01b03163314610deb5760405162461bcd60e51b81526004016104db90611875565b6001600160a01b038116610e115760405162461bcd60e51b81526004016104db906118b7565b609880546001600160a01b0319166001600160a01b0392909216919091179055565b610e3b610fc7565b6001600160a01b038116610ea05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016104db565b6105e181611194565b80471015610ef95760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016104db565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114610f46576040519150601f19603f3d011682016040523d82523d6000602084013e610f4b565b606091505b5050905080610fc25760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016104db565b505050565b6033546001600160a01b031633146108395760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104db565b6105e1610fc7565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff161561105c57610fc28361125e565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156110b6575060408051601f3d908101601f191682019092526110b39181019061190b565b60015b6111195760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b60648201526084016104db565b6000805160206119eb83398151915281146111885760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b60648201526084016104db565b50610fc28383836112fa565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006111fb665374616b696e6760c81b611325565b905090565b600054610100900460ff166112275760405162461bcd60e51b81526004016104db90611924565b610839611393565b600054610100900460ff166112565760405162461bcd60e51b81526004016104db90611924565b6108396113c3565b6001600160a01b0381163b6112cb5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084016104db565b6000805160206119eb83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b611303836113f1565b6000825111806113105750805b15610fc25761131f8383611431565b50505050565b606554604051630d2020dd60e01b8152600481018390526000916001600160a01b031690630d2020dd90602401602060405180830381865afa15801561136f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dbb91906118ee565b600054610100900460ff166113ba5760405162461bcd60e51b81526004016104db90611924565b61083933611194565b600054610100900460ff166113ea5760405162461bcd60e51b81526004016104db90611924565b6001606655565b6113fa8161125e565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606114568383604051806060016040528060278152602001611a0b6027913961145d565b9392505050565b60606001600160a01b0384163b6114c55760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b60648201526084016104db565b600080856001600160a01b0316856040516114e0919061199b565b600060405180830381855af49150503d806000811461151b576040519150601f19603f3d011682016040523d82523d6000602084013e611520565b606091505b509150915061153082828661153a565b9695505050505050565b60608315611549575081611456565b8251156115595782518084602001fd5b8160405162461bcd60e51b81526004016104db91906119b7565b6001600160a01b03811681146105e157600080fd5b60008060006060848603121561159d57600080fd5b83356115a881611573565b92506020840135915060408401356115bf81611573565b809150509250925092565b6000602082840312156115dc57600080fd5b813561145681611573565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561161057600080fd5b823561161b81611573565b9150602083013567ffffffffffffffff8082111561163857600080fd5b818501915085601f83011261164c57600080fd5b81358181111561165e5761165e6115e7565b604051601f8201601f19908116603f01168101908382118183101715611686576116866115e7565b8160405282815288602084870101111561169f57600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6000806000606084860312156116d657600080fd5b83356116e181611573565b95602085013595506040909401359392505050565b60008060006060848603121561170b57600080fd5b833561171681611573565b9250602084013561172681611573565b929592945050506040919091013590565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252602a908201527f4f6e6c792041646d696e6973747261746f722063616e2063616c6c207468697360408201526910333ab731ba34b7b71760b11b606082015260800190565b6000828210156117d857634e487b7160e01b600052601160045260246000fd5b500390565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b60208082526022908201527f43616c6c6572206973206e6f742041646d696e6973747261746f725365747465604082015261391760f11b606082015260800190565b6020808252601a908201527f416464726573732073686f756c64206265206e6f6e2d7a65726f000000000000604082015260600190565b60006020828403121561190057600080fd5b815161145681611573565b60006020828403121561191d57600080fd5b5051919050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60005b8381101561198a578181015183820152602001611972565b8381111561131f5750506000910152565b600082516119ad81846020870161196f565b9190910192915050565b60208152600082518060208401526119d681604085016020870161196f565b601f01601f1916919091016040019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220b00f4e5c886400503c92d7ed21f3804a28036c7ccf34340b73b7a47ece983e6764736f6c634300080e0033", + Bin: "0x60a06040523060805234801561001457600080fd5b5061001d610022565b6100e2565b600054610100900460ff161561008e5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff90811610156100e0576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b608051611a67610119600039600081816105ee0152818161062e015281816106ae015281816106ee01526107810152611a676000f3fe6080604052600436106101695760003560e01c8063738fdd1a116100d15780639986e4b91161008a578063c4d66de811610064578063c4d66de814610439578063dd38f90b14610459578063df8089ef14610479578063f2fde38b1461049957600080fd5b80639986e4b9146103d5578063a91ee0dc146103f9578063b007a5ad1461041957600080fd5b8063738fdd1a146102f55780637bf465301461032d578063805c5ccc1461034e5780638408bdb1146103845780638c56c8c3146103975780638da5cb5b146103b757600080fd5b80634bd1ed76116101235780634bd1ed76146102495780634f1ef2861461026b57806352d1902d1461027e5780635a731cca146102935780636c78d2cf146102b7578063715018a6146102e057600080fd5b8062fc5701146101755780631083fc6e146101975780631e0cba0d146101b75780632f40992e146101e857806334125c84146102095780633659cfe61461022957600080fd5b3661017057005b600080fd5b34801561018157600080fd5b50610195610190366004611588565b6104b9565b005b3480156101a357600080fd5b506101956101b23660046115ca565b6105a5565b3480156101c357600080fd5b506101d5665374616b696e6760c81b81565b6040519081526020015b60405180910390f35b3480156101f457600080fd5b506101d56914995dd85c99141bdbdb60b21b81565b34801561021557600080fd5b506101d56845636f73797374656d60b81b81565b34801561023557600080fd5b506101956102443660046115ca565b6105e4565b34801561025557600080fd5b506101d56a4d61696e74656e616e636560a81b81565b6101956102793660046115fd565b6106a4565b34801561028a57600080fd5b506101d5610774565b34801561029f57600080fd5b506101d56c14dd185ada5b99d4995dd85c99609a1b81565b3480156102c357600080fd5b506101d57111dbdd995c9b985b98d950dbdb9d1c9858dd60721b81565b3480156102ec57600080fd5b50610195610827565b34801561030157600080fd5b50606554610315906001600160a01b031681565b6040516001600160a01b0390911681526020016101df565b34801561033957600080fd5b506101d569456e7653746f7261676560b01b81565b34801561035a57600080fd5b506101d56103693660046115ca565b6001600160a01b03166000908152609b602052604090205490565b6101956103923660046116c1565b61083b565b3480156103a357600080fd5b506101956103b23660046115ca565b610929565b3480156103c357600080fd5b506033546001600160a01b0316610315565b3480156103e157600080fd5b506101d56c42616c6c6f7453746f7261676560981b81565b34801561040557600080fd5b506101956104143660046115ca565b61099b565b34801561042557600080fd5b506101956104343660046116f6565b610a13565b34801561044557600080fd5b506101956104543660046115ca565b610c10565b34801561046557600080fd5b506101d56104743660046115ca565b610d5f565b34801561048557600080fd5b506101956104943660046115ca565b610dc1565b3480156104a557600080fd5b506101956104b43660046115ca565b610e33565b6002606654036104e45760405162461bcd60e51b81526004016104db90611737565b60405180910390fd5b60026066556098546001600160a01b031633146105135760405162461bcd60e51b81526004016104db9061176e565b6001600160a01b0383166000908152609b6020908152604080832054609a909252909120548391610543916117b8565b101561054e57600080fd5b6001600160a01b0383166000908152609a60205260409020546105729083906117b8565b6001600160a01b038085166000908152609a602052604090209190915561059b90821683610ea9565b5050600160665550565b6105ad610fc7565b6001600160a01b038116156105e1576105c581611021565b604080516000808252602082019092526105e191839190611029565b50565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361062c5760405162461bcd60e51b81526004016104db906117dd565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166106756000805160206119eb833981519152546001600160a01b031690565b6001600160a01b03161461069b5760405162461bcd60e51b81526004016104db90611829565b6105c581611021565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036106ec5760405162461bcd60e51b81526004016104db906117dd565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166107356000805160206119eb833981519152546001600160a01b031690565b6001600160a01b03161461075b5760405162461bcd60e51b81526004016104db90611829565b61076482611021565b61077082826001611029565b5050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108145760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c000000000000000060648201526084016104db565b506000805160206119eb83398151915290565b61082f610fc7565b6108396000611194565b565b60026066540361085d5760405162461bcd60e51b81526004016104db90611737565b600260665561086a6111e6565b6001600160a01b0316336001600160a01b0316146108f05760405162461bcd60e51b815260206004820152603860248201527f4f6e6c7920676f7665726e616e6365207374616b696e6720636f6e747261637460448201527f2063616e2063616c6c20746869732066756e6374696f6e2e000000000000000060648201526084016104db565b3482146108fc57600080fd5b6001600160a01b039092166000908152609a6020908152604080832093909355609b905220556001606655565b6099546001600160a01b031633146109535760405162461bcd60e51b81526004016104db90611875565b6001600160a01b0381166109795760405162461bcd60e51b81526004016104db906118b7565b609980546001600160a01b0319166001600160a01b0392909216919091179055565b6109a3610fc7565b6001600160a01b0381166109c95760405162461bcd60e51b81526004016104db906118b7565b606580546001600160a01b0319166001600160a01b0383169081179091556040517f278c70ced5f3e0e5eeb385b5ff9cb735748ba00a625147e66065ed48fc1562cd90600090a250565b600260665403610a355760405162461bcd60e51b81526004016104db90611737565b6002606655610a426111e6565b6001600160a01b031663f1b8aa1d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aa391906118ee565b6001600160a01b0316336001600160a01b031614610b135760405162461bcd60e51b815260206004820152602760248201527f4f6e6c79204e63705374616b696e672063616e2063616c6c20746869732066756044820152663731ba34b7b71760c91b60648201526084016104db565b6001600160a01b0383166000908152609b6020526040902054811115610b935760405162461bcd60e51b815260206004820152602f60248201527f5f6c6f636b65645573657242616c616e6365546f4e4350546f74616c5b65786960448201526e1d1398dc17480f8f48185b5bdd5b9d608a1b60648201526084016104db565b6001600160a01b0383166000908152609a6020526040902054610bb79082906117b8565b6001600160a01b0384166000908152609a6020908152604080832093909355609b90522054610be79082906117b8565b6001600160a01b038085166000908152609b602052604090209190915561059b90831682610ea9565b600054610100900460ff1615808015610c305750600054600160ff909116105b80610c4a5750303b158015610c4a575060005460ff166001145b610cad5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016104db565b6000805460ff191660011790558015610cd0576000805461ff0019166101001790555b610cd8611200565b610ce061122f565b610ce98261099b565b603354609880546001600160a01b039092166001600160a01b03199283168117909155609980549092161790558015610770576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b6098546000906001600160a01b03163314610d8c5760405162461bcd60e51b81526004016104db9061176e565b6001600160a01b0382166000908152609b6020908152604080832054609a90925290912054610dbb91906117b8565b92915050565b6099546001600160a01b03163314610deb5760405162461bcd60e51b81526004016104db90611875565b6001600160a01b038116610e115760405162461bcd60e51b81526004016104db906118b7565b609880546001600160a01b0319166001600160a01b0392909216919091179055565b610e3b610fc7565b6001600160a01b038116610ea05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016104db565b6105e181611194565b80471015610ef95760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016104db565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114610f46576040519150601f19603f3d011682016040523d82523d6000602084013e610f4b565b606091505b5050905080610fc25760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016104db565b505050565b6033546001600160a01b031633146108395760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104db565b6105e1610fc7565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff161561105c57610fc28361125e565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156110b6575060408051601f3d908101601f191682019092526110b39181019061190b565b60015b6111195760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b60648201526084016104db565b6000805160206119eb83398151915281146111885760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b60648201526084016104db565b50610fc28383836112fa565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006111fb665374616b696e6760c81b611325565b905090565b600054610100900460ff166112275760405162461bcd60e51b81526004016104db90611924565b610839611393565b600054610100900460ff166112565760405162461bcd60e51b81526004016104db90611924565b6108396113c3565b6001600160a01b0381163b6112cb5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084016104db565b6000805160206119eb83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b611303836113f1565b6000825111806113105750805b15610fc25761131f8383611431565b50505050565b606554604051630d2020dd60e01b8152600481018390526000916001600160a01b031690630d2020dd90602401602060405180830381865afa15801561136f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dbb91906118ee565b600054610100900460ff166113ba5760405162461bcd60e51b81526004016104db90611924565b61083933611194565b600054610100900460ff166113ea5760405162461bcd60e51b81526004016104db90611924565b6001606655565b6113fa8161125e565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606114568383604051806060016040528060278152602001611a0b6027913961145d565b9392505050565b60606001600160a01b0384163b6114c55760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b60648201526084016104db565b600080856001600160a01b0316856040516114e0919061199b565b600060405180830381855af49150503d806000811461151b576040519150601f19603f3d011682016040523d82523d6000602084013e611520565b606091505b509150915061153082828661153a565b9695505050505050565b60608315611549575081611456565b8251156115595782518084602001fd5b8160405162461bcd60e51b81526004016104db91906119b7565b6001600160a01b03811681146105e157600080fd5b60008060006060848603121561159d57600080fd5b83356115a881611573565b92506020840135915060408401356115bf81611573565b809150509250925092565b6000602082840312156115dc57600080fd5b813561145681611573565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561161057600080fd5b823561161b81611573565b9150602083013567ffffffffffffffff8082111561163857600080fd5b818501915085601f83011261164c57600080fd5b81358181111561165e5761165e6115e7565b604051601f8201601f19908116603f01168101908382118183101715611686576116866115e7565b8160405282815288602084870101111561169f57600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6000806000606084860312156116d657600080fd5b83356116e181611573565b95602085013595506040909401359392505050565b60008060006060848603121561170b57600080fd5b833561171681611573565b9250602084013561172681611573565b929592945050506040919091013590565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252602a908201527f4f6e6c792041646d696e6973747261746f722063616e2063616c6c207468697360408201526910333ab731ba34b7b71760b11b606082015260800190565b6000828210156117d857634e487b7160e01b600052601160045260246000fd5b500390565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b60208082526022908201527f43616c6c6572206973206e6f742041646d696e6973747261746f725365747465604082015261391760f11b606082015260800190565b6020808252601a908201527f416464726573732073686f756c64206265206e6f6e2d7a65726f000000000000604082015260600190565b60006020828403121561190057600080fd5b815161145681611573565b60006020828403121561191d57600080fd5b5051919050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60005b8381101561198a578181015183820152602001611972565b8381111561131f5750506000910152565b600082516119ad81846020870161196f565b9190910192915050565b60208152600082518060208401526119d681604085016020870161196f565b601f01601f1916919091016040019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212209b98f9fdbd4e76d93d2686578da71b4561cd700183355101dca0ebab51473b5164736f6c634300080e0033", } // NCPExitImpABI is the input ABI used to generate the binding from. diff --git a/wemix/bind/gen_registry_abi.go b/wemix/bind/gen_registry_abi.go index c7aa5c0002ce..c7e93d25f5e1 100644 --- a/wemix/bind/gen_registry_abi.go +++ b/wemix/bind/gen_registry_abi.go @@ -44,7 +44,7 @@ var RegistryMetaData = &bind.MetaData{ "599e4c70": "setPermission(bytes32,address,bool)", "f2fde38b": "transferOwnership(address)", }, - Bin: "0x60806040526d57656d697820526567697374727960015534801561002257600080fd5b5061002c33610031565b610081565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b610659806100906000396000f3fe608060405234801561001057600080fd5b50600436106100a95760003560e01c806360d6c7cf1161007157806360d6c7cf14610159578063715018a6146101925780637d10dd1b1461019c5780638da5cb5b146101a5578063ec56a373146101b6578063f2fde38b146101df57600080fd5b806304af66ad146100ae5780630d2020dd146100d65780630d854646146101015780633ec50c6c14610118578063599e4c7014610146575b600080fd5b6100c16100bc36600461050b565b6101f2565b60405190151581526020015b60405180910390f35b6100e96100e4366004610537565b6102b9565b6040516001600160a01b0390911681526020016100cd565b61010a60015481565b6040519081526020016100cd565b6100c161012636600461050b565b600460209081526000928352604080842090915290825290205460ff1681565b6100c1610154366004610550565b610309565b6100c161016736600461050b565b60009182526004602090815260408084206001600160a01b0393909316845291905290205460ff1690565b61019a6103ce565b005b61010a60025481565b6000546001600160a01b03166100e9565b6100e96101c4366004610537565b6003602052600090815260409020546001600160a01b031681565b61019a6101ed366004610595565b610404565b600080546001600160a01b031633146102265760405162461bcd60e51b815260040161021d906105b7565b60405180910390fd5b6001600160a01b03821661024c5760405162461bcd60e51b815260040161021d906105ec565b60008381526003602090815260409182902080546001600160a01b0319166001600160a01b03861690811790915543600255915133815285917f37724a4a9968ac9654e6ee52f3d0c93e5ef8863e057254ee2e36e8ad3e8429db910160405180910390a350600192915050565b6000818152600360205260408120546001600160a01b03166102ed5760405162461bcd60e51b815260040161021d906105ec565b506000908152600360205260409020546001600160a01b031690565b600080546001600160a01b031633146103345760405162461bcd60e51b815260040161021d906105b7565b6001600160a01b03831661035a5760405162461bcd60e51b815260040161021d906105ec565b60008481526004602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915543600255905190815286917fe9f5231bbfb4b32867755b94562215cff6c8998489de8ba20926f8d0980e7818910160405180910390a35060019392505050565b6000546001600160a01b031633146103f85760405162461bcd60e51b815260040161021d906105b7565b610402600061049f565b565b6000546001600160a01b0316331461042e5760405162461bcd60e51b815260040161021d906105b7565b6001600160a01b0381166104935760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161021d565b61049c8161049f565b50565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80356001600160a01b038116811461050657600080fd5b919050565b6000806040838503121561051e57600080fd5b8235915061052e602084016104ef565b90509250929050565b60006020828403121561054957600080fd5b5035919050565b60008060006060848603121561056557600080fd5b83359250610575602085016104ef565b91506040840135801515811461058a57600080fd5b809150509250925092565b6000602082840312156105a757600080fd5b6105b0826104ef565b9392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601a908201527f616464726573732073686f756c64206265206e6f6e2d7a65726f00000000000060408201526060019056fea2646970667358221220b7b950e503cb9742f3e07f2288e28f096b282d71a7b32fe533576ba4d480652064736f6c634300080e0033", + Bin: "0x60806040526d57656d697820526567697374727960015534801561002257600080fd5b5061002c33610031565b610081565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b610659806100906000396000f3fe608060405234801561001057600080fd5b50600436106100a95760003560e01c806360d6c7cf1161007157806360d6c7cf14610159578063715018a6146101925780637d10dd1b1461019c5780638da5cb5b146101a5578063ec56a373146101b6578063f2fde38b146101df57600080fd5b806304af66ad146100ae5780630d2020dd146100d65780630d854646146101015780633ec50c6c14610118578063599e4c7014610146575b600080fd5b6100c16100bc36600461050b565b6101f2565b60405190151581526020015b60405180910390f35b6100e96100e4366004610537565b6102b9565b6040516001600160a01b0390911681526020016100cd565b61010a60015481565b6040519081526020016100cd565b6100c161012636600461050b565b600460209081526000928352604080842090915290825290205460ff1681565b6100c1610154366004610550565b610309565b6100c161016736600461050b565b60009182526004602090815260408084206001600160a01b0393909316845291905290205460ff1690565b61019a6103ce565b005b61010a60025481565b6000546001600160a01b03166100e9565b6100e96101c4366004610537565b6003602052600090815260409020546001600160a01b031681565b61019a6101ed366004610595565b610404565b600080546001600160a01b031633146102265760405162461bcd60e51b815260040161021d906105b7565b60405180910390fd5b6001600160a01b03821661024c5760405162461bcd60e51b815260040161021d906105ec565b60008381526003602090815260409182902080546001600160a01b0319166001600160a01b03861690811790915543600255915133815285917f37724a4a9968ac9654e6ee52f3d0c93e5ef8863e057254ee2e36e8ad3e8429db910160405180910390a350600192915050565b6000818152600360205260408120546001600160a01b03166102ed5760405162461bcd60e51b815260040161021d906105ec565b506000908152600360205260409020546001600160a01b031690565b600080546001600160a01b031633146103345760405162461bcd60e51b815260040161021d906105b7565b6001600160a01b03831661035a5760405162461bcd60e51b815260040161021d906105ec565b60008481526004602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915543600255905190815286917fe9f5231bbfb4b32867755b94562215cff6c8998489de8ba20926f8d0980e7818910160405180910390a35060019392505050565b6000546001600160a01b031633146103f85760405162461bcd60e51b815260040161021d906105b7565b610402600061049f565b565b6000546001600160a01b0316331461042e5760405162461bcd60e51b815260040161021d906105b7565b6001600160a01b0381166104935760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161021d565b61049c8161049f565b50565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80356001600160a01b038116811461050657600080fd5b919050565b6000806040838503121561051e57600080fd5b8235915061052e602084016104ef565b90509250929050565b60006020828403121561054957600080fd5b5035919050565b60008060006060848603121561056557600080fd5b83359250610575602085016104ef565b91506040840135801515811461058a57600080fd5b809150509250925092565b6000602082840312156105a757600080fd5b6105b0826104ef565b9392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601a908201527f616464726573732073686f756c64206265206e6f6e2d7a65726f00000000000060408201526060019056fea2646970667358221220633900fa7f3051945359127e207b6a16b376a1f7b7a81e6048c76d8b2d2b625a64736f6c634300080e0033", } // RegistryABI is the input ABI used to generate the binding from. diff --git a/wemix/bind/gen_staking_abi.go b/wemix/bind/gen_staking_abi.go index f1006b530a98..e094c8e05b60 100644 --- a/wemix/bind/gen_staking_abi.go +++ b/wemix/bind/gen_staking_abi.go @@ -748,7 +748,7 @@ var StakingImpMetaData = &bind.MetaData{ "193468ac": "userTotalBalanceOf(address)", "2e1a7d4d": "withdraw(uint256)", }, - Bin: "0x60a0604052306080523480156200001557600080fd5b506200002062000026565b620000e8565b600054610100900460ff1615620000935760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff9081161015620000e6576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6080516135176200012060003960008181610be601528181610c2601528181610cc501528181610d050152610d9401526135176000f3fe6080604052600436106102345760003560e01c8063738fdd1a1161012e578063a91ee0dc116100ab578063d5c258901161006f578063d5c25890146106b3578063f1b8aa1d146106c8578063f2fde38b146106e8578063f3f6308014610708578063f69318221461072857600080fd5b8063a91ee0dc14610643578063b6549f7514610663578063bac4f33814610678578063c0d91eaf1461068b578063d0e30db0146106ab57600080fd5b8063884d97a7116100f2578063884d97a7146105a15780638da5cb5b146105c157806392a950b6146105df5780639667e76a146105ff5780639986e4b91461061f57600080fd5b8063738fdd1a146104e85780637bf46530146105205780637d77a0eb146105415780637eee288d146105615780637f2f4c061461058157600080fd5b806334125c84116101bc5780635935573611610180578063593557361461041a5780635a731cca146104505780636c78d2cf1461047457806370a082311461049d578063715018a6146104d357600080fd5b806334125c84146103905780633659cfe6146103b05780634bd1ed76146103d05780634f1ef286146103f257806352d1902d1461040557600080fd5b8063282d3fdf11610203578063282d3fdf146102ea5780632b0b9c5e1461030c5780632bc9ed021461032c5780632e1a7d4d1461034f5780632f40992e1461036f57600080fd5b80631285361514610243578063193468ac146102765780631e0cba0d146102ac57806325d998bb146102ca57600080fd5b3661023e57600080fd5b600080fd5b34801561024f57600080fd5b5061026361025e366004612e48565b610748565b6040519081526020015b60405180910390f35b34801561028257600080fd5b50610263610291366004612e81565b6001600160a01b0316600090815260ce602052604090205490565b3480156102b857600080fd5b50610263665374616b696e6760c81b81565b3480156102d657600080fd5b506102636102e5366004612e81565b610775565b3480156102f657600080fd5b5061030a610305366004612e9e565b6107a3565b005b34801561031857600080fd5b50610263610327366004612e81565b6107e9565b34801561033857600080fd5b50609b5460ff16604051901515815260200161026d565b34801561035b57600080fd5b5061030a61036a366004612eca565b610845565b34801561037b57600080fd5b506102636914995dd85c99141bdbdb60b21b81565b34801561039c57600080fd5b506102636845636f73797374656d60b81b81565b3480156103bc57600080fd5b5061030a6103cb366004612e81565b610bdc565b3480156103dc57600080fd5b506102636a4d61696e74656e616e636560a81b81565b61030a610400366004612f2a565b610cbb565b34801561041157600080fd5b50610263610d87565b34801561042657600080fd5b50610263610435366004612e81565b6001600160a01b031660009081526099602052604090205490565b34801561045c57600080fd5b506102636c14dd185ada5b99d4995dd85c99609a1b81565b34801561048057600080fd5b506102637111dbdd995c9b985b98d950dbdb9d1c9858dd60721b81565b3480156104a957600080fd5b506102636104b8366004612e81565b6001600160a01b031660009081526098602052604090205490565b3480156104df57600080fd5b5061030a610e3a565b3480156104f457600080fd5b50606554610508906001600160a01b031681565b6040516001600160a01b03909116815260200161026d565b34801561052c57600080fd5b5061026369456e7653746f7261676560b01b81565b34801561054d57600080fd5b5061026361055c366004612fd2565b610e4e565b34801561056d57600080fd5b5061030a61057c366004612e9e565b610ec2565b34801561058d57600080fd5b5061030a61059c366004612e81565b610efb565b3480156105ad57600080fd5b506102636105bc366004612e81565b610fa3565b3480156105cd57600080fd5b506033546001600160a01b0316610508565b3480156105eb57600080fd5b5061030a6105fa366004613009565b610fb0565b34801561060b57600080fd5b5061030a61061a366004612eca565b6112e6565b34801561062b57600080fd5b506102636c42616c6c6f7453746f7261676560981b81565b34801561064f57600080fd5b5061030a61065e366004612e81565b6114e1565b34801561066f57600080fd5b5061030a611589565b61030a610686366004612e81565b611693565b34801561069757600080fd5b5061030a6106a6366004612f2a565b611a85565b61030a611c36565b3480156106bf57600080fd5b50609a54610263565b3480156106d457600080fd5b5060cf54610508906001600160a01b031681565b3480156106f457600080fd5b5061030a610703366004612e81565b612000565b34801561071457600080fd5b5061030a610723366004612e81565b612076565b34801561073457600080fd5b5061030a610743366004612e9e565b612096565b6001600160a01b03808316600090815260cd60209081526040808320938516835292905220545b92915050565b6001600160a01b038116600090815260996020908152604080832054609890925282205461076f9190613054565b336107ac61249b565b6001600160a01b0316146107db5760405162461bcd60e51b81526004016107d29061306b565b60405180910390fd5b6107e582826124c0565b5050565b6001600160a01b038116600090815260ce60209081526040808320546099909252822054811580610818575080155b15610827575060009392505050565b80610833836064613092565b61083d91906130b1565b949350505050565b6002606654036108675760405162461bcd60e51b81526004016107d2906130d3565b6002606655609b5460ff161561088f5760405162461bcd60e51b81526004016107d29061310a565b600081116108af5760405162461bcd60e51b81526004016107d29061312e565b60006108b9612735565b6001600160a01b031663076cd77f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061091a919061316f565b905060006109288383613188565b33600090815260ce602090815260408083205460999092529091205461094e9190613054565b106109615761095d338461274d565b5060015b61096a33610775565b8311156109895760405162461bcd60e51b81526004016107d2906131a0565b336000908152609860205260409020546109a4908490613054565b3360009081526098602052604090205560cf546001600160a01b0316158015906109cb5750805b15610add5760cf546040516000916001600160a01b03169085908381818185875af1925050503d8060008114610a1d576040519150601f19603f3d011682016040523d82523d6000602084013e610a22565b606091505b5050905080610a735760405162461bcd60e51b815260206004820152601e60248201527f5472616e7366657220746f204e4350207374616b696e67206661696c6564000060448201526064016107d2565b60cf546040516306aa67f960e01b8152600481018690523360248201526001600160a01b03909116906306aa67f990604401600060405180830381600087803b158015610abf57600080fd5b505af1158015610ad3573d6000803e3d6000fd5b5050505050610b77565b604051600090339085908381818185875af1925050503d8060008114610b1f576040519150601f19603f3d011682016040523d82523d6000602084013e610b24565b606091505b5050905080610b755760405162461bcd60e51b815260206004820152601960248201527f5472616e7366657220746f2073656e646572206661696c65640000000000000060448201526064016107d2565b505b336000818152609860205260409020547f204fccf0d92ed8d48f204adb39b2e81e92bad0dedb93f5716ca9478cfb57de00908590610bb484610775565b6040805193845260208401929092529082015260600160405180910390a25050600160665550565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610c245760405162461bcd60e51b81526004016107d2906131f4565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610c6d60008051602061349b833981519152546001600160a01b031690565b6001600160a01b031614610c935760405162461bcd60e51b81526004016107d290613240565b610c9c81612896565b60408051600080825260208201909252610cb89183919061289e565b50565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610d035760405162461bcd60e51b81526004016107d2906131f4565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610d4c60008051602061349b833981519152546001600160a01b031690565b6001600160a01b031614610d725760405162461bcd60e51b81526004016107d290613240565b610d7b82612896565b6107e58282600161289e565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610e275760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c000000000000000060648201526084016107d2565b5060008051602061349b83398151915290565b610e42612a09565b610e4c6000612a63565b565b6001600160a01b0382166000908152609960205260408120541580610e77575063ffffffff8216155b15610e845750600061076f565b609a546001600160a01b038416600090815260996020526040902054610eb19063ffffffff851690613092565b610ebb91906130b1565b9392505050565b33610ecb61249b565b6001600160a01b031614610ef15760405162461bcd60e51b81526004016107d29061306b565b6107e5828261274d565b610f03612a09565b6001600160a01b038116610f595760405162461bcd60e51b815260206004820152601e60248201527f4e43505374616b696e6720697320746865207a65726f2061646472657373000060448201526064016107d2565b60cf80546001600160a01b0319166001600160a01b0383169081179091556040517ffd5754300dde6066eda4fabd23616c1d560a3360c85c0716c46e00649bdeeddf90600090a250565b600061076f826064610e4e565b33610fb961249b565b6001600160a01b031614610fdf5760405162461bcd60e51b81526004016107d29061306b565b6000610ff4661390d4115e1a5d60ca1b612ab5565b90506110008484610ec2565b6001600160a01b038416600090815260986020526040902054611024908490613054565b6001600160a01b038516600090815260986020526040812091909155611048612b23565b6001600160a01b03811660009081526098602052604090205490915061106f908590613188565b6001600160a01b03808316600090815260986020908152604080832094909455918816815260ce909152908120546110a79085613054565b90506110b38682610ec2565b6001600160a01b03861660009081526099602090815260408083205460ce909252909120548110156111665760405162461bcd60e51b815260206004820152605060248201527f7472616e73666572656442616c616e6365206d7573742062652067726561746560448201527f72207468616e206f7220657175616c20746f205f6c6f636b656455736572426160648201526f3630b731b2aa37a721a82a37ba30b61760811b608482015260a4016107d2565b6111708782610ec2565b6001600160a01b038716600090815260986020526040902054611194908290613054565b6001600160a01b0388811660008181526098602090815260408083209590955560ce9052839020549251638408bdb160e01b81526004810191909152602481018490526044810192909252851690638408bdb19083906064016000604051808303818588803b15801561120657600080fd5b505af115801561121a573d6000803e3d6000fd5b505060cf546001600160a01b0316159250611268915050576001600160a01b03808816600090815260ce6020908152604080832083905560cd825280832060cf549094168352929052908120555b6001600160a01b0387167f2caed32a519a1fd89486d3ffe06202febb5ed51534d571dbab93058545a29e2461129d8389613188565b6001600160a01b038a166000908152609860205260409020546112bf8b610775565b6040805193845260208401929092529082015260600160405180910390a250505050505050565b6112ee61249b565b604051636f1e853360e01b81523360048201526001600160a01b039190911690636f1e853390602401602060405180830381865afa158015611334573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611358919061328c565b6113745760405162461bcd60e51b81526004016107d29061306b565b61137e33826124c0565b60cf546001600160a01b031615610cb85760cf5460405163bbc2611360e01b81523360048201526000916001600160a01b03169063bbc2611390602401602060405180830381865afa1580156113d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113fc919061316f565b60cf54604051631069f3b560e01b8152600481018390523360248201529192506001600160a01b031690631069f3b59060440160a060405180830381865afa15801561144c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061147091906132ae565b60800151156107e55760cf546040516301008e9960e61b8152600481018490523360248201526001600160a01b0390911690634023a64090604401600060405180830381600087803b1580156114c557600080fd5b505af11580156114d9573d6000803e3d6000fd5b505050505050565b6114e9612a09565b6001600160a01b03811661153f5760405162461bcd60e51b815260206004820152601a60248201527f416464726573732073686f756c64206265206e6f6e2d7a65726f00000000000060448201526064016107d2565b606580546001600160a01b0319166001600160a01b0383169081179091556040517f278c70ced5f3e0e5eeb385b5ff9cb735748ba00a625147e66065ed48fc1562cd90600090a250565b611591612a09565b609b5460ff16156115b45760405162461bcd60e51b81526004016107d29061310a565b60006115c86033546001600160a01b031690565b905047806116065760405162461bcd60e51b815260206004820152600b60248201526a062616c616e6365203d20360ac1b60448201526064016107d2565b6040516001600160a01b0383169082156108fc029083906000818181858888f1935050505015801561163c573d6000803e3d6000fd5b50609b805460ff191660011790556040516001600160a01b038316907f713b90881ad62c4fa8ab6bd9197fa86481fc0c11b2edba60026514281b2dbac4906116879084815260200190565b60405180910390a25050565b6002606654036116b55760405162461bcd60e51b81526004016107d2906130d3565b6002606655609b5460ff16156116dd5760405162461bcd60e51b81526004016107d29061310a565b60cf546001600160a01b031633146117075760405162461bcd60e51b81526004016107d29061331e565b600034116117275760405162461bcd60e51b81526004016107d29061336d565b61172f61249b565b60405163288c314960e21b81526001600160a01b038381166004830152919091169063a230c52490602401602060405180830381865afa158015611777573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061179b919061328c565b6117e05760405162461bcd60e51b81526020600482015260166024820152752721a81039b437bab63210313290309036b2b6b132b960511b60448201526064016107d2565b6001600160a01b0381166000908152609860205260409020543490611806908290613188565b6001600160a01b03831660009081526098602052604081209190915561182a612735565b6001600160a01b031663076cd77f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611867573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061188b919061316f565b90506000611897612735565b6001600160a01b031663737c59b86040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118f8919061316f565b6001600160a01b038516600090815260996020526040902054909150821180159061194757506001600160a01b0384166000908152609960205260409020548190611944908590613188565b11155b6119935760405162461bcd60e51b815260206004820152601f60248201527f757365722073686f756c6420626520696e207374616b696e672072616e67650060448201526064016107d2565b61199d84846124c0565b6001600160a01b038416600090815260cd602090815260408083203384529091529020546119cc908490613188565b6001600160a01b038516600081815260cd6020908152604080832033845282528083209490945591815260ce9091522054611a08908490613188565b6001600160a01b038516600081815260ce6020908152604080832085905560cd825280832033808552908352928190205481518981529283019590955281019390935290917f74cfc20f0e6d14384c3a60820d3e814f6979d009cdbb43db27fa56fe475172fd9060600160405180910390a3505060016066555050565b600054610100900460ff1615808015611aa55750600054600160ff909116105b80611abf5750303b158015611abf575060005460ff166001145b611b225760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016107d2565b6000805460ff191660011790558015611b45576000805461ff0019166101001790555b6000609a55609b805460ff19169055611b5c612b3a565b611b64612b69565b611b6d836114e1565b815115611beb57600080600080602086019150855182611b8d9190613188565b90505b80821015611be65781519350611ba7602083613188565b9150808210611bb557600080fd5b81519250611bc4602083613188565b6001600160a01b03851660009081526098602052604090208490559150611b90565b505050505b8015611c31576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b600260665403611c585760405162461bcd60e51b81526004016107d2906130d3565b6002606655609b5460ff1615611c805760405162461bcd60e51b81526004016107d29061310a565b60003411611ca05760405162461bcd60e51b81526004016107d29061336d565b33600090815260986020526040902054611cbb903490613188565b33600090815260986020526040902055611cd361249b565b60405163288c314960e21b81523360048201526001600160a01b03919091169063a230c52490602401602060405180830381865afa158015611d19573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d3d919061328c565b15611f9e576000611d4c612735565b6001600160a01b031663076cd77f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dad919061316f565b3360009081526099602052604090205490915081118015611def575033600090815260996020526040902054611de39082613054565b611dec33610775565b10155b15611f9c5760cf546001600160a01b031615611f785760cf5460405163bbc2611360e01b81523360048201526000916001600160a01b03169063bbc2611390602401602060405180830381865afa158015611e4e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e72919061316f565b60cf54604051631069f3b560e01b8152600481018390523360248201529192506001600160a01b031690631069f3b59060440160a060405180830381865afa158015611ec2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ee691906132ae565b6080015115611f765760cf54336000908152609960205260409020546001600160a01b0390911690634023a64090611f1e9085613054565b6040516001600160e01b031960e084901b1681526004810191909152336024820152604401600060405180830381600087803b158015611f5d57600080fd5b505af1158015611f71573d6000803e3d6000fd5b505050505b505b33600081815260996020526040902054611f9c9190611f979084613054565b6124c0565b505b336000818152609860205260409020547fb4caaf29adda3eefee3ad552a8e85058589bf834c7466cae4ee58787f70589ed903490611fdb84610775565b6040805193845260208401929092529082015260600160405180910390a26001606655565b612008612a09565b6001600160a01b03811661206d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107d2565b610cb881612a63565b61207e612a09565b6001600160a01b03811615610cb857610c9c81612896565b6002606654036120b85760405162461bcd60e51b81526004016107d2906130d3565b6002606655609b5460ff16156120e05760405162461bcd60e51b81526004016107d29061310a565b60cf546001600160a01b0316331461210a5760405162461bcd60e51b81526004016107d29061331e565b6000811161212a5760405162461bcd60e51b81526004016107d29061312e565b61213261249b565b60405163288c314960e21b81526001600160a01b038481166004830152919091169063a230c52490602401602060405180830381865afa15801561217a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061219e919061328c565b6121e35760405162461bcd60e51b81526020600482015260166024820152752721a81039b437bab63210313290309036b2b6b132b960511b60448201526064016107d2565b8060006121ee612735565b6001600160a01b031663076cd77f6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561222b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061224f919061316f565b6001600160a01b038516600090815260cd6020908152604080832033845290915290205490915082118015906122ae575080826122a1866001600160a01b031660009081526099602052604090205490565b6122ab9190613054565b10155b6122ca5760405162461bcd60e51b81526004016107d2906131a0565b6122d4848361274d565b6001600160a01b0384166000908152609860205260409020546122f8908390613054565b6001600160a01b03851660009081526098602090815260408083209390935560cd815282822033835290522054612330908390613054565b6001600160a01b038516600081815260cd6020908152604080832033845282528083209490945591815260ce909152205461236c908390613054565b6001600160a01b03858116600090815260ce60205260408082209390935560cf54925190929091169084908381818185875af1925050503d80600081146123cf576040519150601f19603f3d011682016040523d82523d6000602084013e6123d4565b606091505b50509050806124255760405162461bcd60e51b815260206004820152601e60248201527f5472616e7366657220746f204e4350207374616b696e67206661696c6564000060448201526064016107d2565b6001600160a01b038516600081815260ce602090815260408083205460cd835281842033808652908452938290205482518981529384019190915282820152517f03d2bb70c6ccc49d68a465a06edffb976961cf8930888658ca2339fa62b8bda29181900360600190a350506001606655505050565b60006124bb7111dbdd995c9b985b98d950dbdb9d1c9858dd60721b612ab5565b905090565b806000036124cc575050565b6001600160a01b03821660009081526098602052604090205481111561254d5760405162461bcd60e51b815260206004820152603060248201527f4c6f636b20616d6f756e742073686f756c6420626520657175616c206f72206c60448201526f657373207468616e2062616c616e636560801b60648201526084016107d2565b8061255783610775565b10156125b55760405162461bcd60e51b815260206004820152602760248201527f496e73756666696369656e742062616c616e636520746861742063616e206265604482015266081b1bd8dad95960ca1b60648201526084016107d2565b60006125bf612735565b6001600160a01b031663737c59b86040518163ffffffff1660e01b8152600401602060405180830381865afa1580156125fc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612620919061316f565b6001600160a01b038416600090815260996020526040902054909150612647908390613188565b6001600160a01b03841660009081526099602052604090208190558110156126bb5760405162461bcd60e51b815260206004820152602160248201527f4c6f636b65642062616c616e6365206973206c6172676572207468616e206d616044820152600f60fb1b60648201526084016107d2565b81609a546126c99190613188565b609a556001600160a01b0383166000818152609860205260409020547f44cebfefa4561bee5b61d675ccfd8dc9969fff9cc15e7a4eccccd62af94f9c1190849061271287610775565b6040805193845260208401929092529082015260600160405180910390a2505050565b60006124bb69456e7653746f7261676560b01b612ab5565b80600003612759575050565b6001600160a01b0382166000908152609960205260409020548111156127e75760405162461bcd60e51b815260206004820152603960248201527f556e6c6f636b20616d6f756e742073686f756c6420626520657175616c206f7260448201527f206c657373207468616e2062616c616e6365206c6f636b65640000000000000060648201526084016107d2565b6001600160a01b03821660009081526099602052604090205461280b908290613054565b6001600160a01b038316600090815260996020526040902055609a54612832908290613054565b609a556001600160a01b0382166000818152609860205260409020547f5245d528087a96a64f4589a764f00061e4671eab90cb1e019b1a5b24b2e4c2a890839061287b86610775565b60408051938452602084019290925290820152606001611687565b610cb8612a09565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff16156128d157611c3183612b98565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561292b575060408051601f3d908101601f191682019092526129289181019061316f565b60015b61298e5760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b60648201526084016107d2565b60008051602061349b83398151915281146129fd5760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b60648201526084016107d2565b50611c31838383612c34565b6033546001600160a01b03163314610e4c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107d2565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b606554604051630d2020dd60e01b8152600481018390526000916001600160a01b031690630d2020dd90602401602060405180830381865afa158015612aff573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061076f91906133b7565b60006124bb6845636f73797374656d60b81b612ab5565b600054610100900460ff16612b615760405162461bcd60e51b81526004016107d2906133d4565b610e4c612c5f565b600054610100900460ff16612b905760405162461bcd60e51b81526004016107d2906133d4565b610e4c612c8d565b6001600160a01b0381163b612c055760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084016107d2565b60008051602061349b83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b612c3d83612cbd565b600082511180612c4a5750805b15611c3157612c598383612cfd565b50505050565b600054610100900460ff16612c865760405162461bcd60e51b81526004016107d2906133d4565b6001606655565b600054610100900460ff16612cb45760405162461bcd60e51b81526004016107d2906133d4565b610e4c33612a63565b612cc681612b98565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6060610ebb83836040518060600160405280602781526020016134bb6027913960606001600160a01b0384163b612d855760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b60648201526084016107d2565b600080856001600160a01b031685604051612da0919061344b565b600060405180830381855af49150503d8060008114612ddb576040519150601f19603f3d011682016040523d82523d6000602084013e612de0565b606091505b5091509150612df0828286612dfa565b9695505050505050565b60608315612e09575081610ebb565b825115612e195782518084602001fd5b8160405162461bcd60e51b81526004016107d29190613467565b6001600160a01b0381168114610cb857600080fd5b60008060408385031215612e5b57600080fd5b8235612e6681612e33565b91506020830135612e7681612e33565b809150509250929050565b600060208284031215612e9357600080fd5b8135610ebb81612e33565b60008060408385031215612eb157600080fd5b8235612ebc81612e33565b946020939093013593505050565b600060208284031215612edc57600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612f2257612f22612ee3565b604052919050565b60008060408385031215612f3d57600080fd5b8235612f4881612e33565b915060208381013567ffffffffffffffff80821115612f6657600080fd5b818601915086601f830112612f7a57600080fd5b813581811115612f8c57612f8c612ee3565b612f9e601f8201601f19168501612ef9565b91508082528784828501011115612fb457600080fd5b80848401858401376000848284010152508093505050509250929050565b60008060408385031215612fe557600080fd5b8235612ff081612e33565b9150602083013563ffffffff81168114612e7657600080fd5b60008060006060848603121561301e57600080fd5b833561302981612e33565b95602085013595506040909401359392505050565b634e487b7160e01b600052601160045260246000fd5b6000828210156130665761306661303e565b500390565b6020808252600d908201526c2737902832b936b4b9b9b4b7b760991b604082015260600190565b60008160001904831182151516156130ac576130ac61303e565b500290565b6000826130ce57634e487b7160e01b600052601260045260246000fd5b500490565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252600a9082015269125cc81c995d9bdad95960b21b604082015260600190565b60208082526021908201527f416d6f756e742073686f756c6420626520626967676572207468616e207a65726040820152606f60f81b606082015260800190565b60006020828403121561318157600080fd5b5051919050565b6000821982111561319b5761319b61303e565b500190565b60208082526034908201527f576974686472617720616d6f756e742073686f756c6420626520657175616c206040820152736f72206c657373207468616e2062616c616e636560601b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b60006020828403121561329e57600080fd5b81518015158114610ebb57600080fd5b600060a082840312156132c057600080fd5b60405160a0810181811067ffffffffffffffff821117156132e3576132e3612ee3565b806040525082518152602083015160208201526040830151604082015260608301516060820152608083015160808201528091505092915050565b6020808252602f908201527f4f6e6c79204e43505374616b696e6720636f6e74726163742063616e2063616c60408201526e36103a3434b990333ab731ba34b7b760891b606082015260800190565b6020808252602a908201527f4465706f73697420616d6f756e742073686f756c642062652067726561746572604082015269207468616e207a65726f60b01b606082015260800190565b6000602082840312156133c957600080fd5b8151610ebb81612e33565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60005b8381101561343a578181015183820152602001613422565b83811115612c595750506000910152565b6000825161345d81846020870161341f565b9190910192915050565b602081526000825180602084015261348681604085016020870161341f565b601f01601f1916919091016040019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122013c16b0bae42160552b3be738d1a01aeee0a159c353d7f57cf558d5df1a3758564736f6c634300080e0033", + Bin: "0x60a0604052306080523480156200001557600080fd5b506200002062000026565b620000e8565b600054610100900460ff1615620000935760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff9081161015620000e6576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6080516135176200012060003960008181610be601528181610c2601528181610cc501528181610d050152610d9401526135176000f3fe6080604052600436106102345760003560e01c8063738fdd1a1161012e578063a91ee0dc116100ab578063d5c258901161006f578063d5c25890146106b3578063f1b8aa1d146106c8578063f2fde38b146106e8578063f3f6308014610708578063f69318221461072857600080fd5b8063a91ee0dc14610643578063b6549f7514610663578063bac4f33814610678578063c0d91eaf1461068b578063d0e30db0146106ab57600080fd5b8063884d97a7116100f2578063884d97a7146105a15780638da5cb5b146105c157806392a950b6146105df5780639667e76a146105ff5780639986e4b91461061f57600080fd5b8063738fdd1a146104e85780637bf46530146105205780637d77a0eb146105415780637eee288d146105615780637f2f4c061461058157600080fd5b806334125c84116101bc5780635935573611610180578063593557361461041a5780635a731cca146104505780636c78d2cf1461047457806370a082311461049d578063715018a6146104d357600080fd5b806334125c84146103905780633659cfe6146103b05780634bd1ed76146103d05780634f1ef286146103f257806352d1902d1461040557600080fd5b8063282d3fdf11610203578063282d3fdf146102ea5780632b0b9c5e1461030c5780632bc9ed021461032c5780632e1a7d4d1461034f5780632f40992e1461036f57600080fd5b80631285361514610243578063193468ac146102765780631e0cba0d146102ac57806325d998bb146102ca57600080fd5b3661023e57600080fd5b600080fd5b34801561024f57600080fd5b5061026361025e366004612e48565b610748565b6040519081526020015b60405180910390f35b34801561028257600080fd5b50610263610291366004612e81565b6001600160a01b0316600090815260ce602052604090205490565b3480156102b857600080fd5b50610263665374616b696e6760c81b81565b3480156102d657600080fd5b506102636102e5366004612e81565b610775565b3480156102f657600080fd5b5061030a610305366004612e9e565b6107a3565b005b34801561031857600080fd5b50610263610327366004612e81565b6107e9565b34801561033857600080fd5b50609b5460ff16604051901515815260200161026d565b34801561035b57600080fd5b5061030a61036a366004612eca565b610845565b34801561037b57600080fd5b506102636914995dd85c99141bdbdb60b21b81565b34801561039c57600080fd5b506102636845636f73797374656d60b81b81565b3480156103bc57600080fd5b5061030a6103cb366004612e81565b610bdc565b3480156103dc57600080fd5b506102636a4d61696e74656e616e636560a81b81565b61030a610400366004612f2a565b610cbb565b34801561041157600080fd5b50610263610d87565b34801561042657600080fd5b50610263610435366004612e81565b6001600160a01b031660009081526099602052604090205490565b34801561045c57600080fd5b506102636c14dd185ada5b99d4995dd85c99609a1b81565b34801561048057600080fd5b506102637111dbdd995c9b985b98d950dbdb9d1c9858dd60721b81565b3480156104a957600080fd5b506102636104b8366004612e81565b6001600160a01b031660009081526098602052604090205490565b3480156104df57600080fd5b5061030a610e3a565b3480156104f457600080fd5b50606554610508906001600160a01b031681565b6040516001600160a01b03909116815260200161026d565b34801561052c57600080fd5b5061026369456e7653746f7261676560b01b81565b34801561054d57600080fd5b5061026361055c366004612fd2565b610e4e565b34801561056d57600080fd5b5061030a61057c366004612e9e565b610ec2565b34801561058d57600080fd5b5061030a61059c366004612e81565b610efb565b3480156105ad57600080fd5b506102636105bc366004612e81565b610fa3565b3480156105cd57600080fd5b506033546001600160a01b0316610508565b3480156105eb57600080fd5b5061030a6105fa366004613009565b610fb0565b34801561060b57600080fd5b5061030a61061a366004612eca565b6112e6565b34801561062b57600080fd5b506102636c42616c6c6f7453746f7261676560981b81565b34801561064f57600080fd5b5061030a61065e366004612e81565b6114e1565b34801561066f57600080fd5b5061030a611589565b61030a610686366004612e81565b611693565b34801561069757600080fd5b5061030a6106a6366004612f2a565b611a85565b61030a611c36565b3480156106bf57600080fd5b50609a54610263565b3480156106d457600080fd5b5060cf54610508906001600160a01b031681565b3480156106f457600080fd5b5061030a610703366004612e81565b612000565b34801561071457600080fd5b5061030a610723366004612e81565b612076565b34801561073457600080fd5b5061030a610743366004612e9e565b612096565b6001600160a01b03808316600090815260cd60209081526040808320938516835292905220545b92915050565b6001600160a01b038116600090815260996020908152604080832054609890925282205461076f9190613054565b336107ac61249b565b6001600160a01b0316146107db5760405162461bcd60e51b81526004016107d29061306b565b60405180910390fd5b6107e582826124c0565b5050565b6001600160a01b038116600090815260ce60209081526040808320546099909252822054811580610818575080155b15610827575060009392505050565b80610833836064613092565b61083d91906130b1565b949350505050565b6002606654036108675760405162461bcd60e51b81526004016107d2906130d3565b6002606655609b5460ff161561088f5760405162461bcd60e51b81526004016107d29061310a565b600081116108af5760405162461bcd60e51b81526004016107d29061312e565b60006108b9612735565b6001600160a01b031663076cd77f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061091a919061316f565b905060006109288383613188565b33600090815260ce602090815260408083205460999092529091205461094e9190613054565b106109615761095d338461274d565b5060015b61096a33610775565b8311156109895760405162461bcd60e51b81526004016107d2906131a0565b336000908152609860205260409020546109a4908490613054565b3360009081526098602052604090205560cf546001600160a01b0316158015906109cb5750805b15610add5760cf546040516000916001600160a01b03169085908381818185875af1925050503d8060008114610a1d576040519150601f19603f3d011682016040523d82523d6000602084013e610a22565b606091505b5050905080610a735760405162461bcd60e51b815260206004820152601e60248201527f5472616e7366657220746f204e4350207374616b696e67206661696c6564000060448201526064016107d2565b60cf546040516306aa67f960e01b8152600481018690523360248201526001600160a01b03909116906306aa67f990604401600060405180830381600087803b158015610abf57600080fd5b505af1158015610ad3573d6000803e3d6000fd5b5050505050610b77565b604051600090339085908381818185875af1925050503d8060008114610b1f576040519150601f19603f3d011682016040523d82523d6000602084013e610b24565b606091505b5050905080610b755760405162461bcd60e51b815260206004820152601960248201527f5472616e7366657220746f2073656e646572206661696c65640000000000000060448201526064016107d2565b505b336000818152609860205260409020547f204fccf0d92ed8d48f204adb39b2e81e92bad0dedb93f5716ca9478cfb57de00908590610bb484610775565b6040805193845260208401929092529082015260600160405180910390a25050600160665550565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610c245760405162461bcd60e51b81526004016107d2906131f4565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610c6d60008051602061349b833981519152546001600160a01b031690565b6001600160a01b031614610c935760405162461bcd60e51b81526004016107d290613240565b610c9c81612896565b60408051600080825260208201909252610cb89183919061289e565b50565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610d035760405162461bcd60e51b81526004016107d2906131f4565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610d4c60008051602061349b833981519152546001600160a01b031690565b6001600160a01b031614610d725760405162461bcd60e51b81526004016107d290613240565b610d7b82612896565b6107e58282600161289e565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610e275760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c000000000000000060648201526084016107d2565b5060008051602061349b83398151915290565b610e42612a09565b610e4c6000612a63565b565b6001600160a01b0382166000908152609960205260408120541580610e77575063ffffffff8216155b15610e845750600061076f565b609a546001600160a01b038416600090815260996020526040902054610eb19063ffffffff851690613092565b610ebb91906130b1565b9392505050565b33610ecb61249b565b6001600160a01b031614610ef15760405162461bcd60e51b81526004016107d29061306b565b6107e5828261274d565b610f03612a09565b6001600160a01b038116610f595760405162461bcd60e51b815260206004820152601e60248201527f4e43505374616b696e6720697320746865207a65726f2061646472657373000060448201526064016107d2565b60cf80546001600160a01b0319166001600160a01b0383169081179091556040517ffd5754300dde6066eda4fabd23616c1d560a3360c85c0716c46e00649bdeeddf90600090a250565b600061076f826064610e4e565b33610fb961249b565b6001600160a01b031614610fdf5760405162461bcd60e51b81526004016107d29061306b565b6000610ff4661390d4115e1a5d60ca1b612ab5565b90506110008484610ec2565b6001600160a01b038416600090815260986020526040902054611024908490613054565b6001600160a01b038516600090815260986020526040812091909155611048612b23565b6001600160a01b03811660009081526098602052604090205490915061106f908590613188565b6001600160a01b03808316600090815260986020908152604080832094909455918816815260ce909152908120546110a79085613054565b90506110b38682610ec2565b6001600160a01b03861660009081526099602090815260408083205460ce909252909120548110156111665760405162461bcd60e51b815260206004820152605060248201527f7472616e73666572656442616c616e6365206d7573742062652067726561746560448201527f72207468616e206f7220657175616c20746f205f6c6f636b656455736572426160648201526f3630b731b2aa37a721a82a37ba30b61760811b608482015260a4016107d2565b6111708782610ec2565b6001600160a01b038716600090815260986020526040902054611194908290613054565b6001600160a01b0388811660008181526098602090815260408083209590955560ce9052839020549251638408bdb160e01b81526004810191909152602481018490526044810192909252851690638408bdb19083906064016000604051808303818588803b15801561120657600080fd5b505af115801561121a573d6000803e3d6000fd5b505060cf546001600160a01b0316159250611268915050576001600160a01b03808816600090815260ce6020908152604080832083905560cd825280832060cf549094168352929052908120555b6001600160a01b0387167f2caed32a519a1fd89486d3ffe06202febb5ed51534d571dbab93058545a29e2461129d8389613188565b6001600160a01b038a166000908152609860205260409020546112bf8b610775565b6040805193845260208401929092529082015260600160405180910390a250505050505050565b6112ee61249b565b604051636f1e853360e01b81523360048201526001600160a01b039190911690636f1e853390602401602060405180830381865afa158015611334573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611358919061328c565b6113745760405162461bcd60e51b81526004016107d29061306b565b61137e33826124c0565b60cf546001600160a01b031615610cb85760cf5460405163bbc2611360e01b81523360048201526000916001600160a01b03169063bbc2611390602401602060405180830381865afa1580156113d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113fc919061316f565b60cf54604051631069f3b560e01b8152600481018390523360248201529192506001600160a01b031690631069f3b59060440160a060405180830381865afa15801561144c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061147091906132ae565b60800151156107e55760cf546040516301008e9960e61b8152600481018490523360248201526001600160a01b0390911690634023a64090604401600060405180830381600087803b1580156114c557600080fd5b505af11580156114d9573d6000803e3d6000fd5b505050505050565b6114e9612a09565b6001600160a01b03811661153f5760405162461bcd60e51b815260206004820152601a60248201527f416464726573732073686f756c64206265206e6f6e2d7a65726f00000000000060448201526064016107d2565b606580546001600160a01b0319166001600160a01b0383169081179091556040517f278c70ced5f3e0e5eeb385b5ff9cb735748ba00a625147e66065ed48fc1562cd90600090a250565b611591612a09565b609b5460ff16156115b45760405162461bcd60e51b81526004016107d29061310a565b60006115c86033546001600160a01b031690565b905047806116065760405162461bcd60e51b815260206004820152600b60248201526a062616c616e6365203d20360ac1b60448201526064016107d2565b6040516001600160a01b0383169082156108fc029083906000818181858888f1935050505015801561163c573d6000803e3d6000fd5b50609b805460ff191660011790556040516001600160a01b038316907f713b90881ad62c4fa8ab6bd9197fa86481fc0c11b2edba60026514281b2dbac4906116879084815260200190565b60405180910390a25050565b6002606654036116b55760405162461bcd60e51b81526004016107d2906130d3565b6002606655609b5460ff16156116dd5760405162461bcd60e51b81526004016107d29061310a565b60cf546001600160a01b031633146117075760405162461bcd60e51b81526004016107d29061331e565b600034116117275760405162461bcd60e51b81526004016107d29061336d565b61172f61249b565b60405163288c314960e21b81526001600160a01b038381166004830152919091169063a230c52490602401602060405180830381865afa158015611777573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061179b919061328c565b6117e05760405162461bcd60e51b81526020600482015260166024820152752721a81039b437bab63210313290309036b2b6b132b960511b60448201526064016107d2565b6001600160a01b0381166000908152609860205260409020543490611806908290613188565b6001600160a01b03831660009081526098602052604081209190915561182a612735565b6001600160a01b031663076cd77f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611867573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061188b919061316f565b90506000611897612735565b6001600160a01b031663737c59b86040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118f8919061316f565b6001600160a01b038516600090815260996020526040902054909150821180159061194757506001600160a01b0384166000908152609960205260409020548190611944908590613188565b11155b6119935760405162461bcd60e51b815260206004820152601f60248201527f757365722073686f756c6420626520696e207374616b696e672072616e67650060448201526064016107d2565b61199d84846124c0565b6001600160a01b038416600090815260cd602090815260408083203384529091529020546119cc908490613188565b6001600160a01b038516600081815260cd6020908152604080832033845282528083209490945591815260ce9091522054611a08908490613188565b6001600160a01b038516600081815260ce6020908152604080832085905560cd825280832033808552908352928190205481518981529283019590955281019390935290917f74cfc20f0e6d14384c3a60820d3e814f6979d009cdbb43db27fa56fe475172fd9060600160405180910390a3505060016066555050565b600054610100900460ff1615808015611aa55750600054600160ff909116105b80611abf5750303b158015611abf575060005460ff166001145b611b225760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016107d2565b6000805460ff191660011790558015611b45576000805461ff0019166101001790555b6000609a55609b805460ff19169055611b5c612b3a565b611b64612b69565b611b6d836114e1565b815115611beb57600080600080602086019150855182611b8d9190613188565b90505b80821015611be65781519350611ba7602083613188565b9150808210611bb557600080fd5b81519250611bc4602083613188565b6001600160a01b03851660009081526098602052604090208490559150611b90565b505050505b8015611c31576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b600260665403611c585760405162461bcd60e51b81526004016107d2906130d3565b6002606655609b5460ff1615611c805760405162461bcd60e51b81526004016107d29061310a565b60003411611ca05760405162461bcd60e51b81526004016107d29061336d565b33600090815260986020526040902054611cbb903490613188565b33600090815260986020526040902055611cd361249b565b60405163288c314960e21b81523360048201526001600160a01b03919091169063a230c52490602401602060405180830381865afa158015611d19573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d3d919061328c565b15611f9e576000611d4c612735565b6001600160a01b031663076cd77f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dad919061316f565b3360009081526099602052604090205490915081118015611def575033600090815260996020526040902054611de39082613054565b611dec33610775565b10155b15611f9c5760cf546001600160a01b031615611f785760cf5460405163bbc2611360e01b81523360048201526000916001600160a01b03169063bbc2611390602401602060405180830381865afa158015611e4e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e72919061316f565b60cf54604051631069f3b560e01b8152600481018390523360248201529192506001600160a01b031690631069f3b59060440160a060405180830381865afa158015611ec2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ee691906132ae565b6080015115611f765760cf54336000908152609960205260409020546001600160a01b0390911690634023a64090611f1e9085613054565b6040516001600160e01b031960e084901b1681526004810191909152336024820152604401600060405180830381600087803b158015611f5d57600080fd5b505af1158015611f71573d6000803e3d6000fd5b505050505b505b33600081815260996020526040902054611f9c9190611f979084613054565b6124c0565b505b336000818152609860205260409020547fb4caaf29adda3eefee3ad552a8e85058589bf834c7466cae4ee58787f70589ed903490611fdb84610775565b6040805193845260208401929092529082015260600160405180910390a26001606655565b612008612a09565b6001600160a01b03811661206d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107d2565b610cb881612a63565b61207e612a09565b6001600160a01b03811615610cb857610c9c81612896565b6002606654036120b85760405162461bcd60e51b81526004016107d2906130d3565b6002606655609b5460ff16156120e05760405162461bcd60e51b81526004016107d29061310a565b60cf546001600160a01b0316331461210a5760405162461bcd60e51b81526004016107d29061331e565b6000811161212a5760405162461bcd60e51b81526004016107d29061312e565b61213261249b565b60405163288c314960e21b81526001600160a01b038481166004830152919091169063a230c52490602401602060405180830381865afa15801561217a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061219e919061328c565b6121e35760405162461bcd60e51b81526020600482015260166024820152752721a81039b437bab63210313290309036b2b6b132b960511b60448201526064016107d2565b8060006121ee612735565b6001600160a01b031663076cd77f6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561222b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061224f919061316f565b6001600160a01b038516600090815260cd6020908152604080832033845290915290205490915082118015906122ae575080826122a1866001600160a01b031660009081526099602052604090205490565b6122ab9190613054565b10155b6122ca5760405162461bcd60e51b81526004016107d2906131a0565b6122d4848361274d565b6001600160a01b0384166000908152609860205260409020546122f8908390613054565b6001600160a01b03851660009081526098602090815260408083209390935560cd815282822033835290522054612330908390613054565b6001600160a01b038516600081815260cd6020908152604080832033845282528083209490945591815260ce909152205461236c908390613054565b6001600160a01b03858116600090815260ce60205260408082209390935560cf54925190929091169084908381818185875af1925050503d80600081146123cf576040519150601f19603f3d011682016040523d82523d6000602084013e6123d4565b606091505b50509050806124255760405162461bcd60e51b815260206004820152601e60248201527f5472616e7366657220746f204e4350207374616b696e67206661696c6564000060448201526064016107d2565b6001600160a01b038516600081815260ce602090815260408083205460cd835281842033808652908452938290205482518981529384019190915282820152517f03d2bb70c6ccc49d68a465a06edffb976961cf8930888658ca2339fa62b8bda29181900360600190a350506001606655505050565b60006124bb7111dbdd995c9b985b98d950dbdb9d1c9858dd60721b612ab5565b905090565b806000036124cc575050565b6001600160a01b03821660009081526098602052604090205481111561254d5760405162461bcd60e51b815260206004820152603060248201527f4c6f636b20616d6f756e742073686f756c6420626520657175616c206f72206c60448201526f657373207468616e2062616c616e636560801b60648201526084016107d2565b8061255783610775565b10156125b55760405162461bcd60e51b815260206004820152602760248201527f496e73756666696369656e742062616c616e636520746861742063616e206265604482015266081b1bd8dad95960ca1b60648201526084016107d2565b60006125bf612735565b6001600160a01b031663737c59b86040518163ffffffff1660e01b8152600401602060405180830381865afa1580156125fc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612620919061316f565b6001600160a01b038416600090815260996020526040902054909150612647908390613188565b6001600160a01b03841660009081526099602052604090208190558110156126bb5760405162461bcd60e51b815260206004820152602160248201527f4c6f636b65642062616c616e6365206973206c6172676572207468616e206d616044820152600f60fb1b60648201526084016107d2565b81609a546126c99190613188565b609a556001600160a01b0383166000818152609860205260409020547f44cebfefa4561bee5b61d675ccfd8dc9969fff9cc15e7a4eccccd62af94f9c1190849061271287610775565b6040805193845260208401929092529082015260600160405180910390a2505050565b60006124bb69456e7653746f7261676560b01b612ab5565b80600003612759575050565b6001600160a01b0382166000908152609960205260409020548111156127e75760405162461bcd60e51b815260206004820152603960248201527f556e6c6f636b20616d6f756e742073686f756c6420626520657175616c206f7260448201527f206c657373207468616e2062616c616e6365206c6f636b65640000000000000060648201526084016107d2565b6001600160a01b03821660009081526099602052604090205461280b908290613054565b6001600160a01b038316600090815260996020526040902055609a54612832908290613054565b609a556001600160a01b0382166000818152609860205260409020547f5245d528087a96a64f4589a764f00061e4671eab90cb1e019b1a5b24b2e4c2a890839061287b86610775565b60408051938452602084019290925290820152606001611687565b610cb8612a09565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff16156128d157611c3183612b98565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561292b575060408051601f3d908101601f191682019092526129289181019061316f565b60015b61298e5760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b60648201526084016107d2565b60008051602061349b83398151915281146129fd5760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b60648201526084016107d2565b50611c31838383612c34565b6033546001600160a01b03163314610e4c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107d2565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b606554604051630d2020dd60e01b8152600481018390526000916001600160a01b031690630d2020dd90602401602060405180830381865afa158015612aff573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061076f91906133b7565b60006124bb6845636f73797374656d60b81b612ab5565b600054610100900460ff16612b615760405162461bcd60e51b81526004016107d2906133d4565b610e4c612c5f565b600054610100900460ff16612b905760405162461bcd60e51b81526004016107d2906133d4565b610e4c612c8d565b6001600160a01b0381163b612c055760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084016107d2565b60008051602061349b83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b612c3d83612cbd565b600082511180612c4a5750805b15611c3157612c598383612cfd565b50505050565b600054610100900460ff16612c865760405162461bcd60e51b81526004016107d2906133d4565b6001606655565b600054610100900460ff16612cb45760405162461bcd60e51b81526004016107d2906133d4565b610e4c33612a63565b612cc681612b98565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6060610ebb83836040518060600160405280602781526020016134bb6027913960606001600160a01b0384163b612d855760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b60648201526084016107d2565b600080856001600160a01b031685604051612da0919061344b565b600060405180830381855af49150503d8060008114612ddb576040519150601f19603f3d011682016040523d82523d6000602084013e612de0565b606091505b5091509150612df0828286612dfa565b9695505050505050565b60608315612e09575081610ebb565b825115612e195782518084602001fd5b8160405162461bcd60e51b81526004016107d29190613467565b6001600160a01b0381168114610cb857600080fd5b60008060408385031215612e5b57600080fd5b8235612e6681612e33565b91506020830135612e7681612e33565b809150509250929050565b600060208284031215612e9357600080fd5b8135610ebb81612e33565b60008060408385031215612eb157600080fd5b8235612ebc81612e33565b946020939093013593505050565b600060208284031215612edc57600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612f2257612f22612ee3565b604052919050565b60008060408385031215612f3d57600080fd5b8235612f4881612e33565b915060208381013567ffffffffffffffff80821115612f6657600080fd5b818601915086601f830112612f7a57600080fd5b813581811115612f8c57612f8c612ee3565b612f9e601f8201601f19168501612ef9565b91508082528784828501011115612fb457600080fd5b80848401858401376000848284010152508093505050509250929050565b60008060408385031215612fe557600080fd5b8235612ff081612e33565b9150602083013563ffffffff81168114612e7657600080fd5b60008060006060848603121561301e57600080fd5b833561302981612e33565b95602085013595506040909401359392505050565b634e487b7160e01b600052601160045260246000fd5b6000828210156130665761306661303e565b500390565b6020808252600d908201526c2737902832b936b4b9b9b4b7b760991b604082015260600190565b60008160001904831182151516156130ac576130ac61303e565b500290565b6000826130ce57634e487b7160e01b600052601260045260246000fd5b500490565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252600a9082015269125cc81c995d9bdad95960b21b604082015260600190565b60208082526021908201527f416d6f756e742073686f756c6420626520626967676572207468616e207a65726040820152606f60f81b606082015260800190565b60006020828403121561318157600080fd5b5051919050565b6000821982111561319b5761319b61303e565b500190565b60208082526034908201527f576974686472617720616d6f756e742073686f756c6420626520657175616c206040820152736f72206c657373207468616e2062616c616e636560601b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b60006020828403121561329e57600080fd5b81518015158114610ebb57600080fd5b600060a082840312156132c057600080fd5b60405160a0810181811067ffffffffffffffff821117156132e3576132e3612ee3565b806040525082518152602083015160208201526040830151604082015260608301516060820152608083015160808201528091505092915050565b6020808252602f908201527f4f6e6c79204e43505374616b696e6720636f6e74726163742063616e2063616c60408201526e36103a3434b990333ab731ba34b7b760891b606082015260800190565b6020808252602a908201527f4465706f73697420616d6f756e742073686f756c642062652067726561746572604082015269207468616e207a65726f60b01b606082015260800190565b6000602082840312156133c957600080fd5b8151610ebb81612e33565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60005b8381101561343a578181015183820152602001613422565b83811115612c595750506000910152565b6000825161345d81846020870161341f565b9190910192915050565b602081526000825180602084015261348681604085016020870161341f565b601f01601f1916919091016040019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212209be7b166904060c81e0f12d1750832c603d4a1e15c5cc3ca929ed8586bc93c0864736f6c634300080e0033", } // StakingImpABI is the input ABI used to generate the binding from. diff --git a/wemix/governance-contract/.prettierrc b/wemix/governance-contract/.prettierrc new file mode 100644 index 000000000000..0929f3aa3532 --- /dev/null +++ b/wemix/governance-contract/.prettierrc @@ -0,0 +1,14 @@ +{ + "overrides": [ + { + "files": "*.sol", + "options": { + "printWidth": 150, + "tabWidth": 4, + "useTabs": false, + "singleQuote": false, + "bracketSpacing": true + } + } + ] +} \ No newline at end of file diff --git a/wemix/governance-contract/contracts/GovChecker.sol b/wemix/governance-contract/contracts/GovChecker.sol index 44d4720e9cc0..c8fef13b6597 100644 --- a/wemix/governance-contract/contracts/GovChecker.sol +++ b/wemix/governance-contract/contracts/GovChecker.sol @@ -10,83 +10,83 @@ import "./interface/IGov.sol"; * @dev GovChecker Contract that uses Registry contract */ contract GovChecker is OwnableUpgradeable { - IRegistry public reg; - - bytes32 public constant GOV_NAME = "GovernanceContract"; - bytes32 public constant STAKING_NAME = "Staking"; - bytes32 public constant BALLOT_STORAGE_NAME = "BallotStorage"; - bytes32 public constant ENV_STORAGE_NAME = "EnvStorage"; - bytes32 public constant REWARD_POOL_NAME = "RewardPool"; - bytes32 public constant MAINTENANCE_NAME = "Maintenance"; - bytes32 public constant ECOSYSTEM_NAME = "Ecosystem"; - bytes32 public constant STAKING_REWARD_NAME = "StakingReward"; - - /* - * @dev Function to set registry address. Contract that wants to use registry should setRegistry first. - * @param _addr address of registry - * @return A boolean that indicates if the operation was successful. - */ - event SetRegistry(address indexed addr); - - function setRegistry(address _addr) public onlyOwner { - require(_addr != address(0), "Address should be non-zero"); - reg = IRegistry(_addr); - emit SetRegistry(_addr); - } - - modifier onlyGov() { - require(getGovAddress() == msg.sender, "No Permission"); - _; - } - - modifier onlyGovMem() { - require(IGov(getGovAddress()).isMember(msg.sender), "No Permission"); - _; - } - - modifier onlyGovStaker() { - require(IGov(getGovAddress()).isStaker(msg.sender), "No Permission"); - _; - } - - modifier anyGov() { - require(getGovAddress() == msg.sender || IGov(getGovAddress()).isMember(msg.sender), "No Permission"); - _; - } - - function getContractAddress(bytes32 name) internal view returns (address) { - return reg.getContractAddress(name); - } - - function getGovAddress() internal view returns (address) { - return getContractAddress(GOV_NAME); - } - - function getStakingAddress() internal view returns (address) { - return getContractAddress(STAKING_NAME); - } - - function getBallotStorageAddress() internal view returns (address) { - return getContractAddress(BALLOT_STORAGE_NAME); - } - - function getEnvStorageAddress() internal view returns (address) { - return getContractAddress(ENV_STORAGE_NAME); - } - - function getRewardPoolAddress() internal view returns (address) { - return getContractAddress(REWARD_POOL_NAME); - } - - function getEcosystemAddress() internal view returns (address) { - return getContractAddress(ECOSYSTEM_NAME); - } - - function getStakingRewardAddress() internal view returns (address) { - return getContractAddress(STAKING_REWARD_NAME); - } - - function getMaintenanceAddress() internal view returns (address) { - return getContractAddress(MAINTENANCE_NAME); - } + IRegistry public reg; + + bytes32 public constant GOV_NAME = "GovernanceContract"; + bytes32 public constant STAKING_NAME = "Staking"; + bytes32 public constant BALLOT_STORAGE_NAME = "BallotStorage"; + bytes32 public constant ENV_STORAGE_NAME = "EnvStorage"; + bytes32 public constant REWARD_POOL_NAME = "RewardPool"; + bytes32 public constant MAINTENANCE_NAME = "Maintenance"; + bytes32 public constant ECOSYSTEM_NAME = "Ecosystem"; + bytes32 public constant STAKING_REWARD_NAME = "StakingReward"; + + /* + * @dev Function to set registry address. Contract that wants to use registry should setRegistry first. + * @param _addr address of registry + * @return A boolean that indicates if the operation was successful. + */ + event SetRegistry(address indexed addr); + + function setRegistry(address _addr) public onlyOwner { + require(_addr != address(0), "Address should be non-zero"); + reg = IRegistry(_addr); + emit SetRegistry(_addr); + } + + modifier onlyGov() { + require(getGovAddress() == msg.sender, "No Permission"); + _; + } + + modifier onlyGovMem() { + require(IGov(getGovAddress()).isMember(msg.sender), "No Permission"); + _; + } + + modifier onlyGovStaker() { + require(IGov(getGovAddress()).isStaker(msg.sender), "No Permission"); + _; + } + + modifier anyGov() { + require(getGovAddress() == msg.sender || IGov(getGovAddress()).isMember(msg.sender), "No Permission"); + _; + } + + function getContractAddress(bytes32 name) internal view returns (address) { + return reg.getContractAddress(name); + } + + function getGovAddress() internal view returns (address) { + return getContractAddress(GOV_NAME); + } + + function getStakingAddress() internal view returns (address) { + return getContractAddress(STAKING_NAME); + } + + function getBallotStorageAddress() internal view returns (address) { + return getContractAddress(BALLOT_STORAGE_NAME); + } + + function getEnvStorageAddress() internal view returns (address) { + return getContractAddress(ENV_STORAGE_NAME); + } + + function getRewardPoolAddress() internal view returns (address) { + return getContractAddress(REWARD_POOL_NAME); + } + + function getEcosystemAddress() internal view returns (address) { + return getContractAddress(ECOSYSTEM_NAME); + } + + function getStakingRewardAddress() internal view returns (address) { + return getContractAddress(STAKING_REWARD_NAME); + } + + function getMaintenanceAddress() internal view returns (address) { + return getContractAddress(MAINTENANCE_NAME); + } } diff --git a/wemix/governance-contract/contracts/GovImp.sol b/wemix/governance-contract/contracts/GovImp.sol index 0529c5b0ca92..416427b53135 100644 --- a/wemix/governance-contract/contracts/GovImp.sol +++ b/wemix/governance-contract/contracts/GovImp.sol @@ -12,13 +12,7 @@ import "./interface/IStaking.sol"; import "@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol"; -contract GovImp is - AGov, - ReentrancyGuardUpgradeable, - BallotEnums, - EnvConstants, - UUPSUpgradeable -{ +contract GovImp is AGov, ReentrancyGuardUpgradeable, BallotEnums, EnvConstants, UUPSUpgradeable { enum VariableTypes { Invalid, Int, @@ -36,11 +30,7 @@ contract GovImp is event MemberAdded(address indexed addr, address indexed voter); event MemberRemoved(address indexed addr, address indexed voter); - event MemberChanged( - address indexed oldAddr, - address indexed newAddr, - address indexed newVoter - ); + event MemberChanged(address indexed oldAddr, address indexed newAddr, address indexed newVoter); event EnvChanged(bytes32 envName, uint256 envType, bytes envVal); event MemberUpdated(address indexed addr, address indexed voter); // added for case that ballot's result could not be applicable. @@ -65,21 +55,13 @@ contract GovImp is modifier checkLockedAmount() { address staker = getStakerAddr(_msgSender()); - require( - lockedBalanceOf(staker) <= getMaxStaking() && - lockedBalanceOf(staker) >= getMinStaking(), - "Invalid staking balance" - ); + require(lockedBalanceOf(staker) <= getMaxStaking() && lockedBalanceOf(staker) >= getMinStaking(), "Invalid staking balance"); _; } modifier checkTimePeriod() { address staker = getStakerAddr(_msgSender()); - require( - (block.timestamp - lastAddProposalTime[staker]) >= - proposal_time_period, - "Cannot add proposal too early" - ); + require((block.timestamp - lastAddProposalTime[staker]) >= proposal_time_period, "Cannot add proposal too early"); _; lastAddProposalTime[staker] = block.timestamp; } @@ -92,11 +74,7 @@ contract GovImp is require(info.enode.length > 0, "Invalid node enode"); require(info.memo.length > 0, "Invalid memo"); require(info.duration > 0, "Invalid duration"); - require( - info.lockAmount >= getMinStaking() && - info.lockAmount <= getMaxStaking(), - "Invalid lock Amount" - ); + require(info.lockAmount >= getMinStaking() && info.lockAmount <= getMaxStaking(), "Invalid lock Amount"); _; } @@ -105,29 +83,16 @@ contract GovImp is _disableInitializers(); } - function init( - address registry, - uint256 lockAmount, - bytes memory name, - bytes memory enode, - bytes memory ip, - uint port - ) public initializer { + function init(address registry, uint256 lockAmount, bytes memory name, bytes memory enode, bytes memory ip, uint port) public initializer { __ReentrancyGuard_init(); __Ownable_init(); setRegistry(registry); - require( - lockAmount >= getMinStaking() && getMaxStaking() >= lockAmount, - "Invalid lock amount" - ); + require(lockAmount >= getMinStaking() && getMaxStaking() >= lockAmount, "Invalid lock amount"); // Lock IStaking staking = IStaking(getStakingAddress()); - require( - staking.availableBalanceOf(msg.sender) >= lockAmount, - "Insufficient staking" - ); + require(staking.availableBalanceOf(msg.sender) >= lockAmount, "Insufficient staking"); staking.lock(msg.sender, lockAmount); // Add voting member @@ -161,11 +126,7 @@ contract GovImp is emit MemberAdded(msg.sender, msg.sender); } - function initOnce( - address registry, - uint256 lockAmount, - bytes memory data - ) public initializer { + function initOnce(address registry, uint256 lockAmount, bytes memory data) public initializer { __ReentrancyGuard_init(); __Ownable_init(); setRegistry(registry); @@ -176,10 +137,7 @@ contract GovImp is // Lock IStaking staking = IStaking(getStakingAddress()); - require( - lockAmount >= getMinStaking() && getMaxStaking() >= lockAmount, - "Invalid lock amount" - ); + require(lockAmount >= getMinStaking() && getMaxStaking() >= lockAmount, "Invalid lock amount"); // []{uint staker, uint voter, uint reward, bytes name, bytes enode, bytes ip, uint port} // 32 bytes, 32 bytes, 32 bytes, [32 bytes, ] * 3, 32 bytes @@ -241,10 +199,7 @@ contract GovImp is ix += 0x20; idx += 1; - require( - !isMember(staker) && !isMember(voter) && !isReward(reward), - "Already member" - ); + require(!isMember(staker) && !isMember(voter) && !isReward(reward), "Already member"); voters[idx] = voter; voterIdx[voter] = idx; rewards[idx] = reward; @@ -253,15 +208,9 @@ contract GovImp is stakerIdx[staker] = idx; emit MemberAdded(staker, voter); // staker, voter - require( - staking.availableBalanceOf(staker) >= lockAmount, - "Insufficient staking" - ); + require(staking.availableBalanceOf(staker) >= lockAmount, "Insufficient staking"); - require( - checkNodeInfoAdd(name, enode, ip, port), - "Duplicated node info" - ); + require(checkNodeInfoAdd(name, enode, ip, port), "Duplicated node info"); lock(staker, lockAmount); @@ -285,26 +234,10 @@ contract GovImp is //Add member address = staker address = voter address function addProposalToAddMember( MemberInfo memory info - ) - external - onlyGovMem - checkTimePeriod - checkLockedAmount - checkMemberInfo(info) - returns (uint256 ballotIdx) - { - require( - !isMember(info.staker) && !isReward(info.staker), - "Already member" - ); - require( - info.staker == info.voter && info.staker == info.reward, - "Staker is not voter" - ); - require( - checkNodeInfoAdd(info.name, info.enode, info.ip, info.port), - "Duplicated node info" - ); + ) external onlyGovMem checkTimePeriod checkLockedAmount checkMemberInfo(info) returns (uint256 ballotIdx) { + require(!isMember(info.staker) && !isReward(info.staker), "Already member"); + require(info.staker == info.voter && info.staker == info.reward, "Staker is not voter"); + require(checkNodeInfoAdd(info.name, info.enode, info.ip, info.port), "Duplicated node info"); ballotIdx = ballotLength + 1; createBallotForMember( ballotIdx, // ballot id @@ -325,20 +258,11 @@ contract GovImp is uint256 duration, uint256 unlockAmount, uint256 slashing - ) - external - onlyGovMem - checkTimePeriod - checkLockedAmount - returns (uint256 ballotIdx) - { + ) external onlyGovMem checkTimePeriod checkLockedAmount returns (uint256 ballotIdx) { require(staker != ZERO, "Invalid address"); require(isMember(staker), "Non-member"); require(getMemberLength() > 1, "Cannot remove a sole member"); - require( - lockedBalanceOf(staker) >= lockAmount, - "Insufficient balance that can be unlocked." - ); + require(lockedBalanceOf(staker) >= lockAmount, "Insufficient balance that can be unlocked."); ballotIdx = ballotLength + 1; MemberInfo memory info = MemberInfo( @@ -379,14 +303,7 @@ contract GovImp is address oldStaker, uint256 unlockAmount, uint256 slashing - ) - external - onlyGovMem - checkTimePeriod - checkLockedAmount - checkMemberInfo(newInfo) - returns (uint256 ballotIdx) - { + ) external onlyGovMem checkTimePeriod checkLockedAmount checkMemberInfo(newInfo) returns (uint256 ballotIdx) { require(oldStaker != ZERO, "Invalid old Address"); require(isMember(oldStaker), "Non-member"); @@ -403,14 +320,9 @@ contract GovImp is if (msg.sender == oldStaker && oldStaker == newInfo.staker) { // Change member enviroment, finalized require(unlockAmount == 0 && slashing == 0, "Invalid proposal"); - } else if ( - oldStaker != newInfo.staker /* && msg.sender != oldStaker */ - ) { + } else if (oldStaker != newInfo.staker /* && msg.sender != oldStaker */) { // Propose Change or Exit member by other. - require( - unlockAmount + slashing <= getMinStaking(), - "Invalid amount: (unlockAmount + slashing) must be equal or low to minStaking" - ); + require(unlockAmount + slashing <= getMinStaking(), "Invalid amount: (unlockAmount + slashing) must be equal or low to minStaking"); } ballotIdx = ballotLength + 1; @@ -429,12 +341,7 @@ contract GovImp is if (msg.sender == oldStaker && oldStaker == newInfo.staker) { (, , uint256 duration) = getBallotPeriod(ballotIdx); startBallot(ballotIdx, block.timestamp, block.timestamp + duration); - finalizeVote( - ballotIdx, - uint256(BallotTypes.MemberChange), - true, - true - ); + finalizeVote(ballotIdx, uint256(BallotTypes.MemberChange), true, true); } } @@ -442,23 +349,12 @@ contract GovImp is address newGovAddr, bytes memory memo, uint256 duration - ) - external - onlyGovMem - checkTimePeriod - checkLockedAmount - returns (uint256 ballotIdx) - { + ) external onlyGovMem checkTimePeriod checkLockedAmount returns (uint256 ballotIdx) { require(newGovAddr != ZERO, "Implementation cannot be zero"); require(newGovAddr != _getImplementation(), "Same contract address"); //check newGov has proxiableUUID - try IERC1822Proxiable(newGovAddr).proxiableUUID() returns ( - bytes32 slot - ) { - require( - slot == _IMPLEMENTATION_SLOT, - "ERC1967Upgrade: unsupported proxiableUUID" - ); + try IERC1822Proxiable(newGovAddr).proxiableUUID() returns (bytes32 slot) { + require(slot == _IMPLEMENTATION_SLOT, "ERC1967Upgrade: unsupported proxiableUUID"); } catch { revert("ERC1967Upgrade: new implementation is not UUPS"); } @@ -480,19 +376,9 @@ contract GovImp is bytes memory envVal, bytes memory memo, uint256 duration - ) - external - onlyGovMem - checkTimePeriod - checkLockedAmount - returns (uint256 ballotIdx) - { + ) external onlyGovMem checkTimePeriod checkLockedAmount returns (uint256 ballotIdx) { // require(envName != 0, "Invalid name"); - require( - uint256(VariableTypes.Int) <= envType && - envType <= uint256(VariableTypes.String), - "Invalid type" - ); + require(uint256(VariableTypes.Int) <= envType && envType <= uint256(VariableTypes.String), "Invalid type"); require(checkVariableCondition(envName, envVal), "Invalid value"); ballotIdx = ballotLength + 1; @@ -509,10 +395,7 @@ contract GovImp is ballotLength = ballotIdx; } - function vote( - uint256 ballotIdx, - bool approval - ) external nonReentrant onlyGovMem checkLockedAmount { + function vote(uint256 ballotIdx, bool approval) external nonReentrant onlyGovMem checkLockedAmount { // Check if some ballot is in progress require(checkUnfinalized(), "Expired"); @@ -523,11 +406,7 @@ contract GovImp is // Finalize (, uint256 accept, uint256 reject) = getBallotVotingInfo(ballotIdx); uint256 threshold = getThreshold(); - if ( - accept >= threshold || - reject >= threshold || - (accept + reject) == 10000 - ) { + if (accept >= threshold || reject >= threshold || (accept + reject) == 10000) { finalizeVote(ballotIdx, ballotType, accept > reject, false); } } @@ -585,31 +464,16 @@ contract GovImp is require(ballotInVoting == 0, "Now in voting with different ballot"); (, , uint256 duration) = getBallotPeriod(ballotIdx); if (duration < getMinVotingDuration()) { - startBallot( - ballotIdx, - block.timestamp, - block.timestamp + getMinVotingDuration() - ); + startBallot(ballotIdx, block.timestamp, block.timestamp + getMinVotingDuration()); } else if (getMaxVotingDuration() < duration) { - startBallot( - ballotIdx, - block.timestamp, - block.timestamp + getMaxVotingDuration() - ); + startBallot(ballotIdx, block.timestamp, block.timestamp + getMaxVotingDuration()); } else { - startBallot( - ballotIdx, - block.timestamp, - block.timestamp + duration - ); + startBallot(ballotIdx, block.timestamp, block.timestamp + duration); } ballotInVoting = ballotIdx; } else if (state == uint256(BallotStates.InProgress)) { // Nothing to do - require( - ballotIdx == ballotInVoting, - "Now in voting with different ballot" - ); + require(ballotIdx == ballotInVoting, "Now in voting with different ballot"); } else { // canceled revert("Expired"); @@ -621,25 +485,12 @@ contract GovImp is uint256 voteIdx = voteLength + 1; address staker = getStakerAddr(msg.sender); uint256 weight = 10000 / getMemberLength(); //IStaking(getStakingAddress()).calcVotingWeightWithScaleFactor(staker, 10000); - uint256 decision = approval - ? uint256(DecisionTypes.Accept) - : uint256(DecisionTypes.Reject); - IBallotStorage(getBallotStorageAddress()).createVote( - voteIdx, - ballotIdx, - staker, - decision, - weight - ); + uint256 decision = approval ? uint256(DecisionTypes.Accept) : uint256(DecisionTypes.Reject); + IBallotStorage(getBallotStorageAddress()).createVote(voteIdx, ballotIdx, staker, decision, weight); voteLength = voteIdx; } - function finalizeVote( - uint256 ballotIdx, - uint256 ballotType, - bool isAccepted, - bool self - ) private { + function finalizeVote(uint256 ballotIdx, uint256 ballotType, bool isAccepted, bool self) private { uint256 ballotState = uint256(BallotStates.Rejected); if (isAccepted) { ballotState = uint256(BallotStates.Accepted); @@ -658,26 +509,26 @@ contract GovImp is changeGov(ballotIdx); } else if (ballotType == uint256(BallotTypes.EnvValChange)) { applyEnv(ballotIdx); + } else if (ballotType == uint256(BallotTypes.Execute)) { + _execute(ballotIdx); + } + } else { + if (ballotType == uint256(BallotTypes.Execute)) { + IBallotStorage _ballotStorage = IBallotStorage(getBallotStorageAddress()); + (, uint256 _value, ) = _ballotStorage.getBallotExecute(ballotIdx); + _returnValueToCreator(_ballotStorage, ballotIdx, _value); } } finalizeBallot(ballotIdx, ballotState); if (!self) ballotInVoting = 0; } - function fromValidBallot( - uint256 ballotIdx, - uint256 targetType - ) private view { + function fromValidBallot(uint256 ballotIdx, uint256 targetType) private view { (uint256 ballotType, uint256 state, ) = getBallotState(ballotIdx); require(ballotType == targetType, "Invalid voting type"); require(state == uint(BallotStates.InProgress), "Invalid voting state"); (, uint256 accept, uint256 reject) = getBallotVotingInfo(ballotIdx); - require( - accept >= getThreshold() || - reject >= getThreshold() || - (accept + reject) == 10000, - "Not yet finalized" - ); + require(accept >= getThreshold() || reject >= getThreshold() || (accept + reject) == 10000, "Not yet finalized"); } function addMember(uint256 ballotIdx) private returns (bool) { @@ -712,10 +563,7 @@ contract GovImp is } if (availableBalanceOf(newStaker) < lockAmount) { - emit NotApplicable( - ballotIdx, - "Insufficient balance that can be locked" - ); + emit NotApplicable(ballotIdx, "Insufficient balance that can be locked"); return false; } @@ -760,23 +608,7 @@ contract GovImp is function removeMember(uint256 ballotIdx) private { fromValidBallot(ballotIdx, uint256(BallotTypes.MemberRemoval)); - ( - address oldStaker, // newStakerAddress - // newVoterAddress - , - , - , - , - , - , - , - - ) = // newRewardAddress - // newNodeName - // newNodeId - // newNodeIp - // newNodePort - getBallotMember(ballotIdx); + (address oldStaker, , , , , , , , ) = getBallotMember(ballotIdx); if (!isMember(oldStaker)) { emit NotApplicable(ballotIdx, "Not already a member"); return; // Non-member. it is abnormal case, but passed @@ -789,28 +621,23 @@ contract GovImp is address oldReward = rewards[removeIdx]; if (stakerIdx[oldStaker] != memberLength) { - ( - stakers[removeIdx], + (stakers[removeIdx], stakers[memberLength], stakerIdx[oldStaker], stakerIdx[endAddr]) = ( stakers[memberLength], - stakerIdx[oldStaker], - stakerIdx[endAddr] - ) = (stakers[memberLength], ZERO, 0, stakerIdx[oldStaker]); + ZERO, + 0, + stakerIdx[oldStaker] + ); removeIdx = rewardIdx[oldStaker]; endAddr = rewards[memberLength]; - ( - rewards[removeIdx], + (rewards[removeIdx], rewards[memberLength], rewardIdx[oldReward], rewardIdx[endAddr]) = ( rewards[memberLength], - rewardIdx[oldReward], - rewardIdx[endAddr] - ) = (rewards[memberLength], ZERO, 0, rewardIdx[oldReward]); + ZERO, + 0, + rewardIdx[oldReward] + ); removeIdx = voterIdx[oldStaker]; endAddr = voters[memberLength]; - ( - voters[removeIdx], - voters[memberLength], - voterIdx[oldVoter], - voterIdx[endAddr] - ) = (voters[memberLength], ZERO, 0, voterIdx[oldVoter]); + (voters[removeIdx], voters[memberLength], voterIdx[oldVoter], voterIdx[endAddr]) = (voters[memberLength], ZERO, 0, voterIdx[oldVoter]); } else { stakers[memberLength] = ZERO; stakerIdx[oldStaker] = 0; @@ -825,9 +652,7 @@ contract GovImp is Node storage node = nodes[removeIdx]; checkNodeEnode[node.enode] = false; checkNodeName[node.name] = false; - checkNodeIpPort[ - keccak256(abi.encodePacked(node.ip, node.port)) - ] = false; + checkNodeIpPort[keccak256(abi.encodePacked(node.ip, node.port))] = false; if (nodeIdxFromMember[oldStaker] != nodeLength) { removeIdx = nodeIdxFromMember[oldStaker]; endAddr = nodeToMember[nodeLength]; @@ -877,10 +702,7 @@ contract GovImp is uint256 memberIdx = stakerIdx[oldStaker]; if (oldStaker != newStaker) { if (isMember(newStaker)) { - emit NotApplicable( - ballotIdx, - "new address is already a member" - ); + emit NotApplicable(ballotIdx, "new address is already a member"); return false; // already member. it is abnormal case. } if (newStaker != newVoter && newStaker != newReward) { @@ -893,10 +715,7 @@ contract GovImp is return false; } if (availableBalanceOf(newStaker) < lockAmount) { - emit NotApplicable( - ballotIdx, - "Insufficient balance that can be locked" - ); + emit NotApplicable(ballotIdx, "Insufficient balance that can be locked"); return false; } } @@ -917,22 +736,14 @@ contract GovImp is { address oldReward = rewards[memberIdx]; - if ( - (oldStaker != newReward) && - (oldReward != newReward) && - (isMember(newReward) || isReward(newReward)) - ) { + if ((oldStaker != newReward) && (oldReward != newReward) && (isMember(newReward) || isReward(newReward))) { emit NotApplicable(ballotIdx, "Invalid reward address"); return false; } } { address oldVoter = voters[memberIdx]; - if ( - (oldStaker != newVoter) && - (oldVoter != newVoter) && - (isMember(newVoter) || isReward(newVoter)) - ) { + if ((oldStaker != newVoter) && (oldVoter != newVoter) && (isMember(newVoter) || isReward(newVoter))) { emit NotApplicable(ballotIdx, "Invalid voters address"); return false; } @@ -964,21 +775,7 @@ contract GovImp is return false; // Non-member. it is abnormal case. } - if ( - !checkChangeMember( - ballotIdx, - self, - oldStaker, - newStaker, - newVoter, - newReward, - name, - enode, - ip, - port, - lockAmount - ) - ) return false; + if (!checkChangeMember(ballotIdx, self, oldStaker, newStaker, newVoter, newReward, name, enode, ip, port, lockAmount)) return false; //old staker uint256 memberIdx = stakerIdx[oldStaker]; @@ -997,9 +794,7 @@ contract GovImp is checkNodeName[node.name] = false; checkNodeEnode[node.enode] = false; - checkNodeIpPort[ - keccak256(abi.encodePacked(node.ip, node.port)) - ] = false; + checkNodeIpPort[keccak256(abi.encodePacked(node.ip, node.port))] = false; node.name = name; node.enode = enode; @@ -1047,8 +842,7 @@ contract GovImp is function changeGov(uint256 ballotIdx) private { fromValidBallot(ballotIdx, uint256(BallotTypes.GovernanceChange)); - address newImp = IBallotStorage(getBallotStorageAddress()) - .getBallotAddress(ballotIdx); + address newImp = IBallotStorage(getBallotStorageAddress()).getBallotAddress(ballotIdx); if (newImp != ZERO) { _authorizeUpgrade(newImp); _upgradeToAndCallUUPS(newImp, new bytes(0), false); @@ -1059,9 +853,7 @@ contract GovImp is function applyEnv(uint256 ballotIdx) private { fromValidBallot(ballotIdx, uint256(BallotTypes.EnvValChange)); - (bytes32 envKey, uint256 envType, bytes memory envVal) = IBallotStorage( - getBallotStorageAddress() - ).getBallotVariable(ballotIdx); + (bytes32 envKey, uint256 envType, bytes memory envVal) = IBallotStorage(getBallotStorageAddress()).getBallotVariable(ballotIdx); IEnvStorage envStorage = IEnvStorage(getEnvStorageAddress()); envStorage.setVariable(envKey, envVal); @@ -1071,13 +863,7 @@ contract GovImp is } //------------------ Code reduction for creation gas - function createBallotForMember( - uint256 id, - uint256 bType, - address creator, - address oAddr, - MemberInfo memory info - ) private { + function createBallotForMember(uint256 id, uint256 bType, address creator, address oAddr, MemberInfo memory info) private { IBallotStorage(getBallotStorageAddress()).createBallotForMember( id, // ballot id bType, // ballot type @@ -1095,26 +881,15 @@ contract GovImp is } function updateBallotLock(uint256 id, uint256 amount) private { - IBallotStorage(getBallotStorageAddress()).updateBallotMemberLockAmount( - id, - amount - ); + IBallotStorage(getBallotStorageAddress()).updateBallotMemberLockAmount(id, amount); } function updateBallotMemo(uint256 id, bytes memory memo) private { IBallotStorage(getBallotStorageAddress()).updateBallotMemo(id, memo); } - function createBallotForExit( - uint256 id, - uint256 unlockAmount, - uint256 slashing - ) private { - IBallotStorage(getBallotStorageAddress()).createBallotForExit( - id, - unlockAmount, - slashing - ); + function createBallotForExit(uint256 id, uint256 unlockAmount, uint256 slashing) private { + IBallotStorage(getBallotStorageAddress()).createBallotForExit(id, unlockAmount, slashing); } function startBallot(uint256 id, uint256 s, uint256 e) private { @@ -1125,47 +900,24 @@ contract GovImp is IBallotStorage(getBallotStorageAddress()).finalizeBallot(id, state); } - function getBallotState( - uint256 id - ) private view returns (uint256, uint256, bool) { + function getBallotState(uint256 id) private view returns (uint256, uint256, bool) { return IBallotStorage(getBallotStorageAddress()).getBallotState(id); } - function getBallotPeriod( - uint256 id - ) private view returns (uint256, uint256, uint256) { + function getBallotPeriod(uint256 id) private view returns (uint256, uint256, uint256) { return IBallotStorage(getBallotStorageAddress()).getBallotPeriod(id); } - function getBallotVotingInfo( - uint256 id - ) private view returns (uint256, uint256, uint256) { - return - IBallotStorage(getBallotStorageAddress()).getBallotVotingInfo(id); + function getBallotVotingInfo(uint256 id) private view returns (uint256, uint256, uint256) { + return IBallotStorage(getBallotStorageAddress()).getBallotVotingInfo(id); } function getBallotMember( uint256 id - ) - private - view - returns ( - address, - address, - address, - address, - bytes memory, - bytes memory, - bytes memory, - uint256, - uint256 - ) - { + ) private view returns (address, address, address, address, bytes memory, bytes memory, bytes memory, uint256, uint256) { return IBallotStorage(getBallotStorageAddress()).getBallotMember(id); } - function getBallotForExit( - uint256 id - ) private view returns (uint256, uint256) { + function getBallotForExit(uint256 id) private view returns (uint256, uint256) { return IBallotStorage(getBallotStorageAddress()).getBallotForExit(id); } @@ -1180,10 +932,7 @@ contract GovImp is function transferLockedAndUnlock(uint256 ballotIdx, address addr) private { (uint256 unlockAmount, uint256 slashing) = getBallotForExit(ballotIdx); - require( - unlockAmount + slashing <= getMinStaking(), - "minStaking value must be greater than or equal to the sum of unlockAmount, slashing" - ); + require(unlockAmount + slashing <= getMinStaking(), "minStaking value must be greater than or equal to the sum of unlockAmount, slashing"); IStaking staking = IStaking(getStakingAddress()); uint256 locked = staking.lockedBalanceOf(addr); @@ -1210,19 +959,10 @@ contract GovImp is //====NXTMeta=====/ - function _authorizeUpgrade( - address newImplementation - ) internal override onlyGovMem {} - - function checkVariableCondition( - bytes32 envKey, - bytes memory envVal - ) internal view returns (bool) { - return - IEnvStorage(getEnvStorageAddress()).checkVariableCondition( - envKey, - envVal - ); + function _authorizeUpgrade(address newImplementation) internal override onlyGovMem {} + + function checkVariableCondition(bytes32 envKey, bytes memory envVal) internal view returns (bool) { + return IEnvStorage(getEnvStorageAddress()).checkVariableCondition(envKey, envVal); } function getStakerAddr(address _addr) public view returns (address staker) { @@ -1236,12 +976,7 @@ contract GovImp is emit SetProposalTimePeriod(newPeriod); } - function checkNodeInfoAdd( - bytes memory name, - bytes memory enode, - bytes memory ip, - uint port - ) internal view returns (bool check) { + function checkNodeInfoAdd(bytes memory name, bytes memory enode, bytes memory ip, uint port) internal view returns (bool check) { //Enode can not be duplicated //IP:port can not be duplicated //Name can not be duplicated @@ -1264,20 +999,11 @@ contract GovImp is //IP:port can not be duplicated //Name can not be duplicated check = true; - if ( - (keccak256(nodeInfo.enode) != keccak256(enode) && - checkNodeEnode[enode]) - ) check = false; - if ( - (keccak256(nodeInfo.name) != keccak256(name) && checkNodeName[name]) - ) check = false; + if ((keccak256(nodeInfo.enode) != keccak256(enode) && checkNodeEnode[enode])) check = false; + if ((keccak256(nodeInfo.name) != keccak256(name) && checkNodeName[name])) check = false; bytes32 hvalue = keccak256(abi.encodePacked(ip, port)); - if ( - (keccak256(abi.encodePacked(nodeInfo.ip, nodeInfo.port)) != - hvalue && - checkNodeIpPort[hvalue]) - ) check = false; + if ((keccak256(abi.encodePacked(nodeInfo.ip, nodeInfo.port)) != hvalue && checkNodeIpPort[hvalue])) check = false; } uint256 public proposal_time_period; @@ -1303,18 +1029,12 @@ contract GovImp is Node memory node = nodes[i]; checkNodeName[node.name] = true; checkNodeEnode[node.enode] = true; - checkNodeIpPort[ - keccak256(abi.encodePacked(node.ip, node.port)) - ] = true; + checkNodeIpPort[keccak256(abi.encodePacked(node.ip, node.port))] = true; } } } - function initMigration( - address registry, - uint256 oldModifiedBlock, - address oldOwner - ) external override initializer { + function initMigration(address registry, uint256 oldModifiedBlock, address oldOwner) external override initializer { __ReentrancyGuard_init(); __Ownable_init(); setRegistry(registry); @@ -1324,9 +1044,7 @@ contract GovImp is emit GovDataMigrated(msg.sender); } - function migrateFromLegacy( - address oldGov - ) external initializer returns (int256) { + function migrateFromLegacy(address oldGov) external initializer returns (int256) { __ReentrancyGuard_init(); __Ownable_init(); @@ -1347,28 +1065,15 @@ contract GovImp is Node memory node; (node.name, node.enode, node.ip, node.port) = ogov.getNode(i); - require( - checkNodeInfoChange( - node.name, - node.enode, - node.ip, - node.port, - node - ), - "node info is duplicated" - ); + require(checkNodeInfoChange(node.name, node.enode, node.ip, node.port, node), "node info is duplicated"); checkNodeName[node.name] = true; checkNodeEnode[node.enode] = true; - checkNodeIpPort[ - keccak256(abi.encodePacked(node.ip, node.port)) - ] = true; + checkNodeIpPort[keccak256(abi.encodePacked(node.ip, node.port))] = true; nodes[i] = node; nodeIdxFromMember[stakers[i]] = i; nodeToMember[i] = stakers[i]; nodeLength = i; - lastAddProposalTime[stakers[i]] = ogov.lastAddProposalTime( - stakers[i] - ); + lastAddProposalTime[stakers[i]] = ogov.lastAddProposalTime(stakers[i]); } } @@ -1380,4 +1085,71 @@ contract GovImp is return 0; } + + // Critical + + function upgradeTo(address) external override { + revert("Invalid access"); + } + + function upgradeToAndCall(address, bytes memory) external payable override { + revert("Invalid access"); + } + + // Genernal Purpose + + event Executed(bool indexed success, address indexed to, uint256 value, bytes calldatas, bytes returnData); + event FailReturnValue(uint256 indexed ballotIdx, address indexed creator, uint256 value, bytes result); + + function addProposalToExecute( + address _target, + bytes memory _calldata, + bytes memory _memo, + uint256 _duration + ) external payable onlyGovMem checkTimePeriod checkLockedAmount { + require(_target != ZERO, "target cannot be zero"); + + address _creator = msg.sender; + if (msg.value != 0) { + (bool _ok, ) = _creator.call{ value: 0 }(""); + require(_ok, "creator is not payable"); + } + + uint256 _ballotIdx = ballotLength + 1; + + IBallotStorage(getBallotStorageAddress()).createBallotForExecute( + _ballotIdx, // ballot id + uint256(BallotTypes.Execute), // ballot type + _duration, + _creator, // creator + _target, + msg.value, + _calldata + ); + updateBallotMemo(_ballotIdx, _memo); + ballotLength = _ballotIdx; + } + + function _execute(uint256 _ballotIdx) private { + fromValidBallot(_ballotIdx, uint256(BallotTypes.Execute)); + IBallotStorage _ballotStorage = IBallotStorage(getBallotStorageAddress()); + + (address _target, uint256 _value, bytes memory _calldata) = _ballotStorage.getBallotExecute(_ballotIdx); + (bool _success, bytes memory _returnData) = _target.call{ value: _value }(_calldata); + + modifiedBlock = block.number; + emit Executed(_success, _target, _value, _calldata, _returnData); + + if (!_success) _returnValueToCreator(_ballotStorage, _ballotIdx, _value); + } + + function _returnValueToCreator(IBallotStorage _ballotStorage, uint256 _ballotIDx, uint256 _value) private { + if (_value == 0) return; + + (, , , address _creator, , , , , , , ) = _ballotStorage.getBallotBasic(_ballotIDx); + (bool _ok, bytes memory _returnData) = _creator.call{ value: _value }(""); + if (!_ok) { + emit FailReturnValue(_ballotIDx, _creator, _value, _returnData); + } + } } diff --git a/wemix/governance-contract/contracts/NCPExit.sol b/wemix/governance-contract/contracts/NCPExit.sol index 46bf150c2800..5d92b4efc29f 100644 --- a/wemix/governance-contract/contracts/NCPExit.sol +++ b/wemix/governance-contract/contracts/NCPExit.sol @@ -5,9 +5,9 @@ import "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; import "@openzeppelin/contracts/proxy/beacon/IBeacon.sol"; contract NCPExit is ERC1967Proxy, IBeacon { - constructor(address _imp) ERC1967Proxy(_imp, "") {} + constructor(address _imp) ERC1967Proxy(_imp, "") {} - function implementation() external view override returns (address) { - return _implementation(); - } + function implementation() external view override returns (address) { + return _implementation(); + } } diff --git a/wemix/governance-contract/contracts/NCPExitImp.sol b/wemix/governance-contract/contracts/NCPExitImp.sol index 5e43460178b7..be01d3ab871a 100644 --- a/wemix/governance-contract/contracts/NCPExitImp.sol +++ b/wemix/governance-contract/contracts/NCPExitImp.sol @@ -11,105 +11,105 @@ import "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol"; import "@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol"; contract NCPExitImp is GovChecker, INCPExit, UUPSUpgradeable, ReentrancyGuardUpgradeable { - /* =========== STATE VARIABLES ===========*/ - using AddressUpgradeable for address payable; - - address private _administrator; - address private _administratorSetter; - - mapping(address /* ncp address */ => /* user + a */ uint256) private _receivedTotalAmount; - mapping(address /* ncp address */ => /* user */ uint256) private _lockedUserBalanceToNCPTotal; - - /* =========== MODIFIERES ===========*/ - modifier onlyGovStaking() { - require(msg.sender == getStakingAddress(), "Only governance staking contract can call this function."); - _; - } - - modifier onlyNcpStaking() { - require(msg.sender == IGovStaking(getStakingAddress()).ncpStaking(), "Only NcpStaking can call this function."); - _; - } - - modifier onlyAdministrator() { - require(msg.sender == _administrator, "Only Administrator can call this function."); - _; - } - - modifier onlyAdministratorSetter() { - require(msg.sender == _administratorSetter, "Caller is not AdministratorSetter."); - _; - } - - receive() external payable {} - - /* =========== FUNCTIONS ===========*/ - /// @custom:oz-upgrades-unsafe-allow constructor - constructor() { - _disableInitializers(); - } - function initialize(address _registry) external initializer { - __Ownable_init(); - __ReentrancyGuard_init(); - setRegistry(_registry); - _administrator = owner(); - _administratorSetter = owner(); - } - - function setAdministrator(address _newAdministrator) external override onlyAdministratorSetter { - require(_newAdministrator != address(0), "Address should be non-zero"); - _administrator = _newAdministrator; - } - - function setAdministratorSetter(address _newAdministratorSetter) external override onlyAdministratorSetter { - require(_newAdministratorSetter != address(0), "Address should be non-zero"); - _administratorSetter = _newAdministratorSetter; - } - - function depositExitAmount( - address exitNcp, - uint256 totalAmount, - uint256 lockedUserBalanceToNCPTotal - ) external payable override nonReentrant onlyGovStaking { - require(totalAmount == msg.value); - _receivedTotalAmount[exitNcp] = totalAmount; - - // administrator - _lockedUserBalanceToNCPTotal[exitNcp] = lockedUserBalanceToNCPTotal; - } - - function withdrawForUser(address exitNcp, address exitUser, uint256 amount) external override nonReentrant onlyNcpStaking { - require(_lockedUserBalanceToNCPTotal[exitNcp] >= amount, "_lockedUserBalanceToNCPTotal[exitNcp] >= amount"); - - _receivedTotalAmount[exitNcp] = _receivedTotalAmount[exitNcp] - amount; - _lockedUserBalanceToNCPTotal[exitNcp] = _lockedUserBalanceToNCPTotal[exitNcp] - amount; - - payable(exitUser).sendValue(amount); - } - - function withdrawForAdministrator(address exitNcp, uint256 amount, address to) external override nonReentrant onlyAdministrator { - // For admin - require(_receivedTotalAmount[exitNcp] - _lockedUserBalanceToNCPTotal[exitNcp] >= amount); - _receivedTotalAmount[exitNcp] = _receivedTotalAmount[exitNcp] - amount; - - payable(to).sendValue(amount); - } - - function getAvailableAmountForAdministrator(address exitNcp) external view override onlyAdministrator returns (uint256) { - // For admin - return _receivedTotalAmount[exitNcp] - _lockedUserBalanceToNCPTotal[exitNcp]; - } - - function upgradeNCPExit(address newImp) external onlyOwner { - if (newImp != address(0)) { - _authorizeUpgrade(newImp); - _upgradeToAndCallUUPS(newImp, new bytes(0), false); - } - } - - function getLockedUserBalanceToNCPTotal(address exitNcp) external view override returns (uint256) { - return _lockedUserBalanceToNCPTotal[exitNcp]; - } - - function _authorizeUpgrade(address newImplementation) internal override onlyOwner {} + /* =========== STATE VARIABLES ===========*/ + using AddressUpgradeable for address payable; + + address private _administrator; + address private _administratorSetter; + + mapping(address /* ncp address */ => /* user + a */ uint256) private _receivedTotalAmount; + mapping(address /* ncp address */ => /* user */ uint256) private _lockedUserBalanceToNCPTotal; + + /* =========== MODIFIERES ===========*/ + modifier onlyGovStaking() { + require(msg.sender == getStakingAddress(), "Only governance staking contract can call this function."); + _; + } + + modifier onlyNcpStaking() { + require(msg.sender == IGovStaking(getStakingAddress()).ncpStaking(), "Only NcpStaking can call this function."); + _; + } + + modifier onlyAdministrator() { + require(msg.sender == _administrator, "Only Administrator can call this function."); + _; + } + + modifier onlyAdministratorSetter() { + require(msg.sender == _administratorSetter, "Caller is not AdministratorSetter."); + _; + } + + receive() external payable {} + + /* =========== FUNCTIONS ===========*/ + /// @custom:oz-upgrades-unsafe-allow constructor + constructor() { + _disableInitializers(); + } + function initialize(address _registry) external initializer { + __Ownable_init(); + __ReentrancyGuard_init(); + setRegistry(_registry); + _administrator = owner(); + _administratorSetter = owner(); + } + + function setAdministrator(address _newAdministrator) external override onlyAdministratorSetter { + require(_newAdministrator != address(0), "Address should be non-zero"); + _administrator = _newAdministrator; + } + + function setAdministratorSetter(address _newAdministratorSetter) external override onlyAdministratorSetter { + require(_newAdministratorSetter != address(0), "Address should be non-zero"); + _administratorSetter = _newAdministratorSetter; + } + + function depositExitAmount( + address exitNcp, + uint256 totalAmount, + uint256 lockedUserBalanceToNCPTotal + ) external payable override nonReentrant onlyGovStaking { + require(totalAmount == msg.value); + _receivedTotalAmount[exitNcp] = totalAmount; + + // administrator + _lockedUserBalanceToNCPTotal[exitNcp] = lockedUserBalanceToNCPTotal; + } + + function withdrawForUser(address exitNcp, address exitUser, uint256 amount) external override nonReentrant onlyNcpStaking { + require(_lockedUserBalanceToNCPTotal[exitNcp] >= amount, "_lockedUserBalanceToNCPTotal[exitNcp] >= amount"); + + _receivedTotalAmount[exitNcp] = _receivedTotalAmount[exitNcp] - amount; + _lockedUserBalanceToNCPTotal[exitNcp] = _lockedUserBalanceToNCPTotal[exitNcp] - amount; + + payable(exitUser).sendValue(amount); + } + + function withdrawForAdministrator(address exitNcp, uint256 amount, address to) external override nonReentrant onlyAdministrator { + // For admin + require(_receivedTotalAmount[exitNcp] - _lockedUserBalanceToNCPTotal[exitNcp] >= amount); + _receivedTotalAmount[exitNcp] = _receivedTotalAmount[exitNcp] - amount; + + payable(to).sendValue(amount); + } + + function getAvailableAmountForAdministrator(address exitNcp) external view override onlyAdministrator returns (uint256) { + // For admin + return _receivedTotalAmount[exitNcp] - _lockedUserBalanceToNCPTotal[exitNcp]; + } + + function upgradeNCPExit(address newImp) external onlyOwner { + if (newImp != address(0)) { + _authorizeUpgrade(newImp); + _upgradeToAndCallUUPS(newImp, new bytes(0), false); + } + } + + function getLockedUserBalanceToNCPTotal(address exitNcp) external view override returns (uint256) { + return _lockedUserBalanceToNCPTotal[exitNcp]; + } + + function _authorizeUpgrade(address newImplementation) internal override onlyOwner {} } diff --git a/wemix/governance-contract/contracts/Registry.sol b/wemix/governance-contract/contracts/Registry.sol index 703e550b7f00..7cc0ea380de3 100644 --- a/wemix/governance-contract/contracts/Registry.sol +++ b/wemix/governance-contract/contracts/Registry.sol @@ -12,71 +12,71 @@ import "./interface/IRegistry.sol"; * Owner should set domain and permission. */ contract Registry is Ownable, IRegistry { - // "Wemix Registry" - uint public magic = 0x57656d6978205265676973747279; - uint public modifiedBlock; + // "Wemix Registry" + uint public magic = 0x57656d6978205265676973747279; + uint public modifiedBlock; - mapping(bytes32 => address) public contracts; - mapping(bytes32 => mapping(address => bool)) public permissions; + mapping(bytes32 => address) public contracts; + mapping(bytes32 => mapping(address => bool)) public permissions; - event SetContractDomain(address setter, bytes32 indexed name, address indexed addr); - event SetPermission(bytes32 indexed _contract, address indexed granted, bool status); + event SetContractDomain(address setter, bytes32 indexed name, address indexed addr); + event SetPermission(bytes32 indexed _contract, address indexed granted, bool status); - constructor() Ownable() {} + constructor() Ownable() {} - /* - * @dev Function to set contract(can be general address) domain - * Only owner can use this function - * @param _name name - * @param _addr address - * @return A boolean that indicates if the operation was successful. - */ - function setContractDomain(bytes32 _name, address _addr) public onlyOwner returns (bool success) { - require(_addr != address(0x0), "address should be non-zero"); - contracts[_name] = _addr; - modifiedBlock = block.number; + /* + * @dev Function to set contract(can be general address) domain + * Only owner can use this function + * @param _name name + * @param _addr address + * @return A boolean that indicates if the operation was successful. + */ + function setContractDomain(bytes32 _name, address _addr) public onlyOwner returns (bool success) { + require(_addr != address(0x0), "address should be non-zero"); + contracts[_name] = _addr; + modifiedBlock = block.number; - emit SetContractDomain(msg.sender, _name, _addr); - return true; - } + emit SetContractDomain(msg.sender, _name, _addr); + return true; + } - /* - * @dev Function to get contract(can be general address) address - * Anyone can use this function - * @param _name _name - * @return An address of the _name - */ - function getContractAddress(bytes32 _name) public view override returns (address addr) { - require(contracts[_name] != address(0x0), "address should be non-zero"); - return contracts[_name]; - } + /* + * @dev Function to get contract(can be general address) address + * Anyone can use this function + * @param _name _name + * @return An address of the _name + */ + function getContractAddress(bytes32 _name) public view override returns (address addr) { + require(contracts[_name] != address(0x0), "address should be non-zero"); + return contracts[_name]; + } - /* - * @dev Function to set permission on contract - * using modifier 'permissioned' references mapping variable 'permissions' - * Only owner can use this function - * @param _contract contract name - * @param _granted granted address - * @param _status true = can use, false = cannot use. default is false - * @return A boolean that indicates if the operation was successful. - */ - function setPermission(bytes32 _contract, address _granted, bool _status) public onlyOwner returns (bool success) { - require(_granted != address(0x0), "address should be non-zero"); - permissions[_contract][_granted] = _status; - modifiedBlock = block.number; + /* + * @dev Function to set permission on contract + * using modifier 'permissioned' references mapping variable 'permissions' + * Only owner can use this function + * @param _contract contract name + * @param _granted granted address + * @param _status true = can use, false = cannot use. default is false + * @return A boolean that indicates if the operation was successful. + */ + function setPermission(bytes32 _contract, address _granted, bool _status) public onlyOwner returns (bool success) { + require(_granted != address(0x0), "address should be non-zero"); + permissions[_contract][_granted] = _status; + modifiedBlock = block.number; - emit SetPermission(_contract, _granted, _status); - return true; - } + emit SetPermission(_contract, _granted, _status); + return true; + } - /* - * @dev Function to get permission on contract - * using modifier 'permissioned' references mapping variable 'permissions' - * @param _contract contract name - * @param _granted granted address - * @return permission result - */ - function getPermission(bytes32 _contract, address _granted) public view returns (bool found) { - return permissions[_contract][_granted]; - } + /* + * @dev Function to get permission on contract + * using modifier 'permissioned' references mapping variable 'permissions' + * @param _contract contract name + * @param _granted granted address + * @return permission result + */ + function getPermission(bytes32 _contract, address _granted) public view returns (bool found) { + return permissions[_contract][_granted]; + } } diff --git a/wemix/governance-contract/contracts/StakingImp.sol b/wemix/governance-contract/contracts/StakingImp.sol index 1b99f0209dd9..a56c64646f59 100644 --- a/wemix/governance-contract/contracts/StakingImp.sol +++ b/wemix/governance-contract/contracts/StakingImp.sol @@ -12,374 +12,374 @@ import "./interface/INCPStaking.sol"; import "./interface/INCPExit.sol"; contract StakingImp is GovChecker, UUPSUpgradeable, ReentrancyGuardUpgradeable, IStaking { - //balance of each NCP - mapping(address => uint256) private _balance; - mapping(address => uint256) private _lockedBalance; - uint256 private _totalLockedBalance; - bool private revoked; - - //====NXTMeta====// - event Staked(address indexed payee, uint256 amount, uint256 total, uint256 available); - event Unstaked(address indexed payee, uint256 amount, uint256 total, uint256 available); - event Locked(address indexed payee, uint256 amount, uint256 total, uint256 available); - event Unlocked(address indexed payee, uint256 amount, uint256 total, uint256 available); - event TransferLocked(address indexed payee, uint256 amount, uint256 total, uint256 available); - event Revoked(address indexed owner, uint256 amount); - - //====Phase2-Staking====// - event DelegateStaked(address indexed payee, uint256 amount, address indexed ncp, uint256 ncpTotalLocked, uint256 userTotalLocked); - event DelegateUnstaked(address indexed payee, uint256 amount, address indexed ncp, uint256 ncpTotalLocked, uint256 userTotalLocked); - event NCPAddrChanged(address indexed ncp); - - constructor() { - _disableInitializers(); - } - - function init(address registry, bytes memory data) external initializer { - _totalLockedBalance = 0; - revoked = false; - // _transferOwnership(_msgSender()); - __ReentrancyGuard_init(); - __Ownable_init(); - setRegistry(registry); - - // data is only for test purpose - if (data.length == 0) return; - - // []{address, amount} - address addr; - uint amount; - uint ix; - uint eix; - assembly { - ix := add(data, 0x20) - } - eix = ix + data.length; - while (ix < eix) { - assembly { - addr := mload(ix) - } - ix += 0x20; - require(ix < eix); - assembly { - amount := mload(ix) - } - ix += 0x20; - - _balance[addr] = amount; - } - } - - receive() external payable { - revert(); - } - - /** - * @dev Deposit from a sender. - */ - function deposit() external payable override nonReentrant notRevoked { - require(msg.value > 0, "Deposit amount should be greater than zero"); - - _balance[msg.sender] = _balance[msg.sender] + msg.value; - - if (IGov(getGovAddress()).isMember(msg.sender)) { - uint256 minimum_staking = IEnvStorage(getEnvStorageAddress()).getStakingMin(); - //if minimum lock is going higher than current locked value, lock more - if (minimum_staking > _lockedBalance[msg.sender] && availableBalanceOf(msg.sender) >= (minimum_staking - _lockedBalance[msg.sender])) { - if (ncpStaking != address(0)) { - uint256 pid = INCPStaking(ncpStaking).ncpToIdx(msg.sender); - if (INCPStaking(ncpStaking).getUserInfo(pid, msg.sender).lastRewardClaimed != 0) { - INCPStaking(ncpStaking).ncpDeposit(minimum_staking - _lockedBalance[msg.sender], payable(msg.sender)); - } - } - _lock(msg.sender, minimum_staking - _lockedBalance[msg.sender]); - } - } - - emit Staked(msg.sender, msg.value, _balance[msg.sender], availableBalanceOf(msg.sender)); - } - - /** - * @dev Withdraw for a sender. - * @param amount The amount of funds will be withdrawn and transferred to. - */ - function withdraw(uint256 amount) external override nonReentrant notRevoked { - require(amount > 0, "Amount should be bigger than zero"); - - //if minimum is changed unlock staked value - uint256 minimum_staking = IEnvStorage(getEnvStorageAddress()).getStakingMin(); - - bool unlockBalance = false; - if (lockedBalanceOf(msg.sender) - _lockedUserBalanceToNCPTotal[msg.sender] >= minimum_staking + amount) { - _unlock(msg.sender, amount); - unlockBalance = true; - } - - require(amount <= availableBalanceOf(msg.sender), "Withdraw amount should be equal or less than balance"); - - _balance[msg.sender] = _balance[msg.sender] - amount; - - if (ncpStaking != address(0) && unlockBalance) { - (bool succ, ) = payable(ncpStaking).call{ value: amount }(""); - require(succ, "Transfer to NCP staking failed"); - INCPStaking(ncpStaking).ncpWithdraw(amount, payable(msg.sender)); - } else { - //payable(msg.sender).transfer(amount); - (bool succ, ) = payable(msg.sender).call{ value: amount }(""); - require(succ, "Transfer to sender failed"); - } - - emit Unstaked(msg.sender, amount, _balance[msg.sender], availableBalanceOf(msg.sender)); - } - - /** - * @dev Lock fund - * @param payee The address whose funds will be locked. - * @param lockAmount The amount of funds will be locked. - */ - function lock(address payee, uint256 lockAmount) external override onlyGov { - _lock(payee, lockAmount); - } - - function lockMore(uint256 lockAmount) external onlyGovStaker { - _lock(msg.sender, lockAmount); - - if (ncpStaking != address(0)) { - uint256 pid = INCPStaking(ncpStaking).ncpToIdx(msg.sender); - if (INCPStaking(ncpStaking).getUserInfo(pid, msg.sender).lastRewardClaimed != 0) { - INCPStaking(ncpStaking).ncpDeposit(lockAmount, payable(msg.sender)); - } - } - } - - function _lock(address payee, uint256 lockAmount) internal { - if (lockAmount == 0) return; - require(_balance[payee] >= lockAmount, "Lock amount should be equal or less than balance"); - require(availableBalanceOf(payee) >= lockAmount, "Insufficient balance that can be locked"); - uint256 maximum = IEnvStorage(getEnvStorageAddress()).getStakingMax(); - - _lockedBalance[payee] = _lockedBalance[payee] + lockAmount; - require(_lockedBalance[payee] <= maximum, "Locked balance is larger than max"); - - _totalLockedBalance = _totalLockedBalance + lockAmount; - - emit Locked(payee, lockAmount, _balance[payee], availableBalanceOf(payee)); - } - - /** - * @dev Transfer locked value(slashing, ncpLockMore, ncpUserTotal) to Ecosystem, NCPExit - * @param from The address whose funds will be transfered. - * @param slashing The amount of funds will be transfered. - * @param ext ncpLockMore + ncpUserTotal - */ - function transferLocked(address from, uint256 slashing, uint256 ext) external override onlyGov { - INCPExit ncpExit = INCPExit(getContractAddress(bytes32("NCPExit"))); - - // Ecosystem - unlock(from, slashing); - _balance[from] = _balance[from] - slashing; - address ecosystem = getEcosystemAddress(); - _balance[ecosystem] = _balance[ecosystem] + slashing; - - // NCPLockMore - uint256 ncpLockMore = ext - _lockedUserBalanceToNCPTotal[from]; - unlock(from, ncpLockMore); - - // To NCPExit - uint256 transferedBalance = lockedBalanceOf(from); - require( - transferedBalance >= _lockedUserBalanceToNCPTotal[from], - "transferedBalance must be greater than or equal to _lockedUserBalanceToNCPTotal." - ); - - unlock(from, transferedBalance); - _balance[from] = _balance[from] - transferedBalance; - ncpExit.depositExitAmount{ value: transferedBalance }(from, transferedBalance, _lockedUserBalanceToNCPTotal[from]); - if (ncpStaking != address(0)) { - _lockedUserBalanceToNCPTotal[from] = 0; - _lockedUserBalanceToNCP[from][ncpStaking] = 0; - } - emit TransferLocked(from, slashing + transferedBalance, _balance[from], availableBalanceOf(from)); - } - - /** - * @dev Unlock fund - * @param payee The address whose funds will be unlocked. - * @param unlockAmount The amount of funds will be unlocked. - */ - function unlock(address payee, uint256 unlockAmount) public override onlyGov { - _unlock(payee, unlockAmount); - } - - function _unlock(address payee, uint256 unlockAmount) internal { - if (unlockAmount == 0) return; - require(_lockedBalance[payee] >= unlockAmount, "Unlock amount should be equal or less than balance locked"); - _lockedBalance[payee] = _lockedBalance[payee] - unlockAmount; - _totalLockedBalance = _totalLockedBalance - unlockAmount; - - emit Unlocked(payee, unlockAmount, _balance[payee], availableBalanceOf(payee)); - } - - function balanceOf(address payee) public view override returns (uint256) { - return _balance[payee]; - } - - function lockedBalanceOf(address payee) public view override returns (uint256) { - return _lockedBalance[payee]; - } - - function availableBalanceOf(address payee) public view override returns (uint256) { - return _balance[payee] - _lockedBalance[payee]; - } - - /** - * @dev Calculate voting weight which range between 0 and 100. - * @param payee The address whose funds were locked. - */ - function calcVotingWeight(address payee) public view override returns (uint256) { - return calcVotingWeightWithScaleFactor(payee, 1e2); - } - - /** - * @dev Calculate voting weight with a scale factor. - * @param payee The address whose funds were locked. - * @param factor The scale factor for weight. For instance: - * if 1e1, result range is between 0 ~ 10 - * if 1e2, result range is between 0 ~ 100 - * if 1e3, result range is between 0 ~ 1000 - */ - function calcVotingWeightWithScaleFactor(address payee, uint32 factor) public view override returns (uint256) { - if (_lockedBalance[payee] == 0 || factor == 0) return 0; - return (_lockedBalance[payee] * factor) / _totalLockedBalance; - } - - function isRevoked() public view returns (bool) { - return revoked; - } - - modifier notRevoked() { - require(!revoked, "Is revoked"); - _; - } - - /** - * @dev Allows the owner to revoke the staking. Funds already staked are returned to the owner - */ - function revoke() public onlyOwner notRevoked { - address contractOwner = owner(); - uint256 balance = address(this).balance; - - require(balance > 0, "balance = 0"); - - payable(contractOwner).transfer(balance); - revoked = true; - - emit Revoked(contractOwner, balance); - } - - function upgradeStaking(address newImp) external onlyOwner { - if (newImp != address(0)) { - _authorizeUpgrade(newImp); - _upgradeToAndCallUUPS(newImp, new bytes(0), false); - } - } - - function _authorizeUpgrade(address newImplementation) internal override onlyOwner {} - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[49] private __gap; - - //Phase2 - Staking - mapping(address /* NCP */ => mapping(address /* user */ => uint256 /* amount */)) private _lockedUserBalanceToNCP; - mapping(address /* NCP */ => uint256 /* amount */) private _lockedUserBalanceToNCPTotal; - - address public ncpStaking; - - modifier onlyNCPStaking() { - require(msg.sender == ncpStaking, "Only NCPStaking contract can call this function"); - _; - } - - function userBalanceOf(address ncp, address user) external view override returns (uint256) { - return _lockedUserBalanceToNCP[ncp][user]; - } - - function userTotalBalanceOf(address ncp) external view override returns (uint256) { - return _lockedUserBalanceToNCPTotal[ncp]; - } - - function getRatioOfUserBalance(address ncp) external view override returns (uint256) { - uint256 user = _lockedUserBalanceToNCPTotal[ncp]; - uint256 locked = _lockedBalance[ncp]; - if (user == 0 || locked == 0) return 0; - return (user * 1e2) / locked; - } - - function setNCPStaking(address _ncpStaking) external onlyOwner { - require(_ncpStaking != address(0), "NCPStaking is the zero address"); - ncpStaking = _ncpStaking; - emit NCPAddrChanged(_ncpStaking); - } - - /** - * @dev Deposit from a user for delegate staking. - */ - function delegateDepositAndLockMore(address ncp) external payable override nonReentrant notRevoked onlyNCPStaking { - require(msg.value > 0, "Deposit amount should be greater than zero"); - require(IGov(getGovAddress()).isMember(ncp), "NCP should be a member"); - - // console.log("delegateDepositAndLockMore: msg.value: %s",ncp); - - uint256 userDepositValue = msg.value; - //added value to ncp balance - _balance[ncp] = _balance[ncp] + userDepositValue; - - uint256 minimum_staking = IEnvStorage(getEnvStorageAddress()).getStakingMin(); - uint256 maximum_staking = IEnvStorage(getEnvStorageAddress()).getStakingMax(); - require( - minimum_staking <= _lockedBalance[ncp] && (_lockedBalance[ncp] + userDepositValue) <= maximum_staking, - "user should be in staking range" - ); - _lock(ncp, userDepositValue); - - _lockedUserBalanceToNCP[ncp][msg.sender] = _lockedUserBalanceToNCP[ncp][msg.sender] + userDepositValue; - _lockedUserBalanceToNCPTotal[ncp] = _lockedUserBalanceToNCPTotal[ncp] + userDepositValue; - - emit DelegateStaked(msg.sender, userDepositValue, ncp, _lockedUserBalanceToNCPTotal[ncp], _lockedUserBalanceToNCP[ncp][msg.sender]); - } - - /** - * @dev Withdraw for a user. - * @param amount The amount of funds will be unlocked, withdrawn and transferred to. - */ - function delegateUnlockAndWithdraw(address ncp, uint256 amount) external override nonReentrant notRevoked onlyNCPStaking { - require(amount > 0, "Amount should be bigger than zero"); - require(IGov(getGovAddress()).isMember(ncp), "NCP should be a member"); - - uint256 userWithdrawValue = amount; - uint256 minimum_staking = IEnvStorage(getEnvStorageAddress()).getStakingMin(); - require( - userWithdrawValue <= _lockedUserBalanceToNCP[ncp][msg.sender] && lockedBalanceOf(ncp) - userWithdrawValue >= minimum_staking, - "Withdraw amount should be equal or less than balance" - ); - _unlock(ncp, userWithdrawValue); - - _balance[ncp] = _balance[ncp] - userWithdrawValue; - _lockedUserBalanceToNCP[ncp][msg.sender] = _lockedUserBalanceToNCP[ncp][msg.sender] - userWithdrawValue; - _lockedUserBalanceToNCPTotal[ncp] = _lockedUserBalanceToNCPTotal[ncp] - userWithdrawValue; - - // payable(ncpStaking).transfer(userWithdrawValue); - (bool succ, ) = payable(ncpStaking).call{ value: userWithdrawValue }(""); - require(succ, "Transfer to NCP staking failed"); - - emit DelegateUnstaked(msg.sender, userWithdrawValue, ncp, _lockedUserBalanceToNCPTotal[ncp], _lockedUserBalanceToNCP[ncp][msg.sender]); - } - - function getTotalLockedBalance() external view override returns (uint256) { - return _totalLockedBalance; - } + //balance of each NCP + mapping(address => uint256) private _balance; + mapping(address => uint256) private _lockedBalance; + uint256 private _totalLockedBalance; + bool private revoked; + + //====NXTMeta====// + event Staked(address indexed payee, uint256 amount, uint256 total, uint256 available); + event Unstaked(address indexed payee, uint256 amount, uint256 total, uint256 available); + event Locked(address indexed payee, uint256 amount, uint256 total, uint256 available); + event Unlocked(address indexed payee, uint256 amount, uint256 total, uint256 available); + event TransferLocked(address indexed payee, uint256 amount, uint256 total, uint256 available); + event Revoked(address indexed owner, uint256 amount); + + //====Phase2-Staking====// + event DelegateStaked(address indexed payee, uint256 amount, address indexed ncp, uint256 ncpTotalLocked, uint256 userTotalLocked); + event DelegateUnstaked(address indexed payee, uint256 amount, address indexed ncp, uint256 ncpTotalLocked, uint256 userTotalLocked); + event NCPAddrChanged(address indexed ncp); + + constructor() { + _disableInitializers(); + } + + function init(address registry, bytes memory data) external initializer { + _totalLockedBalance = 0; + revoked = false; + // _transferOwnership(_msgSender()); + __ReentrancyGuard_init(); + __Ownable_init(); + setRegistry(registry); + + // data is only for test purpose + if (data.length == 0) return; + + // []{address, amount} + address addr; + uint amount; + uint ix; + uint eix; + assembly { + ix := add(data, 0x20) + } + eix = ix + data.length; + while (ix < eix) { + assembly { + addr := mload(ix) + } + ix += 0x20; + require(ix < eix); + assembly { + amount := mload(ix) + } + ix += 0x20; + + _balance[addr] = amount; + } + } + + receive() external payable { + revert(); + } + + /** + * @dev Deposit from a sender. + */ + function deposit() external payable override nonReentrant notRevoked { + require(msg.value > 0, "Deposit amount should be greater than zero"); + + _balance[msg.sender] = _balance[msg.sender] + msg.value; + + if (IGov(getGovAddress()).isMember(msg.sender)) { + uint256 minimum_staking = IEnvStorage(getEnvStorageAddress()).getStakingMin(); + //if minimum lock is going higher than current locked value, lock more + if (minimum_staking > _lockedBalance[msg.sender] && availableBalanceOf(msg.sender) >= (minimum_staking - _lockedBalance[msg.sender])) { + if (ncpStaking != address(0)) { + uint256 pid = INCPStaking(ncpStaking).ncpToIdx(msg.sender); + if (INCPStaking(ncpStaking).getUserInfo(pid, msg.sender).lastRewardClaimed != 0) { + INCPStaking(ncpStaking).ncpDeposit(minimum_staking - _lockedBalance[msg.sender], payable(msg.sender)); + } + } + _lock(msg.sender, minimum_staking - _lockedBalance[msg.sender]); + } + } + + emit Staked(msg.sender, msg.value, _balance[msg.sender], availableBalanceOf(msg.sender)); + } + + /** + * @dev Withdraw for a sender. + * @param amount The amount of funds will be withdrawn and transferred to. + */ + function withdraw(uint256 amount) external override nonReentrant notRevoked { + require(amount > 0, "Amount should be bigger than zero"); + + //if minimum is changed unlock staked value + uint256 minimum_staking = IEnvStorage(getEnvStorageAddress()).getStakingMin(); + + bool unlockBalance = false; + if (lockedBalanceOf(msg.sender) - _lockedUserBalanceToNCPTotal[msg.sender] >= minimum_staking + amount) { + _unlock(msg.sender, amount); + unlockBalance = true; + } + + require(amount <= availableBalanceOf(msg.sender), "Withdraw amount should be equal or less than balance"); + + _balance[msg.sender] = _balance[msg.sender] - amount; + + if (ncpStaking != address(0) && unlockBalance) { + (bool succ, ) = payable(ncpStaking).call{ value: amount }(""); + require(succ, "Transfer to NCP staking failed"); + INCPStaking(ncpStaking).ncpWithdraw(amount, payable(msg.sender)); + } else { + //payable(msg.sender).transfer(amount); + (bool succ, ) = payable(msg.sender).call{ value: amount }(""); + require(succ, "Transfer to sender failed"); + } + + emit Unstaked(msg.sender, amount, _balance[msg.sender], availableBalanceOf(msg.sender)); + } + + /** + * @dev Lock fund + * @param payee The address whose funds will be locked. + * @param lockAmount The amount of funds will be locked. + */ + function lock(address payee, uint256 lockAmount) external override onlyGov { + _lock(payee, lockAmount); + } + + function lockMore(uint256 lockAmount) external onlyGovStaker { + _lock(msg.sender, lockAmount); + + if (ncpStaking != address(0)) { + uint256 pid = INCPStaking(ncpStaking).ncpToIdx(msg.sender); + if (INCPStaking(ncpStaking).getUserInfo(pid, msg.sender).lastRewardClaimed != 0) { + INCPStaking(ncpStaking).ncpDeposit(lockAmount, payable(msg.sender)); + } + } + } + + function _lock(address payee, uint256 lockAmount) internal { + if (lockAmount == 0) return; + require(_balance[payee] >= lockAmount, "Lock amount should be equal or less than balance"); + require(availableBalanceOf(payee) >= lockAmount, "Insufficient balance that can be locked"); + uint256 maximum = IEnvStorage(getEnvStorageAddress()).getStakingMax(); + + _lockedBalance[payee] = _lockedBalance[payee] + lockAmount; + require(_lockedBalance[payee] <= maximum, "Locked balance is larger than max"); + + _totalLockedBalance = _totalLockedBalance + lockAmount; + + emit Locked(payee, lockAmount, _balance[payee], availableBalanceOf(payee)); + } + + /** + * @dev Transfer locked value(slashing, ncpLockMore, ncpUserTotal) to Ecosystem, NCPExit + * @param from The address whose funds will be transfered. + * @param slashing The amount of funds will be transfered. + * @param ext ncpLockMore + ncpUserTotal + */ + function transferLocked(address from, uint256 slashing, uint256 ext) external override onlyGov { + INCPExit ncpExit = INCPExit(getContractAddress(bytes32("NCPExit"))); + + // Ecosystem + unlock(from, slashing); + _balance[from] = _balance[from] - slashing; + address ecosystem = getEcosystemAddress(); + _balance[ecosystem] = _balance[ecosystem] + slashing; + + // NCPLockMore + uint256 ncpLockMore = ext - _lockedUserBalanceToNCPTotal[from]; + unlock(from, ncpLockMore); + + // To NCPExit + uint256 transferedBalance = lockedBalanceOf(from); + require( + transferedBalance >= _lockedUserBalanceToNCPTotal[from], + "transferedBalance must be greater than or equal to _lockedUserBalanceToNCPTotal." + ); + + unlock(from, transferedBalance); + _balance[from] = _balance[from] - transferedBalance; + ncpExit.depositExitAmount{ value: transferedBalance }(from, transferedBalance, _lockedUserBalanceToNCPTotal[from]); + if (ncpStaking != address(0)) { + _lockedUserBalanceToNCPTotal[from] = 0; + _lockedUserBalanceToNCP[from][ncpStaking] = 0; + } + emit TransferLocked(from, slashing + transferedBalance, _balance[from], availableBalanceOf(from)); + } + + /** + * @dev Unlock fund + * @param payee The address whose funds will be unlocked. + * @param unlockAmount The amount of funds will be unlocked. + */ + function unlock(address payee, uint256 unlockAmount) public override onlyGov { + _unlock(payee, unlockAmount); + } + + function _unlock(address payee, uint256 unlockAmount) internal { + if (unlockAmount == 0) return; + require(_lockedBalance[payee] >= unlockAmount, "Unlock amount should be equal or less than balance locked"); + _lockedBalance[payee] = _lockedBalance[payee] - unlockAmount; + _totalLockedBalance = _totalLockedBalance - unlockAmount; + + emit Unlocked(payee, unlockAmount, _balance[payee], availableBalanceOf(payee)); + } + + function balanceOf(address payee) public view override returns (uint256) { + return _balance[payee]; + } + + function lockedBalanceOf(address payee) public view override returns (uint256) { + return _lockedBalance[payee]; + } + + function availableBalanceOf(address payee) public view override returns (uint256) { + return _balance[payee] - _lockedBalance[payee]; + } + + /** + * @dev Calculate voting weight which range between 0 and 100. + * @param payee The address whose funds were locked. + */ + function calcVotingWeight(address payee) public view override returns (uint256) { + return calcVotingWeightWithScaleFactor(payee, 1e2); + } + + /** + * @dev Calculate voting weight with a scale factor. + * @param payee The address whose funds were locked. + * @param factor The scale factor for weight. For instance: + * if 1e1, result range is between 0 ~ 10 + * if 1e2, result range is between 0 ~ 100 + * if 1e3, result range is between 0 ~ 1000 + */ + function calcVotingWeightWithScaleFactor(address payee, uint32 factor) public view override returns (uint256) { + if (_lockedBalance[payee] == 0 || factor == 0) return 0; + return (_lockedBalance[payee] * factor) / _totalLockedBalance; + } + + function isRevoked() public view returns (bool) { + return revoked; + } + + modifier notRevoked() { + require(!revoked, "Is revoked"); + _; + } + + /** + * @dev Allows the owner to revoke the staking. Funds already staked are returned to the owner + */ + function revoke() public onlyOwner notRevoked { + address contractOwner = owner(); + uint256 balance = address(this).balance; + + require(balance > 0, "balance = 0"); + + payable(contractOwner).transfer(balance); + revoked = true; + + emit Revoked(contractOwner, balance); + } + + function upgradeStaking(address newImp) external onlyOwner { + if (newImp != address(0)) { + _authorizeUpgrade(newImp); + _upgradeToAndCallUUPS(newImp, new bytes(0), false); + } + } + + function _authorizeUpgrade(address newImplementation) internal override onlyOwner {} + + /** + * @dev This empty reserved space is put in place to allow future versions to add new + * variables without shifting down storage in the inheritance chain. + * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps + */ + uint256[49] private __gap; + + //Phase2 - Staking + mapping(address /* NCP */ => mapping(address /* user */ => uint256 /* amount */)) private _lockedUserBalanceToNCP; + mapping(address /* NCP */ => uint256 /* amount */) private _lockedUserBalanceToNCPTotal; + + address public ncpStaking; + + modifier onlyNCPStaking() { + require(msg.sender == ncpStaking, "Only NCPStaking contract can call this function"); + _; + } + + function userBalanceOf(address ncp, address user) external view override returns (uint256) { + return _lockedUserBalanceToNCP[ncp][user]; + } + + function userTotalBalanceOf(address ncp) external view override returns (uint256) { + return _lockedUserBalanceToNCPTotal[ncp]; + } + + function getRatioOfUserBalance(address ncp) external view override returns (uint256) { + uint256 user = _lockedUserBalanceToNCPTotal[ncp]; + uint256 locked = _lockedBalance[ncp]; + if (user == 0 || locked == 0) return 0; + return (user * 1e2) / locked; + } + + function setNCPStaking(address _ncpStaking) external onlyOwner { + require(_ncpStaking != address(0), "NCPStaking is the zero address"); + ncpStaking = _ncpStaking; + emit NCPAddrChanged(_ncpStaking); + } + + /** + * @dev Deposit from a user for delegate staking. + */ + function delegateDepositAndLockMore(address ncp) external payable override nonReentrant notRevoked onlyNCPStaking { + require(msg.value > 0, "Deposit amount should be greater than zero"); + require(IGov(getGovAddress()).isMember(ncp), "NCP should be a member"); + + // console.log("delegateDepositAndLockMore: msg.value: %s",ncp); + + uint256 userDepositValue = msg.value; + //added value to ncp balance + _balance[ncp] = _balance[ncp] + userDepositValue; + + uint256 minimum_staking = IEnvStorage(getEnvStorageAddress()).getStakingMin(); + uint256 maximum_staking = IEnvStorage(getEnvStorageAddress()).getStakingMax(); + require( + minimum_staking <= _lockedBalance[ncp] && (_lockedBalance[ncp] + userDepositValue) <= maximum_staking, + "user should be in staking range" + ); + _lock(ncp, userDepositValue); + + _lockedUserBalanceToNCP[ncp][msg.sender] = _lockedUserBalanceToNCP[ncp][msg.sender] + userDepositValue; + _lockedUserBalanceToNCPTotal[ncp] = _lockedUserBalanceToNCPTotal[ncp] + userDepositValue; + + emit DelegateStaked(msg.sender, userDepositValue, ncp, _lockedUserBalanceToNCPTotal[ncp], _lockedUserBalanceToNCP[ncp][msg.sender]); + } + + /** + * @dev Withdraw for a user. + * @param amount The amount of funds will be unlocked, withdrawn and transferred to. + */ + function delegateUnlockAndWithdraw(address ncp, uint256 amount) external override nonReentrant notRevoked onlyNCPStaking { + require(amount > 0, "Amount should be bigger than zero"); + require(IGov(getGovAddress()).isMember(ncp), "NCP should be a member"); + + uint256 userWithdrawValue = amount; + uint256 minimum_staking = IEnvStorage(getEnvStorageAddress()).getStakingMin(); + require( + userWithdrawValue <= _lockedUserBalanceToNCP[ncp][msg.sender] && lockedBalanceOf(ncp) - userWithdrawValue >= minimum_staking, + "Withdraw amount should be equal or less than balance" + ); + _unlock(ncp, userWithdrawValue); + + _balance[ncp] = _balance[ncp] - userWithdrawValue; + _lockedUserBalanceToNCP[ncp][msg.sender] = _lockedUserBalanceToNCP[ncp][msg.sender] - userWithdrawValue; + _lockedUserBalanceToNCPTotal[ncp] = _lockedUserBalanceToNCPTotal[ncp] - userWithdrawValue; + + // payable(ncpStaking).transfer(userWithdrawValue); + (bool succ, ) = payable(ncpStaking).call{ value: userWithdrawValue }(""); + require(succ, "Transfer to NCP staking failed"); + + emit DelegateUnstaked(msg.sender, userWithdrawValue, ncp, _lockedUserBalanceToNCPTotal[ncp], _lockedUserBalanceToNCP[ncp][msg.sender]); + } + + function getTotalLockedBalance() external view override returns (uint256) { + return _totalLockedBalance; + } } diff --git a/wemix/governance-contract/contracts/TestnetGovImp.sol b/wemix/governance-contract/contracts/TestnetGovImp.sol index 2d93d42d8816..a6d0d450863f 100644 --- a/wemix/governance-contract/contracts/TestnetGovImp.sol +++ b/wemix/governance-contract/contracts/TestnetGovImp.sol @@ -13,1019 +13,1019 @@ import "./interface/IStaking.sol"; import "@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol"; contract TestnetGovImp is TestnetAGov, ReentrancyGuardUpgradeable, BallotEnums, EnvConstants, UUPSUpgradeable { - enum VariableTypes { - Invalid, - Int, - Uint, - Uint2, - Uint3, - Uint4, - Address, - Bytes32, - Bytes, - String - } - - address constant ZERO = address(0); - - event MemberAdded(address indexed addr, address indexed voter); - event MemberRemoved(address indexed addr, address indexed voter); - event MemberChanged(address indexed oldAddr, address indexed newAddr, address indexed newVoter); - event EnvChanged(bytes32 envName, uint256 envType, bytes envVal); - event MemberUpdated(address indexed addr, address indexed voter); - // added for case that ballot's result could not be applicable. - event NotApplicable(uint256 indexed ballotId, string reason); - - event SetProposalTimePeriod(uint256 newPeriod); - - struct MemberInfo { - address staker; - address voter; // voter - address reward; - bytes name; - bytes enode; - bytes ip; - uint256 port; - uint256 lockAmount; - bytes memo; - uint256 duration; - } - - modifier checkLockedAmount() { - address staker = getStakerAddr(_msgSender()); - require(lockedBalanceOf(staker) <= getMaxStaking() && lockedBalanceOf(staker) >= getMinStaking(), "Invalid staking balance"); - _; - } - - modifier checkTimePeriod() { - address staker = getStakerAddr(_msgSender()); - require((block.timestamp - lastAddProposalTime[staker]) >= proposal_time_period, "Cannot add proposal too early"); - _; - lastAddProposalTime[staker] = block.timestamp; - } - - modifier checkMemberInfo(MemberInfo memory info) { - require(info.voter != ZERO, "Invalid voter"); - require(info.name.length > 0, "Invalid node name"); - require(info.ip.length > 0, "Invalid node IP"); - require(info.port > 0, "Invalid node port"); - require(info.lockAmount >= getMinStaking() && info.lockAmount <= getMaxStaking(), "Invalid lock Amount"); - _; - } - - /// @custom:oz-upgrades-unsafe-allow constructor - constructor() { - _disableInitializers(); - } - - function init(address registry, uint256 lockAmount, bytes memory name, bytes memory enode, bytes memory ip, uint port) public initializer { - require(lockAmount > 0, "lockAmount should be more then zero"); - __ReentrancyGuard_init(); - __Ownable_init(); - setRegistry(registry); - - // Lock - IStaking staking = IStaking(getStakingAddress()); - require(staking.availableBalanceOf(msg.sender) >= lockAmount, "Insufficient staking"); - staking.lock(msg.sender, lockAmount); - - // Add voting member - memberLength = 1; - voters[memberLength] = msg.sender; - voterIdx[msg.sender] = memberLength; - - // Add reward member - rewards[memberLength] = msg.sender; - rewardIdx[msg.sender] = memberLength; - - stakers[memberLength] = msg.sender; - stakerIdx[msg.sender] = memberLength; - - // Add node - nodeLength = 1; - Node storage node = nodes[nodeLength]; - node.name = name; - node.enode = enode; - node.ip = ip; - node.port = port; - checkNodeName[name] = true; - checkNodeEnode[enode] = true; - - checkNodeIpPort[keccak256(abi.encodePacked(ip, port))] = true; - - nodeIdxFromMember[msg.sender] = nodeLength; - nodeToMember[nodeLength] = msg.sender; - - modifiedBlock = block.number; - } - - function initOnce(address registry, uint256 lockAmount, bytes memory data) public initializer { - __ReentrancyGuard_init(); - __Ownable_init(); - setRegistry(registry); - - // _initialized = true; - modifiedBlock = block.number; - - // Lock - IStaking staking = IStaking(getStakingAddress()); - - require(lockAmount >= getMinStaking() && getMaxStaking() >= lockAmount, "Invalid lock amount"); - - // []{uint staker, uint voter, uint reward, bytes name, bytes enode, bytes ip, uint port} - // 32 bytes, 32 bytes, 32 bytes, [32 bytes, ] * 3, 32 bytes - address staker; - address voter; - address reward; - bytes memory name; - bytes memory enode; - bytes memory ip; - uint port; - uint idx = 0; - - uint ix; - uint eix; - assembly { - ix := add(data, 0x20) - } - eix = ix + data.length; - while (ix < eix) { - assembly { - staker := mload(ix) - } - ix += 0x20; - require(ix < eix); - - assembly { - voter := mload(ix) - } - ix += 0x20; - require(ix < eix); - - assembly { - reward := mload(ix) - } - ix += 0x20; - require(ix < eix); - - assembly { - name := ix - } - ix += 0x20 + name.length; - require(ix < eix); - - assembly { - enode := ix - } - ix += 0x20 + enode.length; - require(ix < eix); - - assembly { - ip := ix - } - ix += 0x20 + ip.length; - require(ix < eix); - - assembly { - port := mload(ix) - } - ix += 0x20; - - idx += 1; - require(!isMember(staker) && !isMember(voter) && !isReward(reward), "Already member"); - voters[idx] = voter; - voterIdx[voter] = idx; - rewards[idx] = reward; - rewardIdx[reward] = idx; - stakers[idx] = staker; - stakerIdx[staker] = idx; - - require(staking.availableBalanceOf(staker) >= lockAmount, "Insufficient staking"); - - require(checkNodeInfoAdd(name, enode, ip, port), "Duplicated node info"); - - lock(staker, lockAmount); - - Node storage node = nodes[idx]; - node.name = name; - node.enode = enode; - node.ip = ip; - node.port = port; - // checkNodeInfo[getNodeInfoHash(enode, ip, port)] = true; - checkNodeName[name] = true; - checkNodeEnode[enode] = true; - checkNodeIpPort[keccak256(abi.encodePacked(ip, port))] = true; - - nodeToMember[idx] = staker; - nodeIdxFromMember[staker] = idx; - } - memberLength = idx; - nodeLength = idx; - } - - //Add member address = staker address = voter address - function addProposalToAddMember( - MemberInfo memory info - ) external onlyGovMem checkTimePeriod checkLockedAmount checkMemberInfo(info) returns (uint256 ballotIdx) { - require(!isMember(info.staker) && !isReward(info.staker), "Already member"); - require(info.staker == info.voter && info.staker == info.reward, "Staker is not voter"); - require(checkNodeInfoAdd(info.name, info.enode, info.ip, info.port), "Duplicated node info"); - ballotIdx = ballotLength + 1; - createBallotForMember( - ballotIdx, // ballot id - uint256(BallotTypes.MemberAdd), // ballot type - msg.sender, // creator - ZERO, // old staker address - info - ); - updateBallotLock(ballotIdx, info.lockAmount); - updateBallotMemo(ballotIdx, info.memo); - ballotLength = ballotIdx; - } - - function addProposalToRemoveMember( - address staker, - uint256 lockAmount, - bytes memory memo, - uint256 duration - ) external onlyGovMem checkTimePeriod checkLockedAmount returns (uint256 ballotIdx) { - require(staker != ZERO, "Invalid address"); - require(isMember(staker), "Non-member"); - require(getMemberLength() > 1, "Cannot remove a sole member"); - require(lockedBalanceOf(staker) >= lockAmount, "Insufficient balance that can be unlocked."); - ballotIdx = ballotLength + 1; - - MemberInfo memory info = MemberInfo( - ZERO, // new staker address - ZERO, - ZERO, - new bytes(0), // new name - new bytes(0), // new enode - new bytes(0), // new ip - 0, // new port - lockAmount, - memo, - duration - ); - createBallotForMember( - ballotIdx, // ballot id - uint256(BallotTypes.MemberRemoval), // ballot type - msg.sender, - staker, - info - ); - updateBallotLock(ballotIdx, lockAmount); - updateBallotMemo(ballotIdx, memo); - ballotLength = ballotIdx; - } - - // voter A, staker A -> voter B, staker B Ok with voting - // voter A, staker B -> voter C, staker C Ok with voting - // voter A, staker B -> voter A, staker A Ok with voting - // voter A call : voter A, staker A -> voter A, staker B X - // staker A call : voter A, staker A-> voter B, staker A Ok without voting - // only staker A call : voter B, staker A, reward C -> voter B, staker A, reward D Ok without voting only (voter can not change reward) - // staker only change own info - // voter can propose and vote anything - function addProposalToChangeMember( - MemberInfo memory newInfo, - address oldStaker - ) external onlyGovMem checkTimePeriod checkLockedAmount checkMemberInfo(newInfo) returns (uint256 ballotIdx) { - require(oldStaker != ZERO, "Invalid old Address"); - require(isMember(oldStaker), "Non-member"); - - require( - (voters[stakerIdx[oldStaker]] == newInfo.voter || - newInfo.voter == oldStaker || - ((!isMember(newInfo.voter)) && !isReward(newInfo.voter))) && - (rewards[stakerIdx[oldStaker]] == newInfo.reward || - newInfo.reward == oldStaker || - ((!isMember(newInfo.reward)) && !isReward(newInfo.reward))), - "Already a member" - ); - - ballotIdx = ballotLength + 1; - createBallotForMember( - ballotIdx, // ballot id - uint256(BallotTypes.MemberChange), // ballot type - msg.sender, // creator - oldStaker, // old staker address - newInfo - ); - updateBallotLock(ballotIdx, newInfo.lockAmount); - updateBallotMemo(ballotIdx, newInfo.memo); - ballotLength = ballotIdx; - // 요청자 == 변경할 voting 주소 - if (msg.sender == oldStaker && oldStaker == newInfo.staker) { - (, , uint256 duration) = getBallotPeriod(ballotIdx); - startBallot(ballotIdx, block.timestamp, block.timestamp + duration); - finalizeVote(ballotIdx, uint256(BallotTypes.MemberChange), true, true); - } - } - - function addProposalToChangeGov( - address newGovAddr, - bytes memory memo, - uint256 duration - ) external onlyGovMem checkLockedAmount returns (uint256 ballotIdx) { - require(newGovAddr != ZERO, "Implementation cannot be zero"); - require(newGovAddr != _getImplementation(), "Same contract address"); - //check newGov has proxiableUUID - try IERC1822Proxiable(newGovAddr).proxiableUUID() returns (bytes32 slot) { - require(slot == _IMPLEMENTATION_SLOT, "ERC1967Upgrade: unsupported proxiableUUID"); - } catch { - revert("ERC1967Upgrade: new implementation is not UUPS"); - } - ballotIdx = ballotLength + 1; - IBallotStorage(getBallotStorageAddress()).createBallotForAddress( - ballotLength + 1, // ballot id - uint256(BallotTypes.GovernanceChange), // ballot type - duration, - msg.sender, // creator - newGovAddr // new governance address - ); - updateBallotMemo(ballotIdx, memo); - ballotLength = ballotIdx; - } - - function addProposalToChangeEnv( - bytes32 envName, - uint256 envType, - bytes memory envVal, - bytes memory memo, - uint256 duration - ) external onlyGovMem checkTimePeriod checkLockedAmount returns (uint256 ballotIdx) { - // require(envName != 0, "Invalid name"); - require(uint256(VariableTypes.Int) <= envType && envType <= uint256(VariableTypes.String), "Invalid type"); - require(checkVariableCondition(envName, envVal), "Invalid value"); - - ballotIdx = ballotLength + 1; - IBallotStorage(getBallotStorageAddress()).createBallotForVariable( - ballotIdx, // ballot id - uint256(BallotTypes.EnvValChange), // ballot type - duration, - msg.sender, // creator - envName, // env name - envType, // env type - envVal // env value - ); - updateBallotMemo(ballotIdx, memo); - ballotLength = ballotIdx; - } - - function vote(uint256 ballotIdx, bool approval) external onlyGovMem nonReentrant checkLockedAmount { - // Check if some ballot is in progress - require(checkUnfinalized(), "Expired"); - - // Check if the ballot can be voted - uint256 ballotType = checkVotable(ballotIdx); - // Vote - createVote(ballotIdx, approval); - // Finalize - (, uint256 accept, uint256 reject) = getBallotVotingInfo(ballotIdx); - uint256 threshold = getThreshold(); - if (accept >= threshold || reject >= threshold || (accept + reject) == 10000) { - finalizeVote(ballotIdx, ballotType, accept > reject, false); - } - } - - function getMinStaking() public view returns (uint256) { - return IEnvStorage(getEnvStorageAddress()).getStakingMin(); - } - - function getMaxStaking() public view returns (uint256) { - return IEnvStorage(getEnvStorageAddress()).getStakingMax(); - } - - function getMinVotingDuration() public view returns (uint256) { - return IEnvStorage(getEnvStorageAddress()).getBallotDurationMin(); - } - - function getMaxVotingDuration() public view returns (uint256) { - return IEnvStorage(getEnvStorageAddress()).getBallotDurationMax(); - } - - function getThreshold() public pure returns (uint256) { - return 5001; - } // 50.01% from 5001 of 10000 - - function checkUnfinalized() public view returns (bool) { - if (ballotInVoting != 0) { - (, uint256 state, ) = getBallotState(ballotInVoting); - (, uint256 endTime, ) = getBallotPeriod(ballotInVoting); - if (state == uint256(BallotStates.InProgress)) { - if (endTime < block.timestamp) return false; - // require(endTime > block.timestamp, "Expired"); - // require(ballotIdx == ballotInVoting, "Now in voting with different ballot"); - // if (endTime < block.timestamp) { - - // finalizeBallot(ballotInVoting, uint256(BallotStates.Rejected)); - // ballotInVoting = 0; - // // console.log("vote is finalized %s", ballotInVoting); - // } else if (ballotIdx != ballotInVoting) { - // revert("Now in voting with different ballot"); - // } - } - } - return true; - } - - function finalizeEndedVote() public onlyGovMem { - require(!checkUnfinalized(), "Voting is not ended"); - finalizeBallot(ballotInVoting, uint256(BallotStates.Rejected)); - ballotInVoting = 0; - } - - function checkVotable(uint256 ballotIdx) private returns (uint256) { - (uint256 ballotType, uint256 state, ) = getBallotState(ballotIdx); - if (state == uint256(BallotStates.Ready)) { - require(ballotInVoting == 0, "Now in voting with different ballot"); - (, , uint256 duration) = getBallotPeriod(ballotIdx); - if (duration < getMinVotingDuration()) { - startBallot(ballotIdx, block.timestamp, block.timestamp + getMinVotingDuration()); - } else if (getMaxVotingDuration() < duration) { - startBallot(ballotIdx, block.timestamp, block.timestamp + getMaxVotingDuration()); - } else { - startBallot(ballotIdx, block.timestamp, block.timestamp + duration); - } - ballotInVoting = ballotIdx; - } else if (state == uint256(BallotStates.InProgress)) { - // Nothing to do - require(ballotIdx == ballotInVoting, "Now in voting with different ballot"); - } else { - // canceled - revert("Expired"); - } - return ballotType; - } - - function createVote(uint256 ballotIdx, bool approval) private { - uint256 voteIdx = voteLength + 1; - address staker = getStakerAddr(msg.sender); - uint256 weight = 10000 / getMemberLength(); //IStaking(getStakingAddress()).calcVotingWeightWithScaleFactor(staker, 10000); - uint256 decision = approval ? uint256(DecisionTypes.Accept) : uint256(DecisionTypes.Reject); - IBallotStorage(getBallotStorageAddress()).createVote(voteIdx, ballotIdx, staker, decision, weight); - voteLength = voteIdx; - } - - function finalizeVote(uint256 ballotIdx, uint256 ballotType, bool isAccepted, bool self) private { - uint256 ballotState = uint256(BallotStates.Rejected); - if (isAccepted) { - ballotState = uint256(BallotStates.Accepted); - - if (ballotType == uint256(BallotTypes.MemberAdd)) { - if (!addMember(ballotIdx)) { - ballotState = uint256(BallotStates.Rejected); - } - } else if (ballotType == uint256(BallotTypes.MemberRemoval)) { - removeMember(ballotIdx); - } else if (ballotType == uint256(BallotTypes.MemberChange)) { - if (!changeMember(ballotIdx, self)) { - ballotState = uint256(BallotStates.Rejected); - } - } else if (ballotType == uint256(BallotTypes.GovernanceChange)) { - changeGov(ballotIdx); - } else if (ballotType == uint256(BallotTypes.EnvValChange)) { - applyEnv(ballotIdx); - } - } - finalizeBallot(ballotIdx, ballotState); - if (!self) ballotInVoting = 0; - } - - function fromValidBallot(uint256 ballotIdx, uint256 targetType) private view { - (uint256 ballotType, uint256 state, ) = getBallotState(ballotIdx); - require(ballotType == targetType, "Invalid voting type"); - require(state == uint(BallotStates.InProgress), "Invalid voting state"); - (, uint256 accept, uint256 reject) = getBallotVotingInfo(ballotIdx); - require(accept >= getThreshold() || reject >= getThreshold(), "Not yet finalized"); - } - - function addMember(uint256 ballotIdx) private returns (bool) { - fromValidBallot(ballotIdx, uint256(BallotTypes.MemberAdd)); - - ( - , - address newStaker, - address newVoter, - address newReward, - bytes memory name, - bytes memory enode, - bytes memory ip, - uint port, - uint256 lockAmount - ) = getBallotMember(ballotIdx); - if (isMember(newStaker)) { - // new staker is already a member or a voter/ - emit NotApplicable(ballotIdx, "Already a member"); - return false; - } - if (isReward(newReward)) { - // new staker is already a member or a voter/ - emit NotApplicable(ballotIdx, "Already a rewarder"); - return false; - } - - // Lock - if (lockAmount < getMinStaking() || getMaxStaking() < lockAmount) { - emit NotApplicable(ballotIdx, "Invalid lock amount"); - return false; - } - - if (availableBalanceOf(newStaker) < lockAmount) { - emit NotApplicable(ballotIdx, "Insufficient balance that can be locked"); - return false; - } - - if (newStaker != newVoter && newStaker != newReward) { - emit NotApplicable(ballotIdx, "Invalid member address"); - return false; - } - - lock(newStaker, lockAmount); - - // Add voting and reward member - uint256 nMemIdx = memberLength + 1; - voters[nMemIdx] = newVoter; - voterIdx[newVoter] = nMemIdx; - rewards[nMemIdx] = newReward; - rewardIdx[newReward] = nMemIdx; - stakers[nMemIdx] = newStaker; - stakerIdx[newStaker] = nMemIdx; - - // Add node - uint256 nNodeIdx = nodeLength + 1; - Node storage node = nodes[nNodeIdx]; - - node.name = name; - node.enode = enode; - node.ip = ip; - node.port = port; - // checkNodeInfo[getNodeInfoHash(enode, ip, port)] = true; - checkNodeName[name] = true; - checkNodeEnode[enode] = true; - checkNodeIpPort[keccak256(abi.encodePacked(ip, port))] = true; - - nodeToMember[nNodeIdx] = newStaker; - nodeIdxFromMember[newStaker] = nNodeIdx; - node.name = name; - memberLength = nMemIdx; - nodeLength = nNodeIdx; - modifiedBlock = block.number; - emit MemberAdded(newStaker, newVoter); - return true; - } - - function removeMember(uint256 ballotIdx) private { - fromValidBallot(ballotIdx, uint256(BallotTypes.MemberRemoval)); - - (address oldStaker, , , , , , , , uint256 unlockAmount) = getBallotMember(ballotIdx); - if (!isMember(oldStaker)) { - emit NotApplicable(ballotIdx, "Not already a member"); - return; // Non-member. it is abnormal case, but passed - } - - // Remove voting and reward member - uint256 removeIdx = stakerIdx[oldStaker]; - address endAddr = stakers[memberLength]; - address oldVoter = voters[removeIdx]; - address oldReward = rewards[removeIdx]; - - if (stakerIdx[oldStaker] != memberLength) { - (stakers[removeIdx], stakers[memberLength], stakerIdx[oldStaker], stakerIdx[endAddr]) = ( - stakers[memberLength], - ZERO, - 0, - stakerIdx[oldStaker] - ); - removeIdx = rewardIdx[oldStaker]; - endAddr = rewards[memberLength]; - (rewards[removeIdx], rewards[memberLength], rewardIdx[oldReward], rewardIdx[endAddr]) = ( - rewards[memberLength], - ZERO, - 0, - rewardIdx[oldReward] - ); - removeIdx = voterIdx[oldStaker]; - endAddr = voters[memberLength]; - (voters[removeIdx], voters[memberLength], voterIdx[oldVoter], voterIdx[endAddr]) = (voters[memberLength], ZERO, 0, voterIdx[oldVoter]); - } else { - stakers[memberLength] = ZERO; - stakerIdx[oldStaker] = 0; - rewards[memberLength] = ZERO; - rewardIdx[oldReward] = 0; - voters[memberLength] = ZERO; - voterIdx[oldVoter] = 0; - } - memberLength = memberLength - 1; - // Remove node - - Node storage node = nodes[removeIdx]; - checkNodeEnode[node.enode] = false; - checkNodeName[node.name] = false; - checkNodeIpPort[keccak256(abi.encodePacked(node.ip, node.port))] = false; - if (nodeIdxFromMember[oldStaker] != nodeLength) { - removeIdx = nodeIdxFromMember[oldStaker]; - endAddr = nodeToMember[nodeLength]; - - node.name = nodes[nodeLength].name; - node.enode = nodes[nodeLength].enode; - node.ip = nodes[nodeLength].ip; - node.port = nodes[nodeLength].port; - - nodeToMember[removeIdx] = endAddr; - nodeIdxFromMember[endAddr] = removeIdx; - } - nodeToMember[nodeLength] = ZERO; - nodeIdxFromMember[oldStaker] = 0; - delete nodes[nodeLength]; - nodeLength = nodeLength - 1; - modifiedBlock = block.number; - // Unlock and transfer remained to governance - transferLockedAndUnlock(oldStaker, unlockAmount); - - emit MemberRemoved(oldStaker, oldVoter); - } - - function checkChangeMember( - uint256 ballotIdx, - bool self, - address oldStaker, - address newStaker, - address newVoter, - address newReward, - bytes memory name, - bytes memory enode, - bytes memory ip, - uint256 port, - uint256 lockAmount - ) private returns (bool) { - if (!self) { - fromValidBallot(ballotIdx, uint256(BallotTypes.MemberChange)); - } - - if (!isMember(oldStaker)) { - emit NotApplicable(ballotIdx, "Old address is not a member"); - return false; // Non-member. it is abnormal case. - } - - //old staker - uint256 memberIdx = stakerIdx[oldStaker]; - if (oldStaker != newStaker) { - if (isMember(newStaker)) { - emit NotApplicable(ballotIdx, "new address is already a member"); - return false; // already member. it is abnormal case. - } - if (newStaker != newVoter && newStaker != newReward) { - emit NotApplicable(ballotIdx, "Invalid voter address"); - return false; - } - // Lock - if (lockAmount < getMinStaking() || getMaxStaking() < lockAmount) { - emit NotApplicable(ballotIdx, "Invalid lock amount"); - return false; - } - if (availableBalanceOf(newStaker) < lockAmount) { - emit NotApplicable(ballotIdx, "Insufficient balance that can be locked"); - return false; - } - } - // Change node - uint256 nodeIdx = nodeIdxFromMember[oldStaker]; - { - Node memory node = nodes[nodeIdx]; - - if ( - //if node info is not same - // node info can not duplicate - !checkNodeInfoChange(name, enode, ip, port, node) - ) { - emit NotApplicable(ballotIdx, "Duplicated node info"); - return false; - } - } - - { - address oldReward = rewards[memberIdx]; - if ((oldStaker != newReward) && (oldReward != newReward) && (isMember(newReward) || isReward(newReward))) { - emit NotApplicable(ballotIdx, "Invalid reward address"); - return false; - } - } - { - address oldVoter = voters[memberIdx]; - if ((oldStaker != newVoter) && (oldVoter != newVoter) && (isMember(newVoter) || isReward(newVoter))) { - emit NotApplicable(ballotIdx, "Invalid voters address"); - return false; - } - } - return true; - } - - // isMember=> isStaker and isVoter - // vote => onlyVoter, staker can change voter without voting, default = staker == voter - // voter can change staker with voting.(changeMember) - function changeMember(uint256 ballotIdx, bool self) private returns (bool) { - if (!self) { - fromValidBallot(ballotIdx, uint256(BallotTypes.MemberChange)); - } - - ( - address oldStaker, - address newStaker, - address newVoter, - address newReward, - bytes memory name, - bytes memory enode, - bytes memory ip, - uint port, - uint256 lockAmount - ) = getBallotMember(ballotIdx); - if (!isMember(oldStaker)) { - emit NotApplicable(ballotIdx, "Old address is not a member"); - return false; // Non-member. it is abnormal case. - } - - if (!checkChangeMember(ballotIdx, self, oldStaker, newStaker, newVoter, newReward, name, enode, ip, port, lockAmount)) return false; - - //old staker - uint256 memberIdx = stakerIdx[oldStaker]; - if (oldStaker != newStaker) { - // Change member - stakers[memberIdx] = newStaker; - stakerIdx[newStaker] = memberIdx; - stakerIdx[oldStaker] = 0; - - lock(newStaker, lockAmount); - } - // Change node - uint256 nodeIdx = nodeIdxFromMember[oldStaker]; - { - Node storage node = nodes[nodeIdx]; - - checkNodeName[node.name] = false; - checkNodeEnode[node.enode] = false; - checkNodeIpPort[keccak256(abi.encodePacked(node.ip, node.port))] = false; - - node.name = name; - node.enode = enode; - node.ip = ip; - node.port = port; - modifiedBlock = block.number; - // checkNodeInfo[getNodeInfoHash(enode, ip, port)] = true; - checkNodeName[name] = true; - checkNodeEnode[enode] = true; - checkNodeIpPort[keccak256(abi.encodePacked(ip, port))] = true; - } - - { - address oldReward = rewards[memberIdx]; - if (oldReward != newReward) { - rewards[memberIdx] = newReward; - rewardIdx[newReward] = memberIdx; - rewardIdx[oldReward] = 0; - } - } - { - address oldVoter = voters[memberIdx]; - if (oldVoter != newVoter) { - voters[memberIdx] = newVoter; - voterIdx[newVoter] = memberIdx; - voterIdx[oldVoter] = 0; - } - } - - if (oldStaker != newStaker) { - nodeToMember[nodeIdx] = newStaker; - nodeIdxFromMember[newStaker] = nodeIdx; - nodeIdxFromMember[oldStaker] = 0; - - // Unlock and transfer remained to governance - transferLockedAndUnlock(oldStaker, lockAmount); - - emit MemberChanged(oldStaker, newStaker, newVoter); - } else { - emit MemberUpdated(oldStaker, newStaker); - } - return true; - } - - function changeGov(uint256 ballotIdx) private { - fromValidBallot(ballotIdx, uint256(BallotTypes.GovernanceChange)); - - address newImp = IBallotStorage(getBallotStorageAddress()).getBallotAddress(ballotIdx); - if (newImp != ZERO) { - _authorizeUpgrade(newImp); - _upgradeToAndCallUUPS(newImp, new bytes(0), false); - modifiedBlock = block.number; - } - } - - function applyEnv(uint256 ballotIdx) private { - fromValidBallot(ballotIdx, uint256(BallotTypes.EnvValChange)); - - (bytes32 envKey, uint256 envType, bytes memory envVal) = IBallotStorage(getBallotStorageAddress()).getBallotVariable(ballotIdx); - - IEnvStorage envStorage = IEnvStorage(getEnvStorageAddress()); - envStorage.setVariable(envKey, envVal); - modifiedBlock = block.number; - - emit EnvChanged(envKey, envType, envVal); - } - - //------------------ Code reduction for creation gas - function createBallotForMember(uint256 id, uint256 bType, address creator, address oAddr, MemberInfo memory info) private { - IBallotStorage(getBallotStorageAddress()).createBallotForMember( - id, // ballot id - bType, // ballot type - info.duration, - creator, // creator - oAddr, // old member address - info.staker, // new member address - info.voter, // old staker address - info.reward, // new staker address - info.name, // new name - info.enode, // new enode - info.ip, // new ip - info.port // new port - ); - } - - function updateBallotLock(uint256 id, uint256 amount) private { - IBallotStorage(getBallotStorageAddress()).updateBallotMemberLockAmount(id, amount); - } - - function updateBallotMemo(uint256 id, bytes memory memo) private { - IBallotStorage(getBallotStorageAddress()).updateBallotMemo(id, memo); - } - - function startBallot(uint256 id, uint256 s, uint256 e) private { - IBallotStorage(getBallotStorageAddress()).startBallot(id, s, e); - } - - function finalizeBallot(uint256 id, uint256 state) private { - IBallotStorage(getBallotStorageAddress()).finalizeBallot(id, state); - } - - function getBallotState(uint256 id) private view returns (uint256, uint256, bool) { - return IBallotStorage(getBallotStorageAddress()).getBallotState(id); - } - - function getBallotPeriod(uint256 id) private view returns (uint256, uint256, uint256) { - return IBallotStorage(getBallotStorageAddress()).getBallotPeriod(id); - } - - function getBallotVotingInfo(uint256 id) private view returns (uint256, uint256, uint256) { - return IBallotStorage(getBallotStorageAddress()).getBallotVotingInfo(id); - } - - function getBallotMember( - uint256 id - ) private view returns (address, address, address, address, bytes memory, bytes memory, bytes memory, uint256, uint256) { - return IBallotStorage(getBallotStorageAddress()).getBallotMember(id); - } - - function lock(address addr, uint256 amount) private { - IStaking(getStakingAddress()).lock(addr, amount); - } - - function unlock(address addr, uint256 amount) private { - IStaking(getStakingAddress()).unlock(addr, amount); - } - - function transferLockedAndUnlock(address addr, uint256 unlockAmount) private { - IStaking staking = IStaking(getStakingAddress()); - uint256 locked = staking.lockedBalanceOf(addr); - if (locked > unlockAmount) { - staking.transferLocked(addr, locked - unlockAmount); - unlock(addr, unlockAmount); - } else { - unlock(addr, locked); - } - } - - function lockedBalanceOf(address addr) private view returns (uint256) { - // IStaking staking = IStaking(getStakingAddress()).lockedBalanceOf(addr); - return IStaking(getStakingAddress()).lockedBalanceOf(addr); - } - - function availableBalanceOf(address addr) private view returns (uint256) { - return IStaking(getStakingAddress()).availableBalanceOf(addr); - } - - //------------------ Code reduction end - - //====NXTMeta=====/ - - function _authorizeUpgrade(address newImplementation) internal override onlyGovMem {} - - function checkVariableCondition(bytes32 envKey, bytes memory envVal) internal view returns (bool) { - return IEnvStorage(getEnvStorageAddress()).checkVariableCondition(envKey, envVal); - } - - function getStakerAddr(address _addr) public view returns (address staker) { - if (isStaker(_addr)) staker = _addr; - else if (isVoter(_addr)) staker = stakers[voterIdx[_addr]]; - } - - function setProposalTimePeriod(uint256 newPeriod) external onlyOwner { - require(newPeriod < 1 hours, "newPeriod is too long"); - proposal_time_period = newPeriod; - emit SetProposalTimePeriod(newPeriod); - } - - function checkNodeInfoAdd(bytes memory name, bytes memory enode, bytes memory ip, uint port) internal view returns (bool check) { - //Enode can not be duplicated - //IP:port can not be duplicated - //Name can not be duplicated - check = true; - if (checkNodeEnode[enode]) check = false; - if (checkNodeName[name]) check = false; - - bytes32 hvalue = keccak256(abi.encodePacked(ip, port)); - if (checkNodeIpPort[hvalue]) check = false; - } - - function checkNodeInfoChange( - bytes memory name, - bytes memory enode, - bytes memory ip, - uint port, - Node memory nodeInfo - ) internal view returns (bool check) { - //Enode can not be duplicated - //IP:port can not be duplicated - //Name can not be duplicated - check = true; - if ((keccak256(nodeInfo.enode) != keccak256(enode) && checkNodeEnode[enode])) check = false; - if ((keccak256(nodeInfo.name) != keccak256(name) && checkNodeName[name])) check = false; - - bytes32 hvalue = keccak256(abi.encodePacked(ip, port)); - if ((keccak256(abi.encodePacked(nodeInfo.ip, nodeInfo.port)) != hvalue && checkNodeIpPort[hvalue])) check = false; - } - - uint256 public proposal_time_period; - mapping(address => uint256) public lastAddProposalTime; - - //For a node duplicate check - // testnet value is here - // mapping(bytes32=>bool) internal checkNodeInfo; - mapping(bytes => bool) internal checkNodeName; - mapping(bytes => bool) internal checkNodeEnode; - mapping(bytes32 => bool) internal checkNodeIpPort; - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[46] private __gap; - - function reInit() external reinitializer(2) onlyOwner { - unchecked { - for (uint256 i = 0; i < getMemberLength(); i++) { - Node memory node = nodes[i]; - checkNodeName[node.name] = true; - checkNodeEnode[node.enode] = true; - checkNodeIpPort[keccak256(abi.encodePacked(node.ip, node.port))] = true; - } - } - } - - function reInitV3(uint256[] memory indices, address[] memory newRewards) external reinitializer(3) onlyOwner { - unchecked { - for (uint256 i = 0; i < indices.length; i++) { - address oldReward = rewards[i]; - address newReward = newRewards[i - 1]; - rewards[i] = newReward; - rewardIdx[newReward] = i; - rewardIdx[oldReward] = 0; - } - } - //for the testnet - checkNodeName[nodes[40].name] = true; - checkNodeEnode[nodes[40].enode] = true; - checkNodeIpPort[keccak256(abi.encodePacked(nodes[40].ip, nodes[40].port))] = true; - } - - function maigration(address newGov) external onlyOwner { - IGov(newGov).initMigration(address(reg), modifiedBlock, owner()); - unchecked { - for (uint256 i = 1; i < getMemberLength() + 1; i++) { - IGov(newGov).setMembersForMigration( - i, - stakers[i], - voters[i], - rewards[i], - lastAddProposalTime[stakers[i]], - nodes[i].name, - nodes[i].enode, - nodes[i].ip, - nodes[i].port - ); - } - } - IGov(newGov).setBallotForMigration(ballotLength, voteLength, ballotInVoting); - IGov(newGov).setProposalTimePeriodForMigration(proposal_time_period); - } + enum VariableTypes { + Invalid, + Int, + Uint, + Uint2, + Uint3, + Uint4, + Address, + Bytes32, + Bytes, + String + } + + address constant ZERO = address(0); + + event MemberAdded(address indexed addr, address indexed voter); + event MemberRemoved(address indexed addr, address indexed voter); + event MemberChanged(address indexed oldAddr, address indexed newAddr, address indexed newVoter); + event EnvChanged(bytes32 envName, uint256 envType, bytes envVal); + event MemberUpdated(address indexed addr, address indexed voter); + // added for case that ballot's result could not be applicable. + event NotApplicable(uint256 indexed ballotId, string reason); + + event SetProposalTimePeriod(uint256 newPeriod); + + struct MemberInfo { + address staker; + address voter; // voter + address reward; + bytes name; + bytes enode; + bytes ip; + uint256 port; + uint256 lockAmount; + bytes memo; + uint256 duration; + } + + modifier checkLockedAmount() { + address staker = getStakerAddr(_msgSender()); + require(lockedBalanceOf(staker) <= getMaxStaking() && lockedBalanceOf(staker) >= getMinStaking(), "Invalid staking balance"); + _; + } + + modifier checkTimePeriod() { + address staker = getStakerAddr(_msgSender()); + require((block.timestamp - lastAddProposalTime[staker]) >= proposal_time_period, "Cannot add proposal too early"); + _; + lastAddProposalTime[staker] = block.timestamp; + } + + modifier checkMemberInfo(MemberInfo memory info) { + require(info.voter != ZERO, "Invalid voter"); + require(info.name.length > 0, "Invalid node name"); + require(info.ip.length > 0, "Invalid node IP"); + require(info.port > 0, "Invalid node port"); + require(info.lockAmount >= getMinStaking() && info.lockAmount <= getMaxStaking(), "Invalid lock Amount"); + _; + } + + /// @custom:oz-upgrades-unsafe-allow constructor + constructor() { + _disableInitializers(); + } + + function init(address registry, uint256 lockAmount, bytes memory name, bytes memory enode, bytes memory ip, uint port) public initializer { + require(lockAmount > 0, "lockAmount should be more then zero"); + __ReentrancyGuard_init(); + __Ownable_init(); + setRegistry(registry); + + // Lock + IStaking staking = IStaking(getStakingAddress()); + require(staking.availableBalanceOf(msg.sender) >= lockAmount, "Insufficient staking"); + staking.lock(msg.sender, lockAmount); + + // Add voting member + memberLength = 1; + voters[memberLength] = msg.sender; + voterIdx[msg.sender] = memberLength; + + // Add reward member + rewards[memberLength] = msg.sender; + rewardIdx[msg.sender] = memberLength; + + stakers[memberLength] = msg.sender; + stakerIdx[msg.sender] = memberLength; + + // Add node + nodeLength = 1; + Node storage node = nodes[nodeLength]; + node.name = name; + node.enode = enode; + node.ip = ip; + node.port = port; + checkNodeName[name] = true; + checkNodeEnode[enode] = true; + + checkNodeIpPort[keccak256(abi.encodePacked(ip, port))] = true; + + nodeIdxFromMember[msg.sender] = nodeLength; + nodeToMember[nodeLength] = msg.sender; + + modifiedBlock = block.number; + } + + function initOnce(address registry, uint256 lockAmount, bytes memory data) public initializer { + __ReentrancyGuard_init(); + __Ownable_init(); + setRegistry(registry); + + // _initialized = true; + modifiedBlock = block.number; + + // Lock + IStaking staking = IStaking(getStakingAddress()); + + require(lockAmount >= getMinStaking() && getMaxStaking() >= lockAmount, "Invalid lock amount"); + + // []{uint staker, uint voter, uint reward, bytes name, bytes enode, bytes ip, uint port} + // 32 bytes, 32 bytes, 32 bytes, [32 bytes, ] * 3, 32 bytes + address staker; + address voter; + address reward; + bytes memory name; + bytes memory enode; + bytes memory ip; + uint port; + uint idx = 0; + + uint ix; + uint eix; + assembly { + ix := add(data, 0x20) + } + eix = ix + data.length; + while (ix < eix) { + assembly { + staker := mload(ix) + } + ix += 0x20; + require(ix < eix); + + assembly { + voter := mload(ix) + } + ix += 0x20; + require(ix < eix); + + assembly { + reward := mload(ix) + } + ix += 0x20; + require(ix < eix); + + assembly { + name := ix + } + ix += 0x20 + name.length; + require(ix < eix); + + assembly { + enode := ix + } + ix += 0x20 + enode.length; + require(ix < eix); + + assembly { + ip := ix + } + ix += 0x20 + ip.length; + require(ix < eix); + + assembly { + port := mload(ix) + } + ix += 0x20; + + idx += 1; + require(!isMember(staker) && !isMember(voter) && !isReward(reward), "Already member"); + voters[idx] = voter; + voterIdx[voter] = idx; + rewards[idx] = reward; + rewardIdx[reward] = idx; + stakers[idx] = staker; + stakerIdx[staker] = idx; + + require(staking.availableBalanceOf(staker) >= lockAmount, "Insufficient staking"); + + require(checkNodeInfoAdd(name, enode, ip, port), "Duplicated node info"); + + lock(staker, lockAmount); + + Node storage node = nodes[idx]; + node.name = name; + node.enode = enode; + node.ip = ip; + node.port = port; + // checkNodeInfo[getNodeInfoHash(enode, ip, port)] = true; + checkNodeName[name] = true; + checkNodeEnode[enode] = true; + checkNodeIpPort[keccak256(abi.encodePacked(ip, port))] = true; + + nodeToMember[idx] = staker; + nodeIdxFromMember[staker] = idx; + } + memberLength = idx; + nodeLength = idx; + } + + //Add member address = staker address = voter address + function addProposalToAddMember( + MemberInfo memory info + ) external onlyGovMem checkTimePeriod checkLockedAmount checkMemberInfo(info) returns (uint256 ballotIdx) { + require(!isMember(info.staker) && !isReward(info.staker), "Already member"); + require(info.staker == info.voter && info.staker == info.reward, "Staker is not voter"); + require(checkNodeInfoAdd(info.name, info.enode, info.ip, info.port), "Duplicated node info"); + ballotIdx = ballotLength + 1; + createBallotForMember( + ballotIdx, // ballot id + uint256(BallotTypes.MemberAdd), // ballot type + msg.sender, // creator + ZERO, // old staker address + info + ); + updateBallotLock(ballotIdx, info.lockAmount); + updateBallotMemo(ballotIdx, info.memo); + ballotLength = ballotIdx; + } + + function addProposalToRemoveMember( + address staker, + uint256 lockAmount, + bytes memory memo, + uint256 duration + ) external onlyGovMem checkTimePeriod checkLockedAmount returns (uint256 ballotIdx) { + require(staker != ZERO, "Invalid address"); + require(isMember(staker), "Non-member"); + require(getMemberLength() > 1, "Cannot remove a sole member"); + require(lockedBalanceOf(staker) >= lockAmount, "Insufficient balance that can be unlocked."); + ballotIdx = ballotLength + 1; + + MemberInfo memory info = MemberInfo( + ZERO, // new staker address + ZERO, + ZERO, + new bytes(0), // new name + new bytes(0), // new enode + new bytes(0), // new ip + 0, // new port + lockAmount, + memo, + duration + ); + createBallotForMember( + ballotIdx, // ballot id + uint256(BallotTypes.MemberRemoval), // ballot type + msg.sender, + staker, + info + ); + updateBallotLock(ballotIdx, lockAmount); + updateBallotMemo(ballotIdx, memo); + ballotLength = ballotIdx; + } + + // voter A, staker A -> voter B, staker B Ok with voting + // voter A, staker B -> voter C, staker C Ok with voting + // voter A, staker B -> voter A, staker A Ok with voting + // voter A call : voter A, staker A -> voter A, staker B X + // staker A call : voter A, staker A-> voter B, staker A Ok without voting + // only staker A call : voter B, staker A, reward C -> voter B, staker A, reward D Ok without voting only (voter can not change reward) + // staker only change own info + // voter can propose and vote anything + function addProposalToChangeMember( + MemberInfo memory newInfo, + address oldStaker + ) external onlyGovMem checkTimePeriod checkLockedAmount checkMemberInfo(newInfo) returns (uint256 ballotIdx) { + require(oldStaker != ZERO, "Invalid old Address"); + require(isMember(oldStaker), "Non-member"); + + require( + (voters[stakerIdx[oldStaker]] == newInfo.voter || + newInfo.voter == oldStaker || + ((!isMember(newInfo.voter)) && !isReward(newInfo.voter))) && + (rewards[stakerIdx[oldStaker]] == newInfo.reward || + newInfo.reward == oldStaker || + ((!isMember(newInfo.reward)) && !isReward(newInfo.reward))), + "Already a member" + ); + + ballotIdx = ballotLength + 1; + createBallotForMember( + ballotIdx, // ballot id + uint256(BallotTypes.MemberChange), // ballot type + msg.sender, // creator + oldStaker, // old staker address + newInfo + ); + updateBallotLock(ballotIdx, newInfo.lockAmount); + updateBallotMemo(ballotIdx, newInfo.memo); + ballotLength = ballotIdx; + // 요청자 == 변경할 voting 주소 + if (msg.sender == oldStaker && oldStaker == newInfo.staker) { + (, , uint256 duration) = getBallotPeriod(ballotIdx); + startBallot(ballotIdx, block.timestamp, block.timestamp + duration); + finalizeVote(ballotIdx, uint256(BallotTypes.MemberChange), true, true); + } + } + + function addProposalToChangeGov( + address newGovAddr, + bytes memory memo, + uint256 duration + ) external onlyGovMem checkLockedAmount returns (uint256 ballotIdx) { + require(newGovAddr != ZERO, "Implementation cannot be zero"); + require(newGovAddr != _getImplementation(), "Same contract address"); + //check newGov has proxiableUUID + try IERC1822Proxiable(newGovAddr).proxiableUUID() returns (bytes32 slot) { + require(slot == _IMPLEMENTATION_SLOT, "ERC1967Upgrade: unsupported proxiableUUID"); + } catch { + revert("ERC1967Upgrade: new implementation is not UUPS"); + } + ballotIdx = ballotLength + 1; + IBallotStorage(getBallotStorageAddress()).createBallotForAddress( + ballotLength + 1, // ballot id + uint256(BallotTypes.GovernanceChange), // ballot type + duration, + msg.sender, // creator + newGovAddr // new governance address + ); + updateBallotMemo(ballotIdx, memo); + ballotLength = ballotIdx; + } + + function addProposalToChangeEnv( + bytes32 envName, + uint256 envType, + bytes memory envVal, + bytes memory memo, + uint256 duration + ) external onlyGovMem checkTimePeriod checkLockedAmount returns (uint256 ballotIdx) { + // require(envName != 0, "Invalid name"); + require(uint256(VariableTypes.Int) <= envType && envType <= uint256(VariableTypes.String), "Invalid type"); + require(checkVariableCondition(envName, envVal), "Invalid value"); + + ballotIdx = ballotLength + 1; + IBallotStorage(getBallotStorageAddress()).createBallotForVariable( + ballotIdx, // ballot id + uint256(BallotTypes.EnvValChange), // ballot type + duration, + msg.sender, // creator + envName, // env name + envType, // env type + envVal // env value + ); + updateBallotMemo(ballotIdx, memo); + ballotLength = ballotIdx; + } + + function vote(uint256 ballotIdx, bool approval) external onlyGovMem nonReentrant checkLockedAmount { + // Check if some ballot is in progress + require(checkUnfinalized(), "Expired"); + + // Check if the ballot can be voted + uint256 ballotType = checkVotable(ballotIdx); + // Vote + createVote(ballotIdx, approval); + // Finalize + (, uint256 accept, uint256 reject) = getBallotVotingInfo(ballotIdx); + uint256 threshold = getThreshold(); + if (accept >= threshold || reject >= threshold || (accept + reject) == 10000) { + finalizeVote(ballotIdx, ballotType, accept > reject, false); + } + } + + function getMinStaking() public view returns (uint256) { + return IEnvStorage(getEnvStorageAddress()).getStakingMin(); + } + + function getMaxStaking() public view returns (uint256) { + return IEnvStorage(getEnvStorageAddress()).getStakingMax(); + } + + function getMinVotingDuration() public view returns (uint256) { + return IEnvStorage(getEnvStorageAddress()).getBallotDurationMin(); + } + + function getMaxVotingDuration() public view returns (uint256) { + return IEnvStorage(getEnvStorageAddress()).getBallotDurationMax(); + } + + function getThreshold() public pure returns (uint256) { + return 5001; + } // 50.01% from 5001 of 10000 + + function checkUnfinalized() public view returns (bool) { + if (ballotInVoting != 0) { + (, uint256 state, ) = getBallotState(ballotInVoting); + (, uint256 endTime, ) = getBallotPeriod(ballotInVoting); + if (state == uint256(BallotStates.InProgress)) { + if (endTime < block.timestamp) return false; + // require(endTime > block.timestamp, "Expired"); + // require(ballotIdx == ballotInVoting, "Now in voting with different ballot"); + // if (endTime < block.timestamp) { + + // finalizeBallot(ballotInVoting, uint256(BallotStates.Rejected)); + // ballotInVoting = 0; + // // console.log("vote is finalized %s", ballotInVoting); + // } else if (ballotIdx != ballotInVoting) { + // revert("Now in voting with different ballot"); + // } + } + } + return true; + } + + function finalizeEndedVote() public onlyGovMem { + require(!checkUnfinalized(), "Voting is not ended"); + finalizeBallot(ballotInVoting, uint256(BallotStates.Rejected)); + ballotInVoting = 0; + } + + function checkVotable(uint256 ballotIdx) private returns (uint256) { + (uint256 ballotType, uint256 state, ) = getBallotState(ballotIdx); + if (state == uint256(BallotStates.Ready)) { + require(ballotInVoting == 0, "Now in voting with different ballot"); + (, , uint256 duration) = getBallotPeriod(ballotIdx); + if (duration < getMinVotingDuration()) { + startBallot(ballotIdx, block.timestamp, block.timestamp + getMinVotingDuration()); + } else if (getMaxVotingDuration() < duration) { + startBallot(ballotIdx, block.timestamp, block.timestamp + getMaxVotingDuration()); + } else { + startBallot(ballotIdx, block.timestamp, block.timestamp + duration); + } + ballotInVoting = ballotIdx; + } else if (state == uint256(BallotStates.InProgress)) { + // Nothing to do + require(ballotIdx == ballotInVoting, "Now in voting with different ballot"); + } else { + // canceled + revert("Expired"); + } + return ballotType; + } + + function createVote(uint256 ballotIdx, bool approval) private { + uint256 voteIdx = voteLength + 1; + address staker = getStakerAddr(msg.sender); + uint256 weight = 10000 / getMemberLength(); //IStaking(getStakingAddress()).calcVotingWeightWithScaleFactor(staker, 10000); + uint256 decision = approval ? uint256(DecisionTypes.Accept) : uint256(DecisionTypes.Reject); + IBallotStorage(getBallotStorageAddress()).createVote(voteIdx, ballotIdx, staker, decision, weight); + voteLength = voteIdx; + } + + function finalizeVote(uint256 ballotIdx, uint256 ballotType, bool isAccepted, bool self) private { + uint256 ballotState = uint256(BallotStates.Rejected); + if (isAccepted) { + ballotState = uint256(BallotStates.Accepted); + + if (ballotType == uint256(BallotTypes.MemberAdd)) { + if (!addMember(ballotIdx)) { + ballotState = uint256(BallotStates.Rejected); + } + } else if (ballotType == uint256(BallotTypes.MemberRemoval)) { + removeMember(ballotIdx); + } else if (ballotType == uint256(BallotTypes.MemberChange)) { + if (!changeMember(ballotIdx, self)) { + ballotState = uint256(BallotStates.Rejected); + } + } else if (ballotType == uint256(BallotTypes.GovernanceChange)) { + changeGov(ballotIdx); + } else if (ballotType == uint256(BallotTypes.EnvValChange)) { + applyEnv(ballotIdx); + } + } + finalizeBallot(ballotIdx, ballotState); + if (!self) ballotInVoting = 0; + } + + function fromValidBallot(uint256 ballotIdx, uint256 targetType) private view { + (uint256 ballotType, uint256 state, ) = getBallotState(ballotIdx); + require(ballotType == targetType, "Invalid voting type"); + require(state == uint(BallotStates.InProgress), "Invalid voting state"); + (, uint256 accept, uint256 reject) = getBallotVotingInfo(ballotIdx); + require(accept >= getThreshold() || reject >= getThreshold(), "Not yet finalized"); + } + + function addMember(uint256 ballotIdx) private returns (bool) { + fromValidBallot(ballotIdx, uint256(BallotTypes.MemberAdd)); + + ( + , + address newStaker, + address newVoter, + address newReward, + bytes memory name, + bytes memory enode, + bytes memory ip, + uint port, + uint256 lockAmount + ) = getBallotMember(ballotIdx); + if (isMember(newStaker)) { + // new staker is already a member or a voter/ + emit NotApplicable(ballotIdx, "Already a member"); + return false; + } + if (isReward(newReward)) { + // new staker is already a member or a voter/ + emit NotApplicable(ballotIdx, "Already a rewarder"); + return false; + } + + // Lock + if (lockAmount < getMinStaking() || getMaxStaking() < lockAmount) { + emit NotApplicable(ballotIdx, "Invalid lock amount"); + return false; + } + + if (availableBalanceOf(newStaker) < lockAmount) { + emit NotApplicable(ballotIdx, "Insufficient balance that can be locked"); + return false; + } + + if (newStaker != newVoter && newStaker != newReward) { + emit NotApplicable(ballotIdx, "Invalid member address"); + return false; + } + + lock(newStaker, lockAmount); + + // Add voting and reward member + uint256 nMemIdx = memberLength + 1; + voters[nMemIdx] = newVoter; + voterIdx[newVoter] = nMemIdx; + rewards[nMemIdx] = newReward; + rewardIdx[newReward] = nMemIdx; + stakers[nMemIdx] = newStaker; + stakerIdx[newStaker] = nMemIdx; + + // Add node + uint256 nNodeIdx = nodeLength + 1; + Node storage node = nodes[nNodeIdx]; + + node.name = name; + node.enode = enode; + node.ip = ip; + node.port = port; + // checkNodeInfo[getNodeInfoHash(enode, ip, port)] = true; + checkNodeName[name] = true; + checkNodeEnode[enode] = true; + checkNodeIpPort[keccak256(abi.encodePacked(ip, port))] = true; + + nodeToMember[nNodeIdx] = newStaker; + nodeIdxFromMember[newStaker] = nNodeIdx; + node.name = name; + memberLength = nMemIdx; + nodeLength = nNodeIdx; + modifiedBlock = block.number; + emit MemberAdded(newStaker, newVoter); + return true; + } + + function removeMember(uint256 ballotIdx) private { + fromValidBallot(ballotIdx, uint256(BallotTypes.MemberRemoval)); + + (address oldStaker, , , , , , , , uint256 unlockAmount) = getBallotMember(ballotIdx); + if (!isMember(oldStaker)) { + emit NotApplicable(ballotIdx, "Not already a member"); + return; // Non-member. it is abnormal case, but passed + } + + // Remove voting and reward member + uint256 removeIdx = stakerIdx[oldStaker]; + address endAddr = stakers[memberLength]; + address oldVoter = voters[removeIdx]; + address oldReward = rewards[removeIdx]; + + if (stakerIdx[oldStaker] != memberLength) { + (stakers[removeIdx], stakers[memberLength], stakerIdx[oldStaker], stakerIdx[endAddr]) = ( + stakers[memberLength], + ZERO, + 0, + stakerIdx[oldStaker] + ); + removeIdx = rewardIdx[oldStaker]; + endAddr = rewards[memberLength]; + (rewards[removeIdx], rewards[memberLength], rewardIdx[oldReward], rewardIdx[endAddr]) = ( + rewards[memberLength], + ZERO, + 0, + rewardIdx[oldReward] + ); + removeIdx = voterIdx[oldStaker]; + endAddr = voters[memberLength]; + (voters[removeIdx], voters[memberLength], voterIdx[oldVoter], voterIdx[endAddr]) = (voters[memberLength], ZERO, 0, voterIdx[oldVoter]); + } else { + stakers[memberLength] = ZERO; + stakerIdx[oldStaker] = 0; + rewards[memberLength] = ZERO; + rewardIdx[oldReward] = 0; + voters[memberLength] = ZERO; + voterIdx[oldVoter] = 0; + } + memberLength = memberLength - 1; + // Remove node + + Node storage node = nodes[removeIdx]; + checkNodeEnode[node.enode] = false; + checkNodeName[node.name] = false; + checkNodeIpPort[keccak256(abi.encodePacked(node.ip, node.port))] = false; + if (nodeIdxFromMember[oldStaker] != nodeLength) { + removeIdx = nodeIdxFromMember[oldStaker]; + endAddr = nodeToMember[nodeLength]; + + node.name = nodes[nodeLength].name; + node.enode = nodes[nodeLength].enode; + node.ip = nodes[nodeLength].ip; + node.port = nodes[nodeLength].port; + + nodeToMember[removeIdx] = endAddr; + nodeIdxFromMember[endAddr] = removeIdx; + } + nodeToMember[nodeLength] = ZERO; + nodeIdxFromMember[oldStaker] = 0; + delete nodes[nodeLength]; + nodeLength = nodeLength - 1; + modifiedBlock = block.number; + // Unlock and transfer remained to governance + transferLockedAndUnlock(oldStaker, unlockAmount); + + emit MemberRemoved(oldStaker, oldVoter); + } + + function checkChangeMember( + uint256 ballotIdx, + bool self, + address oldStaker, + address newStaker, + address newVoter, + address newReward, + bytes memory name, + bytes memory enode, + bytes memory ip, + uint256 port, + uint256 lockAmount + ) private returns (bool) { + if (!self) { + fromValidBallot(ballotIdx, uint256(BallotTypes.MemberChange)); + } + + if (!isMember(oldStaker)) { + emit NotApplicable(ballotIdx, "Old address is not a member"); + return false; // Non-member. it is abnormal case. + } + + //old staker + uint256 memberIdx = stakerIdx[oldStaker]; + if (oldStaker != newStaker) { + if (isMember(newStaker)) { + emit NotApplicable(ballotIdx, "new address is already a member"); + return false; // already member. it is abnormal case. + } + if (newStaker != newVoter && newStaker != newReward) { + emit NotApplicable(ballotIdx, "Invalid voter address"); + return false; + } + // Lock + if (lockAmount < getMinStaking() || getMaxStaking() < lockAmount) { + emit NotApplicable(ballotIdx, "Invalid lock amount"); + return false; + } + if (availableBalanceOf(newStaker) < lockAmount) { + emit NotApplicable(ballotIdx, "Insufficient balance that can be locked"); + return false; + } + } + // Change node + uint256 nodeIdx = nodeIdxFromMember[oldStaker]; + { + Node memory node = nodes[nodeIdx]; + + if ( + //if node info is not same + // node info can not duplicate + !checkNodeInfoChange(name, enode, ip, port, node) + ) { + emit NotApplicable(ballotIdx, "Duplicated node info"); + return false; + } + } + + { + address oldReward = rewards[memberIdx]; + if ((oldStaker != newReward) && (oldReward != newReward) && (isMember(newReward) || isReward(newReward))) { + emit NotApplicable(ballotIdx, "Invalid reward address"); + return false; + } + } + { + address oldVoter = voters[memberIdx]; + if ((oldStaker != newVoter) && (oldVoter != newVoter) && (isMember(newVoter) || isReward(newVoter))) { + emit NotApplicable(ballotIdx, "Invalid voters address"); + return false; + } + } + return true; + } + + // isMember=> isStaker and isVoter + // vote => onlyVoter, staker can change voter without voting, default = staker == voter + // voter can change staker with voting.(changeMember) + function changeMember(uint256 ballotIdx, bool self) private returns (bool) { + if (!self) { + fromValidBallot(ballotIdx, uint256(BallotTypes.MemberChange)); + } + + ( + address oldStaker, + address newStaker, + address newVoter, + address newReward, + bytes memory name, + bytes memory enode, + bytes memory ip, + uint port, + uint256 lockAmount + ) = getBallotMember(ballotIdx); + if (!isMember(oldStaker)) { + emit NotApplicable(ballotIdx, "Old address is not a member"); + return false; // Non-member. it is abnormal case. + } + + if (!checkChangeMember(ballotIdx, self, oldStaker, newStaker, newVoter, newReward, name, enode, ip, port, lockAmount)) return false; + + //old staker + uint256 memberIdx = stakerIdx[oldStaker]; + if (oldStaker != newStaker) { + // Change member + stakers[memberIdx] = newStaker; + stakerIdx[newStaker] = memberIdx; + stakerIdx[oldStaker] = 0; + + lock(newStaker, lockAmount); + } + // Change node + uint256 nodeIdx = nodeIdxFromMember[oldStaker]; + { + Node storage node = nodes[nodeIdx]; + + checkNodeName[node.name] = false; + checkNodeEnode[node.enode] = false; + checkNodeIpPort[keccak256(abi.encodePacked(node.ip, node.port))] = false; + + node.name = name; + node.enode = enode; + node.ip = ip; + node.port = port; + modifiedBlock = block.number; + // checkNodeInfo[getNodeInfoHash(enode, ip, port)] = true; + checkNodeName[name] = true; + checkNodeEnode[enode] = true; + checkNodeIpPort[keccak256(abi.encodePacked(ip, port))] = true; + } + + { + address oldReward = rewards[memberIdx]; + if (oldReward != newReward) { + rewards[memberIdx] = newReward; + rewardIdx[newReward] = memberIdx; + rewardIdx[oldReward] = 0; + } + } + { + address oldVoter = voters[memberIdx]; + if (oldVoter != newVoter) { + voters[memberIdx] = newVoter; + voterIdx[newVoter] = memberIdx; + voterIdx[oldVoter] = 0; + } + } + + if (oldStaker != newStaker) { + nodeToMember[nodeIdx] = newStaker; + nodeIdxFromMember[newStaker] = nodeIdx; + nodeIdxFromMember[oldStaker] = 0; + + // Unlock and transfer remained to governance + transferLockedAndUnlock(oldStaker, lockAmount); + + emit MemberChanged(oldStaker, newStaker, newVoter); + } else { + emit MemberUpdated(oldStaker, newStaker); + } + return true; + } + + function changeGov(uint256 ballotIdx) private { + fromValidBallot(ballotIdx, uint256(BallotTypes.GovernanceChange)); + + address newImp = IBallotStorage(getBallotStorageAddress()).getBallotAddress(ballotIdx); + if (newImp != ZERO) { + _authorizeUpgrade(newImp); + _upgradeToAndCallUUPS(newImp, new bytes(0), false); + modifiedBlock = block.number; + } + } + + function applyEnv(uint256 ballotIdx) private { + fromValidBallot(ballotIdx, uint256(BallotTypes.EnvValChange)); + + (bytes32 envKey, uint256 envType, bytes memory envVal) = IBallotStorage(getBallotStorageAddress()).getBallotVariable(ballotIdx); + + IEnvStorage envStorage = IEnvStorage(getEnvStorageAddress()); + envStorage.setVariable(envKey, envVal); + modifiedBlock = block.number; + + emit EnvChanged(envKey, envType, envVal); + } + + //------------------ Code reduction for creation gas + function createBallotForMember(uint256 id, uint256 bType, address creator, address oAddr, MemberInfo memory info) private { + IBallotStorage(getBallotStorageAddress()).createBallotForMember( + id, // ballot id + bType, // ballot type + info.duration, + creator, // creator + oAddr, // old member address + info.staker, // new member address + info.voter, // old staker address + info.reward, // new staker address + info.name, // new name + info.enode, // new enode + info.ip, // new ip + info.port // new port + ); + } + + function updateBallotLock(uint256 id, uint256 amount) private { + IBallotStorage(getBallotStorageAddress()).updateBallotMemberLockAmount(id, amount); + } + + function updateBallotMemo(uint256 id, bytes memory memo) private { + IBallotStorage(getBallotStorageAddress()).updateBallotMemo(id, memo); + } + + function startBallot(uint256 id, uint256 s, uint256 e) private { + IBallotStorage(getBallotStorageAddress()).startBallot(id, s, e); + } + + function finalizeBallot(uint256 id, uint256 state) private { + IBallotStorage(getBallotStorageAddress()).finalizeBallot(id, state); + } + + function getBallotState(uint256 id) private view returns (uint256, uint256, bool) { + return IBallotStorage(getBallotStorageAddress()).getBallotState(id); + } + + function getBallotPeriod(uint256 id) private view returns (uint256, uint256, uint256) { + return IBallotStorage(getBallotStorageAddress()).getBallotPeriod(id); + } + + function getBallotVotingInfo(uint256 id) private view returns (uint256, uint256, uint256) { + return IBallotStorage(getBallotStorageAddress()).getBallotVotingInfo(id); + } + + function getBallotMember( + uint256 id + ) private view returns (address, address, address, address, bytes memory, bytes memory, bytes memory, uint256, uint256) { + return IBallotStorage(getBallotStorageAddress()).getBallotMember(id); + } + + function lock(address addr, uint256 amount) private { + IStaking(getStakingAddress()).lock(addr, amount); + } + + function unlock(address addr, uint256 amount) private { + IStaking(getStakingAddress()).unlock(addr, amount); + } + + function transferLockedAndUnlock(address addr, uint256 unlockAmount) private { + IStaking staking = IStaking(getStakingAddress()); + uint256 locked = staking.lockedBalanceOf(addr); + if (locked > unlockAmount) { + staking.transferLocked(addr, locked - unlockAmount); + unlock(addr, unlockAmount); + } else { + unlock(addr, locked); + } + } + + function lockedBalanceOf(address addr) private view returns (uint256) { + // IStaking staking = IStaking(getStakingAddress()).lockedBalanceOf(addr); + return IStaking(getStakingAddress()).lockedBalanceOf(addr); + } + + function availableBalanceOf(address addr) private view returns (uint256) { + return IStaking(getStakingAddress()).availableBalanceOf(addr); + } + + //------------------ Code reduction end + + //====NXTMeta=====/ + + function _authorizeUpgrade(address newImplementation) internal override onlyGovMem {} + + function checkVariableCondition(bytes32 envKey, bytes memory envVal) internal view returns (bool) { + return IEnvStorage(getEnvStorageAddress()).checkVariableCondition(envKey, envVal); + } + + function getStakerAddr(address _addr) public view returns (address staker) { + if (isStaker(_addr)) staker = _addr; + else if (isVoter(_addr)) staker = stakers[voterIdx[_addr]]; + } + + function setProposalTimePeriod(uint256 newPeriod) external onlyOwner { + require(newPeriod < 1 hours, "newPeriod is too long"); + proposal_time_period = newPeriod; + emit SetProposalTimePeriod(newPeriod); + } + + function checkNodeInfoAdd(bytes memory name, bytes memory enode, bytes memory ip, uint port) internal view returns (bool check) { + //Enode can not be duplicated + //IP:port can not be duplicated + //Name can not be duplicated + check = true; + if (checkNodeEnode[enode]) check = false; + if (checkNodeName[name]) check = false; + + bytes32 hvalue = keccak256(abi.encodePacked(ip, port)); + if (checkNodeIpPort[hvalue]) check = false; + } + + function checkNodeInfoChange( + bytes memory name, + bytes memory enode, + bytes memory ip, + uint port, + Node memory nodeInfo + ) internal view returns (bool check) { + //Enode can not be duplicated + //IP:port can not be duplicated + //Name can not be duplicated + check = true; + if ((keccak256(nodeInfo.enode) != keccak256(enode) && checkNodeEnode[enode])) check = false; + if ((keccak256(nodeInfo.name) != keccak256(name) && checkNodeName[name])) check = false; + + bytes32 hvalue = keccak256(abi.encodePacked(ip, port)); + if ((keccak256(abi.encodePacked(nodeInfo.ip, nodeInfo.port)) != hvalue && checkNodeIpPort[hvalue])) check = false; + } + + uint256 public proposal_time_period; + mapping(address => uint256) public lastAddProposalTime; + + //For a node duplicate check + // testnet value is here + // mapping(bytes32=>bool) internal checkNodeInfo; + mapping(bytes => bool) internal checkNodeName; + mapping(bytes => bool) internal checkNodeEnode; + mapping(bytes32 => bool) internal checkNodeIpPort; + + /** + * @dev This empty reserved space is put in place to allow future versions to add new + * variables without shifting down storage in the inheritance chain. + * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps + */ + uint256[46] private __gap; + + function reInit() external reinitializer(2) onlyOwner { + unchecked { + for (uint256 i = 0; i < getMemberLength(); i++) { + Node memory node = nodes[i]; + checkNodeName[node.name] = true; + checkNodeEnode[node.enode] = true; + checkNodeIpPort[keccak256(abi.encodePacked(node.ip, node.port))] = true; + } + } + } + + function reInitV3(uint256[] memory indices, address[] memory newRewards) external reinitializer(3) onlyOwner { + unchecked { + for (uint256 i = 0; i < indices.length; i++) { + address oldReward = rewards[i]; + address newReward = newRewards[i - 1]; + rewards[i] = newReward; + rewardIdx[newReward] = i; + rewardIdx[oldReward] = 0; + } + } + //for the testnet + checkNodeName[nodes[40].name] = true; + checkNodeEnode[nodes[40].enode] = true; + checkNodeIpPort[keccak256(abi.encodePacked(nodes[40].ip, nodes[40].port))] = true; + } + + function maigration(address newGov) external onlyOwner { + IGov(newGov).initMigration(address(reg), modifiedBlock, owner()); + unchecked { + for (uint256 i = 1; i < getMemberLength() + 1; i++) { + IGov(newGov).setMembersForMigration( + i, + stakers[i], + voters[i], + rewards[i], + lastAddProposalTime[stakers[i]], + nodes[i].name, + nodes[i].enode, + nodes[i].ip, + nodes[i].port + ); + } + } + IGov(newGov).setBallotForMigration(ballotLength, voteLength, ballotInVoting); + IGov(newGov).setProposalTimePeriodForMigration(proposal_time_period); + } } diff --git a/wemix/governance-contract/contracts/abstract/AEnvStorage.sol b/wemix/governance-contract/contracts/abstract/AEnvStorage.sol index 2d238c6884e2..7b1fd0286ec4 100644 --- a/wemix/governance-contract/contracts/abstract/AEnvStorage.sol +++ b/wemix/governance-contract/contracts/abstract/AEnvStorage.sol @@ -5,130 +5,130 @@ import "../GovChecker.sol"; import "../storage/EternalStorage.sol"; abstract contract AEnvStorage is EternalStorage, GovChecker { - event StringVarableChanged(bytes32 indexed _name, string _value); - - event UintVarableChanged(bytes32 indexed _name, uint _value); - - event IntVarableChanged(bytes32 indexed _name, int _value); - - event AddressVarableChanged(bytes32 indexed _name, address _value); - - event Bytes32VarableChanged(bytes32 indexed _name, bytes32 _value); - - event BytesVarableChanged(bytes32 indexed _name, bytes _value); - - event VarableChanged(bytes32 indexed _name, uint256 indexed _type, string _value); - - /** - * @dev Allows the owner to set a value for a int variable - * @param h The keccak256 hash of the variable name - * @param v The value to be stored - */ - function setInt(bytes32 h, int256 v) internal { - _setInt(h, v); - emit IntVarableChanged(h, v); - } - - /** - * @dev Allows the owner to set a value for a boolean variable - * @param h The keccak256 hash of the variable name - * @param v The value to be stored - */ - function setUint(bytes32 h, uint256 v) internal { - _setUint(h, v); - emit UintVarableChanged(h, v); - } - - /** - * @dev Allows the owner to set a value for a address variable - * @param h The keccak256 hash of the variable name - * @param v The value to be stored - */ - function setAddress(bytes32 h, address v) internal { - _setAddress(h, v); - emit AddressVarableChanged(h, v); - } - - /** - * @dev Allows the owner to set a value for a string variable - * @param h The keccak256 hash of the variable name - * @param v The value to be stored - */ - function setString(bytes32 h, string memory v) internal { - _setString(h, v); - emit StringVarableChanged(h, v); - } - - /** - * @dev Allows the owner to set a value for a bytes variable - * @param h The keccak256 hash of the variable name - * @param v The value to be stored - */ - function setBytes(bytes32 h, bytes memory v) internal { - _setBytes(h, v); - emit BytesVarableChanged(h, v); - } - - /** - * @dev Allows the owner to set a value for a bytes32 variable - * @param h The keccak256 hash of the variable name - * @param v The value to be stored - */ - function setBytes32(bytes32 h, bytes32 v) internal { - _setBytes32(h, v); - emit Bytes32VarableChanged(h, v); - } - - // mapping(bytes32 => Variable) internal s; - - // /** - // * @dev Add a new variable . - // * @param _h The keccak256 hash of the variable name - // * @param _t The type of value - // * @param _v The value to be stored - // */ - // function _add(bytes32 _h, uint256 _t, string _v) internal { - // require(s[_h]._name == "","not found"); - // s[_h] = Variable(_h,_t,_v); - // emit VarableAdded(_h,_t,_v); - // } - // /** - // * @dev Update a new variable . - // * @param _h The keccak256 hash of the variable name - // * @param _t The type of value - // * @param _v The value to be stored - // */ - // function _change(bytes32 _h, uint256 _t, string _v) internal { - // require(s[_h]._name == _h,"not found"); - // Variable storage v = s[_h]; - // v._name = _h; - // v._type = _t; - // v._value = _v; - // emit VarableChanged(_h,_t,_v); - - // } - // /** - // * @dev Get the type & value stored of a string variable by the hash name - // * @param _h The keccak256 hash of the variable name - // */ - // function get(bytes32 _h) public view returns (uint256 varType, string varVal){ - // //require(s[_h]._name == _h,"not found"); - // return (s[_h]._type, s[_h]._value); - // } - // /** - // * @dev Get the type stored of a string variable by the hash name - // * @param _h The keccak256 hash of the variable name - // */ - // function getType(bytes32 _h) public view returns (uint256){ - // require(s[_h]._name == _h,"not found"); - // return s[_h]._type; - // } - // /** - // * @dev Get the value stored of a string variable by the hash name - // * @param _h The keccak256 hash of the variable name - // */ - // function getValue(bytes32 _h) public view returns (string){ - // require(s[_h]._name == _h,"not found"); - // return s[_h]._value; - // } + event StringVarableChanged(bytes32 indexed _name, string _value); + + event UintVarableChanged(bytes32 indexed _name, uint _value); + + event IntVarableChanged(bytes32 indexed _name, int _value); + + event AddressVarableChanged(bytes32 indexed _name, address _value); + + event Bytes32VarableChanged(bytes32 indexed _name, bytes32 _value); + + event BytesVarableChanged(bytes32 indexed _name, bytes _value); + + event VarableChanged(bytes32 indexed _name, uint256 indexed _type, string _value); + + /** + * @dev Allows the owner to set a value for a int variable + * @param h The keccak256 hash of the variable name + * @param v The value to be stored + */ + function setInt(bytes32 h, int256 v) internal { + _setInt(h, v); + emit IntVarableChanged(h, v); + } + + /** + * @dev Allows the owner to set a value for a boolean variable + * @param h The keccak256 hash of the variable name + * @param v The value to be stored + */ + function setUint(bytes32 h, uint256 v) internal { + _setUint(h, v); + emit UintVarableChanged(h, v); + } + + /** + * @dev Allows the owner to set a value for a address variable + * @param h The keccak256 hash of the variable name + * @param v The value to be stored + */ + function setAddress(bytes32 h, address v) internal { + _setAddress(h, v); + emit AddressVarableChanged(h, v); + } + + /** + * @dev Allows the owner to set a value for a string variable + * @param h The keccak256 hash of the variable name + * @param v The value to be stored + */ + function setString(bytes32 h, string memory v) internal { + _setString(h, v); + emit StringVarableChanged(h, v); + } + + /** + * @dev Allows the owner to set a value for a bytes variable + * @param h The keccak256 hash of the variable name + * @param v The value to be stored + */ + function setBytes(bytes32 h, bytes memory v) internal { + _setBytes(h, v); + emit BytesVarableChanged(h, v); + } + + /** + * @dev Allows the owner to set a value for a bytes32 variable + * @param h The keccak256 hash of the variable name + * @param v The value to be stored + */ + function setBytes32(bytes32 h, bytes32 v) internal { + _setBytes32(h, v); + emit Bytes32VarableChanged(h, v); + } + + // mapping(bytes32 => Variable) internal s; + + // /** + // * @dev Add a new variable . + // * @param _h The keccak256 hash of the variable name + // * @param _t The type of value + // * @param _v The value to be stored + // */ + // function _add(bytes32 _h, uint256 _t, string _v) internal { + // require(s[_h]._name == "","not found"); + // s[_h] = Variable(_h,_t,_v); + // emit VarableAdded(_h,_t,_v); + // } + // /** + // * @dev Update a new variable . + // * @param _h The keccak256 hash of the variable name + // * @param _t The type of value + // * @param _v The value to be stored + // */ + // function _change(bytes32 _h, uint256 _t, string _v) internal { + // require(s[_h]._name == _h,"not found"); + // Variable storage v = s[_h]; + // v._name = _h; + // v._type = _t; + // v._value = _v; + // emit VarableChanged(_h,_t,_v); + + // } + // /** + // * @dev Get the type & value stored of a string variable by the hash name + // * @param _h The keccak256 hash of the variable name + // */ + // function get(bytes32 _h) public view returns (uint256 varType, string varVal){ + // //require(s[_h]._name == _h,"not found"); + // return (s[_h]._type, s[_h]._value); + // } + // /** + // * @dev Get the type stored of a string variable by the hash name + // * @param _h The keccak256 hash of the variable name + // */ + // function getType(bytes32 _h) public view returns (uint256){ + // require(s[_h]._name == _h,"not found"); + // return s[_h]._type; + // } + // /** + // * @dev Get the value stored of a string variable by the hash name + // * @param _h The keccak256 hash of the variable name + // */ + // function getValue(bytes32 _h) public view returns (string){ + // require(s[_h]._name == _h,"not found"); + // return s[_h]._value; + // } } diff --git a/wemix/governance-contract/contracts/abstract/AGov.sol b/wemix/governance-contract/contracts/abstract/AGov.sol index 765e5f1c480b..53d33e142cea 100644 --- a/wemix/governance-contract/contracts/abstract/AGov.sol +++ b/wemix/governance-contract/contracts/abstract/AGov.sol @@ -6,86 +6,86 @@ import "../interface/IGov.sol"; import "../GovChecker.sol"; abstract contract AGov is GovChecker, IGov { - uint public modifiedBlock; + uint public modifiedBlock; - // For voting member - mapping(uint256 => address) internal voters; - mapping(address => uint256) public voterIdx; - uint256 internal memberLength; + // For voting member + mapping(uint256 => address) internal voters; + mapping(address => uint256) public voterIdx; + uint256 internal memberLength; - // For reward member - mapping(uint256 => address) internal rewards; - mapping(address => uint256) public rewardIdx; + // For reward member + mapping(uint256 => address) internal rewards; + mapping(address => uint256) public rewardIdx; - //For staking member - mapping(uint256 => address) internal stakers; - mapping(address => uint256) public stakerIdx; + //For staking member + mapping(uint256 => address) internal stakers; + mapping(address => uint256) public stakerIdx; - //For a node duplicate check - // mainnet value is here - // mapping(bytes32=>bool) internal checkNodeInfo; - mapping(bytes => bool) internal checkNodeName; - mapping(bytes => bool) internal checkNodeEnode; - mapping(bytes32 => bool) internal checkNodeIpPort; + //For a node duplicate check + // mainnet value is here + // mapping(bytes32=>bool) internal checkNodeInfo; + mapping(bytes => bool) internal checkNodeName; + mapping(bytes => bool) internal checkNodeEnode; + mapping(bytes32 => bool) internal checkNodeIpPort; - // For enode - struct Node { - bytes name; - bytes enode; - bytes ip; - uint port; - } + // For enode + struct Node { + bytes name; + bytes enode; + bytes ip; + uint port; + } - mapping(uint256 => Node) internal nodes; - mapping(address => uint256) internal nodeIdxFromMember; - mapping(uint256 => address) internal nodeToMember; - uint256 internal nodeLength; + mapping(uint256 => Node) internal nodes; + mapping(address => uint256) internal nodeIdxFromMember; + mapping(uint256 => address) internal nodeToMember; + uint256 internal nodeLength; - // For ballot - uint256 public ballotLength; - uint256 public voteLength; - uint256 internal ballotInVoting; + // For ballot + uint256 public ballotLength; + uint256 public voteLength; + uint256 internal ballotInVoting; - function isReward(address addr) public view override returns (bool) { - return (rewardIdx[addr] != 0); - } - function isVoter(address addr) public view override returns (bool) { - return (voterIdx[addr] != 0); - } - function isStaker(address addr) public view override returns (bool) { - return (stakerIdx[addr] != 0); - } - function isMember(address addr) public view override returns (bool) { - return (isStaker(addr) || isVoter(addr)); - } - function getMember(uint256 idx) public view override returns (address) { - return stakers[idx]; - } - function getMemberLength() public view override returns (uint256) { - return memberLength; - } - function getReward(uint256 idx) public view override returns (address) { - return rewards[idx]; - } - function getNodeIdxFromMember(address addr) public view override returns (uint256) { - return nodeIdxFromMember[addr]; - } - function getMemberFromNodeIdx(uint256 idx) public view override returns (address) { - return nodeToMember[idx]; - } - function getNodeLength() public view override returns (uint256) { - return nodeLength; - } - //====NxtMeta=====/ - function getVoter(uint256 idx) public view override returns (address) { - return voters[idx]; - } + function isReward(address addr) public view override returns (bool) { + return (rewardIdx[addr] != 0); + } + function isVoter(address addr) public view override returns (bool) { + return (voterIdx[addr] != 0); + } + function isStaker(address addr) public view override returns (bool) { + return (stakerIdx[addr] != 0); + } + function isMember(address addr) public view override returns (bool) { + return (isStaker(addr) || isVoter(addr)); + } + function getMember(uint256 idx) public view override returns (address) { + return stakers[idx]; + } + function getMemberLength() public view override returns (uint256) { + return memberLength; + } + function getReward(uint256 idx) public view override returns (address) { + return rewards[idx]; + } + function getNodeIdxFromMember(address addr) public view override returns (uint256) { + return nodeIdxFromMember[addr]; + } + function getMemberFromNodeIdx(uint256 idx) public view override returns (address) { + return nodeToMember[idx]; + } + function getNodeLength() public view override returns (uint256) { + return nodeLength; + } + //====NxtMeta=====/ + function getVoter(uint256 idx) public view override returns (address) { + return voters[idx]; + } - function getNode(uint256 idx) public view override returns (bytes memory name, bytes memory enode, bytes memory ip, uint port) { - return (nodes[idx].name, nodes[idx].enode, nodes[idx].ip, nodes[idx].port); - } + function getNode(uint256 idx) public view override returns (bytes memory name, bytes memory enode, bytes memory ip, uint port) { + return (nodes[idx].name, nodes[idx].enode, nodes[idx].ip, nodes[idx].port); + } - function getBallotInVoting() public view override returns (uint256) { - return ballotInVoting; - } + function getBallotInVoting() public view override returns (uint256) { + return ballotInVoting; + } } diff --git a/wemix/governance-contract/contracts/abstract/BallotEnums.sol b/wemix/governance-contract/contracts/abstract/BallotEnums.sol index 6cabd9c33957..352db39eded3 100644 --- a/wemix/governance-contract/contracts/abstract/BallotEnums.sol +++ b/wemix/governance-contract/contracts/abstract/BallotEnums.sol @@ -2,27 +2,28 @@ pragma solidity ^0.8.0; contract BallotEnums { - enum BallotStates { - Invalid, - Ready, - InProgress, - Accepted, - Rejected, - Canceled - } + enum BallotStates { + Invalid, + Ready, + InProgress, + Accepted, + Rejected, + Canceled + } - enum DecisionTypes { - Invalid, - Accept, - Reject - } + enum DecisionTypes { + Invalid, + Accept, + Reject + } - enum BallotTypes { - Invalid, - MemberAdd, // new Member Address, new Node id, new Node ip, new Node port - MemberRemoval, // old Member Address - MemberChange, // Old Member Address, New Member Address, new Node id, New Node ip, new Node port - GovernanceChange, // new Governace Impl Address - EnvValChange // Env variable name, type , value - } + enum BallotTypes { + Invalid, + MemberAdd, // new Member Address, new Node id, new Node ip, new Node port + MemberRemoval, // old Member Address + MemberChange, // Old Member Address, New Member Address, new Node id, New Node ip, new Node port + GovernanceChange, // new Governace Impl Address + EnvValChange, // Env variable name, type , value + Execute // Genernal Purpose + } } diff --git a/wemix/governance-contract/contracts/abstract/EnvConstants.sol b/wemix/governance-contract/contracts/abstract/EnvConstants.sol index db5026caa1cb..d779d971310a 100644 --- a/wemix/governance-contract/contracts/abstract/EnvConstants.sol +++ b/wemix/governance-contract/contracts/abstract/EnvConstants.sol @@ -4,51 +4,36 @@ pragma solidity ^0.8.0; contract EnvConstants { bytes32 public constant BLOCKS_PER_NAME = keccak256("blocksPer"); - bytes32 public constant BALLOT_DURATION_MIN_NAME = - keccak256("ballotDurationMin"); + bytes32 public constant BALLOT_DURATION_MIN_NAME = keccak256("ballotDurationMin"); - bytes32 public constant BALLOT_DURATION_MAX_NAME = - keccak256("ballotDurationMax"); + bytes32 public constant BALLOT_DURATION_MAX_NAME = keccak256("ballotDurationMax"); bytes32 public constant STAKING_MIN_NAME = keccak256("stakingMin"); bytes32 public constant STAKING_MAX_NAME = keccak256("stakingMax"); - bytes32 public constant MAX_IDLE_BLOCK_INTERVAL_NAME = - keccak256("MaxIdleBlockInterval"); + bytes32 public constant MAX_IDLE_BLOCK_INTERVAL_NAME = keccak256("MaxIdleBlockInterval"); //=======NXTMeta========/ - bytes32 public constant BALLOT_DURATION_MIN_MAX_NAME = - keccak256("ballotDurationMinMax"); + bytes32 public constant BALLOT_DURATION_MIN_MAX_NAME = keccak256("ballotDurationMinMax"); bytes32 public constant STAKING_MIN_MAX_NAME = keccak256("stakingMinMax"); - bytes32 public constant BLOCK_CREATION_TIME_NAME = - keccak256("blockCreationTime"); - bytes32 public constant BLOCK_REWARD_AMOUNT_NAME = - keccak256("blockRewardAmount"); + bytes32 public constant BLOCK_CREATION_TIME_NAME = keccak256("blockCreationTime"); + bytes32 public constant BLOCK_REWARD_AMOUNT_NAME = keccak256("blockRewardAmount"); // unit = gwei - bytes32 public constant MAX_PRIORITY_FEE_PER_GAS_NAME = - keccak256("maxPriorityFeePerGas"); - - bytes32 public constant BLOCK_REWARD_DISTRIBUTION_METHOD_NAME = - keccak256("blockRewardDistribution"); - bytes32 public constant BLOCK_REWARD_DISTRIBUTION_BLOCK_PRODUCER_NAME = - keccak256("blockRewardDistributionBlockProducer"); - bytes32 public constant BLOCK_REWARD_DISTRIBUTION_STAKING_REWARD_NAME = - keccak256("blockRewardDistributionStakingReward"); - bytes32 public constant BLOCK_REWARD_DISTRIBUTION_ECOSYSTEM_NAME = - keccak256("blockRewardDistributionEcosystem"); - bytes32 public constant BLOCK_REWARD_DISTRIBUTION_MAINTENANCE_NAME = - keccak256("blockRewardDistributionMaintenance"); - - bytes32 public constant GASLIMIT_AND_BASE_FEE_NAME = - keccak256("gasLimitAndBaseFee"); + bytes32 public constant MAX_PRIORITY_FEE_PER_GAS_NAME = keccak256("maxPriorityFeePerGas"); + + bytes32 public constant BLOCK_REWARD_DISTRIBUTION_METHOD_NAME = keccak256("blockRewardDistribution"); + bytes32 public constant BLOCK_REWARD_DISTRIBUTION_BLOCK_PRODUCER_NAME = keccak256("blockRewardDistributionBlockProducer"); + bytes32 public constant BLOCK_REWARD_DISTRIBUTION_STAKING_REWARD_NAME = keccak256("blockRewardDistributionStakingReward"); + bytes32 public constant BLOCK_REWARD_DISTRIBUTION_ECOSYSTEM_NAME = keccak256("blockRewardDistributionEcosystem"); + bytes32 public constant BLOCK_REWARD_DISTRIBUTION_MAINTENANCE_NAME = keccak256("blockRewardDistributionMaintenance"); + + bytes32 public constant GASLIMIT_AND_BASE_FEE_NAME = keccak256("gasLimitAndBaseFee"); bytes32 public constant BLOCK_GASLIMIT_NAME = keccak256("blockGasLimit"); - bytes32 public constant BASE_FEE_MAX_CHANGE_RATE_NAME = - keccak256("baseFeeMaxChangeRate"); - bytes32 public constant GAS_TARGET_PERCENTAGE_NAME = - keccak256("gasTargetPercentage"); + bytes32 public constant BASE_FEE_MAX_CHANGE_RATE_NAME = keccak256("baseFeeMaxChangeRate"); + bytes32 public constant GAS_TARGET_PERCENTAGE_NAME = keccak256("gasTargetPercentage"); bytes32 public constant MAX_BASE_FEE_NAME = keccak256("maxBaseFee"); diff --git a/wemix/governance-contract/contracts/abstract/TestnetAGov.sol b/wemix/governance-contract/contracts/abstract/TestnetAGov.sol index 22344f55ce5f..8df45ee91cc3 100644 --- a/wemix/governance-contract/contracts/abstract/TestnetAGov.sol +++ b/wemix/governance-contract/contracts/abstract/TestnetAGov.sol @@ -6,86 +6,86 @@ import "../interface/ITestnetGov.sol"; import "../GovChecker.sol"; abstract contract TestnetAGov is GovChecker, ITestnetGov { - uint public modifiedBlock; + uint public modifiedBlock; - // For voting member - mapping(uint256 => address) internal voters; - mapping(address => uint256) public voterIdx; - uint256 internal memberLength; + // For voting member + mapping(uint256 => address) internal voters; + mapping(address => uint256) public voterIdx; + uint256 internal memberLength; - // For reward member - mapping(uint256 => address) internal rewards; - mapping(address => uint256) public rewardIdx; + // For reward member + mapping(uint256 => address) internal rewards; + mapping(address => uint256) public rewardIdx; - //For staking member - mapping(uint256 => address) internal stakers; - mapping(address => uint256) public stakerIdx; + //For staking member + mapping(uint256 => address) internal stakers; + mapping(address => uint256) public stakerIdx; - //For a node duplicate check - // mainnet value is here - // mapping(bytes32=>bool) internal checkNodeInfo; - // mapping(bytes=>bool) internal checkNodeName; - // mapping(bytes=>bool) internal checkNodeEnode; - // mapping(bytes32=>bool) internal checkNodeIpPort; + //For a node duplicate check + // mainnet value is here + // mapping(bytes32=>bool) internal checkNodeInfo; + // mapping(bytes=>bool) internal checkNodeName; + // mapping(bytes=>bool) internal checkNodeEnode; + // mapping(bytes32=>bool) internal checkNodeIpPort; - // For enode - struct Node { - bytes name; - bytes enode; - bytes ip; - uint port; - } + // For enode + struct Node { + bytes name; + bytes enode; + bytes ip; + uint port; + } - mapping(uint256 => Node) internal nodes; - mapping(address => uint256) internal nodeIdxFromMember; - mapping(uint256 => address) internal nodeToMember; - uint256 internal nodeLength; + mapping(uint256 => Node) internal nodes; + mapping(address => uint256) internal nodeIdxFromMember; + mapping(uint256 => address) internal nodeToMember; + uint256 internal nodeLength; - // For ballot - uint256 public ballotLength; - uint256 public voteLength; - uint256 internal ballotInVoting; + // For ballot + uint256 public ballotLength; + uint256 public voteLength; + uint256 internal ballotInVoting; - function isReward(address addr) public view override returns (bool) { - return (rewardIdx[addr] != 0); - } - function isVoter(address addr) public view override returns (bool) { - return (voterIdx[addr] != 0); - } - function isStaker(address addr) public view override returns (bool) { - return (stakerIdx[addr] != 0); - } - function isMember(address addr) public view override returns (bool) { - return (isStaker(addr) || isVoter(addr)); - } - function getMember(uint256 idx) public view override returns (address) { - return stakers[idx]; - } - function getMemberLength() public view override returns (uint256) { - return memberLength; - } - function getReward(uint256 idx) public view override returns (address) { - return rewards[idx]; - } - function getNodeIdxFromMember(address addr) public view override returns (uint256) { - return nodeIdxFromMember[addr]; - } - function getMemberFromNodeIdx(uint256 idx) public view override returns (address) { - return nodeToMember[idx]; - } - function getNodeLength() public view override returns (uint256) { - return nodeLength; - } - //====NxtMeta=====/ - function getVoter(uint256 idx) public view override returns (address) { - return voters[idx]; - } + function isReward(address addr) public view override returns (bool) { + return (rewardIdx[addr] != 0); + } + function isVoter(address addr) public view override returns (bool) { + return (voterIdx[addr] != 0); + } + function isStaker(address addr) public view override returns (bool) { + return (stakerIdx[addr] != 0); + } + function isMember(address addr) public view override returns (bool) { + return (isStaker(addr) || isVoter(addr)); + } + function getMember(uint256 idx) public view override returns (address) { + return stakers[idx]; + } + function getMemberLength() public view override returns (uint256) { + return memberLength; + } + function getReward(uint256 idx) public view override returns (address) { + return rewards[idx]; + } + function getNodeIdxFromMember(address addr) public view override returns (uint256) { + return nodeIdxFromMember[addr]; + } + function getMemberFromNodeIdx(uint256 idx) public view override returns (address) { + return nodeToMember[idx]; + } + function getNodeLength() public view override returns (uint256) { + return nodeLength; + } + //====NxtMeta=====/ + function getVoter(uint256 idx) public view override returns (address) { + return voters[idx]; + } - function getNode(uint256 idx) public view override returns (bytes memory name, bytes memory enode, bytes memory ip, uint port) { - return (nodes[idx].name, nodes[idx].enode, nodes[idx].ip, nodes[idx].port); - } + function getNode(uint256 idx) public view override returns (bytes memory name, bytes memory enode, bytes memory ip, uint port) { + return (nodes[idx].name, nodes[idx].enode, nodes[idx].ip, nodes[idx].port); + } - function getBallotInVoting() public view override returns (uint256) { - return ballotInVoting; - } + function getBallotInVoting() public view override returns (uint256) { + return ballotInVoting; + } } diff --git a/wemix/governance-contract/contracts/interface/IBallotStorage.sol b/wemix/governance-contract/contracts/interface/IBallotStorage.sol index 3636f6b1c9cb..191f06a13ebf 100644 --- a/wemix/governance-contract/contracts/interface/IBallotStorage.sol +++ b/wemix/governance-contract/contracts/interface/IBallotStorage.sol @@ -2,43 +2,47 @@ pragma solidity ^0.8.0; interface IBallotStorage { - function createBallotForMember( - uint256, - uint256, - uint256, - address, - address, - address, - address, - address, - bytes memory, - bytes memory, - bytes memory, - uint - ) external; + function createBallotForMember( + uint256, + uint256, + uint256, + address, + address, + address, + address, + address, + bytes memory, + bytes memory, + bytes memory, + uint + ) external; - function createBallotForAddress(uint256, uint256, uint256, address, address) external returns (uint256); - function createBallotForVariable(uint256, uint256, uint256, address, bytes32, uint256, bytes memory) external returns (uint256); - function createBallotForExit(uint256, uint256, uint256) external; - function createVote(uint256, uint256, address, uint256, uint256) external; - function finalizeBallot(uint256, uint256) external; - function startBallot(uint256, uint256, uint256) external; - function updateBallotMemo(uint256, bytes memory) external; - function updateBallotDuration(uint256, uint256) external; - function updateBallotMemberLockAmount(uint256, uint256) external; + function createBallotForAddress(uint256, uint256, uint256, address, address) external returns (uint256); + function createBallotForVariable(uint256, uint256, uint256, address, bytes32, uint256, bytes memory) external returns (uint256); + function createBallotForExit(uint256, uint256, uint256) external; + function createVote(uint256, uint256, address, uint256, uint256) external; + function finalizeBallot(uint256, uint256) external; + function startBallot(uint256, uint256, uint256) external; + function updateBallotMemo(uint256, bytes memory) external; + function updateBallotDuration(uint256, uint256) external; + function updateBallotMemberLockAmount(uint256, uint256) external; - function getBallotPeriod(uint256) external view returns (uint256, uint256, uint256); - function getBallotVotingInfo(uint256) external view returns (uint256, uint256, uint256); - function getBallotState(uint256) external view returns (uint256, uint256, bool); + function getBallotPeriod(uint256) external view returns (uint256, uint256, uint256); + function getBallotVotingInfo(uint256) external view returns (uint256, uint256, uint256); + function getBallotState(uint256) external view returns (uint256, uint256, bool); - function getBallotBasic( - uint256 - ) external view returns (uint256, uint256, uint256, address, bytes memory, uint256, uint256, uint256, uint256, bool, uint256); + function getBallotBasic( + uint256 + ) external view returns (uint256, uint256, uint256, address, bytes memory, uint256, uint256, uint256, uint256, bool, uint256); - function getBallotMember( - uint256 - ) external view returns (address, address, address, address, bytes memory, bytes memory, bytes memory, uint256, uint256); - function getBallotAddress(uint256) external view returns (address); - function getBallotVariable(uint256) external view returns (bytes32, uint256, bytes memory); - function getBallotForExit(uint256) external view returns (uint256, uint256); + function getBallotMember( + uint256 + ) external view returns (address, address, address, address, bytes memory, bytes memory, bytes memory, uint256, uint256); + function getBallotAddress(uint256) external view returns (address); + function getBallotVariable(uint256) external view returns (bytes32, uint256, bytes memory); + function getBallotForExit(uint256) external view returns (uint256, uint256); + + // Genernal Purpose + function createBallotForExecute(uint256, uint256, uint256, address, address, uint256, bytes memory) external; + function getBallotExecute(uint256) external view returns (address, uint256, bytes memory); } diff --git a/wemix/governance-contract/contracts/interface/IEnvStorage.sol b/wemix/governance-contract/contracts/interface/IEnvStorage.sol index b7e5aa8fb8a1..b2ed4ce1ec92 100644 --- a/wemix/governance-contract/contracts/interface/IEnvStorage.sol +++ b/wemix/governance-contract/contracts/interface/IEnvStorage.sol @@ -2,35 +2,35 @@ pragma solidity ^0.8.0; interface IEnvStorage { - function setBlocksPerByBytes(bytes memory) external; - function setBallotDurationMinByBytes(bytes memory) external; - function setBallotDurationMaxByBytes(bytes memory) external; - function setStakingMinByBytes(bytes memory) external; - function setStakingMaxByBytes(bytes memory) external; - function setMaxIdleBlockIntervalByBytes(bytes memory) external; - function setBlockCreationTimeByBytes(bytes memory _value) external; - function setBlockRewardAmountByBytes(bytes memory _value) external; - function setMaxPriorityFeePerGasByBytes(bytes memory _value) external; - function setBallotDurationMinMax(uint256 _min, uint256 _max) external; - function setBlockRewardDistributionMethodByBytes(bytes memory _value) external; - function setGasLimitAndBaseFeeByBytes(bytes memory _value) external; - function setMaxBaseFeeByBytes(bytes memory _value) external; - function setBallotDurationMinMaxByBytes(bytes memory _value) external; - function setStakingMinMaxByBytes(bytes memory _value) external; - function getBlockCreationTime() external view returns (uint256); - function getBlockRewardAmount() external view returns (uint256); - function getMaxPriorityFeePerGas() external view returns (uint256); - function getStakingMinMax() external view returns (uint256, uint256); - function getBlockRewardDistributionMethod() external view returns (uint256, uint256, uint256, uint256); - function getGasLimitAndBaseFee() external view returns (uint256, uint256, uint256); - function getMaxBaseFee() external view returns (uint256); - function getBlocksPer() external view returns (uint256); - function getStakingMin() external view returns (uint256); - function getStakingMax() external view returns (uint256); - function getBallotDurationMin() external view returns (uint256); - function getBallotDurationMax() external view returns (uint256); - function getBallotDurationMinMax() external view returns (uint256, uint256); - function getMaxIdleBlockInterval() external view returns (uint256); - function checkVariableCondition(bytes32 envKey, bytes memory envVal) external pure returns (bool); - function setVariable(bytes32 envKey, bytes memory envVal) external; + function setBlocksPerByBytes(bytes memory) external; + function setBallotDurationMinByBytes(bytes memory) external; + function setBallotDurationMaxByBytes(bytes memory) external; + function setStakingMinByBytes(bytes memory) external; + function setStakingMaxByBytes(bytes memory) external; + function setMaxIdleBlockIntervalByBytes(bytes memory) external; + function setBlockCreationTimeByBytes(bytes memory _value) external; + function setBlockRewardAmountByBytes(bytes memory _value) external; + function setMaxPriorityFeePerGasByBytes(bytes memory _value) external; + function setBallotDurationMinMax(uint256 _min, uint256 _max) external; + function setBlockRewardDistributionMethodByBytes(bytes memory _value) external; + function setGasLimitAndBaseFeeByBytes(bytes memory _value) external; + function setMaxBaseFeeByBytes(bytes memory _value) external; + function setBallotDurationMinMaxByBytes(bytes memory _value) external; + function setStakingMinMaxByBytes(bytes memory _value) external; + function getBlockCreationTime() external view returns (uint256); + function getBlockRewardAmount() external view returns (uint256); + function getMaxPriorityFeePerGas() external view returns (uint256); + function getStakingMinMax() external view returns (uint256, uint256); + function getBlockRewardDistributionMethod() external view returns (uint256, uint256, uint256, uint256); + function getGasLimitAndBaseFee() external view returns (uint256, uint256, uint256); + function getMaxBaseFee() external view returns (uint256); + function getBlocksPer() external view returns (uint256); + function getStakingMin() external view returns (uint256); + function getStakingMax() external view returns (uint256); + function getBallotDurationMin() external view returns (uint256); + function getBallotDurationMax() external view returns (uint256); + function getBallotDurationMinMax() external view returns (uint256, uint256); + function getMaxIdleBlockInterval() external view returns (uint256); + function checkVariableCondition(bytes32 envKey, bytes memory envVal) external pure returns (bool); + function setVariable(bytes32 envKey, bytes memory envVal) external; } diff --git a/wemix/governance-contract/contracts/interface/IGov.sol b/wemix/governance-contract/contracts/interface/IGov.sol index c223e232a592..3d2c2e522f1b 100644 --- a/wemix/governance-contract/contracts/interface/IGov.sol +++ b/wemix/governance-contract/contracts/interface/IGov.sol @@ -2,18 +2,18 @@ pragma solidity ^0.8.0; interface IGov { - function isReward(address addr) external view returns (bool); - function isVoter(address addr) external view returns (bool); - function isStaker(address addr) external view returns (bool); - function isMember(address) external view returns (bool); - function getMember(uint256) external view returns (address); - function getMemberLength() external view returns (uint256); - function getReward(uint256) external view returns (address); - function getNodeIdxFromMember(address) external view returns (uint256); - function getMemberFromNodeIdx(uint256) external view returns (address); - function getNodeLength() external view returns (uint256); - function getNode(uint256) external view returns (bytes memory, bytes memory, bytes memory, uint); - function getBallotInVoting() external view returns (uint256); - function getVoter(uint256 idx) external view returns (address); - function initMigration(address registry, uint256 oldModifiedBlock, address oldOwner) external; + function isReward(address addr) external view returns (bool); + function isVoter(address addr) external view returns (bool); + function isStaker(address addr) external view returns (bool); + function isMember(address) external view returns (bool); + function getMember(uint256) external view returns (address); + function getMemberLength() external view returns (uint256); + function getReward(uint256) external view returns (address); + function getNodeIdxFromMember(address) external view returns (uint256); + function getMemberFromNodeIdx(uint256) external view returns (address); + function getNodeLength() external view returns (uint256); + function getNode(uint256) external view returns (bytes memory, bytes memory, bytes memory, uint); + function getBallotInVoting() external view returns (uint256); + function getVoter(uint256 idx) external view returns (address); + function initMigration(address registry, uint256 oldModifiedBlock, address oldOwner) external; } diff --git a/wemix/governance-contract/contracts/interface/IGovStaking.sol b/wemix/governance-contract/contracts/interface/IGovStaking.sol index 3fe18f9e663d..15d30e4210b3 100644 --- a/wemix/governance-contract/contracts/interface/IGovStaking.sol +++ b/wemix/governance-contract/contracts/interface/IGovStaking.sol @@ -2,5 +2,5 @@ pragma solidity ^0.8.0; interface IGovStaking { - function ncpStaking() external view returns (address); + function ncpStaking() external view returns (address); } diff --git a/wemix/governance-contract/contracts/interface/INCPExit.sol b/wemix/governance-contract/contracts/interface/INCPExit.sol index 0c1c99e36d6a..7be58769f619 100644 --- a/wemix/governance-contract/contracts/interface/INCPExit.sol +++ b/wemix/governance-contract/contracts/interface/INCPExit.sol @@ -1,43 +1,42 @@ // SPDX-License-Identifier: MIT - pragma solidity ^0.8.0; interface INCPExit { - /** - * @dev Sets a new administrator. - * @param _newAdministrator Address of the new administrator. - */ - function setAdministrator(address _newAdministrator) external; - - /** - * @dev Sets a new administrator setter. - * @param _newAdministratorSetter Address of the new administrator setter. - */ - function setAdministratorSetter(address _newAdministratorSetter) external; - - /** - * @dev Exits from the contract. - * @param exitNcp Address of the NCP to exit. - * @param totalAmount Total amount of ether to exit with. - * @param lockedUserBalanceToNCPTotal Total locked user balance to NCP. - */ - function depositExitAmount(address exitNcp, uint256 totalAmount, uint256 lockedUserBalanceToNCPTotal) external payable; - - /** - * @dev Withdraws amount for a user. - * @param exitNcp Address of the ncp - * @param exitUser Address of the user to withdraw for. - * @param amount Amount to withdraw. - */ - function withdrawForUser(address exitNcp, address exitUser, uint256 amount) external; - - /** - * @dev Withdraws amount for the administrator. - * @param exitNcp Address of the NCP to withdraw from. - */ - function withdrawForAdministrator(address exitNcp, uint256 amount, address to) external; - - function getAvailableAmountForAdministrator(address exitNcp) external view returns (uint256); - - function getLockedUserBalanceToNCPTotal(address exitNcp) external view returns (uint256); + /** + * @dev Sets a new administrator. + * @param _newAdministrator Address of the new administrator. + */ + function setAdministrator(address _newAdministrator) external; + + /** + * @dev Sets a new administrator setter. + * @param _newAdministratorSetter Address of the new administrator setter. + */ + function setAdministratorSetter(address _newAdministratorSetter) external; + + /** + * @dev Exits from the contract. + * @param exitNcp Address of the NCP to exit. + * @param totalAmount Total amount of ether to exit with. + * @param lockedUserBalanceToNCPTotal Total locked user balance to NCP. + */ + function depositExitAmount(address exitNcp, uint256 totalAmount, uint256 lockedUserBalanceToNCPTotal) external payable; + + /** + * @dev Withdraws amount for a user. + * @param exitNcp Address of the ncp + * @param exitUser Address of the user to withdraw for. + * @param amount Amount to withdraw. + */ + function withdrawForUser(address exitNcp, address exitUser, uint256 amount) external; + + /** + * @dev Withdraws amount for the administrator. + * @param exitNcp Address of the NCP to withdraw from. + */ + function withdrawForAdministrator(address exitNcp, uint256 amount, address to) external; + + function getAvailableAmountForAdministrator(address exitNcp) external view returns (uint256); + + function getLockedUserBalanceToNCPTotal(address exitNcp) external view returns (uint256); } diff --git a/wemix/governance-contract/contracts/interface/INCPStaking.sol b/wemix/governance-contract/contracts/interface/INCPStaking.sol index fb34f900beff..1ba588cead5b 100644 --- a/wemix/governance-contract/contracts/interface/INCPStaking.sol +++ b/wemix/governance-contract/contracts/interface/INCPStaking.sol @@ -4,15 +4,15 @@ pragma solidity ^0.8.0; /// @author @seunghwalee interface INCPStaking { - struct UserInfo { - uint256 amount; - uint256 rewardDebt; - uint256 pendingReward; - uint256 pendingAmountReward; - uint256 lastRewardClaimed; - } - function ncpDeposit(uint256 amount, address payable to) external payable; - function ncpWithdraw(uint256 amount, address payable to) external payable; - function getUserInfo(uint256 pid, address account) external view returns (UserInfo memory info); - function ncpToIdx(address ncp) external view returns (uint256); + struct UserInfo { + uint256 amount; + uint256 rewardDebt; + uint256 pendingReward; + uint256 pendingAmountReward; + uint256 lastRewardClaimed; + } + function ncpDeposit(uint256 amount, address payable to) external payable; + function ncpWithdraw(uint256 amount, address payable to) external payable; + function getUserInfo(uint256 pid, address account) external view returns (UserInfo memory info); + function ncpToIdx(address ncp) external view returns (uint256); } diff --git a/wemix/governance-contract/contracts/interface/IRegistry.sol b/wemix/governance-contract/contracts/interface/IRegistry.sol index db0d31479ef8..6645818d06a7 100644 --- a/wemix/governance-contract/contracts/interface/IRegistry.sol +++ b/wemix/governance-contract/contracts/interface/IRegistry.sol @@ -2,5 +2,5 @@ pragma solidity ^0.8.0; interface IRegistry { - function getContractAddress(bytes32) external view returns (address); + function getContractAddress(bytes32) external view returns (address); } diff --git a/wemix/governance-contract/contracts/interface/IStaking.sol b/wemix/governance-contract/contracts/interface/IStaking.sol index a59cd54216d0..07ed6c7337b1 100644 --- a/wemix/governance-contract/contracts/interface/IStaking.sol +++ b/wemix/governance-contract/contracts/interface/IStaking.sol @@ -2,21 +2,21 @@ pragma solidity ^0.8.0; interface IStaking { - function deposit() external payable; - function withdraw(uint256) external; - function lock(address, uint256) external; - function unlock(address, uint256) external; - function transferLocked(address, uint256, uint256) external; - function balanceOf(address) external view returns (uint256); - function lockedBalanceOf(address) external view returns (uint256); - function availableBalanceOf(address) external view returns (uint256); - function calcVotingWeight(address) external view returns (uint256); - function calcVotingWeightWithScaleFactor(address, uint32) external view returns (uint256); - // function isAllowed(address voter, address staker) external view returns(bool); - function userBalanceOf(address ncp, address user) external view returns (uint256); - function userTotalBalanceOf(address ncp) external view returns (uint256); - function getRatioOfUserBalance(address ncp) external view returns (uint256); - function delegateDepositAndLockMore(address ncp) external payable; - function delegateUnlockAndWithdraw(address ncp, uint256 amount) external; - function getTotalLockedBalance() external view returns (uint256); + function deposit() external payable; + function withdraw(uint256) external; + function lock(address, uint256) external; + function unlock(address, uint256) external; + function transferLocked(address, uint256, uint256) external; + function balanceOf(address) external view returns (uint256); + function lockedBalanceOf(address) external view returns (uint256); + function availableBalanceOf(address) external view returns (uint256); + function calcVotingWeight(address) external view returns (uint256); + function calcVotingWeightWithScaleFactor(address, uint32) external view returns (uint256); + // function isAllowed(address voter, address staker) external view returns(bool); + function userBalanceOf(address ncp, address user) external view returns (uint256); + function userTotalBalanceOf(address ncp) external view returns (uint256); + function getRatioOfUserBalance(address ncp) external view returns (uint256); + function delegateDepositAndLockMore(address ncp) external payable; + function delegateUnlockAndWithdraw(address ncp, uint256 amount) external; + function getTotalLockedBalance() external view returns (uint256); } diff --git a/wemix/governance-contract/contracts/interface/ITestnetGov.sol b/wemix/governance-contract/contracts/interface/ITestnetGov.sol index b5cc0a502705..c84e5e9d73ac 100644 --- a/wemix/governance-contract/contracts/interface/ITestnetGov.sol +++ b/wemix/governance-contract/contracts/interface/ITestnetGov.sol @@ -2,17 +2,17 @@ pragma solidity ^0.8.0; interface ITestnetGov { - function isReward(address addr) external view returns (bool); - function isVoter(address addr) external view returns (bool); - function isStaker(address addr) external view returns (bool); - function isMember(address) external view returns (bool); - function getMember(uint256) external view returns (address); - function getMemberLength() external view returns (uint256); - function getReward(uint256) external view returns (address); - function getNodeIdxFromMember(address) external view returns (uint256); - function getMemberFromNodeIdx(uint256) external view returns (address); - function getNodeLength() external view returns (uint256); - function getNode(uint256) external view returns (bytes memory, bytes memory, bytes memory, uint); - function getBallotInVoting() external view returns (uint256); - function getVoter(uint256 idx) external view returns (address); + function isReward(address addr) external view returns (bool); + function isVoter(address addr) external view returns (bool); + function isStaker(address addr) external view returns (bool); + function isMember(address) external view returns (bool); + function getMember(uint256) external view returns (address); + function getMemberLength() external view returns (uint256); + function getReward(uint256) external view returns (address); + function getNodeIdxFromMember(address) external view returns (uint256); + function getMemberFromNodeIdx(uint256) external view returns (address); + function getNodeLength() external view returns (uint256); + function getNode(uint256) external view returns (bytes memory, bytes memory, bytes memory, uint); + function getBallotInVoting() external view returns (uint256); + function getVoter(uint256 idx) external view returns (address); } diff --git a/wemix/governance-contract/contracts/storage/BallotStorage.sol b/wemix/governance-contract/contracts/storage/BallotStorage.sol index 825d2434b757..09151ee2e92b 100644 --- a/wemix/governance-contract/contracts/storage/BallotStorage.sol +++ b/wemix/governance-contract/contracts/storage/BallotStorage.sol @@ -5,9 +5,9 @@ import "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; import "@openzeppelin/contracts/proxy/beacon/IBeacon.sol"; contract BallotStorage is ERC1967Proxy, IBeacon { - constructor(address _imp) ERC1967Proxy(_imp, "") {} + constructor(address _imp) ERC1967Proxy(_imp, "") {} - function implementation() external view override returns (address) { - return _implementation(); - } + function implementation() external view override returns (address) { + return _implementation(); + } } diff --git a/wemix/governance-contract/contracts/storage/BallotStorageImp.sol b/wemix/governance-contract/contracts/storage/BallotStorageImp.sol index 9c82e476d381..a6b9c6ce0632 100644 --- a/wemix/governance-contract/contracts/storage/BallotStorageImp.sol +++ b/wemix/governance-contract/contracts/storage/BallotStorageImp.sol @@ -8,563 +8,601 @@ import "../interface/IBallotStorage.sol"; import "@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol"; contract BallotStorageImp is GovChecker, BallotEnums, IBallotStorage, UUPSUpgradeable { - struct BallotBasic { - //Ballot ID - uint256 id; - //시작 시간 - uint256 startTime; - //종료 시간 - uint256 endTime; - // 투표 종류 - uint256 ballotType; - // 제안자 - address creator; - // 투표 내용 - bytes memo; - //총 투표자수 - uint256 totalVoters; - // 진행상태 - uint256 powerOfAccepts; - // 진행상태 - uint256 powerOfRejects; - // 상태 - uint256 state; - // 완료유무 - bool isFinalized; - // 투표 기간 - uint256 duration; - } - - //For MemberAdding/MemberRemoval/MemberSwap - struct BallotMember { - uint256 id; - address oldStakerAddress; - address newStakerAddress; - address newVoterAddress; - address newRewardAddress; - bytes newNodeName; // name - bytes newNodeId; // admin.nodeInfo.id is 512 bit public key - bytes newNodeIp; - uint256 newNodePort; - uint256 lockAmount; - } - - //For GovernanceChange - struct BallotAddress { - uint256 id; - address newGovernanceAddress; - } - - //For EnvValChange - struct BallotVariable { - //Ballot ID - uint256 id; - bytes32 envVariableName; - uint256 envVariableType; - bytes envVariableValue; - } - - struct BallotExit { - // For exit - uint256 unlockAmount; - uint256 slashing; - } - - struct Vote { - uint256 voteId; - uint256 ballotId; - address voter; - uint256 decision; - uint256 power; - uint256 time; - } - - event BallotCreated(uint256 indexed ballotId, uint256 indexed ballotType, address indexed creator); - - event BallotStarted(uint256 indexed ballotId, uint256 indexed startTime, uint256 indexed endTime); - - event Voted(uint256 indexed voteid, uint256 indexed ballotId, address indexed voter, uint256 decision); - - event BallotFinalized(uint256 indexed ballotId, uint256 state); - - event BallotCanceled(uint256 indexed ballotId); - - event BallotUpdated(uint256 indexed ballotId, address indexed updatedBy); - - event SetPrevBallotStorage(address indexed previous); - - mapping(uint => BallotBasic) internal ballotBasicMap; - mapping(uint => BallotMember) internal ballotMemberMap; - mapping(uint => BallotAddress) internal ballotAddressMap; - mapping(uint => BallotVariable) internal ballotVariableMap; - - mapping(uint => Vote) internal voteMap; - mapping(uint => mapping(address => bool)) internal hasVotedMap; - - address internal previousBallotStorage; - - uint256 internal ballotCount; - - // For exit - mapping(uint => BallotExit) internal ballotExitMap; - - /// @custom:oz-upgrades-unsafe-allow constructor - constructor() { - _disableInitializers(); - } - function initialize(address _registry) external initializer { - __Ownable_init(); - setRegistry(_registry); - } - - modifier onlyValidTime(uint256 _startTime, uint256 _endTime) { - require(_startTime > 0 && _endTime > 0, "start or end is 0"); - require(_endTime > _startTime, "start >= end"); // && _startTime > getTime() - //uint256 diffTime = _endTime.sub(_startTime); - // require(diffTime > minBallotDuration()); - // require(diffTime <= maxBallotDuration()); - _; - } - - modifier onlyValidDuration(uint256 _duration) { - require(getMinVotingDuration() <= _duration, "Under min value of duration"); - require(_duration <= getMaxVotingDuration(), "Over max value of duration"); - _; - } - - modifier onlyGovOrCreator(uint256 _ballotId) { - require((getGovAddress() == msg.sender) || (ballotBasicMap[_ballotId].creator == msg.sender), "No Permission"); - _; - } - - modifier notDisabled() { - require(address(this) == getBallotStorageAddress(), "Is Disabled"); - _; - } - - function getMinVotingDuration() public view returns (uint256) { - return IEnvStorage(getEnvStorageAddress()).getBallotDurationMin(); - } - - function getMaxVotingDuration() public view returns (uint256) { - return IEnvStorage(getEnvStorageAddress()).getBallotDurationMax(); - } - - function getTime() public view returns (uint256) { - return block.timestamp; - } - - function getPreviousBallotStorage() public view returns (address) { - return previousBallotStorage; - } - - function isDisabled() public view returns (bool) { - return (address(this) != getBallotStorageAddress()); - } - - function getBallotCount() public view returns (uint256) { - return ballotCount; - } - - function getBallotBasic( - uint256 _id - ) - public - view - override - returns ( - uint256 startTime, - uint256 endTime, - uint256 ballotType, - address creator, - bytes memory memo, - uint256 totalVoters, - uint256 powerOfAccepts, - uint256 powerOfRejects, - uint256 state, - bool isFinalized, - uint256 duration - ) - { - BallotBasic memory tBallot = ballotBasicMap[_id]; - startTime = tBallot.startTime; - endTime = tBallot.endTime; - ballotType = tBallot.ballotType; - creator = tBallot.creator; - memo = tBallot.memo; - totalVoters = tBallot.totalVoters; - powerOfAccepts = tBallot.powerOfAccepts; - powerOfRejects = tBallot.powerOfRejects; - state = tBallot.state; - isFinalized = tBallot.isFinalized; - duration = tBallot.duration; - } - - function getBallotMember( - uint256 _id - ) - public - view - override - returns ( - address oldStakerAddress, - address newStakerAddress, - address newVoterAddress, - address newRewardAddress, - bytes memory newNodeName, // name - bytes memory newNodeId, // admin.nodeInfo.id is 512 bit public key - bytes memory newNodeIp, - uint256 newNodePort, - uint256 lockAmount - ) - { - BallotMember storage tBallot = ballotMemberMap[_id]; - oldStakerAddress = tBallot.oldStakerAddress; - newStakerAddress = tBallot.newStakerAddress; - newVoterAddress = tBallot.newVoterAddress; - newRewardAddress = tBallot.newRewardAddress; - newNodeName = tBallot.newNodeName; - newNodeId = tBallot.newNodeId; - newNodeIp = tBallot.newNodeIp; - newNodePort = tBallot.newNodePort; - lockAmount = tBallot.lockAmount; - } - - function getBallotAddress(uint256 _id) public view override returns (address newGovernanceAddress) { - BallotAddress storage tBallot = ballotAddressMap[_id]; - newGovernanceAddress = tBallot.newGovernanceAddress; - } - - function getBallotVariable( - uint256 _id - ) public view override returns (bytes32 envVariableName, uint256 envVariableType, bytes memory envVariableValue) { - BallotVariable storage tBallot = ballotVariableMap[_id]; - envVariableName = tBallot.envVariableName; - envVariableType = tBallot.envVariableType; - envVariableValue = tBallot.envVariableValue; - } - - function setPreviousBallotStorage(address _address) public onlyOwner { - require(_address != address(0), "Invalid address"); - previousBallotStorage = _address; - emit SetPrevBallotStorage(_address); - } - - //For MemberAdding/MemberRemoval/MemberSwap - function createBallotForMember( - uint256 _id, - uint256 _ballotType, - uint256 _duration, - address _creator, - address _oldStakerAddress, - address _newStakerAddress, - address _newVoterAddress, - address _newRewardAddress, - bytes memory _newNodeName, // name - bytes memory _newNodeId, // admin.nodeInfo.id is 512 bit public key - bytes memory _newNodeIp, - uint _newNodePort - ) public override onlyGov notDisabled { - require( - _areMemberBallotParamValid( - _ballotType, - _oldStakerAddress, - _newStakerAddress, - _newVoterAddress, - _newRewardAddress, - _newNodeName, - _newNodeId, - _newNodeIp, - _newNodePort - ), - "Invalid Parameter" - ); - _createBallot(_id, _ballotType, _duration, _creator); - BallotMember memory newBallot; - newBallot.id = _id; - newBallot.oldStakerAddress = _oldStakerAddress; - newBallot.newStakerAddress = _newStakerAddress; - newBallot.newVoterAddress = _newVoterAddress; - newBallot.newRewardAddress = _newRewardAddress; - newBallot.newNodeName = _newNodeName; - newBallot.newNodeId = _newNodeId; - newBallot.newNodeIp = _newNodeIp; - newBallot.newNodePort = _newNodePort; - - ballotMemberMap[_id] = newBallot; - } - - function createBallotForExit(uint256 _id, uint256 _unlockAmount, uint256 _slashing) public override onlyGov notDisabled { - ballotExitMap[_id].unlockAmount = _unlockAmount; - ballotExitMap[_id].slashing = _slashing; - } - function getBallotForExit(uint256 _id) public view override returns (uint256 unlockAmount, uint256 slashing) { - unlockAmount = ballotExitMap[_id].unlockAmount; - slashing = ballotExitMap[_id].slashing; - } - - function createBallotForAddress( - uint256 _id, - uint256 _ballotType, - uint256 _duration, - address _creator, - address _newGovernanceAddress - ) public override onlyGov notDisabled returns (uint256) { - require(_ballotType == uint256(BallotTypes.GovernanceChange), "Invalid Ballot Type"); - require(_newGovernanceAddress != address(0), "Invalid Parameter"); - _createBallot(_id, _ballotType, _duration, _creator); - BallotAddress memory newBallot; - newBallot.id = _id; - newBallot.newGovernanceAddress = _newGovernanceAddress; - ballotAddressMap[_id] = newBallot; - return _id; - } - - function createBallotForVariable( - uint256 _id, - uint256 _ballotType, - uint256 _duration, - address _creator, - bytes32 _envVariableName, - uint256 _envVariableType, - bytes memory _envVariableValue - ) public override onlyGov notDisabled returns (uint256) { - require(_areVariableBallotParamValid(_ballotType, _envVariableName, _envVariableValue), "Invalid Parameter"); - _createBallot(_id, _ballotType, _duration, _creator); - BallotVariable memory newBallot; - newBallot.id = _id; - newBallot.envVariableName = _envVariableName; - newBallot.envVariableType = _envVariableType; - newBallot.envVariableValue = _envVariableValue; - ballotVariableMap[_id] = newBallot; - return _id; - } - - function createVote(uint256 _voteId, uint256 _ballotId, address _voter, uint256 _decision, uint256 _power) public override onlyGov notDisabled { - // Check decision type - require((_decision == uint256(DecisionTypes.Accept)) || (_decision == uint256(DecisionTypes.Reject)), "Invalid decision"); - // Check if ballot exists - require(ballotBasicMap[_ballotId].id == _ballotId, "not existed Ballot"); - // Check if vote exists - require(voteMap[_voteId].voteId != _voteId, "already existed voteId"); - // Check if voted - require(!hasVotedMap[_ballotId][_voter], "already voted"); - require(ballotBasicMap[_ballotId].state == uint256(BallotStates.InProgress), "Not InProgress State"); - - voteMap[_voteId] = Vote(_voteId, _ballotId, _voter, _decision, _power, getTime()); - _updateBallotForVote(_ballotId, _voter, _decision, _power); - - emit Voted(_voteId, _ballotId, _voter, _decision); - } - - function startBallot( - uint256 _ballotId, - uint256 _startTime, - uint256 _endTime - ) public override onlyGov notDisabled onlyValidTime(_startTime, _endTime) { - require(ballotBasicMap[_ballotId].id == _ballotId, "not existed Ballot"); - require(ballotBasicMap[_ballotId].isFinalized == false, "already finalized"); - require(ballotBasicMap[_ballotId].state == uint256(BallotStates.Ready), "Not Ready State"); - - BallotBasic storage _ballot = ballotBasicMap[_ballotId]; - _ballot.startTime = _startTime; - _ballot.endTime = _endTime; - _ballot.state = uint256(BallotStates.InProgress); - emit BallotStarted(_ballotId, _startTime, _endTime); - } - - function updateBallotMemo(uint256 _ballotId, bytes memory _memo) public override onlyGovOrCreator(_ballotId) notDisabled { - require(ballotBasicMap[_ballotId].id == _ballotId, "not existed Ballot"); - require(ballotBasicMap[_ballotId].isFinalized == false, "already finalized"); - BallotBasic storage _ballot = ballotBasicMap[_ballotId]; - _ballot.memo = _memo; - emit BallotUpdated(_ballotId, msg.sender); - } - - function updateBallotDuration( - uint256 _ballotId, - uint256 _duration - ) public override onlyGovOrCreator(_ballotId) notDisabled onlyValidDuration(_duration) { - require(ballotBasicMap[_ballotId].id == _ballotId, "not existed Ballot"); - require(ballotBasicMap[_ballotId].isFinalized == false, "already finalized"); - require(ballotBasicMap[_ballotId].state == uint256(BallotStates.Ready), "Not Ready State"); - - BallotBasic storage _ballot = ballotBasicMap[_ballotId]; - _ballot.duration = _duration; - emit BallotUpdated(_ballotId, msg.sender); - } - - function updateBallotMemberLockAmount(uint256 _ballotId, uint256 _lockAmount) public override onlyGov notDisabled { - require(ballotBasicMap[_ballotId].id == _ballotId, "not existed Ballot"); - require(ballotMemberMap[_ballotId].id == _ballotId, "not existed BallotMember"); - require(ballotBasicMap[_ballotId].isFinalized == false, "already finalized"); - require(ballotBasicMap[_ballotId].state == uint256(BallotStates.Ready), "Not Ready State"); - BallotMember storage _ballot = ballotMemberMap[_ballotId]; - _ballot.lockAmount = _lockAmount; - emit BallotUpdated(_ballotId, msg.sender); - } - - // cancel ballot info - function cancelBallot(uint256 _ballotId) public onlyGovOrCreator(_ballotId) notDisabled { - require(ballotBasicMap[_ballotId].id == _ballotId, "not existed Ballot"); - require(ballotBasicMap[_ballotId].isFinalized == false, "already finalized"); - - require(ballotBasicMap[_ballotId].state == uint256(BallotStates.Ready), "Not Ready State"); - BallotBasic storage _ballot = ballotBasicMap[_ballotId]; - _ballot.state = uint256(BallotStates.Canceled); - emit BallotCanceled(_ballotId); - } - - // finalize ballot info - function finalizeBallot(uint256 _ballotId, uint256 _ballotState) public override onlyGov notDisabled { - require(ballotBasicMap[_ballotId].id == _ballotId, "not existed Ballot"); - require(ballotBasicMap[_ballotId].isFinalized == false, "already finalized"); - require((_ballotState == uint256(BallotStates.Accepted)) || (_ballotState == uint256(BallotStates.Rejected)), "Invalid Ballot State"); - - BallotBasic storage _ballot = ballotBasicMap[_ballotId]; - _ballot.state = _ballotState; - _ballot.isFinalized = true; - emit BallotFinalized(_ballotId, _ballotState); - } - - function hasAlreadyVoted(uint56 _ballotId, address _voter) public view returns (bool) { - return hasVotedMap[_ballotId][_voter]; - } - - function getVote( - uint256 _voteId - ) public view returns (uint256 voteId, uint256 ballotId, address voter, uint256 decision, uint256 power, uint256 time) { - require(voteMap[_voteId].voteId == _voteId, "not existed voteId"); - Vote memory _vote = voteMap[_voteId]; - voteId = _vote.voteId; - ballotId = _vote.ballotId; - voter = _vote.voter; - decision = _vote.decision; - power = _vote.power; - time = _vote.time; - } - - function getBallotPeriod(uint256 _id) public view override returns (uint256 startTime, uint256 endTime, uint256 duration) { - BallotBasic memory tBallot = ballotBasicMap[_id]; - startTime = tBallot.startTime; - endTime = tBallot.endTime; - duration = tBallot.duration; - } - - function getBallotVotingInfo(uint256 _id) public view override returns (uint256 totalVoters, uint256 powerOfAccepts, uint256 powerOfRejects) { - BallotBasic memory tBallot = ballotBasicMap[_id]; - totalVoters = tBallot.totalVoters; - powerOfAccepts = tBallot.powerOfAccepts; - powerOfRejects = tBallot.powerOfRejects; - } - - function getBallotState(uint256 _id) public view override returns (uint256 ballotType, uint256 state, bool isFinalized) { - BallotBasic memory tBallot = ballotBasicMap[_id]; - ballotType = tBallot.ballotType; - state = tBallot.state; - isFinalized = tBallot.isFinalized; - } - - function _createBallot(uint256 _id, uint256 _ballotType, uint256 _duration, address _creator) internal onlyValidDuration(_duration) { - require(ballotBasicMap[_id].id != _id, "Already existed ballot"); - - BallotBasic memory newBallot; - newBallot.id = _id; - newBallot.ballotType = _ballotType; - newBallot.creator = _creator; - // newBallot.memo = _memo; - newBallot.state = uint256(BallotStates.Ready); - newBallot.isFinalized = false; - newBallot.duration = _duration; - ballotBasicMap[_id] = newBallot; - ballotCount = ballotCount + 1; - emit BallotCreated(_id, _ballotType, _creator); - } - - function _areMemberBallotParamValid( - uint256 _ballotType, - address _oldStakerAddress, - address _newStakerAddress, - address _newVoterAddress, - address _newRewardAddress, - bytes memory _newName, - bytes memory _newNodeId, // admin.nodeInfo.id is 512 bit public key - bytes memory _newNodeIp, - uint _newNodePort - ) internal pure returns (bool) { - require((_ballotType >= uint256(BallotTypes.MemberAdd)) && (_ballotType <= uint256(BallotTypes.MemberChange)), "Invalid Ballot Type"); - - if (_ballotType == uint256(BallotTypes.MemberRemoval)) { - require(_oldStakerAddress != address(0), "Invalid old staker address"); - require(_newStakerAddress == address(0), "Invalid new staker address"); - require(_newVoterAddress == address(0), "Invalid new voter address"); - require(_newRewardAddress == address(0), "Invalid new reward address"); - require(_newName.length == 0, "Invalid new node name"); - require(_newNodeId.length == 0, "Invalid new node id"); - require(_newNodeIp.length == 0, "Invalid new node IP"); - require(_newNodePort == 0, "Invalid new node Port"); - } else { - require(_newName.length > 0, "Invalid new node name"); - require(_newNodeId.length == 64, "Invalid new node id"); - require(_newNodeIp.length > 0, "Invalid new node IP"); - require(_newNodePort > 0, "Invalid new node Port"); - if (_ballotType == uint256(BallotTypes.MemberAdd)) { - require(_oldStakerAddress == address(0), "Invalid old staker address"); - require(_newStakerAddress != address(0), "Invalid new staker address"); - require(_newVoterAddress != address(0), "Invalid new voter address"); - require(_newRewardAddress != address(0), "Invalid new reward address"); - } else if (_ballotType == uint256(BallotTypes.MemberChange)) { - require(_oldStakerAddress != address(0), "Invalid old staker address"); - require(_newStakerAddress != address(0), "Invalid new staker address"); - require(_newVoterAddress != address(0), "Invalid new voter address"); - require(_newRewardAddress != address(0), "Invalid new reward address"); - } - } - - return true; - } - - function _areVariableBallotParamValid( - uint256 _ballotType, - bytes32 _envVariableName, - bytes memory _envVariableValue - ) internal pure returns (bool) { - require(_ballotType == uint256(BallotTypes.EnvValChange), "Invalid Ballot Type"); - require(_envVariableName > 0, "Invalid environment variable name"); - require(_envVariableValue.length > 0, "Invalid environment variable value"); - - return true; - } - - // update ballot - function _updateBallotForVote(uint256 _ballotId, address _voter, uint256 _decision, uint256 _power) internal { - // c1. actionType 범위 - require((_decision == uint256(DecisionTypes.Accept)) || (_decision == uint256(DecisionTypes.Reject)), "Invalid decision"); - // c2. ballotId 존재 하는지 확인 - require(ballotBasicMap[_ballotId].id == _ballotId, "not existed Ballot"); - // c3. 이미 vote 했는지 확인 - require(hasVotedMap[_ballotId][_voter] == false, "already voted"); - - //1.get ballotBasic - BallotBasic storage _ballot = ballotBasicMap[_ballotId]; - //2. 투표 여부 등록 - hasVotedMap[_ballotId][_voter] = true; - //3. update totalVoters - _ballot.totalVoters = _ballot.totalVoters + 1; - //4. Update power of accept/reject - if (_decision == uint256(DecisionTypes.Accept)) { - _ballot.powerOfAccepts = _ballot.powerOfAccepts + _power; - } else { - _ballot.powerOfRejects = _ballot.powerOfRejects + _power; - } - } - - function upgradeBallotStorage(address newImp) external onlyOwner { - if (newImp != address(0)) { - _authorizeUpgrade(newImp); - _upgradeToAndCallUUPS(newImp, new bytes(0), false); - } - } - - function _authorizeUpgrade(address newImplementation) internal override onlyOwner {} + struct BallotBasic { + //Ballot ID + uint256 id; + //시작 시간 + uint256 startTime; + //종료 시간 + uint256 endTime; + // 투표 종류 + uint256 ballotType; + // 제안자 + address creator; + // 투표 내용 + bytes memo; + //총 투표자수 + uint256 totalVoters; + // 진행상태 + uint256 powerOfAccepts; + // 진행상태 + uint256 powerOfRejects; + // 상태 + uint256 state; + // 완료유무 + bool isFinalized; + // 투표 기간 + uint256 duration; + } + + //For MemberAdding/MemberRemoval/MemberSwap + struct BallotMember { + uint256 id; + address oldStakerAddress; + address newStakerAddress; + address newVoterAddress; + address newRewardAddress; + bytes newNodeName; // name + bytes newNodeId; // admin.nodeInfo.id is 512 bit public key + bytes newNodeIp; + uint256 newNodePort; + uint256 lockAmount; + } + + //For GovernanceChange + struct BallotAddress { + uint256 id; + address newGovernanceAddress; + } + + //For EnvValChange + struct BallotVariable { + //Ballot ID + uint256 id; + bytes32 envVariableName; + uint256 envVariableType; + bytes envVariableValue; + } + + struct BallotExit { + // For exit + uint256 unlockAmount; + uint256 slashing; + } + + struct Vote { + uint256 voteId; + uint256 ballotId; + address voter; + uint256 decision; + uint256 power; + uint256 time; + } + + event BallotCreated(uint256 indexed ballotId, uint256 indexed ballotType, address indexed creator); + + event BallotStarted(uint256 indexed ballotId, uint256 indexed startTime, uint256 indexed endTime); + + event Voted(uint256 indexed voteid, uint256 indexed ballotId, address indexed voter, uint256 decision); + + event BallotFinalized(uint256 indexed ballotId, uint256 state); + + event BallotCanceled(uint256 indexed ballotId); + + event BallotUpdated(uint256 indexed ballotId, address indexed updatedBy); + + event SetPrevBallotStorage(address indexed previous); + + mapping(uint => BallotBasic) internal ballotBasicMap; + mapping(uint => BallotMember) internal ballotMemberMap; + mapping(uint => BallotAddress) internal ballotAddressMap; + mapping(uint => BallotVariable) internal ballotVariableMap; + + mapping(uint => Vote) internal voteMap; + mapping(uint => mapping(address => bool)) internal hasVotedMap; + + address internal previousBallotStorage; + + uint256 internal ballotCount; + + // For exit + mapping(uint => BallotExit) internal ballotExitMap; + + /// @custom:oz-upgrades-unsafe-allow constructor + constructor() { + _disableInitializers(); + } + function initialize(address _registry) external initializer { + __Ownable_init(); + setRegistry(_registry); + } + + modifier onlyValidTime(uint256 _startTime, uint256 _endTime) { + require(_startTime > 0 && _endTime > 0, "start or end is 0"); + require(_endTime > _startTime, "start >= end"); // && _startTime > getTime() + //uint256 diffTime = _endTime.sub(_startTime); + // require(diffTime > minBallotDuration()); + // require(diffTime <= maxBallotDuration()); + _; + } + + modifier onlyValidDuration(uint256 _duration) { + require(getMinVotingDuration() <= _duration, "Under min value of duration"); + require(_duration <= getMaxVotingDuration(), "Over max value of duration"); + _; + } + + modifier onlyGovOrCreator(uint256 _ballotId) { + require((getGovAddress() == msg.sender) || (ballotBasicMap[_ballotId].creator == msg.sender), "No Permission"); + _; + } + + modifier notDisabled() { + require(address(this) == getBallotStorageAddress(), "Is Disabled"); + _; + } + + function getMinVotingDuration() public view returns (uint256) { + return IEnvStorage(getEnvStorageAddress()).getBallotDurationMin(); + } + + function getMaxVotingDuration() public view returns (uint256) { + return IEnvStorage(getEnvStorageAddress()).getBallotDurationMax(); + } + + function getTime() public view returns (uint256) { + return block.timestamp; + } + + function getPreviousBallotStorage() public view returns (address) { + return previousBallotStorage; + } + + function isDisabled() public view returns (bool) { + return (address(this) != getBallotStorageAddress()); + } + + function getBallotCount() public view returns (uint256) { + return ballotCount; + } + + function getBallotBasic( + uint256 _id + ) + public + view + override + returns ( + uint256 startTime, + uint256 endTime, + uint256 ballotType, + address creator, + bytes memory memo, + uint256 totalVoters, + uint256 powerOfAccepts, + uint256 powerOfRejects, + uint256 state, + bool isFinalized, + uint256 duration + ) + { + BallotBasic memory tBallot = ballotBasicMap[_id]; + startTime = tBallot.startTime; + endTime = tBallot.endTime; + ballotType = tBallot.ballotType; + creator = tBallot.creator; + memo = tBallot.memo; + totalVoters = tBallot.totalVoters; + powerOfAccepts = tBallot.powerOfAccepts; + powerOfRejects = tBallot.powerOfRejects; + state = tBallot.state; + isFinalized = tBallot.isFinalized; + duration = tBallot.duration; + } + + function getBallotMember( + uint256 _id + ) + public + view + override + returns ( + address oldStakerAddress, + address newStakerAddress, + address newVoterAddress, + address newRewardAddress, + bytes memory newNodeName, // name + bytes memory newNodeId, // admin.nodeInfo.id is 512 bit public key + bytes memory newNodeIp, + uint256 newNodePort, + uint256 lockAmount + ) + { + BallotMember storage tBallot = ballotMemberMap[_id]; + oldStakerAddress = tBallot.oldStakerAddress; + newStakerAddress = tBallot.newStakerAddress; + newVoterAddress = tBallot.newVoterAddress; + newRewardAddress = tBallot.newRewardAddress; + newNodeName = tBallot.newNodeName; + newNodeId = tBallot.newNodeId; + newNodeIp = tBallot.newNodeIp; + newNodePort = tBallot.newNodePort; + lockAmount = tBallot.lockAmount; + } + + function getBallotAddress(uint256 _id) public view override returns (address newGovernanceAddress) { + BallotAddress storage tBallot = ballotAddressMap[_id]; + newGovernanceAddress = tBallot.newGovernanceAddress; + } + + function getBallotVariable( + uint256 _id + ) public view override returns (bytes32 envVariableName, uint256 envVariableType, bytes memory envVariableValue) { + BallotVariable storage tBallot = ballotVariableMap[_id]; + envVariableName = tBallot.envVariableName; + envVariableType = tBallot.envVariableType; + envVariableValue = tBallot.envVariableValue; + } + + function setPreviousBallotStorage(address _address) public onlyOwner { + require(_address != address(0), "Invalid address"); + previousBallotStorage = _address; + emit SetPrevBallotStorage(_address); + } + + //For MemberAdding/MemberRemoval/MemberSwap + function createBallotForMember( + uint256 _id, + uint256 _ballotType, + uint256 _duration, + address _creator, + address _oldStakerAddress, + address _newStakerAddress, + address _newVoterAddress, + address _newRewardAddress, + bytes memory _newNodeName, // name + bytes memory _newNodeId, // admin.nodeInfo.id is 512 bit public key + bytes memory _newNodeIp, + uint _newNodePort + ) public override onlyGov notDisabled { + require( + _areMemberBallotParamValid( + _ballotType, + _oldStakerAddress, + _newStakerAddress, + _newVoterAddress, + _newRewardAddress, + _newNodeName, + _newNodeId, + _newNodeIp, + _newNodePort + ), + "Invalid Parameter" + ); + _createBallot(_id, _ballotType, _duration, _creator); + BallotMember memory newBallot; + newBallot.id = _id; + newBallot.oldStakerAddress = _oldStakerAddress; + newBallot.newStakerAddress = _newStakerAddress; + newBallot.newVoterAddress = _newVoterAddress; + newBallot.newRewardAddress = _newRewardAddress; + newBallot.newNodeName = _newNodeName; + newBallot.newNodeId = _newNodeId; + newBallot.newNodeIp = _newNodeIp; + newBallot.newNodePort = _newNodePort; + + ballotMemberMap[_id] = newBallot; + } + + function createBallotForExit(uint256 _id, uint256 _unlockAmount, uint256 _slashing) public override onlyGov notDisabled { + ballotExitMap[_id].unlockAmount = _unlockAmount; + ballotExitMap[_id].slashing = _slashing; + } + function getBallotForExit(uint256 _id) public view override returns (uint256 unlockAmount, uint256 slashing) { + unlockAmount = ballotExitMap[_id].unlockAmount; + slashing = ballotExitMap[_id].slashing; + } + + function createBallotForAddress( + uint256 _id, + uint256 _ballotType, + uint256 _duration, + address _creator, + address _newGovernanceAddress + ) public override onlyGov notDisabled returns (uint256) { + require(_ballotType == uint256(BallotTypes.GovernanceChange), "Invalid Ballot Type"); + require(_newGovernanceAddress != address(0), "Invalid Parameter"); + _createBallot(_id, _ballotType, _duration, _creator); + BallotAddress memory newBallot; + newBallot.id = _id; + newBallot.newGovernanceAddress = _newGovernanceAddress; + ballotAddressMap[_id] = newBallot; + return _id; + } + + function createBallotForVariable( + uint256 _id, + uint256 _ballotType, + uint256 _duration, + address _creator, + bytes32 _envVariableName, + uint256 _envVariableType, + bytes memory _envVariableValue + ) public override onlyGov notDisabled returns (uint256) { + require(_areVariableBallotParamValid(_ballotType, _envVariableName, _envVariableValue), "Invalid Parameter"); + _createBallot(_id, _ballotType, _duration, _creator); + BallotVariable memory newBallot; + newBallot.id = _id; + newBallot.envVariableName = _envVariableName; + newBallot.envVariableType = _envVariableType; + newBallot.envVariableValue = _envVariableValue; + ballotVariableMap[_id] = newBallot; + return _id; + } + + function createVote(uint256 _voteId, uint256 _ballotId, address _voter, uint256 _decision, uint256 _power) public override onlyGov notDisabled { + // Check decision type + require((_decision == uint256(DecisionTypes.Accept)) || (_decision == uint256(DecisionTypes.Reject)), "Invalid decision"); + // Check if ballot exists + require(ballotBasicMap[_ballotId].id == _ballotId, "not existed Ballot"); + // Check if vote exists + require(voteMap[_voteId].voteId != _voteId, "already existed voteId"); + // Check if voted + require(!hasVotedMap[_ballotId][_voter], "already voted"); + require(ballotBasicMap[_ballotId].state == uint256(BallotStates.InProgress), "Not InProgress State"); + + voteMap[_voteId] = Vote(_voteId, _ballotId, _voter, _decision, _power, getTime()); + _updateBallotForVote(_ballotId, _voter, _decision, _power); + + emit Voted(_voteId, _ballotId, _voter, _decision); + } + + function startBallot( + uint256 _ballotId, + uint256 _startTime, + uint256 _endTime + ) public override onlyGov notDisabled onlyValidTime(_startTime, _endTime) { + require(ballotBasicMap[_ballotId].id == _ballotId, "not existed Ballot"); + require(ballotBasicMap[_ballotId].isFinalized == false, "already finalized"); + require(ballotBasicMap[_ballotId].state == uint256(BallotStates.Ready), "Not Ready State"); + + BallotBasic storage _ballot = ballotBasicMap[_ballotId]; + _ballot.startTime = _startTime; + _ballot.endTime = _endTime; + _ballot.state = uint256(BallotStates.InProgress); + emit BallotStarted(_ballotId, _startTime, _endTime); + } + + function updateBallotMemo(uint256 _ballotId, bytes memory _memo) public override onlyGovOrCreator(_ballotId) notDisabled { + require(ballotBasicMap[_ballotId].id == _ballotId, "not existed Ballot"); + require(ballotBasicMap[_ballotId].isFinalized == false, "already finalized"); + BallotBasic storage _ballot = ballotBasicMap[_ballotId]; + _ballot.memo = _memo; + emit BallotUpdated(_ballotId, msg.sender); + } + + function updateBallotDuration( + uint256 _ballotId, + uint256 _duration + ) public override onlyGovOrCreator(_ballotId) notDisabled onlyValidDuration(_duration) { + require(ballotBasicMap[_ballotId].id == _ballotId, "not existed Ballot"); + require(ballotBasicMap[_ballotId].isFinalized == false, "already finalized"); + require(ballotBasicMap[_ballotId].state == uint256(BallotStates.Ready), "Not Ready State"); + + BallotBasic storage _ballot = ballotBasicMap[_ballotId]; + _ballot.duration = _duration; + emit BallotUpdated(_ballotId, msg.sender); + } + + function updateBallotMemberLockAmount(uint256 _ballotId, uint256 _lockAmount) public override onlyGov notDisabled { + require(ballotBasicMap[_ballotId].id == _ballotId, "not existed Ballot"); + require(ballotMemberMap[_ballotId].id == _ballotId, "not existed BallotMember"); + require(ballotBasicMap[_ballotId].isFinalized == false, "already finalized"); + require(ballotBasicMap[_ballotId].state == uint256(BallotStates.Ready), "Not Ready State"); + BallotMember storage _ballot = ballotMemberMap[_ballotId]; + _ballot.lockAmount = _lockAmount; + emit BallotUpdated(_ballotId, msg.sender); + } + + // cancel ballot info + function cancelBallot(uint256 _ballotId) public onlyGovOrCreator(_ballotId) notDisabled { + require(ballotBasicMap[_ballotId].id == _ballotId, "not existed Ballot"); + require(ballotBasicMap[_ballotId].isFinalized == false, "already finalized"); + + require(ballotBasicMap[_ballotId].state == uint256(BallotStates.Ready), "Not Ready State"); + BallotBasic storage _ballot = ballotBasicMap[_ballotId]; + _ballot.state = uint256(BallotStates.Canceled); + emit BallotCanceled(_ballotId); + } + + // finalize ballot info + function finalizeBallot(uint256 _ballotId, uint256 _ballotState) public override onlyGov notDisabled { + require(ballotBasicMap[_ballotId].id == _ballotId, "not existed Ballot"); + require(ballotBasicMap[_ballotId].isFinalized == false, "already finalized"); + require((_ballotState == uint256(BallotStates.Accepted)) || (_ballotState == uint256(BallotStates.Rejected)), "Invalid Ballot State"); + + BallotBasic storage _ballot = ballotBasicMap[_ballotId]; + _ballot.state = _ballotState; + _ballot.isFinalized = true; + emit BallotFinalized(_ballotId, _ballotState); + } + + function hasAlreadyVoted(uint56 _ballotId, address _voter) public view returns (bool) { + return hasVotedMap[_ballotId][_voter]; + } + + function getVote( + uint256 _voteId + ) public view returns (uint256 voteId, uint256 ballotId, address voter, uint256 decision, uint256 power, uint256 time) { + require(voteMap[_voteId].voteId == _voteId, "not existed voteId"); + Vote memory _vote = voteMap[_voteId]; + voteId = _vote.voteId; + ballotId = _vote.ballotId; + voter = _vote.voter; + decision = _vote.decision; + power = _vote.power; + time = _vote.time; + } + + function getBallotPeriod(uint256 _id) public view override returns (uint256 startTime, uint256 endTime, uint256 duration) { + BallotBasic memory tBallot = ballotBasicMap[_id]; + startTime = tBallot.startTime; + endTime = tBallot.endTime; + duration = tBallot.duration; + } + + function getBallotVotingInfo(uint256 _id) public view override returns (uint256 totalVoters, uint256 powerOfAccepts, uint256 powerOfRejects) { + BallotBasic memory tBallot = ballotBasicMap[_id]; + totalVoters = tBallot.totalVoters; + powerOfAccepts = tBallot.powerOfAccepts; + powerOfRejects = tBallot.powerOfRejects; + } + + function getBallotState(uint256 _id) public view override returns (uint256 ballotType, uint256 state, bool isFinalized) { + BallotBasic memory tBallot = ballotBasicMap[_id]; + ballotType = tBallot.ballotType; + state = tBallot.state; + isFinalized = tBallot.isFinalized; + } + + function _createBallot(uint256 _id, uint256 _ballotType, uint256 _duration, address _creator) internal onlyValidDuration(_duration) { + require(ballotBasicMap[_id].id != _id, "Already existed ballot"); + + BallotBasic memory newBallot; + newBallot.id = _id; + newBallot.ballotType = _ballotType; + newBallot.creator = _creator; + // newBallot.memo = _memo; + newBallot.state = uint256(BallotStates.Ready); + newBallot.isFinalized = false; + newBallot.duration = _duration; + ballotBasicMap[_id] = newBallot; + ballotCount = ballotCount + 1; + emit BallotCreated(_id, _ballotType, _creator); + } + + function _areMemberBallotParamValid( + uint256 _ballotType, + address _oldStakerAddress, + address _newStakerAddress, + address _newVoterAddress, + address _newRewardAddress, + bytes memory _newName, + bytes memory _newNodeId, // admin.nodeInfo.id is 512 bit public key + bytes memory _newNodeIp, + uint _newNodePort + ) internal pure returns (bool) { + require((_ballotType >= uint256(BallotTypes.MemberAdd)) && (_ballotType <= uint256(BallotTypes.MemberChange)), "Invalid Ballot Type"); + + if (_ballotType == uint256(BallotTypes.MemberRemoval)) { + require(_oldStakerAddress != address(0), "Invalid old staker address"); + require(_newStakerAddress == address(0), "Invalid new staker address"); + require(_newVoterAddress == address(0), "Invalid new voter address"); + require(_newRewardAddress == address(0), "Invalid new reward address"); + require(_newName.length == 0, "Invalid new node name"); + require(_newNodeId.length == 0, "Invalid new node id"); + require(_newNodeIp.length == 0, "Invalid new node IP"); + require(_newNodePort == 0, "Invalid new node Port"); + } else { + require(_newName.length > 0, "Invalid new node name"); + require(_newNodeId.length == 64, "Invalid new node id"); + require(_newNodeIp.length > 0, "Invalid new node IP"); + require(_newNodePort > 0, "Invalid new node Port"); + if (_ballotType == uint256(BallotTypes.MemberAdd)) { + require(_oldStakerAddress == address(0), "Invalid old staker address"); + require(_newStakerAddress != address(0), "Invalid new staker address"); + require(_newVoterAddress != address(0), "Invalid new voter address"); + require(_newRewardAddress != address(0), "Invalid new reward address"); + } else if (_ballotType == uint256(BallotTypes.MemberChange)) { + require(_oldStakerAddress != address(0), "Invalid old staker address"); + require(_newStakerAddress != address(0), "Invalid new staker address"); + require(_newVoterAddress != address(0), "Invalid new voter address"); + require(_newRewardAddress != address(0), "Invalid new reward address"); + } + } + + return true; + } + + function _areVariableBallotParamValid( + uint256 _ballotType, + bytes32 _envVariableName, + bytes memory _envVariableValue + ) internal pure returns (bool) { + require(_ballotType == uint256(BallotTypes.EnvValChange), "Invalid Ballot Type"); + require(_envVariableName > 0, "Invalid environment variable name"); + require(_envVariableValue.length > 0, "Invalid environment variable value"); + + return true; + } + + // update ballot + function _updateBallotForVote(uint256 _ballotId, address _voter, uint256 _decision, uint256 _power) internal { + // c1. actionType 범위 + require((_decision == uint256(DecisionTypes.Accept)) || (_decision == uint256(DecisionTypes.Reject)), "Invalid decision"); + // c2. ballotId 존재 하는지 확인 + require(ballotBasicMap[_ballotId].id == _ballotId, "not existed Ballot"); + // c3. 이미 vote 했는지 확인 + require(hasVotedMap[_ballotId][_voter] == false, "already voted"); + + //1.get ballotBasic + BallotBasic storage _ballot = ballotBasicMap[_ballotId]; + //2. 투표 여부 등록 + hasVotedMap[_ballotId][_voter] = true; + //3. update totalVoters + _ballot.totalVoters = _ballot.totalVoters + 1; + //4. Update power of accept/reject + if (_decision == uint256(DecisionTypes.Accept)) { + _ballot.powerOfAccepts = _ballot.powerOfAccepts + _power; + } else { + _ballot.powerOfRejects = _ballot.powerOfRejects + _power; + } + } + + function upgradeBallotStorage(address newImp) external onlyOwner { + if (newImp != address(0)) { + _authorizeUpgrade(newImp); + _upgradeToAndCallUUPS(newImp, new bytes(0), false); + } + } + + function _authorizeUpgrade(address newImplementation) internal override onlyOwner {} + + // Genernal Purpose + + struct BallotExecute { + address target; + uint256 value; + bytes data; + } + mapping(uint => BallotExecute) private __ballotExecuteMap; + + function createBallotForExecute( + uint256 _id, + uint256 _ballotType, + uint256 _duration, + address _creator, + address _target, + uint256 _value, + bytes memory _calldata + ) external override onlyGov notDisabled { + require(_ballotType == uint256(BallotTypes.Execute), "Invalid Ballot Type"); + require(_target != address(0), "Invalid target address"); + // ballot basic + _createBallot(_id, _ballotType, _duration, _creator); + // ballot executeMap + __ballotExecuteMap[_id] = BallotExecute({ target: _target, value: _value, data: _calldata }); + } + + function getBallotExecute(uint256 _id) external view override returns (address, uint256, bytes memory) { + BallotExecute memory _ballot = __ballotExecuteMap[_id]; + return (_ballot.target, _ballot.value, _ballot.data); + } + + /** + * @dev This empty reserved space is put in place to allow future versions to add new + * variables without shifting down storage in the inheritance chain. + * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps + */ + uint256[40] private __gap; } diff --git a/wemix/governance-contract/contracts/storage/EnvStorage.sol b/wemix/governance-contract/contracts/storage/EnvStorage.sol index 82a3f7ce6882..c6dd88efdf7a 100644 --- a/wemix/governance-contract/contracts/storage/EnvStorage.sol +++ b/wemix/governance-contract/contracts/storage/EnvStorage.sol @@ -5,9 +5,9 @@ import "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; import "@openzeppelin/contracts/proxy/beacon/IBeacon.sol"; contract EnvStorage is ERC1967Proxy, IBeacon { - constructor(address _implementation) ERC1967Proxy(_implementation, "") {} + constructor(address _implementation) ERC1967Proxy(_implementation, "") {} - function implementation() external view override returns (address) { - return _implementation(); - } + function implementation() external view override returns (address) { + return _implementation(); + } } diff --git a/wemix/governance-contract/contracts/storage/EnvStorageImp.sol b/wemix/governance-contract/contracts/storage/EnvStorageImp.sol index 391e744e3fcb..e29644c92032 100644 --- a/wemix/governance-contract/contracts/storage/EnvStorageImp.sol +++ b/wemix/governance-contract/contracts/storage/EnvStorageImp.sol @@ -7,12 +7,7 @@ import "../abstract/AEnvStorage.sol"; import "@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol"; import "../interface/IEnvStorage.sol"; -contract EnvStorageImp is - AEnvStorage, - EnvConstants, - UUPSUpgradeable, - IEnvStorage -{ +contract EnvStorageImp is AEnvStorage, EnvConstants, UUPSUpgradeable, IEnvStorage { event UpgradeImplementation(address indexed implementation); /// @custom:oz-upgrades-unsafe-allow constructor @@ -20,15 +15,8 @@ contract EnvStorageImp is _disableInitializers(); } - function initialize( - address _registry, - bytes32[] memory names, - uint256[] memory infos - ) public initializer { - require( - _registry != _getImplementation(), - "registry should not be same as implementation" - ); + function initialize(address _registry, bytes32[] memory names, uint256[] memory infos) public initializer { + require(_registry != _getImplementation(), "registry should not be same as implementation"); __Ownable_init(); setRegistry(_registry); @@ -73,9 +61,7 @@ contract EnvStorageImp is return getUint(MAX_IDLE_BLOCK_INTERVAL_NAME); } - function _authorizeUpgrade( - address newImplementation - ) internal override onlyGov {} + function _authorizeUpgrade(address newImplementation) internal override onlyGov {} function setBlocksPer(uint256 _value) public onlyGov { setUint(BLOCKS_PER_NAME, _value); @@ -109,15 +95,11 @@ contract EnvStorageImp is setBlocksPer(toUint(_value)); } - function setBallotDurationMinByBytes( - bytes memory _value - ) public override onlyGov { + function setBallotDurationMinByBytes(bytes memory _value) public override onlyGov { setBallotDurationMin(toUint(_value)); } - function setBallotDurationMaxByBytes( - bytes memory _value - ) public override onlyGov { + function setBallotDurationMaxByBytes(bytes memory _value) public override onlyGov { setBallotDurationMax(toUint(_value)); } @@ -133,32 +115,17 @@ contract EnvStorageImp is // setGasPrice(toUint(_value)); // } - function setMaxIdleBlockIntervalByBytes( - bytes memory _value - ) public override onlyGov { + function setMaxIdleBlockIntervalByBytes(bytes memory _value) public override onlyGov { setMaxIdleBlockInterval(toUint(_value)); } //=======NXTMeta=======/ - function getBallotDurationMinMax() - public - view - override - returns (uint256, uint256) - { - return ( - getUint(BALLOT_DURATION_MIN_NAME), - getUint(BALLOT_DURATION_MAX_NAME) - ); + function getBallotDurationMinMax() public view override returns (uint256, uint256) { + return (getUint(BALLOT_DURATION_MIN_NAME), getUint(BALLOT_DURATION_MAX_NAME)); } - function getStakingMinMax() - public - view - override - returns (uint256, uint256) - { + function getStakingMinMax() public view override returns (uint256, uint256) { return (getUint(STAKING_MIN_NAME), getUint(STAKING_MAX_NAME)); } @@ -178,12 +145,7 @@ contract EnvStorageImp is return getUint(MAX_BASE_FEE_NAME); } - function getBlockRewardDistributionMethod() - public - view - override - returns (uint256, uint256, uint256, uint256) - { + function getBlockRewardDistributionMethod() public view override returns (uint256, uint256, uint256, uint256) { return ( getUint(BLOCK_REWARD_DISTRIBUTION_BLOCK_PRODUCER_NAME), getUint(BLOCK_REWARD_DISTRIBUTION_STAKING_REWARD_NAME), @@ -192,17 +154,8 @@ contract EnvStorageImp is ); } - function getGasLimitAndBaseFee() - public - view - override - returns (uint256, uint256, uint256) - { - return ( - getUint(BLOCK_GASLIMIT_NAME), - getUint(BASE_FEE_MAX_CHANGE_RATE_NAME), - getUint(GAS_TARGET_PERCENTAGE_NAME) - ); + function getGasLimitAndBaseFee() public view override returns (uint256, uint256, uint256) { + return (getUint(BLOCK_GASLIMIT_NAME), getUint(BASE_FEE_MAX_CHANGE_RATE_NAME), getUint(GAS_TARGET_PERCENTAGE_NAME)); } // function getStakingRewardAddress() public override view returns(address){ @@ -217,23 +170,14 @@ contract EnvStorageImp is // return getAddress(MAINTENANCE_ADDRESS_NAME); // } - function setBallotDurationMinMax( - uint256 _min, - uint256 _max - ) public override onlyGov { - require( - _min <= _max, - "Minimum duration must be smaller and equal than maximum duration" - ); + function setBallotDurationMinMax(uint256 _min, uint256 _max) public override onlyGov { + require(_min <= _max, "Minimum duration must be smaller and equal than maximum duration"); setUint(BALLOT_DURATION_MIN_NAME, _min); setUint(BALLOT_DURATION_MAX_NAME, _max); } function setStakingMinMax(uint256 _min, uint256 _max) public onlyGov { - require( - _min <= _max, - "Minimum staking must be smaller and equal than maximum staking" - ); + require(_min <= _max, "Minimum staking must be smaller and equal than maximum staking"); setUint(STAKING_MIN_NAME, _min); setUint(STAKING_MAX_NAME, _max); } @@ -260,11 +204,7 @@ contract EnvStorageImp is uint256 _ecofund, uint256 _maintenance ) public onlyGov { - require( - (_block_producer + _staking_reward + _ecofund + _maintenance) == - DENOMINATOR, - "Wrong reward distrubtion ratio" - ); + require((_block_producer + _staking_reward + _ecofund + _maintenance) == DENOMINATOR, "Wrong reward distrubtion ratio"); setUint(BLOCK_REWARD_DISTRIBUTION_BLOCK_PRODUCER_NAME, _block_producer); setUint(BLOCK_REWARD_DISTRIBUTION_STAKING_REWARD_NAME, _staking_reward); setUint(BLOCK_REWARD_DISTRIBUTION_ECOSYSTEM_NAME, _ecofund); @@ -283,35 +223,25 @@ contract EnvStorageImp is setUint(MAX_BASE_FEE_NAME, _maxBaseFee); } - function setBallotDurationMinMaxByBytes( - bytes memory _value - ) public override onlyGov { + function setBallotDurationMinMaxByBytes(bytes memory _value) public override onlyGov { (uint256 _min, uint256 _max) = to2Uint(_value); setBallotDurationMinMax(_min, _max); } - function setStakingMinMaxByBytes( - bytes memory _value - ) public override onlyGov { + function setStakingMinMaxByBytes(bytes memory _value) public override onlyGov { (uint256 _min, uint256 _max) = to2Uint(_value); setStakingMinMax(_min, _max); } - function setBlockCreationTimeByBytes( - bytes memory _value - ) public override onlyGov { + function setBlockCreationTimeByBytes(bytes memory _value) public override onlyGov { setBlockCreationTime(toUint(_value)); } - function setBlockRewardAmountByBytes( - bytes memory _value - ) public override onlyGov { + function setBlockRewardAmountByBytes(bytes memory _value) public override onlyGov { setBlockRewardAmount(toUint(_value)); } - function setMaxPriorityFeePerGasByBytes( - bytes memory _value - ) public override onlyGov { + function setMaxPriorityFeePerGasByBytes(bytes memory _value) public override onlyGov { setMaxPriorityFeePerGas(toUint(_value)); } @@ -319,59 +249,24 @@ contract EnvStorageImp is setMaxBaseFee(toUint(_value)); } - function setBlockRewardDistributionMethodByBytes( - bytes memory _value - ) public override onlyGov { - ( - uint256 _block_producer, - uint256 _staking_reward, - uint256 _ecosystem, - uint256 _maintenance - ) = to4Uint(_value); - setBlockRewardDistributionMethod( - _block_producer, - _staking_reward, - _ecosystem, - _maintenance - ); + function setBlockRewardDistributionMethodByBytes(bytes memory _value) public override onlyGov { + (uint256 _block_producer, uint256 _staking_reward, uint256 _ecosystem, uint256 _maintenance) = to4Uint(_value); + setBlockRewardDistributionMethod(_block_producer, _staking_reward, _ecosystem, _maintenance); } - function setGasLimitAndBaseFeeByBytes( - bytes memory _value - ) public override onlyGov { - ( - uint256 _block_GasLimit, - uint256 _baseFeeMaxChangeRate, - uint256 _gasTargetPercentage, - uint256 _maxBaseFee - ) = to4Uint(_value); - setGasLimitAndBaseFee( - _block_GasLimit, - _baseFeeMaxChangeRate, - _gasTargetPercentage, - _maxBaseFee - ); + function setGasLimitAndBaseFeeByBytes(bytes memory _value) public override onlyGov { + (uint256 _block_GasLimit, uint256 _baseFeeMaxChangeRate, uint256 _gasTargetPercentage, uint256 _maxBaseFee) = to4Uint(_value); + setGasLimitAndBaseFee(_block_GasLimit, _baseFeeMaxChangeRate, _gasTargetPercentage, _maxBaseFee); } - function checkVariableCondition( - bytes32 envKey, - bytes memory envVal - ) external pure override returns (bool) { + function checkVariableCondition(bytes32 envKey, bytes memory envVal) external pure override returns (bool) { if (envKey == BLOCK_REWARD_DISTRIBUTION_METHOD_NAME) { - ( - uint256 _block_producer, - uint256 _staking_reward, - uint256 _ecofund, - uint256 _maintenance - ) = abi.decode(envVal, (uint256, uint256, uint256, uint256)); - if ( - (_block_producer + _staking_reward + _ecofund + _maintenance) != - DENOMINATOR - ) return false; - } else if ( - envKey == STAKING_MIN_MAX_NAME || - envKey == BALLOT_DURATION_MIN_MAX_NAME - ) { + (uint256 _block_producer, uint256 _staking_reward, uint256 _ecofund, uint256 _maintenance) = abi.decode( + envVal, + (uint256, uint256, uint256, uint256) + ); + if ((_block_producer + _staking_reward + _ecofund + _maintenance) != DENOMINATOR) return false; + } else if (envKey == STAKING_MIN_MAX_NAME || envKey == BALLOT_DURATION_MIN_MAX_NAME) { (uint256 min, uint256 max) = abi.decode(envVal, (uint256, uint256)); if (min > max) return false; } else if (envKey == BLOCK_CREATION_TIME_NAME) { @@ -381,10 +276,7 @@ contract EnvStorageImp is return true; } - function setVariable( - bytes32 envKey, - bytes memory envVal - ) external override { + function setVariable(bytes32 envKey, bytes memory envVal) external override { if (envKey == BLOCKS_PER_NAME) { setBlocksPerByBytes(envVal); } else if (envKey == BALLOT_DURATION_MIN_MAX_NAME) { @@ -412,9 +304,7 @@ contract EnvStorageImp is } } - function toBytes32( - bytes memory _input - ) internal pure returns (bytes32 _output) { + function toBytes32(bytes memory _input) internal pure returns (bytes32 _output) { assembly { _output := mload(add(_input, 32)) } @@ -426,30 +316,20 @@ contract EnvStorageImp is } } - function toUint( - bytes memory _input - ) internal pure returns (uint256 _output) { + function toUint(bytes memory _input) internal pure returns (uint256 _output) { assembly { _output := mload(add(_input, 32)) } } - function to2Uint( - bytes memory _input - ) internal pure returns (uint256 _output0, uint256 _output1) { + function to2Uint(bytes memory _input) internal pure returns (uint256 _output0, uint256 _output1) { assembly { _output0 := mload(add(_input, 32)) _output1 := mload(add(_input, 64)) } } - function to3Uint( - bytes memory _input - ) - internal - pure - returns (uint256 _output0, uint256 _output1, uint256 _output2) - { + function to3Uint(bytes memory _input) internal pure returns (uint256 _output0, uint256 _output1, uint256 _output2) { assembly { _output0 := mload(add(_input, 32)) _output1 := mload(add(_input, 64)) @@ -457,18 +337,7 @@ contract EnvStorageImp is } } - function to4Uint( - bytes memory _input - ) - internal - pure - returns ( - uint256 _output0, - uint256 _output1, - uint256 _output2, - uint256 _output3 - ) - { + function to4Uint(bytes memory _input) internal pure returns (uint256 _output0, uint256 _output1, uint256 _output2, uint256 _output3) { assembly { _output0 := mload(add(_input, 32)) _output1 := mload(add(_input, 64)) @@ -477,9 +346,7 @@ contract EnvStorageImp is } } - function toAddress( - bytes memory _input - ) internal pure returns (address _output) { + function toAddress(bytes memory _input) internal pure returns (address _output) { _output = abi.decode(_input, (address)); // assembly { // _output := mload(add(_input, 20)) diff --git a/wemix/governance-contract/contracts/storage/EternalStorage.sol b/wemix/governance-contract/contracts/storage/EternalStorage.sol index d92448656902..b55908036a6a 100644 --- a/wemix/governance-contract/contracts/storage/EternalStorage.sol +++ b/wemix/governance-contract/contracts/storage/EternalStorage.sol @@ -7,141 +7,141 @@ pragma solidity ^0.8.0; * are stored in a set of mappings indexed by hash names. */ contract EternalStorage { - struct Storage { - mapping(bytes32 => bool) _bool; - mapping(bytes32 => int256) _int; - mapping(bytes32 => uint256) _uint; - mapping(bytes32 => string) _string; - mapping(bytes32 => address) _address; - mapping(bytes32 => bytes) _bytes; - mapping(bytes32 => bytes32) _bytes32; - } - - Storage internal s; - - /** - * @dev Get the value stored of a boolean variable by the hash name - * @param h The keccak256 hash of the variable name - */ - function getBoolean(bytes32 h) public view returns (bool) { - return s._bool[h]; - } - - /** - * @dev Get the value stored of a int variable by the hash name - * @param h The keccak256 hash of the variable name - */ - function getInt(bytes32 h) public view returns (int) { - return s._int[h]; - } - - /** - * @dev Get the value stored of a uint variable by the hash name - * @param h The keccak256 hash of the variable name - */ - function getUint(bytes32 h) public view returns (uint256) { - return s._uint[h]; - } - - /** - * @dev Get the value stored of a address variable by the hash name - * @param h The keccak256 hash of the variable name - */ - function getAddress(bytes32 h) public view returns (address) { - return s._address[h]; - } - - /** - * @dev Get the value stored of a string variable by the hash name - * @param h The keccak256 hash of the variable name - */ - function getString(bytes32 h) public view returns (string memory) { - return s._string[h]; - } - - /** - * @dev Get the value stored of a bytes variable by the hash name - * @param h The keccak256 hash of the variable name - */ - function getBytes(bytes32 h) public view returns (bytes memory) { - return s._bytes[h]; - } - - /** - * @dev Get the value stored of a bytes variable by the hash name - * @param h The keccak256 hash of the variable name - */ - function getBytes32(bytes32 h) public view returns (bytes32) { - return s._bytes32[h]; - } - - /** - * @dev Allows the owner to set a value for a boolean variable - * @param h The keccak256 hash of the variable name - * @param v The value to be stored - */ - function _setBoolean(bytes32 h, bool v) internal { - s._bool[h] = v; - } - - /** - * @dev Allows the owner to set a value for a int variable - * @param h The keccak256 hash of the variable name - * @param v The value to be stored - */ - function _setInt(bytes32 h, int256 v) internal { - s._int[h] = v; - } - - /** - * @dev Allows the owner to set a value for a boolean variable - * @param h The keccak256 hash of the variable name - * @param v The value to be stored - */ - function _setUint(bytes32 h, uint256 v) internal { - s._uint[h] = v; - } - - /** - * @dev Allows the owner to set a value for a address variable - * @param h The keccak256 hash of the variable name - * @param v The value to be stored - */ - function _setAddress(bytes32 h, address v) internal { - s._address[h] = v; - } - - /** - * @dev Allows the owner to set a value for a string variable - * @param h The keccak256 hash of the variable name - * @param v The value to be stored - */ - function _setString(bytes32 h, string memory v) internal { - s._string[h] = v; - } - - /** - * @dev Allows the owner to set a value for a bytes variable - * @param h The keccak256 hash of the variable name - * @param v The value to be stored - */ - function _setBytes(bytes32 h, bytes memory v) internal { - s._bytes[h] = v; - } - - /** - * @dev Allows the owner to set a value for a bytes32 variable - * @param h The keccak256 hash of the variable name - * @param v The value to be stored - */ - function _setBytes32(bytes32 h, bytes32 v) internal { - s._bytes32[h] = v; - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[49] private __gap; + struct Storage { + mapping(bytes32 => bool) _bool; + mapping(bytes32 => int256) _int; + mapping(bytes32 => uint256) _uint; + mapping(bytes32 => string) _string; + mapping(bytes32 => address) _address; + mapping(bytes32 => bytes) _bytes; + mapping(bytes32 => bytes32) _bytes32; + } + + Storage internal s; + + /** + * @dev Get the value stored of a boolean variable by the hash name + * @param h The keccak256 hash of the variable name + */ + function getBoolean(bytes32 h) public view returns (bool) { + return s._bool[h]; + } + + /** + * @dev Get the value stored of a int variable by the hash name + * @param h The keccak256 hash of the variable name + */ + function getInt(bytes32 h) public view returns (int) { + return s._int[h]; + } + + /** + * @dev Get the value stored of a uint variable by the hash name + * @param h The keccak256 hash of the variable name + */ + function getUint(bytes32 h) public view returns (uint256) { + return s._uint[h]; + } + + /** + * @dev Get the value stored of a address variable by the hash name + * @param h The keccak256 hash of the variable name + */ + function getAddress(bytes32 h) public view returns (address) { + return s._address[h]; + } + + /** + * @dev Get the value stored of a string variable by the hash name + * @param h The keccak256 hash of the variable name + */ + function getString(bytes32 h) public view returns (string memory) { + return s._string[h]; + } + + /** + * @dev Get the value stored of a bytes variable by the hash name + * @param h The keccak256 hash of the variable name + */ + function getBytes(bytes32 h) public view returns (bytes memory) { + return s._bytes[h]; + } + + /** + * @dev Get the value stored of a bytes variable by the hash name + * @param h The keccak256 hash of the variable name + */ + function getBytes32(bytes32 h) public view returns (bytes32) { + return s._bytes32[h]; + } + + /** + * @dev Allows the owner to set a value for a boolean variable + * @param h The keccak256 hash of the variable name + * @param v The value to be stored + */ + function _setBoolean(bytes32 h, bool v) internal { + s._bool[h] = v; + } + + /** + * @dev Allows the owner to set a value for a int variable + * @param h The keccak256 hash of the variable name + * @param v The value to be stored + */ + function _setInt(bytes32 h, int256 v) internal { + s._int[h] = v; + } + + /** + * @dev Allows the owner to set a value for a boolean variable + * @param h The keccak256 hash of the variable name + * @param v The value to be stored + */ + function _setUint(bytes32 h, uint256 v) internal { + s._uint[h] = v; + } + + /** + * @dev Allows the owner to set a value for a address variable + * @param h The keccak256 hash of the variable name + * @param v The value to be stored + */ + function _setAddress(bytes32 h, address v) internal { + s._address[h] = v; + } + + /** + * @dev Allows the owner to set a value for a string variable + * @param h The keccak256 hash of the variable name + * @param v The value to be stored + */ + function _setString(bytes32 h, string memory v) internal { + s._string[h] = v; + } + + /** + * @dev Allows the owner to set a value for a bytes variable + * @param h The keccak256 hash of the variable name + * @param v The value to be stored + */ + function _setBytes(bytes32 h, bytes memory v) internal { + s._bytes[h] = v; + } + + /** + * @dev Allows the owner to set a value for a bytes32 variable + * @param h The keccak256 hash of the variable name + * @param v The value to be stored + */ + function _setBytes32(bytes32 h, bytes32 v) internal { + s._bytes32[h] = v; + } + + /** + * @dev This empty reserved space is put in place to allow future versions to add new + * variables without shifting down storage in the inheritance chain. + * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps + */ + uint256[49] private __gap; } diff --git a/wemix/governance-contract/test/gov_test.go b/wemix/governance-contract/test/gov_test.go index f960ab2e7ba3..9341ba4563ea 100644 --- a/wemix/governance-contract/test/gov_test.go +++ b/wemix/governance-contract/test/gov_test.go @@ -4,14 +4,17 @@ import ( "context" "math/big" "os" + "path/filepath" "testing" "time" + "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/log" + compile "github.com/ethereum/go-ethereum/wemix/governance-contract" "github.com/stretchr/testify/require" ) @@ -136,12 +139,6 @@ func TestGov(t *testing.T) { gov.ExpectedOk(gov.StakingImp.Transact(getTxOpt(t, "govMem1"), "deposit")) govMem1.Value = nil // proposal - node1 := nodeInfo{ - name: []byte("name1"), - enode: hexutil.MustDecode("0x777777777711c39f35f516fa664deaaaa13e85b2f7493f37f6144d86991ec012937307647bd3b9a82abe2974e1407241d54947bbb39763a4cac9f77166ad92a0"), - ip: []byte("127.0.0.2"), - port: big.NewInt(8542), - } gov.nodeInfos = append(gov.nodeInfos, node1) info := MemberInfo{ Staker: govMem1.From, @@ -2516,8 +2513,6 @@ func TestGov(t *testing.T) { gov.ExpectedOk(gov.StakingImp.Transact(govMem2, "deposit")) govMem2.Value = nil - node1 := gov.nodeInfos[1] - gov.ExpectedOk(gov.GovImp.Transact(gov.owner, "addProposalToAddMember", MemberInfo{ Staker: govMem2.From, Voter: govMem2.From, @@ -3133,5 +3128,332 @@ func TestGov(t *testing.T) { "No Permission", ) }) + t.Run("upgradeTo", func(t *testing.T) { + gov := NewGovernance(t).DeployContracts(t) + + var ( + callOpts = new(bind.CallOpts) + + getGasLimitAndBaseFee []interface{} + MBF *big.Int + ) + + require.NoError(t, gov.EnvStorageImp.Call(callOpts, &getGasLimitAndBaseFee, "getGasLimitAndBaseFee")) + require.NoError(t, gov.EnvStorageImp.Call(callOpts, &[]interface{}{&MBF}, "getMaxBaseFee")) + + newGovImp, _, err := gov.Deploy(compiled.GovImp.Deploy(gov.backend, gov.owner)) + require.NoError(t, err) + + ExpectedRevert(t, gov.ExpectedFail(gov.GovImp.Transact(gov.owner, "upgradeTo", newGovImp)), "Invalid access") + ExpectedRevert(t, gov.ExpectedFail(gov.GovImp.Transact(gov.owner, "upgradeToAndCall", newGovImp, []byte{})), "Invalid access") + }) + }) +} + +func TestExecute(t *testing.T) { + var ( + callOpts = new(bind.CallOpts) + ) + + gov := NewGovernance(t).DeployContracts(t) + testAddress, testContract, testABI := func() (common.Address, *bind.BoundContract, *abi.ABI) { + var testSource string = ` +pragma solidity ^0.8.0; +contract Test { + uint256 public a; + + receive() external payable { + a += msg.value; + } + + function add(uint256 b) external payable { + a += b + msg.value; + } +}` + var ( + dir = t.TempDir() + filename = "Test.sol" + ) + + require.NoError(t, os.WriteFile(filepath.Join(dir, filename), []byte(testSource), 0700)) + + compiled, err := compile.Compile(dir, filepath.Join(dir, filename)) + require.NoError(t, err) + Test := compiled["Test"] + testBind, err := newBindContract(Test) + require.NoError(t, err) + + aBI, err := parseABI(Test.Info.AbiDefinition) + require.NoError(t, err) + ta, _, tc, err := testBind.Deploy(gov.backend, gov.owner) + require.NoError(t, err) + gov.backend.Commit() + + return ta, tc, aBI + }() + + callA := func(t *testing.T) *big.Int { + var a = new(big.Int) + require.NoError(t, testContract.Call(callOpts, &[]interface{}{&a}, "a")) + return a + } + + t.Run("accept add by params", func(t *testing.T) { + calldata, err := testABI.Pack("add", big.NewInt(1)) + require.NoError(t, err) + + beforeA := callA(t) + + require.NoError(t, gov.ExpectedOk(gov.GovImp.Transact(gov.owner, "addProposalToExecute", testAddress, calldata, []byte("memo"), big.NewInt(86400)))) + var ballotIdx *big.Int + require.NoError(t, gov.GovImp.Call(callOpts, &[]interface{}{&ballotIdx}, "ballotLength")) + + gov.ExpectedOk(gov.GovImp.Transact(gov.owner, "vote", ballotIdx, true)) + var ( + length *big.Int + inVoting *big.Int + state *big.Int + isFinalized bool + ) + require.NoError(t, gov.GovImp.Call(callOpts, &[]interface{}{&length}, "voteLength")) + require.Equal(t, ballotIdx, length) + require.NoError(t, gov.GovImp.Call(callOpts, &[]interface{}{&inVoting}, "getBallotInVoting")) + require.True(t, inVoting.Sign() == 0) + getBallotState := []interface{}{} + require.NoError(t, gov.BallotStorageImp.Call(callOpts, &getBallotState, "getBallotState", ballotIdx)) + state, isFinalized = getBallotState[1].(*big.Int), getBallotState[2].(bool) + require.Equal(t, BallotStates.Accepted, state) + require.True(t, isFinalized) + + require.Equal(t, callA(t), new(big.Int).Add(beforeA, common.Big1)) + }) + t.Run("accept add by msg.value", func(t *testing.T) { + calldata := []byte{} + + governanceAddress := common.Address{} + require.NoError(t, gov.Registry.Call(callOpts, &[]interface{}{&governanceAddress}, "getContractAddress", ToBytes32("GovernanceContract"))) + require.NotEqual(t, common.Address{}, governanceAddress) + + beforeA := callA(t) + + gov.owner.Value = common.Big1 + require.NoError(t, gov.ExpectedOk(gov.GovImp.Transact(gov.owner, "addProposalToExecute", testAddress, calldata, []byte("memo"), big.NewInt(86400)))) + gov.owner.Value = nil + balance, err := gov.backend.BalanceAt(callOpts.Context, governanceAddress, nil) + require.NoError(t, err) + require.Equal(t, common.Big1, balance) + + var ballotIdx *big.Int + require.NoError(t, gov.GovImp.Call(callOpts, &[]interface{}{&ballotIdx}, "ballotLength")) + + beforeBalance, err := gov.backend.BalanceAt(callOpts.Context, testAddress, nil) + require.NoError(t, err) + + gov.ExpectedOk(gov.GovImp.Transact(gov.owner, "vote", ballotIdx, true)) + var ( + length *big.Int + inVoting *big.Int + state *big.Int + isFinalized bool + ) + require.NoError(t, gov.GovImp.Call(callOpts, &[]interface{}{&length}, "voteLength")) + require.Equal(t, ballotIdx, length) + require.NoError(t, gov.GovImp.Call(callOpts, &[]interface{}{&inVoting}, "getBallotInVoting")) + require.True(t, inVoting.Sign() == 0) + getBallotState := []interface{}{} + require.NoError(t, gov.BallotStorageImp.Call(callOpts, &getBallotState, "getBallotState", ballotIdx)) + state, isFinalized = getBallotState[1].(*big.Int), getBallotState[2].(bool) + require.Equal(t, BallotStates.Accepted, state) + require.True(t, isFinalized) + + require.Equal(t, callA(t), new(big.Int).Add(beforeA, common.Big1)) + + balance, err = gov.backend.BalanceAt(callOpts.Context, governanceAddress, nil) + require.NoError(t, err) + require.True(t, balance.Sign() == 0) + + balance, err = gov.backend.BalanceAt(callOpts.Context, testAddress, nil) + require.NoError(t, err) + require.Equal(t, big.NewInt(1), new(big.Int).Sub(balance, beforeBalance)) + }) + t.Run("accept add by params, msg.value", func(t *testing.T) { + calldata, err := testABI.Pack("add", big.NewInt(1)) + require.NoError(t, err) + + beforeA := callA(t) + + governanceAddress := common.Address{} + require.NoError(t, gov.Registry.Call(callOpts, &[]interface{}{&governanceAddress}, "getContractAddress", ToBytes32("GovernanceContract"))) + require.NotEqual(t, common.Address{}, governanceAddress) + + gov.owner.Value = common.Big1 + require.NoError(t, gov.ExpectedOk(gov.GovImp.Transact(gov.owner, "addProposalToExecute", testAddress, calldata, []byte("memo"), big.NewInt(86400)))) + gov.owner.Value = nil + balance, err := gov.backend.BalanceAt(callOpts.Context, governanceAddress, nil) + require.NoError(t, err) + require.Equal(t, common.Big1, balance) + + var ballotIdx *big.Int + require.NoError(t, gov.GovImp.Call(callOpts, &[]interface{}{&ballotIdx}, "ballotLength")) + + beforeBalance, err := gov.backend.BalanceAt(callOpts.Context, testAddress, nil) + require.NoError(t, err) + + gov.ExpectedOk(gov.GovImp.Transact(gov.owner, "vote", ballotIdx, true)) + var ( + length *big.Int + inVoting *big.Int + state *big.Int + isFinalized bool + ) + require.NoError(t, gov.GovImp.Call(callOpts, &[]interface{}{&length}, "voteLength")) + require.Equal(t, ballotIdx, length) + require.NoError(t, gov.GovImp.Call(callOpts, &[]interface{}{&inVoting}, "getBallotInVoting")) + require.True(t, inVoting.Sign() == 0) + getBallotState := []interface{}{} + require.NoError(t, gov.BallotStorageImp.Call(callOpts, &getBallotState, "getBallotState", ballotIdx)) + state, isFinalized = getBallotState[1].(*big.Int), getBallotState[2].(bool) + require.Equal(t, BallotStates.Accepted, state) + require.True(t, isFinalized) + + require.Equal(t, callA(t), new(big.Int).Add(beforeA, common.Big2)) + + balance, err = gov.backend.BalanceAt(callOpts.Context, governanceAddress, nil) + require.NoError(t, err) + require.True(t, balance.Sign() == 0) + + balance, err = gov.backend.BalanceAt(callOpts.Context, testAddress, nil) + require.NoError(t, err) + require.Equal(t, big.NewInt(1), new(big.Int).Sub(balance, beforeBalance)) + }) + t.Run("reject add by params", func(t *testing.T) { + calldata, err := testABI.Pack("add", big.NewInt(1)) + require.NoError(t, err) + + beforeA := callA(t) + + require.NoError(t, gov.ExpectedOk(gov.GovImp.Transact(gov.owner, "addProposalToExecute", testAddress, calldata, []byte("memo"), big.NewInt(86400)))) + + var ballotIdx *big.Int + require.NoError(t, gov.GovImp.Call(callOpts, &[]interface{}{&ballotIdx}, "ballotLength")) + + gov.ExpectedOk(gov.GovImp.Transact(gov.owner, "vote", ballotIdx, false)) + var ( + length *big.Int + inVoting *big.Int + state *big.Int + isFinalized bool + ) + require.NoError(t, gov.GovImp.Call(callOpts, &[]interface{}{&length}, "voteLength")) + require.Equal(t, ballotIdx, length) + require.NoError(t, gov.GovImp.Call(callOpts, &[]interface{}{&inVoting}, "getBallotInVoting")) + require.True(t, inVoting.Sign() == 0) + getBallotState := []interface{}{} + require.NoError(t, gov.BallotStorageImp.Call(callOpts, &getBallotState, "getBallotState", ballotIdx)) + state, isFinalized = getBallotState[1].(*big.Int), getBallotState[2].(bool) + require.Equal(t, BallotStates.Rejected, state) + require.True(t, isFinalized) + + require.True(t, new(big.Int).Sub(callA(t), beforeA).Sign() == 0) + }) + t.Run("reject add by msg.value", func(t *testing.T) { + calldata := []byte{} + + beforeA := callA(t) + + governanceAddress := common.Address{} + require.NoError(t, gov.Registry.Call(callOpts, &[]interface{}{&governanceAddress}, "getContractAddress", ToBytes32("GovernanceContract"))) + require.NotEqual(t, common.Address{}, governanceAddress) + + gov.owner.Value = common.Big1 + require.NoError(t, gov.ExpectedOk(gov.GovImp.Transact(gov.owner, "addProposalToExecute", testAddress, calldata, []byte("memo"), big.NewInt(86400)))) + gov.owner.Value = nil + + balance, err := gov.backend.BalanceAt(callOpts.Context, governanceAddress, nil) + require.NoError(t, err) + require.Equal(t, common.Big1, balance) + + var ballotIdx *big.Int + require.NoError(t, gov.GovImp.Call(callOpts, &[]interface{}{&ballotIdx}, "ballotLength")) + + beforeBalance, err := gov.backend.BalanceAt(callOpts.Context, testAddress, nil) + require.NoError(t, err) + + gov.ExpectedOk(gov.GovImp.Transact(gov.owner, "vote", ballotIdx, false)) + var ( + length *big.Int + inVoting *big.Int + state *big.Int + isFinalized bool + ) + require.NoError(t, gov.GovImp.Call(callOpts, &[]interface{}{&length}, "voteLength")) + require.Equal(t, ballotIdx, length) + require.NoError(t, gov.GovImp.Call(callOpts, &[]interface{}{&inVoting}, "getBallotInVoting")) + require.True(t, inVoting.Sign() == 0) + getBallotState := []interface{}{} + require.NoError(t, gov.BallotStorageImp.Call(callOpts, &getBallotState, "getBallotState", ballotIdx)) + state, isFinalized = getBallotState[1].(*big.Int), getBallotState[2].(bool) + require.Equal(t, BallotStates.Rejected, state) + require.True(t, isFinalized) + + require.True(t, new(big.Int).Sub(callA(t), beforeA).Sign() == 0) + + balance, err = gov.backend.BalanceAt(callOpts.Context, governanceAddress, nil) + require.NoError(t, err) + require.True(t, balance.Sign() == 0) + + balance, err = gov.backend.BalanceAt(callOpts.Context, testAddress, nil) + require.NoError(t, err) + require.True(t, new(big.Int).Sub(balance, beforeBalance).Sign() == 0) + }) + t.Run("reject add by params, msg.value", func(t *testing.T) { + calldata, err := testABI.Pack("add", big.NewInt(1)) + require.NoError(t, err) + + governanceAddress := common.Address{} + require.NoError(t, gov.Registry.Call(callOpts, &[]interface{}{&governanceAddress}, "getContractAddress", ToBytes32("GovernanceContract"))) + require.NotEqual(t, common.Address{}, governanceAddress) + + beforeA := callA(t) + + gov.owner.Value = common.Big1 + require.NoError(t, gov.ExpectedOk(gov.GovImp.Transact(gov.owner, "addProposalToExecute", testAddress, calldata, []byte("memo"), big.NewInt(86400)))) + gov.owner.Value = nil + balance, err := gov.backend.BalanceAt(callOpts.Context, governanceAddress, nil) + require.NoError(t, err) + require.Equal(t, common.Big1, balance) + + var ballotIdx *big.Int + require.NoError(t, gov.GovImp.Call(callOpts, &[]interface{}{&ballotIdx}, "ballotLength")) + + beforeBalance, err := gov.backend.BalanceAt(callOpts.Context, testAddress, nil) + require.NoError(t, err) + + require.NoError(t, gov.ExpectedOk(gov.GovImp.Transact(gov.owner, "vote", ballotIdx, false))) + var ( + length *big.Int + inVoting *big.Int + state *big.Int + isFinalized bool + ) + require.NoError(t, gov.GovImp.Call(callOpts, &[]interface{}{&length}, "voteLength")) + require.Equal(t, ballotIdx, length) + require.NoError(t, gov.GovImp.Call(callOpts, &[]interface{}{&inVoting}, "getBallotInVoting")) + require.True(t, inVoting.Sign() == 0) + getBallotState := []interface{}{} + require.NoError(t, gov.BallotStorageImp.Call(callOpts, &getBallotState, "getBallotState", ballotIdx)) + state, isFinalized = getBallotState[1].(*big.Int), getBallotState[2].(bool) + require.Equal(t, BallotStates.Rejected, state) + require.True(t, isFinalized) + + require.True(t, new(big.Int).Sub(callA(t), beforeA).Sign() == 0) + + balance, err = gov.backend.BalanceAt(callOpts.Context, governanceAddress, nil) + require.NoError(t, err) + require.True(t, balance.Sign() == 0) + + balance, err = gov.backend.BalanceAt(callOpts.Context, testAddress, nil) + require.NoError(t, err) + require.True(t, new(big.Int).Sub(balance, beforeBalance).Sign() == 0) }) }