Contract 0x3b9dd6ea99d0c88931d5dbbf36a0fae82b58b210

Txn Hash Method
Block
From
To
Value [Txn Fee]
0xdd9bcc07c128666d84015bfe655ac094e77e250814081412fb2f24dbab1f004bCreate Node With...165961702022-06-27 18:51:026 hrs 9 mins ago0x8140d952222784e265c0202d106b4b339e143e28 IN  0x3b9dd6ea99d0c88931d5dbbf36a0fae82b58b2100 AVAX0.06664262 27.5
0xe6de8bd33c20a2f6afac372953f06ec2fcedbb754be7efb8a13d9481ecea049dCreate Node With...165941102022-06-27 17:42:547 hrs 17 mins ago0xc434d40c6f4470b2424c674bbc7764905de67b9c IN  0x3b9dd6ea99d0c88931d5dbbf36a0fae82b58b2100 AVAX0.06664229 27.5
0x4be71bdf3852840623331c1be1f819932d94fac82c7276194e0d7b374bcaef1dCreate Multiple ...165925502022-06-27 16:50:448 hrs 10 mins ago0x8ec429e19595f996b2c941012ebd4c9b437c5c26 IN  0x3b9dd6ea99d0c88931d5dbbf36a0fae82b58b2100 AVAX0.1085698625 27.5
0xcad73c79119ed84e0d37bb941d1253deccb672ed31fd619ad7ec284e1e7a78d9Set Approval For...165912532022-06-27 16:07:388 hrs 53 mins ago0x159739a84099c3a47b1d55e0e82988a57caf5159 IN  0x3b9dd6ea99d0c88931d5dbbf36a0fae82b58b2100 AVAX0.001203046 26
0xc8e2ee2825781131e4a71fe9e182db33aaa814278620483abccc4bdbe9e12044Set Approval For...165910532022-06-27 16:01:018 hrs 59 mins ago0x5662d70122eb2773a2a76ed88169f405a790b79d IN  0x3b9dd6ea99d0c88931d5dbbf36a0fae82b58b2100 AVAX0.0012724525 27.5
0xee9781b3f25374286c63b793aed54a5ab812e30310041b8138f7812e86ece92bCreate Multiple ...165880132022-06-27 14:19:4210 hrs 41 mins ago0x8918f4df89db324307fbae02e6d1268c5f05d1bc IN  0x3b9dd6ea99d0c88931d5dbbf36a0fae82b58b2100 AVAX0.1070412475 27.5
0xe528d03e6149c16159920e16f34d6c7ec0a795c4bea23b7d8265ddb491b07a87Create Multiple ...165864362022-06-27 13:27:5611 hrs 32 mins ago0xdd251cac7da68ad377decbe00da7603d7cc1a8d1 IN  0x3b9dd6ea99d0c88931d5dbbf36a0fae82b58b2100 AVAX0.1070412475 27.5
0xfecf7c389a16ddc30ecf9919f3b9684dc5a7c88628bf240bca8ea3f79a2ebf26Create Multiple ...165829102022-06-27 11:30:0713 hrs 30 mins ago0x67fec197b5f57a19677b276215432896c98b1bbd IN  0x3b9dd6ea99d0c88931d5dbbf36a0fae82b58b2100 AVAX0.02609646 26
0x7c11aba4cdd2bff449a3a63625fdbe0cf378bac2379da084b64affdb9f63a876Set Approval For...165828492022-06-27 11:28:0313 hrs 32 mins ago0xa9a2187c0662e825fa4ca25a297ec02a1664819f IN  0x3b9dd6ea99d0c88931d5dbbf36a0fae82b58b2100 AVAX0.0012724525 27.5
0x58d8201286d17ba3f465d0d909cb29ef57ceafea66a8f1a166e3cf5b84283f4fCreate Node With...165826662022-06-27 11:22:0013 hrs 38 mins ago0xe54758dce5d960b353ac847874176576294c6ad4 IN  0x3b9dd6ea99d0c88931d5dbbf36a0fae82b58b2100 AVAX0.06400114888 26.41
0x7462237a4a80e84832dd15f77c7881955f331cf6471e6915850316677c7dcb07Create Node With...165534492022-06-26 19:04:541 day 5 hrs ago0x4a9aaf2f24cad09c88979ced40bbf94a7c34b54a IN  0x3b9dd6ea99d0c88931d5dbbf36a0fae82b58b2100 AVAX0.06903182 27.5
0xe8403ecb11d563a963fb5b6b314bec11d26ec2b7b7aae05f8323075051273472Create Multiple ...165510882022-06-26 17:46:011 day 7 hrs ago0x321a2d3c06edb419a7f24415bb44fff596d5bd7b IN  0x3b9dd6ea99d0c88931d5dbbf36a0fae82b58b2100 AVAX0.1070412475 27.5
0x05c1f874ba1b17750dc6c1dbc7ef83608f40602bd6291aac1a1e0ae70c8e821bCreate Node With...165510622022-06-26 17:45:091 day 7 hrs ago0xfce5edd4334a818ee546ec963dadd6b1153d8468 IN  0x3b9dd6ea99d0c88931d5dbbf36a0fae82b58b2100 AVAX0.06664262 27.5
0xf06f9edb6e3c455a6b90c71d4947e8663fc49fba93ad90fbc7ba4ab34e8ae582Create Node With...165510202022-06-26 17:43:451 day 7 hrs ago0xb1211ec52c214ed9265626a72b67433f462341fb IN  0x3b9dd6ea99d0c88931d5dbbf36a0fae82b58b2100 AVAX0.06664262 27.5
0xe24ec2430e7ec0e5756591fc403cecdfcc7bb130f1691a23d8a4cb50f5538bb9Create Node With...165452542022-06-26 14:31:521 day 10 hrs ago0xdd6f896c227d2511f7648896afd6e721e931dd17 IN  0x3b9dd6ea99d0c88931d5dbbf36a0fae82b58b2100 AVAX0.06723992 27.5
0xf75b753408fdd699ae97cd6688d3ae05ca1d8ccbb570ec56e21113f35b4c879dCreate Multiple ...165394322022-06-26 11:16:111 day 13 hrs ago0x248a74e2dedb7b062fefdf5c3ce1f547497cdcf3 IN  0x3b9dd6ea99d0c88931d5dbbf36a0fae82b58b2100 AVAX0.089329955 27.5
0x68bafa8bd1d81cd1502bd0045e76adfc460d80402892f348eb0cf526efb751c6Create Node With...165393042022-06-26 11:11:541 day 13 hrs ago0x6a297b64a043a92024bb75ac845aa327d404e135 IN  0x3b9dd6ea99d0c88931d5dbbf36a0fae82b58b2100 AVAX0.06664229 27.5
0x56a00058978a17a0daa2f38ebf2de881f0dcdd073e05899600a9c4a54332dd00Create Node With...165389542022-06-26 11:00:101 day 14 hrs ago0xba8ee6d744d194bbf45c25f49b3b7d2e3f97e5da IN  0x3b9dd6ea99d0c88931d5dbbf36a0fae82b58b2100 AVAX0.06664262 27.5
0x03e89459e5c8b69493b8fb68e9d7e07e8eb97def40e49fa374825db221d6da8aCreate Node With...165335182022-06-26 7:58:011 day 17 hrs ago0x55d1adeb3d7ebfd0be7f2c0ab9ff4b2d9e17b987 IN  0x3b9dd6ea99d0c88931d5dbbf36a0fae82b58b2100 AVAX0.06664229 27.5
0x613f1a58c986717eb795a6f278585cd06dd913f72fb7b0c9f585fa71a5f7aaf2Migrate Nodes165292702022-06-26 5:36:201 day 19 hrs ago0x2a05d1eb46a3fd51e9bcc5af3da6014f2af3ecca IN  0x3b9dd6ea99d0c88931d5dbbf36a0fae82b58b2100 AVAX0.007814235 27.5
0x1f686a16c2e5884e5428f349f1606258f201d62b967fd6af0f8868c38109983dSet Approval For...165229032022-06-26 2:03:221 day 22 hrs ago0xc4d1680fbcaf38b497f396f4cd4330cc002d6a88 IN  0x3b9dd6ea99d0c88931d5dbbf36a0fae82b58b2100 AVAX0.0012724525 27.5
0x0afbb005a9c4663200522961035d8c74a483ae022112343cfa76c0ea5e56f646Set Approval For...165219372022-06-26 1:31:281 day 23 hrs ago0x32c0e0f16169371027619f78ae9f2343efa0ff1c IN  0x3b9dd6ea99d0c88931d5dbbf36a0fae82b58b2100 AVAX0.0012724525 27.5
0x0dadf9973d8e632193283ffd956a3da2e4f81947916bd1ed7e0f939b4f1c0630Create Node With...165185202022-06-25 23:38:132 days 1 hr ago0xba8ee6d744d194bbf45c25f49b3b7d2e3f97e5da IN  0x3b9dd6ea99d0c88931d5dbbf36a0fae82b58b2100 AVAX0.06664229 27.5
0x97a0edfc7e2ebfa4fb83df0143c4ca5396a5a5977d985945447dd8f9ae2c3c0eSet Approval For...165184522022-06-25 23:35:572 days 1 hr ago0xba8ee6d744d194bbf45c25f49b3b7d2e3f97e5da IN  0x3b9dd6ea99d0c88931d5dbbf36a0fae82b58b2100 AVAX0.0012724525 27.5
0xcaa81c134faf58bb970f0adbabef253c8426571551adaea03cc9e51701796486Set Approval For...165113782022-06-25 19:39:462 days 5 hrs ago0xef71f60df07658708e715671d1df6c019945dad3 IN  0x3b9dd6ea99d0c88931d5dbbf36a0fae82b58b2100 AVAX0.0012724525 27.5
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
InfiniteManager

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity Standard Json-Input format)

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

pragma solidity ^0.8.0;

import "@openzeppelin/contracts/utils/Context.sol";
import "@openzeppelin/contracts/utils/math/SafeMath.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/Address.sol";
import "@openzeppelin/contracts/utils/introspection/IERC165.sol";
import "@openzeppelin/contracts/utils/introspection/ERC165.sol";
import "@openzeppelin/contracts/token/ERC721/IERC721.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol";
import "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";


