ETH Price: $3,488.16 (+4.17%)

Contract

0xD951BfC09a7EC90eE6331564a0D62C8CB8a86Fe9
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
0x60806040135386492021-11-02 16:43:441118 days ago1635871424IN
 Create: StrongNFTBonusV7
0 ETH0.7391188230

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
StrongNFTBonusV7

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 11 : StrongNFTBonusV7.sol
//SPDX-License-Identifier: Unlicensed
pragma solidity 0.6.12;
pragma experimental ABIEncoderV2;

import "./interfaces/ServiceInterface.sol";
import "./interfaces/IERC1155Preset.sol";
import "./interfaces/StrongNFTBonusLegacyInterface.sol";
import "@openzeppelin/contracts/math/SafeMath.sol";
import "@openzeppelin/contracts/GSN/Context.sol";
import "@openzeppelin/contracts/token/ERC1155/ERC1155Receiver.sol";

contract StrongNFTBonusV7 is Context {

  using SafeMath for uint256;

  event Staked(address indexed sender, uint256 tokenId, uint128 nodeId, uint256 block);
  event Unstaked(address indexed sender, uint256 tokenId, uint128 nodeId, uint256 block);

  ServiceInterface public CService;
  IERC1155Preset public CERC1155;
  StrongNFTBonusLegacyInterface public CStrongNFTBonus;

  bool public initDone;

  address public serviceAdmin;
  address public superAdmin;

  string[] public nftBonusNames;
  mapping(string => uint256) public nftBonusLowerBound;
  mapping(string => uint256) public nftBonusUpperBound;
  mapping(string => uint256) public nftBonusValue;
  mapping(string => uint256) public nftBonusEffectiveBlock;

  mapping(uint256 => address) public nftIdStakedToEntity;
  mapping(uint256 => uint128) public nftIdStakedToNodeId;
  mapping(uint256 => uint256) public nftIdStakedAtBlock;
  mapping(address => mapping(uint128 => uint256)) public entityNodeStakedNftId;

  mapping(bytes4 => bool) private _supportedInterfaces;

  mapping(string => uint8) public nftBonusNodesLimit;
  mapping(uint256 => uint8) public nftIdStakedToNodesCount;
  mapping(uint128 => uint256) public nodeIdStakedAtBlock;
  mapping(address => uint256[]) public entityStakedNftIds;

  mapping(address => mapping(uint128 => uint256)) public entityNodeStakedAtBlock;

  mapping(address => bool) private serviceContracts;
  mapping(address => mapping(address => mapping(uint128 => uint256))) public entityServiceNodeStakedNftId;
  mapping(address => mapping(address => mapping(uint128 => uint256))) public entityServiceNodeStakedAtBlock;

  event StakedToNode(address indexed sender, uint256 tokenId, uint128 nodeId, uint256 block, address serviceContract);
  event UnstakedFromNode(address indexed sender, uint256 tokenId, uint128 nodeId, uint256 block, address serviceContract);

  function init(address serviceContract, address nftContract, address strongNFTBonusContract, address serviceAdminAddress, address superAdminAddress) public {
    require(initDone == false, "init done");

    _registerInterface(0x01ffc9a7);
    _registerInterface(
      ERC1155Receiver(0).onERC1155Received.selector ^
      ERC1155Receiver(0).onERC1155BatchReceived.selector
    );

    serviceAdmin = serviceAdminAddress;
    superAdmin = superAdminAddress;
    CService = ServiceInterface(serviceContract);
    CERC1155 = IERC1155Preset(nftContract);
    CStrongNFTBonus = StrongNFTBonusLegacyInterface(strongNFTBonusContract);
    initDone = true;
  }

  //
  // Getters
  // -------------------------------------------------------------------------------------------------------------------

  function isNftStaked(uint256 _nftId) public view returns (bool) {
    return nftIdStakedToNodeId[_nftId] != 0 || nftIdStakedToNodesCount[_nftId] > 0;
  }

  function isNftStakedLegacy(uint256 _nftId) public view returns (bool) {
    return CStrongNFTBonus.isNftStaked(_nftId);
  }

  function getStakedNftId(address _entity, uint128 _nodeId, address _serviceContract) public view returns (uint256) {
    uint256 stakedNftId = isEthereumNode(_serviceContract) ? entityNodeStakedNftId[_entity][_nodeId] : 0;
    uint256 stakedNftIdNew = entityServiceNodeStakedNftId[_entity][_serviceContract][_nodeId];
    uint256 stakedNftIdLegacy = CStrongNFTBonus.getStakedNftId(_entity, _nodeId);

    return stakedNftIdNew != 0 ? stakedNftIdNew : (stakedNftId != 0 ? stakedNftId : stakedNftIdLegacy);
  }

  function getStakedNftIds(address _entity) public view returns (uint256[] memory) {
    return entityStakedNftIds[_entity];
  }

  function getNftBonusNames() public view returns (string[] memory) {
    return nftBonusNames;
  }

  function getNftNodesLeft(uint256 _nftId) public view returns (uint256) {
    return nftBonusNodesLimit[getNftBonusName(_nftId)] - nftIdStakedToNodesCount[_nftId];
  }

  function getNftBonusName(uint256 _nftId) public view returns (string memory) {
    for (uint8 i = 0; i < nftBonusNames.length; i++) {
      if (_nftId >= nftBonusLowerBound[nftBonusNames[i]] && _nftId <= nftBonusUpperBound[nftBonusNames[i]]) {
        return nftBonusNames[i];
      }
    }

    return "";
  }

  function getBonus(address _entity, uint128 _nodeId, uint256 _fromBlock, uint256 _toBlock) public view returns (uint256) {
    address serviceContract = _msgSender();
    require(serviceContracts[serviceContract], "service doesnt exist");

    uint256 nftId = getStakedNftId(_entity, _nodeId, serviceContract);
    string memory bonusName = getNftBonusName(nftId);
    if (keccak256(abi.encode(bonusName)) == keccak256(abi.encode(""))) return 0;

    uint256 stakedAtBlock = entityServiceNodeStakedAtBlock[_entity][serviceContract][_nodeId] > 0
    ? entityServiceNodeStakedAtBlock[_entity][serviceContract][_nodeId]
    : (entityNodeStakedAtBlock[_entity][_nodeId] > 0
    ? entityNodeStakedAtBlock[_entity][_nodeId] : nftIdStakedAtBlock[nftId]);

    uint256 effectiveBlock = nftBonusEffectiveBlock[bonusName];
    uint256 startFromBlock = stakedAtBlock > _fromBlock ? stakedAtBlock : _fromBlock;
    if (startFromBlock < effectiveBlock) {
      startFromBlock = effectiveBlock;
    }

    if (stakedAtBlock == 0 && keccak256(abi.encode(bonusName)) == keccak256(abi.encode("BRONZE"))) {
      return CStrongNFTBonus.getBonus(_entity, _nodeId, startFromBlock, _toBlock);
    }

    if (nftId == 0) return 0;
    if (stakedAtBlock == 0) return 0;
    if (effectiveBlock == 0) return 0;
    if (startFromBlock >= _toBlock) return 0;
    if (CERC1155.balanceOf(address(this), nftId) == 0) return 0;

    return _toBlock.sub(startFromBlock).mul(nftBonusValue[bonusName]);
  }

  function isNftStaked(uint256 _nftId, uint128 _nodeId, address _serviceContract) public view returns (bool) {
    return (isEthereumNode(_serviceContract) && entityNodeStakedNftId[_msgSender()][_nodeId] == _nftId)
    || entityServiceNodeStakedNftId[_msgSender()][_serviceContract][_nodeId] == _nftId;
  }

  function isEthereumNode(address _serviceContract) public view returns (bool) {
    return _serviceContract == address(CService);
  }

  //
  // Staking
  // -------------------------------------------------------------------------------------------------------------------

  function stakeNFT(uint256 _nftId, uint128 _nodeId, address _serviceContract) public payable {
    string memory bonusName = getNftBonusName(_nftId);
    require(keccak256(abi.encode(bonusName)) != keccak256(abi.encode("")), "not eligible");
    require(CERC1155.balanceOf(_msgSender(), _nftId) != 0
      || (CERC1155.balanceOf(address(this), _nftId) != 0 && nftIdStakedToEntity[_nftId] == _msgSender()), "not enough");
    require(nftIdStakedToNodesCount[_nftId] < nftBonusNodesLimit[bonusName], "over limit");
    require(serviceContracts[_serviceContract], "service doesnt exist");
    require(ServiceInterface(_serviceContract).doesNodeExist(_msgSender(), _nodeId), "node doesnt exist");
    require(getStakedNftId(_msgSender(), _nodeId, _serviceContract) == 0, "already staked");

    entityServiceNodeStakedNftId[_msgSender()][_serviceContract][_nodeId] = _nftId;
    nftIdStakedToEntity[_nftId] = _msgSender();
    entityServiceNodeStakedAtBlock[_msgSender()][_serviceContract][_nodeId] = block.number;
    nftIdStakedToNodesCount[_nftId] += 1;

    bool alreadyExists = false;
    for (uint8 i = 0; i < entityStakedNftIds[_msgSender()].length; i++) {
      if (entityStakedNftIds[_msgSender()][i] == _nftId) {
        alreadyExists = true;
        break;
      }
    }
    if (!alreadyExists) {
      entityStakedNftIds[_msgSender()].push(_nftId);
    }

    if (CERC1155.balanceOf(address(this), _nftId) == 0) {
      CERC1155.safeTransferFrom(_msgSender(), address(this), _nftId, 1, bytes(""));
    }

    emit StakedToNode(_msgSender(), _nftId, _nodeId, block.number, _serviceContract);
  }

  function unStakeNFT(uint256 _nftId, uint128 _nodeId, uint256 _blockNumber, address _serviceContract) public payable {
    require(isNftStaked(_nftId, _nodeId, _serviceContract), "wrong node");
    require(nftIdStakedToEntity[_nftId] != address(0), "not staked");
    require(nftIdStakedToEntity[_nftId] == _msgSender(), "not staker");
    require(serviceContracts[_serviceContract], "service doesnt exist");

    if (!ServiceInterface(_serviceContract).hasNodeExpired(_msgSender(), _nodeId)) {
      ServiceInterface(_serviceContract).claim{value : msg.value}(_nodeId, _blockNumber, false);
    }

    entityServiceNodeStakedNftId[_msgSender()][_serviceContract][_nodeId] = 0;
    nftIdStakedToNodeId[_nftId] = 0;

    if (isEthereumNode(_serviceContract)) {
      entityNodeStakedNftId[_msgSender()][_nodeId] = 0;
    }

    if (nftIdStakedToNodesCount[_nftId] > 0) {
      nftIdStakedToNodesCount[_nftId] -= 1;
    }

    if (nftIdStakedToNodesCount[_nftId] == 0) {
      nftIdStakedToEntity[_nftId] = address(0);

      for (uint8 i = 0; i < entityStakedNftIds[_msgSender()].length; i++) {
        if (entityStakedNftIds[_msgSender()][i] == _nftId) {
          _deleteIndex(entityStakedNftIds[_msgSender()], i);
          break;
        }
      }

      CERC1155.safeTransferFrom(address(this), _msgSender(), _nftId, 1, bytes(""));
    }

    emit UnstakedFromNode(_msgSender(), _nftId, _nodeId, _blockNumber, _serviceContract);
  }

  //
  // Admin
  // -------------------------------------------------------------------------------------------------------------------

  function updateBonus(string memory _name, uint256 _lowerBound, uint256 _upperBound, uint256 _value, uint256 _block, uint8 _nodesLimit) public {
    require(_msgSender() == serviceAdmin || _msgSender() == superAdmin, "not admin");

    bool alreadyExists = false;
    for (uint8 i = 0; i < nftBonusNames.length; i++) {
      if (keccak256(abi.encode(nftBonusNames[i])) == keccak256(abi.encode(_name))) {
        alreadyExists = true;
      }
    }

    if (!alreadyExists) {
      nftBonusNames.push(_name);
    }

    nftBonusLowerBound[_name] = _lowerBound;
    nftBonusUpperBound[_name] = _upperBound;
    nftBonusValue[_name] = _value;
    nftBonusEffectiveBlock[_name] = _block != 0 ? _block : block.number;
    nftBonusNodesLimit[_name] = _nodesLimit;
  }

  function updateContracts(address _nftContract) public {
    require(_msgSender() == superAdmin, "not admin");
    CERC1155 = IERC1155Preset(_nftContract);
  }

  function addServiceContract(address _contract) public {
    require(_msgSender() == superAdmin, "not admin");
    serviceContracts[_contract] = true;
  }

  function removeServiceContract(address _contract) public {
    require(_msgSender() == superAdmin, "not admin");
    serviceContracts[_contract] = false;
  }

  function updateServiceAdmin(address newServiceAdmin) public {
    require(_msgSender() == superAdmin, "not admin");
    serviceAdmin = newServiceAdmin;
  }

  function updateEntityNodeStakedAtBlock(address _entity, uint128 _nodeId, uint256 _block) public {
    require(_msgSender() == serviceAdmin || _msgSender() == superAdmin, "not admin");

    entityNodeStakedAtBlock[_entity][_nodeId] = _block;
  }

  function updateEntityServiceNodeStakedAtBlock(address _entity, uint128 _nodeId, address _serviceContract, uint256 _block) public {
    require(_msgSender() == serviceAdmin || _msgSender() == superAdmin, "not admin");

    entityServiceNodeStakedAtBlock[_entity][_serviceContract][_nodeId] = _block;
  }

  function fixData(
    address _serviceContract,
    address _entity,
    uint128 _nodeId,
    uint256 _nftId,
    uint256 _block,
    uint8 _count,
    bool _updateLegacy,
    bool _updateNew
  ) public {
    require(_msgSender() == serviceAdmin || _msgSender() == superAdmin, "not admin");

    nftIdStakedToEntity[_nftId] = _entity;
    nftIdStakedToNodesCount[_nftId] = _count;

    if (_updateLegacy) {
      nftIdStakedToNodeId[_nftId] = _nodeId;
      entityNodeStakedNftId[_entity][_nodeId] = _nftId;
    }

    if (_updateNew) {
      entityServiceNodeStakedNftId[_entity][_serviceContract][_nodeId] = _nftId;
      entityServiceNodeStakedAtBlock[_entity][_serviceContract][_nodeId] = _block;
    }
  }

  function fixOverrides(address _entity, uint256 _secondNftId, uint256 _originalNftId, uint128 _nodeId, uint256 _originalBlock) public {
    require(_msgSender() == serviceAdmin || _msgSender() == superAdmin, "not admin");

    address serviceContract = address(CService);
    bool secondNftStillStaked = entityServiceNodeStakedNftId[_entity][serviceContract][_nodeId] == _secondNftId;

    if (secondNftStillStaked) {
      nftIdStakedToNodeId[_secondNftId] = 0;
      entityNodeStakedNftId[_entity][_nodeId] = 0;

      if (nftIdStakedToNodesCount[_secondNftId] > 0) {
        nftIdStakedToNodesCount[_secondNftId] -= 1;
      }

      if (nftIdStakedToNodesCount[_secondNftId] == 0) {
        nftIdStakedToEntity[_secondNftId] = address(0);

        for (uint8 i = 0; i < entityStakedNftIds[_entity].length; i++) {
          if (entityStakedNftIds[_entity][i] == _secondNftId) {
            _deleteIndex(entityStakedNftIds[_entity], i);
            break;
          }
        }

        CERC1155.safeTransferFrom(address(this), _entity, _secondNftId, 1, bytes(""));
      }

      emit UnstakedFromNode(_entity, _secondNftId, _nodeId, block.number, serviceContract);
    }

    entityServiceNodeStakedNftId[_entity][serviceContract][_nodeId] = _originalNftId;
    entityServiceNodeStakedAtBlock[_entity][serviceContract][_nodeId] = _originalBlock;
  }

  //
  // ERC1155 support
  // -------------------------------------------------------------------------------------------------------------------

  function onERC1155Received(address, address, uint256, uint256, bytes memory) public virtual returns (bytes4) {
    return this.onERC1155Received.selector;
  }

  function onERC1155BatchReceived(address, address, uint256[] memory, uint256[] memory, bytes memory) public virtual returns (bytes4) {
    return this.onERC1155BatchReceived.selector;
  }

  function supportsInterface(bytes4 interfaceId) public view returns (bool) {
    return _supportedInterfaces[interfaceId];
  }

  function _registerInterface(bytes4 interfaceId) internal virtual {
    require(interfaceId != 0xffffffff, "ERC165: invalid interface id");
    _supportedInterfaces[interfaceId] = true;
  }

  function _deleteIndex(uint256[] storage array, uint256 index) internal {
    uint256 lastIndex = array.length.sub(1);
    uint256 lastEntry = array[lastIndex];
    if (index == lastIndex) {
      array.pop();
    } else {
      array[index] = lastEntry;
      array.pop();
    }
  }
}

