AVAX Price: $22.27 (+4.25%)
Gas: 1.9 nAVAX
 

Overview

AVAX Balance

Avalanche C-Chain LogoAvalanche C-Chain LogoAvalanche C-Chain Logo0 AVAX

AVAX Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Create Nodes Mig...142208292022-05-03 13:28:351086 days ago1651584515IN
0xea9a51AB...46569a84C
0 AVAX0.00665776186.45034995
Create Nodes Mig...133127922022-04-12 7:07:321107 days ago1649747252IN
0xea9a51AB...46569a84C
0 AVAX0.0012485235
Create Nodes Mig...133127922022-04-12 7:07:321107 days ago1649747252IN
0xea9a51AB...46569a84C
0 AVAX0.0012485235
Create Nodes Mig...132692452022-04-11 6:41:131108 days ago1649659273IN
0xea9a51AB...46569a84C
0 AVAX0.0023418565.64978633
Create Nodes Mig...132692162022-04-11 6:40:131108 days ago1649659213IN
0xea9a51AB...46569a84C
0 AVAX0.0023706666.52439994
Create Nodes Mig...132692132022-04-11 6:40:071108 days ago1649659207IN
0xea9a51AB...46569a84C
0 AVAX0.0023640166.33771503
Create Nodes Mig...132673152022-04-11 5:36:331108 days ago1649655393IN
0xea9a51AB...46569a84C
0 AVAX0.0021424860
Create Nodes Mig...132580772022-04-11 0:25:531108 days ago1649636753IN
0xea9a51AB...46569a84C
0 AVAX0.00419059117.31800306
Create Nodes Mig...132580722022-04-11 0:25:421108 days ago1649636742IN
0xea9a51AB...46569a84C
0 AVAX0.00419641117.48080689
Create Nodes Mig...132542182022-04-10 22:16:231108 days ago1649628983IN
0xea9a51AB...46569a84C
0 AVAX0.00397285111.37180333
Create Nodes Mig...132521612022-04-10 21:07:081108 days ago1649624828IN
0xea9a51AB...46569a84C
0 AVAX0.003796794.89148094
Create Nodes Mig...132521142022-04-10 21:05:341108 days ago1649624734IN
0xea9a51AB...46569a84C
0 AVAX0.0039605899.04678048
Claim Rewards Ba...132519092022-04-10 20:58:411108 days ago1649624321IN
0xea9a51AB...46569a84C
0 AVAX0.00321607100.62495733
Create Nodes Mig...132516552022-04-10 20:50:101108 days ago1649623810IN
0xea9a51AB...46569a84C
0 AVAX0.00420006104.94127651
Create Nodes Mig...132516422022-04-10 20:49:441108 days ago1649623784IN
0xea9a51AB...46569a84C
0 AVAX0.00408838102.24293308
Create Nodes Mig...132516422022-04-10 20:49:441108 days ago1649623784IN
0xea9a51AB...46569a84C
0 AVAX0.00408838102.24293308
Claim Rewards Ba...132513852022-04-10 20:41:041108 days ago1649623264IN
0xea9a51AB...46569a84C
0 AVAX0.01282068114.04072095
Create Nodes Mig...132513332022-04-10 20:39:201108 days ago1649623160IN
0xea9a51AB...46569a84C
0 AVAX0.00470098117.56282969
Create Nodes Mig...132513192022-04-10 20:38:521108 days ago1649623132IN
0xea9a51AB...46569a84C
0 AVAX0.00495643123.8396917
Create Nodes Mig...132513152022-04-10 20:38:441108 days ago1649623124IN
0xea9a51AB...46569a84C
0 AVAX0.00498369124.63283812
Create Nodes Mig...132513152022-04-10 20:38:441108 days ago1649623124IN
0xea9a51AB...46569a84C
0 AVAX0.00499837125
Create Nodes Mig...132512802022-04-10 20:37:321108 days ago1649623052IN
0xea9a51AB...46569a84C
0 AVAX0.00512294128
Create Nodes Wit...132512122022-04-10 20:35:181108 days ago1649622918IN
0xea9a51AB...46569a84C
0 AVAX0.00419081130.85271157
Create Nodes Mig...132511512022-04-10 20:33:161108 days ago1649622796IN
0xea9a51AB...46569a84C
0 AVAX0.0052311130.70245843
Create Nodes Mig...132511482022-04-10 20:33:101108 days ago1649622790IN
0xea9a51AB...46569a84C
0 AVAX0.00528933132.11779521
View all transactions

Parent Transaction Hash Block From To
View All Internal Transactions
Loading...
Loading

Similar Match Source Code
This contract matches the deployed Bytecode of the Source Code for Contract 0xd40fFBf8...c0BCF2806
The constructor portion of the code might be different and could alter the actual behaviour of the contract

Contract Name:
Handler

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 6 : Handler.sol
// SPDX-License-Identifier: AGPL-3.0-or-later

pragma solidity ^0.8.0;

import "./INodeType.sol";
import "./IPolarNode.sol";
import "./IPolarLuckyBox.sol";
import "./ISwapper.sol";
import "./Owners.sol";