interface IAscendMembershipManager {
    function getNameOf(uint256 _id) external view returns (string memory);
    function getMintOf(uint256 _id) external view returns (uint64);
    function getMembershipsOf(address _account) external view returns (uint256[] memory);
    function presaleNFT() external view returns (IERC721 );
    function founderL1NFT() external view returns (IERC721 );
    function founderL2NFT() external view returns (IERC721 );
    function founderL3NFT() external view returns (IERC721 );
    function getUserMultiplier(address from) external view returns (uint256);
    function meta_membership() external view returns (IERC721 );
    function platinum_membership() external view returns (IERC721 );
    function balanceOf(address owner) external view returns (uint256);
    function transferFrom(address from, address to, uint256 tokenId) external;
}

interface InfiniteManagerV1 {
   function ownerOf(uint256 tokenId) external view returns (address);
   function transferFrom(address from, address to, uint256 tokenId) external;
   function balanceOf(address owner) external view returns (uint256 balance);
   function getInfinitesOf(address _account) external view returns (uint256[] memory);
   function getMintOf(uint256 _id) external view returns (uint64);
}

interface InfiniteHelperV1 {
   function seeNodeClaim(uint256 _id) external view returns (uint64);
}


interface RewardsCalculator {
  function calculateAllRewards(address from) external view returns (uint);
}
interface AmsHelper {
  function calculator() external view returns (RewardsCalculator);
  function claimRewardsForCompoundInfinite(address sender, uint256 nodePrice ) external returns (uint256);
}