File 2 of 11 : ServiceInterface.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.12;

interface ServiceInterface {
  function traunch(address) external view returns(uint256);

  function claimingFeeNumerator() external view returns(uint256);

  function claimingFeeDenominator() external view returns(uint256);

  function doesNodeExist(address entity, uint128 nodeId) external view returns (bool);

  function getNodeId(address entity, uint128 nodeId) external view returns (bytes memory);

  function getReward(address entity, uint128 nodeId) external view returns (uint256);

  function getRewardByBlock(address entity, uint128 nodeId, uint256 blockNumber) external view returns (uint256);

  function getTraunch(address entity) external view returns (uint256);

  function hasNodeExpired(address _entity, uint128 _nodeId) external view returns (bool);

  function isEntityActive(address entity) external view returns (bool);

  function claim(uint128 nodeId, uint256 blockNumber, bool toStrongPool) external payable;
}

File 3 of 11 : IERC1155Preset.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.6.2;

/**
 * @dev Required interface of an ERC1155 compliant contract, as defined in the
 * https://eips.ethereum.org/EIPS/eip-1155[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155Preset {
    /**
     * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
     */
    event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);

    /**
     * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
     * transfers.
     */
    event TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values);

    /**
     * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
     * `approved`.
     */
    event ApprovalForAll(address indexed account, address indexed operator, bool approved);

    /**
     * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
     *
     * If an {URI} event was emitted for `id`, the standard
     * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
     * returned by {IERC1155MetadataURI-uri}.
     */
    event URI(string value, uint256 indexed id);

    /**
     * @dev Returns the amount of tokens of token type `id` owned by `account`.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) external view returns (uint256);

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory);

    /**
     * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
     *
     * Emits an {ApprovalForAll} event.
     *
     * Requirements:
     *
     * - `operator` cannot be the caller.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address account, address operator) external view returns (bool);

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes calldata data) external;

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function safeBatchTransferFrom(address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data) external;

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);

    /**
     * @dev Creates `amount` new tokens for `to`, of token type `id`.
     *
     * See {ERC1155-_mint}.
     *
     * Requirements:
     *
     * - the caller must have the `MINTER_ROLE`.
     */
    function mint(address to, uint256 id, uint256 amount, bytes memory data) external;

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] variant of {mint}.
     */
    function mintBatch(address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data) external;

    function getOwnerIdByIndex(address owner, uint256 index) external view returns (uint256);

    function getOwnerIdIndex(address owner, uint256 id) external view returns (uint256);
}

File 4 of 11 : StrongNFTBonusLegacyInterface.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;

interface StrongNFTBonusLegacyInterface {
  function getBonus(address _entity, uint128 _nodeId, uint256 _fromBlock, uint256 _toBlock) external view returns (uint256);

  function getStakedNftId(address _entity, uint128 _nodeId) external view returns (uint256);

  function isNftStaked(uint256 _nftId) external view returns (bool);
}

File 5 of 11 : SafeMath.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        uint256 c = a + b;
        if (c < a) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b > a) return (false, 0);
        return (true, a - b);
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) return (true, 0);
        uint256 c = a * b;
        if (c / a != b) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a / b);
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a % b);
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");
        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a, "SafeMath: subtraction overflow");
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) return 0;
        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0, "SafeMath: division by zero");
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0, "SafeMath: modulo by zero");
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        return a - b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryDiv}.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a % b;
    }
}

File 6 of 11 : Context.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

import "../utils/Context.sol";

File 7 of 11 : ERC1155Receiver.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

import "./IERC1155Receiver.sol";
import "../../introspection/ERC165.sol";

/**
 * @dev _Available since v3.1._
 */
abstract contract ERC1155Receiver is ERC165, IERC1155Receiver {
    constructor() internal {
        _registerInterface(
            ERC1155Receiver(address(0)).onERC1155Received.selector ^
            ERC1155Receiver(address(0)).onERC1155BatchReceived.selector
        );
    }
}

File 8 of 11 : Context.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with GSN meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address payable) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

File 9 of 11 : IERC1155Receiver.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

import "../../introspection/IERC165.sol";

/**
 * _Available since v3.1._
 */
interface IERC1155Receiver is IERC165 {

    /**
        @dev Handles the receipt of a single ERC1155 token type. This function is
        called at the end of a `safeTransferFrom` after the balance has been updated.
        To accept the transfer, this must return
        `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
        (i.e. 0xf23a6e61, or its own function selector).
        @param operator The address which initiated the transfer (i.e. msg.sender)
        @param from The address which previously owned the token
        @param id The ID of the token being transferred
        @param value The amount of tokens being transferred
        @param data Additional data with no specified format
        @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
    */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    )
        external
        returns(bytes4);

    /**
        @dev Handles the receipt of a multiple ERC1155 token types. This function
        is called at the end of a `safeBatchTransferFrom` after the balances have
        been updated. To accept the transfer(s), this must return
        `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
        (i.e. 0xbc197c81, or its own function selector).
        @param operator The address which initiated the batch transfer (i.e. msg.sender)
        @param from The address which previously owned the token
        @param ids An array containing ids of each token being transferred (order and length must match values array)
        @param values An array containing amounts of each token being transferred (order and length must match ids array)
        @param data Additional data with no specified format
        @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
    */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    )
        external
        returns(bytes4);
}

