ETH Price: $1,475.64 (-5.89%)

Contract

0x2F1f7D38e4772884b88f3eCd8B6b9faCdC319112
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Transfer From215581272025-01-05 11:58:2393 days ago1736078303IN
Fake_Phishing285037
0 ETH0.0004497112.00363761
Safe Transfer Fr...214404702024-12-20 1:32:35109 days ago1734658355IN
Fake_Phishing285037
0 ETH0.000398129.89665001
Safe Transfer Fr...214184842024-12-16 23:50:59112 days ago1734393059IN
Fake_Phishing285037
0 ETH0.0004769810.59299094
Safe Transfer Fr...214184722024-12-16 23:48:35112 days ago1734392915IN
Fake_Phishing285037
0 ETH0.0006608710.63726635
Transfer From211089082024-11-03 18:29:11156 days ago1730658551IN
Fake_Phishing285037
0 ETH0.000174124.64769842
Approve210489282024-10-26 9:33:23164 days ago1729935203IN
Fake_Phishing285037
0 ETH0.000217834.50248951
Transfer From198212692024-05-07 22:48:35335 days ago1715122115IN
Fake_Phishing285037
0 ETH0.000150124.00719328
Safe Transfer Fr...197334052024-04-25 15:54:23348 days ago1714060463IN
Fake_Phishing285037
0 ETH0.0014664828.58480902
Transfer From192259752024-02-14 11:41:23419 days ago1707910883IN
Fake_Phishing285037
0 ETH0.00094625.25035959
Transfer From192259722024-02-14 11:40:47419 days ago1707910847IN
Fake_Phishing285037
0 ETH0.0011132826.34052602
Transfer From192259682024-02-14 11:39:59419 days ago1707910799IN
Fake_Phishing285037
0 ETH0.0010928325.85680776
Transfer From192259622024-02-14 11:38:47419 days ago1707910727IN
Fake_Phishing285037
0 ETH0.001094725.9010863
Transfer From189983622024-01-13 13:46:47451 days ago1705153607IN
Fake_Phishing285037
0 ETH0.0009866518.08226337
Transfer From187118382023-12-04 8:34:23491 days ago1701678863IN
Fake_Phishing285037
0 ETH0.0023805640.10043196
Change Owner160329572022-11-23 13:21:11867 days ago1669209671IN
Fake_Phishing285037
0 ETH0.0003347111.88524548
Change Manager151785142022-07-20 8:50:31993 days ago1658307031IN
Fake_Phishing285037
0 ETH0.0007446415.73380348

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
AgentRegistry

Compiler Version
v0.8.15+commit.e14f2714

Optimization Enabled:
Yes with 750 runs

Other Settings:
default evmVersion
File 1 of 6 : AgentRegistry.sol
// 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);
    }
}

File 2 of 6 : UnitRegistry.sol
// 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;
    }
}

File 3 of 6 : IRegistry.sol
// 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);
}

File 4 of 6 : GenericRegistry.sol
// 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))));
    }
}

File 5 of 6 : ERC721.sol
// 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;
    }
}

File 6 of 6 : IErrorsRegistries.sol
// 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();
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 750
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "metadata": {
    "useLiteralContent": true
  },
  "libraries": {}
}

Contract Security Audit

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"}]

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


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
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.