There are reports that this address was used in a Phishing scam. Please exercise caution when interacting with it. Reported by GoPlusSecurity.
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 16 from a total of 16 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Transfer From | 21558127 | 102 days ago | IN | 0 ETH | 0.00044971 | ||||
Safe Transfer Fr... | 21440470 | 118 days ago | IN | 0 ETH | 0.00039812 | ||||
Safe Transfer Fr... | 21418484 | 121 days ago | IN | 0 ETH | 0.00047698 | ||||
Safe Transfer Fr... | 21418472 | 121 days ago | IN | 0 ETH | 0.00066087 | ||||
Transfer From | 21108908 | 164 days ago | IN | 0 ETH | 0.00017412 | ||||
Approve | 21048928 | 173 days ago | IN | 0 ETH | 0.00021783 | ||||
Transfer From | 19821269 | 344 days ago | IN | 0 ETH | 0.00015012 | ||||
Safe Transfer Fr... | 19733405 | 356 days ago | IN | 0 ETH | 0.00146648 | ||||
Transfer From | 19225975 | 428 days ago | IN | 0 ETH | 0.000946 | ||||
Transfer From | 19225972 | 428 days ago | IN | 0 ETH | 0.00111328 | ||||
Transfer From | 19225968 | 428 days ago | IN | 0 ETH | 0.00109283 | ||||
Transfer From | 19225962 | 428 days ago | IN | 0 ETH | 0.0010947 | ||||
Transfer From | 18998362 | 459 days ago | IN | 0 ETH | 0.00098665 | ||||
Transfer From | 18711838 | 500 days ago | IN | 0 ETH | 0.00238056 | ||||
Change Owner | 16032957 | 876 days ago | IN | 0 ETH | 0.00033471 | ||||
Change Manager | 15178514 | 1002 days ago | IN | 0 ETH | 0.00074464 |
Advanced mode: Intended for advanced users or developers and will display all Internal Transactions including zero value transfers. Name tag integration is not available in advanced view.
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Method | Block |
From
|
To
|
||||
---|---|---|---|---|---|---|---|---|
Owner Of | 22239535 | 6 days ago | 0 ETH | |||||
Total Supply | 22239535 | 6 days ago | 0 ETH | |||||
Total Supply | 22239528 | 6 days ago | 0 ETH | |||||
Total Supply | 22225637 | 8 days ago | 0 ETH | |||||
Total Supply | 22212690 | 10 days ago | 0 ETH | |||||
Total Supply | 22212688 | 10 days ago | 0 ETH | |||||
Total Supply | 22212686 | 10 days ago | 0 ETH | |||||
Owner Of | 22212681 | 10 days ago | 0 ETH | |||||
Total Supply | 22212681 | 10 days ago | 0 ETH | |||||
Owner Of | 22175649 | 15 days ago | 0 ETH | |||||
Total Supply | 22175649 | 15 days ago | 0 ETH | |||||
Owner Of | 22081738 | 28 days ago | 0 ETH | |||||
Owner Of | 22081738 | 28 days ago | 0 ETH | |||||
Total Supply | 22081738 | 28 days ago | 0 ETH | |||||
Total Supply | 22060680 | 31 days ago | 0 ETH | |||||
Total Supply | 22040677 | 34 days ago | 0 ETH | |||||
Total Supply | 22040672 | 34 days ago | 0 ETH | |||||
Total Supply | 22040669 | 34 days ago | 0 ETH | |||||
Calculate Sub Co... | 21994255 | 41 days ago | 0 ETH | |||||
Total Supply | 21994206 | 41 days ago | 0 ETH | |||||
Total Supply | 21994141 | 41 days ago | 0 ETH | |||||
Owner Of | 21989057 | 41 days ago | 0 ETH | |||||
Owner Of | 21989057 | 41 days ago | 0 ETH | |||||
Total Supply | 21989057 | 41 days ago | 0 ETH | |||||
Total Supply | 21984395 | 42 days ago | 0 ETH |
Loading...
Loading
Contract Name:
AgentRegistry
Compiler Version
v0.8.15+commit.e14f2714
Optimization Enabled:
Yes with 750 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.15; import "./UnitRegistry.sol"; import "./interfaces/IRegistry.sol"; /// @title Agent Registry - Smart contract for registering agents /// @author Aleksandr Kuperman - <[email protected]> contract AgentRegistry is UnitRegistry { // Component registry address public immutable componentRegistry; // Agent registry version number string public constant VERSION = "1.0.0"; /// @dev Agent registry constructor. /// @param _name Agent registry contract name. /// @param _symbol Agent registry contract symbol. /// @param _baseURI Agent registry token base URI. /// @param _componentRegistry Component registry address. constructor(string memory _name, string memory _symbol, string memory _baseURI, address _componentRegistry) UnitRegistry(UnitType.Agent) ERC721(_name, _symbol) { baseURI = _baseURI; componentRegistry = _componentRegistry; owner = msg.sender; } /// @dev Checks provided component dependencies. /// @param dependencies Set of component dependencies. function _checkDependencies(uint32[] memory dependencies, uint32) internal virtual override { // Check that the agent has at least one component if (dependencies.length == 0) { revert ZeroValue(); } // Get the components total supply uint32 componentTotalSupply = uint32(IRegistry(componentRegistry).totalSupply()); uint32 lastId; for (uint256 iDep = 0; iDep < dependencies.length; ++iDep) { if (dependencies[iDep] < (lastId + 1) || dependencies[iDep] > componentTotalSupply) { revert ComponentNotFound(dependencies[iDep]); } lastId = dependencies[iDep]; } } /// @dev Gets linearized set of subcomponents of a provided unit Id and a type of a component. /// @notice (0) For components this means getting the linearized map of components from the componentRegistry contract. /// @notice (1) For agents this means getting the linearized map of components from the local map of subcomponents. /// @param subcomponentsFromType Type of the unit: component or agent. /// @param unitId Component Id. /// @return subComponentIds Set of subcomponents. function _getSubComponents(UnitType subcomponentsFromType, uint32 unitId) internal view virtual override returns (uint32[] memory subComponentIds) { // Self contract (agent registry) can only call subcomponents calculation from the component level (0) // Otherwise, the subcomponents are already written into the corresponding subcomponents map if (subcomponentsFromType == UnitType.Component) { (subComponentIds, ) = IRegistry(componentRegistry).getLocalSubComponents(uint256(unitId)); } else { subComponentIds = mapSubComponents[uint256(unitId)]; } } /// @dev Calculates the set of subcomponent Ids. /// @notice We assume that the external callers calculate subcomponents from the higher unit hierarchy level: agents. /// @param unitIds Unit Ids. /// @return subComponentIds Subcomponent Ids. function calculateSubComponents(uint32[] memory unitIds) external view returns (uint32[] memory subComponentIds) { subComponentIds = _calculateSubComponents(UnitType.Agent, unitIds); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.15; import "./GenericRegistry.sol"; /// @title Unit Registry - Smart contract for registering generalized units / units /// @author Aleksandr Kuperman - <[email protected]> abstract contract UnitRegistry is GenericRegistry { event CreateUnit(uint256 unitId, UnitType uType, bytes32 unitHash); event UpdateUnitHash(uint256 unitId, UnitType uType, bytes32 unitHash); enum UnitType { Component, Agent } // Unit parameters struct Unit { // Primary IPFS hash of the unit bytes32 unitHash; // Set of component dependencies (agents are also based on components) // We assume that the system is expected to support no more than 2^32-1 components uint32[] dependencies; } // Type of the unit: component or unit UnitType public immutable unitType; // Map of unit Id => set of updated IPFS hashes mapping(uint256 => bytes32[]) public mapUnitIdHashes; // Map of unit Id => set of subcomponents (possible to derive from any registry) mapping(uint256 => uint32[]) public mapSubComponents; // Map of unit Id => unit mapping(uint256 => Unit) public mapUnits; constructor(UnitType _unitType) { unitType = _unitType; } /// @dev Checks the provided component dependencies. /// @param dependencies Set of component dependencies. /// @param maxUnitId Maximum unit Id. function _checkDependencies(uint32[] memory dependencies, uint32 maxUnitId) internal virtual; /// @dev Creates unit. /// @param unitOwner Owner of the unit. /// @param unitHash IPFS CID hash of the unit. /// @param dependencies Set of unit dependencies in a sorted ascending order (unit Ids). /// @return unitId The id of a minted unit. function create(address unitOwner, bytes32 unitHash, uint32[] memory dependencies) external virtual returns (uint256 unitId) { // Reentrancy guard if (_locked > 1) { revert ReentrancyGuard(); } _locked = 2; // Check for the manager privilege for a unit creation if (manager != msg.sender) { revert ManagerOnly(msg.sender, manager); } // Checks for a non-zero owner address if(unitOwner == address(0)) { revert ZeroAddress(); } // Check for the non-zero hash value if (unitHash == 0) { revert ZeroValue(); } // Check for dependencies validity: must be already allocated, must not repeat unitId = totalSupply; _checkDependencies(dependencies, uint32(unitId)); // Unit with Id = 0 is left empty not to do additional checks for the index zero unitId++; // Initialize the unit and mint its token Unit storage unit = mapUnits[unitId]; unit.unitHash = unitHash; unit.dependencies = dependencies; // Update the map of subcomponents with calculated subcomponents for the new unit Id // In order to get the correct set of subcomponents, we need to differentiate between the callers of this function // Self contract (unit registry) can only call subcomponents calculation from the component level uint32[] memory subComponentIds = _calculateSubComponents(UnitType.Component, dependencies); // We need to add a current component Id to the set of subcomponents if the unit is a component // For example, if component 3 (c3) has dependencies of [c1, c2], then the subcomponents will return [c1, c2]. // The resulting set will be [c1, c2, c3]. So we write into the map of component subcomponents: c3=>[c1, c2, c3]. // This is done such that the subcomponents start getting explored, and when the agent calls its subcomponents, // it would have [c1, c2, c3] right away instead of adding c3 manually and then (for services) checking // if another agent also has c3 as a component dependency. The latter will consume additional computation. if (unitType == UnitType.Component) { uint256 numSubComponents = subComponentIds.length; uint32[] memory addSubComponentIds = new uint32[](numSubComponents + 1); for (uint256 i = 0; i < numSubComponents; ++i) { addSubComponentIds[i] = subComponentIds[i]; } // Adding self component Id addSubComponentIds[numSubComponents] = uint32(unitId); subComponentIds = addSubComponentIds; } mapSubComponents[unitId] = subComponentIds; // Set total supply to the unit Id number totalSupply = unitId; // Safe mint is needed since contracts can create units as well _safeMint(unitOwner, unitId); emit CreateUnit(unitId, unitType, unitHash); _locked = 1; } /// @dev Updates the unit hash. /// @param unitOwner Owner of the unit. /// @param unitId Unit Id. /// @param unitHash Updated IPFS hash of the unit. /// @return success True, if function executed successfully. function updateHash(address unitOwner, uint256 unitId, bytes32 unitHash) external virtual returns (bool success) { // Check the manager privilege for a unit modification if (manager != msg.sender) { revert ManagerOnly(msg.sender, manager); } // Checking the unit ownership if (ownerOf(unitId) != unitOwner) { if (unitType == UnitType.Component) { revert ComponentNotFound(unitId); } else { revert AgentNotFound(unitId); } } // Check for the hash value if (unitHash == 0) { revert ZeroValue(); } mapUnitIdHashes[unitId].push(unitHash); success = true; emit UpdateUnitHash(unitId, unitType, unitHash); } /// @dev Gets the unit instance. /// @param unitId Unit Id. /// @return unit Corresponding Unit struct. function getUnit(uint256 unitId) external view virtual returns (Unit memory unit) { unit = mapUnits[unitId]; } /// @dev Gets unit dependencies. /// @param unitId Unit Id. /// @return numDependencies The number of units in the dependency list. /// @return dependencies The list of unit dependencies. function getDependencies(uint256 unitId) external view virtual returns (uint256 numDependencies, uint32[] memory dependencies) { Unit memory unit = mapUnits[unitId]; return (unit.dependencies.length, unit.dependencies); } /// @dev Gets updated unit hashes. /// @param unitId Unit Id. /// @return numHashes Number of hashes. /// @return unitHashes The list of updated unit hashes (without the primary one). function getUpdatedHashes(uint256 unitId) external view virtual returns (uint256 numHashes, bytes32[] memory unitHashes) { unitHashes = mapUnitIdHashes[unitId]; return (unitHashes.length, unitHashes); } /// @dev Gets the set of subcomponent Ids from a local map of subcomponent. /// @param unitId Component Id. /// @return subComponentIds Set of subcomponent Ids. /// @return numSubComponents Number of subcomponents. function getLocalSubComponents(uint256 unitId) external view returns (uint32[] memory subComponentIds, uint256 numSubComponents) { subComponentIds = mapSubComponents[uint256(unitId)]; numSubComponents = subComponentIds.length; } /// @dev Gets subcomponents of a provided unit Id. /// @param subcomponentsFromType Type of the unit: component or agent. /// @param unitId Unit Id. /// @return subComponentIds Set of subcomponents. function _getSubComponents(UnitType subcomponentsFromType, uint32 unitId) internal view virtual returns (uint32[] memory subComponentIds); /// @dev Calculates the set of subcomponent Ids. /// @param subcomponentsFromType Type of the unit: component or agent. /// @param unitIds Unit Ids. /// @return subComponentIds Subcomponent Ids. function _calculateSubComponents(UnitType subcomponentsFromType, uint32[] memory unitIds) internal view virtual returns (uint32[] memory subComponentIds) { uint32 numUnits = uint32(unitIds.length); // Array of numbers of components per each unit Id uint32[] memory numComponents = new uint32[](numUnits); // 2D array of all the sets of components per each unit Id uint32[][] memory components = new uint32[][](numUnits); // Get total possible number of components and lists of components uint32 maxNumComponents; for (uint32 i = 0; i < numUnits; ++i) { // Get subcomponents for each unit Id based on the subcomponentsFromType components[i] = _getSubComponents(subcomponentsFromType, unitIds[i]); numComponents[i] = uint32(components[i].length); maxNumComponents += numComponents[i]; } // Lists of components are sorted, take unique values in ascending order uint32[] memory allComponents = new uint32[](maxNumComponents); // Processed component counter uint32[] memory processedComponents = new uint32[](numUnits); // Minimal component Id uint32 minComponent; // Overall component counter uint32 counter; // Iterate until we process all components, at the maximum of the sum of all the components in all units for (counter = 0; counter < maxNumComponents; ++counter) { // Index of a minimal component uint32 minIdxComponent; // Amount of components identified as the next minimal component number uint32 numComponentsCheck; uint32 tryMinComponent = type(uint32).max; // Assemble an array of all first components from each component array for (uint32 i = 0; i < numUnits; ++i) { // Either get a component that has a higher id than the last one ore reach the end of the processed Ids for (; processedComponents[i] < numComponents[i]; ++processedComponents[i]) { if (minComponent < components[i][processedComponents[i]]) { // Out of those component Ids that are higher than the last one, pick the minimal one if (components[i][processedComponents[i]] < tryMinComponent) { tryMinComponent = components[i][processedComponents[i]]; minIdxComponent = i; } // If we found a minimal component Id, we increase the counter and break to start the search again numComponentsCheck++; break; } } } minComponent = tryMinComponent; // If minimal component Id is greater than the last one, it should be added, otherwise we reached the end if (numComponentsCheck > 0) { allComponents[counter] = minComponent; processedComponents[minIdxComponent]++; } else { break; } } // Return the exact set of found subcomponents with the counter length subComponentIds = new uint32[](counter); for (uint32 i = 0; i < counter; ++i) { subComponentIds[i] = allComponents[i]; } } /// @dev Gets the hash of the unit. /// @param unitId Unit Id. /// @return Unit hash. function _getUnitHash(uint256 unitId) internal view override returns (bytes32) { return mapUnits[unitId].unitHash; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.15; /// @dev Required interface for the component / agent manipulation. interface IRegistry { enum UnitType { Component, Agent } /// @dev Creates component / agent. /// @param unitOwner Owner of the component / agent. /// @param unitHash IPFS hash of the component / agent. /// @param dependencies Set of component dependencies in a sorted ascending order. /// @return The id of a minted component / agent. function create( address unitOwner, bytes32 unitHash, uint32[] memory dependencies ) external returns (uint256); /// @dev Updates the component / agent hash. /// @param owner Owner of the component / agent. /// @param unitId Unit Id. /// @param unitHash Updated IPFS hash of the component / agent. /// @return success True, if function executed successfully. function updateHash(address owner, uint256 unitId, bytes32 unitHash) external returns (bool success); /// @dev Gets subcomponents of a provided unit Id from a local public map. /// @param unitId Unit Id. /// @return subComponentIds Set of subcomponents. /// @return numSubComponents Number of subcomponents. function getLocalSubComponents(uint256 unitId) external view returns (uint32[] memory subComponentIds, uint256 numSubComponents); /// @dev Calculates the set of subcomponent Ids. /// @param unitIds Set of unit Ids. /// @return subComponentIds Subcomponent Ids. function calculateSubComponents(uint32[] memory unitIds) external view returns (uint32[] memory subComponentIds); /// @dev Gets updated component / agent hashes. /// @param unitId Unit Id. /// @return numHashes Number of hashes. /// @return unitHashes The list of component / agent hashes. function getUpdatedHashes(uint256 unitId) external view returns (uint256 numHashes, bytes32[] memory unitHashes); /// @dev Gets the total supply of components / agents. /// @return Total supply. function totalSupply() external view returns (uint256); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.15; import "../lib/solmate/src/tokens/ERC721.sol"; import "./interfaces/IErrorsRegistries.sol"; /// @title Generic Registry - Smart contract for generic registry template /// @author Aleksandr Kuperman - <[email protected]> abstract contract GenericRegistry is IErrorsRegistries, ERC721 { event OwnerUpdated(address indexed owner); event ManagerUpdated(address indexed manager); event BaseURIChanged(string baseURI); // Owner address address public owner; // Unit manager address public manager; // Base URI string public baseURI; // Unit counter uint256 public totalSupply; // Reentrancy lock uint256 internal _locked = 1; // To better understand the CID anatomy, please refer to: https://proto.school/anatomy-of-a-cid/05 // CID = <multibase_encoding>multibase_encoding(<cid-version><multicodec><multihash-algorithm><multihash-length><multihash-hash>) // CID prefix = <multibase_encoding>multibase_encoding(<cid-version><multicodec><multihash-algorithm><multihash-length>) // to complement the multibase_encoding(<multihash-hash>) // multibase_encoding = base16 = "f" // cid-version = version 1 = "0x01" // multicodec = dag-pb = "0x70" // multihash-algorithm = sha2-256 = "0x12" // multihash-length = 256 bits = "0x20" string public constant CID_PREFIX = "f01701220"; /// @dev Changes the owner address. /// @param newOwner Address of a new owner. function changeOwner(address newOwner) external virtual { // Check for the ownership if (msg.sender != owner) { revert OwnerOnly(msg.sender, owner); } // Check for the zero address if (newOwner == address(0)) { revert ZeroAddress(); } owner = newOwner; emit OwnerUpdated(newOwner); } /// @dev Changes the unit manager. /// @param newManager Address of a new unit manager. function changeManager(address newManager) external virtual { if (msg.sender != owner) { revert OwnerOnly(msg.sender, owner); } // Check for the zero address if (newManager == address(0)) { revert ZeroAddress(); } manager = newManager; emit ManagerUpdated(newManager); } /// @dev Checks for the unit existence. /// @notice Unit counter starts from 1. /// @param unitId Unit Id. /// @return true if the unit exists, false otherwise. function exists(uint256 unitId) external view virtual returns (bool) { return unitId > 0 && unitId < (totalSupply + 1); } /// @dev Sets unit base URI. /// @param bURI Base URI string. function setBaseURI(string memory bURI) external virtual { // Check for the ownership if (msg.sender != owner) { revert OwnerOnly(msg.sender, owner); } // Check for the zero value if (bytes(bURI).length == 0) { revert ZeroValue(); } baseURI = bURI; emit BaseURIChanged(bURI); } /// @dev Gets the valid unit Id from the provided index. /// @notice Unit counter starts from 1. /// @param id Unit counter. /// @return unitId Unit Id. function tokenByIndex(uint256 id) external view virtual returns (uint256 unitId) { unitId = id + 1; if (unitId > totalSupply) { revert Overflow(unitId, totalSupply); } } // Open sourced from: https://stackoverflow.com/questions/67893318/solidity-how-to-represent-bytes32-as-string /// @dev Converts bytes16 input data to hex16. /// @notice This method converts bytes into the same bytes-character hex16 representation. /// @param data bytes16 input data. /// @return result hex16 conversion from the input bytes16 data. function _toHex16(bytes16 data) internal pure returns (bytes32 result) { result = bytes32 (data) & 0xFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 | (bytes32 (data) & 0x0000000000000000FFFFFFFFFFFFFFFF00000000000000000000000000000000) >> 64; result = result & 0xFFFFFFFF000000000000000000000000FFFFFFFF000000000000000000000000 | (result & 0x00000000FFFFFFFF000000000000000000000000FFFFFFFF0000000000000000) >> 32; result = result & 0xFFFF000000000000FFFF000000000000FFFF000000000000FFFF000000000000 | (result & 0x0000FFFF000000000000FFFF000000000000FFFF000000000000FFFF00000000) >> 16; result = result & 0xFF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000 | (result & 0x00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000) >> 8; result = (result & 0xF000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000) >> 4 | (result & 0x0F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F00) >> 8; result = bytes32 (0x3030303030303030303030303030303030303030303030303030303030303030 + uint256 (result) + (uint256 (result) + 0x0606060606060606060606060606060606060606060606060606060606060606 >> 4 & 0x0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F) * 39); } /// @dev Gets the hash of the unit. /// @param unitId Unit Id. /// @return Unit hash. function _getUnitHash(uint256 unitId) internal view virtual returns (bytes32); /// @dev Returns unit token URI. /// @notice Expected multicodec: dag-pb; hashing function: sha2-256, with base16 encoding and leading CID_PREFIX removed. /// @param unitId Unit Id. /// @return Unit token URI string. function tokenURI(uint256 unitId) public view virtual override returns (string memory) { bytes32 unitHash = _getUnitHash(unitId); // Parse 2 parts of bytes32 into left and right hex16 representation, and concatenate into string // adding the base URI and a cid prefix for the full base16 multibase prefix IPFS hash representation return string(abi.encodePacked(baseURI, CID_PREFIX, _toHex16(bytes16(unitHash)), _toHex16(bytes16(unitHash << 128)))); } }
// SPDX-License-Identifier: MIT pragma solidity >=0.8.0; /// @notice Modern, minimalist, and gas efficient ERC-721 implementation. /// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC721.sol) abstract contract ERC721 { /*////////////////////////////////////////////////////////////// EVENTS //////////////////////////////////////////////////////////////*/ event Transfer(address indexed from, address indexed to, uint256 indexed id); event Approval(address indexed owner, address indexed spender, uint256 indexed id); event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /*////////////////////////////////////////////////////////////// METADATA STORAGE/LOGIC //////////////////////////////////////////////////////////////*/ string public name; string public symbol; function tokenURI(uint256 id) public view virtual returns (string memory); /*////////////////////////////////////////////////////////////// ERC721 BALANCE/OWNER STORAGE //////////////////////////////////////////////////////////////*/ mapping(uint256 => address) internal _ownerOf; mapping(address => uint256) internal _balanceOf; function ownerOf(uint256 id) public view virtual returns (address owner) { require((owner = _ownerOf[id]) != address(0), "NOT_MINTED"); } function balanceOf(address owner) public view virtual returns (uint256) { require(owner != address(0), "ZERO_ADDRESS"); return _balanceOf[owner]; } /*////////////////////////////////////////////////////////////// ERC721 APPROVAL STORAGE //////////////////////////////////////////////////////////////*/ mapping(uint256 => address) public getApproved; mapping(address => mapping(address => bool)) public isApprovedForAll; /*////////////////////////////////////////////////////////////// CONSTRUCTOR //////////////////////////////////////////////////////////////*/ constructor(string memory _name, string memory _symbol) { name = _name; symbol = _symbol; } /*////////////////////////////////////////////////////////////// ERC721 LOGIC //////////////////////////////////////////////////////////////*/ function approve(address spender, uint256 id) public virtual { address owner = _ownerOf[id]; require(msg.sender == owner || isApprovedForAll[owner][msg.sender], "NOT_AUTHORIZED"); getApproved[id] = spender; emit Approval(owner, spender, id); } function setApprovalForAll(address operator, bool approved) public virtual { isApprovedForAll[msg.sender][operator] = approved; emit ApprovalForAll(msg.sender, operator, approved); } function transferFrom( address from, address to, uint256 id ) public virtual { require(from == _ownerOf[id], "WRONG_FROM"); require(to != address(0), "INVALID_RECIPIENT"); require( msg.sender == from || isApprovedForAll[from][msg.sender] || msg.sender == getApproved[id], "NOT_AUTHORIZED" ); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. unchecked { _balanceOf[from]--; _balanceOf[to]++; } _ownerOf[id] = to; delete getApproved[id]; emit Transfer(from, to, id); } function safeTransferFrom( address from, address to, uint256 id ) public virtual { transferFrom(from, to, id); if (to.code.length != 0) require( ERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, "") == ERC721TokenReceiver.onERC721Received.selector, "UNSAFE_RECIPIENT" ); } function safeTransferFrom( address from, address to, uint256 id, bytes calldata data ) public virtual { transferFrom(from, to, id); if (to.code.length != 0) require( ERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, data) == ERC721TokenReceiver.onERC721Received.selector, "UNSAFE_RECIPIENT" ); } /*////////////////////////////////////////////////////////////// ERC165 LOGIC //////////////////////////////////////////////////////////////*/ function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) { return interfaceId == 0x01ffc9a7 || // ERC165 Interface ID for ERC165 interfaceId == 0x80ac58cd || // ERC165 Interface ID for ERC721 interfaceId == 0x5b5e139f; // ERC165 Interface ID for ERC721Metadata } /*////////////////////////////////////////////////////////////// INTERNAL MINT/BURN LOGIC //////////////////////////////////////////////////////////////*/ function _mint(address to, uint256 id) internal virtual { require(to != address(0), "INVALID_RECIPIENT"); require(_ownerOf[id] == address(0), "ALREADY_MINTED"); // Counter overflow is incredibly unrealistic. unchecked { _balanceOf[to]++; } _ownerOf[id] = to; emit Transfer(address(0), to, id); } function _burn(uint256 id) internal virtual { address owner = _ownerOf[id]; require(owner != address(0), "NOT_MINTED"); // Ownership check above ensures no underflow. unchecked { _balanceOf[owner]--; } delete _ownerOf[id]; delete getApproved[id]; emit Transfer(owner, address(0), id); } /*////////////////////////////////////////////////////////////// INTERNAL SAFE MINT LOGIC //////////////////////////////////////////////////////////////*/ function _safeMint(address to, uint256 id) internal virtual { _mint(to, id); if (to.code.length != 0) require( ERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, "") == ERC721TokenReceiver.onERC721Received.selector, "UNSAFE_RECIPIENT" ); } function _safeMint( address to, uint256 id, bytes memory data ) internal virtual { _mint(to, id); if (to.code.length != 0) require( ERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, data) == ERC721TokenReceiver.onERC721Received.selector, "UNSAFE_RECIPIENT" ); } } /// @notice A generic interface for a contract which properly accepts ERC721 tokens. /// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC721.sol) abstract contract ERC721TokenReceiver { function onERC721Received( address, address, uint256, bytes calldata ) external virtual returns (bytes4) { return ERC721TokenReceiver.onERC721Received.selector; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.15; /// @dev Errors. interface IErrorsRegistries { /// @dev Only `manager` has a privilege, but the `sender` was provided. /// @param sender Sender address. /// @param manager Required sender address as a manager. error ManagerOnly(address sender, address manager); /// @dev Only `owner` has a privilege, but the `sender` was provided. /// @param sender Sender address. /// @param owner Required sender address as an owner. error OwnerOnly(address sender, address owner); /// @dev Hash already exists in the records. error HashExists(); /// @dev Provided zero address. error ZeroAddress(); /// @dev Agent Id is not correctly provided for the current routine. /// @param agentId Component Id. error WrongAgentId(uint256 agentId); /// @dev Wrong length of two arrays. /// @param numValues1 Number of values in a first array. /// @param numValues2 Numberf of values in a second array. error WrongArrayLength(uint256 numValues1, uint256 numValues2); /// @dev Canonical agent Id is not found. /// @param agentId Canonical agent Id. error AgentNotFound(uint256 agentId); /// @dev Component Id is not found. /// @param componentId Component Id. error ComponentNotFound(uint256 componentId); /// @dev Multisig threshold is out of bounds. /// @param currentThreshold Current threshold value. /// @param minThreshold Minimum possible threshold value. /// @param maxThreshold Maximum possible threshold value. error WrongThreshold(uint256 currentThreshold, uint256 minThreshold, uint256 maxThreshold); /// @dev Agent instance is already registered with a specified `operator`. /// @param operator Operator that registered an instance. error AgentInstanceRegistered(address operator); /// @dev Wrong operator is specified when interacting with a specified `serviceId`. /// @param serviceId Service Id. error WrongOperator(uint256 serviceId); /// @dev Operator has no registered instances in the service. /// @param operator Operator address. /// @param serviceId Service Id. error OperatorHasNoInstances(address operator, uint256 serviceId); /// @dev Canonical `agentId` is not found as a part of `serviceId`. /// @param agentId Canonical agent Id. /// @param serviceId Service Id. error AgentNotInService(uint256 agentId, uint256 serviceId); /// @dev The contract is paused. error Paused(); /// @dev Zero value when it has to be different from zero. error ZeroValue(); /// @dev Value overflow. /// @param provided Overflow value. /// @param max Maximum possible value. error Overflow(uint256 provided, uint256 max); /// @dev Service must be inactive. /// @param serviceId Service Id. error ServiceMustBeInactive(uint256 serviceId); /// @dev All the agent instance slots for a specific `serviceId` are filled. /// @param serviceId Service Id. error AgentInstancesSlotsFilled(uint256 serviceId); /// @dev Wrong state of a service. /// @param state Service state. /// @param serviceId Service Id. error WrongServiceState(uint256 state, uint256 serviceId); /// @dev Only own service multisig is allowed. /// @param provided Provided address. /// @param expected Expected multisig address. /// @param serviceId Service Id. error OnlyOwnServiceMultisig(address provided, address expected, uint256 serviceId); /// @dev Multisig is not whitelisted. /// @param multisig Address of a multisig implementation. error UnauthorizedMultisig(address multisig); /// @dev Incorrect deposit provided for the registration activation. /// @param sent Sent amount. /// @param expected Expected amount. /// @param serviceId Service Id. error IncorrectRegistrationDepositValue(uint256 sent, uint256 expected, uint256 serviceId); /// @dev Insufficient value provided for the agent instance bonding. /// @param sent Sent amount. /// @param expected Expected amount. /// @param serviceId Service Id. error IncorrectAgentBondingValue(uint256 sent, uint256 expected, uint256 serviceId); /// @dev Failure of a transfer. /// @param token Address of a token. /// @param from Address `from`. /// @param to Address `to`. /// @param value Value. error TransferFailed(address token, address from, address to, uint256 value); /// @dev Caught reentrancy violation. error ReentrancyGuard(); }
{ "optimizer": { "enabled": true, "runs": 750 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "metadata": { "useLiteralContent": true }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_baseURI","type":"string"},{"internalType":"address","name":"_componentRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"AgentInstanceRegistered","type":"error"},{"inputs":[{"internalType":"uint256","name":"serviceId","type":"uint256"}],"name":"AgentInstancesSlotsFilled","type":"error"},{"inputs":[{"internalType":"uint256","name":"agentId","type":"uint256"}],"name":"AgentNotFound","type":"error"},{"inputs":[{"internalType":"uint256","name":"agentId","type":"uint256"},{"internalType":"uint256","name":"serviceId","type":"uint256"}],"name":"AgentNotInService","type":"error"},{"inputs":[{"internalType":"uint256","name":"componentId","type":"uint256"}],"name":"ComponentNotFound","type":"error"},{"inputs":[],"name":"HashExists","type":"error"},{"inputs":[{"internalType":"uint256","name":"sent","type":"uint256"},{"internalType":"uint256","name":"expected","type":"uint256"},{"internalType":"uint256","name":"serviceId","type":"uint256"}],"name":"IncorrectAgentBondingValue","type":"error"},{"inputs":[{"internalType":"uint256","name":"sent","type":"uint256"},{"internalType":"uint256","name":"expected","type":"uint256"},{"internalType":"uint256","name":"serviceId","type":"uint256"}],"name":"IncorrectRegistrationDepositValue","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"manager","type":"address"}],"name":"ManagerOnly","type":"error"},{"inputs":[{"internalType":"address","name":"provided","type":"address"},{"internalType":"address","name":"expected","type":"address"},{"internalType":"uint256","name":"serviceId","type":"uint256"}],"name":"OnlyOwnServiceMultisig","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"serviceId","type":"uint256"}],"name":"OperatorHasNoInstances","type":"error"},{"inputs":[{"internalType":"uint256","name":"provided","type":"uint256"},{"internalType":"uint256","name":"max","type":"uint256"}],"name":"Overflow","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"owner","type":"address"}],"name":"OwnerOnly","type":"error"},{"inputs":[],"name":"Paused","type":"error"},{"inputs":[],"name":"ReentrancyGuard","type":"error"},{"inputs":[{"internalType":"uint256","name":"serviceId","type":"uint256"}],"name":"ServiceMustBeInactive","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferFailed","type":"error"},{"inputs":[{"internalType":"address","name":"multisig","type":"address"}],"name":"UnauthorizedMultisig","type":"error"},{"inputs":[{"internalType":"uint256","name":"agentId","type":"uint256"}],"name":"WrongAgentId","type":"error"},{"inputs":[{"internalType":"uint256","name":"numValues1","type":"uint256"},{"internalType":"uint256","name":"numValues2","type":"uint256"}],"name":"WrongArrayLength","type":"error"},{"inputs":[{"internalType":"uint256","name":"serviceId","type":"uint256"}],"name":"WrongOperator","type":"error"},{"inputs":[{"internalType":"uint256","name":"state","type":"uint256"},{"internalType":"uint256","name":"serviceId","type":"uint256"}],"name":"WrongServiceState","type":"error"},{"inputs":[{"internalType":"uint256","name":"currentThreshold","type":"uint256"},{"internalType":"uint256","name":"minThreshold","type":"uint256"},{"internalType":"uint256","name":"maxThreshold","type":"uint256"}],"name":"WrongThreshold","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"inputs":[],"name":"ZeroValue","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"baseURI","type":"string"}],"name":"BaseURIChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"unitId","type":"uint256"},{"indexed":false,"internalType":"enum UnitRegistry.UnitType","name":"uType","type":"uint8"},{"indexed":false,"internalType":"bytes32","name":"unitHash","type":"bytes32"}],"name":"CreateUnit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"manager","type":"address"}],"name":"ManagerUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"}],"name":"OwnerUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"unitId","type":"uint256"},{"indexed":false,"internalType":"enum UnitRegistry.UnitType","name":"uType","type":"uint8"},{"indexed":false,"internalType":"bytes32","name":"unitHash","type":"bytes32"}],"name":"UpdateUnitHash","type":"event"},{"inputs":[],"name":"CID_PREFIX","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32[]","name":"unitIds","type":"uint32[]"}],"name":"calculateSubComponents","outputs":[{"internalType":"uint32[]","name":"subComponentIds","type":"uint32[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newManager","type":"address"}],"name":"changeManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"changeOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"componentRegistry","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"unitOwner","type":"address"},{"internalType":"bytes32","name":"unitHash","type":"bytes32"},{"internalType":"uint32[]","name":"dependencies","type":"uint32[]"}],"name":"create","outputs":[{"internalType":"uint256","name":"unitId","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"unitId","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"unitId","type":"uint256"}],"name":"getDependencies","outputs":[{"internalType":"uint256","name":"numDependencies","type":"uint256"},{"internalType":"uint32[]","name":"dependencies","type":"uint32[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"unitId","type":"uint256"}],"name":"getLocalSubComponents","outputs":[{"internalType":"uint32[]","name":"subComponentIds","type":"uint32[]"},{"internalType":"uint256","name":"numSubComponents","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"unitId","type":"uint256"}],"name":"getUnit","outputs":[{"components":[{"internalType":"bytes32","name":"unitHash","type":"bytes32"},{"internalType":"uint32[]","name":"dependencies","type":"uint32[]"}],"internalType":"struct UnitRegistry.Unit","name":"unit","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"unitId","type":"uint256"}],"name":"getUpdatedHashes","outputs":[{"internalType":"uint256","name":"numHashes","type":"uint256"},{"internalType":"bytes32[]","name":"unitHashes","type":"bytes32[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"mapSubComponents","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"mapUnitIdHashes","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"mapUnits","outputs":[{"internalType":"bytes32","name":"unitHash","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"bURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"unitId","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"unitId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unitType","outputs":[{"internalType":"enum UnitRegistry.UnitType","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"unitOwner","type":"address"},{"internalType":"uint256","name":"unitId","type":"uint256"},{"internalType":"bytes32","name":"unitHash","type":"bytes32"}],"name":"updateHash","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60c06040526001600a553480156200001657600080fd5b506040516200329e3803806200329e833981016040819052620000399162000191565b6001848460006200004b8382620002d3565b5060016200005a8282620002d3565b5050508060018111156200007257620000726200039f565b60808160018111156200008957620000896200039f565b905250600890506200009c8382620002d3565b506001600160a01b031660a0525050600680546001600160a01b0319163317905550620003b5565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620000ec57600080fd5b81516001600160401b0380821115620001095762000109620000c4565b604051601f8301601f19908116603f01168101908282118183101715620001345762000134620000c4565b816040528381526020925086838588010111156200015157600080fd5b600091505b8382101562000175578582018301518183018401529082019062000156565b83821115620001875760008385830101525b9695505050505050565b60008060008060808587031215620001a857600080fd5b84516001600160401b0380821115620001c057600080fd5b620001ce88838901620000da565b95506020870151915080821115620001e557600080fd5b620001f388838901620000da565b945060408701519150808211156200020a57600080fd5b506200021987828801620000da565b606087015190935090506001600160a01b03811681146200023957600080fd5b939692955090935050565b600181811c908216806200025957607f821691505b6020821081036200027a57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620002ce57600081815260208120601f850160051c81016020861015620002a95750805b601f850160051c820191505b81811015620002ca57828155600101620002b5565b5050505b505050565b81516001600160401b03811115620002ef57620002ef620000c4565b620003078162000300845462000244565b8462000280565b602080601f8311600181146200033f5760008415620003265750858301515b600019600386901b1c1916600185901b178555620002ca565b600085815260208120601f198616915b8281101562000370578886015182559484019460019091019084016200034f565b50858210156200038f5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052602160045260246000fd5b60805160a051612e9962000405600039600081816105d801528181611ebb015261214301526000818161049401528181610be501528181610cc70152818161156801526116cc0152612e996000f3fe608060405234801561001057600080fd5b506004361061025c5760003560e01c806370a0823111610145578063a6f9dae1116100bd578063c87b56dd1161008c578063fbfd24bf11610071578063fbfd24bf146105c0578063ff0039cb146105d3578063ffa1ad74146105fa57600080fd5b8063c87b56dd1461057f578063e985e9c51461059257600080fd5b8063a6f9dae114610525578063b88d4fde14610538578063bf733f6b1461054b578063c152bdfe1461056c57600080fd5b80638da5cb5b11610114578063a22cb465116100f9578063a22cb465146104de578063a25e29d3146104f1578063a3fbbaae1461051257600080fd5b80638da5cb5b146104c357806395d89b41146104d657600080fd5b806370a082311461042c578063716be0e01461043f5780637c5e63e01461046757806385ad4f901461048f57600080fd5b8063481c6a75116101d85780634fa706d7116101a75780636352211e1161018c5780636352211e146103f0578063661a0d0b146104035780636c0360eb1461042457600080fd5b80634fa706d7146103bd57806355f804b3146103dd57600080fd5b8063481c6a7514610371578063482c5c3c146103845780634f558e79146103975780634f6ccce7146103aa57600080fd5b806309b3b87e1161022f57806318160ddd1161021457806318160ddd1461033457806323b872dd1461034b57806342842e0e1461035e57600080fd5b806309b3b87e146102f45780631655bfbe1461031457600080fd5b806301ffc9a71461026157806306fdde0314610289578063081812fc1461029e578063095ea7b3146102df575b600080fd5b61027461026f36600461244d565b61061e565b60405190151581526020015b60405180910390f35b610291610670565b60405161028091906124a1565b6102c76102ac3660046124d4565b6004602052600090815260409020546001600160a01b031681565b6040516001600160a01b039091168152602001610280565b6102f26102ed366004612504565b6106fe565b005b61030761030236600461261f565b6107e5565b604051610280919061269d565b6103276103223660046124d4565b6107f2565b60405161028091906126b0565b61033d60095481565b604051908152602001610280565b6102f2610359366004612703565b6108ae565b6102f261036c366004612703565b610a88565b6007546102c7906001600160a01b031681565b61027461039236600461273f565b610b7d565b6102746103a53660046124d4565b610cfd565b61033d6103b83660046124d4565b610d1f565b61033d6103cb3660046124d4565b600d6020526000908152604090205481565b6102f26103eb366004612772565b610d64565b6102c76103fe3660046124d4565b610e0d565b6104166104113660046124d4565b610e72565b604051610280929190612807565b610291610f35565b61033d61043a366004612820565b610f42565b61045261044d36600461283b565b610fb6565b60405163ffffffff9091168152602001610280565b6102916040518060400160405280600981526020016806630313730313232360bc1b81525081565b6104b67f000000000000000000000000000000000000000000000000000000000000000081565b6040516102809190612895565b6006546102c7906001600160a01b031681565b610291610fff565b6102f26104ec3660046128a3565b61100c565b6105046104ff3660046124d4565b611078565b6040516102809291906128df565b6102f2610520366004612820565b611109565b6102f2610533366004612820565b6111ba565b6102f2610546366004612901565b61126b565b61055e6105593660046124d4565b611350565b60405161028092919061299c565b61033d61057a36600461283b565b6113b4565b61029161058d3660046124d4565b6113e5565b6102746105a03660046129ea565b600560209081526000928352604080842090915290825290205460ff1681565b61033d6105ce366004612a1d565b61145c565b6102c77f000000000000000000000000000000000000000000000000000000000000000081565b610291604051806040016040528060058152602001640312e302e360dc1b81525081565b60006301ffc9a760e01b6001600160e01b03198316148061064f57506380ac58cd60e01b6001600160e01b03198316145b8061066a5750635b5e139f60e01b6001600160e01b03198316145b92915050565b6000805461067d90612a74565b80601f01602080910402602001604051908101604052809291908181526020018280546106a990612a74565b80156106f65780601f106106cb576101008083540402835291602001916106f6565b820191906000526020600020905b8154815290600101906020018083116106d957829003601f168201915b505050505081565b6000818152600260205260409020546001600160a01b03163381148061074757506001600160a01b038116600090815260056020908152604080832033845290915290205460ff165b6107895760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b60448201526064015b60405180910390fd5b60008281526004602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b606061066a600183611711565b6040805180820190915260008152606060208201526000828152600d602090815260409182902082518084018452815481526001820180548551818602810186019096528086529194929385810193929083018282801561089e57602002820191906000526020600020906000905b82829054906101000a900463ffffffff1663ffffffff16815260200190600401906020826003010492830192600103820291508084116108615790505b5050505050815250509050919050565b6000818152600260205260409020546001600160a01b038481169116146109175760405162461bcd60e51b815260206004820152600a60248201527f57524f4e475f46524f4d000000000000000000000000000000000000000000006044820152606401610780565b6001600160a01b0382166109615760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b6044820152606401610780565b336001600160a01b038416148061099b57506001600160a01b038316600090815260056020908152604080832033845290915290205460ff165b806109bc57506000818152600460205260409020546001600160a01b031633145b6109f95760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b6044820152606401610780565b6001600160a01b0380841660008181526003602090815260408083208054600019019055938616808352848320805460010190558583526002825284832080546001600160a01b03199081168317909155600490925284832080549092169091559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610a938383836108ae565b6001600160a01b0382163b15610b7857604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401526000608484015290919084169063150b7a029060a4016020604051808303816000875af1158015610b0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b2e9190612aae565b6001600160e01b03191614610b785760405162461bcd60e51b815260206004820152601060248201526f155394d0519157d49150d2541251539560821b6044820152606401610780565b505050565b6007546000906001600160a01b03163314610bc05760075460405163312d21ff60e11b81523360048201526001600160a01b039091166024820152604401610780565b836001600160a01b0316610bd384610e0d565b6001600160a01b031614610c525760007f00000000000000000000000000000000000000000000000000000000000000006001811115610c1557610c1561285d565b03610c3657604051634915061960e11b815260048101849052602401610780565b604051630ede975960e01b815260048101849052602401610780565b6000829003610c7457604051637c946ed760e01b815260040160405180910390fd5b506000828152600b6020908152604080832080546001818101835591855292909320909101839055517fdef878acc6b6cc4320a973cf2022bf4ccad90375867c044d23b4e22e9c3b1bda90610cee9085907f0000000000000000000000000000000000000000000000000000000000000000908690612acb565b60405180910390a19392505050565b6000808211801561066a5750600954610d17906001612b03565b821092915050565b6000610d2c826001612b03565b9050600954811115610d5f57600954604051637ae5968560e01b8152610780918391600401918252602082015260400190565b919050565b6006546001600160a01b03163314610da45760065460405163521eb56d60e11b81523360048201526001600160a01b039091166024820152604401610780565b8051600003610dc657604051637c946ed760e01b815260040160405180910390fd5b6008610dd28282612b69565b507f5411e8ebf1636d9e83d5fc4900bf80cbac82e8790da2a4c94db4895e889eedf681604051610e0291906124a1565b60405180910390a150565b6000818152600260205260409020546001600160a01b031680610d5f5760405162461bcd60e51b815260206004820152600a60248201527f4e4f545f4d494e544544000000000000000000000000000000000000000000006044820152606401610780565b600060606000600d60008581526020019081526020016000206040518060400160405290816000820154815260200160018201805480602002602001604051908101604052809291908181526020018280548015610f1b57602002820191906000526020600020906000905b82829054906101000a900463ffffffff1663ffffffff1681526020019060040190602082600301049283019260010382029150808411610ede5790505b505050919092525050506020015180519590945092505050565b6008805461067d90612a74565b60006001600160a01b038216610f9a5760405162461bcd60e51b815260206004820152600c60248201527f5a45524f5f4144445245535300000000000000000000000000000000000000006044820152606401610780565b506001600160a01b031660009081526003602052604090205490565b600c6020528160005260406000208181548110610fd257600080fd5b9060005260206000209060089182820401919006600402915091509054906101000a900463ffffffff1681565b6001805461067d90612a74565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000818152600c602090815260408083208054825181850281018501909352808352606094938301828280156110f957602002820191906000526020600020906000905b82829054906101000a900463ffffffff1663ffffffff16815260200190600401906020826003010492830192600103820291508084116110bc5790505b5050505050915081519050915091565b6006546001600160a01b031633146111495760065460405163521eb56d60e11b81523360048201526001600160a01b039091166024820152604401610780565b6001600160a01b0381166111705760405163d92e233d60e01b815260040160405180910390fd5b600780546001600160a01b0319166001600160a01b0383169081179091556040517f2c1c11af44aa5608f1dca38c00275c30ea091e02417d36e70e9a1538689c433d90600090a250565b6006546001600160a01b031633146111fa5760065460405163521eb56d60e11b81523360048201526001600160a01b039091166024820152604401610780565b6001600160a01b0381166112215760405163d92e233d60e01b815260040160405180910390fd5b600680546001600160a01b0319166001600160a01b0383169081179091556040517f4ffd725fc4a22075e9ec71c59edf9c38cdeb588a91b24fc5b61388c5be41282b90600090a250565b6112768585856108ae565b6001600160a01b0384163b1561134957604051630a85bd0160e11b808252906001600160a01b0386169063150b7a02906112bc9033908a90899089908990600401612c29565b6020604051808303816000875af11580156112db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112ff9190612aae565b6001600160e01b031916146113495760405162461bcd60e51b815260206004820152601060248201526f155394d0519157d49150d2541251539560821b6044820152606401610780565b5050505050565b6000818152600b6020908152604080832080548251818502810185019093528083526060938301828280156113a457602002820191906000526020600020905b815481526020019060010190808311611390575b5050505050905080519150915091565b600b60205281600052604060002081815481106113d057600080fd5b90600052602060002001600091509150505481565b6000818152600d60205260408120546060915060086040518060400160405280600981526020016806630313730313232360bc1b81525061142583611cc5565b611432608085901b611cc5565b6040516020016114459493929190612c7d565b604051602081830303815290604052915050919050565b60006001600a541115611482576040516345f5ce8b60e11b815260040160405180910390fd5b6002600a556007546001600160a01b031633146114c75760075460405163312d21ff60e11b81523360048201526001600160a01b039091166024820152604401610780565b6001600160a01b0384166114ee5760405163d92e233d60e01b815260040160405180910390fd5b600083900361151057604051637c946ed760e01b815260040160405180910390fd5b5060095461151e8282611e95565b8061152881612d0f565b6000818152600d6020908152604090912086815585519294509250611554916001840191860190612370565b506000611562600085611711565b905060007f000000000000000000000000000000000000000000000000000000000000000060018111156115985761159861285d565b0361167957805160006115ac826001612b03565b67ffffffffffffffff8111156115c4576115c461252e565b6040519080825280602002602001820160405280156115ed578160200160208202803683370190505b50905060005b8281101561164c5783818151811061160d5761160d612d28565b602002602001015182828151811061162757611627612d28565b63ffffffff9092166020928302919091019091015261164581612d0f565b90506115f3565b508481838151811061166057611660612d28565b63ffffffff909216602092830291909101909101529150505b6000838152600c60209081526040909120825161169892840190612370565b5060098390556116a8868461201d565b7f97587a61bb0b1b9b24e5325039519ae27f44ca15ef278df10f4ab0195205c29c837f0000000000000000000000000000000000000000000000000000000000000000876040516116fb93929190612acb565b60405180910390a150506001600a559392505050565b8051606090600063ffffffff821667ffffffffffffffff8111156117375761173761252e565b604051908082528060200260200182016040528015611760578160200160208202803683370190505b50905060008263ffffffff1667ffffffffffffffff8111156117845761178461252e565b6040519080825280602002602001820160405280156117b757816020015b60608152602001906001900390816117a25790505b5090506000805b8463ffffffff168163ffffffff1610156118a4576117fb88888363ffffffff16815181106117ee576117ee612d28565b602002602001015161210d565b838263ffffffff168151811061181357611813612d28565b6020026020010181905250828163ffffffff168151811061183657611836612d28565b602002602001015151848263ffffffff168151811061185757611857612d28565b63ffffffff928316602091820292909201015284518591831690811061187f5761187f612d28565b6020026020010151826118929190612d3e565b915061189d81612d66565b90506117be565b5060008163ffffffff1667ffffffffffffffff8111156118c6576118c661252e565b6040519080825280602002602001820160405280156118ef578160200160208202803683370190505b50905060008563ffffffff1667ffffffffffffffff8111156119135761191361252e565b60405190808252806020026020018201604052801561193c578160200160208202803683370190505b5090506000805b8463ffffffff168163ffffffff161015611bf75760008063ffffffff815b8b63ffffffff168163ffffffff161015611b67575b8a8163ffffffff168151811061198e5761198e612d28565b602002602001015163ffffffff16878263ffffffff16815181106119b4576119b4612d28565b602002602001015163ffffffff161015611b5757898163ffffffff16815181106119e0576119e0612d28565b6020026020010151878263ffffffff1681518110611a0057611a00612d28565b602002602001015163ffffffff1681518110611a1e57611a1e612d28565b602002602001015163ffffffff168663ffffffff161015611b20578163ffffffff168a8263ffffffff1681518110611a5857611a58612d28565b6020026020010151888363ffffffff1681518110611a7857611a78612d28565b602002602001015163ffffffff1681518110611a9657611a96612d28565b602002602001015163ffffffff161015611b0e57898163ffffffff1681518110611ac257611ac2612d28565b6020026020010151878263ffffffff1681518110611ae257611ae2612d28565b602002602001015163ffffffff1681518110611b0057611b00612d28565b602002602001015191508093505b82611b1881612d66565b935050611b57565b868163ffffffff1681518110611b3857611b38612d28565b602002602001018051611b4a90612d66565b63ffffffff169052611976565b611b6081612d66565b9050611961565b5093508363ffffffff821615611bdb5784878563ffffffff1681518110611b9057611b90612d28565b63ffffffff9283166020918202929092010152865187918516908110611bb857611bb8612d28565b602002602001018051809190611bcd90612d66565b63ffffffff16905250611be3565b505050611bf7565b50505080611bf090612d66565b9050611943565b8063ffffffff1667ffffffffffffffff811115611c1657611c1661252e565b604051908082528060200260200182016040528015611c3f578160200160208202803683370190505b50985060005b8163ffffffff168163ffffffff161015611cb657848163ffffffff1681518110611c7157611c71612d28565b60200260200101518a8263ffffffff1681518110611c9157611c91612d28565b63ffffffff90921660209283029190910190910152611caf81612d66565b9050611c45565b50505050505050505092915050565b7aff00000000000000ff00000000000000ff00000000000000ff00006bffffffff0000000000000000604083901c9081167bffffffff00000000000000000000000000000000000000000000000084161760201c6fffffffff000000000000000000000000919091166001600160e01b031984161717601081901c9182167eff00000000000000ff00000000000000ff00000000000000ff000000000000821617600890811c7bff00000000000000ff00000000000000ff00000000000000ff000000939093167fff00000000000000ff00000000000000ff00000000000000ff000000000000009290921691909117919091179081901c7e0f000f000f000f000f000f000f000f000f000f000f000f000f000f000f000f167f0f000f000f000f000f000f000f000f000f000f000f000f000f000f000f000f00600492831c161790611e31827f0606060606060606060606060606060606060606060606060606060606060606612b03565b901c7f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f166027611e619190612d89565b611e8b827f3030303030303030303030303030303030303030303030303030303030303030612b03565b61066a9190612b03565b8151600003611eb757604051637c946ed760e01b815260040160405180910390fd5b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f3b9190612da8565b90506000805b845181101561134957611f55826001612d3e565b63ffffffff16858281518110611f6d57611f6d612d28565b602002602001015163ffffffff161080611fab57508263ffffffff16858281518110611f9b57611f9b612d28565b602002602001015163ffffffff16115b15611ff057848181518110611fc257611fc2612d28565b6020026020010151604051634915061960e11b8152600401610780919063ffffffff91909116815260200190565b84818151811061200257612002612d28565b602002602001015191508061201690612d0f565b9050611f41565b6120278282612256565b6001600160a01b0382163b1561210957604051630a85bd0160e11b80825233600483015260006024830181905260448301849052608060648401526084830152906001600160a01b0384169063150b7a029060a4016020604051808303816000875af115801561209b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120bf9190612aae565b6001600160e01b031916146121095760405162461bcd60e51b815260206004820152601060248201526f155394d0519157d49150d2541251539560821b6044820152606401610780565b5050565b606060008360018111156121235761212361285d565b036121c25760405163a25e29d360e01b815263ffffffff831660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a25e29d390602401600060405180830381865afa158015612192573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526121ba9190810190612dc1565b50905061066a565b63ffffffff82166000908152600c60209081526040918290208054835181840281018401909452808452909183018282801561224957602002820191906000526020600020906000905b82829054906101000a900463ffffffff1663ffffffff168152602001906004019060208260030104928301926001038202915080841161220c5790505b5050505050905092915050565b6001600160a01b0382166122a05760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b6044820152606401610780565b6000818152600260205260409020546001600160a01b0316156123055760405162461bcd60e51b815260206004820152600e60248201527f414c52454144595f4d494e5445440000000000000000000000000000000000006044820152606401610780565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b8280548282559060005260206000209060070160089004810192821561240f5791602002820160005b838211156123dd57835183826101000a81548163ffffffff021916908363ffffffff1602179055509260200192600401602081600301049283019260010302612399565b801561240d5782816101000a81549063ffffffff02191690556004016020816003010492830192600103026123dd565b505b5061241b92915061241f565b5090565b5b8082111561241b5760008155600101612420565b6001600160e01b03198116811461244a57600080fd5b50565b60006020828403121561245f57600080fd5b813561246a81612434565b9392505050565b60005b8381101561248c578181015183820152602001612474565b8381111561249b576000848401525b50505050565b60208152600082518060208401526124c0816040850160208701612471565b601f01601f19169190910160400192915050565b6000602082840312156124e657600080fd5b5035919050565b80356001600160a01b0381168114610d5f57600080fd5b6000806040838503121561251757600080fd5b612520836124ed565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561256d5761256d61252e565b604052919050565b600067ffffffffffffffff82111561258f5761258f61252e565b5060051b60200190565b63ffffffff8116811461244a57600080fd5b600082601f8301126125bc57600080fd5b813560206125d16125cc83612575565b612544565b82815260059290921b840181019181810190868411156125f057600080fd5b8286015b8481101561261457803561260781612599565b83529183019183016125f4565b509695505050505050565b60006020828403121561263157600080fd5b813567ffffffffffffffff81111561264857600080fd5b612654848285016125ab565b949350505050565b600081518084526020808501945080840160005b8381101561269257815163ffffffff1687529582019590820190600101612670565b509495945050505050565b60208152600061246a602083018461265c565b60208082528251828201528281015160408084015280516060840181905260009291820190839060808601905b8083101561261457835163ffffffff1682529284019260019290920191908401906126dd565b60008060006060848603121561271857600080fd5b612721846124ed565b925061272f602085016124ed565b9150604084013590509250925092565b60008060006060848603121561275457600080fd5b61275d846124ed565b95602085013595506040909401359392505050565b6000602080838503121561278557600080fd5b823567ffffffffffffffff8082111561279d57600080fd5b818501915085601f8301126127b157600080fd5b8135818111156127c3576127c361252e565b6127d5601f8201601f19168501612544565b915080825286848285010111156127eb57600080fd5b8084840185840137600090820190930192909252509392505050565b828152604060208201526000612654604083018461265c565b60006020828403121561283257600080fd5b61246a826124ed565b6000806040838503121561284e57600080fd5b50508035926020909101359150565b634e487b7160e01b600052602160045260246000fd5b6002811061289157634e487b7160e01b600052602160045260246000fd5b9052565b6020810161066a8284612873565b600080604083850312156128b657600080fd5b6128bf836124ed565b9150602083013580151581146128d457600080fd5b809150509250929050565b6040815260006128f2604083018561265c565b90508260208301529392505050565b60008060008060006080868803121561291957600080fd5b612922866124ed565b9450612930602087016124ed565b935060408601359250606086013567ffffffffffffffff8082111561295457600080fd5b818801915088601f83011261296857600080fd5b81358181111561297757600080fd5b89602082850101111561298957600080fd5b9699959850939650602001949392505050565b6000604082018483526020604081850152818551808452606086019150828701935060005b818110156129dd578451835293830193918301916001016129c1565b5090979650505050505050565b600080604083850312156129fd57600080fd5b612a06836124ed565b9150612a14602084016124ed565b90509250929050565b600080600060608486031215612a3257600080fd5b612a3b846124ed565b925060208401359150604084013567ffffffffffffffff811115612a5e57600080fd5b612a6a868287016125ab565b9150509250925092565b600181811c90821680612a8857607f821691505b602082108103612aa857634e487b7160e01b600052602260045260246000fd5b50919050565b600060208284031215612ac057600080fd5b815161246a81612434565b83815260608101612adf6020830185612873565b826040830152949350505050565b634e487b7160e01b600052601160045260246000fd5b60008219821115612b1657612b16612aed565b500190565b601f821115610b7857600081815260208120601f850160051c81016020861015612b425750805b601f850160051c820191505b81811015612b6157828155600101612b4e565b505050505050565b815167ffffffffffffffff811115612b8357612b8361252e565b612b9781612b918454612a74565b84612b1b565b602080601f831160018114612bcc5760008415612bb45750858301515b600019600386901b1c1916600185901b178555612b61565b600085815260208120601f198616915b82811015612bfb57888601518255948401946001909101908401612bdc565b5085821015612c195787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006001600160a01b03808816835280871660208401525084604083015260806060830152826080830152828460a0840137600060a0848401015260a0601f19601f85011683010190509695505050505050565b6000808654612c8b81612a74565b60018281168015612ca35760018114612cb857612ce7565b60ff1984168752821515830287019450612ce7565b8a60005260208060002060005b85811015612cde5781548a820152908401908201612cc5565b50505082870194505b505050508551612cfb818360208a01612471565b019384525050602082015260400192915050565b600060018201612d2157612d21612aed565b5060010190565b634e487b7160e01b600052603260045260246000fd5b600063ffffffff808316818516808303821115612d5d57612d5d612aed565b01949350505050565b600063ffffffff808316818103612d7f57612d7f612aed565b6001019392505050565b6000816000190483118215151615612da357612da3612aed565b500290565b600060208284031215612dba57600080fd5b5051919050565b60008060408385031215612dd457600080fd5b825167ffffffffffffffff811115612deb57600080fd5b8301601f81018513612dfc57600080fd5b80516020612e0c6125cc83612575565b82815260059290921b83018101918181019088841115612e2b57600080fd5b938201935b83851015612e52578451612e4381612599565b82529382019390820190612e30565b96909101519597959650505050505056fea26469706673582212203d4721d5efb262bc9a6994f3d100ac4e1775214bcc86fb4f8261bcde7a5a106864736f6c634300080f0033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000015bd56669f57192a97df41a2aa8f4403e9491776000000000000000000000000000000000000000000000000000000000000000e4167656e7420526567697374727900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000124155544f4e4f4c41532d4147454e542d56310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002468747470733a2f2f676174657761792e6175746f6e6f6c61732e746563682f697066732f00000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061025c5760003560e01c806370a0823111610145578063a6f9dae1116100bd578063c87b56dd1161008c578063fbfd24bf11610071578063fbfd24bf146105c0578063ff0039cb146105d3578063ffa1ad74146105fa57600080fd5b8063c87b56dd1461057f578063e985e9c51461059257600080fd5b8063a6f9dae114610525578063b88d4fde14610538578063bf733f6b1461054b578063c152bdfe1461056c57600080fd5b80638da5cb5b11610114578063a22cb465116100f9578063a22cb465146104de578063a25e29d3146104f1578063a3fbbaae1461051257600080fd5b80638da5cb5b146104c357806395d89b41146104d657600080fd5b806370a082311461042c578063716be0e01461043f5780637c5e63e01461046757806385ad4f901461048f57600080fd5b8063481c6a75116101d85780634fa706d7116101a75780636352211e1161018c5780636352211e146103f0578063661a0d0b146104035780636c0360eb1461042457600080fd5b80634fa706d7146103bd57806355f804b3146103dd57600080fd5b8063481c6a7514610371578063482c5c3c146103845780634f558e79146103975780634f6ccce7146103aa57600080fd5b806309b3b87e1161022f57806318160ddd1161021457806318160ddd1461033457806323b872dd1461034b57806342842e0e1461035e57600080fd5b806309b3b87e146102f45780631655bfbe1461031457600080fd5b806301ffc9a71461026157806306fdde0314610289578063081812fc1461029e578063095ea7b3146102df575b600080fd5b61027461026f36600461244d565b61061e565b60405190151581526020015b60405180910390f35b610291610670565b60405161028091906124a1565b6102c76102ac3660046124d4565b6004602052600090815260409020546001600160a01b031681565b6040516001600160a01b039091168152602001610280565b6102f26102ed366004612504565b6106fe565b005b61030761030236600461261f565b6107e5565b604051610280919061269d565b6103276103223660046124d4565b6107f2565b60405161028091906126b0565b61033d60095481565b604051908152602001610280565b6102f2610359366004612703565b6108ae565b6102f261036c366004612703565b610a88565b6007546102c7906001600160a01b031681565b61027461039236600461273f565b610b7d565b6102746103a53660046124d4565b610cfd565b61033d6103b83660046124d4565b610d1f565b61033d6103cb3660046124d4565b600d6020526000908152604090205481565b6102f26103eb366004612772565b610d64565b6102c76103fe3660046124d4565b610e0d565b6104166104113660046124d4565b610e72565b604051610280929190612807565b610291610f35565b61033d61043a366004612820565b610f42565b61045261044d36600461283b565b610fb6565b60405163ffffffff9091168152602001610280565b6102916040518060400160405280600981526020016806630313730313232360bc1b81525081565b6104b67f000000000000000000000000000000000000000000000000000000000000000181565b6040516102809190612895565b6006546102c7906001600160a01b031681565b610291610fff565b6102f26104ec3660046128a3565b61100c565b6105046104ff3660046124d4565b611078565b6040516102809291906128df565b6102f2610520366004612820565b611109565b6102f2610533366004612820565b6111ba565b6102f2610546366004612901565b61126b565b61055e6105593660046124d4565b611350565b60405161028092919061299c565b61033d61057a36600461283b565b6113b4565b61029161058d3660046124d4565b6113e5565b6102746105a03660046129ea565b600560209081526000928352604080842090915290825290205460ff1681565b61033d6105ce366004612a1d565b61145c565b6102c77f00000000000000000000000015bd56669f57192a97df41a2aa8f4403e949177681565b610291604051806040016040528060058152602001640312e302e360dc1b81525081565b60006301ffc9a760e01b6001600160e01b03198316148061064f57506380ac58cd60e01b6001600160e01b03198316145b8061066a5750635b5e139f60e01b6001600160e01b03198316145b92915050565b6000805461067d90612a74565b80601f01602080910402602001604051908101604052809291908181526020018280546106a990612a74565b80156106f65780601f106106cb576101008083540402835291602001916106f6565b820191906000526020600020905b8154815290600101906020018083116106d957829003601f168201915b505050505081565b6000818152600260205260409020546001600160a01b03163381148061074757506001600160a01b038116600090815260056020908152604080832033845290915290205460ff165b6107895760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b60448201526064015b60405180910390fd5b60008281526004602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b606061066a600183611711565b6040805180820190915260008152606060208201526000828152600d602090815260409182902082518084018452815481526001820180548551818602810186019096528086529194929385810193929083018282801561089e57602002820191906000526020600020906000905b82829054906101000a900463ffffffff1663ffffffff16815260200190600401906020826003010492830192600103820291508084116108615790505b5050505050815250509050919050565b6000818152600260205260409020546001600160a01b038481169116146109175760405162461bcd60e51b815260206004820152600a60248201527f57524f4e475f46524f4d000000000000000000000000000000000000000000006044820152606401610780565b6001600160a01b0382166109615760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b6044820152606401610780565b336001600160a01b038416148061099b57506001600160a01b038316600090815260056020908152604080832033845290915290205460ff165b806109bc57506000818152600460205260409020546001600160a01b031633145b6109f95760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b6044820152606401610780565b6001600160a01b0380841660008181526003602090815260408083208054600019019055938616808352848320805460010190558583526002825284832080546001600160a01b03199081168317909155600490925284832080549092169091559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610a938383836108ae565b6001600160a01b0382163b15610b7857604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401526000608484015290919084169063150b7a029060a4016020604051808303816000875af1158015610b0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b2e9190612aae565b6001600160e01b03191614610b785760405162461bcd60e51b815260206004820152601060248201526f155394d0519157d49150d2541251539560821b6044820152606401610780565b505050565b6007546000906001600160a01b03163314610bc05760075460405163312d21ff60e11b81523360048201526001600160a01b039091166024820152604401610780565b836001600160a01b0316610bd384610e0d565b6001600160a01b031614610c525760007f00000000000000000000000000000000000000000000000000000000000000016001811115610c1557610c1561285d565b03610c3657604051634915061960e11b815260048101849052602401610780565b604051630ede975960e01b815260048101849052602401610780565b6000829003610c7457604051637c946ed760e01b815260040160405180910390fd5b506000828152600b6020908152604080832080546001818101835591855292909320909101839055517fdef878acc6b6cc4320a973cf2022bf4ccad90375867c044d23b4e22e9c3b1bda90610cee9085907f0000000000000000000000000000000000000000000000000000000000000001908690612acb565b60405180910390a19392505050565b6000808211801561066a5750600954610d17906001612b03565b821092915050565b6000610d2c826001612b03565b9050600954811115610d5f57600954604051637ae5968560e01b8152610780918391600401918252602082015260400190565b919050565b6006546001600160a01b03163314610da45760065460405163521eb56d60e11b81523360048201526001600160a01b039091166024820152604401610780565b8051600003610dc657604051637c946ed760e01b815260040160405180910390fd5b6008610dd28282612b69565b507f5411e8ebf1636d9e83d5fc4900bf80cbac82e8790da2a4c94db4895e889eedf681604051610e0291906124a1565b60405180910390a150565b6000818152600260205260409020546001600160a01b031680610d5f5760405162461bcd60e51b815260206004820152600a60248201527f4e4f545f4d494e544544000000000000000000000000000000000000000000006044820152606401610780565b600060606000600d60008581526020019081526020016000206040518060400160405290816000820154815260200160018201805480602002602001604051908101604052809291908181526020018280548015610f1b57602002820191906000526020600020906000905b82829054906101000a900463ffffffff1663ffffffff1681526020019060040190602082600301049283019260010382029150808411610ede5790505b505050919092525050506020015180519590945092505050565b6008805461067d90612a74565b60006001600160a01b038216610f9a5760405162461bcd60e51b815260206004820152600c60248201527f5a45524f5f4144445245535300000000000000000000000000000000000000006044820152606401610780565b506001600160a01b031660009081526003602052604090205490565b600c6020528160005260406000208181548110610fd257600080fd5b9060005260206000209060089182820401919006600402915091509054906101000a900463ffffffff1681565b6001805461067d90612a74565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000818152600c602090815260408083208054825181850281018501909352808352606094938301828280156110f957602002820191906000526020600020906000905b82829054906101000a900463ffffffff1663ffffffff16815260200190600401906020826003010492830192600103820291508084116110bc5790505b5050505050915081519050915091565b6006546001600160a01b031633146111495760065460405163521eb56d60e11b81523360048201526001600160a01b039091166024820152604401610780565b6001600160a01b0381166111705760405163d92e233d60e01b815260040160405180910390fd5b600780546001600160a01b0319166001600160a01b0383169081179091556040517f2c1c11af44aa5608f1dca38c00275c30ea091e02417d36e70e9a1538689c433d90600090a250565b6006546001600160a01b031633146111fa5760065460405163521eb56d60e11b81523360048201526001600160a01b039091166024820152604401610780565b6001600160a01b0381166112215760405163d92e233d60e01b815260040160405180910390fd5b600680546001600160a01b0319166001600160a01b0383169081179091556040517f4ffd725fc4a22075e9ec71c59edf9c38cdeb588a91b24fc5b61388c5be41282b90600090a250565b6112768585856108ae565b6001600160a01b0384163b1561134957604051630a85bd0160e11b808252906001600160a01b0386169063150b7a02906112bc9033908a90899089908990600401612c29565b6020604051808303816000875af11580156112db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112ff9190612aae565b6001600160e01b031916146113495760405162461bcd60e51b815260206004820152601060248201526f155394d0519157d49150d2541251539560821b6044820152606401610780565b5050505050565b6000818152600b6020908152604080832080548251818502810185019093528083526060938301828280156113a457602002820191906000526020600020905b815481526020019060010190808311611390575b5050505050905080519150915091565b600b60205281600052604060002081815481106113d057600080fd5b90600052602060002001600091509150505481565b6000818152600d60205260408120546060915060086040518060400160405280600981526020016806630313730313232360bc1b81525061142583611cc5565b611432608085901b611cc5565b6040516020016114459493929190612c7d565b604051602081830303815290604052915050919050565b60006001600a541115611482576040516345f5ce8b60e11b815260040160405180910390fd5b6002600a556007546001600160a01b031633146114c75760075460405163312d21ff60e11b81523360048201526001600160a01b039091166024820152604401610780565b6001600160a01b0384166114ee5760405163d92e233d60e01b815260040160405180910390fd5b600083900361151057604051637c946ed760e01b815260040160405180910390fd5b5060095461151e8282611e95565b8061152881612d0f565b6000818152600d6020908152604090912086815585519294509250611554916001840191860190612370565b506000611562600085611711565b905060007f000000000000000000000000000000000000000000000000000000000000000160018111156115985761159861285d565b0361167957805160006115ac826001612b03565b67ffffffffffffffff8111156115c4576115c461252e565b6040519080825280602002602001820160405280156115ed578160200160208202803683370190505b50905060005b8281101561164c5783818151811061160d5761160d612d28565b602002602001015182828151811061162757611627612d28565b63ffffffff9092166020928302919091019091015261164581612d0f565b90506115f3565b508481838151811061166057611660612d28565b63ffffffff909216602092830291909101909101529150505b6000838152600c60209081526040909120825161169892840190612370565b5060098390556116a8868461201d565b7f97587a61bb0b1b9b24e5325039519ae27f44ca15ef278df10f4ab0195205c29c837f0000000000000000000000000000000000000000000000000000000000000001876040516116fb93929190612acb565b60405180910390a150506001600a559392505050565b8051606090600063ffffffff821667ffffffffffffffff8111156117375761173761252e565b604051908082528060200260200182016040528015611760578160200160208202803683370190505b50905060008263ffffffff1667ffffffffffffffff8111156117845761178461252e565b6040519080825280602002602001820160405280156117b757816020015b60608152602001906001900390816117a25790505b5090506000805b8463ffffffff168163ffffffff1610156118a4576117fb88888363ffffffff16815181106117ee576117ee612d28565b602002602001015161210d565b838263ffffffff168151811061181357611813612d28565b6020026020010181905250828163ffffffff168151811061183657611836612d28565b602002602001015151848263ffffffff168151811061185757611857612d28565b63ffffffff928316602091820292909201015284518591831690811061187f5761187f612d28565b6020026020010151826118929190612d3e565b915061189d81612d66565b90506117be565b5060008163ffffffff1667ffffffffffffffff8111156118c6576118c661252e565b6040519080825280602002602001820160405280156118ef578160200160208202803683370190505b50905060008563ffffffff1667ffffffffffffffff8111156119135761191361252e565b60405190808252806020026020018201604052801561193c578160200160208202803683370190505b5090506000805b8463ffffffff168163ffffffff161015611bf75760008063ffffffff815b8b63ffffffff168163ffffffff161015611b67575b8a8163ffffffff168151811061198e5761198e612d28565b602002602001015163ffffffff16878263ffffffff16815181106119b4576119b4612d28565b602002602001015163ffffffff161015611b5757898163ffffffff16815181106119e0576119e0612d28565b6020026020010151878263ffffffff1681518110611a0057611a00612d28565b602002602001015163ffffffff1681518110611a1e57611a1e612d28565b602002602001015163ffffffff168663ffffffff161015611b20578163ffffffff168a8263ffffffff1681518110611a5857611a58612d28565b6020026020010151888363ffffffff1681518110611a7857611a78612d28565b602002602001015163ffffffff1681518110611a9657611a96612d28565b602002602001015163ffffffff161015611b0e57898163ffffffff1681518110611ac257611ac2612d28565b6020026020010151878263ffffffff1681518110611ae257611ae2612d28565b602002602001015163ffffffff1681518110611b0057611b00612d28565b602002602001015191508093505b82611b1881612d66565b935050611b57565b868163ffffffff1681518110611b3857611b38612d28565b602002602001018051611b4a90612d66565b63ffffffff169052611976565b611b6081612d66565b9050611961565b5093508363ffffffff821615611bdb5784878563ffffffff1681518110611b9057611b90612d28565b63ffffffff9283166020918202929092010152865187918516908110611bb857611bb8612d28565b602002602001018051809190611bcd90612d66565b63ffffffff16905250611be3565b505050611bf7565b50505080611bf090612d66565b9050611943565b8063ffffffff1667ffffffffffffffff811115611c1657611c1661252e565b604051908082528060200260200182016040528015611c3f578160200160208202803683370190505b50985060005b8163ffffffff168163ffffffff161015611cb657848163ffffffff1681518110611c7157611c71612d28565b60200260200101518a8263ffffffff1681518110611c9157611c91612d28565b63ffffffff90921660209283029190910190910152611caf81612d66565b9050611c45565b50505050505050505092915050565b7aff00000000000000ff00000000000000ff00000000000000ff00006bffffffff0000000000000000604083901c9081167bffffffff00000000000000000000000000000000000000000000000084161760201c6fffffffff000000000000000000000000919091166001600160e01b031984161717601081901c9182167eff00000000000000ff00000000000000ff00000000000000ff000000000000821617600890811c7bff00000000000000ff00000000000000ff00000000000000ff000000939093167fff00000000000000ff00000000000000ff00000000000000ff000000000000009290921691909117919091179081901c7e0f000f000f000f000f000f000f000f000f000f000f000f000f000f000f000f167f0f000f000f000f000f000f000f000f000f000f000f000f000f000f000f000f00600492831c161790611e31827f0606060606060606060606060606060606060606060606060606060606060606612b03565b901c7f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f166027611e619190612d89565b611e8b827f3030303030303030303030303030303030303030303030303030303030303030612b03565b61066a9190612b03565b8151600003611eb757604051637c946ed760e01b815260040160405180910390fd5b60007f00000000000000000000000015bd56669f57192a97df41a2aa8f4403e94917766001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f3b9190612da8565b90506000805b845181101561134957611f55826001612d3e565b63ffffffff16858281518110611f6d57611f6d612d28565b602002602001015163ffffffff161080611fab57508263ffffffff16858281518110611f9b57611f9b612d28565b602002602001015163ffffffff16115b15611ff057848181518110611fc257611fc2612d28565b6020026020010151604051634915061960e11b8152600401610780919063ffffffff91909116815260200190565b84818151811061200257612002612d28565b602002602001015191508061201690612d0f565b9050611f41565b6120278282612256565b6001600160a01b0382163b1561210957604051630a85bd0160e11b80825233600483015260006024830181905260448301849052608060648401526084830152906001600160a01b0384169063150b7a029060a4016020604051808303816000875af115801561209b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120bf9190612aae565b6001600160e01b031916146121095760405162461bcd60e51b815260206004820152601060248201526f155394d0519157d49150d2541251539560821b6044820152606401610780565b5050565b606060008360018111156121235761212361285d565b036121c25760405163a25e29d360e01b815263ffffffff831660048201527f00000000000000000000000015bd56669f57192a97df41a2aa8f4403e94917766001600160a01b03169063a25e29d390602401600060405180830381865afa158015612192573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526121ba9190810190612dc1565b50905061066a565b63ffffffff82166000908152600c60209081526040918290208054835181840281018401909452808452909183018282801561224957602002820191906000526020600020906000905b82829054906101000a900463ffffffff1663ffffffff168152602001906004019060208260030104928301926001038202915080841161220c5790505b5050505050905092915050565b6001600160a01b0382166122a05760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b6044820152606401610780565b6000818152600260205260409020546001600160a01b0316156123055760405162461bcd60e51b815260206004820152600e60248201527f414c52454144595f4d494e5445440000000000000000000000000000000000006044820152606401610780565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b8280548282559060005260206000209060070160089004810192821561240f5791602002820160005b838211156123dd57835183826101000a81548163ffffffff021916908363ffffffff1602179055509260200192600401602081600301049283019260010302612399565b801561240d5782816101000a81549063ffffffff02191690556004016020816003010492830192600103026123dd565b505b5061241b92915061241f565b5090565b5b8082111561241b5760008155600101612420565b6001600160e01b03198116811461244a57600080fd5b50565b60006020828403121561245f57600080fd5b813561246a81612434565b9392505050565b60005b8381101561248c578181015183820152602001612474565b8381111561249b576000848401525b50505050565b60208152600082518060208401526124c0816040850160208701612471565b601f01601f19169190910160400192915050565b6000602082840312156124e657600080fd5b5035919050565b80356001600160a01b0381168114610d5f57600080fd5b6000806040838503121561251757600080fd5b612520836124ed565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561256d5761256d61252e565b604052919050565b600067ffffffffffffffff82111561258f5761258f61252e565b5060051b60200190565b63ffffffff8116811461244a57600080fd5b600082601f8301126125bc57600080fd5b813560206125d16125cc83612575565b612544565b82815260059290921b840181019181810190868411156125f057600080fd5b8286015b8481101561261457803561260781612599565b83529183019183016125f4565b509695505050505050565b60006020828403121561263157600080fd5b813567ffffffffffffffff81111561264857600080fd5b612654848285016125ab565b949350505050565b600081518084526020808501945080840160005b8381101561269257815163ffffffff1687529582019590820190600101612670565b509495945050505050565b60208152600061246a602083018461265c565b60208082528251828201528281015160408084015280516060840181905260009291820190839060808601905b8083101561261457835163ffffffff1682529284019260019290920191908401906126dd565b60008060006060848603121561271857600080fd5b612721846124ed565b925061272f602085016124ed565b9150604084013590509250925092565b60008060006060848603121561275457600080fd5b61275d846124ed565b95602085013595506040909401359392505050565b6000602080838503121561278557600080fd5b823567ffffffffffffffff8082111561279d57600080fd5b818501915085601f8301126127b157600080fd5b8135818111156127c3576127c361252e565b6127d5601f8201601f19168501612544565b915080825286848285010111156127eb57600080fd5b8084840185840137600090820190930192909252509392505050565b828152604060208201526000612654604083018461265c565b60006020828403121561283257600080fd5b61246a826124ed565b6000806040838503121561284e57600080fd5b50508035926020909101359150565b634e487b7160e01b600052602160045260246000fd5b6002811061289157634e487b7160e01b600052602160045260246000fd5b9052565b6020810161066a8284612873565b600080604083850312156128b657600080fd5b6128bf836124ed565b9150602083013580151581146128d457600080fd5b809150509250929050565b6040815260006128f2604083018561265c565b90508260208301529392505050565b60008060008060006080868803121561291957600080fd5b612922866124ed565b9450612930602087016124ed565b935060408601359250606086013567ffffffffffffffff8082111561295457600080fd5b818801915088601f83011261296857600080fd5b81358181111561297757600080fd5b89602082850101111561298957600080fd5b9699959850939650602001949392505050565b6000604082018483526020604081850152818551808452606086019150828701935060005b818110156129dd578451835293830193918301916001016129c1565b5090979650505050505050565b600080604083850312156129fd57600080fd5b612a06836124ed565b9150612a14602084016124ed565b90509250929050565b600080600060608486031215612a3257600080fd5b612a3b846124ed565b925060208401359150604084013567ffffffffffffffff811115612a5e57600080fd5b612a6a868287016125ab565b9150509250925092565b600181811c90821680612a8857607f821691505b602082108103612aa857634e487b7160e01b600052602260045260246000fd5b50919050565b600060208284031215612ac057600080fd5b815161246a81612434565b83815260608101612adf6020830185612873565b826040830152949350505050565b634e487b7160e01b600052601160045260246000fd5b60008219821115612b1657612b16612aed565b500190565b601f821115610b7857600081815260208120601f850160051c81016020861015612b425750805b601f850160051c820191505b81811015612b6157828155600101612b4e565b505050505050565b815167ffffffffffffffff811115612b8357612b8361252e565b612b9781612b918454612a74565b84612b1b565b602080601f831160018114612bcc5760008415612bb45750858301515b600019600386901b1c1916600185901b178555612b61565b600085815260208120601f198616915b82811015612bfb57888601518255948401946001909101908401612bdc565b5085821015612c195787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006001600160a01b03808816835280871660208401525084604083015260806060830152826080830152828460a0840137600060a0848401015260a0601f19601f85011683010190509695505050505050565b6000808654612c8b81612a74565b60018281168015612ca35760018114612cb857612ce7565b60ff1984168752821515830287019450612ce7565b8a60005260208060002060005b85811015612cde5781548a820152908401908201612cc5565b50505082870194505b505050508551612cfb818360208a01612471565b019384525050602082015260400192915050565b600060018201612d2157612d21612aed565b5060010190565b634e487b7160e01b600052603260045260246000fd5b600063ffffffff808316818516808303821115612d5d57612d5d612aed565b01949350505050565b600063ffffffff808316818103612d7f57612d7f612aed565b6001019392505050565b6000816000190483118215151615612da357612da3612aed565b500290565b600060208284031215612dba57600080fd5b5051919050565b60008060408385031215612dd457600080fd5b825167ffffffffffffffff811115612deb57600080fd5b8301601f81018513612dfc57600080fd5b80516020612e0c6125cc83612575565b82815260059290921b83018101918181019088841115612e2b57600080fd5b938201935b83851015612e52578451612e4381612599565b82529382019390820190612e30565b96909101519597959650505050505056fea26469706673582212203d4721d5efb262bc9a6994f3d100ac4e1775214bcc86fb4f8261bcde7a5a106864736f6c634300080f0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000015bd56669f57192a97df41a2aa8f4403e9491776000000000000000000000000000000000000000000000000000000000000000e4167656e7420526567697374727900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000124155544f4e4f4c41532d4147454e542d56310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002468747470733a2f2f676174657761792e6175746f6e6f6c61732e746563682f697066732f00000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _name (string): Agent Registry
Arg [1] : _symbol (string): AUTONOLAS-AGENT-V1
Arg [2] : _baseURI (string): https://gateway.autonolas.tech/ipfs/
Arg [3] : _componentRegistry (address): 0x15bd56669F57192a97dF41A2aa8f4403e9491776
-----Encoded View---------------
11 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [3] : 00000000000000000000000015bd56669f57192a97df41a2aa8f4403e9491776
Arg [4] : 000000000000000000000000000000000000000000000000000000000000000e
Arg [5] : 4167656e74205265676973747279000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000012
Arg [7] : 4155544f4e4f4c41532d4147454e542d56310000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000024
Arg [9] : 68747470733a2f2f676174657761792e6175746f6e6f6c61732e746563682f69
Arg [10] : 7066732f00000000000000000000000000000000000000000000000000000000
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.