Contract 0x5c890fd4e5ad0f01908614a0ae66d4f5a3e16190

 

Contract Overview

Balance:
0.002397976262905197 FTM

FTM Value:
Less Than $0.01 (@ $0.23/FTM)

Token:
Txn Hash Method
Block
From
To
Value [Txn Fee]
0xba9a60c2ee32cfb6233d3978b762006172157d762362f31e02dbfd50d0aeabaaCreate Node481260432022-10-01 0:14:181 hr 3 mins ago0x02299dc5da884a1b5dc1dc76f1034bb1b05b7f22 IN  0x5c890fd4e5ad0f01908614a0ae66d4f5a3e1619093.29187027987561 FTM0.000820442211
0xbbb8a626321b5c846d8cb0146210a9f4b6ecaf8944b8eaaa89ead25c38b42491Claim All481258922022-10-01 0:11:451 hr 5 mins ago0x02299dc5da884a1b5dc1dc76f1034bb1b05b7f22 IN  0x5c890fd4e5ad0f01908614a0ae66d4f5a3e161900.168303911983239 FTM0.00281618625
0xf77d536eb2abca1a3f31513dc0480cf38bb56ee527e0fcfeb5edecb7edb33e8cClaim All481211732022-09-30 22:44:162 hrs 33 mins ago0x7c91a3da70f1244b91efd8aa88b9293f92c19bf8 IN  0x5c890fd4e5ad0f01908614a0ae66d4f5a3e161905.142790602191131 FTM0.0028364875
0x9af0f924eab72fefea81a62e5262e0fe8788d082aafc41a17d9b7227e038fb7aPay Fee481210982022-09-30 22:43:042 hrs 34 mins ago0xc1d361b9ddb2441cc6ca3cd4490ed781df35903f IN  0x5c890fd4e5ad0f01908614a0ae66d4f5a3e1619067.533851844726167 FTM0.00019404
0xbe247ddb0e2f67928e4e6753298916f5538026e77f189aa38f5da17b6022209bPay Fee481207732022-09-30 22:37:152 hrs 40 mins ago0xbbf32b9d5d6814d5dc31a51cb5c1c0e7cfa1920d IN  0x5c890fd4e5ad0f01908614a0ae66d4f5a3e1619090.065298232954518 FTM0.00024255
0xc5b4a3030bc5ba32ae608729febfba7e06b4a70ebdf9682e8de2ac0295e1ea81Pay Fee481207422022-09-30 22:36:432 hrs 40 mins ago0xbbf32b9d5d6814d5dc31a51cb5c1c0e7cfa1920d IN  0x5c890fd4e5ad0f01908614a0ae66d4f5a3e16190112.581622791193147 FTM0.00024255
0x725a40ece559ce3f28668ff26b669bb00f79ee86941fb2a7dd99717fe1eee039Claim All481192802022-09-30 22:09:383 hrs 7 mins ago0xc1d361b9ddb2441cc6ca3cd4490ed781df35903f IN  0x5c890fd4e5ad0f01908614a0ae66d4f5a3e161900.703719811565102 FTM0.001742872
0x09495582271c806a78369559f94e8686fa6f277b2d3aeaa19f66ce79da88f562Claim All481192452022-09-30 22:09:023 hrs 8 mins ago0xc1d361b9ddb2441cc6ca3cd4490ed781df35903f IN  0x5c890fd4e5ad0f01908614a0ae66d4f5a3e161900.848640366137798 FTM0.005020576
0xf169f24cde6fcf974cbad9a893797847aa3130ee78c52076a63b73a453c33e67Claim All481174642022-09-30 21:34:513 hrs 42 mins ago0xc30eaa9bc26bec7355f49e90f3ef53f1420bd9f8 IN  0x5c890fd4e5ad0f01908614a0ae66d4f5a3e161902.023847078465728 FTM0.001924172787
0xfa239421c6545f5a89b34d83860966c4b305a4d90fdd13d6b8e3805fc34ab700Pay Fee481168842022-09-30 21:24:173 hrs 53 mins ago0xf7a38252993e54ce76927b0a03794b606f40106b IN  0x5c890fd4e5ad0f01908614a0ae66d4f5a3e16190112.025440822327961 FTM0.000252334513
0xd073f83255b9d5aee4966957a08d5555c6375e667e8fe57248de5116cca6764fCreate Node481162532022-09-30 21:12:344 hrs 5 mins ago0xf7a38252993e54ce76927b0a03794b606f40106b IN  0x5c890fd4e5ad0f01908614a0ae66d4f5a3e16190116.304829419583517 FTM0.000813148727
0x6c98c48b4704422aad88105ff316f23a2b83dee3f7f92d7591f35feedd7fd7e9Claim All481159352022-09-30 21:06:244 hrs 11 mins ago0xf7a38252993e54ce76927b0a03794b606f40106b IN  0x5c890fd4e5ad0f01908614a0ae66d4f5a3e1619025.148354597254795 FTM0.002009255642
0xfe215b364fce6c27be75ae2a2513a2c389a0e8f0e1d60017012f8939203a610aPay Fee481158712022-09-30 21:05:184 hrs 12 mins ago0xf7a38252993e54ce76927b0a03794b606f40106b IN  0x5c890fd4e5ad0f01908614a0ae66d4f5a3e16190111.824623560673162 FTM0.000335427571
0xc307aa30f2ac64e082006a013b744999bfed1edd61cf1eb5512790940f351b87Pay Fee481158462022-09-30 21:04:424 hrs 12 mins ago0xf7a38252993e54ce76927b0a03794b606f40106b IN  0x5c890fd4e5ad0f01908614a0ae66d4f5a3e1619067.094774136403897 FTM0.000265092264
0x63f0403eb597b607bb171f21c4e6576907c510d4e390cf267e800952813b9a4dClaim All481157352022-09-30 21:02:394 hrs 14 mins ago0xd26849f36b1d263a2974c5a141ff30e38c925636 IN  0x5c890fd4e5ad0f01908614a0ae66d4f5a3e161901.756618706872091 FTM0.007040885514
0xe680a45b900e583d83ad3ab3be80801a74b25c6bcf0644f5ef2e5b5b4c646891Claim All481157082022-09-30 21:02:094 hrs 15 mins ago0xd26849f36b1d263a2974c5a141ff30e38c925636 IN  0x5c890fd4e5ad0f01908614a0ae66d4f5a3e161901.329339750847575 FTM0.006948204318
0xe1a9b9bd6f71390174563f2786359d2cb73859e976d767577533af6b4185148cClaim All481156782022-09-30 21:01:354 hrs 16 mins ago0xd26849f36b1d263a2974c5a141ff30e38c925636 IN  0x5c890fd4e5ad0f01908614a0ae66d4f5a3e161903.793191265021354 FTM0.006872048355
0x1ee41e68c1a6c6ac2500719d1548dc38328d1c115b4763f6f80447be67eeea76Claim All481156562022-09-30 21:01:114 hrs 16 mins ago0xd26849f36b1d263a2974c5a141ff30e38c925636 IN  0x5c890fd4e5ad0f01908614a0ae66d4f5a3e161902.642357706262155 FTM0.002269940631
0x492a2128e52803753ad81c1b73e491131ac42d3a7382c593cfdab4ac816019efClaim All481156402022-09-30 21:00:534 hrs 16 mins ago0xd26849f36b1d263a2974c5a141ff30e38c925636 IN  0x5c890fd4e5ad0f01908614a0ae66d4f5a3e161907.440217789697776 FTM0.006408948399
0xe3c8a774185354ba5e50255e28b0f19684df7f0444eae7234da01aff38d27a6dPay Fee481156352022-09-30 21:00:464 hrs 16 mins ago0xd26849f36b1d263a2974c5a141ff30e38c925636 IN  0x5c890fd4e5ad0f01908614a0ae66d4f5a3e16190111.824623560673162 FTM0.000265092264
0x09e48bbf45d92e8db6acc04dd8267d30e5576576891fef2e14a308c514df882dClaim All481139682022-09-30 20:27:344 hrs 50 mins ago0x62e7f2d286cbd19cf0e2610366c91e2aa4776996 IN  0x5c890fd4e5ad0f01908614a0ae66d4f5a3e161901.425598284168794 FTM0.004329019586
0x04c4ebc76b0974a3268b88d5b3be358b79367e471a632f0208c7f5be97c76a93Pay All481109862022-09-30 19:24:475 hrs 52 mins ago0x6838bc6ad4e7ed985a9a347e8fa0376b1120af67 IN  0x5c890fd4e5ad0f01908614a0ae66d4f5a3e16190131.815237744818793 FTM0.0003497725
0x893bb8c7bd846dc697523a7c70bb1629cc15ad2f868c6cec49f1c6200bafea9ePay Fee481101732022-09-30 19:09:576 hrs 7 mins ago0x3d6f8b05f671ba91f2eb3823bd51132fd90a26c9 IN  0x5c890fd4e5ad0f01908614a0ae66d4f5a3e16190110.891523935002195 FTM0.00024255
0x5da6e585acc1b517b49302a0956fe1f1a591928a3e1b7e09e308820ee742d269Pay Fee481100952022-09-30 19:08:346 hrs 9 mins ago0x3d6f8b05f671ba91f2eb3823bd51132fd90a26c9 IN  0x5c890fd4e5ad0f01908614a0ae66d4f5a3e1619066.619328100762547 FTM0.00024255
0xe5e6a874b609945e41021c8ae4be6668b131e03506e0321dee27841eaf627190Pay Fee481100452022-09-30 19:07:426 hrs 9 mins ago0x3d6f8b05f671ba91f2eb3823bd51132fd90a26c9 IN  0x5c890fd4e5ad0f01908614a0ae66d4f5a3e1619066.619328100762547 FTM0.00024255
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xba9a60c2ee32cfb6233d3978b762006172157d762362f31e02dbfd50d0aeabaa481260432022-10-01 0:14:181 hr 3 mins ago 0x5c890fd4e5ad0f01908614a0ae66d4f5a3e16190 0xf4e33f164b823cb56927f502e8b70b1d60709f9693.291870279875610838 FTM
0xbbb8a626321b5c846d8cb0146210a9f4b6ecaf8944b8eaaa89ead25c38b42491481258922022-10-01 0:11:451 hr 5 mins ago 0x5c890fd4e5ad0f01908614a0ae66d4f5a3e161900x02299dc5da884a1b5dc1dc76f1034bb1b05b7f220.015300355634839934 FTM
0xbbb8a626321b5c846d8cb0146210a9f4b6ecaf8944b8eaaa89ead25c38b42491481258922022-10-01 0:11:451 hr 5 mins ago 0x5c890fd4e5ad0f01908614a0ae66d4f5a3e16190 0xf4e33f164b823cb56927f502e8b70b1d60709f960.05537667235349451 FTM
0xbbb8a626321b5c846d8cb0146210a9f4b6ecaf8944b8eaaa89ead25c38b42491481258922022-10-01 0:11:451 hr 5 mins ago 0x5c890fd4e5ad0f01908614a0ae66d4f5a3e16190 0xf4e33f164b823cb56927f502e8b70b1d60709f960.048345380564596863 FTM
0xbbb8a626321b5c846d8cb0146210a9f4b6ecaf8944b8eaaa89ead25c38b42491481258922022-10-01 0:11:451 hr 5 mins ago 0x5c890fd4e5ad0f01908614a0ae66d4f5a3e16190 0xf4e33f164b823cb56927f502e8b70b1d60709f960.049281503430307968 FTM
0xf77d536eb2abca1a3f31513dc0480cf38bb56ee527e0fcfeb5edecb7edb33e8c481211732022-09-30 22:44:162 hrs 33 mins ago 0x5c890fd4e5ad0f01908614a0ae66d4f5a3e161900x7c91a3da70f1244b91efd8aa88b9293f92c19bf80.467524418381011966 FTM
0xf77d536eb2abca1a3f31513dc0480cf38bb56ee527e0fcfeb5edecb7edb33e8c481211732022-09-30 22:44:162 hrs 33 mins ago 0x5c890fd4e5ad0f01908614a0ae66d4f5a3e16190 0xf4e33f164b823cb56927f502e8b70b1d60709f961.637982243100053402 FTM
0xf77d536eb2abca1a3f31513dc0480cf38bb56ee527e0fcfeb5edecb7edb33e8c481211732022-09-30 22:44:162 hrs 33 mins ago 0x5c890fd4e5ad0f01908614a0ae66d4f5a3e16190 0xf4e33f164b823cb56927f502e8b70b1d60709f960.679468603361875176 FTM
0xf77d536eb2abca1a3f31513dc0480cf38bb56ee527e0fcfeb5edecb7edb33e8c481211732022-09-30 22:44:162 hrs 33 mins ago 0x5c890fd4e5ad0f01908614a0ae66d4f5a3e16190 0xf4e33f164b823cb56927f502e8b70b1d60709f961.051858874611353338 FTM
0xf77d536eb2abca1a3f31513dc0480cf38bb56ee527e0fcfeb5edecb7edb33e8c481211732022-09-30 22:44:162 hrs 33 mins ago 0x5c890fd4e5ad0f01908614a0ae66d4f5a3e16190 0xf4e33f164b823cb56927f502e8b70b1d60709f960.200861974345199571 FTM
0xf77d536eb2abca1a3f31513dc0480cf38bb56ee527e0fcfeb5edecb7edb33e8c481211732022-09-30 22:44:162 hrs 33 mins ago 0x5c890fd4e5ad0f01908614a0ae66d4f5a3e16190 0xf4e33f164b823cb56927f502e8b70b1d60709f960.373053374724789223 FTM
0xf77d536eb2abca1a3f31513dc0480cf38bb56ee527e0fcfeb5edecb7edb33e8c481211732022-09-30 22:44:162 hrs 33 mins ago 0x5c890fd4e5ad0f01908614a0ae66d4f5a3e16190 0xf4e33f164b823cb56927f502e8b70b1d60709f960.366023054951437146 FTM
0xf77d536eb2abca1a3f31513dc0480cf38bb56ee527e0fcfeb5edecb7edb33e8c481211732022-09-30 22:44:162 hrs 33 mins ago 0x5c890fd4e5ad0f01908614a0ae66d4f5a3e16190 0xf4e33f164b823cb56927f502e8b70b1d60709f960.366018058715411789 FTM
0x9af0f924eab72fefea81a62e5262e0fe8788d082aafc41a17d9b7227e038fb7a481210982022-09-30 22:43:042 hrs 34 mins ago 0x5c890fd4e5ad0f01908614a0ae66d4f5a3e161900xc1d361b9ddb2441cc6ca3cd4490ed781df35903f0.668651998462635325 FTM
0x9af0f924eab72fefea81a62e5262e0fe8788d082aafc41a17d9b7227e038fb7a481210982022-09-30 22:43:042 hrs 34 mins ago 0x5c890fd4e5ad0f01908614a0ae66d4f5a3e16190 0xf4e33f164b823cb56927f502e8b70b1d60709f9666.865199846263532513 FTM
0xbe247ddb0e2f67928e4e6753298916f5538026e77f189aa38f5da17b6022209b481207732022-09-30 22:37:152 hrs 40 mins ago 0x5c890fd4e5ad0f01908614a0ae66d4f5a3e161900xbbf32b9d5d6814d5dc31a51cb5c1c0e7cfa1920d0.891735626068856614 FTM
0xbe247ddb0e2f67928e4e6753298916f5538026e77f189aa38f5da17b6022209b481207732022-09-30 22:37:152 hrs 40 mins ago 0x5c890fd4e5ad0f01908614a0ae66d4f5a3e16190 0xf4e33f164b823cb56927f502e8b70b1d60709f9689.173562606885661479 FTM
0xc5b4a3030bc5ba32ae608729febfba7e06b4a70ebdf9682e8de2ac0295e1ea81481207422022-09-30 22:36:432 hrs 40 mins ago 0x5c890fd4e5ad0f01908614a0ae66d4f5a3e161900xbbf32b9d5d6814d5dc31a51cb5c1c0e7cfa1920d1.114669532586070768 FTM
0xc5b4a3030bc5ba32ae608729febfba7e06b4a70ebdf9682e8de2ac0295e1ea81481207422022-09-30 22:36:432 hrs 40 mins ago 0x5c890fd4e5ad0f01908614a0ae66d4f5a3e16190 0xf4e33f164b823cb56927f502e8b70b1d60709f96111.466953258607076849 FTM
0x725a40ece559ce3f28668ff26b669bb00f79ee86941fb2a7dd99717fe1eee039481192802022-09-30 22:09:383 hrs 7 mins ago 0x5c890fd4e5ad0f01908614a0ae66d4f5a3e161900xc1d361b9ddb2441cc6ca3cd4490ed781df35903f0.063973143708715588 FTM
0x725a40ece559ce3f28668ff26b669bb00f79ee86941fb2a7dd99717fe1eee039481192802022-09-30 22:09:383 hrs 7 mins ago 0x5c890fd4e5ad0f01908614a0ae66d4f5a3e16190 0xf4e33f164b823cb56927f502e8b70b1d60709f960.121209535893705467 FTM
0x725a40ece559ce3f28668ff26b669bb00f79ee86941fb2a7dd99717fe1eee039481192802022-09-30 22:09:383 hrs 7 mins ago 0x5c890fd4e5ad0f01908614a0ae66d4f5a3e16190 0xf4e33f164b823cb56927f502e8b70b1d60709f960.115443974786082315 FTM
0x725a40ece559ce3f28668ff26b669bb00f79ee86941fb2a7dd99717fe1eee039481192802022-09-30 22:09:383 hrs 7 mins ago 0x5c890fd4e5ad0f01908614a0ae66d4f5a3e16190 0xf4e33f164b823cb56927f502e8b70b1d60709f960.108120419121118953 FTM
0x725a40ece559ce3f28668ff26b669bb00f79ee86941fb2a7dd99717fe1eee039481192802022-09-30 22:09:383 hrs 7 mins ago 0x5c890fd4e5ad0f01908614a0ae66d4f5a3e16190 0xf4e33f164b823cb56927f502e8b70b1d60709f960.107855490057609799 FTM
0x725a40ece559ce3f28668ff26b669bb00f79ee86941fb2a7dd99717fe1eee039481192802022-09-30 22:09:383 hrs 7 mins ago 0x5c890fd4e5ad0f01908614a0ae66d4f5a3e16190 0xf4e33f164b823cb56927f502e8b70b1d60709f960.095956425444651793 FTM
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ServiceV1

