Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
- Contract name:
- AgentOwnerRegistry
- Optimization enabled
- true
- Compiler version
- v0.8.23+commit.f704f362
- Optimization runs
- 200
- EVM Version
- london
- Verified at
- 2024-06-03T13:54:43.655647Z
Constructor Arguments
0x000000000000000000000000183faff6997c98a812a3b98748fc80241d08f3120000000000000000000000005a11fa259c898e6973db2f3c9e82339a53c777c00000000000000000000000000000000000000000000000000000000000000001
Arg [0] (address) : 0x183faff6997c98a812a3b98748fc80241d08f312
Arg [1] (address) : 0x5a11fa259c898e6973db2f3c9e82339a53c777c0
Arg [2] (bool) : true
contracts/fasset/implementation/AgentOwnerRegistry.sol
// SPDX-License-Identifier: MIT pragma solidity >=0.7.6 <0.9; pragma abicoder v2; import "../../userInterfaces/IAgentOwnerRegistry.sol"; import "./Whitelist.sol"; contract AgentOwnerRegistry is Whitelist, IAgentOwnerRegistry { mapping(address => address) private workToMgmtAddress; mapping(address => address) private mgmtToWorkAddress; mapping(address => string) private agentName; mapping(address => string) private agentDescription; mapping(address => string) private agentIconUrl; constructor(IGovernanceSettings _governanceSettings, address _initialGovernance, bool _supportRevoke) Whitelist(_governanceSettings, _initialGovernance, _supportRevoke) { } /** * Add agent to the whitelist and set data for agent presentation. * If the agent is already whitelisted, only updates agent presentation data. * @param _managementAddress the agent owner's address * @param _name agent owner's name * @param _description agent owner's description * @param _iconUrl url of the agent owner's icon image; governance should check it is in correct format * and size and it is on a server where it cannot change or be deleted */ function whitelistAndDescribeAgent( address _managementAddress, string memory _name, string memory _description, string memory _iconUrl ) external onlyImmediateGovernance { _addAddressToWhitelist(_managementAddress); _setAgentData(_managementAddress, _name, _description, _iconUrl); } /** * Associate a work address with the agent owner's management address. * Every owner (management address) can have only one work address, so as soon as the new one is set, the old * one stops working. * NOTE: May only be called by an agent on the allowed agent list and only from the management address. */ function setWorkAddress(address _ownerWorkAddress) external { require(isWhitelisted(msg.sender), "agent not whitelisted"); require(_ownerWorkAddress == address(0) || workToMgmtAddress[_ownerWorkAddress] == address(0), "work address in use"); // delete old work to management mapping address oldWorkAddress = mgmtToWorkAddress[msg.sender]; if (oldWorkAddress != address(0)) { workToMgmtAddress[oldWorkAddress] = address(0); } // create a new bidirectional mapping mgmtToWorkAddress[msg.sender] = _ownerWorkAddress; if (_ownerWorkAddress != address(0)) { workToMgmtAddress[_ownerWorkAddress] = msg.sender; } emit WorkAddressChanged(msg.sender, oldWorkAddress, _ownerWorkAddress); } /** * Return agent owner's name. * @param _managementAddress agent owner's management address */ function getAgentName(address _managementAddress) external view override returns (string memory) { return agentName[_managementAddress]; } /** * Return agent owner's decription. * @param _managementAddress agent owner's management address */ function getAgentDescription(address _managementAddress) external view override returns (string memory) { return agentDescription[_managementAddress]; } /** * Return url of the agent owner's icon. * @param _managementAddress agent owner's management address */ function getAgentIconUrl(address _managementAddress) external view override returns (string memory) { return agentIconUrl[_managementAddress]; } /** * Get the (unique) work address for the given management address. */ function getWorkAddress(address _managementAddress) external view override returns (address) { return mgmtToWorkAddress[_managementAddress]; } /** * Get the (unique) management address for the given work address. */ function getManagementAddress(address _workAddress) external view override returns (address) { return workToMgmtAddress[_workAddress]; } function _setAgentData( address _managementAddress, string memory _name, string memory _description, string memory _iconUrl ) private { agentName[_managementAddress] = _name; agentDescription[_managementAddress] = _description; agentIconUrl[_managementAddress] = _iconUrl; emit AgentDataChanged(_managementAddress, _name, _description, _iconUrl); } /** * Implementation of ERC-165 interface. */ function supportsInterface(bytes4 _interfaceId) public pure override returns (bool) { return Whitelist.supportsInterface(_interfaceId) || _interfaceId == type(IAgentOwnerRegistry).interfaceId; } }
@openzeppelin/contracts/utils/introspection/IERC165.sol
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
contracts/fasset/implementation/Whitelist.sol
// SPDX-License-Identifier: MIT pragma solidity 0.8.23; import "@openzeppelin/contracts/utils/introspection/IERC165.sol"; import "../../governance/implementation/Governed.sol"; import "../../userInterfaces/IWhitelist.sol"; contract Whitelist is IWhitelist, Governed, IERC165 { /** * When true, governance can remove addresses from whitelist. */ bool public immutable supportsRevoke; /** * When true, all addresses are whitelisted. * Default is false. */ bool public allowAll; mapping(address => bool) private whitelist; constructor(IGovernanceSettings _governanceSettings, address _initialGovernance, bool _supportsRevoke) Governed(_governanceSettings, _initialGovernance) { supportsRevoke = _supportsRevoke; allowAll = false; } function addAddressToWhitelist(address _address) external onlyImmediateGovernance { _addAddressToWhitelist(_address); } function addAddressesToWhitelist(address[] memory _addresses) external onlyImmediateGovernance { for (uint256 i = 0; i < _addresses.length; i++) { _addAddressToWhitelist(_addresses[i]); } } function revokeAddress(address _address) external onlyGovernance { require(supportsRevoke, "revoke not supported"); _removeAddressFromWhitelist(_address); } function setAllowAll(bool _allowAll) external onlyGovernance { allowAll = _allowAll; } function isWhitelisted(address _address) public view returns (bool) { return whitelist[_address] || allowAll; } function _addAddressToWhitelist(address _address) internal { require(_address != address(0), "address zero"); if (whitelist[_address]) return; whitelist[_address] = true; emit Whitelisted(_address); } function _removeAddressFromWhitelist(address _address) internal { if (!whitelist[_address]) return; delete whitelist[_address]; emit WhitelistingRevoked(_address); } /** * Implementation of ERC-165 interface. */ function supportsInterface(bytes4 _interfaceId) public pure virtual override returns (bool) { return _interfaceId == type(IERC165).interfaceId || _interfaceId == type(IWhitelist).interfaceId; } }
contracts/governance/implementation/Governed.sol
// SPDX-License-Identifier: MIT pragma solidity 0.8.23; import { GovernedBase } from "./GovernedBase.sol"; import { IGovernanceSettings } from "flare-smart-contracts/contracts/userInterfaces/IGovernanceSettings.sol"; /** * @title Governed * @dev For deployed, governed contracts, enforce non-zero addresses at create time. **/ abstract contract Governed is GovernedBase { constructor(IGovernanceSettings _governanceSettings, address _initialGovernance) { initialise(_governanceSettings, _initialGovernance); } }
contracts/governance/implementation/GovernedBase.sol
// SPDX-License-Identifier: MIT pragma solidity 0.8.23; import "flare-smart-contracts/contracts/userInterfaces/IGovernanceSettings.sol"; import "../interfaces/IGoverned.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). * @dev This version is compatible with both Flare (where governance settings is in genesis at the address * 0x1000000000000000000000000000000000000007) and Songbird (where governance settings is a deployed contract). * @dev It also uses diamond storage for state, so it is safer tp use in diamond structures or proxies. **/ abstract contract GovernedBase is IGoverned { struct GovernedState { IGovernanceSettings governanceSettings; bool initialised; bool productionMode; bool executing; address initialGovernance; mapping(bytes32 encodedCallHash => uint256 allowedAfterTimestamp) timelockedCalls; } modifier onlyGovernance { if (_timeToExecute()) { _beforeExecute(); _; } else { _recordTimelockedCall(msg.data, 0); } } modifier onlyGovernanceWithTimelockAtLeast(uint256 _minimumTimelock) { if (_timeToExecute()) { _beforeExecute(); _; } else { _recordTimelockedCall(msg.data, _minimumTimelock); } } modifier onlyImmediateGovernance { _checkOnlyGovernance(); _; } constructor() { } /** * @notice Execute the timelocked governance calls once the timelock period expires. * @dev Only executor can call this method. * @param _encodedCall ABI encoded call data (signature and parameters). */ function executeGovernanceCall(bytes calldata _encodedCall) external override { GovernedState storage state = _governedState(); require(isExecutor(msg.sender), "only executor"); bytes32 encodedCallHash = keccak256(_encodedCall); uint256 allowedAfterTimestamp = state.timelockedCalls[encodedCallHash]; require(allowedAfterTimestamp != 0, "timelock: invalid selector"); require(block.timestamp >= allowedAfterTimestamp, "timelock: not allowed yet"); delete state.timelockedCalls[encodedCallHash]; state.executing = true; //solhint-disable-next-line avoid-low-level-calls (bool success,) = address(this).call(_encodedCall); state.executing = false; emit TimelockedGovernanceCallExecuted(encodedCallHash); _passReturnOrRevert(success); } /** * Cancel a timelocked governance call before it has been executed. * @dev Only governance can call this method. * @param _encodedCall ABI encoded call data (signature and parameters). */ function cancelGovernanceCall(bytes calldata _encodedCall) external override onlyImmediateGovernance { GovernedState storage state = _governedState(); bytes32 encodedCallHash = keccak256(_encodedCall); require(state.timelockedCalls[encodedCallHash] != 0, "timelock: invalid selector"); emit TimelockedGovernanceCallCanceled(encodedCallHash); delete state.timelockedCalls[encodedCallHash]; } /** * 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 onlyImmediateGovernance { GovernedState storage state = _governedState(); require(!state.productionMode, "already in production mode"); state.initialGovernance = address(0); state.productionMode = true; emit GovernedProductionModeEntered(address(state.governanceSettings)); } /** * @notice Initialize the governance address if not first initialized. */ function initialise(IGovernanceSettings _governanceSettings, address _initialGovernance) public virtual { GovernedState storage state = _governedState(); require(state.initialised == false, "initialised != false"); require(address(_governanceSettings) != address(0), "governance settings zero"); require(_initialGovernance != address(0), "_governance zero"); state.initialised = true; state.governanceSettings = _governanceSettings; state.initialGovernance = _initialGovernance; emit GovernanceInitialised(_initialGovernance); } /** * Returns the governance settings contract address. */ function governanceSettings() public view returns (IGovernanceSettings) { return _governedState().governanceSettings; } /** * True after switching to production mode (see `switchToProductionMode()`). */ function productionMode() public view returns (bool) { return _governedState().productionMode; } /** * Returns the current effective governance address. */ function governance() public view returns (address) { GovernedState storage state = _governedState(); return state.productionMode ? state.governanceSettings.getGovernanceAddress() : state.initialGovernance; } /** * Check if an address is one of the executors defined in governanceSettings. */ function isExecutor(address _address) public view returns (bool) { GovernedState storage state = _governedState(); return state.initialised && state.governanceSettings.isExecutor(_address); } function _beforeExecute() private { GovernedState storage state = _governedState(); if (state.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)); state.executing = false; } else { // must be called with: productionMode=false // must check governance in this case _checkOnlyGovernance(); } } function _recordTimelockedCall(bytes calldata _encodedCall, uint256 _minimumTimelock) private { GovernedState storage state = _governedState(); _checkOnlyGovernance(); bytes32 encodedCallHash = keccak256(_encodedCall); uint256 timelock = state.governanceSettings.getTimelock(); if (timelock < _minimumTimelock) { timelock = _minimumTimelock; } uint256 allowedAt = block.timestamp + timelock; state.timelockedCalls[encodedCallHash] = allowedAt; emit GovernanceCallTimelocked(_encodedCall, encodedCallHash, allowedAt); } function _timeToExecute() private view returns (bool) { GovernedState storage state = _governedState(); return state.executing || !state.productionMode; } function _checkOnlyGovernance() private view { require(msg.sender == governance(), "only governance"); } function _governedState() private pure returns (GovernedState storage _state) { bytes32 position = keccak256("fasset.GovernedBase.GovernedState"); // solhint-disable-next-line no-inline-assembly assembly { _state.slot := position } } 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/governance/interfaces/IGoverned.sol
// SPDX-License-Identifier: MIT pragma solidity >=0.7.6 <0.9; import "flare-smart-contracts/contracts/userInterfaces/IGovernanceSettings.sol"; interface IGoverned { /** * Governance call was timelocked. It can be executed after `allowedAfterTimestamp` by one of the executors. * @param encodedCall ABI encoded call data, to be used in executeGovernanceCall * @param encodedCallHash keccak256 hash of the ABI encoded call data * @param allowedAfterTimestamp the earliest timestamp when the call can be executed */ event GovernanceCallTimelocked(bytes encodedCall, bytes32 encodedCallHash, uint256 allowedAfterTimestamp); /** * Previously timelocked governance call was executed. * @param encodedCallHash keccak256 hash of the ABI encoded call data * (same as `GovernanceCallTimelocked.encodedCallHash`) */ event TimelockedGovernanceCallExecuted(bytes32 encodedCallHash); /** * Previously timelocked governance call was canceled. * @param encodedCallHash keccak256 hash of the ABI encoded call data * (same as `GovernanceCallTimelocked.encodedCallHash`) */ event TimelockedGovernanceCallCanceled(bytes32 encodedCallHash); /** * Governed contract was initialised (not yet in production mode). * @param initialGovernance the governance address used until switch to production mode */ event GovernanceInitialised(address initialGovernance); /** * The governed contract has switched to production mode * Timelocks are now enabled and the governance address is `governanceSettings.getGovernanceAddress()`. * @param governanceSettings the system contract holding governance address, timelock and executors settings */ event GovernedProductionModeEntered(address governanceSettings); /** * @notice Execute the timelocked governance calls once the timelock period expires. * @dev Only executor can call this method. * @param _encodedCall ABI encoded call data (signature and parameters). * You should use `encodedCall` parameter from `GovernanceCallTimelocked` event. */ function executeGovernanceCall(bytes calldata _encodedCall) external; /** * Cancel a timelocked governance call before it has been executed. * @dev Only governance can call this method. * @param _encodedCall ABI encoded call data (signature and parameters). * You should use `encodedCall` parameter from `GovernanceCallTimelocked` event. */ function cancelGovernanceCall(bytes calldata _encodedCall) external; /** * 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; /** * Returns the governance settings contract address. */ function governanceSettings() external view returns (IGovernanceSettings); /** * True after switching to production mode (see `switchToProductionMode()`). */ function productionMode() external view returns (bool); /** * Returns the current effective governance address. * Before switching to production, the effective governance is `initialGovernance`, * and afterwards it is `governanceSettings.getGovernanceAddress()`. */ function governance() external view returns (address); /** * Check if an address is one of the executors defined in `governanceSettings`. */ function isExecutor(address _address) external view returns (bool); }
contracts/userInterfaces/IAgentOwnerRegistry.sol
// SPDX-License-Identifier: MIT pragma solidity >=0.7.6 <0.9; pragma abicoder v2; import "./IWhitelist.sol"; /** * Agent owner management and work address management */ interface IAgentOwnerRegistry is IWhitelist { /** * Agent owner's work address has been set. */ event WorkAddressChanged( address indexed managementAddress, address prevWorkAddress, address workAddress); event AgentDataChanged( address indexed managementAddress, string name, string description, string iconUrl); /** * Return agent owner's name. * @param _managementAddress agent owner's management address */ function getAgentName(address _managementAddress) external view returns (string memory); /** * Return agent owner's decription. * @param _managementAddress agent owner's management address */ function getAgentDescription(address _managementAddress) external view returns (string memory); /** * Return url of the agent owner's icon. * @param _managementAddress agent owner's management address */ function getAgentIconUrl(address _managementAddress) external view returns (string memory); /** * Get the (unique) work address for the given management address. */ function getWorkAddress(address _managementAddress) external view returns (address); /** * Get the (unique) management address for the given work address. */ function getManagementAddress(address _workAddress) external view returns (address); }
contracts/userInterfaces/IWhitelist.sol
// SPDX-License-Identifier: MIT pragma solidity >=0.7.6 <0.9; interface IWhitelist { event Whitelisted(address value); event WhitelistingRevoked(address value); function isWhitelisted(address _address) external view returns (bool); }
flare-smart-contracts/contracts/userInterfaces/IGovernanceSettings.sol
// SPDX-License-Identifier: MIT pragma solidity >=0.7.6 <0.9; /** * 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); }
Compiler Settings
{"outputSelection":{"*":{"*":["*"],"":["*"]}},"optimizer":{"runs":200,"enabled":true},"libraries":{},"evmVersion":"london"}
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"_governanceSettings","internalType":"contract IGovernanceSettings"},{"type":"address","name":"_initialGovernance","internalType":"address"},{"type":"bool","name":"_supportRevoke","internalType":"bool"}]},{"type":"event","name":"AgentDataChanged","inputs":[{"type":"address","name":"managementAddress","internalType":"address","indexed":true},{"type":"string","name":"name","internalType":"string","indexed":false},{"type":"string","name":"description","internalType":"string","indexed":false},{"type":"string","name":"iconUrl","internalType":"string","indexed":false}],"anonymous":false},{"type":"event","name":"GovernanceCallTimelocked","inputs":[{"type":"bytes","name":"encodedCall","internalType":"bytes","indexed":false},{"type":"bytes32","name":"encodedCallHash","internalType":"bytes32","indexed":false},{"type":"uint256","name":"allowedAfterTimestamp","internalType":"uint256","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":"bytes32","name":"encodedCallHash","internalType":"bytes32","indexed":false}],"anonymous":false},{"type":"event","name":"TimelockedGovernanceCallExecuted","inputs":[{"type":"bytes32","name":"encodedCallHash","internalType":"bytes32","indexed":false}],"anonymous":false},{"type":"event","name":"Whitelisted","inputs":[{"type":"address","name":"value","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"WhitelistingRevoked","inputs":[{"type":"address","name":"value","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"WorkAddressChanged","inputs":[{"type":"address","name":"managementAddress","internalType":"address","indexed":true},{"type":"address","name":"prevWorkAddress","internalType":"address","indexed":false},{"type":"address","name":"workAddress","internalType":"address","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"addAddressToWhitelist","inputs":[{"type":"address","name":"_address","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"addAddressesToWhitelist","inputs":[{"type":"address[]","name":"_addresses","internalType":"address[]"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"allowAll","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"cancelGovernanceCall","inputs":[{"type":"bytes","name":"_encodedCall","internalType":"bytes"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"executeGovernanceCall","inputs":[{"type":"bytes","name":"_encodedCall","internalType":"bytes"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"getAgentDescription","inputs":[{"type":"address","name":"_managementAddress","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"getAgentIconUrl","inputs":[{"type":"address","name":"_managementAddress","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"getAgentName","inputs":[{"type":"address","name":"_managementAddress","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"getManagementAddress","inputs":[{"type":"address","name":"_workAddress","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"getWorkAddress","inputs":[{"type":"address","name":"_managementAddress","internalType":"address"}]},{"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":"_governanceSettings","internalType":"contract IGovernanceSettings"},{"type":"address","name":"_initialGovernance","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isExecutor","inputs":[{"type":"address","name":"_address","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isWhitelisted","inputs":[{"type":"address","name":"_address","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"productionMode","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"revokeAddress","inputs":[{"type":"address","name":"_address","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setAllowAll","inputs":[{"type":"bool","name":"_allowAll","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setWorkAddress","inputs":[{"type":"address","name":"_ownerWorkAddress","internalType":"address"}]},{"type":"function","stateMutability":"pure","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"supportsInterface","inputs":[{"type":"bytes4","name":"_interfaceId","internalType":"bytes4"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"supportsRevoke","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"switchToProductionMode","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"whitelistAndDescribeAgent","inputs":[{"type":"address","name":"_managementAddress","internalType":"address"},{"type":"string","name":"_name","internalType":"string"},{"type":"string","name":"_description","internalType":"string"},{"type":"string","name":"_iconUrl","internalType":"string"}]}]
Contract Creation Code
0x60a06040523480156200001157600080fd5b5060405162001b2238038062001b22833981016040819052620000349162000214565b828282828262000045828262000062565b5050151560805250506000805460ff19169055506200026c915050565b7f2aa47ee5db910f3b2a06970c443249cc77dbd9f96100cfebc1775ab7fb1d18248054600160a01b900460ff1615620000e25760405162461bcd60e51b815260206004820152601460248201527f696e697469616c6973656420213d2066616c736500000000000000000000000060448201526064015b60405180910390fd5b6001600160a01b0383166200013a5760405162461bcd60e51b815260206004820152601860248201527f676f7665726e616e63652073657474696e6773207a65726f00000000000000006044820152606401620000d9565b6001600160a01b038216620001855760405162461bcd60e51b815260206004820152601060248201526f5f676f7665726e616e6365207a65726f60801b6044820152606401620000d9565b80546001600160a01b038481166001600160a81b031990921691909117600160a01b1782556001820180549184166001600160a01b0319909216821790556040519081527f9789733827840833afc031fb2ef9ab6894271f77bad2085687cf4ae5c7bee4db9060200160405180910390a1505050565b6001600160a01b03811681146200021157600080fd5b50565b6000806000606084860312156200022a57600080fd5b83516200023781620001fb565b60208501519093506200024a81620001fb565b604085015190925080151581146200026157600080fd5b809150509250925092565b6080516118936200028f600039600081816101eb015261069e01526118936000f3fe608060405234801561001057600080fd5b506004361061014d5760003560e01c8063689baff0116100c3578063debfda301161007c578063debfda30146102f8578063e17f212e1461030b578063e2ec6ec31461032a578063ef88bf131461033d578063f5a9838314610350578063fc31a2e81461035857600080fd5b8063689baff01461027957806378d2ac291461028c5780637b9417c8146102ac5780638d28b5e9146102bf578063c6062392146102d2578063cf5d3c30146102e557600080fd5b8063317a7aec11610115578063317a7aec1461020d5780633af32abf146102205780634d7d9c01146102335780634ee643a5146102465780635aa6e6751461025357806362354e031461025b57600080fd5b806301ffc9a714610152578063073e824e1461017a57806316fc2f6d146101be57806320c5f99d146101d35780632583e7f7146101e6575b600080fd5b610165610160366004611234565b610384565b60405190151581526020015b60405180910390f35b6101a6610188366004611273565b6001600160a01b039081166000908152600260205260409020541690565b6040516001600160a01b039091168152602001610171565b6101d16101cc366004611290565b6103b0565b005b6101d16101e1366004611290565b610498565b6101657f000000000000000000000000000000000000000000000000000000000000000081565b6101d161021b366004611273565b610687565b61016561022e366004611273565b610719565b6101d1610241366004611310565b610747565b6000546101659060ff1681565b6101a661076d565b60008051602061183e833981519152546001600160a01b03166101a6565b6101d1610287366004611273565b610816565b61029f61029a366004611273565b6109bb565b6040516101719190611373565b6101d16102ba366004611273565b610a67565b61029f6102cd366004611273565b610a78565b61029f6102e0366004611273565b610a9f565b6101d16102f336600461143d565b610ac6565b610165610306366004611273565b610ae9565b60008051602061183e83398151915254600160a81b900460ff16610165565b6101d16103383660046114d8565b610b83565b6101d161034b36600461158a565b610bc5565b6101d1610d39565b6101a6610366366004611273565b6001600160a01b039081166000908152600360205260409020541690565b600061038f82610e0e565b806103aa57506001600160e01b0319821663323cc6bd60e21b145b92915050565b6103b8610e44565b60405160008051602061183e833981519152906000906103db90859085906115c3565b604051809103902090508160020160008281526020019081526020016000205460000361044f5760405162461bcd60e51b815260206004820152601a60248201527f74696d656c6f636b3a20696e76616c69642073656c6563746f7200000000000060448201526064015b60405180910390fd5b6040518181527f69b058d6225c01c1f2a25801ca5b05705fa2e9118e93d518390ba804398c87b19060200160405180910390a16000908152600290910160205260408120555050565b60008051602061183e8339815191526104b033610ae9565b6104ec5760405162461bcd60e51b815260206004820152600d60248201526c37b7363c9032bc32b1baba37b960991b6044820152606401610446565b600083836040516104fe9291906115c3565b6040805191829003909120600081815260028501602052918220549092509081900361056c5760405162461bcd60e51b815260206004820152601a60248201527f74696d656c6f636b3a20696e76616c69642073656c6563746f720000000000006044820152606401610446565b804210156105bc5760405162461bcd60e51b815260206004820152601960248201527f74696d656c6f636b3a206e6f7420616c6c6f77656420796574000000000000006044820152606401610446565b6000828152600284016020526040808220829055845460ff60b01b1916600160b01b1785555130906105f190889088906115c3565b6000604051808303816000865af19150503d806000811461062e576040519150601f19603f3d011682016040523d82523d6000602084013e610633565b606091505b5050845460ff60b01b191685556040518481529091507fec1225e5a8a8acb91e03ce648c683c74f5d152a775b9715980999441d714c44f9060200160405180910390a161067f81610ea0565b505050505050565b61068f610ebd565b1561070c5761069c610ef3565b7f00000000000000000000000000000000000000000000000000000000000000006107005760405162461bcd60e51b81526020600482015260146024820152731c995d9bdad9481b9bdd081cdd5c1c1bdc9d195960621b6044820152606401610446565b61070981610f37565b50565b6107096000366000610fab565b6001600160a01b03811660009081526001602052604081205460ff16806103aa575060005460ff1692915050565b61074f610ebd565b1561070c5761075c610ef3565b6000805460ff191682151517905550565b60008051602061183e833981519152805460009190600160a81b900460ff166107a35760018101546001600160a01b0316610810565b805460408051631cc9492560e21b815290516001600160a01b03909216916373252494916004808201926020929091908290030181865afa1580156107ec573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061081091906115d3565b91505090565b61081f33610719565b6108635760405162461bcd60e51b81526020600482015260156024820152741859d95b9d081b9bdd081dda1a5d195b1a5cdd1959605a1b6044820152606401610446565b6001600160a01b038116158061089157506001600160a01b0381811660009081526002602052604090205416155b6108d35760405162461bcd60e51b8152602060048201526013602482015272776f726b206164647265737320696e2075736560681b6044820152606401610446565b336000908152600360205260409020546001600160a01b03168015610919576001600160a01b038116600090815260026020526040902080546001600160a01b03191690555b33600090815260036020526040902080546001600160a01b0319166001600160a01b03841690811790915515610972576001600160a01b038216600090815260026020526040902080546001600160a01b031916331790555b604080516001600160a01b0383811682528416602082015233917f174ce844d7e28d695e043ecb1f4f404b2b32b9d554236756bbbf09c730cfaf20910160405180910390a25050565b6001600160a01b03811660009081526005602052604090208054606091906109e2906115f0565b80601f0160208091040260200160405190810160405280929190818152602001828054610a0e906115f0565b8015610a5b5780601f10610a3057610100808354040283529160200191610a5b565b820191906000526020600020905b815481529060010190602001808311610a3e57829003601f168201915b50505050509050919050565b610a6f610e44565b610709816110c2565b6001600160a01b03811660009081526006602052604090208054606091906109e2906115f0565b6001600160a01b03811660009081526004602052604090208054606091906109e2906115f0565b610ace610e44565b610ad7846110c2565b610ae384848484611180565b50505050565b60008051602061183e833981519152805460009190600160a01b900460ff168015610b7c57508054604051630debfda360e41b81526001600160a01b0385811660048301529091169063debfda3090602401602060405180830381865afa158015610b58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b7c919061162a565b9392505050565b610b8b610e44565b60005b8151811015610bc157610bb9828281518110610bac57610bac611647565b60200260200101516110c2565b600101610b8e565b5050565b60008051602061183e8339815191528054600160a01b900460ff1615610c245760405162461bcd60e51b8152602060048201526014602482015273696e697469616c6973656420213d2066616c736560601b6044820152606401610446565b6001600160a01b038316610c7a5760405162461bcd60e51b815260206004820152601860248201527f676f7665726e616e63652073657474696e6773207a65726f00000000000000006044820152606401610446565b6001600160a01b038216610cc35760405162461bcd60e51b815260206004820152601060248201526f5f676f7665726e616e6365207a65726f60801b6044820152606401610446565b80546001600160a01b038481166001600160a81b031990921691909117600160a01b1782556001820180549184166001600160a01b0319909216821790556040519081527f9789733827840833afc031fb2ef9ab6894271f77bad2085687cf4ae5c7bee4db9060200160405180910390a1505050565b610d41610e44565b60008051602061183e8339815191528054600160a81b900460ff1615610da95760405162461bcd60e51b815260206004820152601a60248201527f616c726561647920696e2070726f64756374696f6e206d6f64650000000000006044820152606401610446565b6001810180546001600160a01b03191690558054600160a81b60ff60a81b1982161782556040516001600160a01b0390911681527f83af113638b5422f9e977cebc0aaf0eaf2188eb9a8baae7f9d46c42b33a1560c906020015b60405180910390a150565b60006001600160e01b031982166301ffc9a760e01b14806103aa57506001600160e01b03198216633af32abf60e01b1492915050565b610e4c61076d565b6001600160a01b0316336001600160a01b031614610e9e5760405162461bcd60e51b815260206004820152600f60248201526e6f6e6c7920676f7665726e616e636560881b6044820152606401610446565b565b3d604051818101604052816000823e8215610eb9578181f35b8181fd5b60008051602061183e833981519152805460009190600160b01b900460ff1680610810575054600160a81b900460ff1615919050565b60008051602061183e8339815191528054600160b01b900460ff1615610f2f57333014610f2257610f2261165d565b805460ff60b01b19169055565b610709610e44565b6001600160a01b03811660009081526001602052604090205460ff16610f5a5750565b6001600160a01b038116600081815260016020908152604091829020805460ff1916905590519182527fe01091cddc91f5497c62b6d5b4ae6514036739c2528f0463485236065e1eba4a9101610e03565b60008051602061183e833981519152610fc2610e44565b60008484604051610fd49291906115c3565b604080519182900382208454636221a54b60e01b845291519093506000926001600160a01b0390921691636221a54b9160048083019260209291908290030181865afa158015611028573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061104c9190611673565b9050838110156110595750825b6000611065824261168c565b600084815260028601602052604090819020829055519091507f8c02104dfc280f713854f25297de671710c544c58de69dbde8fb66974ce1ab9e906110b19089908990879086906116ad565b60405180910390a150505050505050565b6001600160a01b0381166111075760405162461bcd60e51b815260206004820152600c60248201526b61646472657373207a65726f60a01b6044820152606401610446565b6001600160a01b03811660009081526001602052604090205460ff161561112b5750565b6001600160a01b038116600081815260016020818152604092839020805460ff191690921790915590519182527faab7954e9d246b167ef88aeddad35209ca2489d95a8aeb59e288d9b19fae5a549101610e03565b6001600160a01b03841660009081526004602052604090206111a2848261173a565b506001600160a01b03841660009081526005602052604090206111c5838261173a565b506001600160a01b03841660009081526006602052604090206111e8828261173a565b50836001600160a01b03167fdfc42408096207c0b2f3755d74f7f3179c9329dd74cc7953dbdc5832b25f3376848484604051611226939291906117fa565b60405180910390a250505050565b60006020828403121561124657600080fd5b81356001600160e01b031981168114610b7c57600080fd5b6001600160a01b038116811461070957600080fd5b60006020828403121561128557600080fd5b8135610b7c8161125e565b600080602083850312156112a357600080fd5b823567ffffffffffffffff808211156112bb57600080fd5b818501915085601f8301126112cf57600080fd5b8135818111156112de57600080fd5b8660208285010111156112f057600080fd5b60209290920196919550909350505050565b801515811461070957600080fd5b60006020828403121561132257600080fd5b8135610b7c81611302565b6000815180845260005b8181101561135357602081850181015186830182015201611337565b506000602082860101526020601f19601f83011685010191505092915050565b602081526000610b7c602083018461132d565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156113c5576113c5611386565b604052919050565b600082601f8301126113de57600080fd5b813567ffffffffffffffff8111156113f8576113f8611386565b61140b601f8201601f191660200161139c565b81815284602083860101111561142057600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000806080858703121561145357600080fd5b843561145e8161125e565b9350602085013567ffffffffffffffff8082111561147b57600080fd5b611487888389016113cd565b9450604087013591508082111561149d57600080fd5b6114a9888389016113cd565b935060608701359150808211156114bf57600080fd5b506114cc878288016113cd565b91505092959194509250565b600060208083850312156114eb57600080fd5b823567ffffffffffffffff8082111561150357600080fd5b818501915085601f83011261151757600080fd5b81358181111561152957611529611386565b8060051b915061153a84830161139c565b818152918301840191848101908884111561155457600080fd5b938501935b8385101561157e578435925061156e8361125e565b8282529385019390850190611559565b98975050505050505050565b6000806040838503121561159d57600080fd5b82356115a88161125e565b915060208301356115b88161125e565b809150509250929050565b8183823760009101908152919050565b6000602082840312156115e557600080fd5b8151610b7c8161125e565b600181811c9082168061160457607f821691505b60208210810361162457634e487b7160e01b600052602260045260246000fd5b50919050565b60006020828403121561163c57600080fd5b8151610b7c81611302565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052600160045260246000fd5b60006020828403121561168557600080fd5b5051919050565b808201808211156103aa57634e487b7160e01b600052601160045260246000fd5b606081528360608201528385608083013760006080858301015260006080601f19601f870116830101905083602083015282604083015295945050505050565b601f821115611735576000816000526020600020601f850160051c810160208610156117165750805b601f850160051c820191505b8181101561067f57828155600101611722565b505050565b815167ffffffffffffffff81111561175457611754611386565b6117688161176284546115f0565b846116ed565b602080601f83116001811461179d57600084156117855750858301515b600019600386901b1c1916600185901b17855561067f565b600085815260208120601f198616915b828110156117cc578886015182559484019460019091019084016117ad565b50858210156117ea5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60608152600061180d606083018661132d565b828103602084015261181f818661132d565b90508281036040840152611833818561132d565b969550505050505056fe2aa47ee5db910f3b2a06970c443249cc77dbd9f96100cfebc1775ab7fb1d1824a26469706673582212205b71b2067e5a7f7d778283c238ffc3da700df3c40a9f1f56c53fdfb316491c1964736f6c63430008170033000000000000000000000000183faff6997c98a812a3b98748fc80241d08f3120000000000000000000000005a11fa259c898e6973db2f3c9e82339a53c777c00000000000000000000000000000000000000000000000000000000000000001
Deployed ByteCode
0x608060405234801561001057600080fd5b506004361061014d5760003560e01c8063689baff0116100c3578063debfda301161007c578063debfda30146102f8578063e17f212e1461030b578063e2ec6ec31461032a578063ef88bf131461033d578063f5a9838314610350578063fc31a2e81461035857600080fd5b8063689baff01461027957806378d2ac291461028c5780637b9417c8146102ac5780638d28b5e9146102bf578063c6062392146102d2578063cf5d3c30146102e557600080fd5b8063317a7aec11610115578063317a7aec1461020d5780633af32abf146102205780634d7d9c01146102335780634ee643a5146102465780635aa6e6751461025357806362354e031461025b57600080fd5b806301ffc9a714610152578063073e824e1461017a57806316fc2f6d146101be57806320c5f99d146101d35780632583e7f7146101e6575b600080fd5b610165610160366004611234565b610384565b60405190151581526020015b60405180910390f35b6101a6610188366004611273565b6001600160a01b039081166000908152600260205260409020541690565b6040516001600160a01b039091168152602001610171565b6101d16101cc366004611290565b6103b0565b005b6101d16101e1366004611290565b610498565b6101657f000000000000000000000000000000000000000000000000000000000000000181565b6101d161021b366004611273565b610687565b61016561022e366004611273565b610719565b6101d1610241366004611310565b610747565b6000546101659060ff1681565b6101a661076d565b60008051602061183e833981519152546001600160a01b03166101a6565b6101d1610287366004611273565b610816565b61029f61029a366004611273565b6109bb565b6040516101719190611373565b6101d16102ba366004611273565b610a67565b61029f6102cd366004611273565b610a78565b61029f6102e0366004611273565b610a9f565b6101d16102f336600461143d565b610ac6565b610165610306366004611273565b610ae9565b60008051602061183e83398151915254600160a81b900460ff16610165565b6101d16103383660046114d8565b610b83565b6101d161034b36600461158a565b610bc5565b6101d1610d39565b6101a6610366366004611273565b6001600160a01b039081166000908152600360205260409020541690565b600061038f82610e0e565b806103aa57506001600160e01b0319821663323cc6bd60e21b145b92915050565b6103b8610e44565b60405160008051602061183e833981519152906000906103db90859085906115c3565b604051809103902090508160020160008281526020019081526020016000205460000361044f5760405162461bcd60e51b815260206004820152601a60248201527f74696d656c6f636b3a20696e76616c69642073656c6563746f7200000000000060448201526064015b60405180910390fd5b6040518181527f69b058d6225c01c1f2a25801ca5b05705fa2e9118e93d518390ba804398c87b19060200160405180910390a16000908152600290910160205260408120555050565b60008051602061183e8339815191526104b033610ae9565b6104ec5760405162461bcd60e51b815260206004820152600d60248201526c37b7363c9032bc32b1baba37b960991b6044820152606401610446565b600083836040516104fe9291906115c3565b6040805191829003909120600081815260028501602052918220549092509081900361056c5760405162461bcd60e51b815260206004820152601a60248201527f74696d656c6f636b3a20696e76616c69642073656c6563746f720000000000006044820152606401610446565b804210156105bc5760405162461bcd60e51b815260206004820152601960248201527f74696d656c6f636b3a206e6f7420616c6c6f77656420796574000000000000006044820152606401610446565b6000828152600284016020526040808220829055845460ff60b01b1916600160b01b1785555130906105f190889088906115c3565b6000604051808303816000865af19150503d806000811461062e576040519150601f19603f3d011682016040523d82523d6000602084013e610633565b606091505b5050845460ff60b01b191685556040518481529091507fec1225e5a8a8acb91e03ce648c683c74f5d152a775b9715980999441d714c44f9060200160405180910390a161067f81610ea0565b505050505050565b61068f610ebd565b1561070c5761069c610ef3565b7f00000000000000000000000000000000000000000000000000000000000000016107005760405162461bcd60e51b81526020600482015260146024820152731c995d9bdad9481b9bdd081cdd5c1c1bdc9d195960621b6044820152606401610446565b61070981610f37565b50565b6107096000366000610fab565b6001600160a01b03811660009081526001602052604081205460ff16806103aa575060005460ff1692915050565b61074f610ebd565b1561070c5761075c610ef3565b6000805460ff191682151517905550565b60008051602061183e833981519152805460009190600160a81b900460ff166107a35760018101546001600160a01b0316610810565b805460408051631cc9492560e21b815290516001600160a01b03909216916373252494916004808201926020929091908290030181865afa1580156107ec573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061081091906115d3565b91505090565b61081f33610719565b6108635760405162461bcd60e51b81526020600482015260156024820152741859d95b9d081b9bdd081dda1a5d195b1a5cdd1959605a1b6044820152606401610446565b6001600160a01b038116158061089157506001600160a01b0381811660009081526002602052604090205416155b6108d35760405162461bcd60e51b8152602060048201526013602482015272776f726b206164647265737320696e2075736560681b6044820152606401610446565b336000908152600360205260409020546001600160a01b03168015610919576001600160a01b038116600090815260026020526040902080546001600160a01b03191690555b33600090815260036020526040902080546001600160a01b0319166001600160a01b03841690811790915515610972576001600160a01b038216600090815260026020526040902080546001600160a01b031916331790555b604080516001600160a01b0383811682528416602082015233917f174ce844d7e28d695e043ecb1f4f404b2b32b9d554236756bbbf09c730cfaf20910160405180910390a25050565b6001600160a01b03811660009081526005602052604090208054606091906109e2906115f0565b80601f0160208091040260200160405190810160405280929190818152602001828054610a0e906115f0565b8015610a5b5780601f10610a3057610100808354040283529160200191610a5b565b820191906000526020600020905b815481529060010190602001808311610a3e57829003601f168201915b50505050509050919050565b610a6f610e44565b610709816110c2565b6001600160a01b03811660009081526006602052604090208054606091906109e2906115f0565b6001600160a01b03811660009081526004602052604090208054606091906109e2906115f0565b610ace610e44565b610ad7846110c2565b610ae384848484611180565b50505050565b60008051602061183e833981519152805460009190600160a01b900460ff168015610b7c57508054604051630debfda360e41b81526001600160a01b0385811660048301529091169063debfda3090602401602060405180830381865afa158015610b58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b7c919061162a565b9392505050565b610b8b610e44565b60005b8151811015610bc157610bb9828281518110610bac57610bac611647565b60200260200101516110c2565b600101610b8e565b5050565b60008051602061183e8339815191528054600160a01b900460ff1615610c245760405162461bcd60e51b8152602060048201526014602482015273696e697469616c6973656420213d2066616c736560601b6044820152606401610446565b6001600160a01b038316610c7a5760405162461bcd60e51b815260206004820152601860248201527f676f7665726e616e63652073657474696e6773207a65726f00000000000000006044820152606401610446565b6001600160a01b038216610cc35760405162461bcd60e51b815260206004820152601060248201526f5f676f7665726e616e6365207a65726f60801b6044820152606401610446565b80546001600160a01b038481166001600160a81b031990921691909117600160a01b1782556001820180549184166001600160a01b0319909216821790556040519081527f9789733827840833afc031fb2ef9ab6894271f77bad2085687cf4ae5c7bee4db9060200160405180910390a1505050565b610d41610e44565b60008051602061183e8339815191528054600160a81b900460ff1615610da95760405162461bcd60e51b815260206004820152601a60248201527f616c726561647920696e2070726f64756374696f6e206d6f64650000000000006044820152606401610446565b6001810180546001600160a01b03191690558054600160a81b60ff60a81b1982161782556040516001600160a01b0390911681527f83af113638b5422f9e977cebc0aaf0eaf2188eb9a8baae7f9d46c42b33a1560c906020015b60405180910390a150565b60006001600160e01b031982166301ffc9a760e01b14806103aa57506001600160e01b03198216633af32abf60e01b1492915050565b610e4c61076d565b6001600160a01b0316336001600160a01b031614610e9e5760405162461bcd60e51b815260206004820152600f60248201526e6f6e6c7920676f7665726e616e636560881b6044820152606401610446565b565b3d604051818101604052816000823e8215610eb9578181f35b8181fd5b60008051602061183e833981519152805460009190600160b01b900460ff1680610810575054600160a81b900460ff1615919050565b60008051602061183e8339815191528054600160b01b900460ff1615610f2f57333014610f2257610f2261165d565b805460ff60b01b19169055565b610709610e44565b6001600160a01b03811660009081526001602052604090205460ff16610f5a5750565b6001600160a01b038116600081815260016020908152604091829020805460ff1916905590519182527fe01091cddc91f5497c62b6d5b4ae6514036739c2528f0463485236065e1eba4a9101610e03565b60008051602061183e833981519152610fc2610e44565b60008484604051610fd49291906115c3565b604080519182900382208454636221a54b60e01b845291519093506000926001600160a01b0390921691636221a54b9160048083019260209291908290030181865afa158015611028573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061104c9190611673565b9050838110156110595750825b6000611065824261168c565b600084815260028601602052604090819020829055519091507f8c02104dfc280f713854f25297de671710c544c58de69dbde8fb66974ce1ab9e906110b19089908990879086906116ad565b60405180910390a150505050505050565b6001600160a01b0381166111075760405162461bcd60e51b815260206004820152600c60248201526b61646472657373207a65726f60a01b6044820152606401610446565b6001600160a01b03811660009081526001602052604090205460ff161561112b5750565b6001600160a01b038116600081815260016020818152604092839020805460ff191690921790915590519182527faab7954e9d246b167ef88aeddad35209ca2489d95a8aeb59e288d9b19fae5a549101610e03565b6001600160a01b03841660009081526004602052604090206111a2848261173a565b506001600160a01b03841660009081526005602052604090206111c5838261173a565b506001600160a01b03841660009081526006602052604090206111e8828261173a565b50836001600160a01b03167fdfc42408096207c0b2f3755d74f7f3179c9329dd74cc7953dbdc5832b25f3376848484604051611226939291906117fa565b60405180910390a250505050565b60006020828403121561124657600080fd5b81356001600160e01b031981168114610b7c57600080fd5b6001600160a01b038116811461070957600080fd5b60006020828403121561128557600080fd5b8135610b7c8161125e565b600080602083850312156112a357600080fd5b823567ffffffffffffffff808211156112bb57600080fd5b818501915085601f8301126112cf57600080fd5b8135818111156112de57600080fd5b8660208285010111156112f057600080fd5b60209290920196919550909350505050565b801515811461070957600080fd5b60006020828403121561132257600080fd5b8135610b7c81611302565b6000815180845260005b8181101561135357602081850181015186830182015201611337565b506000602082860101526020601f19601f83011685010191505092915050565b602081526000610b7c602083018461132d565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156113c5576113c5611386565b604052919050565b600082601f8301126113de57600080fd5b813567ffffffffffffffff8111156113f8576113f8611386565b61140b601f8201601f191660200161139c565b81815284602083860101111561142057600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000806080858703121561145357600080fd5b843561145e8161125e565b9350602085013567ffffffffffffffff8082111561147b57600080fd5b611487888389016113cd565b9450604087013591508082111561149d57600080fd5b6114a9888389016113cd565b935060608701359150808211156114bf57600080fd5b506114cc878288016113cd565b91505092959194509250565b600060208083850312156114eb57600080fd5b823567ffffffffffffffff8082111561150357600080fd5b818501915085601f83011261151757600080fd5b81358181111561152957611529611386565b8060051b915061153a84830161139c565b818152918301840191848101908884111561155457600080fd5b938501935b8385101561157e578435925061156e8361125e565b8282529385019390850190611559565b98975050505050505050565b6000806040838503121561159d57600080fd5b82356115a88161125e565b915060208301356115b88161125e565b809150509250929050565b8183823760009101908152919050565b6000602082840312156115e557600080fd5b8151610b7c8161125e565b600181811c9082168061160457607f821691505b60208210810361162457634e487b7160e01b600052602260045260246000fd5b50919050565b60006020828403121561163c57600080fd5b8151610b7c81611302565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052600160045260246000fd5b60006020828403121561168557600080fd5b5051919050565b808201808211156103aa57634e487b7160e01b600052601160045260246000fd5b606081528360608201528385608083013760006080858301015260006080601f19601f870116830101905083602083015282604083015295945050505050565b601f821115611735576000816000526020600020601f850160051c810160208610156117165750805b601f850160051c820191505b8181101561067f57828155600101611722565b505050565b815167ffffffffffffffff81111561175457611754611386565b6117688161176284546115f0565b846116ed565b602080601f83116001811461179d57600084156117855750858301515b600019600386901b1c1916600185901b17855561067f565b600085815260208120601f198616915b828110156117cc578886015182559484019460019091019084016117ad565b50858210156117ea5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60608152600061180d606083018661132d565b828103602084015261181f818661132d565b90508281036040840152611833818561132d565b969550505050505056fe2aa47ee5db910f3b2a06970c443249cc77dbd9f96100cfebc1775ab7fb1d1824a26469706673582212205b71b2067e5a7f7d778283c238ffc3da700df3c40a9f1f56c53fdfb316491c1964736f6c63430008170033