Contract Address Details

0xE6D51D579426a9Fd44Ac289F3484949033BA7587

Contract Name
NodeController
Creator
0x23b592–23c209 at 0x92ed81–825482
Balance
0 Mech
Tokens
Fetching tokens...
Transactions
0 Transactions
Transfers
0 Transfers
Gas Used
Fetching gas used...
Last Balance Update
6865840
Contract name:
NodeController




Optimization enabled
true
Compiler version
v0.8.12+commit.f00d7308




Optimization runs
200
Verified at
2023-07-31 08:12:05.765050Z

project:/contracts/nodes/NodeController.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;
import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol";
import "../token/interfaces/IDeAnt3.sol";
import "../token/interfaces/IAnt3.sol";
import "../members/IMemberController.sol";
import "./interfaces/INodePassive.sol";
import "./interfaces/INodeActive.sol";
import "./interfaces/INodeController.sol";
contract NodeController is
ContextUpgradeable,
OwnableUpgradeable,
IERC20Receiver,
INodeController
{
struct PackagePrice {
uint256 alphaDeAntPrice;
uint256 alphaGuardianPrice;
uint256 betaDeAntPrice;
uint256 betaGuardianPrice;
uint256 gammaDeAntPrice;
uint256 gammaGuardianPrice;
uint256 packageId;
}
//token addresses, //guardian
IDeAnt3 public deAnt3Token;
IAnt3 public ant3Token;
IERC20Upgradeable public guardianToken;
PackagePrice public packagePrices;
INodePassive public nodePassive;
INodeActive public nodeActiveL1;
INodeActive public nodeActiveL2;
INodeActive public nodeActiveL3;
INodeActive public nodeActiveL4;
INodeActive public nodeActiveL5;
INodeActive public nodeActiveL6;
INodeActive[] public nodeActiveArray;
IMemberController public memberController;
mapping(address => uint256) public alphaAccmQty;
mapping(address => uint256) public betaAccmQty;
mapping(address => uint256) public gammaAccmQty;
mapping(address => uint256) public referralRank;
mapping(address => bool) public validCaller;
//quotas
uint256 public today;
mapping(uint256 => uint256) defaultQuota; // initial will [1:10, 2:100, 3:300]
mapping(uint256 => uint256) allQuota; // initial will defaultQuota
uint256 lastPromoCode; // initial with 100000
uint256 public maxClaimRound; // initial to 10 rounds
mapping(uint256 => address) allPromoCode;
event NewActiveOrder(
uint256 fromOrderID,
uint256 activeOrderID,
address fromAddress,
address toAddress,
uint256 level,
uint256 daysActive,
uint256 shareAmt,
uint256 lastRound
);
event MissingActiveOrder(
uint256 fromOrderID,
address fromAddress,
address toAddress,
uint256 level,
uint256 daysActive,
uint256 shareAmt,
uint256 lastRound
);
event ControllerReceivedTokens(address from, address to, uint256 amount);
uint256 deAnt3Decimals;
uint256 guardianDecimals;
address private _guardianCollectAddress;
modifier onlyAnt3() {
require(
msg.sender == address(ant3Token),
"Only callable from ant3Contract"
);
_;
}
modifier onlyValidCaller(address addr) {
require(validCaller[addr], "Invalid caller.");
_;
}
function initialize(
address payable _deAnt3Token,
address _ant3Token,
address _guardianToken,
address _memberController
) public initializer {
__Ownable_init();
deAnt3Token = IDeAnt3(_deAnt3Token);
ant3Token = IAnt3(_ant3Token);
guardianToken = IERC20Upgradeable(_guardianToken);
memberController = IMemberController(_memberController);
_guardianCollectAddress = 0xF18dD3538362d890Cd13e06e6688aB7288eA764F;
deAnt3Decimals = 10 ** 9;
guardianDecimals = 10 ** 18;
packagePrices.alphaDeAntPrice = 1000 * deAnt3Decimals;
packagePrices.alphaGuardianPrice = 100 * guardianDecimals;
packagePrices.betaDeAntPrice = 10000 * deAnt3Decimals;
packagePrices.betaGuardianPrice = 1000 * guardianDecimals;
packagePrices.gammaDeAntPrice = 100000 * deAnt3Decimals;
packagePrices.gammaGuardianPrice = 10000 * guardianDecimals;
lastPromoCode = 100000;
defaultQuota[1] = 300;
defaultQuota[2] = 100;
defaultQuota[3] = 10;
allQuota[1] = defaultQuota[1];
allQuota[2] = defaultQuota[2];
allQuota[3] = defaultQuota[3];
validCaller[owner()] = true;
maxClaimRound = 10;
}
function setMemberControllerContract(
address _memberController
) external onlyOwner {
memberController = IMemberController(_memberController);
}
function setGuardianCollectAddress(
address guardianCollectAddress_
) external onlyOwner {
_guardianCollectAddress = guardianCollectAddress_;
}
function setNodePassiveContract(address _nodePassive) external onlyOwner {
nodePassive = INodePassive(_nodePassive);
}
function setNodeActiveContract(
address _nodeActiveL1,
address _nodeActiveL2,
address _nodeActiveL3,
address _nodeActiveL4,
address _nodeActiveL5,
address _nodeActiveL6
) external onlyOwner {
nodeActiveL1 = INodeActive(_nodeActiveL1);
nodeActiveArray.push(nodeActiveL1);
nodeActiveL2 = INodeActive(_nodeActiveL2);
nodeActiveArray.push(nodeActiveL2);
nodeActiveL3 = INodeActive(_nodeActiveL3);
nodeActiveArray.push(nodeActiveL3);
nodeActiveL4 = INodeActive(_nodeActiveL4);
nodeActiveArray.push(nodeActiveL4);
nodeActiveL5 = INodeActive(_nodeActiveL5);
nodeActiveArray.push(nodeActiveL5);
nodeActiveL6 = INodeActive(_nodeActiveL6);
nodeActiveArray.push(nodeActiveL6);
}
function setPackagePrice(
uint256 packageId,
uint256 deAnt3,
uint256 guardian
) external onlyOwner {
if (packageId == 1) {
packagePrices.alphaDeAntPrice = deAnt3;
packagePrices.alphaGuardianPrice = guardian;
} else if (packageId == 2) {
packagePrices.betaDeAntPrice = deAnt3;
packagePrices.betaGuardianPrice = guardian;
} else if (packageId == 3) {
packagePrices.gammaDeAntPrice = deAnt3;
packagePrices.gammaGuardianPrice = guardian;
}
}
function setMaxClaimRound(uint256 round) public onlyOwner {
maxClaimRound = round;
}
function getMaxClaimRound() public view returns (uint256) {
return maxClaimRound;
}
function getPackagePrice(
uint256 packageId
) public view returns (uint256 deant, uint256 guardian) {
if (packageId == 1) {
return (
packagePrices.alphaDeAntPrice,
packagePrices.alphaGuardianPrice
);
} else if (packageId == 2) {
return (
packagePrices.betaDeAntPrice,
packagePrices.betaGuardianPrice
);
} else if (packageId == 3) {
return (
packagePrices.gammaDeAntPrice,
packagePrices.gammaGuardianPrice
);
}
}
function buyNodesPackage(uint256 packageId, uint256 promoCode) public {
(uint256 deAntPrice, uint256 guardianPrice) = getPackagePrice(
packageId
);
require(
deAntPrice > 0 && guardianPrice > 0,
"Price must be more than 0"
);
_checkQuota(packageId, promoCode, msg.sender);
deAnt3Token.nodeControllerBurn(msg.sender, deAntPrice);
guardianToken.transferFrom(
msg.sender,
_guardianCollectAddress,
guardianPrice
);
_setAccumulatedQty(msg.sender, packageId);
if (packageId > referralRank[msg.sender]) {
_setReferralRank(msg.sender, packageId);
}
uint256 userShare = _calculateShares(msg.sender, packageId);
_mintAnt3Token(deAntPrice);
uint256 fromMoId = nodePassive.addOrders(
msg.sender,
userShare,
packageId,
deAntPrice
);
_addNodeActiveOrders(msg.sender, userShare, packageId, fromMoId);
if (memberController.getMembers(msg.sender).referralCode == 0) {
memberController.genReferralCode(msg.sender);
}
}
function _addNodeActiveOrders(
address sender,
uint256 userShare,
uint256 packageId,
uint256 fromMoId
) private {
//**Referral must have at least ONE active package.
address[] memory uplines = memberController.getUplines(sender, 6);
for (uint256 i = 0; i < uplines.length; i++) {
if (uplines[i] != address(0)) {
uint256 activeDays = _calculateActiveDays(
packageId,
referralRank[uplines[i]]
);
if (nodePassive.getUserClockActive(uplines[i]) == true) {
if (
i > 2 &&
memberController.checkMonthlyPassOrder(uplines[i]) ==
false
) {
emit MissingActiveOrder(
fromMoId,
sender,
uplines[i],
i + 1,
activeDays,
userShare,
nodeActiveArray[i].getLastRound()
);
continue;
}
uint256 activeMoId = nodeActiveArray[i].addOrders(
uplines[i],
userShare,
activeDays
);
emit NewActiveOrder(
fromMoId,
activeMoId,
sender,
uplines[i],
i + 1,
activeDays,
userShare,
nodeActiveArray[i].getLastRound()
);
} else {
emit MissingActiveOrder(
fromMoId,
sender,
uplines[i],
i + 1,
activeDays,
userShare,
nodeActiveArray[i].getLastRound()
);
}
}
}
}
function _calculateActiveDays(
uint256 packageId,
uint256 rank
) private pure returns (uint256 day) {
if (packageId == 1) {
if (rank == 1) {
return 20;
} else if (rank == 2) {
return 30;
} else if (rank == 3) {
return 40;
}
} else if (packageId == 2) {
if (rank == 1) {
return 30;
} else if (rank == 2) {
return 45;
} else if (rank == 3) {
return 50;
}
} else if (packageId == 3) {
if (rank == 1) {
return 40;
} else if (rank == 2) {
return 60;
} else if (rank == 3) {
return 80;
}
}
}
function _calculateShares(
address _userAddress,
uint256 packageId
) private view returns (uint256 shares) {
if (packageId == 3) {
if (gammaAccmQty[_userAddress] > 10) {
return 1200;
} else if (
gammaAccmQty[_userAddress] > 5 &&
gammaAccmQty[_userAddress] < 11
) {
return 1100;
} else {
return 1000;
}
} else if (packageId == 2) {
if (betaAccmQty[_userAddress] > 10) {
return 120;
} else if (
(betaAccmQty[_userAddress] > 5 &&
betaAccmQty[_userAddress] < 11)
) {
return 110;
} else {
return 100;
}
} else if (packageId == 1) {
if (alphaAccmQty[_userAddress] > 10) {
return 12;
} else if (
(alphaAccmQty[_userAddress] > 5 &&
alphaAccmQty[_userAddress] < 11)
) {
return 11;
} else {
return 10;
}
}
}
function _setAccumulatedQty(
address _userAddress,
uint256 _packageId
) private {
if (_packageId == 1) {
alphaAccmQty[_userAddress]++;
} else if (_packageId == 2) {
betaAccmQty[_userAddress]++;
} else if (_packageId == 3) {
gammaAccmQty[_userAddress]++;
}
}
function _setReferralRank(address _userAddress, uint256 _rank) private {
referralRank[_userAddress] = _rank;
}
function _mintAnt3Token(uint256 amount) private {
ant3Token.mint(amount);
}
function onERC20Receive(
address from,
uint256 amount
) external onlyAnt3 returns (bool) {
emit ControllerReceivedTokens(from, address(this), amount);
uint256 passiveAmt = (amount * 70) / 100;
uint256 activeAmt = amount - passiveAmt;
uint256 active1Amt = (activeAmt * 40) / 100;
uint256 active2Amt = (activeAmt * 20) / 100;
uint256 active3Amt = (activeAmt * 5) / 100;
uint256 active4Amt = (activeAmt * 5) / 100;
uint256 active5Amt = (activeAmt * 10) / 100;
uint256 active6Amt = activeAmt -
active1Amt -
active2Amt -
active3Amt -
active4Amt -
active5Amt;
ant3Token.transfer(address(nodePassive), passiveAmt);
_afterTokenTransfer(address(nodePassive), passiveAmt);
ant3Token.transfer(address(nodeActiveL1), active1Amt);
_afterTokenTransfer(address(nodeActiveL1), active1Amt);
ant3Token.transfer(address(nodeActiveL2), active2Amt);
_afterTokenTransfer(address(nodeActiveL2), active2Amt);
ant3Token.transfer(address(nodeActiveL3), active3Amt);
_afterTokenTransfer(address(nodeActiveL3), active3Amt);
ant3Token.transfer(address(nodeActiveL4), active4Amt);
_afterTokenTransfer(address(nodeActiveL4), active4Amt);
ant3Token.transfer(address(nodeActiveL5), active5Amt);
_afterTokenTransfer(address(nodeActiveL5), active5Amt);
ant3Token.transfer(address(nodeActiveL6), active6Amt);
_afterTokenTransfer(address(nodeActiveL6), active6Amt);
return true;
}
function _afterTokenTransfer(address to, uint256 amount) internal {
if (to.code.length > 0) {
// token recipient is a contract, notify them
try IERC20Receiver(to).onERC20Receive(address(this), amount) {
// the recipient returned a bool, TODO validate if they returned true
} catch {
// the notification failed (maybe they don't implement the `IERC20Receiver` interface?)
}
}
}
function setCaller(address addr) public onlyOwner {
require(!validCaller[addr], "Address already is a valid caller.");
validCaller[addr] = true;
}
function removeCaller(address addr) public onlyOwner {
require(validCaller[addr], "Address is not a valid caller.");
validCaller[addr] = false;
}
function expireUserOrder(
address[] memory userAddress,
uint256[] memory orderId,
uint256[] memory expireRound
) public onlyValidCaller(msg.sender) {
require(
userAddress.length == orderId.length &&
userAddress.length == expireRound.length,
"Invalid length of elements"
);
uint256 highestPackage;
bool updateRank;
for (uint256 i = 0; i < userAddress.length; i++) {
(highestPackage, updateRank) = nodePassive.expireOrder(
userAddress[i],
orderId[i],
expireRound[i]
);
// recalculate user ranking
if (updateRank) {
_setReferralRank(userAddress[i], highestPackage);
}
}
}
function setDefaultQuota(
uint256 packageId,
uint256 quota
) public onlyOwner {
defaultQuota[packageId] = quota;
}
function checkQuota() public view returns (uint256[] memory) {
uint256[] memory curQuota = new uint256[](3);
for (uint256 i = 0; i < 3; i++) {
curQuota[i] = allQuota[i + 1];
}
return curQuota;
}
function _checkQuota(
uint256 packageId,
uint256 promoCode,
address userAddress
) private {
// reset quota everyday
if (block.timestamp >= today + 24 hours) {
for (uint256 i = 0; i < 3; i++) {
allQuota[i + 1] = defaultQuota[i + 1];
}
// update today
if (today == 0) {
today = block.timestamp;
} else {
today = today + 24 hours;
}
}
// check whether got promocode
if (promoCode > 0) {
// check promocode valid
require(
allPromoCode[promoCode] == userAddress,
"Invalid Promo Code."
);
allPromoCode[promoCode] = address(0);
} else {
// check quota
require(allQuota[packageId] > 0, "Reached limit of quota.");
// deduct quota
allQuota[packageId]--;
}
}
function generatePromoCode(
address[] memory userAddress,
uint256[] memory quantity
) public onlyOwner {
require(
userAddress.length == quantity.length,
"Invalid length of elements"
);
for (uint256 i = 0; i < userAddress.length; i++) {
for (uint256 j = 0; j < quantity[i]; j++) {
lastPromoCode++;
// Assign promocode to useraddress
allPromoCode[lastPromoCode] = userAddress[i];
}
}
}
//claimRewards for passive & actives
function claimRewards(uint256 contractId) public {
if (contractId == 0) {
nodePassive.claimRewards(msg.sender);
} else {
nodeActiveArray[contractId - 1].claimRewards(msg.sender);
}
}
function getUserLastClaimRound(
uint256 contractId,
address user
) public view returns (uint256) {
if (contractId == 0) {
return nodePassive.getUserLastClaimRound(user);
} else {
return nodeActiveArray[contractId - 1].getUserLastClaimRound(user);
}
}
function getUserCurrentClaimableRewards(
address user
)
public
view
returns (uint256, uint256, uint256, uint256, uint256, uint256, uint256)
{
return (
nodePassive.currentClaimableRewards(user),
nodeActiveL1.currentClaimableRewards(user),
nodeActiveL2.currentClaimableRewards(user),
nodeActiveL3.currentClaimableRewards(user),
nodeActiveL4.currentClaimableRewards(user),
nodeActiveL5.currentClaimableRewards(user),
nodeActiveL6.currentClaimableRewards(user)
);
}
function getUserTotalClaimableRewards(
address user
)
public
view
returns (uint256, uint256, uint256, uint256, uint256, uint256, uint256)
{
return (
nodePassive.totalClaimableRewards(user),
nodeActiveL1.totalClaimableRewards(user),
nodeActiveL2.totalClaimableRewards(user),
nodeActiveL3.totalClaimableRewards(user),
nodeActiveL4.totalClaimableRewards(user),
nodeActiveL5.totalClaimableRewards(user),
nodeActiveL6.totalClaimableRewards(user)
);
}
function getUserTotalClaimableRewardsPerLevel(
address user,
uint256 level
) public view returns (uint256 reward) {
if (level == 0) {
return nodePassive.totalClaimableRewards(user);
} else if (level == 1) {
return nodeActiveL1.totalClaimableRewards(user);
} else if (level == 2) {
return nodeActiveL2.totalClaimableRewards(user);
} else if (level == 3) {
return nodeActiveL3.totalClaimableRewards(user);
} else if (level == 4) {
return nodeActiveL4.totalClaimableRewards(user);
} else if (level == 5) {
return nodeActiveL5.totalClaimableRewards(user);
} else if (level == 6) {
return nodeActiveL6.totalClaimableRewards(user);
}
}
}