Compiler Version
v0.8.12+commit.f00d7308

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity Standard Json-Input format)

File 1 of 5 : ServiceV1.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.12;

import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol";
import "./Rewards.sol";
import "./Math.sol";

contract ServiceV1 {
  event Claimed(address indexed entity, uint reward);
  event Paid(address indexed entity, uint nodeType, uint nodeId, uint upToBlockNumber);
  event Created(address indexed entity, uint nodeId, uint blockNumber, uint nodeType, bool addToNodePool, uint paidOn);
  event RegisteredWithConnect(address indexed entity, bytes nodeId, uint nodeType);
  event DeregisteredWithConnect(address indexed entity, bytes nodeId, uint nodeType);

  mapping(address => mapping(uint => uint)) public entityNodeTypeCount;

  mapping(uint => bool) public nodeTypeActive;
  mapping(bytes => uint) public entityNodeIdType;
  mapping(bytes => uint) public entityNodePaidOnBlock;
  mapping(bytes => uint) public entityNodeClaimedOnBlock;
  mapping(bytes => uint) public entityNodeAddedToPoolOnBlock;
  mapping(bytes => uint) public entityNodeCreatedAt;  
  mapping(bytes => uint) public entityNodeLastClaimedAt;
  mapping(uint => uint) public nodeTypeLimit;
  mapping(uint => uint) public nodeTypeCreationFee;
  mapping(uint => uint) public nodeTypeBaseRewardRate;
  mapping(uint => uint) public nodeTypeDecayFactor;
  mapping(uint => uint) public nodeTypeRecurringPaymentCycle;
  mapping(uint => uint) public nodeTypeRecurringFee;
  mapping(uint => uint) public nodeTypeNodeifyFee;
  mapping(uint => uint) public nodeTypePoolRewardNumerator;
  mapping(uint => uint) public nodeTypePoolRewardDenominator;
  mapping(uint => uint) public nodeTypeClaimingFeeNumerator;
  mapping(uint => uint) public nodeTypeClaimingFeeDenominator;
  mapping(uint => uint) public nodeTypeGracePeriod;

  uint private constant _SECONDS_IN_ONE_MINUTE = 60;

  mapping(address => bool) public isPresaleWallet;

  struct MetalRewardsEarnedOn {
    uint bronze;
    uint silver;
    uint gold;
  }

  mapping(address => MetalRewardsEarnedOn) public metalBlockMap;
  mapping(address => uint128) public entityNodeCount;
  mapping(address => bool) public isDenied;

  AggregatorV3Interface internal priceFeed;

  IERC20 public nodeifyToken;
  bool public isPresaleActive;
  bool public isPublicLaunchActive;
  address public owner;
  address public superOwner;
  address public feeCollectorAddress;
  uint128 public totalNodeTypesAvailable = 4;
  uint128 public maxPaymentPeriods = 2;
  uint128 public maxNodeCount = 100;
  uint128 public bronzeNodeAmount = 1;
  uint128 public silverNodeAmount = 5;
  uint128 public goldNodeAmount = 10;
  uint public totalNodesCreated;
  uint public priceFeedOverride;
  uint public rewardBalance;
  uint public totalPooledNodes;
  uint public poolLockInBlocks = 1000000;
  uint public poolRemovalFee = 1500000000000000000000000000;
  uint public bronzeReward = 200000000000 wei;
  uint public silverReward = 400000000000 wei;
  uint public goldReward = 600000000000 wei;
  uint public rewardPercentageSentToFeeCollector = 3000;
  uint public presaleRequestingFee = 48000000000000000000000000000;

  constructor(
    address _nodeifyTokenAddress,
    address _owner,
    address _feeCollectorAddress,
    address _priceFeedAddress,
    address _superOwner
    ) {
    nodeifyToken = IERC20(_nodeifyTokenAddress);
    owner = _owner;
    superOwner = _superOwner;
    feeCollectorAddress = _feeCollectorAddress;
    priceFeed = AggregatorV3Interface(_priceFeedAddress);
    isPublicLaunchActive = false;
    isPresaleActive = false;
    init();
  }

  modifier onlySuperOwner {
    require(msg.sender == superOwner, "Not Super Owner");
    _;
  }

  modifier onlyOwner {
    require(msg.sender == owner, "Not Owner");
    _;
  }

  function updateOwner(address _newOwner) public onlySuperOwner {
    require(_newOwner != address(0), "zero address");
    owner = _newOwner;
  }

  function updateFeeCollector(address _newFeeCollector) public onlyOwner {
    require(_newFeeCollector != address(0), "zero address");
    feeCollectorAddress = _newFeeCollector;
  }

  // Sets
  function setPresaleWallet(address _presaleWallet, bool _active) public onlyOwner {
    require(_presaleWallet != address(0), "zero address");
    isPresaleWallet[_presaleWallet] = _active;
  }

  function setNodesLimit(uint _nodeType, uint _amount) public onlyOwner {
    nodeTypeLimit[_nodeType] = _amount;
  }

  function setTotalNodeTypesAvailable(uint128 _totalNodeTypesAvailable) public onlyOwner {
    totalNodeTypesAvailable = _totalNodeTypesAvailable;
  }

  function setBronzeRewardValue(uint _reward) public onlyOwner {
    bronzeReward = _reward;
  }

  function setSilverRewardValue(uint _reward) public onlyOwner {
    silverReward = _reward;
  }

  function setGoldRewardValue(uint _reward) public onlyOwner {
    goldReward = _reward;
  }

  function setClaimingFeeNumerator(uint _nodeType, uint _value) public onlyOwner {
    nodeTypeClaimingFeeNumerator[_nodeType] = _value;
  }

  function setClaimingFeeDenominator(uint _nodeType, uint _value) public onlyOwner {
    require(_value > 0, "invalid");
    nodeTypeClaimingFeeDenominator[_nodeType] = _value;
  }

  function setNodeTypeActive(uint _nodeType, bool _active) public onlyOwner {
    nodeTypeActive[_nodeType] = _active;
  }

  function setNodeifyFee(uint _nodeType, uint _value) public onlyOwner {
    nodeTypeNodeifyFee[_nodeType] = _value;
  }

  function setNodeTypeRecurringFee(uint _nodeType, uint _value) public onlyOwner {
    nodeTypeRecurringFee[_nodeType] = _value;
  }

  function setRecurringPaymentCycle(uint _nodeType, uint _value) public onlyOwner {
    nodeTypeRecurringPaymentCycle[_nodeType] = _value;
  }

  function setDecayFactor(uint _nodeType, uint _value) public onlyOwner {
    nodeTypeDecayFactor[_nodeType] = _value;
  }

  function setBaseRewardRate(uint _nodeType, uint _value) public onlyOwner {
    nodeTypeBaseRewardRate[_nodeType] = _value;
  }

  function setCreatingFee(uint _nodeType, uint _value) public onlyOwner {
    nodeTypeCreationFee[_nodeType] = _value;
  }

  function setPriceFeedOverride(uint _value) public onlyOwner {
    priceFeedOverride = _value;
  }

  function setPresaleCreationFee(uint _fee) public onlyOwner {
    presaleRequestingFee = _fee;
  }

  function setPublicLaunchIsActive(bool _value) public onlyOwner {
    isPublicLaunchActive = _value;
  }

  function setPresaleIsActive(bool _value) public onlyOwner {
    isPresaleActive = _value;
  }

  function setMaxPaymentPeriods(uint128 _maxPaymentPeriods) public onlyOwner {  
    maxPaymentPeriods = _maxPaymentPeriods;
  }
  
  function setPoolRemovalFee(uint _fee) public onlyOwner {
    require(_fee > 0, "invalid amount");
    poolRemovalFee = _fee;
  }

  function setPoolLockInBlocks(uint _blocks) public onlyOwner {  
    poolLockInBlocks = _blocks;
  }

  function setGracePeriodInBlocks(uint _nodeType, uint _blocks) public onlyOwner { 
    nodeTypeGracePeriod[_nodeType] = _blocks;
  }

  function setNodeTypePoolRewardNumerator(uint _nodeType, uint128 _numerator) public onlyOwner {
    nodeTypePoolRewardNumerator[_nodeType] = _numerator;
  }

  function setNodeTypePoolRewardDenominator(uint _nodeType, uint128 _denominator) public onlyOwner {
    require(_denominator > 0, "invalid");
    nodeTypePoolRewardDenominator[_nodeType] = _denominator;
  }

  function setMaxNodeAmount(uint128 _maxNodeCount) public onlyOwner {  
    maxNodeCount = _maxNodeCount;
  }

  function setBronzeNodeAmount(uint128 _amount) public onlyOwner {  
    bronzeNodeAmount = _amount;
  }

  function setSilverNodeAmount(uint128 _amount) public onlyOwner {  
    silverNodeAmount = _amount;
  }

  function setGoldNodeAmount(uint128 _amount) public onlyOwner {  
    goldNodeAmount = _amount;
  }

  function setRewardPercentageSentToFeeCollector(uint _rewardPercentageSentToFeeCollector) public onlyOwner {
    rewardPercentageSentToFeeCollector = _rewardPercentageSentToFeeCollector;
  }

  function setDenied(address _account, bool _value) external onlyOwner {
      isDenied[_account] = _value;
  }

  // Internal setters
  function _setBronzeRewardBlock(address _entity, uint _blockNumber) internal {
      MetalRewardsEarnedOn storage m = metalBlockMap[_entity];
      m.bronze = _blockNumber;
  }

  function _setSilverRewardBlock(address _entity, uint _blockNumber) internal {
      MetalRewardsEarnedOn storage m = metalBlockMap[_entity];
      m.silver = _blockNumber;
  }

  function _setGoldRewardBlock(address _entity, uint _blockNumber) internal {
      MetalRewardsEarnedOn storage m = metalBlockMap[_entity];
      m.gold = _blockNumber;
  }

  // Getters
  function getNodeTypePoolRewardNumerator(uint _nodeType) public view returns (uint) {
    return nodeTypePoolRewardNumerator[_nodeType];
  }

  function getNodeClaimingFee(address _entity, uint _nodeId, uint _timestamp) external view returns (uint) {
    uint nodeType = entityNodeIdType[getNodeId(_entity, _nodeId)];
    uint reward = getRewardAt(_entity, _nodeId, _timestamp);
    return reward * getClaimingFeeNumerator(nodeType) / getClaimingFeeDenominator(nodeType);
  }

  function getRewardAll(address _entity, uint _timestamp) public view returns (uint) {
    uint rewardsAll = 0;

    for (uint128 i = 1; i <= entityNodeCount[_entity]; i++) {
      rewardsAll = rewardsAll + getRewardAt(_entity, i, _timestamp > 0 ? _timestamp : block.timestamp);
    }

    return rewardsAll;
  }

  function getFtmPrice() public view returns (int) {
      (
          ,
          int price,
          ,
          ,
          
      ) = priceFeed.latestRoundData();
      return price;
  }

  function getNodesLimit(uint _nodeType) public view returns (uint) {
    return nodeTypeLimit[_nodeType];
  }

  function getEntityNodeTypeCount(uint _nodeType, address _entity) public view returns (uint) {
    return entityNodeTypeCount[_entity][_nodeType];
  }
  
  function getRecurringPaymentCycle(uint _nodeType) public view  returns (uint) {
    return nodeTypeRecurringPaymentCycle[_nodeType];
  }

  function _determineEarnedChip(address _entity) internal {
    uint _bronzeReward;
    uint _silverReward;
    uint _goldReward;
    for (uint index = 1; index <= totalNodeTypesAvailable; index++) {
      uint entityNodeType = getEntityNodeTypeCount(index, _entity);
      if (entityNodeType >= bronzeNodeAmount) {
        _bronzeReward = _bronzeReward + bronzeNodeAmount;
      }
      if (entityNodeType >= silverNodeAmount) {
        _silverReward = _silverReward + silverNodeAmount;
      }
      if (entityNodeType >= goldNodeAmount) {
        _goldReward = _goldReward + goldNodeAmount;
      }
    }
    MetalRewardsEarnedOn storage m = metalBlockMap[_entity];
    if (_bronzeReward >= bronzeNodeAmount * totalNodeTypesAvailable && m.bronze == 0) {
      _setBronzeRewardBlock(_entity, block.number);
    }
    if (_silverReward >= silverNodeAmount * totalNodeTypesAvailable && m.silver == 0) {
      _setSilverRewardBlock(_entity, block.number);
    }
    if (_goldReward >= goldNodeAmount * totalNodeTypesAvailable && m.gold == 0) {
      _setGoldRewardBlock(_entity, block.number);
    }
  }

  function getClaimingFeeNumerator(uint _nodeType) public view returns (uint) {
    return nodeTypeClaimingFeeNumerator[_nodeType];
  }

  function getClaimingFeeDenominator(uint _nodeType) public view returns (uint) {
    return nodeTypeClaimingFeeDenominator[_nodeType];
  }

  function getNodeifyFee(uint _nodeType) public view returns (uint) {
    return nodeTypeNodeifyFee[_nodeType];
  }

  function getNodeTypeRecurringFee(uint _nodeType) public view returns (uint) {
    return nodeTypeRecurringFee[_nodeType];
  }

  function getDecayFactor(uint _nodeType) public view returns (uint) {
    return nodeTypeDecayFactor[_nodeType];
  }

  function getGracePeriod(uint _nodeType) public view returns (uint) {
    return nodeTypeGracePeriod[_nodeType];
  }

  function getBaseRewardRate(uint _nodeType) public view returns (uint) {
    return nodeTypeBaseRewardRate[_nodeType];
  }

  function getCreatingFee(uint _nodeType) public view returns (uint) {
    return nodeTypeCreationFee[_nodeType];
  }

  function getNodeReward(address _entity, uint _nodeId) external view returns (uint) {
    return getRewardAt(_entity, _nodeId, block.timestamp);
  }

  function getNodePaidOn(address _entity, uint _nodeId) public view returns (uint) {
    bytes memory id = getNodeId(_entity, _nodeId);
    return entityNodePaidOnBlock[id];
  }

  function getNodeType(address _entity, uint _nodeId) public view returns (uint) {
    return entityNodeIdType[getNodeId(_entity, _nodeId)];
  }

  function getNodesRecurringFee(address _entity, uint _fromNode, uint _toNode) external view returns (uint) {
    uint fee = 0;
    uint fromNode = _fromNode > 0 ? _fromNode : 1;
    uint toNode = _toNode > 0 ? _toNode : entityNodeCount[_entity];

    for (uint nodeId = fromNode; nodeId <= toNode; nodeId++) {
      if (canBePaid(_entity, nodeId)) fee = fee + getNodeTypeRecurringFee(getNodeType(_entity, nodeId));
    }

    return fee;
  }

  function getNodesClaimingFee(address _entity, uint _timestamp, uint _fromNode, uint _toNode) external view returns (uint) {
    uint fee = 0;
    uint fromNode = _fromNode > 0 ? _fromNode : 1;
    uint toNode = _toNode > 0 ? _toNode : entityNodeCount[_entity];

    for (uint nodeId = fromNode; nodeId <= toNode; nodeId++) {
      uint reward = getRewardAt(_entity, nodeId, _timestamp > 0 ? _timestamp : block.timestamp);
      if (reward > 0) {
        uint nodeType = getNodeType(_entity, nodeId);
        fee = fee + reward * getClaimingFeeNumerator(nodeType) / getClaimingFeeDenominator(nodeType);
      }
    }

    return fee;
  }

  function getNodeId(address _entity, uint _nodeId) public view returns (bytes memory) {
    uint id = _nodeId != 0 ? _nodeId : entityNodeCount[_entity] + 1;
    return abi.encodePacked(_entity, id);
  }

  function getRewardAt(address _entity, uint _nodeId, uint _timestamp) public view returns (uint) {
    bytes memory id = getNodeId(_entity, _nodeId);
    uint lastClaimedAt = entityNodeLastClaimedAt[id] != 0 ? entityNodeLastClaimedAt[id] : entityNodeCreatedAt[id];
    uint registeredAt = entityNodeCreatedAt[id];
    if (_timestamp <= registeredAt) return 0;
    if (!doesNodeExist(_entity, _nodeId)) return 0;
    if (hasNodeExpired(_entity, _nodeId)) return 0;
    if (_timestamp > block.timestamp) return 0;
    if (_timestamp <= lastClaimedAt) return 0;
  
    uint nodeType = entityNodeIdType[id];
    uint blockLastClaimedOn = entityNodeClaimedOnBlock[id] != 0 ? entityNodeClaimedOnBlock[id] : entityNodePaidOnBlock[id];
    uint minutesTotal = (_timestamp - registeredAt) / _SECONDS_IN_ONE_MINUTE;

    uint baseRewardRate = getBaseRewardRate(nodeType);
    uint decayFactor = getDecayFactor(nodeType);

    uint reward = calcDecayedReward(
      baseRewardRate,
      decayFactor,
      minutesTotal
    );

    if (lastClaimedAt > 0) {
      uint minutesToLastClaim = (lastClaimedAt - registeredAt) / _SECONDS_IN_ONE_MINUTE;
      uint rewardAtLastClaim = calcDecayedReward(baseRewardRate, decayFactor, minutesToLastClaim);
      reward = reward - rewardAtLastClaim;
    }

    if (entityNodeAddedToPoolOnBlock[id] > 0) {
      uint cReward = rewards.calculateConnectReward(reward, nodeTypePoolRewardNumerator[nodeType], nodeTypePoolRewardDenominator[nodeType]);
      reward = reward + cReward;
    }
    uint bonus = _determineMetalReward(block.number, _entity, blockLastClaimedOn);
    return reward + bonus;
  }

  // Checks
  function canBeRemoveNodeFromPool(uint _nodeId) public view returns (bool) {
    bytes memory id = getNodeId(msg.sender, _nodeId);
    if (block.number > entityNodeAddedToPoolOnBlock[id] + poolLockInBlocks) return true;
    return false;
  }

  function canBePaid(address _entity, uint _nodeId) public view returns (bool) {
    return doesNodeExist(_entity, _nodeId) && !hasNodeExpired(_entity, _nodeId) && !hasMaxPayments(_entity, _nodeId);
  }

  function doesNodeExist(address _entity, uint _nodeId) public view returns (bool) {
    bytes memory id = getNodeId(_entity, _nodeId);
    return entityNodePaidOnBlock[id] > 0;
  }

  function hasNodeExpired(address _entity, uint _nodeId) public view returns (bool) {
    bytes memory id = getNodeId(_entity, _nodeId);
    uint nodeType = entityNodeIdType[id];
    uint blockLastPaidOn = entityNodePaidOnBlock[id];

    if (doesNodeExist(_entity, _nodeId) == false) return true;
    uint recurringPaymentCycle = getRecurringPaymentCycle(nodeType);
    return block.number > blockLastPaidOn + recurringPaymentCycle + getGracePeriod(nodeType);
  }

  function isNodePastDue(address _entity, uint _nodeId) public view returns (bool) {
    bytes memory id = getNodeId(_entity, _nodeId);
    uint nodeType = entityNodeIdType[id];
    uint blockLastPaidOn = entityNodePaidOnBlock[id];

    uint recurringPaymentCycle = getRecurringPaymentCycle(nodeType);
    return block.number > blockLastPaidOn + recurringPaymentCycle;
  }

  function hasMaxPayments(address _entity, uint _nodeId) public view returns (bool) {
    bytes memory id = getNodeId(_entity, _nodeId);
    uint nodeType = entityNodeIdType[id];
    uint blockLastPaidOn = entityNodePaidOnBlock[id];
    uint recurringPaymentCycleInBlocks = getRecurringPaymentCycle(nodeType);
    uint limit = block.number + (recurringPaymentCycleInBlocks * maxPaymentPeriods);

    return blockLastPaidOn + recurringPaymentCycleInBlocks >= limit;
  }

  function isNodeInPool(address _entity, uint _nodeId) public view returns(bool) {
    bytes memory id = getNodeId(_entity, _nodeId);
    return entityNodeAddedToPoolOnBlock[id] > 0;
  }

  // Actions
  function createPresaleNode(bool _addToNodePool, uint _nodeType) public payable {
    require(!isPublicLaunchActive, "public launch is active");
    require(isPresaleActive, "presale not active");
    require(isPresaleWallet[msg.sender], "not part of presale");
    require(entityNodeCount[msg.sender] < 2, "maxed nodes for presale");
    require(msg.sender != address(0), "zero address");
    require(!isDenied[msg.sender], "not allowed");
    require(nodeTypeActive[_nodeType], "invalid type");

    uint nodeId = entityNodeCount[msg.sender] + 1;
    bytes memory id = getNodeId(msg.sender, nodeId);

    entityNodePaidOnBlock[id] = block.number;
    entityNodeClaimedOnBlock[id] = block.number;
    entityNodeCount[msg.sender] = entityNodeCount[msg.sender] + 1;
    entityNodeCreatedAt[id] = block.timestamp;
    entityNodeTypeCount[msg.sender][_nodeType] = entityNodeTypeCount[msg.sender][_nodeType] + 1;
    entityNodeIdType[id] = _nodeType;
    _determineEarnedChip(msg.sender);

    uint recurringPaymentCycleInBlocks = getRecurringPaymentCycle(_nodeType);
    if (_addToNodePool) {
      entityNodeAddedToPoolOnBlock[id] = block.number;
      totalPooledNodes = totalPooledNodes + 1;
    } else {
      entityNodeAddedToPoolOnBlock[id] = 0;
    }

    uint rFee = _determineFee(presaleRequestingFee);
    require(msg.value >= rFee, "invalid fee");

    totalNodesCreated = totalNodesCreated + 1;
    emit Created(msg.sender, nodeId, block.number, _nodeType, _addToNodePool, entityNodePaidOnBlock[id] + recurringPaymentCycleInBlocks);

    _sendValue(payable(feeCollectorAddress), msg.value);
  }

  function createNode(bool _addToNodePool, uint _nodeType) public payable {
      require(isPublicLaunchActive, "public launch not active");
      require(entityNodeCount[msg.sender] < maxNodeCount, "limit reached");
      require(msg.sender != address(0), "zero address");
      require(!isDenied[msg.sender], "not allowed");
      require(nodeTypeActive[_nodeType], "invalid type");

      uint nFee = getNodeifyFee(_nodeType);
      require(nodeifyToken.balanceOf(msg.sender) >= nFee, "too low tokens");
    
      uint _nodeTypeLimit = getNodesLimit(_nodeType);
      require(_nodeTypeLimit == 0 || getEntityNodeTypeCount(_nodeType, msg.sender) < _nodeTypeLimit, "over limit");

      uint nodeId = entityNodeCount[msg.sender] + 1;
      bytes memory id = getNodeId(msg.sender, nodeId);

      entityNodePaidOnBlock[id] = block.number;
      entityNodeClaimedOnBlock[id] = block.number;
      entityNodeCount[msg.sender] = entityNodeCount[msg.sender] + 1;
      entityNodeCreatedAt[id] = block.timestamp;
      entityNodeTypeCount[msg.sender][_nodeType] = entityNodeTypeCount[msg.sender][_nodeType] + 1;
      entityNodeIdType[id] = _nodeType;
      _determineEarnedChip(msg.sender);

      if (_addToNodePool) {
        entityNodeAddedToPoolOnBlock[id] = block.number;
        totalPooledNodes = totalPooledNodes + 1;
      } else {
        entityNodeAddedToPoolOnBlock[id] = 0;
      }

      uint fee = getCreatingFee(_nodeType);
      uint rFee = _determineFee(fee);

      require(msg.value >= rFee, "invalid fee");
      totalNodesCreated = totalNodesCreated + 1;

      uint paymentCycle = getRecurringPaymentCycle(_nodeType);

      uint takeNDFI = nFee * rewardPercentageSentToFeeCollector / 10000;

      require(nodeifyToken.transferFrom(msg.sender, feeCollectorAddress, takeNDFI), "transfer failed");
      if (nFee > takeNDFI) {
        require(nodeifyToken.transferFrom(msg.sender, address(this), nFee - takeNDFI), "transfer failed");
      }
      emit Created(msg.sender, nodeId, block.number, _nodeType, _addToNodePool, entityNodePaidOnBlock[id] + paymentCycle);

      _sendValue(payable(feeCollectorAddress), msg.value);
  }

  function createNodeForEntity(bool _addToNodePool, uint _nodeType, address _entity) external onlyOwner {
      require(entityNodeCount[_entity] < maxNodeCount, "limit reached");
      require(_entity != address(0), "zero address");
      require(!isDenied[_entity], "not allowed");
      require(nodeTypeActive[_nodeType], "invalid type");

      uint _nodeTypeLimit = getNodesLimit(_nodeType);
      require(_nodeTypeLimit == 0 || getEntityNodeTypeCount(_nodeType, _entity) < _nodeTypeLimit, "over limit");

      uint nodeId = entityNodeCount[_entity] + 1;
      bytes memory id = getNodeId(_entity, nodeId);

      entityNodePaidOnBlock[id] = block.number;
      entityNodeClaimedOnBlock[id] = block.number;
      entityNodeCount[_entity] = entityNodeCount[_entity] + 1;
      entityNodeCreatedAt[id] = block.timestamp;
      entityNodeTypeCount[_entity][_nodeType] = entityNodeTypeCount[_entity][_nodeType] + 1;
      entityNodeIdType[id] = _nodeType;
      _determineEarnedChip(_entity);

      if (_addToNodePool) {
        entityNodeAddedToPoolOnBlock[id] = block.number;
        totalPooledNodes = totalPooledNodes + 1;
      } else {
        entityNodeAddedToPoolOnBlock[id] = 0;
      }

      totalNodesCreated = totalNodesCreated + 1;
      uint paymentCycle = getRecurringPaymentCycle(_nodeType);

      emit Created(_entity, nodeId, block.number, _nodeType, _addToNodePool, entityNodePaidOnBlock[id] + paymentCycle);
  }

  function addNodeToPool(uint _nodeId, uint _timestamp) external payable makesInternalCalls {
    bytes memory id = getNodeId(msg.sender, _nodeId);
    require(entityNodeAddedToPoolOnBlock[id] == 0, "already in pool" ); 

    uint reward = getRewardAt(msg.sender, _nodeId, _timestamp);
    if (reward > 0) {
      claim(_nodeId, _timestamp);
    }

    entityNodeAddedToPoolOnBlock[id] = block.number;
    totalPooledNodes = totalPooledNodes + 1;
    emit RegisteredWithConnect(msg.sender, id, entityNodeIdType[id]);
  }

  function removeNodeFromPool(uint _nodeId, uint _timestamp) external payable makesInternalCalls {
    bytes memory id = getNodeId(msg.sender, _nodeId);
    require(_timestamp <= block.timestamp, "bad timestamp");
    require(canBeRemoveNodeFromPool(_nodeId), "cannot be removed yet");
    require(entityNodeAddedToPoolOnBlock[id] > 0, "not in pool");

    uint reward = getRewardAt(msg.sender, _nodeId, _timestamp);
    uint fee;
    if (reward > 0) {
      fee = claim(_nodeId, _timestamp);
    }

    uint rFee = _determineFee(poolRemovalFee);
    require(msg.value >= rFee, "invalid fee");
    entityNodeAddedToPoolOnBlock[id] = 0;
    if (totalPooledNodes > 0) {
      totalPooledNodes = totalPooledNodes - 1;
    }

    emit DeregisteredWithConnect(msg.sender, id, entityNodeIdType[id]);

    _sendValue(payable(feeCollectorAddress), rFee);
    if (isUserCall() && msg.value > rFee) _sendValue(payable(msg.sender), msg.value - rFee);
  }

  function _sendValue(address payable _recipient, uint _amount) internal {
    require(address(this).balance >= _amount, "insufficient balance");
    
    // solhint-disable-next-line avoid-low-level-calls, a void-call-value
    (bool success,) = _recipient.call{value : _amount}("");
    require(success, "send failed");
  }

  function claimAll(uint _timestamp, uint _fromNode, uint _toNode) external payable makesInternalCalls {
    require(entityNodeCount[msg.sender] > 0, "no nodes");

    uint valueLeft = msg.value;
    uint fromNode = _fromNode > 0 ? _fromNode : 1;
    uint toNode = _toNode > 0 ? _toNode : entityNodeCount[msg.sender];

    for (uint nodeId = fromNode; nodeId <= toNode; nodeId++) {
      uint reward = getRewardAt(msg.sender, nodeId, _timestamp);

      if (reward > 0) {
        require(valueLeft > 0, "not enough");
        uint paid = claim(nodeId, _timestamp);
        valueLeft = valueLeft - paid;
      }
    }
    if (valueLeft > 0) _sendValue(payable(msg.sender), valueLeft);

  }

  function deposit(uint _amount) public onlyOwner {
    nodeifyToken.transferFrom(msg.sender, address(this), _amount);
    rewardBalance = rewardBalance + _amount;
  }

  function withdraw(address _destination, uint _amount) public onlyOwner {
    require(rewardBalance >= _amount, "not enough");
    rewardBalance = rewardBalance - _amount;
    nodeifyToken.transfer(_destination, _amount);
  }

  function claim(uint _nodeId, uint _timestamp) public payable returns (uint) {
    bytes memory id = getNodeId(msg.sender, _nodeId);
    uint nodeType = entityNodeIdType[id];
    uint blockLastClaimedOn = entityNodeClaimedOnBlock[id] != 0 ? entityNodeClaimedOnBlock[id] : entityNodeClaimedOnBlock[id];
    uint lastClaimedAt = entityNodeLastClaimedAt[id] != 0 ? entityNodeLastClaimedAt[id] : entityNodeCreatedAt[id];

    require(doesNodeExist(msg.sender, _nodeId), "doesnt exist");
    require(!hasNodeExpired(msg.sender, _nodeId), "node expired");
    require(!isNodePastDue(msg.sender, _nodeId), "past due");
    require(blockLastClaimedOn != 0, "never claimed");
    require(!isDenied[msg.sender], "not allowed");
    require(_timestamp <= block.timestamp, "bad timestamp");
    require(lastClaimedAt + 1200 < _timestamp, "too soon");

    uint reward = getRewardAt(msg.sender, _nodeId, _timestamp);
    require(reward > 0, "no reward");

    uint fee = reward * getClaimingFeeNumerator(nodeType) / getClaimingFeeDenominator(nodeType);
    require(msg.value >= fee, "invalid fee");
    require(rewardBalance > reward, "no rewards");

    rewardBalance = rewardBalance - reward;
    entityNodeLastClaimedAt[id] = _timestamp;
    entityNodeClaimedOnBlock[id] = block.number;
    emit Claimed(msg.sender, reward);

    require(nodeifyToken.transfer(msg.sender, reward), "transfer failed");

    _sendValue(payable(feeCollectorAddress), fee);
    if (isUserCall() && msg.value > fee) _sendValue(payable(msg.sender), msg.value - fee);

    return fee;
  }

  function _determineFee(uint _fee) internal view returns (uint) {
    if (priceFeedOverride > 0) {
      return _fee / priceFeedOverride;
    }
    int256 ftmPrice = getFtmPrice();
    return _fee / uint(ftmPrice);
  }

  function payAll(uint _fromNode, uint _toNode) external payable makesInternalCalls {
    require(entityNodeCount[msg.sender] > 0, "no nodes");

    uint valueLeft = msg.value;
    uint fromNode = _fromNode > 0 ? _fromNode : 1;
    uint toNode = _toNode > 0 ? _toNode : entityNodeCount[msg.sender];

    for (uint nodeId = fromNode; nodeId <= toNode; nodeId++) {
      if (!canBePaid(msg.sender, nodeId)) continue;
      require(valueLeft > 0, "not enough");
      uint paid = payFee(nodeId);
      valueLeft = valueLeft - paid;
    }

    if (valueLeft > 0) _sendValue(payable(msg.sender), valueLeft);
  }

  function payFee(uint _nodeId) public payable returns (uint) {
    bytes memory id = getNodeId(msg.sender, _nodeId);
    require(canBePaid(msg.sender, _nodeId), "cant pay");

    uint nodeType = entityNodeIdType[id];
    uint fee = getNodeTypeRecurringFee(nodeType);
    uint mFee = _determineFee(fee);

    require(msg.value >= mFee, "invalid fee");

    entityNodePaidOnBlock[id] = entityNodePaidOnBlock[id] + getRecurringPaymentCycle(nodeType);

    emit Paid(msg.sender, nodeType, _nodeId, entityNodePaidOnBlock[id]);

    _sendValue(payable(feeCollectorAddress), mFee);
    if (isUserCall() && msg.value > mFee) _sendValue(payable(msg.sender), msg.value - mFee);

    return mFee;
  }

  function calcDecayedReward(uint _baseRate, uint _decayFactor, uint _minutesPassed) public pure returns (uint) {
    uint power = math._decPow(_decayFactor, _minutesPassed);
    uint cumulativeFraction = math.DECIMAL_PRECISION - power;

    return _baseRate * cumulativeFraction / math.DECIMAL_PRECISION;
  }

  function _determineMetalReward(uint _blockNumber, address _entity, uint _blockLastClaimedOn) internal view returns (uint) {
    uint bronze = rewards.metalRewardAddition(_blockNumber, metalBlockMap[_entity].bronze, bronzeReward, _blockLastClaimedOn);
    uint silver = rewards.metalRewardAddition(_blockNumber, metalBlockMap[_entity].silver, silverReward, _blockLastClaimedOn);
    uint gold = rewards.metalRewardAddition(_blockNumber, metalBlockMap[_entity].gold, goldReward, _blockLastClaimedOn);

    uint bonus = (bronze + silver + gold) / entityNodeCount[_entity];
    return bonus;
  }

  // Status
  uint private constant _NOT_MAKING_INTERNAL_CALLS = 1;
  uint private constant _MAKING_INTERNAL_CALLS = 2;
  uint private _internal_calls_status;

  modifier makesInternalCalls() {
    _internal_calls_status = _MAKING_INTERNAL_CALLS;
    _;
    _internal_calls_status = _NOT_MAKING_INTERNAL_CALLS;
  }

  function init() internal {
    _internal_calls_status = _NOT_MAKING_INTERNAL_CALLS;
  }

  function isInternalCall() internal view returns (bool) {
    return _internal_calls_status == _MAKING_INTERNAL_CALLS;
  }

  function _msgSender() internal view virtual returns (address) {
      return msg.sender;
  }

  function isContractCall() internal view returns (bool) {
    return _msgSender() != tx.origin;
  }

  function isUserCall() internal view returns (bool) {
    return !isInternalCall() && !isContractCall();
  }

}