contract InfiniteManager is Ownable, IERC721, IERC721Metadata {

    using Address for address;
    using SafeMath for uint256;
    struct Infinite {
        string name;
        string metadata;
        uint256 id;
        uint64 mint;
        uint64 claim;
    }

    mapping(address => uint256) private _balances;
    mapping(uint256 => address) private _owners;
    mapping(uint256 => Infinite) private _nodes;
    mapping(address => uint256[]) private _bags;
    mapping(uint256 => address) private _tokenApprovals;
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    mapping(address => bool) private _blacklist;

    address public deadAddress = 0x000000000000000000000000000000000000dEaD;

    string public defaultUri = "";
    uint256 public nodeAscendTokenPrice = 500;
    uint256 public nodeAscendMembershipPrice = 40;
    uint256 public nodePlatinumPrice = 1;

    uint256 private nodeCounter = 1;
    uint public maxInfiniteWallet = 1;

    bool public transferIsEnabled = true;

    IERC20 public ASCEND;
    IAscendMembershipManager public amsManager;
    AmsHelper public amsHelper;

    InfiniteManagerV1 public infiniteManagerV1;
    InfiniteHelperV1 public infiniteHelperV1;

    bool enableClaims = true;

      struct RewardsParameters {
          uint64 reward;
          uint64 claimTime;
          uint64 precision;
          uint64 cliffPeriods;
      }

      RewardsParameters public rewardsParameters = RewardsParameters({
         reward: 190000,
         claimTime: 86400,
         precision: 1000,
         cliffPeriods: 1
      });


      struct BoostersParameters {
          uint256 presaleBooster;
          uint256 founderL1Booster;
          uint256 founderL2Booster;
          uint256 founderL3Booster;
          uint256 metaBooster;
      }

      BoostersParameters public boostersParameters = BoostersParameters({
          presaleBooster: 28500, // 15%
          founderL1Booster: 19000, // 10%
          founderL2Booster: 28500, // 15%
          founderL3Booster: 38000, // 20%
          metaBooster: 0
      });

    event CreateInfinite(address from, uint id);
    event RemoveInfinite(address from, uint id);
    event ClaimInfinite(address account, uint rewardNode);
    event CreateInfiniteWithRewards(address sender, uint256 rewardAmount);

    constructor(address _ASCEND_TOKEN, address _ascendMembership, address _amsHelper )  {
        ASCEND = IERC20(_ASCEND_TOKEN);
        amsManager = IAscendMembershipManager(_ascendMembership);
        amsHelper = AmsHelper(_amsHelper);
    }

    modifier onlyIfExists(uint256 _id) {
        require(_exists(_id), "ERC721: operator query for nonexistent token");
        _;
    }

    function setInfiniteManagerV1(address _infiniteManagerV1 ) external onlyOwner {
        infiniteManagerV1 = InfiniteManagerV1(_infiniteManagerV1);
    }

    function setInfiniteHelperV1(address _infiniteHelperV1 ) external onlyOwner {
        infiniteHelperV1 = InfiniteHelperV1(_infiniteHelperV1);
    }

    function updateAmsHelper(address _amsHelper) onlyOwner external {
      amsHelper = AmsHelper(_amsHelper);
    }

    function setBoosters(uint256 _founderL1Booster, uint256 _founderL2Booster,
      uint256 _founderL3Booster, uint256 _presaleBooster,
        uint256 _metaBooster) onlyOwner external {
          boostersParameters.founderL1Booster = _founderL1Booster;
          boostersParameters.founderL2Booster = _founderL2Booster;
          boostersParameters.founderL3Booster = _founderL3Booster;
          boostersParameters.presaleBooster =  _presaleBooster;
          boostersParameters.metaBooster = _metaBooster;
    }

    function enableTransfer(bool _enable) external onlyOwner {
        transferIsEnabled = _enable;
    }

    function totalNodesCreated() view external returns (uint) {
        return nodeCounter - 1;
    }

    function isBlacklisted(address wallet) view external returns (bool) {
        return _blacklist[wallet];
    }

    function updateInfinite(uint256 id, string calldata metadata) external {
        require(ownerOf(id) == msg.sender, "MANAGER: You are not the owner");
        Infinite storage infinite = _nodes[id];
        infinite.metadata = metadata;
    }

    function _changeEnableClaims(bool _newVal) onlyOwner external {
        enableClaims = _newVal;
    }

    function changeRewardsParameters(uint64 newReward, uint64 newTime, uint64 newPrecision, uint64 newCliffPeriods) onlyOwner external {
        rewardsParameters.reward = newReward;
        rewardsParameters.claimTime = newTime;
        rewardsParameters.precision = newPrecision;
        rewardsParameters.cliffPeriods = newCliffPeriods;
    }

    function getInfinites(uint256 _id) public view onlyIfExists(_id) returns (Infinite memory) {
        return _nodes[_id];
    }

    function getNameOf(uint256 _id) public view onlyIfExists(_id) returns (string memory) {
        return _nodes[_id].name;
    }

    function getMintOf(uint256 _id) public view onlyIfExists(_id) returns (uint64) {
        return _nodes[_id].mint;
    }

    function getInfinitesOf(address _account) public view returns (uint256[] memory) {
        return _bags[_account];
    }

    function updatePlatinumMembershipPrice(uint256 _price) external onlyOwner {
        nodePlatinumPrice = _price;
    }

    function seeNodeClaim(uint256 _id) external view returns (uint64) {
        return _nodes[_id].claim;
    }

    function claimTime() external view returns (uint64) {
       return rewardsParameters.claimTime;
    }

    function precision() external view returns (uint64) {
       return rewardsParameters.precision;
    }

    function cliffPeriods() external view returns (uint64) {
       return rewardsParameters.cliffPeriods;
    }

    function setASCEND(address _ASCEND) onlyOwner external {
        ASCEND = IERC20(_ASCEND);
    }

    function setAMS(address _ams) onlyOwner external {
        amsManager = IAscendMembershipManager(_ams);
    }

    function updateNodeTokenPrice (uint256 _nodeAscendTokenPrice) external onlyOwner {
        nodeAscendTokenPrice = _nodeAscendTokenPrice;
    }

    function updateNodeAscendMembershipPrice (uint256 _nodeAscendMembershipPrice) external onlyOwner {
        nodeAscendMembershipPrice = _nodeAscendMembershipPrice;
    }

    function _setTokenUriFor(uint256 nodeId, string memory uri) onlyOwner external {
        _nodes[nodeId].metadata = uri;
    }

    function _setDefaultTokenUri(string memory uri) onlyOwner external {
        defaultUri = uri;
    }

    function _setBlacklist(address malicious, bool value) onlyOwner external {
        _blacklist[malicious] = value;
    }

    function _addInfinite(string calldata _name, uint64 _mint, uint64 _claim, string calldata _metadata, address _to) onlyOwner external {
        uint256 nodeId = nodeCounter;
        _createInfinite(nodeId, _name, _mint, _claim, _metadata, _to);
        nodeCounter += 1;
    }

    function setMaxInfiniteWallet (uint256 _max) external onlyOwner {
        maxInfiniteWallet = _max;
    }

    function setAscend(IERC20 _ASCEND) external onlyOwner {
        ASCEND = IERC20(_ASCEND);
    }

    function getUserBooster(address from) public view returns (uint256) {
        uint256 booster = 0;
        if(amsManager.presaleNFT().balanceOf(from) >= 1){
          booster += boostersParameters.presaleBooster;
        }
        if (amsManager.founderL3NFT().balanceOf(from) >= 1){
          booster += boostersParameters.founderL3Booster;
        } else if (amsManager.founderL2NFT().balanceOf(from) >= 1){
          booster += boostersParameters.founderL2Booster;
        } else if (amsManager.founderL1NFT().balanceOf(from) >= 1){
          booster += boostersParameters.founderL1Booster;
        }
        return booster;
    }

    function getUserAdditionalRewardsInfinite(address from) public view returns (uint256) {
      if(amsManager.meta_membership().balanceOf(from) >= 1){
        return boostersParameters.metaBooster;
      }
      return 0;
    }


    function getAddressRewards(address account) external view returns (uint) {
        uint256 rewardAmount = 0;
        uint256[] memory userMemberships = getInfinitesOf(account);
        uint interval = 0;
        for (uint256 i = 0; i < userMemberships.length; i++) {
            Infinite memory _node = _nodes[userMemberships[i]];
            interval = (block.timestamp - _nodes[_node.id].claim) / rewardsParameters.claimTime;
            if (interval >= rewardsParameters.cliffPeriods){
              rewardAmount +=  (interval * getReward(account) * 10 ** 18) / rewardsParameters.precision;
            }
        }
        return rewardAmount;
    }

    function getReward(address from) public view returns(uint256) {
        uint rewardNode = rewardsParameters.reward + getUserAdditionalRewardsInfinite(from) + getUserBooster(from);
        return rewardNode;
    }

    function claim(address account, uint256 _id) external onlyIfExists(_id) returns (uint) {
      require(enableClaims, "Claims are disabled");
      require(ownerOf(_id) == account, "You are not the owner");
      Infinite memory _node = _nodes[_id];
      uint64 interval = (uint64(block.timestamp) - _node.claim) / rewardsParameters.claimTime;
      if (interval < rewardsParameters.cliffPeriods){
          return 0;
      }
      //require(interval >= rewardsParameters.cliffPeriods, "Not enough time has passed between claims");
      uint rewardNode = (interval * getReward(account) * 10 ** 18) / rewardsParameters.precision;
      require(rewardNode >= 1, "MANAGER: You don't have enough reward");
      _node.claim = _node.claim + (interval*rewardsParameters.claimTime);   // uint64(block.timestamp);
      _nodes[_id] = _node;
      emit ClaimInfinite(account, rewardNode);
      return rewardNode;
    }


    function _createInfinite(uint256 _id, string memory _name, uint64 _mint, uint64 _claim, string memory _metadata, address _to) internal {
        require(!_exists(_id), "MANAGER: Infinite already exist");
        _nodes[_id] = Infinite({
            name: _name,
            mint: _mint,
            claim: _claim,
            id: _id,
            metadata: _metadata
        });
        _owners[_id] = _to;
        _balances[_to] += 1;
        _bags[_to].push(_id);
        emit CreateInfinite(_to, _id);
    }

    function _remove(uint256 _id, address _account) internal {
        uint256[] storage _ownerNodes = _bags[_account];
        uint length = _ownerNodes.length;
        uint _index = length;
        for (uint256 i = 0; i < length; i++) {
            if(_ownerNodes[i] == _id) {
                _index = i;
            }
        }
        if (_index >= _ownerNodes.length) return;
        _ownerNodes[_index] = _ownerNodes[length - 1];
        _ownerNodes.pop();
        emit RemoveInfinite(_account, _id);
    }

    function name() external override pure returns (string memory) {
        return "Infinite Membership";
    }

    function symbol() external override pure returns (string memory) {
        return "INFINITE";
    }

    function tokenURI(uint256 tokenId) external override view returns (string memory) {
        Infinite memory _node = _nodes[uint64(tokenId)];
        if(bytes(_node.metadata).length == 0) {
            return defaultUri;
        } else {
            return _node.metadata;
        }
    }

    function balanceOf(address owner) public override view returns (uint256 balance){
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    function ownerOf(uint256 tokenId) public override view onlyIfExists(uint64(tokenId)) returns (address owner) {
        address theOwner = _owners[uint64(tokenId)];
        return theOwner;
    }

    function safeTransferFrom(address from, address to, uint256 tokenId ) external override {
        if (transferIsEnabled == true){
            safeTransferFrom(from, to, tokenId, "");
        }  else {
            require (to == address(0) || to == address(deadAddress), "Infinite Transfers are not allowed");
            safeTransferFrom(from, to, tokenId, "");
        }
    }

    function createNode(address account, string memory nodeName) internal {
        require(keccak256(bytes(nodeName)) != keccak256(bytes("V1 NODE")), "MANAGER: V1 NODE is reserved name");
        uint256 nodeId = nodeCounter;
        _createInfinite(nodeId, nodeName, uint64(block.timestamp), uint64(block.timestamp), "", account);
        nodeCounter += 1;
    }

    function migrateNodes(uint64[] memory userNodes) public {
      address sender = _msgSender();
      require(userNodes.length + balanceOf(sender) <= maxInfiniteWallet, "HELPER: Exceeds max Infinite per wallet");
      uint64[] memory _claims = new uint64[](userNodes.length);
      for (uint256 i = 0; i < userNodes.length; i++) {
           require(sender ==  infiniteManagerV1.ownerOf(userNodes[i]), "You are not the owner of the Node" );
           uint64 nodeclaim = infiniteHelperV1.seeNodeClaim(userNodes[i]);
           if  (nodeclaim == 0){
             nodeclaim = infiniteManagerV1.getMintOf(userNodes[i]);
           }
           _claims[i] = nodeclaim;
           infiniteManagerV1.transferFrom(_msgSender(), address(deadAddress), userNodes[i] );
      }
      migrateInfinites(_claims, sender);
    }

    function migrateInfinites( uint64[] memory _claims, address _to) internal {
        for (uint256 i = 0; i < _claims.length; i++) {
            uint256 nodeId = nodeCounter;
            _createInfinite(nodeId, "Infinite", _claims[i],  _claims[i], "", _to);
            nodeCounter += 1;
        }
    }


    function createMultipleNodeWithRewards(string memory _name, uint64[] memory ascendNodes, uint64[] memory userPlatinumNodes) public {
        require(bytes(_name).length > 0 && bytes(_name).length < 33, "HELPER: name size is invalid");
        address sender = _msgSender();
        require(sender != address(0), "HELPER:  Creation from the zero address");
        uint256 nodePrice = nodeAscendTokenPrice * 10 ** 18;
        require(nodePrice > 0, "HELPER error: nodeAscendTokenPrice");
        uint256 allRewards = amsHelper.calculator().calculateAllRewards(sender) * 10 ** 18;
        require(ASCEND.balanceOf(sender) + allRewards  >= nodePrice, "HELPER: Ascend Tokens balance too low for creation.");
        require(balanceOf(sender) + 1 <= maxInfiniteWallet, "HELPER: Exceeds max wallet amount");
        require(amsManager.balanceOf(sender) >= nodeAscendMembershipPrice, "HELPER: Ascend Membership balance too low for creation.");
        require(amsManager.platinum_membership().balanceOf(sender) >= nodePlatinumPrice, "HELPER: Platinum Membership balance too low for creation.");
        require(ascendNodes.length == nodeAscendMembershipPrice, "HELPER: AMS Nodes (Invalid amount)");
        require(userPlatinumNodes.length == nodePlatinumPrice, "HELPER: Platinum Membership Nodes (Invalid amount)");


        uint256 rewardAmount = amsHelper.claimRewardsForCompoundInfinite( sender, nodePrice );

        for (uint256 i = 0; i < nodeAscendMembershipPrice; i++) {
            amsManager.transferFrom(_msgSender(), address(deadAddress), ascendNodes[i]);
        }
        for (uint256 i = 0; i < nodePlatinumPrice; i++) {
            amsManager.platinum_membership().transferFrom(_msgSender(), address(deadAddress), userPlatinumNodes[i]);
        }
        if (nodePrice > rewardAmount  ){
            uint256 difference = nodePrice - rewardAmount;
            ASCEND.transferFrom(sender, address(amsHelper), difference);
        }
        emit CreateInfiniteWithRewards( sender,  rewardAmount);
        createNode(sender, _name);
    }


    function createNodeWithTokens(string memory _name, uint64[] memory ascendNodes, uint64[] memory userPlatinumNodes) public {
        require(bytes(_name).length > 0 && bytes(_name).length < 33, "HELPER: name size is invalid");
        address sender = _msgSender();
        require(sender != address(0), "HELPER:  Creation from the zero address");
        uint256 nodePrice = nodeAscendTokenPrice * 10 ** 18;
        require(nodePrice > 0, "HELPER error: nodeAscendTokenPrice");
        require(ASCEND.balanceOf(sender) >= nodePrice, "HELPER: Ascend Tokens balance too low for creation.");
        require(balanceOf(sender) + 1 <= maxInfiniteWallet, "HELPER: Exceeds max wallet amount");

        require(amsManager.balanceOf(sender) >= nodeAscendMembershipPrice, "HELPER: Ascend Membership balance too low for creation.");
        require(amsManager.platinum_membership().balanceOf(sender) >= nodePlatinumPrice, "HELPER: Platinum Membership balance too low for creation.");
        require(ascendNodes.length == nodeAscendMembershipPrice, "HELPER: AMS Nodes (Invalid amount)");
        require(userPlatinumNodes.length == nodePlatinumPrice, "HELPER: Platinum Membership Nodes (Invalid amount)");

        for (uint256 i = 0; i < nodeAscendMembershipPrice; i++) {
            amsManager.transferFrom(_msgSender(), address(deadAddress), ascendNodes[i]);
        }
        for (uint256 i = 0; i < nodePlatinumPrice; i++) {
            amsManager.platinum_membership().transferFrom(_msgSender(), address(deadAddress), userPlatinumNodes[i]);
        }
        ASCEND.transferFrom(_msgSender(), address(amsHelper),  nodePrice);
        createNode(sender, _name);
    }

    function renameInfinite(uint64 id, string memory newName) external {
        require(keccak256(bytes(newName)) != keccak256(bytes("V1 NODE")), "MANAGER: V1 NODE is reserved name");
        require(ownerOf(id) == msg.sender, "MANAGER: You are not the owner");
        Infinite storage infinite = _nodes[id];
        infinite.name = newName;
    }

    function transferFrom(address from, address to,uint256 tokenId) external override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        if (transferIsEnabled == true){
            _transfer(from, to, tokenId);
        } else {
            require (to == address(0) || to == deadAddress, "Infinite Transfers are not allowed");
            _transfer(from, to, tokenId);
        }
    }

    function approve(address to, uint256 tokenId) external override {
        address owner = ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");
        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );
        _approve(to, tokenId);
    }

    function approveAll(address to, uint64[] memory userNodes) external {
        uint256 total = userNodes.length;
        for (uint64  i = 0; i < total; i++) {
            address owner = ownerOf(userNodes[i]);
            require(to != owner, "ERC721: approval to current owner");
            require(
                _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
                "ERC721: approve caller is not owner nor approved for all"
            );
            _approve(to, userNodes[i]);
        }
    }

    function getApproved(uint256 tokenId) public override view onlyIfExists(uint64(tokenId)) returns (address operator){
        return _tokenApprovals[uint64(tokenId)];
    }

    function setApprovalForAll(address operator, bool _approved) external override {
        _setApprovalForAll(_msgSender(), operator, _approved);
    }

    function isApprovedForAll(address owner, address operator) public view override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        if (transferIsEnabled == true){
            _safeTransfer(from, to, tokenId, _data);
        } else {
            require (to == address(0) || to == address(deadAddress), "Infinite Transfers are not allowed");
            _safeTransfer(from, to, tokenId, _data);
        }
    }

    function supportsInterface(bytes4 interfaceId) external override pure returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId;
    }

    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal {
        uint64 _id = uint64(tokenId);
        require(ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
        require(!_blacklist[to], "MANAGER: You can't transfer to blacklisted user");
        require(!_blacklist[from], "MANAGER: You can't transfer as blacklisted user");
        _approve(address(0), tokenId);
        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[_id] = to;
        _bags[to].push(_id);
        _remove(_id, from);
        emit Transfer(from, to, tokenId);
    }

    function _approve(address to, uint256 tokenId) internal {
        _tokenApprovals[uint64(tokenId)] = to;
        emit Approval(ownerOf(tokenId), to, tokenId);
    }

    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view onlyIfExists(uint64(tokenId)) returns (bool) {
        address owner = ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[uint64(tokenId)] != address(0);
    }

    function _safeTransfer(address from, address to, uint256 tokenId, bytes memory _data) internal {
      require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
      if (transferIsEnabled == true){
        _transfer(from, to, tokenId);
      } else {
        require (to == address(0) || to == address(deadAddress), "Infinite Transfers are not allowed");
        _transfer(from, to, tokenId);
      }
    }

    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }
}