@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)
pragma solidity ^0.8.0;
import "../utils/ContextUpgradeable.sol";
import "../proxy/utils/Initializable.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
function __Ownable_init() internal onlyInitializing {
__Ownable_init_unchained();
}
function __Ownable_init_unchained() internal onlyInitializing {
_transferOwnership(_msgSender());
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
/**
* @dev This empty reserved space is put in place to allow future versions to add new
* variables without shifting down storage in the inheritance chain.
* See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
*/
uint256[49] private __gap;
}

@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (proxy/utils/Initializable.sol)
pragma solidity ^0.8.2;
import "../../utils/AddressUpgradeable.sol";
/**
* @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed
* behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an
* external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer
* function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.
*
* The initialization functions use a version number. Once a version number is used, it is consumed and cannot be
* reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in
* case an upgrade adds a module that needs to be initialized.
*
* For example:
*
* [.hljs-theme-light.nopadding]
* ```
* contract MyToken is ERC20Upgradeable {
* function initialize() initializer public {
* __ERC20_init("MyToken", "MTK");
* }
* }
* contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {
* function initializeV2() reinitializer(2) public {
* __ERC20Permit_init("MyToken");
* }
* }
* ```
*
* TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as
* possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.
*
* CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure
* that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.
*
* [CAUTION]
* ====
* Avoid leaving a contract uninitialized.
*
* An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation
* contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke
* the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:
*
* [.hljs-theme-light.nopadding]
* ```
* /// @custom:oz-upgrades-unsafe-allow constructor
* constructor() {
* _disableInitializers();
* }
* ```
* ====
*/
abstract contract Initializable {
/**
* @dev Indicates that the contract has been initialized.
* @custom:oz-retyped-from bool
*/
uint8 private _initialized;
/**
* @dev Indicates that the contract is in the process of being initialized.
*/
bool private _initializing;
/**
* @dev Triggered when the contract has been initialized or reinitialized.
*/
event Initialized(uint8 version);
/**
* @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,
* `onlyInitializing` functions can be used to initialize parent contracts. Equivalent to `reinitializer(1)`.
*/
modifier initializer() {
bool isTopLevelCall = !_initializing;
require(
(isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1),
"Initializable: contract is already initialized"
);
_initialized = 1;
if (isTopLevelCall) {
_initializing = true;
}
_;
if (isTopLevelCall) {
_initializing = false;
emit Initialized(1);
}
}
/**
* @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the
* contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be
* used to initialize parent contracts.
*
* `initializer` is equivalent to `reinitializer(1)`, so a reinitializer may be used after the original
* initialization step. This is essential to configure modules that are added through upgrades and that require
* initialization.
*
* Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in
* a contract, executing them in the right order is up to the developer or operator.
*/
modifier reinitializer(uint8 version) {
require(!_initializing && _initialized < version, "Initializable: contract is already initialized");
_initialized = version;
_initializing = true;
_;
_initializing = false;
emit Initialized(version);
}
/**
* @dev Modifier to protect an initialization function so that it can only be invoked by functions with the
* {initializer} and {reinitializer} modifiers, directly or indirectly.
*/
modifier onlyInitializing() {
require(_initializing, "Initializable: contract is not initializing");
_;
}
/**
* @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.
* Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized
* to any version. It is recommended to use this to lock implementation contracts that are designed to be called
* through proxies.
*/
function _disableInitializers() internal virtual {
require(!_initializing, "Initializable: contract is initializing");
if (_initialized < type(uint8).max) {
_initialized = type(uint8).max;
emit Initialized(type(uint8).max);
}
}
}