File 2 of 5 : IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (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 `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, 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 `sender` to `recipient` 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 sender,
        address recipient,
        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);
}

File 3 of 5 : AggregatorV3Interface.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface AggregatorV3Interface {
  function decimals() external view returns (uint8);

  function description() external view returns (string memory);

  function version() external view returns (uint256);

  // getRoundData and latestRoundData should both raise "No data present"
  // if they do not have data to report, instead of returning unset values
  // which could be misinterpreted as actual reported values.
  function getRoundData(uint80 _roundId)
    external
    view
    returns (
      uint80 roundId,
      int256 answer,
      uint256 startedAt,
      uint256 updatedAt,
      uint80 answeredInRound
    );

  function latestRoundData()
    external
    view
    returns (
      uint80 roundId,
      int256 answer,
      uint256 startedAt,
      uint256 updatedAt,
      uint80 answeredInRound
    );
}

File 4 of 5 : Rewards.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.12;

library rewards {
  function metalRewardAddition(
      uint256 currentBlock,
      uint256 rewardBlockChecker,
      uint256 rewardValue,
      uint256 lastClaimedBlock
      ) internal pure returns (uint256) {
      if (rewardBlockChecker == 0) return 0;
      if (rewardBlockChecker >= currentBlock) return 0;
      if (currentBlock == lastClaimedBlock) return 0;
      if (currentBlock <= rewardBlockChecker) return 0;
      if (lastClaimedBlock <= 0) return 0;
      if (lastClaimedBlock > currentBlock) return 0;
      if (lastClaimedBlock > rewardBlockChecker) {
        return (currentBlock - lastClaimedBlock) * rewardValue;
      }
      if (rewardBlockChecker < currentBlock) {
        return (currentBlock - rewardBlockChecker)  * rewardValue;
      }
      return 0;
  }

  function calculateConnectReward(uint amount, uint256 numerator, uint256 denominator) internal pure returns(uint) {
    if (numerator == 0) return amount;
    return (amount * numerator) / denominator;
  }

}

File 5 of 5 : Math.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.8.12;

library math {
  uint internal constant DECIMAL_PRECISION = 1e18;

  function decMul(uint x, uint y) internal pure returns (uint decProd) {
    uint prod_xy = x * y;

    decProd = (prod_xy + (DECIMAL_PRECISION / 2)) / DECIMAL_PRECISION;
  }

  function _decPow(uint _base, uint _minutes) internal pure returns (uint) {

    if (_minutes > 525_600_000) _minutes = 525_600_000;  // cap to avoid overflow

    if (_minutes == 0) return DECIMAL_PRECISION;

    uint y = DECIMAL_PRECISION;
    uint x = _base;
    uint n = _minutes;

    // Exponentiation-by-squaring
    while (n > 1) {
      if (n % 2 == 0) {
        x = decMul(x, x);
        n = n / 2;
      } else { // if (n % 2 != 0)
        y = decMul(x, y);
        x = decMul(x, x);
        n = (n - 1) / 2;
      }
    }

    return decMul(x, y);
  }

}

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_nodeifyTokenAddress","type":"address"},{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_feeCollectorAddress","type":"address"},{"internalType":"address","name":"_priceFeedAddress","type":"address"},{"internalType":"address","name":"_superOwner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"entity","type":"address"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"Claimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"entity","type":"address"},{"indexed":false,"internalType":"uint256","name":"nodeId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"blockNumber","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nodeType","type":"uint256"},{"indexed":false,"internalType":"bool","name":"addToNodePool","type":"bool"},{"indexed":false,"internalType":"uint256","name":"paidOn","type":"uint256"}],"name":"Created","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"entity","type":"address"},{"indexed":false,"internalType":"bytes","name":"nodeId","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"nodeType","type":"uint256"}],"name":"DeregisteredWithConnect","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"entity","type":"address"},{"indexed":false,"internalType":"uint256","name":"nodeType","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nodeId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"upToBlockNumber","type":"uint256"}],"name":"Paid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"entity","type":"address"},{"indexed":false,"internalType":"bytes","name":"nodeId","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"nodeType","type":"uint256"}],"name":"RegisteredWithConnect","type":"event"},{"inputs":[{"internalType":"uint256","name":"_nodeId","type":"uint256"},{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"addNodeToPool","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"bronzeNodeAmount","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bronzeReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_baseRate","type":"uint256"},{"internalType":"uint256","name":"_decayFactor","type":"uint256"},{"internalType":"uint256","name":"_minutesPassed","type":"uint256"}],"name":"calcDecayedReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_entity","type":"address"},{"internalType":"uint256","name":"_nodeId","type":"uint256"}],"name":"canBePaid","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nodeId","type":"uint256"}],"name":"canBeRemoveNodeFromPool","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nodeId","type":"uint256"},{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"claim","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_timestamp","type":"uint256"},{"internalType":"uint256","name":"_fromNode","type":"uint256"},{"internalType":"uint256","name":"_toNode","type":"uint256"}],"name":"claimAll","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bool","name":"_addToNodePool","type":"bool"},{"internalType":"uint256","name":"_nodeType","type":"uint256"}],"name":"createNode","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bool","name":"_addToNodePool","type":"bool"},{"internalType":"uint256","name":"_nodeType","type":"uint256"},{"internalType":"address","name":"_entity","type":"address"}],"name":"createNodeForEntity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_addToNodePool","type":"bool"},{"internalType":"uint256","name":"_nodeType","type":"uint256"}],"name":"createPresaleNode","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_entity","type":"address"},{"internalType":"uint256","name":"_nodeId","type":"uint256"}],"name":"doesNodeExist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"name":"entityNodeAddedToPoolOnBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"name":"entityNodeClaimedOnBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"entityNodeCount","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"name":"entityNodeCreatedAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"name":"entityNodeIdType","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"name":"entityNodeLastClaimedAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"name":"entityNodePaidOnBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"entityNodeTypeCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeCollectorAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nodeType","type":"uint256"}],"name":"getBaseRewardRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nodeType","type":"uint256"}],"name":"getClaimingFeeDenominator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nodeType","type":"uint256"}],"name":"getClaimingFeeNumerator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nodeType","type":"uint256"}],"name":"getCreatingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nodeType","type":"uint256"}],"name":"getDecayFactor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nodeType","type":"uint256"},{"internalType":"address","name":"_entity","type":"address"}],"name":"getEntityNodeTypeCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFtmPrice","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nodeType","type":"uint256"}],"name":"getGracePeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_entity","type":"address"},{"internalType":"uint256","name":"_nodeId","type":"uint256"},{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"getNodeClaimingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_entity","type":"address"},{"internalType":"uint256","name":"_nodeId","type":"uint256"}],"name":"getNodeId","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_entity","type":"address"},{"internalType":"uint256","name":"_nodeId","type":"uint256"}],"name":"getNodePaidOn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_entity","type":"address"},{"internalType":"uint256","name":"_nodeId","type":"uint256"}],"name":"getNodeReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_entity","type":"address"},{"internalType":"uint256","name":"_nodeId","type":"uint256"}],"name":"getNodeType","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nodeType","type":"uint256"}],"name":"getNodeTypePoolRewardNumerator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nodeType","type":"uint256"}],"name":"getNodeTypeRecurringFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nodeType","type":"uint256"}],"name":"getNodeifyFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_entity","type":"address"},{"internalType":"uint256","name":"_timestamp","type":"uint256"},{"internalType":"uint256","name":"_fromNode","type":"uint256"},{"internalType":"uint256","name":"_toNode","type":"uint256"}],"name":"getNodesClaimingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nodeType","type":"uint256"}],"name":"getNodesLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_entity","type":"address"},{"internalType":"uint256","name":"_fromNode","type":"uint256"},{"internalType":"uint256","name":"_toNode","type":"uint256"}],"name":"getNodesRecurringFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nodeType","type":"uint256"}],"name":"getRecurringPaymentCycle","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_entity","type":"address"},{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"getRewardAll","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_entity","type":"address"},{"internalType":"uint256","name":"_nodeId","type":"uint256"},{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"getRewardAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"goldNodeAmount","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"goldReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_entity","type":"address"},{"internalType":"uint256","name":"_nodeId","type":"uint256"}],"name":"hasMaxPayments","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_entity","type":"address"},{"internalType":"uint256","name":"_nodeId","type":"uint256"}],"name":"hasNodeExpired","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isDenied","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_entity","type":"address"},{"internalType":"uint256","name":"_nodeId","type":"uint256"}],"name":"isNodeInPool","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_entity","type":"address"},{"internalType":"uint256","name":"_nodeId","type":"uint256"}],"name":"isNodePastDue","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPresaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isPresaleWallet","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublicLaunchActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxNodeCount","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPaymentPeriods","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"metalBlockMap","outputs":[{"internalType":"uint256","name":"bronze","type":"uint256"},{"internalType":"uint256","name":"silver","type":"uint256"},{"internalType":"uint256","name":"gold","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"nodeTypeActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"nodeTypeBaseRewardRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"nodeTypeClaimingFeeDenominator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"nodeTypeClaimingFeeNumerator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"nodeTypeCreationFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"nodeTypeDecayFactor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"nodeTypeGracePeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"nodeTypeLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"nodeTypeNodeifyFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"nodeTypePoolRewardDenominator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"nodeTypePoolRewardNumerator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"nodeTypeRecurringFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"nodeTypeRecurringPaymentCycle","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nodeifyToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fromNode","type":"uint256"},{"internalType":"uint256","name":"_toNode","type":"uint256"}],"name":"payAll","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nodeId","type":"uint256"}],"name":"payFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"poolLockInBlocks","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolRemovalFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleRequestingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceFeedOverride","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nodeId","type":"uint256"},{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"removeNodeFromPool","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"rewardBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardPercentageSentToFeeCollector","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nodeType","type":"uint256"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"setBaseRewardRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint128","name":"_amount","type":"uint128"}],"name":"setBronzeNodeAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_reward","type":"uint256"}],"name":"setBronzeRewardValue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nodeType","type":"uint256"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"setClaimingFeeDenominator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nodeType","type":"uint256"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"setClaimingFeeNumerator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nodeType","type":"uint256"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"setCreatingFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nodeType","type":"uint256"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"setDecayFactor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"bool","name":"_value","type":"bool"}],"name":"setDenied","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint128","name":"_amount","type":"uint128"}],"name":"setGoldNodeAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_reward","type":"uint256"}],"name":"setGoldRewardValue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nodeType","type":"uint256"},{"internalType":"uint256","name":"_blocks","type":"uint256"}],"name":"setGracePeriodInBlocks","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint128","name":"_maxNodeCount","type":"uint128"}],"name":"setMaxNodeAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint128","name":"_maxPaymentPeriods","type":"uint128"}],"name":"setMaxPaymentPeriods","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nodeType","type":"uint256"},{"internalType":"bool","name":"_active","type":"bool"}],"name":"setNodeTypeActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nodeType","type":"uint256"},{"internalType":"uint128","name":"_denominator","type":"uint128"}],"name":"setNodeTypePoolRewardDenominator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nodeType","type":"uint256"},{"internalType":"uint128","name":"_numerator","type":"uint128"}],"name":"setNodeTypePoolRewardNumerator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nodeType","type":"uint256"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"setNodeTypeRecurringFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nodeType","type":"uint256"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"setNodeifyFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nodeType","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setNodesLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_blocks","type":"uint256"}],"name":"setPoolLockInBlocks","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"setPoolRemovalFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"setPresaleCreationFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_value","type":"bool"}],"name":"setPresaleIsActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_presaleWallet","type":"address"},{"internalType":"bool","name":"_active","type":"bool"}],"name":"setPresaleWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"setPriceFeedOverride","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_value","type":"bool"}],"name":"setPublicLaunchIsActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nodeType","type":"uint256"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"setRecurringPaymentCycle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rewardPercentageSentToFeeCollector","type":"uint256"}],"name":"setRewardPercentageSentToFeeCollector","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint128","name":"_amount","type":"uint128"}],"name":"setSilverNodeAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_reward","type":"uint256"}],"name":"setSilverRewardValue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint128","name":"_totalNodeTypesAvailable","type":"uint128"}],"name":"setTotalNodeTypesAvailable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"silverNodeAmount","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"silverReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"superOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalNodeTypesAvailable","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalNodesCreated","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalPooledNodes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newFeeCollector","type":"address"}],"name":"updateFeeCollector","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"updateOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_destination","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052700200000000000000000000000000000004601d55700100000000000000000000000000000064601e55700a00000000000000000000000000000005601f55620f42406024556b04d8c55aefb8c05b5c000000602555642e90edd000602655645d21dba000602755648bb2c97000602855610bb86029556b9b18ab5df7180b6b80000000602a553480156200009857600080fd5b506040516200576d3803806200576d833981016040819052620000bb916200014a565b60198054601a80546001600160a01b03199081166001600160a01b0389811691909117909255601b80548216868416179055601c805482168884161790556018805490911686831617905587166001600160b01b0319909116179055620001226001602b55565b5050505050620001ba565b80516001600160a01b03811681146200014557600080fd5b919050565b600080600080600060a086880312156200016357600080fd5b6200016e866200012d565b94506200017e602087016200012d565b93506200018e604087016200012d565b92506200019e606087016200012d565b9150620001ae608087016200012d565b90509295509295909350565b6155a380620001ca6000396000f3fe6080604052600436106107365760003560e01c806393106b28116103b1578063c7416437116101f2578063e0f5147411610118578063f108e225116100ab578063f5bd0f501161007a578063f5bd0f50146117b3578063f9df21e7146117e0578063fade29de14611800578063fe17111a1461182057600080fd5b8063f108e2251461171f578063f28b039e1461173f578063f3fef3a314611766578063f5474cb01461178657600080fd5b8063e47dd078116100e7578063e47dd07814611674578063e73659a1146116a1578063e79ae18b146116b7578063e838dfbb146116ef57600080fd5b8063e0f51474146115f4578063e15adb3a14611621578063e1ec0ce014611641578063e3c137201461165457600080fd5b8063d48ba48611610190578063db50b26e1161015f578063db50b26e14611560578063dd2499491461158d578063de20d47a146115b4578063e0b54859146115e157600080fd5b8063d48ba486146114c8578063d5a51dca14611500578063d6789aaf14611513578063da7169b31461154057600080fd5b8063d0602bbe116101cc578063d0602bbe14611448578063d1c25be314611475578063d289ade214611495578063d2c35ce8146114a857600080fd5b8063c7416437146113e8578063ca165fcf14611408578063cb70bd791461142857600080fd5b8063a8bf0b09116102d7578063b57d1ebc11610275578063bff904bd11610244578063bff904bd14611372578063c0fe137414611392578063c3490263146113a8578063c5482011146113bb57600080fd5b8063b57d1ebc146112fc578063b6b55f251461131c578063b7fef4ce1461133c578063b8527aef1461135c57600080fd5b8063aadea3f3116102b1578063aadea3f31461127c578063ac3d5d65146112a9578063acd471c4146112c9578063afe602da146112dc57600080fd5b8063a8bf0b091461120e578063a8d797f91461122e578063aa5c3ab41461126657600080fd5b8063949aa34c1161034f578063a2de018c1161031e578063a2de018c1461116a578063a529dbcd14611197578063a7165888146111b7578063a77e2825146111d857600080fd5b8063949aa34c146110bd578063952175d314611114578063993df1191461112a5780639daf08c01461114a57600080fd5b80639392e3791161038b5780639392e3791461105e578063939c6bfb14611074578063940898c71461109457806394639293146110a757600080fd5b806393106b2814610fea57806393261a861461101157806393379eb31461103157600080fd5b80635421c9391161057b57806373587977116104a1578063868bce391161043f5780638ccf7f231161040e5780638ccf7f2314610f5a5780638da5cb5b14610f8a5780638ecddc0514610faa5780639145e39114610fca57600080fd5b8063868bce3914610ebf57806387dcd2b614610eec578063880cdc3114610f245780638989f86614610f4457600080fd5b8063855f261e1161047b578063855f261e14610e3157806385bfa01d14610e6957806385f2c64f14610e895780638633e9b114610e9f57600080fd5b80637358797714610dac578063743c152314610dd957806381e79c0c14610e1157600080fd5b806360c2133f11610519578063623887da116104e8578063623887da14610d2c57806369d8817314610d4c5780637251c71714610d6c5780637347fb3114610d8c57600080fd5b806360c2133f14610ca857806360d938dc14610cd557806360e587f914610cf657806361a3aa8e14610d0c57600080fd5b80635a2f7ed3116105555780635a2f7ed314610c335780635a6a2e5814610c485780635c21383a14610c685780635f4528bb14610c8857600080fd5b80635421c93914610bc657806357652a4614610bf35780635880f49e14610c1357600080fd5b80631d81b08011610660578063375ce0f4116105fe57806341e66691116105cd57806341e6669114610b505780634e52f1ea14610b70578063517e2c1714610b905780635207388d14610ba657600080fd5b8063375ce0f414610a9b5780633897884114610ac85780633dd03bd614610b0057806340fb7ad914610b2057600080fd5b806328870bd11161063a57806328870bd114610a0e5780632c57fa6414610a3b5780632cce330f14610a5b578063371f8da314610a7b57600080fd5b80631d81b08014610994578063232adb43146109c1578063234dafaa146109ee57600080fd5b80630c29c784116106d8578063142a74ef116106a7578063142a74ef146109095780631649b09a1461092957806319a1f5ae146109495780631ce100271461098157600080fd5b80630c29c7841461086c5780630d30e9bc1461088c5780630e2e3e04146108ac57806311d7096d146108dc57600080fd5b80630775a931116107145780630775a931146107c557806307b8eb9b146107f257806308a3547e1461081f5780630c056e411461083f57600080fd5b806301bd2f811461073b578063030fca6714610783578063072e3a59146107a3575b600080fd5b34801561074757600080fd5b50610770610756366004614e96565b600060208181529281526040808220909352908152205481565b6040519081526020015b60405180910390f35b34801561078f57600080fd5b5061077061079e366004614ec0565b611840565b3480156107af57600080fd5b506107c36107be366004614f04565b6118da565b005b3480156107d157600080fd5b506107706107e0366004614f42565b6000908152600f602052604090205490565b3480156107fe57600080fd5b5061077061080d366004614f42565b60106020526000908152604090205481565b34801561082b57600080fd5b506107c361083a366004614f5b565b611d08565b34801561084b57600080fd5b5061085f61085a366004614e96565b611d50565b60405161077a9190614fd4565b34801561087857600080fd5b506107c3610887366004614ffe565b611dd8565b34801561089857600080fd5b506107c36108a7366004614f42565b611e21565b3480156108b857600080fd5b506108cc6108c7366004614e96565b611e50565b604051901515815260200161077a565b3480156108e857600080fd5b506107706108f7366004614f42565b60009081526008602052604090205490565b34801561091557600080fd5b506107c3610924366004614ffe565b611e88565b34801561093557600080fd5b506107c3610944366004614f42565b611ed4565b34801561095557600080fd5b5061077061096436600461502f565b805160208183018101805160048252928201919093012091525481565b6107c361098f3660046150e0565b611f03565b3480156109a057600080fd5b506107706109af366004614f42565b600a6020526000908152604090205481565b3480156109cd57600080fd5b506107706109dc366004614f42565b600b6020526000908152604090205481565b3480156109fa57600080fd5b506107c3610a09366004614f42565b61239f565b348015610a1a57600080fd5b50610770610a29366004614f42565b6000908152600e602052604090205490565b348015610a4757600080fd5b506107c3610a56366004614f42565b6123ce565b348015610a6757600080fd5b506107c3610a76366004614ffe565b6123fd565b348015610a8757600080fd5b506107c3610a963660046150fe565b612446565b348015610aa757600080fd5b50610770610ab6366004614f42565b6000908152600a602052604090205490565b348015610ad457600080fd5b50601d54610ae8906001600160801b031681565b6040516001600160801b03909116815260200161077a565b348015610b0c57600080fd5b506107c3610b1b366004614f5b565b612482565b348015610b2c57600080fd5b506108cc610b3b366004615120565b60146020526000908152604090205460ff1681565b348015610b5c57600080fd5b50610770610b6b36600461513b565b6124ca565b348015610b7c57600080fd5b506107c3610b8b366004614f42565b612516565b348015610b9c57600080fd5b5061077060265481565b348015610bb257600080fd5b506107c3610bc1366004614ffe565b612545565b348015610bd257600080fd5b50610770610be1366004614f42565b60116020526000908152604090205481565b348015610bff57600080fd5b506107c3610c0e366004615167565b61258e565b348015610c1f57600080fd5b506107c3610c2e3660046150fe565b6125e3565b348015610c3f57600080fd5b5061077061261f565b348015610c5457600080fd5b506108cc610c63366004614f42565b6126a4565b348015610c7457600080fd5b50610770610c8336600461519e565b6126f8565b348015610c9457600080fd5b506107c3610ca3366004614f42565b61271b565b348015610cb457600080fd5b50610770610cc3366004614f42565b60009081526009602052604090205490565b348015610ce157600080fd5b506019546108cc90600160a01b900460ff1681565b348015610d0257600080fd5b5061077060285481565b348015610d1857600080fd5b506107c3610d273660046151ca565b61274a565b348015610d3857600080fd5b506107c3610d473660046151ef565b612794565b348015610d5857600080fd5b506107c3610d67366004614ffe565b6127dc565b348015610d7857600080fd5b506108cc610d87366004614e96565b612828565b348015610d9857600080fd5b506107c3610da7366004615167565b612862565b348015610db857600080fd5b50610770610dc7366004614f42565b60096020526000908152604090205481565b348015610de557600080fd5b50610770610df436600461502f565b805160208183018101805160028252928201919093012091525481565b348015610e1d57600080fd5b50610770610e2c366004614e96565b6128dd565b348015610e3d57600080fd5b50610770610e4c36600461502f565b805160208183018101805160078252928201919093012091525481565b348015610e7557600080fd5b506107c3610e843660046150fe565b61290f565b348015610e9557600080fd5b5061077060255481565b348015610eab57600080fd5b506107c3610eba3660046150fe565b61294b565b348015610ecb57600080fd5b50610770610eda366004614f42565b60086020526000908152604090205481565b348015610ef857600080fd5b50601b54610f0c906001600160a01b031681565b6040516001600160a01b03909116815260200161077a565b348015610f3057600080fd5b506107c3610f3f366004615120565b612987565b348015610f5057600080fd5b5061077060275481565b348015610f6657600080fd5b506108cc610f75366004614f42565b60016020526000908152604090205460ff1681565b348015610f9657600080fd5b50601a54610f0c906001600160a01b031681565b348015610fb657600080fd5b50610770610fc5366004614ec0565b612a1b565b348015610fd657600080fd5b50610770610fe5366004614ec0565b612cc6565b348015610ff657600080fd5b50601e54610ae890600160801b90046001600160801b031681565b34801561101d57600080fd5b506107c361102c3660046150fe565b612d2b565b34801561103d57600080fd5b5061077061104c366004614f42565b600f6020526000908152604090205481565b34801561106a57600080fd5b5061077060245481565b34801561108057600080fd5b5061077061108f366004614e96565b612d67565b6107c36110a23660046150e0565b612d74565b3480156110b357600080fd5b5061077060235481565b3480156110c957600080fd5b506110f96110d8366004615120565b60156020526000908152604090208054600182015460029092015490919083565b6040805193845260208401929092529082015260600161077a565b34801561112057600080fd5b50610770602a5481565b34801561113657600080fd5b506107c3611145366004614f42565b613406565b34801561115657600080fd5b506108cc611165366004614e96565b613435565b34801561117657600080fd5b50610770611185366004614f42565b600e6020526000908152604090205481565b3480156111a357600080fd5b506107c36111b23660046150fe565b613456565b3480156111c357600080fd5b506019546108cc90600160a81b900460ff1681565b3480156111e457600080fd5b50610ae86111f3366004615120565b6016602052600090815260409020546001600160801b031681565b34801561121a57600080fd5b506107c36112293660046150fe565b6134cc565b34801561123a57600080fd5b5061077061124936600461502f565b805160208183018101805160058252928201919093012091525481565b34801561127257600080fd5b5061077060225481565b34801561128857600080fd5b50610770611297366004614f42565b6000908152600c602052604090205490565b3480156112b557600080fd5b50601f54610ae8906001600160801b031681565b6107c36112d736600461513b565b613508565b3480156112e857600080fd5b506107c36112f73660046151ef565b613626565b34801561130857600080fd5b506107c3611317366004614ffe565b6136b1565b34801561132857600080fd5b506107c3611337366004614f42565b6136fd565b34801561134857600080fd5b50610770611357366004614e96565b6137b7565b34801561136857600080fd5b5061077060205481565b34801561137e57600080fd5b506107c361138d3660046150fe565b6137ee565b34801561139e57600080fd5b5061077060295481565b6107706113b63660046150fe565b61382a565b3480156113c757600080fd5b506107706113d6366004614f42565b60009081526013602052604090205490565b3480156113f457600080fd5b506108cc611403366004614e96565b613d3b565b34801561141457600080fd5b506107c36114233660046150fe565b613dc1565b34801561143457600080fd5b50601e54610ae8906001600160801b031681565b34801561145457600080fd5b50610770611463366004614f42565b600d6020526000908152604090205481565b34801561148157600080fd5b506108cc611490366004614e96565b613dfd565b6107706114a3366004614f42565b613e9b565b3480156114b457600080fd5b506107c36114c3366004615120565b614065565b3480156114d457600080fd5b506107706114e336600461502f565b805160208183018101805160038252928201919093012091525481565b6107c361150e3660046150fe565b6140d7565b34801561151f57600080fd5b5061077061152e366004614f42565b60126020526000908152604090205481565b34801561154c57600080fd5b5061077061155b366004614e96565b614201565b34801561156c57600080fd5b5061077061157b366004614f42565b60136020526000908152604090205481565b34801561159957600080fd5b50601f54610ae890600160801b90046001600160801b031681565b3480156115c057600080fd5b506107706115cf366004614f42565b60009081526011602052604090205490565b6107c36115ef3660046150fe565b61427b565b34801561160057600080fd5b5061077061160f366004614f42565b6000908152600b602052604090205490565b34801561162d57600080fd5b506107c361163c366004614f42565b614394565b6107c361164f3660046150fe565b614404565b34801561166057600080fd5b50601954610f0c906001600160a01b031681565b34801561168057600080fd5b5061077061168f366004614f42565b6000908152600d602052604090205490565b3480156116ad57600080fd5b5061077060215481565b3480156116c357600080fd5b506107706116d236600461502f565b805160208183018101805160068252928201919093012091525481565b3480156116fb57600080fd5b506108cc61170a366004615120565b60176020526000908152604090205460ff1681565b34801561172b57600080fd5b50601c54610f0c906001600160a01b031681565b34801561174b57600080fd5b50601d54610ae890600160801b90046001600160801b031681565b34801561177257600080fd5b506107c3611781366004614e96565b61462a565b34801561179257600080fd5b506107706117a1366004614f42565b60009081526012602052604090205490565b3480156117bf57600080fd5b506107706117ce366004614f42565b600c6020526000908152604090205481565b3480156117ec57600080fd5b506108cc6117fb366004614e96565b614703565b34801561180c57600080fd5b5061077061181b366004615212565b6147b8565b34801561182c57600080fd5b506107c361183b3660046150fe565b61489d565b6000808084611850576001611852565b845b90506000808511611884576001600160a01b0387166000908152601660205260409020546001600160801b0316611886565b845b9050815b8181116118cc5761189b8882611e50565b156118ba576118ad61168f89836128dd565b6118b79085615261565b93505b806118c481615279565b91505061188a565b5091925050505b9392505050565b601a546001600160a01b0316331461190d5760405162461bcd60e51b815260040161190490615294565b60405180910390fd5b601e546001600160a01b0382166000908152601660205260409020546001600160801b039182169116106119735760405162461bcd60e51b815260206004820152600d60248201526c1b1a5b5a5d081c995858da1959609a1b6044820152606401611904565b6001600160a01b0381166119995760405162461bcd60e51b8152600401611904906152b7565b6001600160a01b03811660009081526017602052604090205460ff16156119d25760405162461bcd60e51b8152600401611904906152dd565b60008281526001602052604090205460ff16611a005760405162461bcd60e51b815260040161190490615302565b600082815260086020526040902054801580611a24575080611a2284846126f8565b105b611a5d5760405162461bcd60e51b815260206004820152600a6024820152691bdd995c881b1a5b5a5d60b21b6044820152606401611904565b6001600160a01b038216600090815260166020526040812054611a8a906001600160801b03166001615328565b6001600160801b031690506000611aa18483611d50565b905043600382604051611ab49190615353565b90815260200160405180910390208190555043600482604051611ad79190615353565b9081526040805160209281900383019020929092556001600160a01b038616600090815260169091522054611b16906001600160801b03166001615328565b6001600160a01b0385166000908152601660205260409081902080546001600160801b0319166001600160801b039390931692909217909155514290600690611b60908490615353565b9081526040805160209281900383019020929092556001600160a01b03861660009081528082528281208882529091522054611b9d906001615261565b6001600160a01b0385166000908152602081815260408083208984529091529081902091909155518590600290611bd5908490615353565b90815260405190819003602001902055611bee846148d9565b8515611c2b5743600582604051611c059190615353565b90815260405190819003602001902055602354611c23906001615261565b602355611c4e565b6000600582604051611c3d9190615353565b908152604051908190036020019020555b602054611c5c906001615261565b6020556000611c77866000908152600c602052604090205490565b9050846001600160a01b03167ff1a88165517553ebdad4e5f6674a77dd2cc5c06fb4c790c334812da55f32b64c8443898b86600389604051611cb99190615353565b908152602001604051809103902054611cd29190615261565b6040805195865260208601949094529284019190915215156060830152608082015260a00160405180910390a250505050505050565b601a546001600160a01b03163314611d325760405162461bcd60e51b815260040161190490615294565b60198054911515600160a01b0260ff60a01b19909216919091179055565b6060600082611d94576001600160a01b038416600090815260166020526040902054611d86906001600160801b03166001615328565b6001600160801b0316611d96565b825b6040516bffffffffffffffffffffffff19606087901b166020820152603481018290529091506054016040516020818303038152906040529150505b92915050565b601a546001600160a01b03163314611e025760405162461bcd60e51b815260040161190490615294565b601f80546001600160801b03928316600160801b029216919091179055565b601a546001600160a01b03163314611e4b5760405162461bcd60e51b815260040161190490615294565b602a55565b6000611e5c8383613435565b8015611e6f5750611e6d8383613dfd565b155b80156118d35750611e808383614703565b159392505050565b601a546001600160a01b03163314611eb25760405162461bcd60e51b815260040161190490615294565b601d80546001600160801b0319166001600160801b0392909216919091179055565b601a546001600160a01b03163314611efe5760405162461bcd60e51b815260040161190490615294565b602655565b601954600160a81b900460ff1615611f5d5760405162461bcd60e51b815260206004820152601760248201527f7075626c6963206c61756e6368206973206163746976650000000000000000006044820152606401611904565b601954600160a01b900460ff16611fab5760405162461bcd60e51b815260206004820152601260248201527170726573616c65206e6f742061637469766560701b6044820152606401611904565b3360009081526014602052604090205460ff166120005760405162461bcd60e51b81526020600482015260136024820152726e6f742070617274206f662070726573616c6560681b6044820152606401611904565b3360009081526016602052604090205460026001600160801b039091161061206a5760405162461bcd60e51b815260206004820152601760248201527f6d61786564206e6f64657320666f722070726573616c650000000000000000006044820152606401611904565b336120875760405162461bcd60e51b8152600401611904906152b7565b3360009081526017602052604090205460ff16156120b75760405162461bcd60e51b8152600401611904906152dd565b60008181526001602052604090205460ff166120e55760405162461bcd60e51b815260040161190490615302565b33600090815260166020526040812054612109906001600160801b03166001615328565b6001600160801b0316905060006121203383611d50565b9050436003826040516121339190615353565b908152602001604051809103902081905550436004826040516121569190615353565b9081526040805160209281900383019020929092553360009081526016909152205461218c906001600160801b03166001615328565b336000908152601660205260409081902080546001600160801b0319166001600160801b0393909316929092179091555142906006906121cd908490615353565b9081526040805160209281900383019020929092553360009081528082528281208682529091522054612201906001615261565b336000908152602081815260408083208784529091529081902091909155518390600290612230908490615353565b90815260405190819003602001902055612249336148d9565b6000838152600c60205260409020548415612295574360058360405161226f9190615353565b9081526040519081900360200190205560235461228d906001615261565b6023556122b8565b60006005836040516122a79190615353565b908152604051908190036020019020555b60006122c5602a54614af1565b9050803410156122e75760405162461bcd60e51b81526004016119049061536f565b6020546122f5906001615261565b602081905550336001600160a01b03167ff1a88165517553ebdad4e5f6674a77dd2cc5c06fb4c790c334812da55f32b64c8543888a8760038a60405161233b9190615353565b9081526020016040518091039020546123549190615261565b6040805195865260208601949094529284019190915215156060830152608082015260a00160405180910390a2601c54612397906001600160a01b031634614b1f565b505050505050565b601a546001600160a01b031633146123c95760405162461bcd60e51b815260040161190490615294565b602855565b601a546001600160a01b031633146123f85760405162461bcd60e51b815260040161190490615294565b602155565b601a546001600160a01b031633146124275760405162461bcd60e51b815260040161190490615294565b601d80546001600160801b03928316600160801b029216919091179055565b601a546001600160a01b031633146124705760405162461bcd60e51b815260040161190490615294565b60009182526008602052604090912055565b601a546001600160a01b031633146124ac5760405162461bcd60e51b815260040161190490615294565b60198054911515600160a81b0260ff60a81b19909216919091179055565b6000806124d78484614bf7565b905060006124ed82670de0b6b3a7640000615394565b9050670de0b6b3a764000061250282886153ab565b61250c91906153e0565b9695505050505050565b601a546001600160a01b031633146125405760405162461bcd60e51b815260040161190490615294565b602955565b601a546001600160a01b0316331461256f5760405162461bcd60e51b815260040161190490615294565b601e80546001600160801b03928316600160801b029216919091179055565b601a546001600160a01b031633146125b85760405162461bcd60e51b815260040161190490615294565b6001600160a01b03919091166000908152601760205260409020805460ff1916911515919091179055565b601a546001600160a01b0316331461260d5760405162461bcd60e51b815260040161190490615294565b6000918252600b602052604090912055565b600080601860009054906101000a90046001600160a01b03166001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa158015612675573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612699919061540e565b509195945050505050565b6000806126b13384611d50565b90506024546005826040516126c69190615353565b9081526020016040518091039020546126df9190615261565b4311156126ef5750600192915050565b50600092915050565b6001600160a01b0316600090815260208181526040808320938352929052205490565b601a546001600160a01b031633146127455760405162461bcd60e51b815260040161190490615294565b602755565b601a546001600160a01b031633146127745760405162461bcd60e51b815260040161190490615294565b600091825260016020526040909120805460ff1916911515919091179055565b601a546001600160a01b031633146127be5760405162461bcd60e51b815260040161190490615294565b6000918252600f60205260409091206001600160801b039091169055565b601a546001600160a01b031633146128065760405162461bcd60e51b815260040161190490615294565b601e80546001600160801b0319166001600160801b0392909216919091179055565b6000806128358484611d50565b905060006005826040516128499190615353565b9081526020016040518091039020541191505092915050565b601a546001600160a01b0316331461288c5760405162461bcd60e51b815260040161190490615294565b6001600160a01b0382166128b25760405162461bcd60e51b8152600401611904906152b7565b6001600160a01b03919091166000908152601460205260409020805460ff1916911515919091179055565b600060026128eb8484611d50565b6040516128f89190615353565b908152602001604051809103902054905092915050565b601a546001600160a01b031633146129395760405162461bcd60e51b815260040161190490615294565b60009182526009602052604090912055565b601a546001600160a01b031633146129755760405162461bcd60e51b815260040161190490615294565b60009182526011602052604090912055565b601b546001600160a01b031633146129d35760405162461bcd60e51b815260206004820152600f60248201526e2737ba1029bab832b91027bbb732b960891b6044820152606401611904565b6001600160a01b0381166129f95760405162461bcd60e51b8152600401611904906152b7565b601a80546001600160a01b0319166001600160a01b0392909216919091179055565b600080612a288585611d50565b90506000600782604051612a3c9190615353565b90815260200160405180910390205460001415612a7757600682604051612a639190615353565b908152602001604051809103902054612a97565b600782604051612a879190615353565b9081526020016040518091039020545b90506000600683604051612aab9190615353565b9081526020016040518091039020549050808511612acf57600093505050506118d3565b612ad98787613435565b612ae957600093505050506118d3565b612af38787613dfd565b15612b0457600093505050506118d3565b42851115612b1857600093505050506118d3565b818511612b2b57600093505050506118d3565b6000600284604051612b3d9190615353565b90815260200160405180910390205490506000600485604051612b609190615353565b90815260200160405180910390205460001415612b9b57600385604051612b879190615353565b908152602001604051809103902054612bbb565b600485604051612bab9190615353565b9081526020016040518091039020545b90506000603c612bcb858a615394565b612bd591906153e0565b6000848152600a6020908152604080832054600b9092528220549293509190612bff8383866124ca565b90508715612c3f576000603c612c15898b615394565b612c1f91906153e0565b90506000612c2e8585846124ca565b9050612c3a8184615394565b925050505b600060058a604051612c519190615353565b9081526020016040518091039020541115612c9b576000868152600f60209081526040808320546010909252822054612c8b918491614c9c565b9050612c978183615261565b9150505b6000612ca8438f88614cbf565b9050612cb48183615261565b9e9d5050505050505050505050505050565b6000806002612cd58686611d50565b604051612ce29190615353565b90815260200160405180910390205490506000612d00868686612a1b565b60008381526012602052604090205490915060008381526011602052604090205461250290836153ab565b601a546001600160a01b03163314612d555760405162461bcd60e51b815260040161190490615294565b60009182526013602052604090912055565b60006118d3838342612a1b565b601954600160a81b900460ff16612dcd5760405162461bcd60e51b815260206004820152601860248201527f7075626c6963206c61756e6368206e6f742061637469766500000000000000006044820152606401611904565b601e54336000908152601660205260409020546001600160801b03918216911610612e2a5760405162461bcd60e51b815260206004820152600d60248201526c1b1a5b5a5d081c995858da1959609a1b6044820152606401611904565b33612e475760405162461bcd60e51b8152600401611904906152b7565b3360009081526017602052604090205460ff1615612e775760405162461bcd60e51b8152600401611904906152dd565b60008181526001602052604090205460ff16612ea55760405162461bcd60e51b815260040161190490615302565b6000818152600e60205260408120546019546040516370a0823160e01b815233600482015291925082916001600160a01b03909116906370a0823190602401602060405180830381865afa158015612f01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f25919061545e565b1015612f645760405162461bcd60e51b815260206004820152600e60248201526d746f6f206c6f7720746f6b656e7360901b6044820152606401611904565b600082815260086020526040902054801580612f88575080612f8684336126f8565b105b612fc15760405162461bcd60e51b815260206004820152600a6024820152691bdd995c881b1a5b5a5d60b21b6044820152606401611904565b33600090815260166020526040812054612fe5906001600160801b03166001615328565b6001600160801b031690506000612ffc3383611d50565b90504360038260405161300f9190615353565b908152602001604051809103902081905550436004826040516130329190615353565b90815260408051602092819003830190209290925533600090815260169091522054613068906001600160801b03166001615328565b336000908152601660205260409081902080546001600160801b0319166001600160801b0393909316929092179091555142906006906130a9908490615353565b90815260408051602092819003830190209290925533600090815280825282812088825290915220546130dd906001615261565b33600090815260208181526040808320898452909152908190209190915551859060029061310c908490615353565b90815260405190819003602001902055613125336148d9565b8515613162574360058260405161313c9190615353565b9081526040519081900360200190205560235461315a906001615261565b602355613185565b60006005826040516131749190615353565b908152604051908190036020019020555b6000858152600960205260408120549061319e82614af1565b9050803410156131c05760405162461bcd60e51b81526004016119049061536f565b6020546131ce906001615261565b60205560006131e9886000908152600c602052604090205490565b90506000612710602954896131fe91906153ab565b61320891906153e0565b601954601c546040516323b872dd60e01b81523360048201526001600160a01b0391821660248201526044810184905292935016906323b872dd906064016020604051808303816000875af1158015613265573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132899190615477565b6132a55760405162461bcd60e51b815260040161190490615494565b8088111561335e576019546001600160a01b03166323b872dd33306132ca858d615394565b6040516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260448201526064016020604051808303816000875af115801561331e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133429190615477565b61335e5760405162461bcd60e51b815260040161190490615494565b336001600160a01b03167ff1a88165517553ebdad4e5f6674a77dd2cc5c06fb4c790c334812da55f32b64c87438c8e8760038c60405161339e9190615353565b9081526020016040518091039020546133b79190615261565b6040805195865260208601949094529284019190915215156060830152608082015260a00160405180910390a2601c546133fa906001600160a01b031634614b1f565b50505050505050505050565b601a546001600160a01b031633146134305760405162461bcd60e51b815260040161190490615294565b602455565b6000806134428484611d50565b905060006003826040516128499190615353565b601a546001600160a01b031633146134805760405162461bcd60e51b815260040161190490615294565b600081116134ba5760405162461bcd60e51b81526020600482015260076024820152661a5b9d985b1a5960ca1b6044820152606401611904565b60009182526012602052604090912055565b601a546001600160a01b031633146134f65760405162461bcd60e51b815260040161190490615294565b6000918252600e602052604090912055565b6002602b55336000908152601660205260409020546001600160801b031661355d5760405162461bcd60e51b81526020600482015260086024820152676e6f206e6f64657360c01b6044820152606401611904565b3460008361356c57600161356e565b835b9050600080841161359757336000908152601660205260409020546001600160801b0316613599565b835b9050815b8181116136085760006135b133838a612a1b565b905080156135f557600085116135d95760405162461bcd60e51b8152600401611904906154bd565b60006135e5838a61382a565b90506135f18187615394565b9550505b508061360081615279565b91505061359d565b508215613619576136193384614b1f565b50506001602b5550505050565b601a546001600160a01b031633146136505760405162461bcd60e51b815260040161190490615294565b6000816001600160801b0316116136935760405162461bcd60e51b81526020600482015260076024820152661a5b9d985b1a5960ca1b6044820152606401611904565b6000918252601060205260409091206001600160801b039091169055565b601a546001600160a01b031633146136db5760405162461bcd60e51b815260040161190490615294565b601f80546001600160801b0319166001600160801b0392909216919091179055565b601a546001600160a01b031633146137275760405162461bcd60e51b815260040161190490615294565b6019546040516323b872dd60e01b8152336004820152306024820152604481018390526001600160a01b03909116906323b872dd906064016020604051808303816000875af115801561377e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137a29190615477565b50806022546137b19190615261565b60225550565b6000806137c48484611d50565b90506003816040516137d69190615353565b90815260200160405180910390205491505092915050565b601a546001600160a01b031633146138185760405162461bcd60e51b815260040161190490615294565b6000918252600c602052604090912055565b6000806138373385611d50565b9050600060028260405161384b9190615353565b9081526020016040518091039020549050600060048360405161386e9190615353565b908152602001604051809103902054600014156138a9576004836040516138959190615353565b9081526020016040518091039020546138c9565b6004836040516138b99190615353565b9081526020016040518091039020545b905060006007846040516138dd9190615353565b90815260200160405180910390205460001415613918576006846040516139049190615353565b908152602001604051809103902054613938565b6007846040516139289190615353565b9081526020016040518091039020545b90506139443388613435565b61397f5760405162461bcd60e51b815260206004820152600c60248201526b191bd95cdb9d08195e1a5cdd60a21b6044820152606401611904565b6139893388613dfd565b156139c55760405162461bcd60e51b815260206004820152600c60248201526b1b9bd91948195e1c1a5c995960a21b6044820152606401611904565b6139cf3388613d3b565b15613a075760405162461bcd60e51b8152602060048201526008602482015267706173742064756560c01b6044820152606401611904565b81613a445760405162461bcd60e51b815260206004820152600d60248201526c1b995d995c8818db185a5b5959609a1b6044820152606401611904565b3360009081526017602052604090205460ff1615613a745760405162461bcd60e51b8152600401611904906152dd565b42861115613ab45760405162461bcd60e51b815260206004820152600d60248201526c06261642074696d657374616d7609c1b6044820152606401611904565b85613ac1826104b0615261565b10613af95760405162461bcd60e51b81526020600482015260086024820152673a37b79039b7b7b760c11b6044820152606401611904565b6000613b06338989612a1b565b905060008111613b445760405162461bcd60e51b81526020600482015260096024820152681b9bc81c995dd85c9960ba1b6044820152606401611904565b6000848152601260209081526040808320546011909252822054613b6890846153ab565b613b7291906153e0565b905080341015613b945760405162461bcd60e51b81526004016119049061536f565b8160225411613bd25760405162461bcd60e51b815260206004820152600a6024820152696e6f207265776172647360b01b6044820152606401611904565b81602254613be09190615394565b6022556040518890600790613bf6908990615353565b90815260200160405180910390208190555043600487604051613c199190615353565b908152604051602091819003820181209290925583825233917fd8138f8a3f377c5259ca548e70e4c2de94f129f5a11036a15b69513cba2b426a910160405180910390a260195460405163a9059cbb60e01b8152336004820152602481018490526001600160a01b039091169063a9059cbb906044016020604051808303816000875af1158015613cae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613cd29190615477565b613cee5760405162461bcd60e51b815260040161190490615494565b601c54613d04906001600160a01b031682614b1f565b613d0c614d8f565b8015613d1757508034115b15613d2f57613d2f33613d2a8334615394565b614b1f565b98975050505050505050565b600080613d488484611d50565b90506000600282604051613d5c9190615353565b90815260200160405180910390205490506000600383604051613d7f9190615353565b90815260200160405180910390205490506000613da8836000908152600c602052604090205490565b9050613db48183615261565b4311979650505050505050565b601a546001600160a01b03163314613deb5760405162461bcd60e51b815260040161190490615294565b6000918252600a602052604090912055565b600080613e0a8484611d50565b90506000600282604051613e1e9190615353565b90815260200160405180910390205490506000600383604051613e419190615353565b9081526020016040518091039020549050613e5c8686613435565b613e6c5760019350505050611dd2565b6000828152600c6020908152604080832054601390925290912054613e918284615261565b613db49190615261565b600080613ea83384611d50565b9050613eb43384611e50565b613eeb5760405162461bcd60e51b815260206004820152600860248201526763616e742070617960c01b6044820152606401611904565b6000600282604051613efd9190615353565b90815260200160405180910390205490506000613f26826000908152600d602052604090205490565b90506000613f3382614af1565b905080341015613f555760405162461bcd60e51b81526004016119049061536f565b6000838152600c6020526040902054600385604051613f749190615353565b908152602001604051809103902054613f8d9190615261565b600385604051613f9d9190615353565b908152602001604051809103902081905550336001600160a01b03167f1ff60751a354563b8db02f735046d6cecdd1ec33b27b453a7925da806b529adb8488600388604051613fec9190615353565b908152604051908190036020018120546140189392919283526020830191909152604082015260600190565b60405180910390a2601c54614036906001600160a01b031682614b1f565b61403e614d8f565b801561404957508034115b1561405c5761405c33613d2a8334615394565b95945050505050565b601a546001600160a01b0316331461408f5760405162461bcd60e51b815260040161190490615294565b6001600160a01b0381166140b55760405162461bcd60e51b8152600401611904906152b7565b601c80546001600160a01b0319166001600160a01b0392909216919091179055565b6002602b5560006140e83384611d50565b90506005816040516140fa9190615353565b90815260200160405180910390205460001461414a5760405162461bcd60e51b815260206004820152600f60248201526e185b1c9958591e481a5b881c1bdbdb608a1b6044820152606401611904565b6000614157338585612a1b565b9050801561416b57614169848461382a565b505b4360058360405161417c9190615353565b9081526040519081900360200190205560235461419a906001615261565b60235560405133907fe63283ceacd5773530f42192aae062e724ab621f589160a1bc6f1bf4d0007a3b9084906002906141d4908390615353565b908152604051908190036020018120546141ee92916154e1565b60405180910390a250506001602b555050565b60008060015b6001600160a01b0385166000908152601660205260409020546001600160801b03908116908216116142735761425585826001600160801b03166000871161424f5742612a1b565b86612a1b565b61425f9083615261565b91508061426b81615503565b915050614207565b509392505050565b6002602b55336000908152601660205260409020546001600160801b03166142d05760405162461bcd60e51b81526020600482015260086024820152676e6f206e6f64657360c01b6044820152606401611904565b346000836142df5760016142e1565b835b9050600080841161430a57336000908152601660205260409020546001600160801b031661430c565b835b9050815b818111614377576143213382611e50565b61432a57614365565b6000841161434a5760405162461bcd60e51b8152600401611904906154bd565b600061435582613e9b565b90506143618186615394565b9450505b8061436f81615279565b915050614310565b508215614388576143883384614b1f565b50506001602b55505050565b601a546001600160a01b031633146143be5760405162461bcd60e51b815260040161190490615294565b600081116143ff5760405162461bcd60e51b815260206004820152600e60248201526d1a5b9d985b1a5908185b5bdd5b9d60921b6044820152606401611904565b602555565b6002602b5560006144153384611d50565b9050428211156144575760405162461bcd60e51b815260206004820152600d60248201526c06261642074696d657374616d7609c1b6044820152606401611904565b614460836126a4565b6144a45760405162461bcd60e51b815260206004820152601560248201527418d85b9b9bdd081899481c995b5bdd9959081e595d605a1b6044820152606401611904565b60006005826040516144b69190615353565b908152602001604051809103902054116145005760405162461bcd60e51b815260206004820152600b60248201526a1b9bdd081a5b881c1bdbdb60aa1b6044820152606401611904565b600061450d338585612a1b565b90506000811561452457614521858561382a565b90505b6000614531602554614af1565b9050803410156145535760405162461bcd60e51b81526004016119049061536f565b60006005856040516145659190615353565b908152604051908190036020019020556023541561459057600160235461458c9190615394565b6023555b336001600160a01b03167febb9c13f40057ac0ff997aba198a86af48f813e0d66dfad0eaeaef7d6a3672d9856002876040516145cc9190615353565b908152604051908190036020018120546145e692916154e1565b60405180910390a2601c54614604906001600160a01b031682614b1f565b61460c614d8f565b801561461757508034115b156136195761361933613d2a8334615394565b601a546001600160a01b031633146146545760405162461bcd60e51b815260040161190490615294565b8060225410156146765760405162461bcd60e51b8152600401611904906154bd565b806022546146849190615394565b60225560195460405163a9059cbb60e01b81526001600160a01b038481166004830152602482018490529091169063a9059cbb906044016020604051808303816000875af11580156146da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906146fe9190615477565b505050565b6000806147108484611d50565b905060006002826040516147249190615353565b908152602001604051809103902054905060006003836040516147479190615353565b90815260200160405180910390205490506000614770836000908152600c602052604090205490565b601d5490915060009061479390600160801b90046001600160801b0316836153ab565b61479d9043615261565b9050806147aa8385615261565b101598975050505050505050565b60008080846147c85760016147ca565b845b905060008085116147fc576001600160a01b0388166000908152601660205260409020546001600160801b03166147fe565b845b9050815b81811161488e5760006148248a8360008c1161481e5742612a1b565b8b612a1b565b9050801561487b5760006148388b846128dd565b60008181526012602052604090205490915060008281526011602052604090205461486390846153ab565b61486d91906153e0565b6148779087615261565b9550505b508061488681615279565b915050614802565b5091925050505b949350505050565b601a546001600160a01b031633146148c75760405162461bcd60e51b815260040161190490615294565b6000918252600d602052604090912055565b6000808060015b601d546001600160801b031681116149b15760006148fe82876126f8565b601e54909150600160801b90046001600160801b0316811061493a57601e5461493790600160801b90046001600160801b031686615261565b94505b601f546001600160801b0316811061496557601f54614962906001600160801b031685615261565b93505b601f54600160801b90046001600160801b0316811061499e57601f5461499b90600160801b90046001600160801b031684615261565b92505b50806149a981615279565b9150506148e0565b506001600160a01b0384166000908152601560205260409020601d54601e546149ed916001600160801b0390811691600160801b90041661552a565b6001600160801b03168410158015614a0457508054155b15614a25576001600160a01b03851660009081526015602052604090204390555b601d54601f54614a41916001600160801b03908116911661552a565b6001600160801b03168310158015614a5b57506001810154155b15614a8457614a8485436001600160a01b03909116600090815260156020526040902060010155565b601d54601f54614aa7916001600160801b0390811691600160801b90041661552a565b6001600160801b03168210158015614ac157506002810154155b15614aea57614aea85436001600160a01b03909116600090815260156020526040902060020155565b5050505050565b60215460009015614b0957602154611dd290836153e0565b6000614b1361261f565b90506118d381846153e0565b80471015614b665760405162461bcd60e51b8152602060048201526014602482015273696e73756666696369656e742062616c616e636560601b6044820152606401611904565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114614bb3576040519150601f19603f3d011682016040523d82523d6000602084013e614bb8565b606091505b50509050806146fe5760405162461bcd60e51b815260206004820152600b60248201526a1cd95b990819985a5b195960aa1b6044820152606401611904565b6000631f540500821115614c0d57631f54050091505b81614c215750670de0b6b3a7640000611dd2565b670de0b6b3a764000083835b6001811115614c9257614c41600282615559565b614c6357614c4f8283614dae565b9150614c5c6002826153e0565b9050614c2d565b614c6d8284614dae565b9250614c798283614dae565b91506002614c88600183615394565b614c5c91906153e0565b61250c8284614dae565b600082614caa5750826118d3565b81614cb584866153ab565b61489591906153e0565b6001600160a01b0382166000908152601560205260408120546026548291614cea9187919086614ddb565b6001600160a01b0385166000908152601560205260408120600101546027549293509091614d1a91889187614ddb565b6001600160a01b0386166000908152601560205260408120600201546028549293509091614d4a91899188614ddb565b6001600160a01b038716600090815260166020526040812054919250906001600160801b031682614d7b8587615261565b614d859190615261565b613d2f91906153e0565b6000614d9d602b5460021490565b158015614da957503332145b905090565b600080614dbb83856153ab565b9050670de0b6b3a7640000614dd16002826153e0565b614cb59083615261565b600083614dea57506000614895565b848410614df957506000614895565b81851415614e0957506000614895565b838511614e1857506000614895565b60008211614e2857506000614895565b84821115614e3857506000614895565b83821115614e5c5782614e4b8387615394565b614e5591906153ab565b9050614895565b84841015614e6f5782614e4b8587615394565b506000949350505050565b80356001600160a01b0381168114614e9157600080fd5b919050565b60008060408385031215614ea957600080fd5b614eb283614e7a565b946020939093013593505050565b600080600060608486031215614ed557600080fd5b614ede84614e7a565b95602085013595506040909401359392505050565b8015158114614f0157600080fd5b50565b600080600060608486031215614f1957600080fd5b8335614f2481614ef3565b925060208401359150614f3960408501614e7a565b90509250925092565b600060208284031215614f5457600080fd5b5035919050565b600060208284031215614f6d57600080fd5b81356118d381614ef3565b60005b83811015614f93578181015183820152602001614f7b565b83811115614fa2576000848401525b50505050565b60008151808452614fc0816020860160208601614f78565b601f01601f19169290920160200192915050565b6020815260006118d36020830184614fa8565b80356001600160801b0381168114614e9157600080fd5b60006020828403121561501057600080fd5b6118d382614fe7565b634e487b7160e01b600052604160045260246000fd5b60006020828403121561504157600080fd5b813567ffffffffffffffff8082111561505957600080fd5b818401915084601f83011261506d57600080fd5b81358181111561507f5761507f615019565b604051601f8201601f19908116603f011681019083821181831017156150a7576150a7615019565b816040528281528760208487010111156150c057600080fd5b826020860160208301376000928101602001929092525095945050505050565b600080604083850312156150f357600080fd5b8235614eb281614ef3565b6000806040838503121561511157600080fd5b50508035926020909101359150565b60006020828403121561513257600080fd5b6118d382614e7a565b60008060006060848603121561515057600080fd5b505081359360208301359350604090920135919050565b6000806040838503121561517a57600080fd5b61518383614e7a565b9150602083013561519381614ef3565b809150509250929050565b600080604083850312156151b157600080fd5b823591506151c160208401614e7a565b90509250929050565b600080604083850312156151dd57600080fd5b82359150602083013561519381614ef3565b6000806040838503121561520257600080fd5b823591506151c160208401614fe7565b6000806000806080858703121561522857600080fd5b61523185614e7a565b966020860135965060408601359560600135945092505050565b634e487b7160e01b600052601160045260246000fd5b600082198211156152745761527461524b565b500190565b600060001982141561528d5761528d61524b565b5060010190565b6020808252600990820152682737ba1027bbb732b960b91b604082015260600190565b6020808252600c908201526b7a65726f206164647265737360a01b604082015260600190565b6020808252600b908201526a1b9bdd08185b1b1bddd95960aa1b604082015260600190565b6020808252600c908201526b696e76616c6964207479706560a01b604082015260600190565b60006001600160801b0380831681851680830382111561534a5761534a61524b565b01949350505050565b60008251615365818460208701614f78565b9190910192915050565b6020808252600b908201526a696e76616c69642066656560a81b604082015260600190565b6000828210156153a6576153a661524b565b500390565b60008160001904831182151516156153c5576153c561524b565b500290565b634e487b7160e01b600052601260045260246000fd5b6000826153ef576153ef6153ca565b500490565b805169ffffffffffffffffffff81168114614e9157600080fd5b600080600080600060a0868803121561542657600080fd5b61542f866153f4565b9450602086015193506040860151925060608601519150615452608087016153f4565b90509295509295909350565b60006020828403121561547057600080fd5b5051919050565b60006020828403121561548957600080fd5b81516118d381614ef3565b6020808252600f908201526e1d1c985b9cd9995c8819985a5b1959608a1b604082015260600190565b6020808252600a90820152690dcdee840cadcdeeaced60b31b604082015260600190565b6040815260006154f46040830185614fa8565b90508260208301529392505050565b60006001600160801b03808316818114156155205761552061524b565b6001019392505050565b60006001600160801b03808316818516818304811182151516156155505761555061524b565b02949350505050565b600082615568576155686153ca565b50069056fea2646970667358221220eb79a9dc792294202a5503043712941d820a22c5f8943c9cf9566d4fe2db674b64736f6c634300080c00330000000000000000000000007dcd01e3a119c8592a5aed681cdc9ed1630903620000000000000000000000005c180fb6b9fb9a5566fd67d927ae6205a4347992000000000000000000000000f4e33f164b823cb56927f502e8b70b1d60709f96000000000000000000000000f4766552d15ae4d256ad41b6cf2933482b0680dc0000000000000000000000001c0679707543c41be77f5fbb849f7cc1f79ce28a

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

0000000000000000000000007dcd01e3a119c8592a5aed681cdc9ed1630903620000000000000000000000005c180fb6b9fb9a5566fd67d927ae6205a4347992000000000000000000000000f4e33f164b823cb56927f502e8b70b1d60709f96000000000000000000000000f4766552d15ae4d256ad41b6cf2933482b0680dc0000000000000000000000001c0679707543c41be77f5fbb849f7cc1f79ce28a

-----Decoded View---------------
Arg [0] : _nodeifyTokenAddress (address): 0x7dcd01e3a119c8592a5aed681cdc9ed163090362
Arg [1] : _owner (address): 0x5c180fb6b9fb9a5566fd67d927ae6205a4347992
Arg [2] : _feeCollectorAddress (address): 0xf4e33f164b823cb56927f502e8b70b1d60709f96
Arg [3] : _priceFeedAddress (address): 0xf4766552d15ae4d256ad41b6cf2933482b0680dc
Arg [4] : _superOwner (address): 0x1c0679707543c41be77f5fbb849f7cc1f79ce28a

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000007dcd01e3a119c8592a5aed681cdc9ed163090362
Arg [1] : 0000000000000000000000005c180fb6b9fb9a5566fd67d927ae6205a4347992
Arg [2] : 000000000000000000000000f4e33f164b823cb56927f502e8b70b1d60709f96
Arg [3] : 000000000000000000000000f4766552d15ae4d256ad41b6cf2933482b0680dc
Arg [4] : 0000000000000000000000001c0679707543c41be77f5fbb849f7cc1f79ce28a


Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Validator ID :
0 FTM

Amount Staked
0

Amount Delegated
0

Staking Total
0

Staking Start Epoch
0

Staking Start Time
0

Proof of Importance
0

Origination Score
0

Validation Score
0

Active
0

Online
0

Downtime
0 s
Address Amount claimed Rewards Created On Epoch Created On
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.