contract Handler is Owners {
	event NewNode(
		address indexed owner,
		string indexed name,
		uint count
	);

	struct NodeType {
		string[] keys; // nodeTypeName to address
		mapping(string => address) values;
		mapping(string => uint256) indexOf;
		mapping(string => bool) inserted;
	}

	struct Token {
		uint[] keys; // token ids to nodeTypeName
		mapping(uint => string) values;
		mapping(uint => uint) indexOf;
		mapping(uint => bool) inserted;
	}

	NodeType private mapNt;
	Token private mapToken;

	address public nft;
	
	IPolarLuckyBox private lucky;
	ISwapper private swapper;

	modifier onlyNft() {
		require(msg.sender == nft, "Handler: Only Nft");
		_;
	}

	// external
	function addNodeType(address _addr) external onlyOwners {
		string memory name = INodeType(_addr).name();
		require(!mapNt.inserted[name], "Handler: NodeType already exists");
		mapNtSet(name, _addr);
	}
	
	function addMultipleNodeTypes(address[] memory _addrs) external onlyOwners {
		for (uint i = 0; i < _addrs.length; i++) {
			string memory name = INodeType(_addrs[i]).name();
			mapNtSet(name, _addrs[i]);
		}
	}

	function updateNodeTypeAddress(string memory name, address _addr) external onlyOwners {
		require(mapNt.inserted[name], "Handler: NodeType doesnt exist");
		mapNt.values[name] = _addr;
	}

	function transferFrom(address from, address to, uint tokenId) external onlyNft {
		INodeType(mapNt.values[mapToken.values[tokenId]])
			.transferFrom(from, to, tokenId);
	}
	
	function createNodesWithTokens(
		address tokenIn,
		address user,
		string memory name,
		uint count,
		string memory sponso
	) 
		external 
	{
		uint[] memory tokenIds = _setUpNodes(name, user, count);

		uint price = INodeType(mapNt.values[name])
			.createNodesWithTokens(user, tokenIds);
		
		swapper.swapCreateNodesWithTokens(tokenIn, msg.sender, price, sponso);
	
		emit NewNode(user, name, count);
	}

	function createNodesLevelUp(
		address tokenOut,
		string[] memory nameFrom,
		uint[][] memory tokenIdsToBurn,
		string memory nameTo,
		uint count
	)
		external
	{
		require(nameFrom.length == tokenIdsToBurn.length, "Handler: Length mismatch");

		uint[] memory tokenIds = _setUpNodes(nameTo, msg.sender, count);
		
		claimRewardsBatch(tokenOut, msg.sender, nameFrom, tokenIdsToBurn);

		uint price = INodeType(mapNt.values[nameTo])
			.createNodesLevelUp(msg.sender, tokenIds);

		for (uint i = 0; i < nameFrom.length && price > 0; i++) {
			require(mapNt.inserted[nameFrom[i]], "Handler: NodeType doesnt exist");
			
			IPolarNode(nft).burnBatch(msg.sender, tokenIdsToBurn[i]);

			for (uint j = 0; j < tokenIdsToBurn[i].length; j++) {
				require(mapToken.inserted[tokenIdsToBurn[i][j]], "Handler: TokenId doesnt exist");
				mapTokenRemove(tokenIdsToBurn[i][j]);
			}

			address nt = mapNt.values[nameFrom[i]];

			uint burnedPrice = INodeType(nt).burnFrom(msg.sender, tokenIdsToBurn[i]);

			price = price > burnedPrice ? price - burnedPrice : 0;
		}

		require(price == 0, "Handler: Nice try buddy");
		
		emit NewNode(msg.sender, nameTo, count);
	}

	function createNodesWithPending(
		address tokenOut,
		string[] memory nameFrom,
		uint[][] memory tokenIdsToClaim,
		string memory nameTo,
		uint count
	)
		external
	{
		require(nameFrom.length == tokenIdsToClaim.length, "Handler: Length mismatch");
		
		uint[] memory tokenIds = _setUpNodes(nameTo, msg.sender, count);
		
		uint rewardsTotal;
		uint feesTotal;
		
		uint price = INodeType(mapNt.values[nameTo])
			.createNodesWithPendings(msg.sender, tokenIds);

		for (uint i = 0; i < nameFrom.length; i++) {
			require(mapNt.inserted[nameFrom[i]], "Handler: NodeType doesnt exist");
			
			(uint rewards, uint fees) = INodeType(mapNt.values[nameFrom[i]])
				.claimRewardsBatch(msg.sender, tokenIdsToClaim[i]);

			rewardsTotal += rewards;
			feesTotal += fees;
		}

		require(price <= rewardsTotal, "Handler: Not enough pending");

		swapper.swapCreateNodesWithPending(
			tokenOut, msg.sender, rewardsTotal - price, feesTotal);
		
		emit NewNode(msg.sender, nameTo, count);
	}

	function createNodesWithLuckyBoxes(uint[] memory tokenIdsLuckyBoxes) external {
		string[] memory nodeTypes;
		string[] memory features;
		
		(nodeTypes, features) = lucky
			.createNodesWithLuckyBoxes(msg.sender, tokenIdsLuckyBoxes);

		for (uint i = 0; i < nodeTypes.length; i++) {
			uint[] memory tokenIds = _setUpNodes(nodeTypes[i], msg.sender, 1);

			INodeType(mapNt.values[nodeTypes[i]])
				.createNodeWithLuckyBox(
					msg.sender,
					tokenIds, 
					features[i]
				);
		
			emit NewNode(msg.sender, nodeTypes[i], 1);
		}
	}
	
	function createNodesMigration(
		address user,
		string[] memory nameFrom,
		uint[] memory count
	) 
		external 
	{
		require(user == msg.sender || isOwner[msg.sender], 
			"Handler: Sender not authorized");
		require(nameFrom.length == count.length, "Handler: Length mismatch");

		for (uint i = 0; i < nameFrom.length; i++) {
			uint[] memory tokenIds = _setUpNodes(nameFrom[i], user, count[i]);
		
			INodeType(mapNt.values[nameFrom[i]])
				.createNodesMigration(user, tokenIds);
			
			emit NewNode(user, nameFrom[i], count[i]);
		}
	}

	function createNodesAirDrop(
		string memory name,
		address user,
		uint isBoostedAirDropRate,
		bool[] memory areBoostedNft,
		bool isBoostedToken,
		string memory feature, 
		uint count
	) 
		external 
		onlyOwners 
	{
		require(areBoostedNft.length == 1, "Handler: Create one by one");
		require(count > 0, "Handler: Count must be greater than 0");
		
		for (uint i = 0; i < count; i++) {
			uint[] memory tokenIds = _setUpNodes(name, user, 1);

			INodeType(mapNt.values[name])
				.createNodeCustom(
					user,
					isBoostedAirDropRate,
					tokenIds, 
					areBoostedNft,
					isBoostedToken,
					feature
				);
		}

		emit NewNode(user, name, count);
	}

	function createLuckyBoxesWithTokens(
		address tokenIn,
		address user,
		string memory name,
		uint count,
		string memory sponso
	) 
		external 
	{
		uint price = lucky
			.createLuckyBoxesWithTokens(name, count, user);
		
		swapper.swapCreateLuckyBoxesWithTokens(tokenIn, msg.sender, price, sponso);
	}

	function createLuckyBoxesAirDrop(
		string memory name,
		address user,
		uint count
	) 
		external 
		onlyOwners 
	{
		lucky.createLuckyBoxesAirDrop(name, count, user);
	}

	function nodeEvolution(
		string memory name,
		address user,
		uint[] memory tokenIds,
		uint isBoostedAirDropRate,
		bool[] memory areBoostedNft,
		bool isBoostedToken,
		string memory feature
	) 
		external 
		onlyOwners 
	{
		require(tokenIds.length == 1, "Handler: Evolve one by one");
		require(tokenIds.length == areBoostedNft.length, "Handler: Length mismatch");
		require(mapNt.inserted[name], "Handler: NodeType doesnt exist");
		require(mapToken.inserted[tokenIds[0]], "Handler: Token doesnt exist");

		INodeType(mapNt.values[mapToken.values[tokenIds[0]]])
			.burnFrom(user, tokenIds);
		
		mapTokenSet(tokenIds[0], name);
		
		INodeType(mapNt.values[name])
			.createNodeCustom(
				user, 
				isBoostedAirDropRate, 
				tokenIds,
				areBoostedNft,
				isBoostedToken,
				feature
			);

		IPolarNode(nft).setTokenIdToType(tokenIds[0], name);
	}

	function claimRewardsAll(address tokenOut, address user) external {
		require(user == msg.sender || isOwner[msg.sender], "Handler: Dont mess with other claims");
		
		uint rewardsTotal;
		uint feesTotal;

		for (uint i = 0; i < mapNt.keys.length; i++) {
			(uint rewards, uint fees) = INodeType(mapNt.values[mapNt.keys[i]])
				.claimRewardsAll(user);
			rewardsTotal += rewards;
			feesTotal += fees;
		}

		swapper.swapClaimRewardsAll(tokenOut, user, rewardsTotal, feesTotal);
	}

	function claimRewardsBatch(
		address tokenOut,
		address user,
		string[] memory names,
		uint[][] memory tokenIds
	)
		public
	{
		require(user == msg.sender || isOwner[msg.sender], "Handler: Dont mess with other claims");

		uint rewardsTotal;
		uint feesTotal;

		require(names.length == tokenIds.length, "Handler: Length mismatch");

		for (uint i = 0; i < names.length; i++) {
			require(mapNt.inserted[names[i]], "Handler: NodeType doesnt exist");
			
			(uint rewards, uint fees) = INodeType(mapNt.values[names[i]])
				.claimRewardsBatch(user, tokenIds[i]);
			rewardsTotal += rewards;
			feesTotal += fees;
		}
		
		swapper.swapClaimRewardsBatch(tokenOut, user, rewardsTotal, feesTotal);
	}
	
	function claimRewardsNodeType(
		address tokenOut,
		address user,
		string memory name
	)
		public
	{
		require(user == msg.sender || isOwner[msg.sender], "Handler: Dont mess with other claims");
		require(mapNt.inserted[name], "Handler: NodeType doesnt exist");

		(uint rewardsTotal, uint feesTotal) = INodeType(mapNt.values[name])
			.claimRewardsAll(user);

		swapper.swapClaimRewardsNodeType(tokenOut, user, rewardsTotal, feesTotal);
	}

	// external setters
	// handler setters
	function setNft(address _new) external onlyOwners {
		require(_new != address(0), "Handler: Nft cannot be address zero");
		nft = _new;
	}
	
	function setLucky(address _new) external onlyOwners {
		require(_new != address(0), "Handler: Loot cannot be address zero");
		lucky = IPolarLuckyBox(_new);
	}
	
	function setSwapper(address _new) external onlyOwners {
		require(_new != address(0), "Handler: Swapper cannot be address zero");
		swapper = ISwapper(_new);
	}
	
	// external view
	function getNodeTypesSize() external view returns(uint) {
		return mapNt.keys.length;
	}

	function getTotalCreatedNodes() external view returns(uint) {
		uint totalNodes;
		for (uint i = 0; i < mapNt.keys.length; i++) {
			totalNodes += INodeType(mapNt.values[mapNt.keys[i]])
				.totalCreatedNodes();
		}
		return totalNodes;
	}
	
	function getNodeTypesBetweenIndexes(
		uint iStart, 
		uint iEnd
	) 
		external 
		view 
		returns(string[] memory) 
	{
		string[] memory nodeTypes = new string[](iEnd - iStart);
		for (uint i = iStart; i < iEnd; i++)
			nodeTypes[i - iStart] = mapNt.keys[i];
		return nodeTypes;
	}
	
	function getNodeTypesAddress(string memory key) external view returns(address) {
		require(mapNt.inserted[key], "NodeType doesnt exist");
		return mapNt.values[key];
	}

	function getAttribute(uint tokenId) external view returns(string memory) {
		return INodeType(mapNt.values[mapToken.values[tokenId]])
			.getAttribute(tokenId);
	}
	
	function getTokenIdsSize() external view returns(uint) {
		return mapToken.keys.length;
	}
	
	function getTokenIdsBetweenIndexes(
		uint iStart, 
		uint iEnd
	) 
		external 
		view 
		returns(uint[] memory) 
	{
		uint[] memory ids = new uint[](iEnd - iStart);
		for (uint i = iStart; i < iEnd; i++)
			ids[i - iStart] = mapToken.keys[i];
		return ids;
	}
	
	function getTokenIdsNodeTypeBetweenIndexes(
		uint iStart, 
		uint iEnd
	) 
		external 
		view 
		returns(string[] memory) 
	{
		string[] memory names = new string[](iEnd - iStart);
		for (uint i = iStart; i < iEnd; i++)
			names[i - iStart] = mapToken.values[mapToken.keys[i]];
		return names;
	}
	
	function getTokenIdNodeTypeName(uint key) external view returns(string memory) {
		require(mapToken.inserted[key], "TokenId doesnt exist");
		return mapToken.values[key];
	}

	function getTotalNodesOf(address user) external view returns(uint) {
		uint totalNodes;
		for (uint i = 0; i < mapNt.keys.length; i++) {
			totalNodes += INodeType(mapNt.values[mapNt.keys[i]])
				.getTotalNodesNumberOf(user);
		}
		return totalNodes;
	}
	
	function getClaimableRewardsOf(address user) external view returns(uint, uint) {
		uint rewardsTotal;
		uint feesTotal;
		for (uint i = 0; i < mapNt.keys.length; i++) {
			(uint rewards, uint fees) = INodeType(mapNt.values[mapNt.keys[i]])
				.calculateUserRewards(user);
				rewardsTotal += rewards;
				feesTotal += fees;
		}
		return (rewardsTotal, feesTotal);
	}

	// internal
	function _setUpNodes(
		string memory name,
		address user,
		uint count
	)
		private
		returns(
			uint[] memory
		)
	{
		require(mapNt.inserted[name], "Handler: NodeType doesnt exist");

		uint[] memory tokenIds = IPolarNode(nft).generateNfts(name, user, count);

		for (uint i = 0; i < tokenIds.length; i++)
			mapTokenSet(tokenIds[i], name);

		return tokenIds;
	}

	 function strcmp(string memory s1, string memory s2) internal pure returns(bool) {
		 return (keccak256(abi.encodePacked((s1))) == keccak256(abi.encodePacked((s2))));
	 }

	// private
	// maps
	function mapNtSet(
        string memory key,
        address value
    ) private {
        if (mapNt.inserted[key]) {
            mapNt.values[key] = value;
        } else {
            mapNt.inserted[key] = true;
            mapNt.values[key] = value;
            mapNt.indexOf[key] = mapNt.keys.length;
            mapNt.keys.push(key);
        }
    }
	
	function mapTokenSet(
        uint key,
        string memory value
    ) private {
        if (mapToken.inserted[key]) {
            mapToken.values[key] = value;
        } else {
            mapToken.inserted[key] = true;
            mapToken.values[key] = value;
            mapToken.indexOf[key] = mapToken.keys.length;
            mapToken.keys.push(key);
        }
    }

	function mapNtRemove(string memory key) private {
        if (!mapNt.inserted[key]) {
            return;
        }

        delete mapNt.inserted[key];
        delete mapNt.values[key];

        uint256 index = mapNt.indexOf[key];
        uint256 lastIndex = mapNt.keys.length - 1;
        string memory lastKey = mapNt.keys[lastIndex];

        mapNt.indexOf[lastKey] = index;
        delete mapNt.indexOf[key];

		if (lastIndex != index)
			mapNt.keys[index] = lastKey;
        mapNt.keys.pop();
    }

	function mapTokenRemove(uint key) private {
        if (!mapToken.inserted[key]) {
            return;
        }

        delete mapToken.inserted[key];
        delete mapToken.values[key];

        uint256 index = mapToken.indexOf[key];
        uint256 lastIndex = mapToken.keys.length - 1;
        uint lastKey = mapToken.keys[lastIndex];

        mapToken.indexOf[lastKey] = index;
        delete mapToken.indexOf[key];

		if (lastIndex != index)
			mapToken.keys[index] = lastKey;
        mapToken.keys.pop();
    }
}