@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20Upgradeable {
/**
* @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);
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `from` to `to` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address from,
address to,
uint256 amount
) external returns (bool);
}

@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol)
pragma solidity ^0.8.1;
/**
* @dev Collection of functions related to the address type
*/
library AddressUpgradeable {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*
* [IMPORTANT]
* ====
* You shouldn't rely on `isContract` to protect against flash loan attacks!
*
* Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
* like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
* constructor.
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize/address.code.length, which returns 0
// for contracts in construction, since the code is only stored at the end
// of the constructor execution.
return account.code.length > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain `call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value
) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
require(isContract(target), "Address: call to non-contract");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason using the provided one.
*
* _Available since v4.3._
*/
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
/// @solidity memory-safe-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}

@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
pragma solidity ^0.8.0;
import "../proxy/utils/Initializable.sol";
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract ContextUpgradeable is Initializable {
function __Context_init() internal onlyInitializing {
}
function __Context_init_unchained() internal onlyInitializing {
}
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
/**
* @dev This empty reserved space is put in place to allow future versions to add new
* variables without shifting down storage in the inheritance chain.
* See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
*/
uint256[50] private __gap;
}

project:/contracts/members/IMemberController.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;
struct Member {
bool active;
address upline;
address[] directs;
uint256 referralCode;
}
interface IMemberController {
function register(address addr, uint256 referralCode) external;
function getUplines(
address addr,
uint256 levels
) external view returns (address[] memory);
function getDirects(address addr) external view returns (address[] memory);
function setCaller(address addr) external;
function genReferralCode(address addr) external returns (uint256);
function getMembers(address sender) external view returns (Member memory);
function checkBurnedLP() external pure returns (bool);
function checkMonthlyPassOrder(address sender) external returns (bool);
}

project:/contracts/nodes/interfaces/INodeActive.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;
interface INodeActive {
function addOrders(
address from,
uint256 endRound,
uint256 shareAmt
) external returns (uint256);
function getLastRound() external view returns (uint256);
function claimRewards(address userAddress) external;
function getUserLastClaimRound(address user)
external
view
returns (uint256);
function currentClaimableRewards(address userAddress)
external
view
returns (uint256);
function totalClaimableRewards(address userAddress)
external
view
returns (uint256);
}

project:/contracts/nodes/interfaces/INodeController.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;
interface INodeController {
function getMaxClaimRound() external view returns (uint256);
}

project:/contracts/nodes/interfaces/INodePassive.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;
struct Round {
uint256 toDistribute;
uint256 toCarryForward;
uint256 accmStakedShare;
uint256 startTime;
}
struct User {
uint256 startingIndexForAddShare;
uint256[] sortedRoundForAddShare;
mapping(uint256 => uint256) roundAddShare;
uint256 startingIndexForDeductShare;
uint256[] sortedRoundForDeductShare;
mapping(uint256 => uint256) roundDeductShare;
uint256[] userOrders;
uint256 lastClaimRound;
}
struct Order {
uint256 startRound;
uint256 endRound;
uint256 shareReward;
address owner;
uint256 packageId;
}
interface INodePassive {
function addOrders(
address from,
uint256 shareAmt,
uint256 packageId,
uint256 deAntPrice
) external returns (uint256);
function expireOrder(
address userAddress,
uint256 orderId,
uint256 expireRound
) external returns (uint256, bool);
function getUserClockActive(address userAddress)
external
view
returns (bool);
function claimRewards(address userAddress) external;
function getUserLastClaimRound(address user)
external
view
returns (uint256);
function currentClaimableRewards(address userAddress)
external
view
returns (uint256);
function totalClaimableRewards(address userAddress)
external
view
returns (uint256);
}

project:/contracts/token/interfaces/IAnt3.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;
interface IERC20Receiver {
function onERC20Receive(address from, uint256 amount)
external
returns (bool);
}
interface IAnt3 {
function transfer(address recipient, uint256 amount)
external
returns (bool);
function mint(uint256 amount) external;
}

project:/contracts/token/interfaces/IDeAnt3.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;
interface IDeAnt3 {
function nodeControllerBurn(address account, uint256 amount) external;
function permitMint2(
address payable recipient,
uint256 uniqueId,
uint256 amount,
uint256 deadline,
uint8[] memory v,
bytes32[] memory r,
bytes32[] memory s
) external;
function transfer(
address recipient,
uint256 amount
) external returns (bool);
}

Contract ABI

[{"type":"event","name":"ControllerReceivedTokens","inputs":[{"type":"address","name":"from","internalType":"address","indexed":false},{"type":"address","name":"to","internalType":"address","indexed":false},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Initialized","inputs":[{"type":"uint8","name":"version","internalType":"uint8","indexed":false}],"anonymous":false},{"type":"event","name":"MissingActiveOrder","inputs":[{"type":"uint256","name":"fromOrderID","internalType":"uint256","indexed":false},{"type":"address","name":"fromAddress","internalType":"address","indexed":false},{"type":"address","name":"toAddress","internalType":"address","indexed":false},{"type":"uint256","name":"level","internalType":"uint256","indexed":false},{"type":"uint256","name":"daysActive","internalType":"uint256","indexed":false},{"type":"uint256","name":"shareAmt","internalType":"uint256","indexed":false},{"type":"uint256","name":"lastRound","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"NewActiveOrder","inputs":[{"type":"uint256","name":"fromOrderID","internalType":"uint256","indexed":false},{"type":"uint256","name":"activeOrderID","internalType":"uint256","indexed":false},{"type":"address","name":"fromAddress","internalType":"address","indexed":false},{"type":"address","name":"toAddress","internalType":"address","indexed":false},{"type":"uint256","name":"level","internalType":"uint256","indexed":false},{"type":"uint256","name":"daysActive","internalType":"uint256","indexed":false},{"type":"uint256","name":"shareAmt","internalType":"uint256","indexed":false},{"type":"uint256","name":"lastRound","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"alphaAccmQty","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IAnt3"}],"name":"ant3Token","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"betaAccmQty","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"buyNodesPackage","inputs":[{"type":"uint256","name":"packageId","internalType":"uint256"},{"type":"uint256","name":"promoCode","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256[]","name":"","internalType":"uint256[]"}],"name":"checkQuota","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"claimRewards","inputs":[{"type":"uint256","name":"contractId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IDeAnt3"}],"name":"deAnt3Token","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"expireUserOrder","inputs":[{"type":"address[]","name":"userAddress","internalType":"address[]"},{"type":"uint256[]","name":"orderId","internalType":"uint256[]"},{"type":"uint256[]","name":"expireRound","internalType":"uint256[]"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"gammaAccmQty","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"generatePromoCode","inputs":[{"type":"address[]","name":"userAddress","internalType":"address[]"},{"type":"uint256[]","name":"quantity","internalType":"uint256[]"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getMaxClaimRound","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"deant","internalType":"uint256"},{"type":"uint256","name":"guardian","internalType":"uint256"}],"name":"getPackagePrice","inputs":[{"type":"uint256","name":"packageId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"}],"name":"getUserCurrentClaimableRewards","inputs":[{"type":"address","name":"user","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getUserLastClaimRound","inputs":[{"type":"uint256","name":"contractId","internalType":"uint256"},{"type":"address","name":"user","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"}],"name":"getUserTotalClaimableRewards","inputs":[{"type":"address","name":"user","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"reward","internalType":"uint256"}],"name":"getUserTotalClaimableRewardsPerLevel","inputs":[{"type":"address","name":"user","internalType":"address"},{"type":"uint256","name":"level","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IERC20Upgradeable"}],"name":"guardianToken","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"initialize","inputs":[{"type":"address","name":"_deAnt3Token","internalType":"address payable"},{"type":"address","name":"_ant3Token","internalType":"address"},{"type":"address","name":"_guardianToken","internalType":"address"},{"type":"address","name":"_memberController","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"maxClaimRound","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IMemberController"}],"name":"memberController","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract INodeActive"}],"name":"nodeActiveArray","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract INodeActive"}],"name":"nodeActiveL1","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract INodeActive"}],"name":"nodeActiveL2","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract INodeActive"}],"name":"nodeActiveL3","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract INodeActive"}],"name":"nodeActiveL4","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract INodeActive"}],"name":"nodeActiveL5","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract INodeActive"}],"name":"nodeActiveL6","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract INodePassive"}],"name":"nodePassive","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"onERC20Receive","inputs":[{"type":"address","name":"from","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"alphaDeAntPrice","internalType":"uint256"},{"type":"uint256","name":"alphaGuardianPrice","internalType":"uint256"},{"type":"uint256","name":"betaDeAntPrice","internalType":"uint256"},{"type":"uint256","name":"betaGuardianPrice","internalType":"uint256"},{"type":"uint256","name":"gammaDeAntPrice","internalType":"uint256"},{"type":"uint256","name":"gammaGuardianPrice","internalType":"uint256"},{"type":"uint256","name":"packageId","internalType":"uint256"}],"name":"packagePrices","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"referralRank","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"removeCaller","inputs":[{"type":"address","name":"addr","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setCaller","inputs":[{"type":"address","name":"addr","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setDefaultQuota","inputs":[{"type":"uint256","name":"packageId","internalType":"uint256"},{"type":"uint256","name":"quota","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setGuardianCollectAddress","inputs":[{"type":"address","name":"guardianCollectAddress_","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setMaxClaimRound","inputs":[{"type":"uint256","name":"round","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setMemberControllerContract","inputs":[{"type":"address","name":"_memberController","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setNodeActiveContract","inputs":[{"type":"address","name":"_nodeActiveL1","internalType":"address"},{"type":"address","name":"_nodeActiveL2","internalType":"address"},{"type":"address","name":"_nodeActiveL3","internalType":"address"},{"type":"address","name":"_nodeActiveL4","internalType":"address"},{"type":"address","name":"_nodeActiveL5","internalType":"address"},{"type":"address","name":"_nodeActiveL6","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setNodePassiveContract","inputs":[{"type":"address","name":"_nodePassive","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setPackagePrice","inputs":[{"type":"uint256","name":"packageId","internalType":"uint256"},{"type":"uint256","name":"deAnt3","internalType":"uint256"},{"type":"uint256","name":"guardian","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"today","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"validCaller","inputs":[{"type":"address","name":"","internalType":"address"}]}]
            

Deployed ByteCode

0x608060405234801561001057600080fd5b506004361061027f5760003560e01c8063804a88f61161015c578063c6b821fb116100ce578063f27726d911610087578063f27726d91461060c578063f2fde38b1461061f578063f794e8a414610632578063f8c8765e14610652578063fa180dc914610665578063fce9e70d1461067857600080fd5b8063c6b821fb1461058d578063c94924ac146105a0578063d2089862146105b3578063e3664210146105c6578063eef21cd2146105d9578063efaa0c99146105ec57600080fd5b8063b74e452b11610120578063b74e452b14610525578063bb36aebe1461052e578063beb92f5514610541578063c29889de14610554578063c30a802e14610567578063c5c8a8b21461057a57600080fd5b8063804a88f6146104b85780638b1154f0146104db5780638da5cb5b146104ee57806392a3eaf5146104ff57806392c82c371461051257600080fd5b80632d31a074116101f557806359d637ac116101b957806359d637ac1461040b5780635edcfc7c1461041357806371070aac14610426578063715018a61461044657806379b6340a1461044e5780637d60dc16146104a557600080fd5b80632d31a074146103b457806336f6cdee146103c757806337f960da146103da5780633fea1ade146103ed57806351ec4f561461040257600080fd5b806319801bfc1161024757806319801bfc146103355780631c67fc83146103485780631ccbe9171461035b578063293baee21461037b5780632a5833ad1461038e5780632d26254f146103a157600080fd5b806303d93828146102845780630962ef79146102ac57806311a0ed9b146102c1578063136caeb6146102e95780631712d6dc1461030a575b600080fd5b61029761029236600461301b565b61068b565b60405190151581526020015b60405180910390f35b6102bf6102ba366004613047565b610c23565b005b6102d46102cf366004613047565b610ce2565b604080519283526020830191909152016102a3565b6102fc6102f736600461301b565b610d32565b6040519081526020016102a3565b61031d610318366004613047565b610f11565b6040516001600160a01b0390911681526020016102a3565b6102bf610343366004613060565b610f3b565b60745461031d906001600160a01b031681565b6102fc6103693660046130e2565b607a6020526000908152604090205481565b60775461031d906001600160a01b031681565b6102bf61039c366004613106565b61104b565b60755461031d906001600160a01b031681565b606f5461031d906001600160a01b031681565b60735461031d906001600160a01b031681565b6102bf6103e8366004613262565b611065565b6103f5611261565b6040516102a391906132ea565b6102fc60815481565b6081546102fc565b6102bf610421366004613047565b6112e6565b6102fc6104343660046130e2565b60786020526000908152604090205481565b6102bf6112f3565b606854606954606a54606b54606c54606d54606e546104709695949392919087565b604080519788526020880196909652948601939093526060850191909152608084015260a083015260c082015260e0016102a3565b60665461031d906001600160a01b031681565b6102976104c63660046130e2565b607c6020526000908152604090205460ff1681565b6104706104e93660046130e2565b611307565b6033546001600160a01b031661031d565b6102bf61050d36600461332e565b611650565b6102bf6105203660046130e2565b61176c565b6102fc607d5481565b60655461031d906001600160a01b031681565b6102bf61054f3660046130e2565b611796565b60715461031d906001600160a01b031681565b6102fc610575366004613392565b611836565b6102bf6105883660046130e2565b6118c7565b60725461031d906001600160a01b031681565b6104706105ae3660046130e2565b6118f1565b6102bf6105c13660046133c2565b611be2565b60705461031d906001600160a01b031681565b6102bf6105e73660046130e2565b611c29565b6102fc6105fa3660046130e2565b60796020526000908152604090205481565b6102bf61061a366004613106565b611cba565b6102bf61062d3660046130e2565b611fe0565b6102fc6106403660046130e2565b607b6020526000908152604090205481565b6102bf6106603660046133ee565b612056565b60675461031d906001600160a01b031681565b6102bf6106863660046130e2565b61235f565b6066546000906001600160a01b031633146106ed5760405162461bcd60e51b815260206004820152601f60248201527f4f6e6c792063616c6c61626c652066726f6d20616e7433436f6e74726163740060448201526064015b60405180910390fd5b604080516001600160a01b03851681523060208201529081018390527f36caad1537e014a281b9a1df0065dfc68fef76f0c9c6f8453b546e8b022e48a99060600160405180910390a160006064610745846046613460565b61074f919061347f565b9050600061075d82856134a1565b90506000606461076e836028613460565b610778919061347f565b905060006064610789846014613460565b610793919061347f565b9050600060646107a4856005613460565b6107ae919061347f565b9050600060646107bf866005613460565b6107c9919061347f565b9050600060646107da87600a613460565b6107e4919061347f565b90506000818385876107f68a8c6134a1565b61080091906134a1565b61080a91906134a1565b61081491906134a1565b61081e91906134a1565b606654606f5460405163a9059cbb60e01b81529293506001600160a01b039182169263a9059cbb926108569216908c906004016134b8565b6020604051808303816000875af1158015610875573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061089991906134e6565b50606f546108b0906001600160a01b031689612389565b60665460705460405163a9059cbb60e01b81526001600160a01b039283169263a9059cbb926108e6929116908a906004016134b8565b6020604051808303816000875af1158015610905573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061092991906134e6565b50607054610940906001600160a01b031687612389565b60665460715460405163a9059cbb60e01b81526001600160a01b039283169263a9059cbb926109769291169089906004016134b8565b6020604051808303816000875af1158015610995573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109b991906134e6565b506071546109d0906001600160a01b031686612389565b60665460725460405163a9059cbb60e01b81526001600160a01b039283169263a9059cbb92610a069291169088906004016134b8565b6020604051808303816000875af1158015610a25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a4991906134e6565b50607254610a60906001600160a01b031685612389565b60665460735460405163a9059cbb60e01b81526001600160a01b039283169263a9059cbb92610a969291169087906004016134b8565b6020604051808303816000875af1158015610ab5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ad991906134e6565b50607354610af0906001600160a01b031684612389565b60665460745460405163a9059cbb60e01b81526001600160a01b039283169263a9059cbb92610b269291169086906004016134b8565b6020604051808303816000875af1158015610b45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b6991906134e6565b50607454610b80906001600160a01b031683612389565b60665460755460405163a9059cbb60e01b81526001600160a01b039283169263a9059cbb92610bb69291169085906004016134b8565b6020604051808303816000875af1158015610bd5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bf991906134e6565b50607554610c10906001600160a01b031682612389565b6001985050505050505050505b92915050565b80610c8957606f54604051633bd73ee360e21b81523360048201526001600160a01b039091169063ef5cfb8c906024015b600060405180830381600087803b158015610c6e57600080fd5b505af1158015610c82573d6000803e3d6000fd5b5050505050565b6076610c966001836134a1565b81548110610ca657610ca6613501565b600091825260209091200154604051633bd73ee360e21b81523360048201526001600160a01b039091169063ef5cfb8c90602401610c54565b50565b6000808260011415610cfd5750506068546069549092909150565b8260021415610d15575050606a54606b549092909150565b8260031415610d2d575050606c54606d549092909150565b915091565b600081610daf57606f54604051630757a7e760e01b81526001600160a01b03858116600483015290911690630757a7e7906024015b602060405180830381865afa158015610d84573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610da89190613517565b9050610c1d565b8160011415610dea57607054604051630757a7e760e01b81526001600160a01b03858116600483015290911690630757a7e790602401610d67565b8160021415610e2557607154604051630757a7e760e01b81526001600160a01b03858116600483015290911690630757a7e790602401610d67565b8160031415610e6057607254604051630757a7e760e01b81526001600160a01b03858116600483015290911690630757a7e790602401610d67565b8160041415610e9b57607354604051630757a7e760e01b81526001600160a01b03858116600483015290911690630757a7e790602401610d67565b8160051415610ed657607454604051630757a7e760e01b81526001600160a01b03858116600483015290911690630757a7e790602401610d67565b8160061415610c1d57607554604051630757a7e760e01b81526001600160a01b03858116600483015290911690630757a7e790602401610d67565b60768181548110610f2157600080fd5b6000918252602090912001546001600160a01b0316905081565b610f4361240a565b607080546001600160a01b039788166001600160a01b03199182168117909255607680546001818101835560008390527fb5732705f5241370a28908c2fe1303cb223f03b90d857fd0573f003f79fefed49182018054851690951790945560718054998b169984168a1790558154808501835581018054841690991790985560728054978a169783168817905580548084018255880180548316909717909655607380549589169582168617905585548083018755870180548216909517909455607480549388169385168417905584548082018655860180548516909317909255607580549190961690831681179095558254908101909255910180549091169091179055565b61105361240a565b6000918252607e602052604090912055565b336000818152607c602052604090205460ff166110b65760405162461bcd60e51b815260206004820152600f60248201526e24b73b30b634b21031b0b63632b91760891b60448201526064016106e4565b825184511480156110c8575081518451145b6111145760405162461bcd60e51b815260206004820152601a60248201527f496e76616c6964206c656e677468206f6620656c656d656e747300000000000060448201526064016106e4565b60008060005b865181101561125857606f5487516001600160a01b039091169063b85b83559089908490811061114c5761114c613501565b602002602001015188848151811061116657611166613501565b602002602001015188858151811061118057611180613501565b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b0390931660048401526024830191909152604482015260640160408051808303816000875af11580156111dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112019190613530565b909350915081156112465761124687828151811061122157611221613501565b6020026020010151846001600160a01b039091166000908152607b6020526040902055565b806112508161355c565b91505061111a565b50505050505050565b604080516003808252608082019092526060916000919060208201848036833701905050905060005b60038110156112e057607f60006112a2836001613577565b8152602001908152602001600020548282815181106112c3576112c3613501565b6020908102919091010152806112d88161355c565b91505061128a565b50919050565b6112ee61240a565b608155565b6112fb61240a565b6113056000612464565b565b606f54604051630757a7e760e01b81526001600160a01b0383811660048301526000928392839283928392839283921690630757a7e790602401602060405180830381865afa15801561135e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113829190613517565b607054604051630757a7e760e01b81526001600160a01b038b8116600483015290911690630757a7e790602401602060405180830381865afa1580156113cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113f09190613517565b607154604051630757a7e760e01b81526001600160a01b038c8116600483015290911690630757a7e790602401602060405180830381865afa15801561143a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061145e9190613517565b607254604051630757a7e760e01b81526001600160a01b038d8116600483015290911690630757a7e790602401602060405180830381865afa1580156114a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114cc9190613517565b607354604051630757a7e760e01b81526001600160a01b038e8116600483015290911690630757a7e790602401602060405180830381865afa158015611516573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061153a9190613517565b607454604051630757a7e760e01b81526001600160a01b038f8116600483015290911690630757a7e790602401602060405180830381865afa158015611584573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115a89190613517565b607560009054906101000a90046001600160a01b03166001600160a01b0316630757a7e78f6040518263ffffffff1660e01b81526004016115f891906001600160a01b0391909116815260200190565b602060405180830381865afa158015611615573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116399190613517565b959e949d50929b5090995097509550909350915050565b61165861240a565b80518251146116a95760405162461bcd60e51b815260206004820152601a60248201527f496e76616c6964206c656e677468206f6620656c656d656e747300000000000060448201526064016106e4565b60005b82518110156117675760005b8282815181106116ca576116ca613501565b602002602001015181101561175457608080549060006116e98361355c565b919050555083828151811061170057611700613501565b602002602001015160826000608054815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b03160217905550808061174c9061355c565b9150506116b8565b508061175f8161355c565b9150506116ac565b505050565b61177461240a565b606f80546001600160a01b0319166001600160a01b0392909216919091179055565b61179e61240a565b6001600160a01b0381166000908152607c602052604090205460ff16156118125760405162461bcd60e51b815260206004820152602260248201527f4164647265737320616c726561647920697320612076616c69642063616c6c65604482015261391760f11b60648201526084016106e4565b6001600160a01b03166000908152607c60205260409020805460ff19166001179055565b60008261186f57606f5460405163083108df60e41b81526001600160a01b038481166004830152909116906383108df090602401610d67565b607661187c6001856134a1565b8154811061188c5761188c613501565b60009182526020909120015460405163083108df60e41b81526001600160a01b038481166004830152909116906383108df090602401610d67565b6118cf61240a565b608580546001600160a01b0319166001600160a01b0392909216919091179055565b606f546040516356322e6760e01b81526001600160a01b03838116600483015260009283928392839283928392839216906356322e6790602401602060405180830381865afa158015611948573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061196c9190613517565b6070546040516356322e6760e01b81526001600160a01b038b81166004830152909116906356322e6790602401602060405180830381865afa1580156119b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119da9190613517565b6071546040516356322e6760e01b81526001600160a01b038c81166004830152909116906356322e6790602401602060405180830381865afa158015611a24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a489190613517565b6072546040516356322e6760e01b81526001600160a01b038d81166004830152909116906356322e6790602401602060405180830381865afa158015611a92573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ab69190613517565b6073546040516356322e6760e01b81526001600160a01b038e81166004830152909116906356322e6790602401602060405180830381865afa158015611b00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b249190613517565b6074546040516356322e6760e01b81526001600160a01b038f81166004830152909116906356322e6790602401602060405180830381865afa158015611b6e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b929190613517565b607560009054906101000a90046001600160a01b03166001600160a01b03166356322e678f6040518263ffffffff1660e01b81526004016115f891906001600160a01b0391909116815260200190565b611bea61240a565b8260011415611bff5760689190915560695550565b8260021415611c1457606a91909155606b5550565b826003141561176757606c91909155606d5550565b611c3161240a565b6001600160a01b0381166000908152607c602052604090205460ff16611c995760405162461bcd60e51b815260206004820152601e60248201527f41646472657373206973206e6f7420612076616c69642063616c6c65722e000060448201526064016106e4565b6001600160a01b03166000908152607c60205260409020805460ff19169055565b600080611cc684610ce2565b91509150600082118015611cda5750600081115b611d265760405162461bcd60e51b815260206004820152601960248201527f5072696365206d757374206265206d6f7265207468616e20300000000000000060448201526064016106e4565b611d318484336124b6565b606554604051631e71e43560e01b81526001600160a01b0390911690631e71e43590611d6390339086906004016134b8565b600060405180830381600087803b158015611d7d57600080fd5b505af1158015611d91573d6000803e3d6000fd5b50506067546085546040516323b872dd60e01b81523360048201526001600160a01b03918216602482015260448101869052911692506323b872dd91506064016020604051808303816000875af1158015611df0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e1491906134e6565b50611e1f3385612653565b336000908152607b6020526040902054841115611e4957336000908152607b602052604090208490555b6000611e5533866126e3565b9050611e6083612882565b606f5460405163ef134a5f60e01b81523360048201526024810183905260448101879052606481018590526000916001600160a01b03169063ef134a5f906084016020604051808303816000875af1158015611ec0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ee49190613517565b9050611ef2338388846128b3565b607754604051637854462960e01b81523360048201526001600160a01b0390911690637854462990602401600060405180830381865afa158015611f3a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611f6291908101906135f3565b60600151611fd8576077546040516339f5e15760e01b81523360048201526001600160a01b03909116906339f5e157906024016020604051808303816000875af1158015611fb4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112589190613517565b505050505050565b611fe861240a565b6001600160a01b03811661204d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106e4565b610cdf81612464565b600054610100900460ff16158080156120765750600054600160ff909116105b806120905750303b158015612090575060005460ff166001145b6120f35760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016106e4565b6000805460ff191660011790558015612116576000805461ff0019166101001790555b61211e612ef1565b606580546001600160a01b038088166001600160a01b031992831617909255606680548784169083161790556067805486841690831617905560778054928516928216929092179091556085805490911673f18dd3538362d890cd13e06e6688ab7288ea764f179055633b9aca006083819055670de0b6b3a76400006084556121a9906103e8613460565b6068556084546121ba906064613460565b6069556083546121cc90612710613460565b606a556084546121de906103e8613460565b606b556083546121f190620186a0613460565b606c5560845461220390612710613460565b606d55620186a060805561012c7f7afe9ba6764d98c6df14cc42f8e5ed95785704349c2ecc924e88cd230fc9ab7581905560647f08ca9dc48bce965d6f2f007711a9a92fa846b7d0efba56f78a29fe4b61a185d7819055600a7ff5600a943bce9b35b0c4adf419273389e664dbeb51324b92eba59a81caa2ca118190557f57d9663c02d8eb0b99c4a71b2749807eef71f465a7af3de873de3d7c68e90b41929092557f125ff6911def68700928aef26fba6eadb111f08ee8d391f09b2803312a3fa11d557f2c748d7cdfe52e800f46e51cb67b2f0fc77558b8617942a194e0158f17eafffe8190556033546001600160a01b03166000908152607c60205260409020805460ff191660011790556081558015610c82576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050565b61236761240a565b607780546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0382163b1561240657604051627b270560e31b81526001600160a01b038316906303d93828906123c690309085906004016134b8565b6020604051808303816000875af1925050508015612401575060408051601f3d908101601f191682019092526123fe918101906134e6565b60015b611767575b5050565b6033546001600160a01b031633146113055760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106e4565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b607d546124c69062015180613577565b421061254f5760005b600381101561252a57607e60006124e7836001613577565b815260200190815260200160002054607f60008360016125079190613577565b8152602081019190915260400160002055806125228161355c565b9150506124cf565b50607d5461253b5742607d5561254f565b607d5461254b9062015180613577565b607d555b81156125d4576000828152608260205260409020546001600160a01b038281169116146125b45760405162461bcd60e51b815260206004820152601360248201527224b73b30b634b210283937b6b79021b7b2329760691b60448201526064016106e4565b50600090815260826020526040902080546001600160a01b031916905550565b6000838152607f602052604090205461262f5760405162461bcd60e51b815260206004820152601760248201527f52656163686564206c696d6974206f662071756f74612e00000000000000000060448201526064016106e4565b6000838152607f60205260408120805491612649836136a7565b9190505550505050565b8060011415612689576001600160a01b03821660009081526078602052604081208054916126808361355c565b91905055505050565b80600214156126b6576001600160a01b03821660009081526079602052604081208054916126808361355c565b8060031415612406576001600160a01b0382166000908152607a602052604081208054916126808361355c565b60008160031415612774576001600160a01b0383166000908152607a6020526040902054600a101561271857506104b0610c1d565b6001600160a01b0383166000908152607a6020526040902054600510801561275857506001600160a01b0383166000908152607a6020526040902054600b115b15612766575061044c610c1d565b506103e8610c1d565b610c1d565b81600214156127fb576001600160a01b038316600090815260796020526040902054600a10156127a657506078610c1d565b6001600160a01b03831660009081526079602052604090205460051080156127e657506001600160a01b038316600090815260796020526040902054600b115b156127f35750606e610c1d565b506064610c1d565b8160011415610c1d576001600160a01b038316600090815260786020526040902054600a101561282d5750600c610c1d565b6001600160a01b038316600090815260786020526040902054600510801561286d57506001600160a01b038316600090815260786020526040902054600b115b1561287a5750600b610c1d565b50600a610c1d565b60665460405163140e25ad60e31b8152600481018390526001600160a01b039091169063a0712d6890602401610c54565b607754604051631c8a1fb760e21b81526000916001600160a01b0316906372287edc906128e79088906006906004016134b8565b600060405180830381865afa158015612904573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261292c91908101906136be565b905060005b8151811015611fd85760006001600160a01b031682828151811061295757612957613501565b60200260200101516001600160a01b031614612edf5760006129b785607b600086868151811061298957612989613501565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002054612f20565b606f5484519192506001600160a01b03169063b362725d908590859081106129e1576129e1613501565b60200260200101516040518263ffffffff1660e01b8152600401612a1491906001600160a01b0391909116815260200190565b602060405180830381865afa158015612a31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a5591906134e6565b151560011415612df057600282118015612b0b575060775483516001600160a01b039091169063746edc9e90859085908110612a9357612a93613501565b60200260200101516040518263ffffffff1660e01b8152600401612ac691906001600160a01b0391909116815260200190565b6020604051808303816000875af1158015612ae5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b0991906134e6565b155b15612c02577f087111a51dd309c304c481ef791a6cebd4d033e7c27f2adf2f2d0af400f73a108488858581518110612b4557612b45613501565b6020026020010151856001612b5a9190613577565b858b60768981548110612b6f57612b6f613501565b6000918252602091829020015460408051634231a2c360e01b815290516001600160a01b0390921692634231a2c3926004808401938290030181865afa158015612bbd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612be19190613517565b604051612bf497969594939291906136fb565b60405180910390a150612edf565b600060768381548110612c1757612c17613501565b60009182526020909120015484516001600160a01b039091169063ef75c38690869086908110612c4957612c49613501565b60209081029190910101516040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018a9052604481018590526064016020604051808303816000875af1158015612ca8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ccc9190613517565b90507fb94a08333baf9b3f9b10bc5d885893b4889cd7e9b376c8b5de26ef8b14fd2d1385828a878781518110612d0457612d04613501565b6020026020010151876001612d199190613577565b878d60768b81548110612d2e57612d2e613501565b6000918252602091829020015460408051634231a2c360e01b815290516001600160a01b0390921692634231a2c3926004808401938290030181865afa158015612d7c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612da09190613517565b6040805198895260208901979097526001600160a01b0395861696880196909652939092166060860152608085015260a084015260c083015260e08201526101000160405180910390a150612edd565b7f087111a51dd309c304c481ef791a6cebd4d033e7c27f2adf2f2d0af400f73a108488858581518110612e2557612e25613501565b6020026020010151856001612e3a9190613577565b858b60768981548110612e4f57612e4f613501565b6000918252602091829020015460408051634231a2c360e01b815290516001600160a01b0390921692634231a2c3926004808401938290030181865afa158015612e9d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ec19190613517565b604051612ed497969594939291906136fb565b60405180910390a15b505b80612ee98161355c565b915050612931565b600054610100900460ff16612f185760405162461bcd60e51b81526004016106e490613737565b611305612fd6565b60008260011415612f5e578160011415612f3c57506014610c1d565b8160021415612f4d5750601e610c1d565b816003141561276f57506028610c1d565b8260021415612f9a578160011415612f785750601e610c1d565b8160021415612f895750602d610c1d565b816003141561276f57506032610c1d565b8260031415610c1d578160011415612fb457506028610c1d565b8160021415612fc55750603c610c1d565b8160031415610c1d57506050610c1d565b600054610100900460ff16612ffd5760405162461bcd60e51b81526004016106e490613737565b61130533612464565b6001600160a01b0381168114610cdf57600080fd5b6000806040838503121561302e57600080fd5b823561303981613006565b946020939093013593505050565b60006020828403121561305957600080fd5b5035919050565b60008060008060008060c0878903121561307957600080fd5b863561308481613006565b9550602087013561309481613006565b945060408701356130a481613006565b935060608701356130b481613006565b925060808701356130c481613006565b915060a08701356130d481613006565b809150509295509295509295565b6000602082840312156130f457600080fd5b81356130ff81613006565b9392505050565b6000806040838503121561311957600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561316757613167613128565b604052919050565b600067ffffffffffffffff82111561318957613189613128565b5060051b60200190565b600082601f8301126131a457600080fd5b813560206131b96131b48361316f565b61313e565b82815260059290921b840181019181810190868411156131d857600080fd5b8286015b848110156131fc5780356131ef81613006565b83529183019183016131dc565b509695505050505050565b600082601f83011261321857600080fd5b813560206132286131b48361316f565b82815260059290921b8401810191818101908684111561324757600080fd5b8286015b848110156131fc578035835291830191830161324b565b60008060006060848603121561327757600080fd5b833567ffffffffffffffff8082111561328f57600080fd5b61329b87838801613193565b945060208601359150808211156132b157600080fd5b6132bd87838801613207565b935060408601359150808211156132d357600080fd5b506132e086828701613207565b9150509250925092565b6020808252825182820181905260009190848201906040850190845b8181101561332257835183529284019291840191600101613306565b50909695505050505050565b6000806040838503121561334157600080fd5b823567ffffffffffffffff8082111561335957600080fd5b61336586838701613193565b9350602085013591508082111561337b57600080fd5b5061338885828601613207565b9150509250929050565b600080604083850312156133a557600080fd5b8235915060208301356133b781613006565b809150509250929050565b6000806000606084860312156133d757600080fd5b505081359360208301359350604090920135919050565b6000806000806080858703121561340457600080fd5b843561340f81613006565b9350602085013561341f81613006565b9250604085013561342f81613006565b9150606085013561343f81613006565b939692955090935050565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161561347a5761347a61344a565b500290565b60008261349c57634e487b7160e01b600052601260045260246000fd5b500490565b6000828210156134b3576134b361344a565b500390565b6001600160a01b03929092168252602082015260400190565b805180151581146134e157600080fd5b919050565b6000602082840312156134f857600080fd5b6130ff826134d1565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561352957600080fd5b5051919050565b6000806040838503121561354357600080fd5b82519150613553602084016134d1565b90509250929050565b60006000198214156135705761357061344a565b5060010190565b6000821982111561358a5761358a61344a565b500190565b600082601f8301126135a057600080fd5b815160206135b06131b48361316f565b82815260059290921b840181019181810190868411156135cf57600080fd5b8286015b848110156131fc5780516135e681613006565b83529183019183016135d3565b60006020828403121561360557600080fd5b815167ffffffffffffffff8082111561361d57600080fd5b908301906080828603121561363157600080fd5b60405160808101818110838211171561364c5761364c613128565b604052613658836134d1565b8152602083015161366881613006565b602082015260408301518281111561367f57600080fd5b61368b8782860161358f565b6040830152506060830151606082015280935050505092915050565b6000816136b6576136b661344a565b506000190190565b6000602082840312156136d057600080fd5b815167ffffffffffffffff8111156136e757600080fd5b6136f38482850161358f565b949350505050565b9687526001600160a01b0395861660208801529390941660408601526060850191909152608084015260a083019190915260c082015260e00190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b60608201526080019056fea2646970667358221220890d1d0b553ec84fc6426df862a605a0fc5f83a7b8251ecb11a53e5d1985d63964736f6c634300080c0033