Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
- Contract name:
- AddressUpdater
- Optimization enabled
- true
- Compiler version
- v0.7.6+commit.7338295f
- Optimization runs
- 200
- Verified at
- 2022-07-13T21:11:16.243791Z
Constructor Arguments
0000000000000000000000004598a6c05910ab914f0cbaaca1911cd337d10d29
Arg [0] (address) : 0x4598a6c05910ab914f0cbaaca1911cd337d10d29
./contracts/addressUpdater/implementation/AddressUpdater.sol
// SPDX-License-Identifier: MIT pragma solidity 0.7.6; pragma abicoder v2; import "../../governance/implementation/Governed.sol"; import "../interface/IIAddressUpdatable.sol"; contract AddressUpdater is Governed { string internal constant ERR_ARRAY_LENGTHS = "array lengths do not match"; string internal constant ERR_ADDRESS_ZERO = "address zero"; string[] internal contractNames; mapping(bytes32 => address) internal contractAddresses; constructor(address _governance) Governed(_governance) {} /** * @notice set/update contract names/addresses and then apply changes to other contracts * @param _contractNames contracts names * @param _contractAddresses addresses of corresponding contracts names * @param _contractsToUpdate contracts to be updated */ function update( string[] memory _contractNames, address[] memory _contractAddresses, IIAddressUpdatable[] memory _contractsToUpdate ) external onlyGovernance { _addOrUpdateContractNamesAndAddresses(_contractNames, _contractAddresses); _updateContractAddresses(_contractsToUpdate); } /** * @notice Updates contract addresses on all contracts implementing IIAddressUpdatable interface * @param _contractsToUpdate contracts to be updated */ function updateContractAddresses(IIAddressUpdatable[] memory _contractsToUpdate) external onlyImmediateGovernance { _updateContractAddresses(_contractsToUpdate); } /** * @notice Add or update contract names and addreses that are later used in updateContractAddresses calls * @param _contractNames contracts names * @param _contractAddresses addresses of corresponding contracts names */ function addOrUpdateContractNamesAndAddresses( string[] memory _contractNames, address[] memory _contractAddresses ) external onlyGovernance { _addOrUpdateContractNamesAndAddresses(_contractNames, _contractAddresses); } /** * @notice Returns the contract names and the corresponding addresses */ function getContractNamesAndAddresses() external view returns( string[] memory _contractNames, address[] memory _contractAddresses ) { _contractNames = contractNames; uint256 len = _contractNames.length; _contractAddresses = new address[](len); while (len > 0) { len--; _contractAddresses[len] = contractAddresses[_keccak256AbiEncode(_contractNames[len])]; } } /** * @notice Returns contract address for the given name and reverts if address(0) */ function getContractAddress(string memory _name) external view returns(address) { address a = contractAddresses[_keccak256AbiEncode(_name)]; require(a != address(0), ERR_ADDRESS_ZERO); return a; } /** * @notice Add or update contract names and addreses that are later used in updateContractAddresses calls * @param _contractNames contracts names * @param _contractAddresses addresses of corresponding contracts names */ function _addOrUpdateContractNamesAndAddresses( string[] memory _contractNames, address[] memory _contractAddresses ) internal { uint256 len = _contractNames.length; require(len == _contractAddresses.length, ERR_ARRAY_LENGTHS); for (uint256 i = 0; i < len; i++) { require(_contractAddresses[i] != address(0), ERR_ADDRESS_ZERO); bytes32 nameHash = _keccak256AbiEncode(_contractNames[i]); // add new contract name if address is not known yet if (contractAddresses[nameHash] == address(0)) { contractNames.push(_contractNames[i]); } // set or update contract address contractAddresses[nameHash] = _contractAddresses[i]; } } /** * @notice Updates contract addresses on all contracts implementing IIAddressUpdatable interface * @param _contractsToUpdate contracts to be updated */ function _updateContractAddresses(IIAddressUpdatable[] memory _contractsToUpdate) internal { uint256 len = contractNames.length; bytes32[] memory nameHashes = new bytes32[](len); address[] memory addresses = new address[](len); while (len > 0) { len--; nameHashes[len] = _keccak256AbiEncode(contractNames[len]); addresses[len] = contractAddresses[nameHashes[len]]; } for (uint256 i = 0; i < _contractsToUpdate.length; i++) { _contractsToUpdate[i].updateContractAddresses(nameHashes, addresses); } } /** * @notice Returns hash from string value */ function _keccak256AbiEncode(string memory _value) internal pure returns(bytes32) { return keccak256(abi.encode(_value)); } }
./contracts/addressUpdater/interface/IIAddressUpdatable.sol
// SPDX-License-Identifier: MIT pragma solidity >=0.7.6 <0.9; interface IIAddressUpdatable { /** * @notice Updates contract addresses - should be called only from AddressUpdater contract * @param _contractNameHashes list of keccak256(abi.encode(...)) contract names * @param _contractAddresses list of contract addresses corresponding to the contract names */ function updateContractAddresses( bytes32[] memory _contractNameHashes, address[] memory _contractAddresses ) external; }
./contracts/governance/implementation/Governed.sol
// SPDX-License-Identifier: MIT pragma solidity 0.7.6; import { GovernedBase } from "./GovernedBase.sol"; /** * @title Governed * @dev For deployed, governed contracts, enforce a non-zero address at create time. **/ contract Governed is GovernedBase { constructor(address _governance) GovernedBase(_governance) { require(_governance != address(0), "_governance zero"); } }
./contracts/governance/implementation/GovernedBase.sol
// SPDX-License-Identifier: MIT pragma solidity 0.7.6; import "../../userInterfaces/IGovernanceSettings.sol"; /** * @title Governed Base * @notice This abstract base class defines behaviors for a governed contract. * @dev This class is abstract so that specific behaviors can be defined for the constructor. * Contracts should not be left ungoverned, but not all contract will have a constructor * (for example those pre-defined in genesis). **/ abstract contract GovernedBase { struct TimelockedCall { uint256 allowedAfterTimestamp; bytes encodedCall; } // solhint-disable-next-line const-name-snakecase IGovernanceSettings public constant governanceSettings = IGovernanceSettings(0x1000000000000000000000000000000000000007); address private initialGovernance; bool private initialised; bool public productionMode; bool private executing; mapping(bytes4 => TimelockedCall) public timelockedCalls; event GovernanceCallTimelocked(bytes4 selector, uint256 allowedAfterTimestamp, bytes encodedCall); event TimelockedGovernanceCallExecuted(bytes4 selector, uint256 timestamp); event TimelockedGovernanceCallCanceled(bytes4 selector, uint256 timestamp); event GovernanceInitialised(address initialGovernance); event GovernedProductionModeEntered(address governanceSettings); modifier onlyGovernance { if (executing || !productionMode) { _beforeExecute(); _; } else { _recordTimelockedCall(msg.data); } } modifier onlyImmediateGovernance () { _checkOnlyGovernance(); _; } constructor(address _initialGovernance) { if (_initialGovernance != address(0)) { initialise(_initialGovernance); } } /** * @notice Execute the timelocked governance calls once the timelock period expires. * @dev Only executor can call this method. * @param _selector The method selector (only one timelocked call per method is stored). */ function executeGovernanceCall(bytes4 _selector) external { require(governanceSettings.isExecutor(msg.sender), "only executor"); TimelockedCall storage call = timelockedCalls[_selector]; require(call.allowedAfterTimestamp != 0, "timelock: invalid selector"); require(block.timestamp >= call.allowedAfterTimestamp, "timelock: not allowed yet"); bytes memory encodedCall = call.encodedCall; delete timelockedCalls[_selector]; executing = true; //solhint-disable-next-line avoid-low-level-calls (bool success,) = address(this).call(encodedCall); executing = false; emit TimelockedGovernanceCallExecuted(_selector, block.timestamp); _passReturnOrRevert(success); } /** * Cancel a timelocked governance call before it has been executed. * @dev Only governance can call this method. * @param _selector The method selector. */ function cancelGovernanceCall(bytes4 _selector) external onlyImmediateGovernance { require(timelockedCalls[_selector].allowedAfterTimestamp != 0, "timelock: invalid selector"); emit TimelockedGovernanceCallCanceled(_selector, block.timestamp); delete timelockedCalls[_selector]; } /** * Enter the production mode after all the initial governance settings have been set. * This enables timelocks and the governance is afterwards obtained by calling * governanceSettings.getGovernanceAddress(). */ function switchToProductionMode() external { _checkOnlyGovernance(); require(!productionMode, "already in production mode"); initialGovernance = address(0); productionMode = true; emit GovernedProductionModeEntered(address(governanceSettings)); } /** * @notice Initialize the governance address if not first initialized. */ function initialise(address _initialGovernance) public virtual { require(initialised == false, "initialised != false"); initialised = true; initialGovernance = _initialGovernance; emit GovernanceInitialised(_initialGovernance); } /** * Returns the current effective governance address. */ function governance() public view returns (address) { return productionMode ? governanceSettings.getGovernanceAddress() : initialGovernance; } function _beforeExecute() private { if (executing) { // can only be run from executeGovernanceCall(), where we check that only executor can call // make sure nothing else gets executed, even in case of reentrancy assert(msg.sender == address(this)); executing = false; } else { // must be called with: productionMode=false // must check governance in this case _checkOnlyGovernance(); } } function _recordTimelockedCall(bytes calldata _data) private { _checkOnlyGovernance(); bytes4 selector; //solhint-disable-next-line no-inline-assembly assembly { selector := calldataload(_data.offset) } uint256 timelock = governanceSettings.getTimelock(); uint256 allowedAt = block.timestamp + timelock; timelockedCalls[selector] = TimelockedCall({ allowedAfterTimestamp: allowedAt, encodedCall: _data }); emit GovernanceCallTimelocked(selector, allowedAt, _data); } function _checkOnlyGovernance() private view { require(msg.sender == governance(), "only governance"); } function _passReturnOrRevert(bool _success) private pure { // pass exact return or revert data - needs to be done in assembly //solhint-disable-next-line no-inline-assembly assembly { let size := returndatasize() let ptr := mload(0x40) mstore(0x40, add(ptr, size)) returndatacopy(ptr, 0, size) if _success { return(ptr, size) } revert(ptr, size) } } }
./contracts/userInterfaces/IGovernanceSettings.sol
// SPDX-License-Identifier: MIT pragma solidity 0.7.6; /** * A special contract that holds Flare governance address. * This contract enables updating governance address and timelock only by hard forking the network, * meaning only by updating validator code. */ interface IGovernanceSettings { /** * Get the governance account address. * The governance address can only be changed by a hardfork. */ function getGovernanceAddress() external view returns (address); /** * Get the time in seconds that must pass between a governance call and execution. * The timelock value can only be changed by a hardfork. */ function getTimelock() external view returns (uint256); /** * Get the addresses of the accounts that are allowed to execute the timelocked governance calls * once the timelock period expires. * Executors can be changed without a hardfork, via a normal governance call. */ function getExecutors() external view returns (address[] memory); /** * Check whether an address is one of the executors. */ function isExecutor(address _address) external view returns (bool); }
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"_governance","internalType":"address"}]},{"type":"event","name":"GovernanceCallTimelocked","inputs":[{"type":"bytes4","name":"selector","internalType":"bytes4","indexed":false},{"type":"uint256","name":"allowedAfterTimestamp","internalType":"uint256","indexed":false},{"type":"bytes","name":"encodedCall","internalType":"bytes","indexed":false}],"anonymous":false},{"type":"event","name":"GovernanceInitialised","inputs":[{"type":"address","name":"initialGovernance","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"GovernedProductionModeEntered","inputs":[{"type":"address","name":"governanceSettings","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"TimelockedGovernanceCallCanceled","inputs":[{"type":"bytes4","name":"selector","internalType":"bytes4","indexed":false},{"type":"uint256","name":"timestamp","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"TimelockedGovernanceCallExecuted","inputs":[{"type":"bytes4","name":"selector","internalType":"bytes4","indexed":false},{"type":"uint256","name":"timestamp","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"addOrUpdateContractNamesAndAddresses","inputs":[{"type":"string[]","name":"_contractNames","internalType":"string[]"},{"type":"address[]","name":"_contractAddresses","internalType":"address[]"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"cancelGovernanceCall","inputs":[{"type":"bytes4","name":"_selector","internalType":"bytes4"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"executeGovernanceCall","inputs":[{"type":"bytes4","name":"_selector","internalType":"bytes4"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"getContractAddress","inputs":[{"type":"string","name":"_name","internalType":"string"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string[]","name":"_contractNames","internalType":"string[]"},{"type":"address[]","name":"_contractAddresses","internalType":"address[]"}],"name":"getContractNamesAndAddresses","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"governance","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IGovernanceSettings"}],"name":"governanceSettings","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"initialise","inputs":[{"type":"address","name":"_initialGovernance","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"productionMode","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"switchToProductionMode","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"allowedAfterTimestamp","internalType":"uint256"},{"type":"bytes","name":"encodedCall","internalType":"bytes"}],"name":"timelockedCalls","inputs":[{"type":"bytes4","name":"","internalType":"bytes4"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"update","inputs":[{"type":"string[]","name":"_contractNames","internalType":"string[]"},{"type":"address[]","name":"_contractAddresses","internalType":"address[]"},{"type":"address[]","name":"_contractsToUpdate","internalType":"contract IIAddressUpdatable[]"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateContractAddresses","inputs":[{"type":"address[]","name":"_contractsToUpdate","internalType":"contract IIAddressUpdatable[]"}]}]
Contract Creation Code
0x60806040523480156200001157600080fd5b50604051620019fa380380620019fa83398101604081905262000034916200016c565b80806001600160a01b0381161562000051576200005181620000a9565b506001600160a01b038116620000a1576040805162461bcd60e51b815260206004820152601060248201526f5f676f7665726e616e6365207a65726f60801b604482015290519081900360640190fd5b50506200019c565b600054600160a01b900460ff161562000109576040805162461bcd60e51b815260206004820152601460248201527f696e697469616c6973656420213d2066616c7365000000000000000000000000604482015290519081900360640190fd5b60008054600160a01b60ff60a01b19909116176001600160a01b0319166001600160a01b03831690811790915560408051918252517f9789733827840833afc031fb2ef9ab6894271f77bad2085687cf4ae5c7bee4db916020908290030190a150565b6000602082840312156200017e578081fd5b81516001600160a01b038116811462000195578182fd5b9392505050565b61184e80620001ac6000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c806367fc40291161008c5780639933dba6116100665780639933dba6146101925780639d6a890f146101a5578063e17f212e146101b8578063f5a98383146101cd576100cf565b806367fc40291461014b57806374e6310e1461015e5780638246e4671461017f576100cf565b806304433bbc146100d45780631b0e2960146100fd5780632f26c5c3146101125780635aa6e675146101285780635ff270791461013057806362354e0314610143575b600080fd5b6100e76100e23660046115ea565b6101d5565b6040516100f491906116ab565b60405180910390f35b61011061010b3660046114a2565b610257565b005b61011a61026b565b6040516100f4929190611716565b6100e7610411565b61011061013e3660046115c2565b6104a6565b6100e76107fb565b6101106101593660046115c2565b610806565b61017161016c3660046115c2565b6108ee565b6040516100f49291906117a8565b61011061018d3660046114dd565b610994565b6101106101a036600461153e565b6109e1565b6101106101b336600461147f565b610a33565b6101c0610aec565b6040516100f4919061178a565b610110610afc565b600080600360006101e585610bb6565b81526020808201929092526040908101600020548151808301909252600c82526b61646472657373207a65726f60a01b928201929092526001600160a01b039091169150816102505760405162461bcd60e51b81526004016102479190611795565b60405180910390fd5b5092915050565b61025f610be6565b61026881610c47565b50565b6060806002805480602002602001604051908101604052809291908181526020016000905b8282101561033b5760008481526020908190208301805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156103275780601f106102fc57610100808354040283529160200191610327565b820191906000526020600020905b81548152906001019060200180831161030a57829003601f168201915b505050505081526020019060010190610290565b505082519294508291505067ffffffffffffffff8111801561035c57600080fd5b50604051908082528060200260200182016040528015610386578160200160208202803683370190505b5091505b801561040c57808060019003915050600360006103b98584815181106103ac57fe5b6020026020010151610bb6565b815260200190815260200160002060009054906101000a90046001600160a01b03168282815181106103e757fe5b60200260200101906001600160a01b031690816001600160a01b03168152505061038a565b509091565b60008054600160a81b900460ff16610434576000546001600160a01b03166104a1565b60076001609c1b016001600160a01b031663732524946040518163ffffffff1660e01b815260040160206040518083038186803b15801561047457600080fd5b505afa158015610488573d6000803e3d6000fd5b505050506040513d602081101561049e57600080fd5b50515b905090565b60408051630debfda360e41b8152336004820152905160076001609c1b019163debfda30916024808301926020929190829003018186803b1580156104ea57600080fd5b505afa1580156104fe573d6000803e3d6000fd5b505050506040513d602081101561051457600080fd5b5051610557576040805162461bcd60e51b815260206004820152600d60248201526c37b7363c9032bc32b1baba37b960991b604482015290519081900360640190fd5b6001600160e01b03198116600090815260016020526040902080546105c3576040805162461bcd60e51b815260206004820152601a60248201527f74696d656c6f636b3a20696e76616c69642073656c6563746f72000000000000604482015290519081900360640190fd5b8054421015610619576040805162461bcd60e51b815260206004820152601960248201527f74696d656c6f636b3a206e6f7420616c6c6f7765642079657400000000000000604482015290519081900360640190fd5b6000816001018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156106b35780601f10610688576101008083540402835291602001916106b3565b820191906000526020600020905b81548152906001019060200180831161069657829003601f168201915b5050506001600160e01b03198616600090815260016020819052604082208281559495509092506106e79150830182611208565b50506000805460ff60b01b1916600160b01b178155604051825130918491819060208401908083835b6020831061072f5780518252601f199092019160209182019101610710565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114610791576040519150601f19603f3d011682016040523d82523d6000602084013e610796565b606091505b50506000805460ff60b01b19169055604080516001600160e01b03198716815242602082015281519293507fa7326b57fc9cfe267aaea5e7f0b01757154d265620a0585819416ee9ddd2c438929081900390910190a16107f581610ea3565b50505050565b60076001609c1b0181565b61080e610be6565b6001600160e01b03198116600090815260016020526040902054610879576040805162461bcd60e51b815260206004820152601a60248201527f74696d656c6f636b3a20696e76616c69642073656c6563746f72000000000000604482015290519081900360640190fd5b604080516001600160e01b03198316815242602082015281517f7735b2391c38a81419c513e30ca578db7158eadd7101511b23e221c654d19cf8929181900390910190a16001600160e01b031981166000908152600160208190526040822082815591906108e990830182611208565b505050565b600160208181526000928352604092839020805481840180548651600296821615610100026000190190911695909504601f8101859004850286018501909652858552909491939290919083018282801561098a5780601f1061095f5761010080835404028352916020019161098a565b820191906000526020600020905b81548152906001019060200180831161096d57829003601f168201915b5050505050905082565b600054600160b01b900460ff16806109b65750600054600160a81b900460ff16155b156109d2576109c3610ec0565b6109cd8282610ef5565b6109dd565b6109dd600036611085565b5050565b600054600160b01b900460ff1680610a035750600054600160a81b900460ff16155b15610a2857610a10610ec0565b610a1a8383610ef5565b610a2381610c47565b6108e9565b6108e9600036611085565b600054600160a01b900460ff1615610a89576040805162461bcd60e51b8152602060048201526014602482015273696e697469616c6973656420213d2066616c736560601b604482015290519081900360640190fd5b60008054600160a01b60ff60a01b19909116176001600160a01b0319166001600160a01b03831690811790915560408051918252517f9789733827840833afc031fb2ef9ab6894271f77bad2085687cf4ae5c7bee4db916020908290030190a150565b600054600160a81b900460ff1681565b610b04610be6565b600054600160a81b900460ff1615610b63576040805162461bcd60e51b815260206004820152601a60248201527f616c726561647920696e2070726f64756374696f6e206d6f6465000000000000604482015290519081900360640190fd5b60008054600161ff0160a01b031916600160a81b1790556040805160076001609c1b01815290517f83af113638b5422f9e977cebc0aaf0eaf2188eb9a8baae7f9d46c42b33a1560c9181900360200190a1565b600081604051602001610bc99190611795565b604051602081830303815290604052805190602001209050919050565b610bee610411565b6001600160a01b0316336001600160a01b031614610c45576040805162461bcd60e51b815260206004820152600f60248201526e6f6e6c7920676f7665726e616e636560881b604482015290519081900360640190fd5b565b60025460008167ffffffffffffffff81118015610c6357600080fd5b50604051908082528060200260200182016040528015610c8d578160200160208202803683370190505b50905060008267ffffffffffffffff81118015610ca957600080fd5b50604051908082528060200260200182016040528015610cd3578160200160208202803683370190505b5090505b8215610e1157828060019003935050610d8e60028481548110610cf657fe5b600091825260209182902001805460408051601f6002600019610100600187161502019094169390930492830185900485028101850190915281815292830182828015610d845780601f10610d5957610100808354040283529160200191610d84565b820191906000526020600020905b815481529060010190602001808311610d6757829003601f168201915b5050505050610bb6565b828481518110610d9a57fe5b60200260200101818152505060036000838581518110610db657fe5b6020026020010151815260200190815260200160002060009054906101000a90046001600160a01b0316818481518110610dec57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050610cd7565b60005b8451811015610e9c57848181518110610e2957fe5b60200260200101516001600160a01b031663b00c0b7684846040518363ffffffff1660e01b8152600401610e5e9291906116bf565b600060405180830381600087803b158015610e7857600080fd5b505af1158015610e8c573d6000803e3d6000fd5b505060019092019150610e149050565b5050505050565b3d604051818101604052816000823e8215610ebc578181f35b8181fd5b600054600160b01b900460ff1615610eed57333014610edb57fe5b6000805460ff60b01b19169055610c45565b610c45610be6565b8151815160408051808201909152601a81527f6172726179206c656e6774687320646f206e6f74206d617463680000000000006020820152908214610f4d5760405162461bcd60e51b81526004016102479190611795565b5060005b818110156107f55760006001600160a01b0316838281518110610f7057fe5b60200260200101516001600160a01b031614156040518060400160405280600c81526020016b61646472657373207a65726f60a01b81525090610fc65760405162461bcd60e51b81526004016102479190611795565b506000610fd88583815181106103ac57fe5b6000818152600360205260409020549091506001600160a01b031661103957600285838151811061100557fe5b60209081029190910181015182546001810184556000938452928290208151611037949190910192919091019061124c565b505b83828151811061104557fe5b60209081029190910181015160009283526003909152604090912080546001600160a01b0319166001600160a01b03909216919091179055600101610f51565b61108d610be6565b600082359050600060076001609c1b016001600160a01b0316636221a54b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156110d557600080fd5b505afa1580156110e9573d6000803e3d6000fd5b505050506040513d60208110156110ff57600080fd5b505160408051808201825242830180825282516020601f89018190048102820181019094528781529394509290918281019190889088908190840183828082843760009201829052509390945250506001600160e01b031986168152600160208181526040909220845181558483015180519194506111839392850192019061124c565b509050507fed948300a3694aa01d4a6b258bfd664350193d770c0b51f8387277f6d83ea3b68382878760405180856001600160e01b0319168152602001848152602001806020018281038252848482818152602001925080828437600083820152604051601f909101601f191690920182900397509095505050505050a15050505050565b50805460018160011615610100020316600290046000825580601f1061122e5750610268565b601f01602090049060005260206000209081019061026891906112d8565b828054600181600116156101000203166002900490600052602060002090601f01602090048101928261128257600085556112c8565b82601f1061129b57805160ff19168380011785556112c8565b828001600101855582156112c8579182015b828111156112c85782518255916020019190600101906112ad565b506112d49291506112d8565b5090565b5b808211156112d457600081556001016112d9565b600082601f8301126112fd578081fd5b8135602061131261130d836117e5565b6117c1565b828152818101908583018385028701840188101561132e578586fd5b855b8581101561135557813561134381611803565b84529284019290840190600101611330565b5090979650505050505050565b600082601f830112611372578081fd5b8135602061138261130d836117e5565b828152818101908583018385028701840188101561139e578586fd5b855b858110156113555781356113b381611803565b845292840192908401906001016113a0565b600082601f8301126113d5578081fd5b813560206113e561130d836117e5565b82815281810190858301855b8581101561135557611408898684358b010161141a565b845292840192908401906001016113f1565b600082601f83011261142a578081fd5b813567ffffffffffffffff81111561143e57fe5b611451601f8201601f19166020016117c1565b818152846020838601011115611465578283fd5b816020850160208301379081016020019190915292915050565b600060208284031215611490578081fd5b813561149b81611803565b9392505050565b6000602082840312156114b3578081fd5b813567ffffffffffffffff8111156114c9578182fd5b6114d584828501611362565b949350505050565b600080604083850312156114ef578081fd5b823567ffffffffffffffff80821115611506578283fd5b611512868387016113c5565b93506020850135915080821115611527578283fd5b50611534858286016112ed565b9150509250929050565b600080600060608486031215611552578081fd5b833567ffffffffffffffff80821115611569578283fd5b611575878388016113c5565b9450602086013591508082111561158a578283fd5b611596878388016112ed565b935060408601359150808211156115ab578283fd5b506115b886828701611362565b9150509250925092565b6000602082840312156115d3578081fd5b81356001600160e01b03198116811461149b578182fd5b6000602082840312156115fb578081fd5b813567ffffffffffffffff811115611611578182fd5b6114d58482850161141a565b6000815180845260208085019450808401835b838110156116555781516001600160a01b031687529582019590820190600101611630565b509495945050505050565b60008151808452815b8181101561168557602081850181015186830182015201611669565b818111156116965782602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0391909116815260200190565b604080825283519082018190526000906020906060840190828701845b828110156116f8578151845292840192908401906001016116dc565b5050508381038285015261170c818661161d565b9695505050505050565b60006040820160408352808551808352606085019150602092506060838202860101838801855b8381101561176b57605f19888403018552611759838351611660565b9486019492509085019060010161173d565b50508581038487015261177e818861161d565b98975050505050505050565b901515815260200190565b60006020825261149b6020830184611660565b6000838252604060208301526114d56040830184611660565b60405181810167ffffffffffffffff811182821017156117dd57fe5b604052919050565b600067ffffffffffffffff8211156117f957fe5b5060209081020190565b6001600160a01b038116811461026857600080fdfea2646970667358221220b256de2c84c0a98fbe700dc4963f1d2409ab8650e6194f2584ecd928f987dfcf64736f6c634300070600330000000000000000000000004598a6c05910ab914f0cbaaca1911cd337d10d29
Deployed ByteCode
0x608060405234801561001057600080fd5b50600436106100cf5760003560e01c806367fc40291161008c5780639933dba6116100665780639933dba6146101925780639d6a890f146101a5578063e17f212e146101b8578063f5a98383146101cd576100cf565b806367fc40291461014b57806374e6310e1461015e5780638246e4671461017f576100cf565b806304433bbc146100d45780631b0e2960146100fd5780632f26c5c3146101125780635aa6e675146101285780635ff270791461013057806362354e0314610143575b600080fd5b6100e76100e23660046115ea565b6101d5565b6040516100f491906116ab565b60405180910390f35b61011061010b3660046114a2565b610257565b005b61011a61026b565b6040516100f4929190611716565b6100e7610411565b61011061013e3660046115c2565b6104a6565b6100e76107fb565b6101106101593660046115c2565b610806565b61017161016c3660046115c2565b6108ee565b6040516100f49291906117a8565b61011061018d3660046114dd565b610994565b6101106101a036600461153e565b6109e1565b6101106101b336600461147f565b610a33565b6101c0610aec565b6040516100f4919061178a565b610110610afc565b600080600360006101e585610bb6565b81526020808201929092526040908101600020548151808301909252600c82526b61646472657373207a65726f60a01b928201929092526001600160a01b039091169150816102505760405162461bcd60e51b81526004016102479190611795565b60405180910390fd5b5092915050565b61025f610be6565b61026881610c47565b50565b6060806002805480602002602001604051908101604052809291908181526020016000905b8282101561033b5760008481526020908190208301805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156103275780601f106102fc57610100808354040283529160200191610327565b820191906000526020600020905b81548152906001019060200180831161030a57829003601f168201915b505050505081526020019060010190610290565b505082519294508291505067ffffffffffffffff8111801561035c57600080fd5b50604051908082528060200260200182016040528015610386578160200160208202803683370190505b5091505b801561040c57808060019003915050600360006103b98584815181106103ac57fe5b6020026020010151610bb6565b815260200190815260200160002060009054906101000a90046001600160a01b03168282815181106103e757fe5b60200260200101906001600160a01b031690816001600160a01b03168152505061038a565b509091565b60008054600160a81b900460ff16610434576000546001600160a01b03166104a1565b60076001609c1b016001600160a01b031663732524946040518163ffffffff1660e01b815260040160206040518083038186803b15801561047457600080fd5b505afa158015610488573d6000803e3d6000fd5b505050506040513d602081101561049e57600080fd5b50515b905090565b60408051630debfda360e41b8152336004820152905160076001609c1b019163debfda30916024808301926020929190829003018186803b1580156104ea57600080fd5b505afa1580156104fe573d6000803e3d6000fd5b505050506040513d602081101561051457600080fd5b5051610557576040805162461bcd60e51b815260206004820152600d60248201526c37b7363c9032bc32b1baba37b960991b604482015290519081900360640190fd5b6001600160e01b03198116600090815260016020526040902080546105c3576040805162461bcd60e51b815260206004820152601a60248201527f74696d656c6f636b3a20696e76616c69642073656c6563746f72000000000000604482015290519081900360640190fd5b8054421015610619576040805162461bcd60e51b815260206004820152601960248201527f74696d656c6f636b3a206e6f7420616c6c6f7765642079657400000000000000604482015290519081900360640190fd5b6000816001018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156106b35780601f10610688576101008083540402835291602001916106b3565b820191906000526020600020905b81548152906001019060200180831161069657829003601f168201915b5050506001600160e01b03198616600090815260016020819052604082208281559495509092506106e79150830182611208565b50506000805460ff60b01b1916600160b01b178155604051825130918491819060208401908083835b6020831061072f5780518252601f199092019160209182019101610710565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114610791576040519150601f19603f3d011682016040523d82523d6000602084013e610796565b606091505b50506000805460ff60b01b19169055604080516001600160e01b03198716815242602082015281519293507fa7326b57fc9cfe267aaea5e7f0b01757154d265620a0585819416ee9ddd2c438929081900390910190a16107f581610ea3565b50505050565b60076001609c1b0181565b61080e610be6565b6001600160e01b03198116600090815260016020526040902054610879576040805162461bcd60e51b815260206004820152601a60248201527f74696d656c6f636b3a20696e76616c69642073656c6563746f72000000000000604482015290519081900360640190fd5b604080516001600160e01b03198316815242602082015281517f7735b2391c38a81419c513e30ca578db7158eadd7101511b23e221c654d19cf8929181900390910190a16001600160e01b031981166000908152600160208190526040822082815591906108e990830182611208565b505050565b600160208181526000928352604092839020805481840180548651600296821615610100026000190190911695909504601f8101859004850286018501909652858552909491939290919083018282801561098a5780601f1061095f5761010080835404028352916020019161098a565b820191906000526020600020905b81548152906001019060200180831161096d57829003601f168201915b5050505050905082565b600054600160b01b900460ff16806109b65750600054600160a81b900460ff16155b156109d2576109c3610ec0565b6109cd8282610ef5565b6109dd565b6109dd600036611085565b5050565b600054600160b01b900460ff1680610a035750600054600160a81b900460ff16155b15610a2857610a10610ec0565b610a1a8383610ef5565b610a2381610c47565b6108e9565b6108e9600036611085565b600054600160a01b900460ff1615610a89576040805162461bcd60e51b8152602060048201526014602482015273696e697469616c6973656420213d2066616c736560601b604482015290519081900360640190fd5b60008054600160a01b60ff60a01b19909116176001600160a01b0319166001600160a01b03831690811790915560408051918252517f9789733827840833afc031fb2ef9ab6894271f77bad2085687cf4ae5c7bee4db916020908290030190a150565b600054600160a81b900460ff1681565b610b04610be6565b600054600160a81b900460ff1615610b63576040805162461bcd60e51b815260206004820152601a60248201527f616c726561647920696e2070726f64756374696f6e206d6f6465000000000000604482015290519081900360640190fd5b60008054600161ff0160a01b031916600160a81b1790556040805160076001609c1b01815290517f83af113638b5422f9e977cebc0aaf0eaf2188eb9a8baae7f9d46c42b33a1560c9181900360200190a1565b600081604051602001610bc99190611795565b604051602081830303815290604052805190602001209050919050565b610bee610411565b6001600160a01b0316336001600160a01b031614610c45576040805162461bcd60e51b815260206004820152600f60248201526e6f6e6c7920676f7665726e616e636560881b604482015290519081900360640190fd5b565b60025460008167ffffffffffffffff81118015610c6357600080fd5b50604051908082528060200260200182016040528015610c8d578160200160208202803683370190505b50905060008267ffffffffffffffff81118015610ca957600080fd5b50604051908082528060200260200182016040528015610cd3578160200160208202803683370190505b5090505b8215610e1157828060019003935050610d8e60028481548110610cf657fe5b600091825260209182902001805460408051601f6002600019610100600187161502019094169390930492830185900485028101850190915281815292830182828015610d845780601f10610d5957610100808354040283529160200191610d84565b820191906000526020600020905b815481529060010190602001808311610d6757829003601f168201915b5050505050610bb6565b828481518110610d9a57fe5b60200260200101818152505060036000838581518110610db657fe5b6020026020010151815260200190815260200160002060009054906101000a90046001600160a01b0316818481518110610dec57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050610cd7565b60005b8451811015610e9c57848181518110610e2957fe5b60200260200101516001600160a01b031663b00c0b7684846040518363ffffffff1660e01b8152600401610e5e9291906116bf565b600060405180830381600087803b158015610e7857600080fd5b505af1158015610e8c573d6000803e3d6000fd5b505060019092019150610e149050565b5050505050565b3d604051818101604052816000823e8215610ebc578181f35b8181fd5b600054600160b01b900460ff1615610eed57333014610edb57fe5b6000805460ff60b01b19169055610c45565b610c45610be6565b8151815160408051808201909152601a81527f6172726179206c656e6774687320646f206e6f74206d617463680000000000006020820152908214610f4d5760405162461bcd60e51b81526004016102479190611795565b5060005b818110156107f55760006001600160a01b0316838281518110610f7057fe5b60200260200101516001600160a01b031614156040518060400160405280600c81526020016b61646472657373207a65726f60a01b81525090610fc65760405162461bcd60e51b81526004016102479190611795565b506000610fd88583815181106103ac57fe5b6000818152600360205260409020549091506001600160a01b031661103957600285838151811061100557fe5b60209081029190910181015182546001810184556000938452928290208151611037949190910192919091019061124c565b505b83828151811061104557fe5b60209081029190910181015160009283526003909152604090912080546001600160a01b0319166001600160a01b03909216919091179055600101610f51565b61108d610be6565b600082359050600060076001609c1b016001600160a01b0316636221a54b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156110d557600080fd5b505afa1580156110e9573d6000803e3d6000fd5b505050506040513d60208110156110ff57600080fd5b505160408051808201825242830180825282516020601f89018190048102820181019094528781529394509290918281019190889088908190840183828082843760009201829052509390945250506001600160e01b031986168152600160208181526040909220845181558483015180519194506111839392850192019061124c565b509050507fed948300a3694aa01d4a6b258bfd664350193d770c0b51f8387277f6d83ea3b68382878760405180856001600160e01b0319168152602001848152602001806020018281038252848482818152602001925080828437600083820152604051601f909101601f191690920182900397509095505050505050a15050505050565b50805460018160011615610100020316600290046000825580601f1061122e5750610268565b601f01602090049060005260206000209081019061026891906112d8565b828054600181600116156101000203166002900490600052602060002090601f01602090048101928261128257600085556112c8565b82601f1061129b57805160ff19168380011785556112c8565b828001600101855582156112c8579182015b828111156112c85782518255916020019190600101906112ad565b506112d49291506112d8565b5090565b5b808211156112d457600081556001016112d9565b600082601f8301126112fd578081fd5b8135602061131261130d836117e5565b6117c1565b828152818101908583018385028701840188101561132e578586fd5b855b8581101561135557813561134381611803565b84529284019290840190600101611330565b5090979650505050505050565b600082601f830112611372578081fd5b8135602061138261130d836117e5565b828152818101908583018385028701840188101561139e578586fd5b855b858110156113555781356113b381611803565b845292840192908401906001016113a0565b600082601f8301126113d5578081fd5b813560206113e561130d836117e5565b82815281810190858301855b8581101561135557611408898684358b010161141a565b845292840192908401906001016113f1565b600082601f83011261142a578081fd5b813567ffffffffffffffff81111561143e57fe5b611451601f8201601f19166020016117c1565b818152846020838601011115611465578283fd5b816020850160208301379081016020019190915292915050565b600060208284031215611490578081fd5b813561149b81611803565b9392505050565b6000602082840312156114b3578081fd5b813567ffffffffffffffff8111156114c9578182fd5b6114d584828501611362565b949350505050565b600080604083850312156114ef578081fd5b823567ffffffffffffffff80821115611506578283fd5b611512868387016113c5565b93506020850135915080821115611527578283fd5b50611534858286016112ed565b9150509250929050565b600080600060608486031215611552578081fd5b833567ffffffffffffffff80821115611569578283fd5b611575878388016113c5565b9450602086013591508082111561158a578283fd5b611596878388016112ed565b935060408601359150808211156115ab578283fd5b506115b886828701611362565b9150509250925092565b6000602082840312156115d3578081fd5b81356001600160e01b03198116811461149b578182fd5b6000602082840312156115fb578081fd5b813567ffffffffffffffff811115611611578182fd5b6114d58482850161141a565b6000815180845260208085019450808401835b838110156116555781516001600160a01b031687529582019590820190600101611630565b509495945050505050565b60008151808452815b8181101561168557602081850181015186830182015201611669565b818111156116965782602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0391909116815260200190565b604080825283519082018190526000906020906060840190828701845b828110156116f8578151845292840192908401906001016116dc565b5050508381038285015261170c818661161d565b9695505050505050565b60006040820160408352808551808352606085019150602092506060838202860101838801855b8381101561176b57605f19888403018552611759838351611660565b9486019492509085019060010161173d565b50508581038487015261177e818861161d565b98975050505050505050565b901515815260200190565b60006020825261149b6020830184611660565b6000838252604060208301526114d56040830184611660565b60405181810167ffffffffffffffff811182821017156117dd57fe5b604052919050565b600067ffffffffffffffff8211156117f957fe5b5060209081020190565b6001600160a01b038116811461026857600080fdfea2646970667358221220b256de2c84c0a98fbe700dc4963f1d2409ab8650e6194f2584ecd928f987dfcf64736f6c63430007060033