File 2 of 6 : INodeType.sol
// SPDX-License-Identifier: AGPL-3.0-or-later

pragma solidity ^0.8.0;

interface INodeType {

	function transferFrom(address from, address to, uint tokenId) external;
	function burnFrom(address from, uint[] memory tokenIds) external returns(uint);

	function createNodesWithTokens(
		address user,
		uint[] memory tokenIds
	) external returns(uint);

	function createNodesLevelUp(
		address user,
		uint[] memory tokenIds
	) external returns(uint);

	function createNodesWithPendings(
		address user,
		uint[] memory tokenIds
	) external returns(uint);
	
	function createNodeWithLuckyBox(
		address user,
		uint[] memory tokenIds,
		string memory feature
	) external;

	function createNodesMigration(
		address user,
		uint[] memory tokenIds
	) external;

	function createNodeCustom(
		address user,
		uint isBoostedAirDropRate,
		uint[] memory tokenIds,
		bool[] memory areBoostedNft,
		bool isBoostedToken,
		string memory feature
	) external;

	function getTotalNodesNumberOf(address user) external view returns(uint);
	function getAttribute(uint tokenId) external view returns(string memory);

	function claimRewardsAll(address user) external returns(uint, uint);
	function claimRewardsBatch(address user, uint[] memory tokenIds) external returns(uint, uint);
	function calculateUserRewards(address user) external view returns(uint, uint);

	function name() external view returns(string memory);
	function totalCreatedNodes() external view returns(uint);
}

File 3 of 6 : IPolarNode.sol
// SPDX-License-Identifier: AGPL-3.0-or-later

pragma solidity ^0.8.0;

interface IPolarNode {
	function generateNfts(
		string memory name,
		address user,
		uint count
	)
		external
		returns(uint[] memory);
	
	function burnBatch(address user, uint[] memory tokenIds) external;

	function setTokenIdToType(uint tokenId, string memory nodeType) external;
}

File 4 of 6 : IPolarLuckyBox.sol
// SPDX-License-Identifier: AGPL-3.0-or-later

pragma solidity ^0.8.0;

interface IPolarLuckyBox {
	function createLuckyBoxesWithTokens(
		string memory name,
		uint count,
		address user
	) external returns(uint);
	
	function createLuckyBoxesAirDrop(
		string memory name,
		uint count,
		address user
	) external;
	
	function createNodesWithLuckyBoxes(
		address user,
		uint[] memory tokenIds
	)
		external
		returns(
			string[] memory,
			string[] memory
		);
}

File 5 of 6 : ISwapper.sol
// SPDX-License-Identifier: AGPL-3.0-or-later

pragma solidity ^0.8.0;

interface ISwapper {
	function swapCreateNodesWithTokens(
		address tokenIn, 
		address user, 
		uint price,
		string memory sponso
	) external;
	
	function swapCreateNodesWithPending(
		address tokenOut, 
		address user, 
		uint rewardsTotal, 
		uint feesTotal
	) external;
	
	function swapCreateLuckyBoxesWithTokens(
		address tokenIn, 
		address user, 
		uint price,
		string memory sponso
	) external;

	function swapClaimRewardsAll(
		address tokenOut, 
		address user, 
		uint rewardsTotal, 
		uint feesTotal
	) external;

	function swapClaimRewardsBatch(
		address tokenOut, 
		address user, 
		uint rewardsTotal, 
		uint feesTotal
	) external;
	
	function swapClaimRewardsNodeType(
		address tokenOut, 
		address user, 
		uint rewardsTotal, 
		uint feesTotal
	) external;
}

File 6 of 6 : Owners.sol
// SPDX-License-Identifier: AGPL-3.0-or-later

pragma solidity ^0.8.0;