File 10 of 11 : ERC165.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

import "./IERC165.sol";

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts may inherit from this and call {_registerInterface} to declare
 * their support of an interface.
 */
abstract contract ERC165 is IERC165 {
    /*
     * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7
     */
    bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;

    /**
     * @dev Mapping of interface ids to whether or not it's supported.
     */
    mapping(bytes4 => bool) private _supportedInterfaces;

    constructor () internal {
        // Derived contracts need only register support for their own interfaces,
        // we register support for ERC165 itself here
        _registerInterface(_INTERFACE_ID_ERC165);
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     *
     * Time complexity O(1), guaranteed to always use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return _supportedInterfaces[interfaceId];
    }

    /**
     * @dev Registers the contract as an implementer of the interface defined by
     * `interfaceId`. Support of the actual ERC165 interface is automatic and
     * registering its interface id is not required.
     *
     * See {IERC165-supportsInterface}.
     *
     * Requirements:
     *
     * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`).
     */
    function _registerInterface(bytes4 interfaceId) internal virtual {
        require(interfaceId != 0xffffffff, "ERC165: invalid interface id");
        _supportedInterfaces[interfaceId] = true;
    }
}

File 11 of 11 : IERC165.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

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

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint128","name":"nodeId","type":"uint128"},{"indexed":false,"internalType":"uint256","name":"block","type":"uint256"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint128","name":"nodeId","type":"uint128"},{"indexed":false,"internalType":"uint256","name":"block","type":"uint256"},{"indexed":false,"internalType":"address","name":"serviceContract","type":"address"}],"name":"StakedToNode","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint128","name":"nodeId","type":"uint128"},{"indexed":false,"internalType":"uint256","name":"block","type":"uint256"}],"name":"Unstaked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint128","name":"nodeId","type":"uint128"},{"indexed":false,"internalType":"uint256","name":"block","type":"uint256"},{"indexed":false,"internalType":"address","name":"serviceContract","type":"address"}],"name":"UnstakedFromNode","type":"event"},{"inputs":[],"name":"CERC1155","outputs":[{"internalType":"contract IERC1155Preset","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CService","outputs":[{"internalType":"contract ServiceInterface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CStrongNFTBonus","outputs":[{"internalType":"contract StrongNFTBonusLegacyInterface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"}],"name":"addServiceContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint128","name":"","type":"uint128"}],"name":"entityNodeStakedAtBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint128","name":"","type":"uint128"}],"name":"entityNodeStakedNftId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint128","name":"","type":"uint128"}],"name":"entityServiceNodeStakedAtBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint128","name":"","type":"uint128"}],"name":"entityServiceNodeStakedNftId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"entityStakedNftIds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_serviceContract","type":"address"},{"internalType":"address","name":"_entity","type":"address"},{"internalType":"uint128","name":"_nodeId","type":"uint128"},{"internalType":"uint256","name":"_nftId","type":"uint256"},{"internalType":"uint256","name":"_block","type":"uint256"},{"internalType":"uint8","name":"_count","type":"uint8"},{"internalType":"bool","name":"_updateLegacy","type":"bool"},{"internalType":"bool","name":"_updateNew","type":"bool"}],"name":"fixData","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_entity","type":"address"},{"internalType":"uint256","name":"_secondNftId","type":"uint256"},{"internalType":"uint256","name":"_originalNftId","type":"uint256"},{"internalType":"uint128","name":"_nodeId","type":"uint128"},{"internalType":"uint256","name":"_originalBlock","type":"uint256"}],"name":"fixOverrides","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_entity","type":"address"},{"internalType":"uint128","name":"_nodeId","type":"uint128"},{"internalType":"uint256","name":"_fromBlock","type":"uint256"},{"internalType":"uint256","name":"_toBlock","type":"uint256"}],"name":"getBonus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nftId","type":"uint256"}],"name":"getNftBonusName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNftBonusNames","outputs":[{"internalType":"string[]","name":"","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nftId","type":"uint256"}],"name":"getNftNodesLeft","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_entity","type":"address"},{"internalType":"uint128","name":"_nodeId","type":"uint128"},{"internalType":"address","name":"_serviceContract","type":"address"}],"name":"getStakedNftId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_entity","type":"address"}],"name":"getStakedNftIds","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"serviceContract","type":"address"},{"internalType":"address","name":"nftContract","type":"address"},{"internalType":"address","name":"strongNFTBonusContract","type":"address"},{"internalType":"address","name":"serviceAdminAddress","type":"address"},{"internalType":"address","name":"superAdminAddress","type":"address"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initDone","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_serviceContract","type":"address"}],"name":"isEthereumNode","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nftId","type":"uint256"},{"internalType":"uint128","name":"_nodeId","type":"uint128"},{"internalType":"address","name":"_serviceContract","type":"address"}],"name":"isNftStaked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nftId","type":"uint256"}],"name":"isNftStaked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nftId","type":"uint256"}],"name":"isNftStakedLegacy","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"nftBonusEffectiveBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"nftBonusLowerBound","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"nftBonusNames","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"nftBonusNodesLimit","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"nftBonusUpperBound","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"nftBonusValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"nftIdStakedAtBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"nftIdStakedToEntity","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"nftIdStakedToNodeId","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"nftIdStakedToNodesCount","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint128","name":"","type":"uint128"}],"name":"nodeIdStakedAtBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"}],"name":"removeServiceContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"serviceAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nftId","type":"uint256"},{"internalType":"uint128","name":"_nodeId","type":"uint128"},{"internalType":"address","name":"_serviceContract","type":"address"}],"name":"stakeNFT","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"superAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nftId","type":"uint256"},{"internalType":"uint128","name":"_nodeId","type":"uint128"},{"internalType":"uint256","name":"_blockNumber","type":"uint256"},{"internalType":"address","name":"_serviceContract","type":"address"}],"name":"unStakeNFT","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"uint256","name":"_lowerBound","type":"uint256"},{"internalType":"uint256","name":"_upperBound","type":"uint256"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_block","type":"uint256"},{"internalType":"uint8","name":"_nodesLimit","type":"uint8"}],"name":"updateBonus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_nftContract","type":"address"}],"name":"updateContracts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_entity","type":"address"},{"internalType":"uint128","name":"_nodeId","type":"uint128"},{"internalType":"uint256","name":"_block","type":"uint256"}],"name":"updateEntityNodeStakedAtBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_entity","type":"address"},{"internalType":"uint128","name":"_nodeId","type":"uint128"},{"internalType":"address","name":"_serviceContract","type":"address"},{"internalType":"uint256","name":"_block","type":"uint256"}],"name":"updateEntityServiceNodeStakedAtBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newServiceAdmin","type":"address"}],"name":"updateServiceAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405234801561001057600080fd5b5061392a806100206000396000f3fe6080604052600436106102885760003560e01c80639171ce711161015a578063c2c9b3c1116100c1578063da998dca1161007a578063da998dca146107e7578063ea6df596146107fc578063f23a6e611461081c578063f304e01d1461083c578063fc7ea8d11461085c578063fed0a20e1461087157610288565b8063c2c9b3c114610718578063c712d34a14610738578063cb4dd51e1461075a578063ccff148f1461077a578063d4a8c0821461079a578063d60444ff146107ba57610288565b8063ac3a760111610113578063ac3a760114610656578063ad553eef14610676578063b07d9cbb14610696578063b64ac8e4146106b6578063bc197c81146106d6578063c153dc0b1461070357610288565b80639171ce71146105965780639954a804146105b65780639f4808da146105d6578063a68b62e5146105f6578063a8306cf214610616578063a8936d591461063657610288565b8063359ef75b116101fe578063674edb72116101b7578063674edb72146104c957806368b087e8146104e957806372ab973f146105165780637760c6c71461053657806378592e7414610556578063916db6eb1461057657610288565b8063359ef75b1461041457806339e3aea214610434578063559b12fe146104475780635ab9daf0146104745780635ed44191146104945780636441d379146104b457610288565b80631f8e027b116102505780631f8e027b1461035f578063279958a91461037f57806329575f6a1461039f5780633183685b146103c157806331e410a8146103e1578063328f7233146103f457610288565b806301ffc9a71461028d578063048cde02146102c357806304dc6ada146102e55780631134aafe1461031257806313f9348414610332575b600080fd5b34801561029957600080fd5b506102ad6102a83660046130e9565b610886565b6040516102ba91906134a1565b60405180910390f35b3480156102cf57600080fd5b506102e36102de366004612f82565b6108a9565b005b3480156102f157600080fd5b50610305610300366004613111565b610950565b6040516102ba9190613816565b34801561031e57600080fd5b506102ad61032d366004613209565b61096d565b34801561033e57600080fd5b5061035261034d3660046131d9565b610a18565b6040516102ba91906134c1565b34801561036b57600080fd5b506102ad61037a3660046131d9565b610b76565b34801561038b57600080fd5b506102e361039a366004612c97565b610bfd565b3480156103ab57600080fd5b506103b4610c59565b6040516102ba9190613345565b3480156103cd57600080fd5b506103056103dc3660046131d9565b610c68565b6102e36103ef366004613209565b610c7a565b34801561040057600080fd5b506102ad61040f3660046131d9565b6112b9565b34801561042057600080fd5b506102e361042f366004612cb2565b6112f1565b6102e3610442366004613246565b6113a9565b34801561045357600080fd5b50610467610462366004612c97565b611824565b6040516102ba919061345d565b34801561048057600080fd5b5061035261048f3660046131d9565b611890565b3480156104a057600080fd5b506103056104af366004613052565b611936565b3480156104c057600080fd5b506103b4611964565b3480156104d557600080fd5b506103056104e4366004613111565b611973565b3480156104f557600080fd5b50610509610504366004613111565b611990565b6040516102ba919061384c565b34801561052257600080fd5b506103056105313660046131be565b6119b0565b34801561054257600080fd5b506102e3610551366004612c97565b6119c2565b34801561056257600080fd5b506103056105713660046131d9565b611a20565b34801561058257600080fd5b50610305610591366004612f0f565b611a6b565b3480156105a257600080fd5b506102e36105b1366004612fcf565b611a88565b3480156105c257600080fd5b506103056105d1366004612f0f565b611b17565b3480156105e257600080fd5b506103b46105f13660046131d9565b611b34565b34801561060257600080fd5b50610305610611366004612f43565b611b4f565b34801561062257600080fd5b506102ad610631366004612c97565b611c70565b34801561064257600080fd5b50610305610651366004613111565b611c84565b34801561066257600080fd5b50610305610671366004612dc5565b611ca1565b34801561068257600080fd5b506102e3610691366004612c97565b611cc4565b3480156106a257600080fd5b506103056106b136600461300f565b611d20565b3480156106c257600080fd5b506102e36106d1366004612c97565b612126565b3480156106e257600080fd5b506106f66106f1366004612d1b565b612181565b6040516102ba91906134ac565b34801561070f57600080fd5b506103b4612192565b34801561072457600080fd5b50610305610733366004613111565b6121a1565b34801561074457600080fd5b5061074d6121be565b6040516102ba91906133fd565b34801561076657600080fd5b506102e3610775366004613144565b612296565b34801561078657600080fd5b506102e3610795366004612e0f565b61249e565b3480156107a657600080fd5b506103056107b5366004612dc5565b6125fa565b3480156107c657600080fd5b506107da6107d53660046131d9565b61261d565b6040516102ba91906137df565b3480156107f357600080fd5b506103b4612638565b34801561080857600080fd5b506102e361081736600461307c565b612647565b34801561082857600080fd5b506106f6610837366004612eaa565b612950565b34801561084857600080fd5b506105096108573660046131d9565b612961565b34801561086857600080fd5b506103b4612976565b34801561087d57600080fd5b506102ad612985565b6001600160e01b031981166000908152600e602052604090205460ff165b919050565b6003546001600160a01b03166108bd612995565b6001600160a01b031614806108ec57506004546001600160a01b03166108e1612995565b6001600160a01b0316145b6109115760405162461bcd60e51b815260040161090890613794565b60405180910390fd5b6001600160a01b0393841660009081526016602090815260408083209490961682529283528481206001600160801b0390941681529290915291902055565b805160208183018101805160078252928201919093012091525481565b600061097882611c70565b80156109be575083600d600061098c612995565b6001600160a01b03168152602080820192909252604090810160009081206001600160801b0388168252909252902054145b80610a10575083601560006109d1612995565b6001600160a01b0390811682526020808301939093526040918201600090812091871681529083528181206001600160801b0388168252909252902054145b949350505050565b606060005b60055460ff82161015610b6057600660058260ff1681548110610a3c57fe5b90600052602060002001604051610a5391906132d5565b9081526020016040518091039020548310158015610aa85750600760058260ff1681548110610a7e57fe5b90600052602060002001604051610a9591906132d5565b9081526020016040518091039020548311155b15610b585760058160ff1681548110610abd57fe5b600091825260209182902001805460408051601f6002600019610100600187161502019094169390930492830185900485028101850190915281815292830182828015610b4b5780601f10610b2057610100808354040283529160200191610b4b565b820191906000526020600020905b815481529060010190602001808311610b2e57829003601f168201915b50505050509150506108a4565b600101610a1d565b5050604080516020810190915260008152919050565b60025460405163328f723360e01b81526000916001600160a01b03169063328f723390610ba7908590600401613816565b60206040518083038186803b158015610bbf57600080fd5b505afa158015610bd3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bf791906130cd565b92915050565b6004546001600160a01b0316610c11612995565b6001600160a01b031614610c375760405162461bcd60e51b815260040161090890613794565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6004546001600160a01b031681565b600c6020526000908152604090205481565b6060610c8584610a18565b9050604051602001610c9690613783565b6040516020818303038152906040528051906020012081604051602001610cbd91906134c1565b604051602081830303815290604052805190602001201415610cf15760405162461bcd60e51b81526004016109089061366f565b6001546001600160a01b031662fdd58e610d09612995565b866040518363ffffffff1660e01b8152600401610d279291906133b5565b60206040518083038186803b158015610d3f57600080fd5b505afa158015610d53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d7791906131f1565b151580610e2e5750600154604051627eeac760e11b81526001600160a01b039091169062fdd58e90610daf90309088906004016133b5565b60206040518083038186803b158015610dc757600080fd5b505afa158015610ddb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dff91906131f1565b15801590610e2e5750610e10612995565b6000858152600a60205260409020546001600160a01b039081169116145b610e4a5760405162461bcd60e51b815260040161090890613608565b600f81604051610e5a91906132b9565b9081526040805160209281900383019020546000878152601090935291205460ff918216911610610e9d5760405162461bcd60e51b81526004016109089061355e565b6001600160a01b03821660009081526014602052604090205460ff16610ed55760405162461bcd60e51b815260040161090890613695565b816001600160a01b03166326665562610eec612995565b856040518363ffffffff1660e01b8152600401610f0a929190613393565b60206040518083038186803b158015610f2257600080fd5b505afa158015610f36573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f5a91906130cd565b610f765760405162461bcd60e51b8152600401610908906135dd565b610f88610f81612995565b8484611b4f565b15610fa55760405162461bcd60e51b8152600401610908906137b7565b8360156000610fb2612995565b6001600160a01b0390811682526020808301939093526040918201600090812091871681529083528181206001600160801b0388168252909252902055610ff7612995565b6000858152600a6020526040812080546001600160a01b0319166001600160a01b0393909316929092179091554390601690611031612995565b6001600160a01b0390811682526020808301939093526040918201600090812091871681529083528181206001600160801b038816825283528181209390935586835260109091528120805460ff8082166001011660ff19909116179055805b6012600061109d612995565b6001600160a01b0316815260208101919091526040016000205460ff8216101561111e5785601260006110ce612995565b6001600160a01b03166001600160a01b031681526020019081526020016000208260ff16815481106110fc57fe5b90600052602060002001541415611116576001915061111e565b600101611091565b508061115f5760126000611130612995565b6001600160a01b0316815260208082019290925260400160009081208054600181018255908252919020018590555b600154604051627eeac760e11b81526001600160a01b039091169062fdd58e9061118f90309089906004016133b5565b60206040518083038186803b1580156111a757600080fd5b505afa1580156111bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111df91906131f1565b611264576001546001600160a01b031663f242432a6111fc612995565b604080516020810182526000815290516001600160e01b031960e085901b168152611231929130918b91600191600401613359565b600060405180830381600087803b15801561124b57600080fd5b505af115801561125f573d6000803e3d6000fd5b505050505b61126c612995565b6001600160a01b03167f2091db4757417ee6930004b3e4755720fdcb20ee7613e053f8effd4d173d3749868643876040516112aa949392919061381f565b60405180910390a25050505050565b6000818152600b60205260408120546001600160801b0316151580610bf757505060009081526010602052604090205460ff16151590565b600254600160a01b900460ff161561131b5760405162461bcd60e51b81526004016109089061362c565b61132b6301ffc9a760e01b612999565b61133b630271189760e51b612999565b600380546001600160a01b03199081166001600160a01b039485161790915560048054821692841692909217909155600080548216958316959095179094556001805485169382169390931790925560028054600160a01b9416919092161760ff60a01b1916919091179055565b6113b484848361096d565b6113d05760405162461bcd60e51b815260040161090890613582565b6000848152600a60205260409020546001600160a01b03166114045760405162461bcd60e51b81526004016109089061371e565b61140c612995565b6000858152600a60205260409020546001600160a01b039081169116146114455760405162461bcd60e51b8152600401610908906136fa565b6001600160a01b03811660009081526014602052604090205460ff1661147d5760405162461bcd60e51b815260040161090890613695565b806001600160a01b0316636c52ec10611494612995565b856040518363ffffffff1660e01b81526004016114b2929190613393565b60206040518083038186803b1580156114ca57600080fd5b505afa1580156114de573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061150291906130cd565b61156c57604051630e6507e960e21b81526001600160a01b038216906339941fa490349061153990879087906000906004016137f3565b6000604051808303818588803b15801561155257600080fd5b505af1158015611566573d6000803e3d6000fd5b50505050505b60006015600061157a612995565b6001600160a01b0390811682526020808301939093526040918201600090812091861681529083528181206001600160801b0388168252835281812093909355868352600b909152902080546001600160801b03191690556115db81611c70565b1561161f576000600d60006115ee612995565b6001600160a01b03168152602080820192909252604090810160009081206001600160801b03881682529092529020555b60008481526010602052604090205460ff161561165b576000848152601060205260409020805460ff19811660ff918216600019019091161790555b60008481526010602052604090205460ff166117d0576000848152600a6020526040812080546001600160a01b03191690555b6012600061169a612995565b6001600160a01b0316815260208101919091526040016000205460ff8216101561174f5784601260006116cb612995565b6001600160a01b03166001600160a01b031681526020019081526020016000208260ff16815481106116f957fe5b906000526020600020015414156117475761174260126000611719612995565b6001600160a01b03166001600160a01b031681526020019081526020016000208260ff166129e8565b61174f565b60010161168e565b506001546001600160a01b031663f242432a3061176a612995565b876001604051806020016040528060008152506040518663ffffffff1660e01b815260040161179d959493929190613359565b600060405180830381600087803b1580156117b757600080fd5b505af11580156117cb573d6000803e3d6000fd5b505050505b6117d8612995565b6001600160a01b03167f71d135e12a0a354469f06fae55d676e28a84fec8b3a2e61f0a5a0f3208e3b6ac85858585604051611816949392919061381f565b60405180910390a250505050565b6001600160a01b03811660009081526012602090815260409182902080548351818402810184019094528084526060939283018282801561188457602002820191906000526020600020905b815481526020019060010190808311611870575b50505050509050919050565b6005818154811061189d57fe5b600091825260209182902001805460408051601f600260001961010060018716150201909416939093049283018590048502810185019091528181529350909183018282801561192e5780601f106119035761010080835404028352916020019161192e565b820191906000526020600020905b81548152906001019060200180831161191157829003601f168201915b505050505081565b6012602052816000526040600020818154811061194f57fe5b90600052602060002001600091509150505481565b6001546001600160a01b031681565b805160208183018101805160088252928201919093012091525481565b8051602081830181018051600f8252928201919093012091525460ff1681565b60116020526000908152604090205481565b6004546001600160a01b03166119d6612995565b6001600160a01b0316146119fc5760405162461bcd60e51b815260040161090890613794565b6001600160a01b03166000908152601460205260409020805460ff19166001179055565b60008181526010602052604081205460ff16600f611a3d84610a18565b604051611a4a91906132b9565b9081526040519081900360200190205460ff90811691909103169050919050565b601360209081526000928352604080842090915290825290205481565b6003546001600160a01b0316611a9c612995565b6001600160a01b03161480611acb57506004546001600160a01b0316611ac0612995565b6001600160a01b0316145b611ae75760405162461bcd60e51b815260040161090890613794565b6001600160a01b0390921660009081526013602090815260408083206001600160801b0390941683529290522055565b600d60209081526000928352604080842090915290825290205481565b600a602052600090815260409020546001600160a01b031681565b600080611b5b83611c70565b611b66576000611b94565b6001600160a01b0385166000908152600d602090815260408083206001600160801b03881684529091529020545b6001600160a01b038087166000908152601560209081526040808320888516845282528083206001600160801b038a168452909152808220546002549151630d06322560e21b81529495509391921690633418c89490611bfa908a908a90600401613393565b60206040518083038186803b158015611c1257600080fd5b505afa158015611c26573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c4a91906131f1565b905081611c635782611c5c5780611c5e565b825b611c65565b815b979650505050505050565b6000546001600160a01b0390811691161490565b805160208183018101805160068252928201919093012091525481565b601560209081526000938452604080852082529284528284209052825290205481565b6004546001600160a01b0316611cd8612995565b6001600160a01b031614611cfe5760405162461bcd60e51b815260040161090890613794565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b600080611d2b612995565b6001600160a01b03811660009081526014602052604090205490915060ff16611d665760405162461bcd60e51b815260040161090890613695565b6000611d73878784611b4f565b90506060611d8082610a18565b9050604051602001611d9190613783565b6040516020818303038152906040528051906020012081604051602001611db891906134c1565b604051602081830303815290604052805190602001201415611de05760009350505050610a10565b6001600160a01b03808916600090815260166020908152604080832093871683529281528282206001600160801b038b168352905290812054611e95576001600160a01b03891660009081526013602090815260408083206001600160801b038c168452909152902054611e62576000838152600c6020526040902054611e90565b6001600160a01b03891660009081526013602090815260408083206001600160801b038c1684529091529020545b611ecd565b6001600160a01b03808a16600090815260166020908152604080832093881683529281528282206001600160801b038c168352905220545b90506000600983604051611ee191906132b9565b90815260200160405180910390205490506000888311611f015788611f03565b825b905081811015611f105750805b82158015611f675750604051602001611f289061364f565b6040516020818303038152906040528051906020012084604051602001611f4f91906134c1565b60405160208183030381529060405280519060200120145b15611fff5760025460405163b07d9cbb60e01b81526001600160a01b039091169063b07d9cbb90611fa2908e908e9086908e906004016133ce565b60206040518083038186803b158015611fba57600080fd5b505afa158015611fce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ff291906131f1565b9650505050505050610a10565b846120135760009650505050505050610a10565b826120275760009650505050505050610a10565b8161203b5760009650505050505050610a10565b8781106120515760009650505050505050610a10565b600154604051627eeac760e11b81526001600160a01b039091169062fdd58e9061208190309089906004016133b5565b60206040518083038186803b15801561209957600080fd5b505afa1580156120ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120d191906131f1565b6120e45760009650505050505050610a10565b6121176008856040516120f791906132b9565b908152604051908190036020019020546121118a84612a84565b90612aac565b9b9a5050505050505050505050565b6004546001600160a01b031661213a612995565b6001600160a01b0316146121605760405162461bcd60e51b815260040161090890613794565b6001600160a01b03166000908152601460205260409020805460ff19169055565b63bc197c8160e01b95945050505050565b6002546001600160a01b031681565b805160208183018101805160098252928201919093012091525481565b60606005805480602002602001604051908101604052809291908181526020016000905b8282101561228d5760008481526020908190208301805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156122795780601f1061224e57610100808354040283529160200191612279565b820191906000526020600020905b81548152906001019060200180831161225c57829003601f168201915b5050505050815260200190600101906121e2565b50505050905090565b6003546001600160a01b03166122aa612995565b6001600160a01b031614806122d957506004546001600160a01b03166122ce612995565b6001600160a01b0316145b6122f55760405162461bcd60e51b815260040161090890613794565b6000805b60055460ff82161015612380578760405160200161231791906134c1565b6040516020818303038152906040528051906020012060058260ff168154811061233d57fe5b9060005260206000200160405160200161235791906134d4565b60405160208183030381529060405280519060200120141561237857600191505b6001016122f9565b50806123cb576005805460018101825560009190915287516123c9917f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db0019060208a0190612aed565b505b856006886040516123dc91906132b9565b908152602001604051809103902081905550846007886040516123ff91906132b9565b9081526020016040518091039020819055508360088860405161242291906132b9565b908152604051908190036020019020558261243d574361243f565b825b60098860405161244f91906132b9565b90815260200160405180910390208190555081600f8860405161247291906132b9565b908152604051908190036020019020805460ff9290921660ff1990921691909117905550505050505050565b6003546001600160a01b03166124b2612995565b6001600160a01b031614806124e157506004546001600160a01b03166124d6612995565b6001600160a01b0316145b6124fd5760405162461bcd60e51b815260040161090890613794565b6000858152600a6020908152604080832080546001600160a01b0319166001600160a01b038c1617905560109091529020805460ff191660ff8516179055811561258d576000858152600b6020908152604080832080546001600160801b0319166001600160801b038b169081179091556001600160a01b038b168452600d835281842090845290915290208590555b80156125f0576001600160a01b038088166000818152601560209081526040808320948d168084529482528083206001600160801b038c168085529083528184208b90559383526016825280832094835293815283822092825291909152208490555b5050505050505050565b601660209081526000938452604080852082529284528284209052825290205481565b600b602052600090815260409020546001600160801b031681565b6003546001600160a01b031681565b6003546001600160a01b031661265b612995565b6001600160a01b0316148061268a57506004546001600160a01b031661267f612995565b6001600160a01b0316145b6126a65760405162461bcd60e51b815260040161090890613794565b600080546001600160a01b038781168352601560209081526040808520929093168085529181528284206001600160801b03871685529052912054851480156128e9576000868152600b6020908152604080832080546001600160801b03191690556001600160a01b038a168352600d82528083206001600160801b03881684528252808320839055888352601090915290205460ff1615612767576000868152601060205260409020805460ff19811660ff918216600019019091161790555b60008681526010602052604090205460ff166128a1576000868152600a6020526040812080546001600160a01b03191690555b6001600160a01b03881660009081526012602052604090205460ff8216101561282a576001600160a01b0388166000908152601260205260409020805488919060ff84169081106127e757fe5b90600052602060002001541415612822576001600160a01b038816600090815260126020526040902061281d9060ff83166129e8565b61282a565b60010161279a565b506001805460408051602081018252600081529051637921219560e11b81526001600160a01b039092169263f242432a9261286e9230928d928d9290600401613359565b600060405180830381600087803b15801561288857600080fd5b505af115801561289c573d6000803e3d6000fd5b505050505b866001600160a01b03167f71d135e12a0a354469f06fae55d676e28a84fec8b3a2e61f0a5a0f3208e3b6ac878643866040516128e0949392919061381f565b60405180910390a25b506001600160a01b039586166000818152601560209081526040808320949099168083529381528882206001600160801b03909616808352958152888220969096559081526016855286812091815290845285812092815291909252929092209190915550565b63f23a6e6160e01b95945050505050565b60106020526000908152604090205460ff1681565b6000546001600160a01b031681565b600254600160a01b900460ff1681565b3390565b6001600160e01b031980821614156129c35760405162461bcd60e51b8152600401610908906135a6565b6001600160e01b0319166000908152600e60205260409020805460ff19166001179055565b81546000906129f8906001612a84565b90506000838281548110612a0857fe5b9060005260206000200154905081831415612a425783805480612a2757fe5b60019003818190600052602060002001600090559055612a7e565b80848481548110612a4f57fe5b906000526020600020018190555083805480612a6757fe5b600190038181906000526020600020016000905590555b50505050565b600082821115612aa65760405162461bcd60e51b8152600401610908906136c3565b50900390565b600082612abb57506000610bf7565b82820282848281612ac857fe5b0414612ae65760405162461bcd60e51b815260040161090890613742565b9392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10612b2e57805160ff1916838001178555612b5b565b82800160010185558215612b5b579182015b82811115612b5b578251825591602001919060010190612b40565b50612b67929150612b6b565b5090565b5b80821115612b675760008155600101612b6c565b80356001600160a01b0381168114610bf757600080fd5b600082601f830112612ba7578081fd5b813567ffffffffffffffff811115612bbd578182fd5b6020808202612bcd82820161385a565b83815293508184018583018287018401881015612be957600080fd5b600092505b84831015612c0c578035825260019290920191908301908301612bee565b505050505092915050565b600082601f830112612c27578081fd5b813567ffffffffffffffff811115612c3d578182fd5b612c50601f8201601f191660200161385a565b9150808252836020828501011115612c6757600080fd5b8060208401602084013760009082016020015292915050565b80356001600160801b0381168114610bf757600080fd5b600060208284031215612ca8578081fd5b612ae68383612b80565b600080600080600060a08688031215612cc9578081fd5b612cd38787612b80565b9450612ce28760208801612b80565b9350612cf18760408801612b80565b9250612d008760608801612b80565b9150612d0f8760808801612b80565b90509295509295909350565b600080600080600060a08688031215612d32578081fd5b8535612d3d816138b9565b94506020860135612d4d816138b9565b9350604086013567ffffffffffffffff80821115612d69578283fd5b612d7589838a01612b97565b94506060880135915080821115612d8a578283fd5b612d9689838a01612b97565b93506080880135915080821115612dab578283fd5b50612db888828901612c17565b9150509295509295909350565b600080600060608486031215612dd9578283fd5b8335612de4816138b9565b92506020840135612df4816138b9565b91506040840135612e04816138df565b809150509250925092565b600080600080600080600080610100898b031215612e2b578283fd5b8835612e36816138b9565b97506020890135612e46816138b9565b96506040890135612e56816138df565b9550606089013594506080890135935060a089013560ff81168114612e79578384fd5b925060c0890135612e89816138d1565b915060e0890135612e99816138d1565b809150509295985092959890939650565b600080600080600060a08688031215612ec1578081fd5b612ecb8787612b80565b9450612eda8760208801612b80565b93506040860135925060608601359150608086013567ffffffffffffffff811115612f03578182fd5b612db888828901612c17565b60008060408385031215612f21578182fd5b612f2b8484612b80565b9150612f3a8460208501612c80565b90509250929050565b600080600060608486031215612f57578081fd5b8335612f62816138b9565b92506020840135612f72816138df565b91506040840135612e04816138b9565b60008060008060808587031215612f97578182fd5b612fa18686612b80565b9350612fb08660208701612c80565b9250612fbf8660408701612b80565b9396929550929360600135925050565b600080600060608486031215612fe3578081fd5b8335612fee816138b9565b92506020840135612ffe816138df565b929592945050506040919091013590565b60008060008060808587031215613024578182fd5b61302e8686612b80565b935061303d8660208701612c80565b93969395505050506040820135916060013590565b60008060408385031215613064578182fd5b61306e8484612b80565b946020939093013593505050565b600080600080600060a08688031215613093578283fd5b853561309e816138b9565b9450602086013593506040860135925060608601356130bc816138df565b949793965091946080013592915050565b6000602082840312156130de578081fd5b8151612ae6816138d1565b6000602082840312156130fa578081fd5b81356001600160e01b031981168114612ae6578182fd5b600060208284031215613122578081fd5b813567ffffffffffffffff811115613138578182fd5b610a1084828501612c17565b60008060008060008060c0878903121561315c578384fd5b863567ffffffffffffffff811115613172578485fd5b61317e89828a01612c17565b9650506020870135945060408701359350606087013592506080870135915060a087013560ff811681146131b0578182fd5b809150509295509295509295565b6000602082840312156131cf578081fd5b612ae68383612c80565b6000602082840312156131ea578081fd5b5035919050565b600060208284031215613202578081fd5b5051919050565b60008060006060848603121561321d578081fd5b8335925061322e8560208601612c80565b915061323d8560408601612b80565b90509250925092565b6000806000806080858703121561325b578182fd5b8435935061326c8660208701612c80565b9250604085013591506132828660608701612b80565b905092959194509250565b600081518084526132a581602086016020860161388d565b601f01601f19169290920160200192915050565b600082516132cb81846020870161388d565b9190910192915050565b60008083546001808216600081146132f4576001811461330b5761333a565b60ff198316865260028304607f168601935061333a565b600283048786526020808720875b838110156133325781548a820152908501908201613319565b505050860193505b509195945050505050565b6001600160a01b0391909116815260200190565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090611c659083018461328d565b6001600160a01b039290921682526001600160801b0316602082015260400190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039490941684526001600160801b039290921660208401526040830152606082015260800190565b6000602080830181845280855180835260408601915060408482028701019250838701855b8281101561345057603f1988860301845261343e85835161328d565b94509285019290850190600101613422565b5092979650505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561349557835183529284019291840191600101613479565b50909695505050505050565b901515815260200190565b6001600160e01b031991909116815260200190565b600060208252612ae6602083018461328d565b600060208083018184528285546001808216600081146134fb576001811461351957613551565b60028304607f16855260ff1983166040890152606088019350613551565b600283048086526135298a613881565b885b828110156135475781548b82016040015290840190880161352b565b8a01604001955050505b5091979650505050505050565b6020808252600a90820152691bdd995c881b1a5b5a5d60b21b604082015260600190565b6020808252600a908201526977726f6e67206e6f646560b01b604082015260600190565b6020808252601c908201527f4552433136353a20696e76616c696420696e7465726661636520696400000000604082015260600190565b6020808252601190820152701b9bd91948191bd95cdb9d08195e1a5cdd607a1b604082015260600190565b6020808252600a90820152690dcdee840cadcdeeaced60b31b604082015260600190565b602080825260099082015268696e697420646f6e6560b81b604082015260600190565b60208082526006908201526542524f4e5a4560d01b604082015260600190565b6020808252600c908201526b6e6f7420656c696769626c6560a01b604082015260600190565b6020808252601490820152731cd95c9d9a58d948191bd95cdb9d08195e1a5cdd60621b604082015260600190565b6020808252601e908201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604082015260600190565b6020808252600a90820152693737ba1039ba30b5b2b960b11b604082015260600190565b6020808252600a90820152691b9bdd081cdd185ad95960b21b604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b602080825260009082015260400190565b6020808252600990820152683737ba1030b236b4b760b91b604082015260600190565b6020808252600e908201526d185b1c9958591e481cdd185ad95960921b604082015260600190565b6001600160801b0391909116815260200190565b6001600160801b0393909316835260208301919091521515604082015260600190565b90815260200190565b9384526001600160801b0392909216602084015260408301526001600160a01b0316606082015260800190565b60ff91909116815260200190565b60405181810167ffffffffffffffff8111828210171561387957600080fd5b604052919050565b60009081526020902090565b60005b838110156138a8578181015183820152602001613890565b83811115612a7e5750506000910152565b6001600160a01b03811681146138ce57600080fd5b50565b80151581146138ce57600080fd5b6001600160801b03811681146138ce57600080fdfea26469706673582212205664422864c57c13cee24cca7dfb3226fdeeaf3ee3bdc157cc00ec55ed58781e64736f6c634300060c0033

Deployed Bytecode

0x6080604052600436106102885760003560e01c80639171ce711161015a578063c2c9b3c1116100c1578063da998dca1161007a578063da998dca146107e7578063ea6df596146107fc578063f23a6e611461081c578063f304e01d1461083c578063fc7ea8d11461085c578063fed0a20e1461087157610288565b8063c2c9b3c114610718578063c712d34a14610738578063cb4dd51e1461075a578063ccff148f1461077a578063d4a8c0821461079a578063d60444ff146107ba57610288565b8063ac3a760111610113578063ac3a760114610656578063ad553eef14610676578063b07d9cbb14610696578063b64ac8e4146106b6578063bc197c81146106d6578063c153dc0b1461070357610288565b80639171ce71146105965780639954a804146105b65780639f4808da146105d6578063a68b62e5146105f6578063a8306cf214610616578063a8936d591461063657610288565b8063359ef75b116101fe578063674edb72116101b7578063674edb72146104c957806368b087e8146104e957806372ab973f146105165780637760c6c71461053657806378592e7414610556578063916db6eb1461057657610288565b8063359ef75b1461041457806339e3aea214610434578063559b12fe146104475780635ab9daf0146104745780635ed44191146104945780636441d379146104b457610288565b80631f8e027b116102505780631f8e027b1461035f578063279958a91461037f57806329575f6a1461039f5780633183685b146103c157806331e410a8146103e1578063328f7233146103f457610288565b806301ffc9a71461028d578063048cde02146102c357806304dc6ada146102e55780631134aafe1461031257806313f9348414610332575b600080fd5b34801561029957600080fd5b506102ad6102a83660046130e9565b610886565b6040516102ba91906134a1565b60405180910390f35b3480156102cf57600080fd5b506102e36102de366004612f82565b6108a9565b005b3480156102f157600080fd5b50610305610300366004613111565b610950565b6040516102ba9190613816565b34801561031e57600080fd5b506102ad61032d366004613209565b61096d565b34801561033e57600080fd5b5061035261034d3660046131d9565b610a18565b6040516102ba91906134c1565b34801561036b57600080fd5b506102ad61037a3660046131d9565b610b76565b34801561038b57600080fd5b506102e361039a366004612c97565b610bfd565b3480156103ab57600080fd5b506103b4610c59565b6040516102ba9190613345565b3480156103cd57600080fd5b506103056103dc3660046131d9565b610c68565b6102e36103ef366004613209565b610c7a565b34801561040057600080fd5b506102ad61040f3660046131d9565b6112b9565b34801561042057600080fd5b506102e361042f366004612cb2565b6112f1565b6102e3610442366004613246565b6113a9565b34801561045357600080fd5b50610467610462366004612c97565b611824565b6040516102ba919061345d565b34801561048057600080fd5b5061035261048f3660046131d9565b611890565b3480156104a057600080fd5b506103056104af366004613052565b611936565b3480156104c057600080fd5b506103b4611964565b3480156104d557600080fd5b506103056104e4366004613111565b611973565b3480156104f557600080fd5b50610509610504366004613111565b611990565b6040516102ba919061384c565b34801561052257600080fd5b506103056105313660046131be565b6119b0565b34801561054257600080fd5b506102e3610551366004612c97565b6119c2565b34801561056257600080fd5b506103056105713660046131d9565b611a20565b34801561058257600080fd5b50610305610591366004612f0f565b611a6b565b3480156105a257600080fd5b506102e36105b1366004612fcf565b611a88565b3480156105c257600080fd5b506103056105d1366004612f0f565b611b17565b3480156105e257600080fd5b506103b46105f13660046131d9565b611b34565b34801561060257600080fd5b50610305610611366004612f43565b611b4f565b34801561062257600080fd5b506102ad610631366004612c97565b611c70565b34801561064257600080fd5b50610305610651366004613111565b611c84565b34801561066257600080fd5b50610305610671366004612dc5565b611ca1565b34801561068257600080fd5b506102e3610691366004612c97565b611cc4565b3480156106a257600080fd5b506103056106b136600461300f565b611d20565b3480156106c257600080fd5b506102e36106d1366004612c97565b612126565b3480156106e257600080fd5b506106f66106f1366004612d1b565b612181565b6040516102ba91906134ac565b34801561070f57600080fd5b506103b4612192565b34801561072457600080fd5b50610305610733366004613111565b6121a1565b34801561074457600080fd5b5061074d6121be565b6040516102ba91906133fd565b34801561076657600080fd5b506102e3610775366004613144565b612296565b34801561078657600080fd5b506102e3610795366004612e0f565b61249e565b3480156107a657600080fd5b506103056107b5366004612dc5565b6125fa565b3480156107c657600080fd5b506107da6107d53660046131d9565b61261d565b6040516102ba91906137df565b3480156107f357600080fd5b506103b4612638565b34801561080857600080fd5b506102e361081736600461307c565b612647565b34801561082857600080fd5b506106f6610837366004612eaa565b612950565b34801561084857600080fd5b506105096108573660046131d9565b612961565b34801561086857600080fd5b506103b4612976565b34801561087d57600080fd5b506102ad612985565b6001600160e01b031981166000908152600e602052604090205460ff165b919050565b6003546001600160a01b03166108bd612995565b6001600160a01b031614806108ec57506004546001600160a01b03166108e1612995565b6001600160a01b0316145b6109115760405162461bcd60e51b815260040161090890613794565b60405180910390fd5b6001600160a01b0393841660009081526016602090815260408083209490961682529283528481206001600160801b0390941681529290915291902055565b805160208183018101805160078252928201919093012091525481565b600061097882611c70565b80156109be575083600d600061098c612995565b6001600160a01b03168152602080820192909252604090810160009081206001600160801b0388168252909252902054145b80610a10575083601560006109d1612995565b6001600160a01b0390811682526020808301939093526040918201600090812091871681529083528181206001600160801b0388168252909252902054145b949350505050565b606060005b60055460ff82161015610b6057600660058260ff1681548110610a3c57fe5b90600052602060002001604051610a5391906132d5565b9081526020016040518091039020548310158015610aa85750600760058260ff1681548110610a7e57fe5b90600052602060002001604051610a9591906132d5565b9081526020016040518091039020548311155b15610b585760058160ff1681548110610abd57fe5b600091825260209182902001805460408051601f6002600019610100600187161502019094169390930492830185900485028101850190915281815292830182828015610b4b5780601f10610b2057610100808354040283529160200191610b4b565b820191906000526020600020905b815481529060010190602001808311610b2e57829003601f168201915b50505050509150506108a4565b600101610a1d565b5050604080516020810190915260008152919050565b60025460405163328f723360e01b81526000916001600160a01b03169063328f723390610ba7908590600401613816565b60206040518083038186803b158015610bbf57600080fd5b505afa158015610bd3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bf791906130cd565b92915050565b6004546001600160a01b0316610c11612995565b6001600160a01b031614610c375760405162461bcd60e51b815260040161090890613794565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6004546001600160a01b031681565b600c6020526000908152604090205481565b6060610c8584610a18565b9050604051602001610c9690613783565b6040516020818303038152906040528051906020012081604051602001610cbd91906134c1565b604051602081830303815290604052805190602001201415610cf15760405162461bcd60e51b81526004016109089061366f565b6001546001600160a01b031662fdd58e610d09612995565b866040518363ffffffff1660e01b8152600401610d279291906133b5565b60206040518083038186803b158015610d3f57600080fd5b505afa158015610d53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d7791906131f1565b151580610e2e5750600154604051627eeac760e11b81526001600160a01b039091169062fdd58e90610daf90309088906004016133b5565b60206040518083038186803b158015610dc757600080fd5b505afa158015610ddb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dff91906131f1565b15801590610e2e5750610e10612995565b6000858152600a60205260409020546001600160a01b039081169116145b610e4a5760405162461bcd60e51b815260040161090890613608565b600f81604051610e5a91906132b9565b9081526040805160209281900383019020546000878152601090935291205460ff918216911610610e9d5760405162461bcd60e51b81526004016109089061355e565b6001600160a01b03821660009081526014602052604090205460ff16610ed55760405162461bcd60e51b815260040161090890613695565b816001600160a01b03166326665562610eec612995565b856040518363ffffffff1660e01b8152600401610f0a929190613393565b60206040518083038186803b158015610f2257600080fd5b505afa158015610f36573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f5a91906130cd565b610f765760405162461bcd60e51b8152600401610908906135dd565b610f88610f81612995565b8484611b4f565b15610fa55760405162461bcd60e51b8152600401610908906137b7565b8360156000610fb2612995565b6001600160a01b0390811682526020808301939093526040918201600090812091871681529083528181206001600160801b0388168252909252902055610ff7612995565b6000858152600a6020526040812080546001600160a01b0319166001600160a01b0393909316929092179091554390601690611031612995565b6001600160a01b0390811682526020808301939093526040918201600090812091871681529083528181206001600160801b038816825283528181209390935586835260109091528120805460ff8082166001011660ff19909116179055805b6012600061109d612995565b6001600160a01b0316815260208101919091526040016000205460ff8216101561111e5785601260006110ce612995565b6001600160a01b03166001600160a01b031681526020019081526020016000208260ff16815481106110fc57fe5b90600052602060002001541415611116576001915061111e565b600101611091565b508061115f5760126000611130612995565b6001600160a01b0316815260208082019290925260400160009081208054600181018255908252919020018590555b600154604051627eeac760e11b81526001600160a01b039091169062fdd58e9061118f90309089906004016133b5565b60206040518083038186803b1580156111a757600080fd5b505afa1580156111bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111df91906131f1565b611264576001546001600160a01b031663f242432a6111fc612995565b604080516020810182526000815290516001600160e01b031960e085901b168152611231929130918b91600191600401613359565b600060405180830381600087803b15801561124b57600080fd5b505af115801561125f573d6000803e3d6000fd5b505050505b61126c612995565b6001600160a01b03167f2091db4757417ee6930004b3e4755720fdcb20ee7613e053f8effd4d173d3749868643876040516112aa949392919061381f565b60405180910390a25050505050565b6000818152600b60205260408120546001600160801b0316151580610bf757505060009081526010602052604090205460ff16151590565b600254600160a01b900460ff161561131b5760405162461bcd60e51b81526004016109089061362c565b61132b6301ffc9a760e01b612999565b61133b630271189760e51b612999565b600380546001600160a01b03199081166001600160a01b039485161790915560048054821692841692909217909155600080548216958316959095179094556001805485169382169390931790925560028054600160a01b9416919092161760ff60a01b1916919091179055565b6113b484848361096d565b6113d05760405162461bcd60e51b815260040161090890613582565b6000848152600a60205260409020546001600160a01b03166114045760405162461bcd60e51b81526004016109089061371e565b61140c612995565b6000858152600a60205260409020546001600160a01b039081169116146114455760405162461bcd60e51b8152600401610908906136fa565b6001600160a01b03811660009081526014602052604090205460ff1661147d5760405162461bcd60e51b815260040161090890613695565b806001600160a01b0316636c52ec10611494612995565b856040518363ffffffff1660e01b81526004016114b2929190613393565b60206040518083038186803b1580156114ca57600080fd5b505afa1580156114de573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061150291906130cd565b61156c57604051630e6507e960e21b81526001600160a01b038216906339941fa490349061153990879087906000906004016137f3565b6000604051808303818588803b15801561155257600080fd5b505af1158015611566573d6000803e3d6000fd5b50505050505b60006015600061157a612995565b6001600160a01b0390811682526020808301939093526040918201600090812091861681529083528181206001600160801b0388168252835281812093909355868352600b909152902080546001600160801b03191690556115db81611c70565b1561161f576000600d60006115ee612995565b6001600160a01b03168152602080820192909252604090810160009081206001600160801b03881682529092529020555b60008481526010602052604090205460ff161561165b576000848152601060205260409020805460ff19811660ff918216600019019091161790555b60008481526010602052604090205460ff166117d0576000848152600a6020526040812080546001600160a01b03191690555b6012600061169a612995565b6001600160a01b0316815260208101919091526040016000205460ff8216101561174f5784601260006116cb612995565b6001600160a01b03166001600160a01b031681526020019081526020016000208260ff16815481106116f957fe5b906000526020600020015414156117475761174260126000611719612995565b6001600160a01b03166001600160a01b031681526020019081526020016000208260ff166129e8565b61174f565b60010161168e565b506001546001600160a01b031663f242432a3061176a612995565b876001604051806020016040528060008152506040518663ffffffff1660e01b815260040161179d959493929190613359565b600060405180830381600087803b1580156117b757600080fd5b505af11580156117cb573d6000803e3d6000fd5b505050505b6117d8612995565b6001600160a01b03167f71d135e12a0a354469f06fae55d676e28a84fec8b3a2e61f0a5a0f3208e3b6ac85858585604051611816949392919061381f565b60405180910390a250505050565b6001600160a01b03811660009081526012602090815260409182902080548351818402810184019094528084526060939283018282801561188457602002820191906000526020600020905b815481526020019060010190808311611870575b50505050509050919050565b6005818154811061189d57fe5b600091825260209182902001805460408051601f600260001961010060018716150201909416939093049283018590048502810185019091528181529350909183018282801561192e5780601f106119035761010080835404028352916020019161192e565b820191906000526020600020905b81548152906001019060200180831161191157829003601f168201915b505050505081565b6012602052816000526040600020818154811061194f57fe5b90600052602060002001600091509150505481565b6001546001600160a01b031681565b805160208183018101805160088252928201919093012091525481565b8051602081830181018051600f8252928201919093012091525460ff1681565b60116020526000908152604090205481565b6004546001600160a01b03166119d6612995565b6001600160a01b0316146119fc5760405162461bcd60e51b815260040161090890613794565b6001600160a01b03166000908152601460205260409020805460ff19166001179055565b60008181526010602052604081205460ff16600f611a3d84610a18565b604051611a4a91906132b9565b9081526040519081900360200190205460ff90811691909103169050919050565b601360209081526000928352604080842090915290825290205481565b6003546001600160a01b0316611a9c612995565b6001600160a01b03161480611acb57506004546001600160a01b0316611ac0612995565b6001600160a01b0316145b611ae75760405162461bcd60e51b815260040161090890613794565b6001600160a01b0390921660009081526013602090815260408083206001600160801b0390941683529290522055565b600d60209081526000928352604080842090915290825290205481565b600a602052600090815260409020546001600160a01b031681565b600080611b5b83611c70565b611b66576000611b94565b6001600160a01b0385166000908152600d602090815260408083206001600160801b03881684529091529020545b6001600160a01b038087166000908152601560209081526040808320888516845282528083206001600160801b038a168452909152808220546002549151630d06322560e21b81529495509391921690633418c89490611bfa908a908a90600401613393565b60206040518083038186803b158015611c1257600080fd5b505afa158015611c26573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c4a91906131f1565b905081611c635782611c5c5780611c5e565b825b611c65565b815b979650505050505050565b6000546001600160a01b0390811691161490565b805160208183018101805160068252928201919093012091525481565b601560209081526000938452604080852082529284528284209052825290205481565b6004546001600160a01b0316611cd8612995565b6001600160a01b031614611cfe5760405162461bcd60e51b815260040161090890613794565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b600080611d2b612995565b6001600160a01b03811660009081526014602052604090205490915060ff16611d665760405162461bcd60e51b815260040161090890613695565b6000611d73878784611b4f565b90506060611d8082610a18565b9050604051602001611d9190613783565b6040516020818303038152906040528051906020012081604051602001611db891906134c1565b604051602081830303815290604052805190602001201415611de05760009350505050610a10565b6001600160a01b03808916600090815260166020908152604080832093871683529281528282206001600160801b038b168352905290812054611e95576001600160a01b03891660009081526013602090815260408083206001600160801b038c168452909152902054611e62576000838152600c6020526040902054611e90565b6001600160a01b03891660009081526013602090815260408083206001600160801b038c1684529091529020545b611ecd565b6001600160a01b03808a16600090815260166020908152604080832093881683529281528282206001600160801b038c168352905220545b90506000600983604051611ee191906132b9565b90815260200160405180910390205490506000888311611f015788611f03565b825b905081811015611f105750805b82158015611f675750604051602001611f289061364f565b6040516020818303038152906040528051906020012084604051602001611f4f91906134c1565b60405160208183030381529060405280519060200120145b15611fff5760025460405163b07d9cbb60e01b81526001600160a01b039091169063b07d9cbb90611fa2908e908e9086908e906004016133ce565b60206040518083038186803b158015611fba57600080fd5b505afa158015611fce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ff291906131f1565b9650505050505050610a10565b846120135760009650505050505050610a10565b826120275760009650505050505050610a10565b8161203b5760009650505050505050610a10565b8781106120515760009650505050505050610a10565b600154604051627eeac760e11b81526001600160a01b039091169062fdd58e9061208190309089906004016133b5565b60206040518083038186803b15801561209957600080fd5b505afa1580156120ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120d191906131f1565b6120e45760009650505050505050610a10565b6121176008856040516120f791906132b9565b908152604051908190036020019020546121118a84612a84565b90612aac565b9b9a5050505050505050505050565b6004546001600160a01b031661213a612995565b6001600160a01b0316146121605760405162461bcd60e51b815260040161090890613794565b6001600160a01b03166000908152601460205260409020805460ff19169055565b63bc197c8160e01b95945050505050565b6002546001600160a01b031681565b805160208183018101805160098252928201919093012091525481565b60606005805480602002602001604051908101604052809291908181526020016000905b8282101561228d5760008481526020908190208301805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156122795780601f1061224e57610100808354040283529160200191612279565b820191906000526020600020905b81548152906001019060200180831161225c57829003601f168201915b5050505050815260200190600101906121e2565b50505050905090565b6003546001600160a01b03166122aa612995565b6001600160a01b031614806122d957506004546001600160a01b03166122ce612995565b6001600160a01b0316145b6122f55760405162461bcd60e51b815260040161090890613794565b6000805b60055460ff82161015612380578760405160200161231791906134c1565b6040516020818303038152906040528051906020012060058260ff168154811061233d57fe5b9060005260206000200160405160200161235791906134d4565b60405160208183030381529060405280519060200120141561237857600191505b6001016122f9565b50806123cb576005805460018101825560009190915287516123c9917f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db0019060208a0190612aed565b505b856006886040516123dc91906132b9565b908152602001604051809103902081905550846007886040516123ff91906132b9565b9081526020016040518091039020819055508360088860405161242291906132b9565b908152604051908190036020019020558261243d574361243f565b825b60098860405161244f91906132b9565b90815260200160405180910390208190555081600f8860405161247291906132b9565b908152604051908190036020019020805460ff9290921660ff1990921691909117905550505050505050565b6003546001600160a01b03166124b2612995565b6001600160a01b031614806124e157506004546001600160a01b03166124d6612995565b6001600160a01b0316145b6124fd5760405162461bcd60e51b815260040161090890613794565b6000858152600a6020908152604080832080546001600160a01b0319166001600160a01b038c1617905560109091529020805460ff191660ff8516179055811561258d576000858152600b6020908152604080832080546001600160801b0319166001600160801b038b169081179091556001600160a01b038b168452600d835281842090845290915290208590555b80156125f0576001600160a01b038088166000818152601560209081526040808320948d168084529482528083206001600160801b038c168085529083528184208b90559383526016825280832094835293815283822092825291909152208490555b5050505050505050565b601660209081526000938452604080852082529284528284209052825290205481565b600b602052600090815260409020546001600160801b031681565b6003546001600160a01b031681565b6003546001600160a01b031661265b612995565b6001600160a01b0316148061268a57506004546001600160a01b031661267f612995565b6001600160a01b0316145b6126a65760405162461bcd60e51b815260040161090890613794565b600080546001600160a01b038781168352601560209081526040808520929093168085529181528284206001600160801b03871685529052912054851480156128e9576000868152600b6020908152604080832080546001600160801b03191690556001600160a01b038a168352600d82528083206001600160801b03881684528252808320839055888352601090915290205460ff1615612767576000868152601060205260409020805460ff19811660ff918216600019019091161790555b60008681526010602052604090205460ff166128a1576000868152600a6020526040812080546001600160a01b03191690555b6001600160a01b03881660009081526012602052604090205460ff8216101561282a576001600160a01b0388166000908152601260205260409020805488919060ff84169081106127e757fe5b90600052602060002001541415612822576001600160a01b038816600090815260126020526040902061281d9060ff83166129e8565b61282a565b60010161279a565b506001805460408051602081018252600081529051637921219560e11b81526001600160a01b039092169263f242432a9261286e9230928d928d9290600401613359565b600060405180830381600087803b15801561288857600080fd5b505af115801561289c573d6000803e3d6000fd5b505050505b866001600160a01b03167f71d135e12a0a354469f06fae55d676e28a84fec8b3a2e61f0a5a0f3208e3b6ac878643866040516128e0949392919061381f565b60405180910390a25b506001600160a01b039586166000818152601560209081526040808320949099168083529381528882206001600160801b03909616808352958152888220969096559081526016855286812091815290845285812092815291909252929092209190915550565b63f23a6e6160e01b95945050505050565b60106020526000908152604090205460ff1681565b6000546001600160a01b031681565b600254600160a01b900460ff1681565b3390565b6001600160e01b031980821614156129c35760405162461bcd60e51b8152600401610908906135a6565b6001600160e01b0319166000908152600e60205260409020805460ff19166001179055565b81546000906129f8906001612a84565b90506000838281548110612a0857fe5b9060005260206000200154905081831415612a425783805480612a2757fe5b60019003818190600052602060002001600090559055612a7e565b80848481548110612a4f57fe5b906000526020600020018190555083805480612a6757fe5b600190038181906000526020600020016000905590555b50505050565b600082821115612aa65760405162461bcd60e51b8152600401610908906136c3565b50900390565b600082612abb57506000610bf7565b82820282848281612ac857fe5b0414612ae65760405162461bcd60e51b815260040161090890613742565b9392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10612b2e57805160ff1916838001178555612b5b565b82800160010185558215612b5b579182015b82811115612b5b578251825591602001919060010190612b40565b50612b67929150612b6b565b5090565b5b80821115612b675760008155600101612b6c565b80356001600160a01b0381168114610bf757600080fd5b600082601f830112612ba7578081fd5b813567ffffffffffffffff811115612bbd578182fd5b6020808202612bcd82820161385a565b83815293508184018583018287018401881015612be957600080fd5b600092505b84831015612c0c578035825260019290920191908301908301612bee565b505050505092915050565b600082601f830112612c27578081fd5b813567ffffffffffffffff811115612c3d578182fd5b612c50601f8201601f191660200161385a565b9150808252836020828501011115612c6757600080fd5b8060208401602084013760009082016020015292915050565b80356001600160801b0381168114610bf757600080fd5b600060208284031215612ca8578081fd5b612ae68383612b80565b600080600080600060a08688031215612cc9578081fd5b612cd38787612b80565b9450612ce28760208801612b80565b9350612cf18760408801612b80565b9250612d008760608801612b80565b9150612d0f8760808801612b80565b90509295509295909350565b600080600080600060a08688031215612d32578081fd5b8535612d3d816138b9565b94506020860135612d4d816138b9565b9350604086013567ffffffffffffffff80821115612d69578283fd5b612d7589838a01612b97565b94506060880135915080821115612d8a578283fd5b612d9689838a01612b97565b93506080880135915080821115612dab578283fd5b50612db888828901612c17565b9150509295509295909350565b600080600060608486031215612dd9578283fd5b8335612de4816138b9565b92506020840135612df4816138b9565b91506040840135612e04816138df565b809150509250925092565b600080600080600080600080610100898b031215612e2b578283fd5b8835612e36816138b9565b97506020890135612e46816138b9565b96506040890135612e56816138df565b9550606089013594506080890135935060a089013560ff81168114612e79578384fd5b925060c0890135612e89816138d1565b915060e0890135612e99816138d1565b809150509295985092959890939650565b600080600080600060a08688031215612ec1578081fd5b612ecb8787612b80565b9450612eda8760208801612b80565b93506040860135925060608601359150608086013567ffffffffffffffff811115612f03578182fd5b612db888828901612c17565b60008060408385031215612f21578182fd5b612f2b8484612b80565b9150612f3a8460208501612c80565b90509250929050565b600080600060608486031215612f57578081fd5b8335612f62816138b9565b92506020840135612f72816138df565b91506040840135612e04816138b9565b60008060008060808587031215612f97578182fd5b612fa18686612b80565b9350612fb08660208701612c80565b9250612fbf8660408701612b80565b9396929550929360600135925050565b600080600060608486031215612fe3578081fd5b8335612fee816138b9565b92506020840135612ffe816138df565b929592945050506040919091013590565b60008060008060808587031215613024578182fd5b61302e8686612b80565b935061303d8660208701612c80565b93969395505050506040820135916060013590565b60008060408385031215613064578182fd5b61306e8484612b80565b946020939093013593505050565b600080600080600060a08688031215613093578283fd5b853561309e816138b9565b9450602086013593506040860135925060608601356130bc816138df565b949793965091946080013592915050565b6000602082840312156130de578081fd5b8151612ae6816138d1565b6000602082840312156130fa578081fd5b81356001600160e01b031981168114612ae6578182fd5b600060208284031215613122578081fd5b813567ffffffffffffffff811115613138578182fd5b610a1084828501612c17565b60008060008060008060c0878903121561315c578384fd5b863567ffffffffffffffff811115613172578485fd5b61317e89828a01612c17565b9650506020870135945060408701359350606087013592506080870135915060a087013560ff811681146131b0578182fd5b809150509295509295509295565b6000602082840312156131cf578081fd5b612ae68383612c80565b6000602082840312156131ea578081fd5b5035919050565b600060208284031215613202578081fd5b5051919050565b60008060006060848603121561321d578081fd5b8335925061322e8560208601612c80565b915061323d8560408601612b80565b90509250925092565b6000806000806080858703121561325b578182fd5b8435935061326c8660208701612c80565b9250604085013591506132828660608701612b80565b905092959194509250565b600081518084526132a581602086016020860161388d565b601f01601f19169290920160200192915050565b600082516132cb81846020870161388d565b9190910192915050565b60008083546001808216600081146132f4576001811461330b5761333a565b60ff198316865260028304607f168601935061333a565b600283048786526020808720875b838110156133325781548a820152908501908201613319565b505050860193505b509195945050505050565b6001600160a01b0391909116815260200190565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090611c659083018461328d565b6001600160a01b039290921682526001600160801b0316602082015260400190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039490941684526001600160801b039290921660208401526040830152606082015260800190565b6000602080830181845280855180835260408601915060408482028701019250838701855b8281101561345057603f1988860301845261343e85835161328d565b94509285019290850190600101613422565b5092979650505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561349557835183529284019291840191600101613479565b50909695505050505050565b901515815260200190565b6001600160e01b031991909116815260200190565b600060208252612ae6602083018461328d565b600060208083018184528285546001808216600081146134fb576001811461351957613551565b60028304607f16855260ff1983166040890152606088019350613551565b600283048086526135298a613881565b885b828110156135475781548b82016040015290840190880161352b565b8a01604001955050505b5091979650505050505050565b6020808252600a90820152691bdd995c881b1a5b5a5d60b21b604082015260600190565b6020808252600a908201526977726f6e67206e6f646560b01b604082015260600190565b6020808252601c908201527f4552433136353a20696e76616c696420696e7465726661636520696400000000604082015260600190565b6020808252601190820152701b9bd91948191bd95cdb9d08195e1a5cdd607a1b604082015260600190565b6020808252600a90820152690dcdee840cadcdeeaced60b31b604082015260600190565b602080825260099082015268696e697420646f6e6560b81b604082015260600190565b60208082526006908201526542524f4e5a4560d01b604082015260600190565b6020808252600c908201526b6e6f7420656c696769626c6560a01b604082015260600190565b6020808252601490820152731cd95c9d9a58d948191bd95cdb9d08195e1a5cdd60621b604082015260600190565b6020808252601e908201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604082015260600190565b6020808252600a90820152693737ba1039ba30b5b2b960b11b604082015260600190565b6020808252600a90820152691b9bdd081cdd185ad95960b21b604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b602080825260009082015260400190565b6020808252600990820152683737ba1030b236b4b760b91b604082015260600190565b6020808252600e908201526d185b1c9958591e481cdd185ad95960921b604082015260600190565b6001600160801b0391909116815260200190565b6001600160801b0393909316835260208301919091521515604082015260600190565b90815260200190565b9384526001600160801b0392909216602084015260408301526001600160a01b0316606082015260800190565b60ff91909116815260200190565b60405181810167ffffffffffffffff8111828210171561387957600080fd5b604052919050565b60009081526020902090565b60005b838110156138a8578181015183820152602001613890565b83811115612a7e5750506000910152565b6001600160a01b03811681146138ce57600080fd5b50565b80151581146138ce57600080fd5b6001600160801b03811681146138ce57600080fdfea26469706673582212205664422864c57c13cee24cca7dfb3226fdeeaf3ee3bdc157cc00ec55ed58781e64736f6c634300060c0033

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.