File 2 of 11 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^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 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) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

File 3 of 11 : SafeMath.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
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) {
        unchecked {
            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) {
        unchecked {
            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) {
        unchecked {
            // 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) {
        unchecked {
            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) {
        unchecked {
            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) {
        return a + b;
    }

    /**
     * @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) {
        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) {
        return a * b;
    }

    /**
     * @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.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        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) {
        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) {
        unchecked {
            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.
     *
     * 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) {
        unchecked {
            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) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

File 4 of 11 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

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

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 5 of 11 : Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

File 6 of 11 : IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

File 7 of 11 : ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

File 8 of 11 : IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

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

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}

File 9 of 11 : IERC721Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;

import "../IERC721.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

File 10 of 11 : IERC721Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

File 11 of 11 : IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

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

Contract ABI

[{"inputs":[{"internalType":"address","name":"_ASCEND_TOKEN","type":"address"},{"internalType":"address","name":"_ascendMembership","type":"address"},{"internalType":"address","name":"_amsHelper","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"rewardNode","type":"uint256"}],"name":"ClaimInfinite","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"}],"name":"CreateInfinite","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"rewardAmount","type":"uint256"}],"name":"CreateInfiniteWithRewards","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"}],"name":"RemoveInfinite","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"ASCEND","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"uint64","name":"_mint","type":"uint64"},{"internalType":"uint64","name":"_claim","type":"uint64"},{"internalType":"string","name":"_metadata","type":"string"},{"internalType":"address","name":"_to","type":"address"}],"name":"_addInfinite","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_newVal","type":"bool"}],"name":"_changeEnableClaims","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"malicious","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"_setBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"_setDefaultTokenUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"nodeId","type":"uint256"},{"internalType":"string","name":"uri","type":"string"}],"name":"_setTokenUriFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"amsHelper","outputs":[{"internalType":"contract AmsHelper","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"amsManager","outputs":[{"internalType":"contract IAscendMembershipManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint64[]","name":"userNodes","type":"uint64[]"}],"name":"approveAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"boostersParameters","outputs":[{"internalType":"uint256","name":"presaleBooster","type":"uint256"},{"internalType":"uint256","name":"founderL1Booster","type":"uint256"},{"internalType":"uint256","name":"founderL2Booster","type":"uint256"},{"internalType":"uint256","name":"founderL3Booster","type":"uint256"},{"internalType":"uint256","name":"metaBooster","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"newReward","type":"uint64"},{"internalType":"uint64","name":"newTime","type":"uint64"},{"internalType":"uint64","name":"newPrecision","type":"uint64"},{"internalType":"uint64","name":"newCliffPeriods","type":"uint64"}],"name":"changeRewardsParameters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"claim","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimTime","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cliffPeriods","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"uint64[]","name":"ascendNodes","type":"uint64[]"},{"internalType":"uint64[]","name":"userPlatinumNodes","type":"uint64[]"}],"name":"createMultipleNodeWithRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"uint64[]","name":"ascendNodes","type":"uint64[]"},{"internalType":"uint64[]","name":"userPlatinumNodes","type":"uint64[]"}],"name":"createNodeWithTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deadAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"defaultUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_enable","type":"bool"}],"name":"enableTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getAddressRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"operator","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"getInfinites","outputs":[{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"metadata","type":"string"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint64","name":"mint","type":"uint64"},{"internalType":"uint64","name":"claim","type":"uint64"}],"internalType":"struct InfiniteManager.Infinite","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"getInfinitesOf","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"getMintOf","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"getNameOf","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"}],"name":"getReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"}],"name":"getUserAdditionalRewardsInfinite","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"}],"name":"getUserBooster","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"infiniteHelperV1","outputs":[{"internalType":"contract InfiniteHelperV1","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"infiniteManagerV1","outputs":[{"internalType":"contract InfiniteManagerV1","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"isBlacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxInfiniteWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64[]","name":"userNodes","type":"uint64[]"}],"name":"migrateNodes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"nodeAscendMembershipPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nodeAscendTokenPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nodePlatinumPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"precision","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"id","type":"uint64"},{"internalType":"string","name":"newName","type":"string"}],"name":"renameInfinite","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardsParameters","outputs":[{"internalType":"uint64","name":"reward","type":"uint64"},{"internalType":"uint64","name":"claimTime","type":"uint64"},{"internalType":"uint64","name":"precision","type":"uint64"},{"internalType":"uint64","name":"cliffPeriods","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"seeNodeClaim","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_ams","type":"address"}],"name":"setAMS","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_ASCEND","type":"address"}],"name":"setASCEND","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_ASCEND","type":"address"}],"name":"setAscend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_founderL1Booster","type":"uint256"},{"internalType":"uint256","name":"_founderL2Booster","type":"uint256"},{"internalType":"uint256","name":"_founderL3Booster","type":"uint256"},{"internalType":"uint256","name":"_presaleBooster","type":"uint256"},{"internalType":"uint256","name":"_metaBooster","type":"uint256"}],"name":"setBoosters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_infiniteHelperV1","type":"address"}],"name":"setInfiniteHelperV1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_infiniteManagerV1","type":"address"}],"name":"setInfiniteManagerV1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_max","type":"uint256"}],"name":"setMaxInfiniteWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalNodesCreated","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferIsEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_amsHelper","type":"address"}],"name":"updateAmsHelper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"string","name":"metadata","type":"string"}],"name":"updateInfinite","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nodeAscendMembershipPrice","type":"uint256"}],"name":"updateNodeAscendMembershipPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nodeAscendTokenPrice","type":"uint256"}],"name":"updateNodeTokenPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"updatePlatinumMembershipPrice","outputs":[],"stateMutability":"nonpayable","type":"function"}]

600880546001600160a01b03191661dead17905560a06040819052600060808190526200002f91600991620001d1565b506101f4600a556028600b556001600c819055600d819055600e819055600f805460ff1916821790556013805460ff60a01b1916600160a01b17905560408051608080820183526202e6308252620151806020808401919091526103e883850152606092830194909452780100000000000003e80000000000015180000000000002e630601455825160a081018452616f54808252614a389582018690529381018490526194709281018390526000910181905260158390556016939093556017919091556018556019553480156200010757600080fd5b5060405162005a5b38038062005a5b8339810160408190526200012a9162000294565b620001353362000181565b600f80546001600160a01b0394851661010002610100600160a81b0319909116179055601080549284166001600160a01b0319938416179055601180549190931691161790556200031a565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b828054620001df90620002dd565b90600052602060002090601f0160209004810192826200020357600085556200024e565b82601f106200021e57805160ff19168380011785556200024e565b828001600101855582156200024e579182015b828111156200024e57825182559160200191906001019062000231565b506200025c92915062000260565b5090565b5b808211156200025c576000815560010162000261565b80516001600160a01b03811681146200028f57600080fd5b919050565b600080600060608486031215620002a9578283fd5b620002b48462000277565b9250620002c46020850162000277565b9150620002d46040850162000277565b90509250925092565b600181811c90821680620002f257607f821691505b602082108114156200031457634e487b7160e01b600052602260045260246000fd5b50919050565b615731806200032a6000396000f3fe608060405234801561001057600080fd5b50600436106104075760003560e01c806395d89b4111610220578063bac7235e11610130578063de5fa9ce116100b8578063f03637ca11610087578063f03637ca146109ff578063f273d5ec146107f7578063f2fde38b14610a12578063fab008d214610a25578063fe575a8714610a3857600080fd5b8063de5fa9ce1461097d578063e985e9c51461099d578063ef7ac0e5146109d9578063ef7cc266146109ec57600080fd5b8063c87b56dd116100ff578063c87b56dd14610924578063cb3a6f7014610937578063d2d99fec1461094a578063d3b5dc3b14610952578063d3d8c4241461096a57600080fd5b8063bac7235e146108ec578063bd075e53146108ff578063c00007b014610908578063c6d08b771461091b57600080fd5b8063aad3ec96116101b3578063b1626d5d11610182578063b1626d5d146108a2578063b17e54e7146108b5578063b3e4a56a146108be578063b8527aef146108d1578063b88d4fde146108d957600080fd5b8063aad3ec9614610856578063ae3beb4814610869578063af6c36e21461087c578063b0d17f6f1461088f57600080fd5b8063a0597815116101ef578063a05978151461080a578063a22cb4651461081d578063a85a424b14610830578063a96b551c1461084357600080fd5b806395d89b41146107a857806399e3b18d146107cc5780639a5f27a4146107df5780639ab58873146107f757600080fd5b806334ceb9e31161031b57806361b10632116102ae5780636e3d6a291161027d5780636e3d6a291461075657806370a0823114610769578063715018a61461077c5780638396579c146107845780638da5cb5b1461079757600080fd5b806361b10632146107055780636352211e146107185780636551d6df1461072b57806366d2190d1461073e57600080fd5b806342842e0e116102ea57806342842e0e1461068a578063486443391461069d5780635442d96c146106b0578063594d129f146106f257600080fd5b806334ceb9e31461063e578063371ffa641461065157806337aad4ba14610664578063418bbec31461067757600080fd5b80632282d9f21161039e57806327b3bf111161036d57806327b3bf111461058857806327c8f835146105a05780632ef8949c146105b3578063332804c8146105c657806333c889e11461062b57600080fd5b80632282d9f21461054c57806322e46a9d1461055957806323b872dd14610562578063276305431461057557600080fd5b80631107d135116103da5780631107d135146104ac578063153712ec146104bf57806319593c2b146104e05780631ee205041461050057600080fd5b806301ffc9a71461040c57806306fdde0314610434578063081812fc1461046c578063095ea7b314610497575b600080fd5b61041f61041a366004614b5b565b610a64565b60405190151581526020015b60405180910390f35b6040805180820190915260138152720496e66696e697465204d656d6265727368697606c1b60208201525b60405161042b9190614f84565b61047f61047a366004614cf1565b610a9b565b6040516001600160a01b03909116815260200161042b565b6104aa6104a5366004614ac6565b610b00565b005b6104aa6104ba366004614b93565b610b86565b6104d26104cd366004614920565b610c53565b60405190815260200161042b565b6104f36104ee366004614920565b61109e565b60405161042b9190614f40565b61053461050e366004614cf1565b60009081526003602081905260409091200154600160401b90046001600160401b031690565b6040516001600160401b03909116815260200161042b565b600f5461041f9060ff1681565b6104d2600e5481565b6104aa610570366004614990565b61110a565b6104aa610583366004614a4c565b611195565b601454600160401b90046001600160401b0316610534565b60085461047f906001600160a01b031681565b6104aa6105c1366004614920565b6112b7565b6014546105f8906001600160401b0380821691600160401b8104821691600160801b8204811691600160c01b90041684565b604080516001600160401b039586168152938516602085015291841691830191909152909116606082015260800161042b565b6104aa610639366004614cf1565b611303565b6104aa61064c366004614dfa565b611332565b6104aa61065f366004614c3c565b61142c565b6104aa610672366004614d6a565b61146d565b6104aa610685366004614920565b6114bc565b6104aa610698366004614990565b611508565b60135461047f906001600160a01b031681565b6015546016546017546018546019546106ca949392919085565b604080519586526020860194909452928401919091526060830152608082015260a00161042b565b610534610700366004614cf1565b61158d565b6104d2610713366004614920565b6115d6565b61047f610726366004614cf1565b6116f0565b6104aa610739366004614c6e565b611747565b601454600160c01b90046001600160401b0316610534565b6104aa610764366004614af1565b611f77565b6104d2610777366004614920565b6123f5565b6104aa61247c565b6104aa610792366004614e31565b6124b2565b6000546001600160a01b031661047f565b604080518082019091526008815267494e46494e49544560c01b602082015261045f565b6104d26107da366004614920565b612545565b600f5461047f9061010090046001600160a01b031681565b6104aa610805366004614920565b6127c8565b6104aa610818366004614cf1565b61281a565b6104aa61082b366004614a99565b612849565b6104aa61083e366004614b23565b612854565b6104aa610851366004614cf1565b61289c565b6104d2610864366004614ac6565b6128cb565b60105461047f906001600160a01b031681565b60115461047f906001600160a01b031681565b6104aa61089d366004614a99565b612d20565b6104aa6108b0366004614c6e565b612d75565b6104d2600a5481565b6104aa6108cc366004614d21565b6133b2565b6104d261342e565b6104aa6108e73660046149d0565b613444565b6104aa6108fa366004614920565b6134d6565b6104d2600b5481565b6104d2610916366004614920565b613522565b6104d2600c5481565b61045f610932366004614cf1565b613557565b6104aa610945366004614cf1565b613780565b61045f6137af565b601454600160801b90046001600160401b0316610534565b60125461047f906001600160a01b031681565b61099061098b366004614cf1565b61383d565b60405161042b9190615447565b61041f6109ab366004614958565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b6104aa6109e7366004614b23565b613a18565b6104aa6109fa366004614920565b613a55565b61045f610a0d366004614cf1565b613aa1565b6104aa610a20366004614920565b613ae2565b6104aa610a33366004614da4565b613b7d565b61041f610a46366004614920565b6001600160a01b031660009081526007602052604090205460ff1690565b60006001600160e01b031982166380ac58cd60e01b1480610a9557506001600160e01b03198216635b5e139f60e01b145b92915050565b6000816001600160401b0316610ab081613bbe565b610ad55760405162461bcd60e51b8152600401610acc90615121565b60405180910390fd5b6001600160401b0383166000908152600560205260409020546001600160a01b031691505b50919050565b6000610b0b826116f0565b9050806001600160a01b0316836001600160a01b03161415610b3f5760405162461bcd60e51b8152600401610acc906152df565b336001600160a01b0382161480610b5b5750610b5b81336109ab565b610b775760405162461bcd60e51b8152600401610acc906151ae565b610b818383613be4565b505050565b6000546001600160a01b03163314610bb05760405162461bcd60e51b8152600401610acc906152aa565b6000600d549050610c318189898080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8b018190048102820181019092528981528c93508b9250908a908a90819084018382808284376000920191909152508a9250613c5c915050565b6001600d6000828254610c4491906154ea565b90915550505050505050505050565b600080600090506001601060009054906101000a90046001600160a01b03166001600160a01b0316636c6c87ad6040518163ffffffff1660e01b815260040160206040518083038186803b158015610caa57600080fd5b505afa158015610cbe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ce2919061493c565b6040516370a0823160e01b81526001600160a01b03868116600483015291909116906370a082319060240160206040518083038186803b158015610d2557600080fd5b505afa158015610d39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d5d9190614d09565b10610d7257601554610d6f90826154ea565b90505b60105460408051635a5240d760e11b815290516001926001600160a01b03169163b4a481ae916004808301926020929190829003018186803b158015610db757600080fd5b505afa158015610dcb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610def919061493c565b6040516370a0823160e01b81526001600160a01b03868116600483015291909116906370a082319060240160206040518083038186803b158015610e3257600080fd5b505afa158015610e46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e6a9190614d09565b10610e8357601854610e7c90826154ea565b9050610a95565b6010546040805163055fcefb60e01b815290516001926001600160a01b03169163055fcefb916004808301926020929190829003018186803b158015610ec857600080fd5b505afa158015610edc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f00919061493c565b6040516370a0823160e01b81526001600160a01b03868116600483015291909116906370a082319060240160206040518083038186803b158015610f4357600080fd5b505afa158015610f57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f7b9190614d09565b10610f8d57601754610e7c90826154ea565b60105460408051636fe1dfaf60e01b815290516001926001600160a01b031691636fe1dfaf916004808301926020929190829003018186803b158015610fd257600080fd5b505afa158015610fe6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061100a919061493c565b6040516370a0823160e01b81526001600160a01b03868116600483015291909116906370a082319060240160206040518083038186803b15801561104d57600080fd5b505afa158015611061573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110859190614d09565b10610a955760165461109790826154ea565b9392505050565b6001600160a01b0381166000908152600460209081526040918290208054835181840281018401909452808452606093928301828280156110fe57602002820191906000526020600020905b8154815260200190600101908083116110ea575b50505050509050919050565b6111143382613e22565b6111305760405162461bcd60e51b8152600401610acc90615320565b600f5460ff1615156001141561114b57610b81838383613eb2565b6001600160a01b038216158061116e57506008546001600160a01b038381169116145b61118a5760405162461bcd60e51b8152600401610acc9061520b565b610b81838383613eb2565b805160005b81816001600160401b031610156112b15760006111ef84836001600160401b0316815181106111d957634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160401b03166116f0565b9050806001600160a01b0316856001600160a01b031614156112235760405162461bcd60e51b8152600401610acc906152df565b336001600160a01b038216148061123f575061123f81336109ab565b61125b5760405162461bcd60e51b8152600401610acc906151ae565b61129e8585846001600160401b03168151811061128857634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160401b0316613be4565b50806112a981615644565b91505061119a565b50505050565b6000546001600160a01b031633146112e15760405162461bcd60e51b8152600401610acc906152aa565b601180546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b0316331461132d5760405162461bcd60e51b8152600401610acc906152aa565b600c55565b6040805180820190915260078152665631204e4f444560c81b6020918201528151908201207f726ca9a11821b08e8b39a0c12fff38e2a582b4c38cfe7da1888136bad2ac4c4214156113965760405162461bcd60e51b8152600401610acc90614f97565b336113a96001600160401b0384166116f0565b6001600160a01b0316146113ff5760405162461bcd60e51b815260206004820152601e60248201527f4d414e414745523a20596f7520617265206e6f7420746865206f776e657200006044820152606401610acc565b6001600160401b0382166000908152600360209081526040909120825190916112b19183918501906146cc565b6000546001600160a01b031633146114565760405162461bcd60e51b8152600401610acc906152aa565b80516114699060099060208401906146cc565b5050565b6000546001600160a01b031633146114975760405162461bcd60e51b8152600401610acc906152aa565b60008281526003602090815260409091208251610b81926001909201918401906146cc565b6000546001600160a01b031633146114e65760405162461bcd60e51b8152600401610acc906152aa565b601280546001600160a01b0319166001600160a01b0392909216919091179055565b600f5460ff1615156001141561153357610b8183838360405180602001604052806000815250613444565b6001600160a01b038216158061155657506008546001600160a01b038381169116145b6115725760405162461bcd60e51b8152600401610acc9061520b565b610b8183838360405180602001604052806000815250613444565b60008161159981613bbe565b6115b55760405162461bcd60e51b8152600401610acc90615121565b5050600090815260036020819052604090912001546001600160401b031690565b60006001601060009054906101000a90046001600160a01b03166001600160a01b0316639c0ba92a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561162857600080fd5b505afa15801561163c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611660919061493c565b6040516370a0823160e01b81526001600160a01b03858116600483015291909116906370a082319060240160206040518083038186803b1580156116a357600080fd5b505afa1580156116b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116db9190614d09565b106116e857505060195490565b506000919050565b6000816001600160401b031661170581613bbe565b6117215760405162461bcd60e51b8152600401610acc90615121565b50506001600160401b03166000908152600260205260409020546001600160a01b031690565b60008351118015611759575060218351105b6117a55760405162461bcd60e51b815260206004820152601c60248201527f48454c5045523a206e616d652073697a6520697320696e76616c6964000000006044820152606401610acc565b33806117c35760405162461bcd60e51b8152600401610acc90615087565b6000600a54670de0b6b3a76400006117db9190615567565b9050600081116117fd5760405162461bcd60e51b8152600401610acc906153b3565b60115460408051630338f8e760e61b815290516000926001600160a01b03169163ce3e39c0916004808301926020929190829003018186803b15801561184257600080fd5b505afa158015611856573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061187a919061493c565b6040516379a59c1360e01b81526001600160a01b03858116600483015291909116906379a59c139060240160206040518083038186803b1580156118bd57600080fd5b505afa1580156118d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118f59190614d09565b61190790670de0b6b3a7640000615567565b600f546040516370a0823160e01b81526001600160a01b03868116600483015292935084928492610100900416906370a082319060240160206040518083038186803b15801561195657600080fd5b505afa15801561196a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061198e9190614d09565b61199891906154ea565b10156119b65760405162461bcd60e51b8152600401610acc906150ce565b600e546119c2846123f5565b6119cd9060016154ea565b11156119eb5760405162461bcd60e51b8152600401610acc9061516d565b600b546010546040516370a0823160e01b81526001600160a01b038681166004830152909116906370a082319060240160206040518083038186803b158015611a3357600080fd5b505afa158015611a47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a6b9190614d09565b1015611a895760405162461bcd60e51b8152600401610acc9061524d565b600c54601060009054906101000a90046001600160a01b03166001600160a01b031663983129066040518163ffffffff1660e01b815260040160206040518083038186803b158015611ada57600080fd5b505afa158015611aee573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b12919061493c565b6040516370a0823160e01b81526001600160a01b03868116600483015291909116906370a082319060240160206040518083038186803b158015611b5557600080fd5b505afa158015611b69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b8d9190614d09565b1015611bab5760405162461bcd60e51b8152600401610acc90614fd8565b600b54855114611bcd5760405162461bcd60e51b8152600401610acc90615371565b600c54845114611bef5760405162461bcd60e51b8152600401610acc906153f5565b6011546040516382028d3d60e01b81526001600160a01b0385811660048301526024820185905260009216906382028d3d90604401602060405180830381600087803b158015611c3e57600080fd5b505af1158015611c52573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c769190614d09565b905060005b600b54811015611d33576010546001600160a01b03166323b872dd336008548a516001600160a01b03909116908b9086908110611cc857634e487b7160e01b600052603260045260246000fd5b60200260200101516040518463ffffffff1660e01b8152600401611cee93929190614f14565b600060405180830381600087803b158015611d0857600080fd5b505af1158015611d1c573d6000803e3d6000fd5b505050508080611d2b90615629565b915050611c7b565b5060005b600c54811015611e7257601060009054906101000a90046001600160a01b03166001600160a01b031663983129066040518163ffffffff1660e01b815260040160206040518083038186803b158015611d8f57600080fd5b505afa158015611da3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dc7919061493c565b6001600160a01b03166323b872dd3360085489516001600160a01b03909116908a9086908110611e0757634e487b7160e01b600052603260045260246000fd5b60200260200101516040518463ffffffff1660e01b8152600401611e2d93929190614f14565b600060405180830381600087803b158015611e4757600080fd5b505af1158015611e5b573d6000803e3d6000fd5b505050508080611e6a90615629565b915050611d37565b5080831115611f22576000611e8782856155b5565b600f546011546040516323b872dd60e01b81526001600160a01b03898116600483015291821660248201526044810184905292935061010090910416906323b872dd90606401602060405180830381600087803b158015611ee757600080fd5b505af1158015611efb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f1f9190614b3f565b50505b604080516001600160a01b0386168152602081018390527f50e570a3daae9ee9c4eb5323995680f2afe8a703c158ecf7edbb1cd9852460cf910160405180910390a1611f6e8488614138565b50505050505050565b600e543390611f85826123f5565b8351611f9191906154ea565b1115611fef5760405162461bcd60e51b815260206004820152602760248201527f48454c5045523a2045786365656473206d617820496e66696e69746520706572604482015266081dd85b1b195d60ca1b6064820152608401610acc565b600082516001600160401b0381111561201857634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015612041578160200160208202803683370190505b50905060005b83518110156123ea5760125484516001600160a01b0390911690636352211e9086908490811061208757634e487b7160e01b600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b81526004016120ba91906001600160401b0391909116815260200190565b60206040518083038186803b1580156120d257600080fd5b505afa1580156120e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061210a919061493c565b6001600160a01b0316836001600160a01b0316146121745760405162461bcd60e51b815260206004820152602160248201527f596f7520617265206e6f7420746865206f776e6572206f6620746865204e6f646044820152606560f81b6064820152608401610acc565b60135484516000916001600160a01b031690631ee20504908790859081106121ac57634e487b7160e01b600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b81526004016121df91906001600160401b0391909116815260200190565b60206040518083038186803b1580156121f757600080fd5b505afa15801561220b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061222f9190614dde565b90506001600160401b0381166122fc5760125485516001600160a01b039091169063594d129f9087908590811061227657634e487b7160e01b600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b81526004016122a991906001600160401b0391909116815260200190565b60206040518083038186803b1580156122c157600080fd5b505afa1580156122d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122f99190614dde565b90505b8083838151811061231d57634e487b7160e01b600052603260045260246000fd5b6001600160401b03909216602092830291909101909101526012546001600160a01b03166323b872dd61234d3390565b60085488516001600160a01b039091169089908790811061237e57634e487b7160e01b600052603260045260246000fd5b60200260200101516040518463ffffffff1660e01b81526004016123a493929190614f14565b600060405180830381600087803b1580156123be57600080fd5b505af11580156123d2573d6000803e3d6000fd5b505050505080806123e290615629565b915050612047565b50610b8181836141dd565b60006001600160a01b0382166124605760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610acc565b506001600160a01b031660009081526001602052604090205490565b6000546001600160a01b031633146124a65760405162461bcd60e51b8152600401610acc906152aa565b6124b060006142a8565b565b6000546001600160a01b031633146124dc5760405162461bcd60e51b8152600401610acc906152aa565b601480546001600160401b039586166001600160801b031990911617600160401b94861694909402939093176fffffffffffffffffffffffffffffffff16600160801b928516929092026001600160c01b031691909117600160c01b9190931602919091179055565b600080806125528461109e565b90506000805b82518110156127be5760006003600085848151811061258757634e487b7160e01b600052603260045260246000fd5b602002602001015181526020019081526020016000206040518060a00160405290816000820180546125b8906155f4565b80601f01602080910402602001604051908101604052809291908181526020018280546125e4906155f4565b80156126315780601f1061260657610100808354040283529160200191612631565b820191906000526020600020905b81548152906001019060200180831161261457829003601f168201915b5050505050815260200160018201805461264a906155f4565b80601f0160208091040260200160405190810160405280929190818152602001828054612676906155f4565b80156126c35780601f10612698576101008083540402835291602001916126c3565b820191906000526020600020905b8154815290600101906020018083116126a657829003601f168201915b505050918352505060028201546020808301919091526003928301546001600160401b03808216604080860191909152600160401b9283900482166060909501949094526014548685015160009081529386905293909220909301549394509082900481169261273692900416426155b5565b612740919061552d565b601454909350600160c01b90046001600160401b031683106127ab57601454600160801b90046001600160401b031661277888613522565b6127829085615567565b61279490670de0b6b3a7640000615567565b61279e919061552d565b6127a890866154ea565b94505b50806127b681615629565b915050612558565b5091949350505050565b6000546001600160a01b031633146127f25760405162461bcd60e51b8152600401610acc906152aa565b600f80546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6000546001600160a01b031633146128445760405162461bcd60e51b8152600401610acc906152aa565b600a55565b6114693383836142f8565b6000546001600160a01b0316331461287e5760405162461bcd60e51b8152600401610acc906152aa565b60138054911515600160a01b0260ff60a01b19909216919091179055565b6000546001600160a01b031633146128c65760405162461bcd60e51b8152600401610acc906152aa565b600e55565b6000816128d781613bbe565b6128f35760405162461bcd60e51b8152600401610acc90615121565b601354600160a01b900460ff166129425760405162461bcd60e51b815260206004820152601360248201527210db185a5b5cc8185c9948191a5cd8589b1959606a1b6044820152606401610acc565b836001600160a01b0316612955846116f0565b6001600160a01b0316146129a35760405162461bcd60e51b81526020600482015260156024820152742cb7ba9030b932903737ba103a34329037bbb732b960591b6044820152606401610acc565b600083815260036020526040808220815160a081019092528054829082906129ca906155f4565b80601f01602080910402602001604051908101604052809291908181526020018280546129f6906155f4565b8015612a435780601f10612a1857610100808354040283529160200191612a43565b820191906000526020600020905b815481529060010190602001808311612a2657829003601f168201915b50505050508152602001600182018054612a5c906155f4565b80601f0160208091040260200160405190810160405280929190818152602001828054612a88906155f4565b8015612ad55780601f10612aaa57610100808354040283529160200191612ad5565b820191906000526020600020905b815481529060010190602001808311612ab857829003601f168201915b5050509183525050600282015460208201526003909101546001600160401b038082166040840152600160401b918290048116606090930192909252601454608084015193945060009391900490911690612b3090426155cc565b612b3a9190615541565b6014549091506001600160401b03600160c01b90910481169082161015612b6657600093505050612d19565b601454600090600160801b90046001600160401b0316612b8588613522565b612b98906001600160401b038516615567565b612baa90670de0b6b3a7640000615567565b612bb4919061552d565b90506001811015612c155760405162461bcd60e51b815260206004820152602560248201527f4d414e414745523a20596f7520646f6e2774206861766520656e6f7567682072604482015264195dd85c9960da1b6064820152608401610acc565b601454612c3290600160401b90046001600160401b031683615586565b8360800151612c419190615502565b6001600160401b031660808401526000868152600360209081526040909120845180518693612c749284929101906146cc565b506020828101518051612c8d92600185019201906146cc565b5060408281015160028301556060830151600390920180546080909401516001600160401b03908116600160401b026001600160801b031990951693169290921792909217905580516001600160a01b0389168152602081018390527f07ff3f19a76d17b016188d2c53de5bfdcba4a48da9faf298d27336929ca84ba7910160405180910390a1935050505b5092915050565b6000546001600160a01b03163314612d4a5760405162461bcd60e51b8152600401610acc906152aa565b6001600160a01b03919091166000908152600760205260409020805460ff1916911515919091179055565b60008351118015612d87575060218351105b612dd35760405162461bcd60e51b815260206004820152601c60248201527f48454c5045523a206e616d652073697a6520697320696e76616c6964000000006044820152606401610acc565b3380612df15760405162461bcd60e51b8152600401610acc90615087565b6000600a54670de0b6b3a7640000612e099190615567565b905060008111612e2b5760405162461bcd60e51b8152600401610acc906153b3565b600f546040516370a0823160e01b81526001600160a01b0384811660048301528392610100900416906370a082319060240160206040518083038186803b158015612e7557600080fd5b505afa158015612e89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ead9190614d09565b1015612ecb5760405162461bcd60e51b8152600401610acc906150ce565b600e54612ed7836123f5565b612ee29060016154ea565b1115612f005760405162461bcd60e51b8152600401610acc9061516d565b600b546010546040516370a0823160e01b81526001600160a01b038581166004830152909116906370a082319060240160206040518083038186803b158015612f4857600080fd5b505afa158015612f5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f809190614d09565b1015612f9e5760405162461bcd60e51b8152600401610acc9061524d565b600c54601060009054906101000a90046001600160a01b03166001600160a01b031663983129066040518163ffffffff1660e01b815260040160206040518083038186803b158015612fef57600080fd5b505afa158015613003573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613027919061493c565b6040516370a0823160e01b81526001600160a01b03858116600483015291909116906370a082319060240160206040518083038186803b15801561306a57600080fd5b505afa15801561307e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130a29190614d09565b10156130c05760405162461bcd60e51b8152600401610acc90614fd8565b600b548451146130e25760405162461bcd60e51b8152600401610acc90615371565b600c548351146131045760405162461bcd60e51b8152600401610acc906153f5565b60005b600b548110156131bf576010546001600160a01b03166323b872dd3360085488516001600160a01b039091169089908690811061315457634e487b7160e01b600052603260045260246000fd5b60200260200101516040518463ffffffff1660e01b815260040161317a93929190614f14565b600060405180830381600087803b15801561319457600080fd5b505af11580156131a8573d6000803e3d6000fd5b5050505080806131b790615629565b915050613107565b5060005b600c548110156132fe57601060009054906101000a90046001600160a01b03166001600160a01b031663983129066040518163ffffffff1660e01b815260040160206040518083038186803b15801561321b57600080fd5b505afa15801561322f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613253919061493c565b6001600160a01b03166323b872dd3360085487516001600160a01b039091169088908690811061329357634e487b7160e01b600052603260045260246000fd5b60200260200101516040518463ffffffff1660e01b81526004016132b993929190614f14565b600060405180830381600087803b1580156132d357600080fd5b505af11580156132e7573d6000803e3d6000fd5b5050505080806132f690615629565b9150506131c3565b50600f5461010090046001600160a01b03166323b872dd3360115460405160e084901b6001600160e01b03191681526001600160a01b0392831660048201529116602482015260448101849052606401602060405180830381600087803b15801561336857600080fd5b505af115801561337c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133a09190614b3f565b506133ab8286614138565b5050505050565b336133bc846116f0565b6001600160a01b0316146134125760405162461bcd60e51b815260206004820152601e60248201527f4d414e414745523a20596f7520617265206e6f7420746865206f776e657200006044820152606401610acc565b60008381526003602052604090206133ab600182018484614750565b60006001600d5461343f91906155b5565b905090565b61344e3383613e22565b61346a5760405162461bcd60e51b8152600401610acc90615320565b600f5460ff1615156001141561348b57613486848484846143c7565b6112b1565b6001600160a01b03831615806134ae57506008546001600160a01b038481169116145b6134ca5760405162461bcd60e51b8152600401610acc9061520b565b6112b1848484846143c7565b6000546001600160a01b031633146135005760405162461bcd60e51b8152600401610acc906152aa565b601380546001600160a01b0319166001600160a01b0392909216919091179055565b60008061352e83610c53565b613537846115d6565b60145461354d91906001600160401b03166154ea565b61109791906154ea565b6060600060036000846001600160401b031681526020019081526020016000206040518060a0016040529081600082018054613592906155f4565b80601f01602080910402602001604051908101604052809291908181526020018280546135be906155f4565b801561360b5780601f106135e05761010080835404028352916020019161360b565b820191906000526020600020905b8154815290600101906020018083116135ee57829003601f168201915b50505050508152602001600182018054613624906155f4565b80601f0160208091040260200160405190810160405280929190818152602001828054613650906155f4565b801561369d5780601f106136725761010080835404028352916020019161369d565b820191906000526020600020905b81548152906001019060200180831161368057829003601f168201915b505050918352505060028201546020808301919091526003909201546001600160401b038082166040840152600160401b909104166060909101528101515190915061377657600980546136f0906155f4565b80601f016020809104026020016040519081016040528092919081815260200182805461371c906155f4565b80156137695780601f1061373e57610100808354040283529160200191613769565b820191906000526020600020905b81548152906001019060200180831161374c57829003601f168201915b5050505050915050919050565b6020015192915050565b6000546001600160a01b031633146137aa5760405162461bcd60e51b8152600401610acc906152aa565b600b55565b600980546137bc906155f4565b80601f01602080910402602001604051908101604052809291908181526020018280546137e8906155f4565b80156138355780601f1061380a57610100808354040283529160200191613835565b820191906000526020600020905b81548152906001019060200180831161381857829003601f168201915b505050505081565b6138816040518060a0016040528060608152602001606081526020016000815260200160006001600160401b0316815260200160006001600160401b031681525090565b8161388b81613bbe565b6138a75760405162461bcd60e51b8152600401610acc90615121565b60008381526003602052604090819020815160a081019092528054829082906138cf906155f4565b80601f01602080910402602001604051908101604052809291908181526020018280546138fb906155f4565b80156139485780601f1061391d57610100808354040283529160200191613948565b820191906000526020600020905b81548152906001019060200180831161392b57829003601f168201915b50505050508152602001600182018054613961906155f4565b80601f016020809104026020016040519081016040528092919081815260200182805461398d906155f4565b80156139da5780601f106139af576101008083540402835291602001916139da565b820191906000526020600020905b8154815290600101906020018083116139bd57829003601f168201915b5050509183525050600282015460208201526003909101546001600160401b038082166040840152600160401b909104166060909101529392505050565b6000546001600160a01b03163314613a425760405162461bcd60e51b8152600401610acc906152aa565b600f805460ff1916911515919091179055565b6000546001600160a01b03163314613a7f5760405162461bcd60e51b8152600401610acc906152aa565b601080546001600160a01b0319166001600160a01b0392909216919091179055565b606081613aad81613bbe565b613ac95760405162461bcd60e51b8152600401610acc90615121565b600083815260036020526040902080546136f0906155f4565b6000546001600160a01b03163314613b0c5760405162461bcd60e51b8152600401610acc906152aa565b6001600160a01b038116613b715760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610acc565b613b7a816142a8565b50565b6000546001600160a01b03163314613ba75760405162461bcd60e51b8152600401610acc906152aa565b601694909455601792909255601855601555601955565b6001600160401b03166000908152600260205260409020546001600160a01b0316151590565b6001600160401b038116600090815260056020526040902080546001600160a01b0319166001600160a01b0384169081179091558190613c23826116f0565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b613c6586613bbe565b15613cb25760405162461bcd60e51b815260206004820152601f60248201527f4d414e414745523a20496e66696e69746520616c7265616479206578697374006044820152606401610acc565b6040805160a08101825286815260208082018590528183018990526001600160401b03808816606084015286166080830152600089815260038252929092208151805192939192613d0692849201906146cc565b506020828101518051613d1f92600185019201906146cc565b506040828101516002808401919091556060840151600390930180546080909501516001600160401b03908116600160401b026001600160801b0319909616941693909317939093179091556000888152602092835281812080546001600160a01b0386166001600160a01b0319909116811790915581526001928390529081208054909190613db09084906154ea565b90915550506001600160a01b0381166000818152600460209081526040808320805460018101825590845292829020909201899055815192835282018890527fc9b4ca451786682e5edc5e2cf56b62c05764dfcee7bef9f3cea04bbd0f6676e4910160405180910390a1505050505050565b6000816001600160401b0316613e3781613bbe565b613e535760405162461bcd60e51b8152600401610acc90615121565b6000613e5e846116f0565b9050806001600160a01b0316856001600160a01b03161480613e995750846001600160a01b0316613e8e85610a9b565b6001600160a01b0316145b80613ea95750613ea981866109ab565b95945050505050565b806001600160a01b038416613ec6826116f0565b6001600160a01b031614613f2a5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610acc565b6001600160a01b03831660009081526007602052604090205460ff1615613fab5760405162461bcd60e51b815260206004820152602f60248201527f4d414e414745523a20596f752063616e2774207472616e7366657220746f206260448201526e3630b1b5b634b9ba32b2103ab9b2b960891b6064820152608401610acc565b6001600160a01b03841660009081526007602052604090205460ff161561402c5760405162461bcd60e51b815260206004820152602f60248201527f4d414e414745523a20596f752063616e2774207472616e73666572206173206260448201526e3630b1b5b634b9ba32b2103ab9b2b960891b6064820152608401610acc565b614037600083613be4565b6001600160a01b038416600090815260016020819052604082208054919290916140629084906155b5565b90915550506001600160a01b038316600090815260016020819052604082208054919290916140929084906154ea565b90915550506001600160401b038116600081815260026020908152604080832080546001600160a01b0319166001600160a01b038916908117909155835260048252822080546001810182559083529120018190556140f19085614454565b81836001600160a01b0316856001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a450505050565b6040805180820190915260078152665631204e4f444560c81b6020918201528151908201207f726ca9a11821b08e8b39a0c12fff38e2a582b4c38cfe7da1888136bad2ac4c42141561419c5760405162461bcd60e51b8152600401610acc90614f97565b6000600d5490506141c0818342426040518060200160405280600081525088613c5c565b6001600d60008282546141d391906154ea565b9091555050505050565b60005b8251811015610b81576000600d54905061427b8160405180604001604052806008815260200167496e66696e69746560c01b81525086858151811061423557634e487b7160e01b600052603260045260246000fd5b602002602001015187868151811061425d57634e487b7160e01b600052603260045260246000fd5b60200260200101516040518060200160405280600081525088613c5c565b6001600d600082825461428e91906154ea565b909155508291506142a0905081615629565b9150506141e0565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b816001600160a01b0316836001600160a01b0316141561435a5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610acc565b6001600160a01b03838116600081815260066020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6143d3848484846145be565b6143ef5760405162461bcd60e51b8152600401610acc90615035565b600f5460ff1615156001141561440a57613486848484613eb2565b6001600160a01b038316158061442d57506008546001600160a01b038481169116145b6144495760405162461bcd60e51b8152600401610acc9061520b565b6112b1848484613eb2565b6001600160a01b03811660009081526004602052604081208054909181905b828110156144c3578584828154811061449c57634e487b7160e01b600052603260045260246000fd5b906000526020600020015414156144b1578091505b806144bb81615629565b915050614473565b50825481106144d3575050505050565b826144df6001846155b5565b815481106144fd57634e487b7160e01b600052603260045260246000fd5b906000526020600020015483828154811061452857634e487b7160e01b600052603260045260246000fd5b90600052602060002001819055508280548061455457634e487b7160e01b600052603160045260246000fd5b600190038181906000526020600020016000905590557f4147745ffa5b0a72e6c0f4a4615c47e585cf3af5d94a4440830f9071d2c0d13684866040516145af9291906001600160a01b03929092168252602082015260400190565b60405180910390a15050505050565b60006001600160a01b0384163b156146c057604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290614602903390899088908890600401614ed7565b602060405180830381600087803b15801561461c57600080fd5b505af192505050801561464c575060408051601f3d908101601f1916820190925261464991810190614b77565b60015b6146a6573d80801561467a576040519150601f19603f3d011682016040523d82523d6000602084013e61467f565b606091505b50805161469e5760405162461bcd60e51b8152600401610acc90615035565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506146c4565b5060015b949350505050565b8280546146d8906155f4565b90600052602060002090601f0160209004810192826146fa5760008555614740565b82601f1061471357805160ff1916838001178555614740565b82800160010185558215614740579182015b82811115614740578251825591602001919060010190614725565b5061474c9291506147c4565b5090565b82805461475c906155f4565b90600052602060002090601f01602090048101928261477e5760008555614740565b82601f106147975782800160ff19823516178555614740565b82800160010185558215614740579182015b828111156147405782358255916020019190600101906147a9565b5b8082111561474c57600081556001016147c5565b60006001600160401b038311156147f2576147f2615697565b614805601f8401601f19166020016154ba565b905082815283838301111561481957600080fd5b828260208301376000602084830101529392505050565b600082601f830112614840578081fd5b813560206001600160401b0382111561485b5761485b615697565b8160051b61486a8282016154ba565b838152828101908684018388018501891015614884578687fd5b8693505b858410156148af57803561489b816156e6565b835260019390930192918401918401614888565b50979650505050505050565b60008083601f8401126148cc578182fd5b5081356001600160401b038111156148e2578182fd5b6020830191508360208285010111156148fa57600080fd5b9250929050565b600082601f830112614911578081fd5b611097838335602085016147d9565b600060208284031215614931578081fd5b8135611097816156ad565b60006020828403121561494d578081fd5b8151611097816156ad565b6000806040838503121561496a578081fd5b8235614975816156ad565b91506020830135614985816156ad565b809150509250929050565b6000806000606084860312156149a4578081fd5b83356149af816156ad565b925060208401356149bf816156ad565b929592945050506040919091013590565b600080600080608085870312156149e5578081fd5b84356149f0816156ad565b93506020850135614a00816156ad565b92506040850135915060608501356001600160401b03811115614a21578182fd5b8501601f81018713614a31578182fd5b614a40878235602084016147d9565b91505092959194509250565b60008060408385031215614a5e578182fd5b8235614a69816156ad565b915060208301356001600160401b03811115614a83578182fd5b614a8f85828601614830565b9150509250929050565b60008060408385031215614aab578182fd5b8235614ab6816156ad565b91506020830135614985816156c2565b60008060408385031215614ad8578182fd5b8235614ae3816156ad565b946020939093013593505050565b600060208284031215614b02578081fd5b81356001600160401b03811115614b17578182fd5b6146c484828501614830565b600060208284031215614b34578081fd5b8135611097816156c2565b600060208284031215614b50578081fd5b8151611097816156c2565b600060208284031215614b6c578081fd5b8135611097816156d0565b600060208284031215614b88578081fd5b8151611097816156d0565b600080600080600080600060a0888a031215614bad578485fd5b87356001600160401b0380821115614bc3578687fd5b614bcf8b838c016148bb565b909950975060208a01359150614be4826156e6565b909550604089013590614bf6826156e6565b90945060608901359080821115614c0b578485fd5b50614c188a828b016148bb565b9094509250506080880135614c2c816156ad565b8091505092959891949750929550565b600060208284031215614c4d578081fd5b81356001600160401b03811115614c62578182fd5b6146c484828501614901565b600080600060608486031215614c82578081fd5b83356001600160401b0380821115614c98578283fd5b614ca487838801614901565b94506020860135915080821115614cb9578283fd5b614cc587838801614830565b93506040860135915080821115614cda578283fd5b50614ce786828701614830565b9150509250925092565b600060208284031215614d02578081fd5b5035919050565b600060208284031215614d1a578081fd5b5051919050565b600080600060408486031215614d35578081fd5b8335925060208401356001600160401b03811115614d51578182fd5b614d5d868287016148bb565b9497909650939450505050565b60008060408385031215614d7c578182fd5b8235915060208301356001600160401b03811115614d98578182fd5b614a8f85828601614901565b600080600080600060a08688031215614dbb578283fd5b505083359560208501359550604085013594606081013594506080013592509050565b600060208284031215614def578081fd5b8151611097816156e6565b60008060408385031215614e0c578182fd5b8235614e17816156e6565b915060208301356001600160401b03811115614d98578182fd5b60008060008060808587031215614e46578182fd5b8435614e51816156e6565b93506020850135614e61816156e6565b92506040850135614e71816156e6565b91506060850135614e81816156e6565b939692955090935050565b60008151808452815b81811015614eb157602081850181015186830182015201614e95565b81811115614ec25782602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090614f0a90830184614e8c565b9695505050505050565b6001600160a01b0393841681529190921660208201526001600160401b03909116604082015260600190565b6020808252825182820181905260009190848201906040850190845b81811015614f7857835183529284019291840191600101614f5c565b50909695505050505050565b6020815260006110976020830184614e8c565b60208082526021908201527f4d414e414745523a205631204e4f4445206973207265736572766564206e616d6040820152606560f81b606082015260800190565b60208082526039908201527f48454c5045523a20506c6174696e756d204d656d626572736869702062616c6160408201527f6e636520746f6f206c6f7720666f72206372656174696f6e2e00000000000000606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526027908201527f48454c5045523a20204372656174696f6e2066726f6d20746865207a65726f206040820152666164647265737360c81b606082015260800190565b60208082526033908201527f48454c5045523a20417363656e6420546f6b656e732062616c616e636520746f60408201527237903637bb903337b91031b932b0ba34b7b71760691b606082015260800190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526021908201527f48454c5045523a2045786365656473206d61782077616c6c657420616d6f756e6040820152601d60fa1b606082015260800190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b60208082526022908201527f496e66696e697465205472616e736665727320617265206e6f7420616c6c6f77604082015261195960f21b606082015260800190565b60208082526037908201527f48454c5045523a20417363656e64204d656d626572736869702062616c616e6360408201527f6520746f6f206c6f7720666f72206372656174696f6e2e000000000000000000606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526022908201527f48454c5045523a20414d53204e6f6465732028496e76616c696420616d6f756e604082015261742960f01b606082015260800190565b60208082526022908201527f48454c504552206572726f723a206e6f6465417363656e64546f6b656e507269604082015261636560f01b606082015260800190565b60208082526032908201527f48454c5045523a20506c6174696e756d204d656d62657273686970204e6f6465604082015271732028496e76616c696420616d6f756e742960701b606082015260800190565b602081526000825160a0602084015261546360c0840182614e8c565b90506020840151601f198483030160408501526154808282614e8c565b9150506040840151606084015260608401516001600160401b0380821660808601528060808701511660a086015250508091505092915050565b604051601f8201601f191681016001600160401b03811182821017156154e2576154e2615697565b604052919050565b600082198211156154fd576154fd61566b565b500190565b60006001600160401b038083168185168083038211156155245761552461566b565b01949350505050565b60008261553c5761553c615681565b500490565b60006001600160401b038084168061555b5761555b615681565b92169190910492915050565b60008160001904831182151516156155815761558161566b565b500290565b60006001600160401b03808316818516818304811182151516156155ac576155ac61566b565b02949350505050565b6000828210156155c7576155c761566b565b500390565b60006001600160401b03838116908316818110156155ec576155ec61566b565b039392505050565b600181811c9082168061560857607f821691505b60208210811415610afa57634e487b7160e01b600052602260045260246000fd5b600060001982141561563d5761563d61566b565b5060010190565b60006001600160401b03808316818114156156615761566161566b565b6001019392505050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114613b7a57600080fd5b8015158114613b7a57600080fd5b6001600160e01b031981168114613b7a57600080fd5b6001600160401b0381168114613b7a57600080fdfea264697066735822122053b8d4f2c3a030435743394ca76ea40c6155130dc8cb6a875aea4a58d6f4147264736f6c63430008040033000000000000000000000000fd0c58f03c83d6960bb9dbfd45076d78df2f095d000000000000000000000000c88fff4adf86adc2af20c57df9b3b9eb7d66481600000000000000000000000068d675bdb215f276a666eaf905ddba739021d1b3

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000fd0c58f03c83d6960bb9dbfd45076d78df2f095d000000000000000000000000c88fff4adf86adc2af20c57df9b3b9eb7d66481600000000000000000000000068d675bdb215f276a666eaf905ddba739021d1b3

-----Decoded View---------------
Arg [0] : _ASCEND_TOKEN (address): 0xfd0c58f03c83d6960bb9dbfd45076d78df2f095d
Arg [1] : _ascendMembership (address): 0xc88fff4adf86adc2af20c57df9b3b9eb7d664816
Arg [2] : _amsHelper (address): 0x68d675bdb215f276a666eaf905ddba739021d1b3

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000fd0c58f03c83d6960bb9dbfd45076d78df2f095d
Arg [1] : 000000000000000000000000c88fff4adf86adc2af20c57df9b3b9eb7d664816
Arg [2] : 00000000000000000000000068d675bdb215f276a666eaf905ddba739021d1b3


Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.