contract Owners {
	
	address[] public owners;
	mapping(address => bool) public isOwner;

	constructor() {
		owners.push(msg.sender);
		isOwner[msg.sender] = true;
	}

	modifier onlySuperOwner() {
		require(owners[0] == msg.sender, "Owners: Only Super Owner");
		_;
	}
	
	modifier onlyOwners() {
		require(isOwner[msg.sender], "Owners: Only Owner");
		_;
	}

	function addOwner(address _new, bool _change) external onlySuperOwner {
		require(!isOwner[_new], "Owners: Already owner");
		isOwner[_new] = true;
		if (_change) {
			owners.push(owners[0]);
			owners[0] = _new;
		} else {
			owners.push(_new);
		}
	}

	function removeOwner(address _new) external onlySuperOwner {
		require(isOwner[_new], "Owners: Not owner");
		require(_new != owners[0], "Owners: Cannot remove super owner");
		for (uint i = 1; i < owners.length; i++) {
			if (owners[i] == _new) {
				owners[i] = owners[owners.length - 1];
				owners.pop();
				break;
			}
		}
		isOwner[_new] = false;
	}

	function getOwnersSize() external view returns(uint) {
		return owners.length;
	}
}

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

Contract Security Audit

Contract ABI

API
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"string","name":"name","type":"string"},{"indexed":false,"internalType":"uint256","name":"count","type":"uint256"}],"name":"NewNode","type":"event"},{"inputs":[{"internalType":"address[]","name":"_addrs","type":"address[]"}],"name":"addMultipleNodeTypes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"addNodeType","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_new","type":"address"},{"internalType":"bool","name":"_change","type":"bool"}],"name":"addOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"address","name":"user","type":"address"}],"name":"claimRewardsAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"address","name":"user","type":"address"},{"internalType":"string[]","name":"names","type":"string[]"},{"internalType":"uint256[][]","name":"tokenIds","type":"uint256[][]"}],"name":"claimRewardsBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"address","name":"user","type":"address"},{"internalType":"string","name":"name","type":"string"}],"name":"claimRewardsNodeType","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"createLuckyBoxesAirDrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"user","type":"address"},{"internalType":"string","name":"name","type":"string"},{"internalType":"uint256","name":"count","type":"uint256"},{"internalType":"string","name":"sponso","type":"string"}],"name":"createLuckyBoxesWithTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"isBoostedAirDropRate","type":"uint256"},{"internalType":"bool[]","name":"areBoostedNft","type":"bool[]"},{"internalType":"bool","name":"isBoostedToken","type":"bool"},{"internalType":"string","name":"feature","type":"string"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"createNodesAirDrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"string[]","name":"nameFrom","type":"string[]"},{"internalType":"uint256[][]","name":"tokenIdsToBurn","type":"uint256[][]"},{"internalType":"string","name":"nameTo","type":"string"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"createNodesLevelUp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"string[]","name":"nameFrom","type":"string[]"},{"internalType":"uint256[]","name":"count","type":"uint256[]"}],"name":"createNodesMigration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIdsLuckyBoxes","type":"uint256[]"}],"name":"createNodesWithLuckyBoxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"string[]","name":"nameFrom","type":"string[]"},{"internalType":"uint256[][]","name":"tokenIdsToClaim","type":"uint256[][]"},{"internalType":"string","name":"nameTo","type":"string"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"createNodesWithPending","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"user","type":"address"},{"internalType":"string","name":"name","type":"string"},{"internalType":"uint256","name":"count","type":"uint256"},{"internalType":"string","name":"sponso","type":"string"}],"name":"createNodesWithTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getAttribute","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getClaimableRewardsOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"key","type":"string"}],"name":"getNodeTypesAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"iStart","type":"uint256"},{"internalType":"uint256","name":"iEnd","type":"uint256"}],"name":"getNodeTypesBetweenIndexes","outputs":[{"internalType":"string[]","name":"","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNodeTypesSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwnersSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"key","type":"uint256"}],"name":"getTokenIdNodeTypeName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"iStart","type":"uint256"},{"internalType":"uint256","name":"iEnd","type":"uint256"}],"name":"getTokenIdsBetweenIndexes","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"iStart","type":"uint256"},{"internalType":"uint256","name":"iEnd","type":"uint256"}],"name":"getTokenIdsNodeTypeBetweenIndexes","outputs":[{"internalType":"string[]","name":"","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTokenIdsSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalCreatedNodes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getTotalNodesOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nft","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256","name":"isBoostedAirDropRate","type":"uint256"},{"internalType":"bool[]","name":"areBoostedNft","type":"bool[]"},{"internalType":"bool","name":"isBoostedToken","type":"bool"},{"internalType":"string","name":"feature","type":"string"}],"name":"nodeEvolution","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"owners","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_new","type":"address"}],"name":"removeOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_new","type":"address"}],"name":"setLucky","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_new","type":"address"}],"name":"setNft","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_new","type":"address"}],"name":"setSwapper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"address","name":"_addr","type":"address"}],"name":"updateNodeTypeAddress","outputs":[],"stateMutability":"nonpayable","type":"function"}]

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061021c5760003560e01c80639649aace11610125578063c708c72c116100ad578063e526ce541161007c578063e526ce541461049e578063e9897f87146104b1578063eba86d29146104c4578063f3c13387146104d7578063f51dee09146104ea5761021c565b8063c708c72c1461045d578063d6a0d2ee14610470578063e15e66d014610478578063e1ca019b1461048b5761021c565b8063a650ac0d116100f4578063a650ac0d146103d6578063a6b690e0146103f6578063a880f1a914610409578063bf035e111461041c578063c299d3801461043d5761021c565b80639649aace146103955780639c82f2a4146103a8578063a0a8fe65146103bb578063a4a74c49146103c35761021c565b806347ccca02116101a857806362829b201161017757806362829b2014610341578063652469301461035457806376f4e8d514610367578063837154761461037a5780638f309880146103825761021c565b806347ccca02146102f3578063493fe80f146102fb578063518e32d31461031b57806362663f181461032e5761021c565b8063173825d9116101ef578063173825d9146102875780631fb895f81461029a57806323b872dd146102ad5780632f54bf6e146102c0578063321f8674146102e05761021c565b806301b4f6b914610221578063025e7c27146102365780630c7b1d7b1461025f5780630eedc8fd14610274575b600080fd5b61023461022f366004613ec2565b6104fd565b005b610249610244366004613f7a565b61067b565b6040516102569190614111565b60405180910390f35b6102676106a5565b6040516102569190614313565b61023461028236600461396a565b6106ab565b61023461029536600461383b565b610801565b6102346102a8366004613d6a565b610a48565b6102346102bb3660046139f5565b610afe565b6102d36102ce36600461383b565b610bb9565b6040516102569190614308565b6102346102ee36600461396a565b610bce565b610249610cc6565b61030e610309366004613f7a565b610cd5565b604051610256919061431c565b610234610329366004613b32565b610d8b565b61023461033c366004613b5b565b610f4e565b61023461034f36600461385c565b61106d565b610249610362366004613d06565b61122c565b610234610375366004613dac565b6112a1565b6102676115df565b61023461039036600461388e565b6115e5565b6102346103a3366004613acc565b611822565b6102346103b636600461383b565b611a40565b610267611ab7565b61030e6103d1366004613f7a565b611baa565b6103e96103e4366004613faa565b611c79565b60405161025691906142f5565b610234610404366004613a30565b611d5f565b61026761041736600461383b565b61220a565b61042f61042a36600461383b565b612304565b6040516102569291906148aa565b61045061044b366004613faa565b61241e565b6040516102569190614295565b61023461046b36600461383b565b61258f565b610267612684565b610450610486366004613faa565b61268a565b61023461049936600461383b565b612810565b6102346104ac366004613c51565b612887565b6102346104bf36600461390f565b612ac0565b6102346104d2366004613e7e565b612c54565b6102346104e536600461383b565b612cb7565b6102346104f8366004613a30565b612d2e565b3360009081526001602052604090205460ff166105355760405162461bcd60e51b815260040161052c9061455e565b60405180910390fd5b83516001146105565760405162461bcd60e51b815260040161052c9061440a565b600081116105765760405162461bcd60e51b815260040161052c9061477d565b60005b8181101561062c57600061058f89896001613084565b90506002600101896040516105a4919061405a565b908152604051908190036020018120546304a75fe360e21b82526001600160a01b03169063129d7f8c906105e6908b908b9086908c908c908c90600401614209565b600060405180830381600087803b15801561060057600080fd5b505af1158015610614573d6000803e3d6000fd5b50505050508080610624906149cd565b915050610579565b508660405161063b919061405a565b6040518091039020866001600160a01b0316600080516020614a158339815191528360405161066a9190614313565b60405180910390a350505050505050565b6000818154811061068b57600080fd5b6000918252602090912001546001600160a01b0316905081565b60005490565b60006106b8848685613084565b905060006002600101856040516106cf919061405a565b9081526040519081900360200181205463b018fc6f60e01b82526001600160a01b03169063b018fc6f9061070990899086906004016141af565b602060405180830381600087803b15801561072357600080fd5b505af1158015610737573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061075b9190613f92565b600c54604051633517b5bb60e11b81529192506001600160a01b031690636a2f6b7690610792908a90339086908990600401614149565b600060405180830381600087803b1580156107ac57600080fd5b505af11580156107c0573d6000803e3d6000fd5b50505050846040516107d2919061405a565b6040518091039020866001600160a01b0316600080516020614a158339815191528660405161066a9190614313565b336001600160a01b03166000808154811061082c57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b03161461085e5760405162461bcd60e51b815260040161052c906143d3565b6001600160a01b03811660009081526001602052604090205460ff166108965760405162461bcd60e51b815260040161052c90614866565b600080815481106108b757634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b03828116911614156108ee5760405162461bcd60e51b815260040161052c906144af565b60015b600054811015610a2657816001600160a01b03166000828154811061092657634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b03161415610a1457600080546109519060019061494f565b8154811061096f57634e487b7160e01b600052603260045260246000fd5b600091825260208220015481546001600160a01b039091169190839081106109a757634e487b7160e01b600052603260045260246000fd5b6000918252602082200180546001600160a01b0319166001600160a01b0393909316929092179091558054806109ed57634e487b7160e01b600052603160045260246000fd5b600082815260209020810160001990810180546001600160a01b0319169055019055610a26565b80610a1e816149cd565b9150506108f1565b506001600160a01b03166000908152600160205260409020805460ff19169055565b3360009081526001602052604090205460ff16610a775760405162461bcd60e51b815260040161052c9061455e565b604051600590610a8890849061405a565b9081526040519081900360200190205460ff16610ab75760405162461bcd60e51b815260040161052c90614746565b80600260010183604051610acb919061405a565b90815260405190819003602001902080546001600160a01b03929092166001600160a01b03199092169190911790555050565b600a546001600160a01b03163314610b285760405162461bcd60e51b815260040161052c9061458a565b600081815260076020526040908190209051600391610b4691614076565b908152604051908190036020018120546323b872dd60e01b82526001600160a01b0316906323b872dd90610b8290869086908690600401614125565b600060405180830381600087803b158015610b9c57600080fd5b505af1158015610bb0573d6000803e3d6000fd5b50505050505050565b60016020526000908152604090205460ff1681565b600b54604051636454a0fd60e01b81526000916001600160a01b031690636454a0fd90610c0390879087908a9060040161435d565b602060405180830381600087803b158015610c1d57600080fd5b505af1158015610c31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c559190613f92565b600c5460405163a77f789b60e01b81529192506001600160a01b03169063a77f789b90610c8c908990339086908890600401614149565b600060405180830381600087803b158015610ca657600080fd5b505af1158015610cba573d6000803e3d6000fd5b50505050505050505050565b600a546001600160a01b031681565b600081815260076020526040908190209051606091600391610cf79190614076565b9081526040519081900360200181205463493fe80f60e01b82526001600160a01b03169063493fe80f90610d2f908590600401614313565b60006040518083038186803b158015610d4757600080fd5b505afa158015610d5b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610d839190810190613d38565b90505b919050565b336001600160a01b031660008081548110610db657634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b031614610de85760405162461bcd60e51b815260040161052c906143d3565b6001600160a01b03821660009081526001602052604090205460ff1615610e215760405162461bcd60e51b815260040161052c90614837565b6001600160a01b0382166000908152600160208190526040909120805460ff191690911790558015610f0157600080600081548110610e7057634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910154835460018101855593835290822090920180546001600160a01b0319166001600160a01b039093169290921790915580548391908190610ece57634e487b7160e01b600052603260045260246000fd5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550610f4a565b600080546001810182559080527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5630180546001600160a01b0319166001600160a01b0384161790555b5050565b3360009081526001602052604090205460ff16610f7d5760405162461bcd60e51b815260040161052c9061455e565b60005b8151811015610f4a576000828281518110610fab57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03166306fdde036040518163ffffffff1660e01b815260040160006040518083038186803b158015610feb57600080fd5b505afa158015610fff573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526110279190810190613d38565b905061105a8184848151811061104d57634e487b7160e01b600052603260045260246000fd5b60200260200101516131ad565b5080611065816149cd565b915050610f80565b6001600160a01b03811633148061109357503360009081526001602052604090205460ff165b6110af5760405162461bcd60e51b815260040161052c90614621565b60008060005b6002548110156111bd576000806002600101600260000184815481106110eb57634e487b7160e01b600052603260045260246000fd5b906000526020600020016040516111029190614076565b908152604051908190036020018120546318c880ef60e21b82526001600160a01b03169063632203bc9061113a908990600401614111565b6040805180830381600087803b15801561115357600080fd5b505af1158015611167573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061118b9190613fcb565b909250905061119a8286614937565b94506111a68185614937565b9350505080806111b5906149cd565b9150506110b5565b50600c5460405163658793a360e01b81526001600160a01b039091169063658793a3906111f4908790879087908790600401614186565b600060405180830381600087803b15801561120e57600080fd5b505af1158015611222573d6000803e3d6000fd5b5050505050505050565b6000600260030182604051611241919061405a565b9081526040519081900360200190205460ff166112705760405162461bcd60e51b815260040161052c9061469c565b60405160039061128190849061405a565b908152604051908190036020019020546001600160a01b03169050919050565b3360009081526001602052604090205460ff166112d05760405162461bcd60e51b815260040161052c9061455e565b84516001146112f15760405162461bcd60e51b815260040161052c90614441565b82518551146113125760405162461bcd60e51b815260040161052c906145ea565b60405160059061132390899061405a565b9081526040519081900360200190205460ff166113525760405162461bcd60e51b815260040161052c90614746565b600660030160008660008151811061137a57634e487b7160e01b600052603260045260246000fd5b60209081029190910181015182528101919091526040016000205460ff166113b45760405162461bcd60e51b815260040161052c90614665565b600260010160066001016000876000815181106113e157634e487b7160e01b600052603260045260246000fd5b602002602001015181526020019081526020016000206040516114049190614076565b908152604051908190036020018120546389af610760e01b82526001600160a01b0316906389af61079061143e90899089906004016141af565b602060405180830381600087803b15801561145857600080fd5b505af115801561146c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114909190613f92565b506114c3856000815181106114b557634e487b7160e01b600052603260045260246000fd5b602002602001015188613302565b6040516003906114d490899061405a565b908152604051908190036020018120546304a75fe360e21b82526001600160a01b03169063129d7f8c9061151690899088908a90899089908990600401614209565b600060405180830381600087803b15801561153057600080fd5b505af1158015611544573d6000803e3d6000fd5b5050600a5487516001600160a01b03909116925063864b7e959150879060009061157e57634e487b7160e01b600052603260045260246000fd5b6020026020010151896040518363ffffffff1660e01b81526004016115a4929190614891565b600060405180830381600087803b1580156115be57600080fd5b505af11580156115d2573d6000803e3d6000fd5b5050505050505050505050565b60065490565b6001600160a01b03831633148061160b57503360009081526001602052604090205460ff165b6116275760405162461bcd60e51b815260040161052c90614621565b600080825184511461164b5760405162461bcd60e51b815260040161052c906145ea565b60005b84518110156117eb57600260030185828151811061167c57634e487b7160e01b600052603260045260246000fd5b6020026020010151604051611691919061405a565b9081526040519081900360200190205460ff166116c05760405162461bcd60e51b815260040161052c90614746565b60008060026001018784815181106116e857634e487b7160e01b600052603260045260246000fd5b60200260200101516040516116fd919061405a565b9081526040519081900360200190205486516001600160a01b039091169063daf73bbd908a9089908790811061174357634e487b7160e01b600052603260045260246000fd5b60200260200101516040518363ffffffff1660e01b81526004016117689291906141af565b6040805180830381600087803b15801561178157600080fd5b505af1158015611795573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117b99190613fcb565b90925090506117c88286614937565b94506117d48185614937565b9350505080806117e3906149cd565b91505061164e565b50600c546040516336ed57cd60e01b81526001600160a01b03909116906336ed57cd90610c8c908990899087908790600401614186565b6001600160a01b03831633148061184857503360009081526001602052604090205460ff165b6118645760405162461bcd60e51b815260040161052c90614478565b80518251146118855760405162461bcd60e51b815260040161052c906145ea565b60005b8251811015611a3a5760006118ec8483815181106118b657634e487b7160e01b600052603260045260246000fd5b6020026020010151868585815181106118df57634e487b7160e01b600052603260045260246000fd5b6020026020010151613084565b9050600260010184838151811061191357634e487b7160e01b600052603260045260246000fd5b6020026020010151604051611928919061405a565b908152604051908190036020018120546306caef4d60e51b82526001600160a01b03169063d95de9a09061196290889085906004016141af565b600060405180830381600087803b15801561197c57600080fd5b505af1158015611990573d6000803e3d6000fd5b505050508382815181106119b457634e487b7160e01b600052603260045260246000fd5b60200260200101516040516119c9919061405a565b6040518091039020856001600160a01b0316600080516020614a15833981519152858581518110611a0a57634e487b7160e01b600052603260045260246000fd5b6020026020010151604051611a1f9190614313565b60405180910390a35080611a32816149cd565b915050611888565b50505050565b3360009081526001602052604090205460ff16611a6f5760405162461bcd60e51b815260040161052c9061455e565b6001600160a01b038116611a955760405162461bcd60e51b815260040161052c906147f0565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b60008060005b600254811015611ba457600280546003919083908110611aed57634e487b7160e01b600052603260045260246000fd5b90600052602060002001604051611b049190614076565b90815260408051602092819003830181205463b88d345360e01b825291516001600160a01b039092169263b88d345392600480840193829003018186803b158015611b4e57600080fd5b505afa158015611b62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b869190613f92565b611b909083614937565b915080611b9c816149cd565b915050611abd565b50905090565b60008181526009602052604090205460609060ff16611bdb5760405162461bcd60e51b815260040161052c906147c2565b60008281526007602052604090208054611bf490614992565b80601f0160208091040260200160405190810160405280929190818152602001828054611c2090614992565b8015611c6d5780601f10611c4257610100808354040283529160200191611c6d565b820191906000526020600020905b815481529060010190602001808311611c5057829003601f168201915b50505050509050919050565b60606000611c87848461494f565b6001600160401b03811115611cac57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611cd5578160200160208202803683370190505b509050835b83811015611d57576006805482908110611d0457634e487b7160e01b600052603260045260246000fd5b9060005260206000200154828683611d1c919061494f565b81518110611d3a57634e487b7160e01b600052603260045260246000fd5b602090810291909101015280611d4f816149cd565b915050611cda565b509392505050565b8251845114611d805760405162461bcd60e51b815260040161052c906145ea565b6000611d8d833384613084565b9050611d9b863387876115e5565b6000600260010184604051611db0919061405a565b908152604051908190036020018120546304eb4ae360e51b82526001600160a01b031690639d695c6090611dea90339086906004016141af565b602060405180830381600087803b158015611e0457600080fd5b505af1158015611e18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e3c9190613f92565b905060005b865181108015611e515750600082115b156121ae576002600301878281518110611e7b57634e487b7160e01b600052603260045260246000fd5b6020026020010151604051611e90919061405a565b9081526040519081900360200190205460ff16611ebf5760405162461bcd60e51b815260040161052c90614746565b600a5486516001600160a01b039091169063b2dc5dc3903390899085908110611ef857634e487b7160e01b600052603260045260246000fd5b60200260200101516040518363ffffffff1660e01b8152600401611f1d9291906141af565b600060405180830381600087803b158015611f3757600080fd5b505af1158015611f4b573d6000803e3d6000fd5b5050505060005b868281518110611f7257634e487b7160e01b600052603260045260246000fd5b6020026020010151518110156120735760066003016000888481518110611fa957634e487b7160e01b600052603260045260246000fd5b60200260200101518381518110611fd057634e487b7160e01b600052603260045260246000fd5b60209081029190910181015182528101919091526040016000205460ff1661200a5760405162461bcd60e51b815260040161052c906144f0565b61206187838151811061202d57634e487b7160e01b600052603260045260246000fd5b6020026020010151828151811061205457634e487b7160e01b600052603260045260246000fd5b60200260200101516133b5565b8061206b816149cd565b915050611f52565b506000600260010188838151811061209b57634e487b7160e01b600052603260045260246000fd5b60200260200101516040516120b0919061405a565b908152602001604051809103902060009054906101000a90046001600160a01b031690506000816001600160a01b03166389af6107338a868151811061210657634e487b7160e01b600052603260045260246000fd5b60200260200101516040518363ffffffff1660e01b815260040161212b9291906141af565b602060405180830381600087803b15801561214557600080fd5b505af1158015612159573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061217d9190613f92565b905080841161218d576000612197565b612197818561494f565b9350505080806121a6906149cd565b915050611e41565b5080156121cd5760405162461bcd60e51b815260040161052c90614527565b836040516121db919061405a565b6040518091039020336001600160a01b0316600080516020614a158339815191528560405161066a9190614313565b60008060005b6002548110156122fd5760028054600391908390811061224057634e487b7160e01b600052603260045260246000fd5b906000526020600020016040516122579190614076565b908152604051908190036020018120546343a9ac3960e01b82526001600160a01b0316906343a9ac399061228f908790600401614111565b60206040518083038186803b1580156122a757600080fd5b505afa1580156122bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122df9190613f92565b6122e99083614937565b9150806122f5816149cd565b915050612210565b5092915050565b60008060008060005b6002548110156124135760008060026001016002600001848154811061234357634e487b7160e01b600052603260045260246000fd5b9060005260206000200160405161235a9190614076565b908152604051908190036020018120546303eba50760e01b82526001600160a01b0316906303eba50790612392908b90600401614111565b604080518083038186803b1580156123a957600080fd5b505afa1580156123bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123e19190613fcb565b90925090506123f08286614937565b94506123fc8185614937565b93505050808061240b906149cd565b91505061230d565b509092509050915091565b6060600061242c848461494f565b6001600160401b0381111561245157634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561248457816020015b606081526020019060019003908161246f5790505b509050835b83811015611d575760028054829081106124b357634e487b7160e01b600052603260045260246000fd5b9060005260206000200180546124c890614992565b80601f01602080910402602001604051908101604052809291908181526020018280546124f490614992565b80156125415780601f1061251657610100808354040283529160200191612541565b820191906000526020600020905b81548152906001019060200180831161252457829003601f168201915b5050505050828683612553919061494f565b8151811061257157634e487b7160e01b600052603260045260246000fd5b60200260200101819052508080612587906149cd565b915050612489565b3360009081526001602052604090205460ff166125be5760405162461bcd60e51b815260040161052c9061455e565b6000816001600160a01b03166306fdde036040518163ffffffff1660e01b815260040160006040518083038186803b1580156125f957600080fd5b505afa15801561260d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526126359190810190613d38565b905060026003018160405161264a919061405a565b9081526040519081900360200190205460ff161561267a5760405162461bcd60e51b815260040161052c906145b5565b610f4a81836131ad565b60025490565b60606000612698848461494f565b6001600160401b038111156126bd57634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156126f057816020015b60608152602001906001900390816126db5790505b509050835b83811015611d5757600680546007916000918490811061272557634e487b7160e01b600052603260045260246000fd5b90600052602060002001548152602001908152602001600020805461274990614992565b80601f016020809104026020016040519081016040528092919081815260200182805461277590614992565b80156127c25780601f10612797576101008083540402835291602001916127c2565b820191906000526020600020905b8154815290600101906020018083116127a557829003601f168201915b50505050508286836127d4919061494f565b815181106127f257634e487b7160e01b600052603260045260246000fd5b60200260200101819052508080612808906149cd565b9150506126f5565b3360009081526001602052604090205460ff1661283f5760405162461bcd60e51b815260040161052c9061455e565b6001600160a01b0381166128655760405162461bcd60e51b815260040161052c90614702565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b600b5460405163a933c20f60e01b815260609182916001600160a01b039091169063a933c20f906128be90339087906004016141af565b600060405180830381600087803b1580156128d857600080fd5b505af11580156128ec573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526129149190810190613bf1565b909250905060005b8251811015611a3a57600061295a84838151811061294a57634e487b7160e01b600052603260045260246000fd5b6020026020010151336001613084565b9050600260010184838151811061298157634e487b7160e01b600052603260045260246000fd5b6020026020010151604051612996919061405a565b908152602001604051809103902060009054906101000a90046001600160a01b03166001600160a01b031663fd38450433838686815181106129e857634e487b7160e01b600052603260045260246000fd5b60200260200101516040518463ffffffff1660e01b8152600401612a0e939291906141d3565b600060405180830381600087803b158015612a2857600080fd5b505af1158015612a3c573d6000803e3d6000fd5b50505050838281518110612a6057634e487b7160e01b600052603260045260246000fd5b6020026020010151604051612a75919061405a565b6040518091039020336001600160a01b0316600080516020614a158339815191526001604051612aa59190614313565b60405180910390a35080612ab8816149cd565b91505061291c565b6001600160a01b038216331480612ae657503360009081526001602052604090205460ff165b612b025760405162461bcd60e51b815260040161052c90614621565b604051600590612b1390839061405a565b9081526040519081900360200190205460ff16612b425760405162461bcd60e51b815260040161052c90614746565b600080600260010183604051612b58919061405a565b908152604051908190036020018120546318c880ef60e21b82526001600160a01b03169063632203bc90612b90908790600401614111565b6040805180830381600087803b158015612ba957600080fd5b505af1158015612bbd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612be19190613fcb565b600c5460405163fbe12f1d60e01b81529294509092506001600160a01b03169063fbe12f1d90612c1b908890889087908790600401614186565b600060405180830381600087803b158015612c3557600080fd5b505af1158015612c49573d6000803e3d6000fd5b505050505050505050565b3360009081526001602052604090205460ff16612c835760405162461bcd60e51b815260040161052c9061455e565b600b546040516343836c7f60e11b81526001600160a01b0390911690638706d8fe90610b829086908590879060040161435d565b3360009081526001602052604090205460ff16612ce65760405162461bcd60e51b815260040161052c9061455e565b6001600160a01b038116612d0c5760405162461bcd60e51b815260040161052c90614390565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b8251845114612d4f5760405162461bcd60e51b815260040161052c906145ea565b6000612d5c833384613084565b90506000806000600260010186604051612d76919061405a565b908152604051908190036020018120546319309eb560e21b82526001600160a01b0316906364c27ad490612db090339088906004016141af565b602060405180830381600087803b158015612dca57600080fd5b505af1158015612dde573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e029190613f92565b905060005b8851811015612fa4576002600301898281518110612e3557634e487b7160e01b600052603260045260246000fd5b6020026020010151604051612e4a919061405a565b9081526040519081900360200190205460ff16612e795760405162461bcd60e51b815260040161052c90614746565b60008060026001018b8481518110612ea157634e487b7160e01b600052603260045260246000fd5b6020026020010151604051612eb6919061405a565b908152604051908190036020019020548a516001600160a01b039091169063daf73bbd9033908d9087908110612efc57634e487b7160e01b600052603260045260246000fd5b60200260200101516040518363ffffffff1660e01b8152600401612f219291906141af565b6040805180830381600087803b158015612f3a57600080fd5b505af1158015612f4e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f729190613fcb565b9092509050612f818287614937565b9550612f8d8186614937565b945050508080612f9c906149cd565b915050612e07565b5082811115612fc55760405162461bcd60e51b815260040161052c906146cb565b600c546001600160a01b031663c7ae05318a33612fe2858861494f565b866040518563ffffffff1660e01b81526004016130029493929190614186565b600060405180830381600087803b15801561301c57600080fd5b505af1158015613030573d6000803e3d6000fd5b5050505085604051613042919061405a565b6040518091039020336001600160a01b0316600080516020614a15833981519152876040516130719190614313565b60405180910390a3505050505050505050565b6060600260030184604051613099919061405a565b9081526040519081900360200190205460ff166130c85760405162461bcd60e51b815260040161052c90614746565b600a54604051635181db2b60e01b81526000916001600160a01b031690635181db2b906130fd9088908890889060040161432f565b600060405180830381600087803b15801561311757600080fd5b505af115801561312b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526131539190810190613c83565b905060005b81518110156131a45761319282828151811061318457634e487b7160e01b600052603260045260246000fd5b602002602001015187613302565b8061319c816149cd565b915050613158565b50949350505050565b6040516005906131be90849061405a565b9081526040519081900360200190205460ff161561321e57806002600101836040516131ea919061405a565b90815260405190819003602001902080546001600160a01b03929092166001600160a01b0319909216919091179055610f4a565b6001600260030183604051613233919061405a565b908152604051908190036020018120805492151560ff1990931692909217909155819060039061326490859061405a565b90815260405190819003602001812080546001600160a01b03939093166001600160a01b031990931692909217909155600254906004906132a690859061405a565b90815260405160209181900382019020919091556002805460018101825560009190915283516132fd927f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace909201918501906134e0565b505050565b60008281526009602052604090205460ff161561333e5760008281526007602090815260409091208251613338928401906134e0565b50610f4a565b6000828152600960209081526040808320805460ff1916600117905560078252909120825161336f928401906134e0565b5050600680546000838152600860205260408120829055600182018355919091527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0155565b60008181526009602052604090205460ff166133d0576134dd565b6000818152600960209081526040808320805460ff19169055600790915281206133f991613564565b60008181526008602052604081205460065490919061341a9060019061494f565b905060006006600001828154811061344257634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101548083526008909152604080832086905586835282209190915590508183146134a457806006600001848154811061349757634e487b7160e01b600052603260045260246000fd5b6000918252602090912001555b60068054806134c357634e487b7160e01b600052603160045260246000fd5b600190038181906000526020600020016000905590555050505b50565b8280546134ec90614992565b90600052602060002090601f01602090048101928261350e5760008555613554565b82601f1061352757805160ff1916838001178555613554565b82800160010185558215613554579182015b82811115613554578251825591602001919060010190613539565b5061356092915061359c565b5090565b50805461357090614992565b6000825580601f1061358257506134dd565b601f0160209004906000526020600020908101906134dd91905b5b80821115613560576000815560010161359d565b80356001600160a01b0381168114610d8657600080fd5b600082601f8301126135d8578081fd5b813560206135ed6135e8836148e1565b6148b8565b82815281810190858301855b8581101561362257613610898684358b010161373a565b845292840192908401906001016135f9565b5090979650505050505050565b600082601f83011261363f578081fd5b8135602061364f6135e8836148e1565b828152818101908583018385028701840188101561366b578586fd5b855b858110156136225761367e82613794565b8452928401929084019060010161366d565b600082601f8301126136a0578081fd5b813560206136b06135e8836148e1565b82815281810190858301855b85811015613622576136d3898684358b01016137a4565b845292840192908401906001016136bc565b600082601f8301126136f5578081fd5b815160206137056135e8836148e1565b82815281810190858301855b8581101561362257613728898684518b01016137f0565b84529284019290840190600101613711565b600082601f83011261374a578081fd5b8135602061375a6135e8836148e1565b8281528181019085830183850287018401881015613776578586fd5b855b8581101561362257813584529284019290840190600101613778565b80358015158114610d8657600080fd5b600082601f8301126137b4578081fd5b81356137c26135e882614904565b8181528460208386010111156137d6578283fd5b816020850160208301379081016020019190915292915050565b600082601f830112613800578081fd5b815161380e6135e882614904565b818152846020838601011115613822578283fd5b613833826020830160208701614966565b949350505050565b60006020828403121561384c578081fd5b613855826135b1565b9392505050565b6000806040838503121561386e578081fd5b613877836135b1565b9150613885602084016135b1565b90509250929050565b600080600080608085870312156138a3578182fd5b6138ac856135b1565b93506138ba602086016135b1565b925060408501356001600160401b03808211156138d5578384fd5b6138e188838901613690565b935060608701359150808211156138f6578283fd5b50613903878288016135c8565b91505092959194509250565b600080600060608486031215613923578081fd5b61392c846135b1565b925061393a602085016135b1565b915060408401356001600160401b03811115613954578182fd5b613960868287016137a4565b9150509250925092565b600080600080600060a08688031215613981578283fd5b61398a866135b1565b9450613998602087016135b1565b935060408601356001600160401b03808211156139b3578485fd5b6139bf89838a016137a4565b94506060880135935060808801359150808211156139db578283fd5b506139e8888289016137a4565b9150509295509295909350565b600080600060608486031215613a09578081fd5b613a12846135b1565b9250613a20602085016135b1565b9150604084013590509250925092565b600080600080600060a08688031215613a47578283fd5b613a50866135b1565b945060208601356001600160401b0380821115613a6b578485fd5b613a7789838a01613690565b95506040880135915080821115613a8c578485fd5b613a9889838a016135c8565b94506060880135915080821115613aad578283fd5b50613aba888289016137a4565b95989497509295608001359392505050565b600080600060608486031215613ae0578081fd5b613ae9846135b1565b925060208401356001600160401b0380821115613b04578283fd5b613b1087838801613690565b93506040860135915080821115613b25578283fd5b506139608682870161373a565b60008060408385031215613b44578182fd5b613b4d836135b1565b915061388560208401613794565b60006020808385031215613b6d578182fd5b82356001600160401b03811115613b82578283fd5b8301601f81018513613b92578283fd5b8035613ba06135e8826148e1565b8181528381019083850185840285018601891015613bbc578687fd5b8694505b83851015613be557613bd1816135b1565b835260019490940193918501918501613bc0565b50979650505050505050565b60008060408385031215613c03578182fd5b82516001600160401b0380821115613c19578384fd5b613c25868387016136e5565b93506020850151915080821115613c3a578283fd5b50613c47858286016136e5565b9150509250929050565b600060208284031215613c62578081fd5b81356001600160401b03811115613c77578182fd5b6138338482850161373a565b60006020808385031215613c95578182fd5b82516001600160401b03811115613caa578283fd5b8301601f81018513613cba578283fd5b8051613cc86135e8826148e1565b8181528381019083850185840285018601891015613ce4578687fd5b8694505b83851015613be5578051835260019490940193918501918501613ce8565b600060208284031215613d17578081fd5b81356001600160401b03811115613d2c578182fd5b613833848285016137a4565b600060208284031215613d49578081fd5b81516001600160401b03811115613d5e578182fd5b613833848285016137f0565b60008060408385031215613d7c578182fd5b82356001600160401b03811115613d91578283fd5b613d9d858286016137a4565b925050613885602084016135b1565b600080600080600080600060e0888a031215613dc6578485fd5b87356001600160401b0380821115613ddc578687fd5b613de88b838c016137a4565b9850613df660208b016135b1565b975060408a0135915080821115613e0b578687fd5b613e178b838c0161373a565b965060608a0135955060808a0135915080821115613e33578384fd5b613e3f8b838c0161362f565b9450613e4d60a08b01613794565b935060c08a0135915080821115613e62578283fd5b50613e6f8a828b016137a4565b91505092959891949750929550565b600080600060608486031215613e92578081fd5b83356001600160401b03811115613ea7578182fd5b613eb3868287016137a4565b935050613a20602085016135b1565b600080600080600080600060e0888a031215613edc578081fd5b87356001600160401b0380821115613ef2578283fd5b613efe8b838c016137a4565b9850613f0c60208b016135b1565b975060408a0135965060608a0135915080821115613f28578283fd5b613f348b838c0161362f565b9550613f4260808b01613794565b945060a08a0135915080821115613f57578283fd5b50613f648a828b016137a4565b92505060c0880135905092959891949750929550565b600060208284031215613f8b578081fd5b5035919050565b600060208284031215613fa3578081fd5b5051919050565b60008060408385031215613fbc578182fd5b50508035926020909101359150565b60008060408385031215613fdd578182fd5b505080516020909101519092909150565b6000815180845260208085019450808401835b8381101561401d57815187529582019590820190600101614001565b509495945050505050565b15159052565b60008151808452614046816020860160208601614966565b601f01601f19169290920160200192915050565b6000825161406c818460208701614966565b9190910192915050565b815460009081906002810460018083168061409257607f831692505b60208084108214156140b257634e487b7160e01b87526022600452602487fd5b8180156140c657600181146140d757614103565b60ff19861689528489019650614103565b6140e08a61492b565b885b868110156140fb5781548b8201529085019083016140e2565b505084890196505b509498975050505050505050565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061417c9083018461402e565b9695505050505050565b6001600160a01b0394851681529290931660208301526040820152606081019190915260800190565b6001600160a01b038316815260406020820181905260009061383390830184613fee565b6001600160a01b03841681526060602082018190526000906141f790830185613fee565b828103604084015261417c818561402e565b600060018060a01b03881682526020878184015260c0604084015261423160c0840188613fee565b8381036060850152865180825282880191830190845b81811015614265578351151583529284019291840191600101614247565b50506142746080860188614028565b84810360a0860152614286818761402e565b9b9a5050505050505050505050565b6000602080830181845280855180835260408601915060408482028701019250838701855b828110156142e857603f198886030184526142d685835161402e565b945092850192908501906001016142ba565b5092979650505050505050565b6000602082526138556020830184613fee565b901515815260200190565b90815260200190565b600060208252613855602083018461402e565b600060608252614342606083018661402e565b6001600160a01b039490941660208301525060400152919050565b600060608252614370606083018661402e565b6020830194909452506001600160a01b0391909116604090910152919050565b60208082526023908201527f48616e646c65723a204e66742063616e6e6f742062652061646472657373207a60408201526265726f60e81b606082015260800190565b60208082526018908201527f4f776e6572733a204f6e6c79205375706572204f776e65720000000000000000604082015260600190565b6020808252601a908201527f48616e646c65723a20437265617465206f6e65206279206f6e65000000000000604082015260600190565b6020808252601a908201527f48616e646c65723a2045766f6c7665206f6e65206279206f6e65000000000000604082015260600190565b6020808252601e908201527f48616e646c65723a2053656e646572206e6f7420617574686f72697a65640000604082015260600190565b60208082526021908201527f4f776e6572733a2043616e6e6f742072656d6f7665207375706572206f776e656040820152603960f91b606082015260800190565b6020808252601d908201527f48616e646c65723a20546f6b656e496420646f65736e74206578697374000000604082015260600190565b60208082526017908201527f48616e646c65723a204e69636520747279206275646479000000000000000000604082015260600190565b60208082526012908201527127bbb732b9399d1027b7363c9027bbb732b960711b604082015260600190565b60208082526011908201527012185b991b195c8e8813db9b1e4813999d607a1b604082015260600190565b6020808252818101527f48616e646c65723a204e6f64655479706520616c726561647920657869737473604082015260600190565b60208082526018908201527f48616e646c65723a204c656e677468206d69736d617463680000000000000000604082015260600190565b60208082526024908201527f48616e646c65723a20446f6e74206d6573732077697468206f7468657220636c60408201526361696d7360e01b606082015260800190565b6020808252601b908201527f48616e646c65723a20546f6b656e20646f65736e742065786973740000000000604082015260600190565b602080825260159082015274139bd919551e5c1948191bd95cdb9d08195e1a5cdd605a1b604082015260600190565b6020808252601b908201527f48616e646c65723a204e6f7420656e6f7567682070656e64696e670000000000604082015260600190565b60208082526024908201527f48616e646c65723a204c6f6f742063616e6e6f742062652061646472657373206040820152637a65726f60e01b606082015260800190565b6020808252601e908201527f48616e646c65723a204e6f64655479706520646f65736e742065786973740000604082015260600190565b60208082526025908201527f48616e646c65723a20436f756e74206d75737420626520677265617465722074604082015264068616e20360dc1b606082015260800190565b602080825260149082015273151bdad95b925908191bd95cdb9d08195e1a5cdd60621b604082015260600190565b60208082526027908201527f48616e646c65723a20537761707065722063616e6e6f742062652061646472656040820152667373207a65726f60c81b606082015260800190565b60208082526015908201527427bbb732b9399d1020b63932b0b23c9037bbb732b960591b604082015260600190565b60208082526011908201527027bbb732b9399d102737ba1037bbb732b960791b604082015260600190565b600083825260406020830152613833604083018461402e565b918252602082015260400190565b6040518181016001600160401b03811182821017156148d9576148d96149fe565b604052919050565b60006001600160401b038211156148fa576148fa6149fe565b5060209081020190565b60006001600160401b0382111561491d5761491d6149fe565b50601f01601f191660200190565b60009081526020902090565b6000821982111561494a5761494a6149e8565b500190565b600082821015614961576149616149e8565b500390565b60005b83811015614981578181015183820152602001614969565b83811115611a3a5750506000910152565b6002810460018216806149a657607f821691505b602082108114156149c757634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156149e1576149e16149e8565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fdfe3c8006180c21a8a3a5910855aaa92c2043f55f5a5cc6d89097bfafdfc5fe18eca2646970667358221220296ff4454b66ffcb34247735b1125faadf0c14ea3a8a9947010fae8fa97d77d264736f6c63430008000033

Block Transaction Gas Used Reward
view all blocks ##produced##

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.