Contract 0xea8129f602e0cfdd9fba116e07fb04a13afdc48a 5

Contract Overview

Balance:
0 AVAX

AVAX Value:
$0.00

Token:
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x9a6e0eb57a22280a092ed532b7c8d24135b5bae1b8f7680134033a51305a8a35Claim Rewards Ba...150419722022-05-22 19:31:468 secs ago0x38236e4a7cd45b70c64b2105a448f06b71c1705c IN  0xea8129f602e0cfdd9fba116e07fb04a13afdc48a0 AVAX0.007526795 26.5
0x302945f9476d153be35afb05208afc87d92bdf5346b437eaf00374e2a9791fa1Claim Rewards Ba...150419652022-05-22 19:31:3222 secs ago0x0dab2a43b2d69a175fd7203ae5d874116c2574c4 IN  0xea8129f602e0cfdd9fba116e07fb04a13afdc48a0 AVAX0.0228001495 26.5
0xa6ab0993ec66845d14cbb6644b1dc5c2002e4e38d6afa8084407c3ba168edc11Claim Rewards Ba...150419432022-05-22 19:30:451 min ago0x531e6b973a4c60e56041a54e928126c72be04d31 IN  0xea8129f602e0cfdd9fba116e07fb04a13afdc48a0 AVAX0.014264102 26.5
0xa6d985d3b2a4de938d6dd88292b96f6cb5c152d92c314c7cf58789deab0352d0Claim Rewards Ba...150419392022-05-22 19:30:371 min ago0x70cff88fc134c3e217c8a882df71832e83f34ad0 IN  0xea8129f602e0cfdd9fba116e07fb04a13afdc48a0 AVAX0.004915061 26.5
0xd51af17cc3c107b5f22824393080ee8701379f69fb6d6642a803b4fe9c1420beClaim Rewards Ba...150419322022-05-22 19:30:231 min ago0xf657ffa7c4b688aaa15334a2621c5d07068056c4 IN  0xea8129f602e0cfdd9fba116e07fb04a13afdc48a0 AVAX0.00757688 26.5
0x99003d7ecb4ca9719ea3c0eeda07c04b8cfd7767b589cb1109f2f966b887ce76Claim Rewards Ba...150419042022-05-22 19:29:252 mins ago0x833922b1d6c6803041e9aa49475fc2d588571d78 IN  0xea8129f602e0cfdd9fba116e07fb04a13afdc48a0 AVAX0.0076714055 26.5
0x15e3c007dbd88c61fab8aa7c94c91e4168772b940ca9ef4726feccaf6da24f57Claim Rewards Ba...150418962022-05-22 19:29:112 mins ago0x35d55957c10a86de2fc5cd43734884f52b30ddf9 IN  0xea8129f602e0cfdd9fba116e07fb04a13afdc48a0 AVAX0.0077944185 26.5
0x39438c8d7b6e910c42101b8847df1fad39776bbdb1f6a5aaa5dee583f376a59eClaim Rewards Ba...150418642022-05-22 19:28:063 mins ago0xd39e13031b983df237a28594fc1474430427d854 IN  0xea8129f602e0cfdd9fba116e07fb04a13afdc48a0 AVAX0.009468132 26.5
0x46dd70d9564d8da5877363ed71d8745d48acab25d56ba519a31c038099fd0c8bClaim Rewards Ba...150418292022-05-22 19:26:574 mins ago0xd39e13031b983df237a28594fc1474430427d854 IN  0xea8129f602e0cfdd9fba116e07fb04a13afdc48a0 AVAX0.000847311 26.5
0xa35e347b6e3f8bc68a2f8342790cea7bb55e6ce4b121ce36e7e54461d1d0b366Claim Rewards Ba...150417962022-05-22 19:25:486 mins ago0xcac177bb6a757e49b8e845c0c78e6318bfb53f70 IN  0xea8129f602e0cfdd9fba116e07fb04a13afdc48a0 AVAX0.005154833 26.5
0x5fe03d821b9a642e4fbae8b28ba232fc10f1083219198ee9947a6eb00ef92bf0Claim Rewards Ba...150417932022-05-22 19:25:426 mins ago0xd39e13031b983df237a28594fc1474430427d854 IN  0xea8129f602e0cfdd9fba116e07fb04a13afdc48a0 AVAX0.000847311 26.5
0xceca4325c2774bea19eab30465ebb87e77b0e37b3358c377370ef5a03351d826Claim Rewards Ba...150417782022-05-22 19:25:116 mins ago0xcac177bb6a757e49b8e845c0c78e6318bfb53f70 IN  0xea8129f602e0cfdd9fba116e07fb04a13afdc48a0 AVAX0.004866319425 27.425
0x0f376b3f48a1f757d60c452254882dc3f4fbfeef973c83558c86c0f5c3eea80bCreate Nodes Wit...150417712022-05-22 19:24:586 mins ago0x1539dea68701c25a3abb588842fdcbf0b192504d IN  0xea8129f602e0cfdd9fba116e07fb04a13afdc48a0 AVAX0.0297725115 26.5
0x6a05b957e3ff4021ed447faaae69e941ed0944fd85c93d8cea93ba05bb3d8ec2Claim Rewards Ba...150417482022-05-22 19:24:117 mins ago0x1539dea68701c25a3abb588842fdcbf0b192504d IN  0xea8129f602e0cfdd9fba116e07fb04a13afdc48a0 AVAX0.0106521255 26.5
0x6490848d22835b3216f84b1e111b6178e3ad0d83aa39b783d5f7839df9a32c81Claim Rewards Ba...150417052022-05-22 19:22:449 mins ago0x9eadd4a28d2f121cdda80e449abfe91dc9e438f2 IN  0xea8129f602e0cfdd9fba116e07fb04a13afdc48a0 AVAX0.0045880245 26.5
0xb95df195f53da94169ddadfe71d9968d1e6492859f1cc3bb84092701586b0574Claim Rewards Ba...150416802022-05-22 19:21:569 mins ago0xbd19259a8fc566afc1d3034eeb07519149e51141 IN  0xea8129f602e0cfdd9fba116e07fb04a13afdc48a0 AVAX0.004701683 26.5
0x5904c039123bda0ebdcf3f60470a493d7bc519ac0e851f782d2dffa4a1d0fec9Claim Rewards Ba...150416752022-05-22 19:21:4610 mins ago0x8777372943c30197c6b881e510439e8edcf2c79e IN  0xea8129f602e0cfdd9fba116e07fb04a13afdc48a0 AVAX0.0041348745 26.5
0x66b5c7c501262e4a4c1dfd316109a281a9a6aa71a2d71c56bc391482c6af9199Claim Rewards Ba...150416692022-05-22 19:21:3410 mins ago0xd39978782fc20b24aff0ca26e1eaecc9b480465d IN  0xea8129f602e0cfdd9fba116e07fb04a13afdc48a0 AVAX0.0404938285 26.5
0xbe163f1317f37e107b50fe0a708ffdc574c13f4fe5f17f94fc4cb0b67b1e20d7Claim Rewards Ba...150416362022-05-22 19:20:2811 mins ago0x2b111cbe6a208e5550eff9f8365e951c4dce1b86 IN  0xea8129f602e0cfdd9fba116e07fb04a13afdc48a0 AVAX0.0068625725 26.5
0x4d2650139b64d241dd2fc63cdebd52b18edcdab395eb702445f1e8ec6c32af87Claim Rewards Ba...150416072022-05-22 19:19:3012 mins ago0x7d31bf47dda62c185a057b4002f1235fc3c8ae82 IN  0xea8129f602e0cfdd9fba116e07fb04a13afdc48a0 AVAX0.0060235295 26.5
0x57924bf34fbda439bb02df1c21ed81a5778c9ccc77b3b1011ee84d02b08d131fClaim Rewards Ba...150415542022-05-22 19:17:4414 mins ago0x045efa7a348c4f1ad1e22f604431dff767bbe6c2 IN  0xea8129f602e0cfdd9fba116e07fb04a13afdc48a0 AVAX0.005306996 26.5
0x3f7f907c4af35c82874606f1485bf80565b27f4de1ff9142589d591be303d6c6Claim Rewards Ba...150415492022-05-22 19:17:3414 mins ago0xc74f7e7083b05025b1ef039e46f20a43f3a19c71 IN  0xea8129f602e0cfdd9fba116e07fb04a13afdc48a0 AVAX0.0078123325 26.5
0xbccfa87a53afd0a5b98ddfcff9132c18c9f7bd5a616fe497a99e6f03e50ddaa9Claim Rewards Ba...150415082022-05-22 19:16:1215 mins ago0x0ae87a6d6d554342bcf014df51d6c0f07135a91e IN  0xea8129f602e0cfdd9fba116e07fb04a13afdc48a0 AVAX0.00426039936 26.94
0xd01691b60a3db6c323379c505f9b8128f6d1c9558e8e46a93ecf2a1063f3c5faClaim Rewards Ba...150414792022-05-22 19:15:1416 mins ago0xc7035a6a86d603eca1f2096d4e00c75ed91c2e75 IN  0xea8129f602e0cfdd9fba116e07fb04a13afdc48a0 AVAX0.012572289 26.5
0x67c1f6db0b9166cc11474e928f3d6cf95617d52f68a7337bb8df0d042e8d13d6Claim Rewards Ba...150414682022-05-22 19:14:5217 mins ago0x2e9c336a479567bcf9fd46db851fe236e5f8a690 IN  0xea8129f602e0cfdd9fba116e07fb04a13afdc48a0 AVAX0.0201181375 26.5
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

Similar Match Source Code
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0xd40fFBf8E9F07adF1530095629aD2cBc0BCF2806

Contract Name:
Handler

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity Standard Json-Input format)

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 ABI

[{"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"}]

608060405234801561001057600080fd5b5060008054600181810183557f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56390910180546001600160a01b03191633908117909155825260208190526040909120805460ff19169091179055614a6a806100796000396000f3fe608060405234801561001057600080fd5b506004361061021c5760003560e01c80639649aace11610125578063c708c72c116100ad578063e526ce541161007c578063e526ce541461049e578063e9897f87146104b1578063eba86d29146104c4578063f3c13387146104d7578063f51dee09146104ea5761021c565b8063c708c72c1461045d578063d6a0d2ee14610470578063e15e66d014610478578063e1ca019b1461048b5761021c565b8063a650ac0d116100f4578063a650ac0d146103d6578063a6b690e0146103f6578063a880f1a914610409578063bf035e111461041c578063c299d3801461043d5761021c565b80639649aace146103955780639c82f2a4146103a8578063a0a8fe65146103bb578063a4a74c49146103c35761021c565b806347ccca02116101a857806362829b201161017757806362829b2014610341578063652469301461035457806376f4e8d514610367578063837154761461037a5780638f309880146103825761021c565b806347ccca02146102f3578063493fe80f146102fb578063518e32d31461031b57806362663f181461032e5761021c565b8063173825d9116101ef578063173825d9146102875780631fb895f81461029a57806323b872dd146102ad5780632f54bf6e146102c0578063321f8674146102e05761021c565b806301b4f6b914610221578063025e7c27146102365780630c7b1d7b1461025f5780630eedc8fd14610274575b600080fd5b61023461022f366004613ec2565b6104fd565b005b610249610244366004613f7a565b61067b565b6040516102569190614111565b60405180910390f35b6102676106a5565b6040516102569190614313565b61023461028236600461396a565b6106ab565b61023461029536600461383b565b610801565b6102346102a8366004613d6a565b610a48565b6102346102bb3660046139f5565b610afe565b6102d36102ce36600461383b565b610bb9565b6040516102569190614308565b6102346102ee36600461396a565b610bce565b610249610cc6565b61030e610309366004613f7a565b610cd5565b604051610256919061431c565b610234610329366004613b32565b610d8b565b61023461033c366004613b5b565b610f4e565b61023461034f36600461385c565b61106d565b610249610362366004613d06565b61122c565b610234610375366004613dac565b6112a1565b6102676115df565b61023461039036600461388e565b6115e5565b6102346103a3366004613acc565b611822565b6102346103b636600461383b565b611a40565b610267611ab7565b61030e6103d1366004613f7a565b611baa565b6103e96103e4366004613faa565b611c79565b60405161025691906142f5565b610234610404366004613a30565b611d5f565b61026761041736600461383b565b61220a565b61042f61042a36600461383b565b612304565b6040516102569291906148aa565b61045061044b366004613faa565b61241e565b6040516102569190614295565b61023461046b36600461383b565b61258f565b610267612684565b610450610486366004613faa565b61268a565b61023461049936600461383b565b612810565b6102346104ac366004613c51565b612887565b6102346104bf36600461390f565b612ac0565b6102346104d2366004613e7e565b612c54565b6102346104e536600461383b565b612cb7565b6102346104f8366004613a30565b612d2e565b3360009081526001602052604090205460ff166105355760405162461bcd60e51b815260040161052c9061455e565b60405180910390fd5b83516001146105565760405162461bcd60e51b815260040161052c9061440a565b600081116105765760405162461bcd60e51b815260040161052c9061477d565b60005b8181101561062c57600061058f89896001613084565b90506002600101896040516105a4919061405a565b908152604051908190036020018120546304a75fe360e21b82526001600160a01b03169063129d7f8c906105e6908b908b9086908c908c908c90600401614209565b600060405180830381600087803b15801561060057600080fd5b505af1158015610614573d6000803e3d6000fd5b50505050508080610624906149cd565b915050610579565b508660405161063b919061405a565b6040518091039020866001600160a01b0316600080516020614a158339815191528360405161066a9190614313565b60405180910390a350505050505050565b6000818154811061068b57600080fd5b6000918252602090912001546001600160a01b0316905081565b60005490565b60006106b8848685613084565b905060006002600101856040516106cf919061405a565b9081526040519081900360200181205463b018fc6f60e01b82526001600160a01b03169063b018fc6f9061070990899086906004016141af565b602060405180830381600087803b15801561072357600080fd5b505af1158015610737573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061075b9190613f92565b600c54604051633517b5bb60e11b81529192506001600160a01b031690636a2f6b7690610792908a90339086908990600401614149565b600060405180830381600087803b1580156107ac57600080fd5b505af11580156107c0573d6000803e3d6000fd5b50505050846040516107d2919061405a565b6040518091039020866001600160a01b0316600080516020614a158339815191528660405161066a9190614313565b336001600160a01b03166000808154811061082c57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b03161461085e5760405162461bcd60e51b815260040161052c906143d3565b6001600160a01b03811660009081526001602052604090205460ff166108965760405162461bcd60e51b815260040161052c90614866565b600080815481106108b757634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b03828116911614156108ee5760405162461bcd60e51b815260040161052c906144af565b60015b600054811015610a2657816001600160a01b03166000828154811061092657634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b03161415610a1457600080546109519060019061494f565b8154811061096f57634e487b7160e01b600052603260045260246000fd5b600091825260208220015481546001600160a01b039091169190839081106109a757634e487b7160e01b600052603260045260246000fd5b6000918252602082200180546001600160a01b0319166001600160a01b0393909316929092179091558054806109ed57634e487b7160e01b600052603160045260246000fd5b600082815260209020810160001990810180546001600160a01b0319169055019055610a26565b80610a1e816149cd565b9150506108f1565b506001600160a01b03166000908152600160205260409020805460ff19169055565b3360009081526001602052604090205460ff16610a775760405162461bcd60e51b815260040161052c9061455e565b604051600590610a8890849061405a565b9081526040519081900360200190205460ff16610ab75760405162461bcd60e51b815260040161052c90614746565b80600260010183604051610acb919061405a565b90815260405190819003602001902080546001600160a01b03929092166001600160a01b03199092169190911790555050565b600a546001600160a01b03163314610b285760405162461bcd60e51b815260040161052c9061458a565b600081815260076020526040908190209051600391610b4691614076565b908152604051908190036020018120546323b872dd60e01b82526001600160a01b0316906323b872dd90610b8290869086908690600401614125565b600060405180830381600087803b158015610b9c57600080fd5b505af1158015610bb0573d6000803e3d6000fd5b50505050505050565b60016020526000908152604090205460ff1681565b600b54604051636454a0fd60e01b81526000916001600160a01b031690636454a0fd90610c0390879087908a9060040161435d565b602060405180830381600087803b158015610c1d57600080fd5b505af1158015610c31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c559190613f92565b600c5460405163a77f789b60e01b81529192506001600160a01b03169063a77f789b90610c8c908990339086908890600401614149565b600060405180830381600087803b158015610ca657600080fd5b505af1158015610cba573d6000803e3d6000fd5b50505050505050505050565b600a546001600160a01b031681565b600081815260076020526040908190209051606091600391610cf79190614076565b9081526040519081900360200181205463493fe80f60e01b82526001600160a01b03169063493fe80f90610d2f908590600401614313565b60006040518083038186803b158015610d4757600080fd5b505afa158015610d5b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610d839190810190613d38565b90505b919050565b336001600160a01b031660008081548110610db657634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b031614610de85760405162461bcd60e51b815260040161052c906143d3565b6001600160a01b03821660009081526001602052604090205460ff1615610e215760405162461bcd60e51b815260040161052c90614837565b6001600160a01b0382166000908152600160208190526040909120805460ff191690911790558015610f0157600080600081548110610e7057634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910154835460018101855593835290822090920180546001600160a01b0319166001600160a01b039093169290921790915580548391908190610ece57634e487b7160e01b600052603260045260246000fd5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550610f4a565b600080546001810182559080527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5630180546001600160a01b0319166001600160a01b0384161790555b5050565b3360009081526001602052604090205460ff16610f7d5760405162461bcd60e51b815260040161052c9061455e565b60005b8151811015610f4a576000828281518110610fab57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03166306fdde036040518163ffffffff1660e01b815260040160006040518083038186803b158015610feb57600080fd5b505afa158015610fff573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526110279190810190613d38565b905061105a8184848151811061104d57634e487b7160e01b600052603260045260246000fd5b60200260200101516131ad565b5080611065816149cd565b915050610f80565b6001600160a01b03811633148061109357503360009081526001602052604090205460ff165b6110af5760405162461bcd60e51b815260040161052c90614621565b60008060005b6002548110156111bd576000806002600101600260000184815481106110eb57634e487b7160e01b600052603260045260246000fd5b906000526020600020016040516111029190614076565b908152604051908190036020018120546318c880ef60e21b82526001600160a01b03169063632203bc9061113a908990600401614111565b6040805180830381600087803b15801561115357600080fd5b505af1158015611167573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061118b9190613fcb565b909250905061119a8286614937565b94506111a68185614937565b9350505080806111b5906149cd565b9150506110b5565b50600c5460405163658793a360e01b81526001600160a01b039091169063658793a3906111f4908790879087908790600401614186565b600060405180830381600087803b15801561120e57600080fd5b505af1158015611222573d6000803e3d6000fd5b5050505050505050565b6000600260030182604051611241919061405a565b9081526040519081900360200190205460ff166112705760405162461bcd60e51b815260040161052c9061469c565b60405160039061128190849061405a565b908152604051908190036020019020546001600160a01b03169050919050565b3360009081526001602052604090205460ff166112d05760405162461bcd60e51b815260040161052c9061455e565b84516001146112f15760405162461bcd60e51b815260040161052c90614441565b82518551146113125760405162461bcd60e51b815260040161052c906145ea565b60405160059061132390899061405a565b9081526040519081900360200190205460ff166113525760405162461bcd60e51b815260040161052c90614746565b600660030160008660008151811061137a57634e487b7160e01b600052603260045260246000fd5b60209081029190910181015182528101919091526040016000205460ff166113b45760405162461bcd60e51b815260040161052c90614665565b600260010160066001016000876000815181106113e157634e487b7160e01b600052603260045260246000fd5b602002602001015181526020019081526020016000206040516114049190614076565b908152604051908190036020018120546389af610760e01b82526001600160a01b0316906389af61079061143e90899089906004016141af565b602060405180830381600087803b15801561145857600080fd5b505af115801561146c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114909190613f92565b506114c3856000815181106114b557634e487b7160e01b600052603260045260246000fd5b602002602001015188613302565b6040516003906114d490899061405a565b908152604051908190036020018120546304a75fe360e21b82526001600160a01b03169063129d7f8c9061151690899088908a90899089908990600401614209565b600060405180830381600087803b15801561153057600080fd5b505af1158015611544573d6000803e3d6000fd5b5050600a5487516001600160a01b03909116925063864b7e959150879060009061157e57634e487b7160e01b600052603260045260246000fd5b6020026020010151896040518363ffffffff1660e01b81526004016115a4929190614891565b600060405180830381600087803b1580156115be57600080fd5b505af11580156115d2573d6000803e3d6000fd5b5050505050505050505050565b60065490565b6001600160a01b03831633148061160b57503360009081526001602052604090205460ff165b6116275760405162461bcd60e51b815260040161052c90614621565b600080825184511461164b5760405162461bcd60e51b815260040161052c906145ea565b60005b84518110156117eb57600260030185828151811061167c57634e487b7160e01b600052603260045260246000fd5b6020026020010151604051611691919061405a565b9081526040519081900360200190205460ff166116c05760405162461bcd60e51b815260040161052c90614746565b60008060026001018784815181106116e857634e487b7160e01b600052603260045260246000fd5b60200260200101516040516116fd919061405a565b9081526040519081900360200190205486516001600160a01b039091169063daf73bbd908a9089908790811061174357634e487b7160e01b600052603260045260246000fd5b60200260200101516040518363ffffffff1660e01b81526004016117689291906141af565b6040805180830381600087803b15801561178157600080fd5b505af1158015611795573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117b99190613fcb565b90925090506117c88286614937565b94506117d48185614937565b9350505080806117e3906149cd565b91505061164e565b50600c546040516336ed57cd60e01b81526001600160a01b03909116906336ed57cd90610c8c908990899087908790600401614186565b6001600160a01b03831633148061184857503360009081526001602052604090205460ff165b6118645760405162461bcd60e51b815260040161052c90614478565b80518251146118855760405162461bcd60e51b815260040161052c906145ea565b60005b8251811015611a3a5760006118ec8483815181106118b657634e487b7160e01b600052603260045260246000fd5b6020026020010151868585815181106118df57634e487b7160e01b600052603260045260246000fd5b6020026020010151613084565b9050600260010184838151811061191357634e487b7160e01b600052603260045260246000fd5b6020026020010151604051611928919061405a565b908152604051908190036020018120546306caef4d60e51b82526001600160a01b03169063d95de9a09061196290889085906004016141af565b600060405180830381600087803b15801561197c57600080fd5b505af1158015611990573d6000803e3d6000fd5b505050508382815181106119b457634e487b7160e01b600052603260045260246000fd5b60200260200101516040516119c9919061405a565b6040518091039020856001600160a01b0316600080516020614a15833981519152858581518110611a0a57634e487b7160e01b600052603260045260246000fd5b6020026020010151604051611a1f9190614313565b60405180910390a35080611a32816149cd565b915050611888565b50505050565b3360009081526001602052604090205460ff16611a6f5760405162461bcd60e51b815260040161052c9061455e565b6001600160a01b038116611a955760405162461bcd60e51b815260040161052c906147f0565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b60008060005b600254811015611ba457600280546003919083908110611aed57634e487b7160e01b600052603260045260246000fd5b90600052602060002001604051611b049190614076565b90815260408051602092819003830181205463b88d345360e01b825291516001600160a01b039092169263b88d345392600480840193829003018186803b158015611b4e57600080fd5b505afa158015611b62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b869190613f92565b611b909083614937565b915080611b9c816149cd565b915050611abd565b50905090565b60008181526009602052604090205460609060ff16611bdb5760405162461bcd60e51b815260040161052c906147c2565b60008281526007602052604090208054611bf490614992565b80601f0160208091040260200160405190810160405280929190818152602001828054611c2090614992565b8015611c6d5780601f10611c4257610100808354040283529160200191611c6d565b820191906000526020600020905b815481529060010190602001808311611c5057829003601f168201915b50505050509050919050565b60606000611c87848461494f565b6001600160401b03811115611cac57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611cd5578160200160208202803683370190505b509050835b83811015611d57576006805482908110611d0457634e487b7160e01b600052603260045260246000fd5b9060005260206000200154828683611d1c919061494f565b81518110611d3a57634e487b7160e01b600052603260045260246000fd5b602090810291909101015280611d4f816149cd565b915050611cda565b509392505050565b8251845114611d805760405162461bcd60e51b815260040161052c906145ea565b6000611d8d833384613084565b9050611d9b863387876115e5565b6000600260010184604051611db0919061405a565b908152604051908190036020018120546304eb4ae360e51b82526001600160a01b031690639d695c6090611dea90339086906004016141af565b602060405180830381600087803b158015611e0457600080fd5b505af1158015611e18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e3c9190613f92565b905060005b865181108015611e515750600082115b156121ae576002600301878281518110611e7b57634e487b7160e01b600052603260045260246000fd5b6020026020010151604051611e90919061405a565b9081526040519081900360200190205460ff16611ebf5760405162461bcd60e51b815260040161052c90614746565b600a5486516001600160a01b039091169063b2dc5dc3903390899085908110611ef857634e487b7160e01b600052603260045260246000fd5b60200260200101516040518363ffffffff1660e01b8152600401611f1d9291906141af565b600060405180830381600087803b158015611f3757600080fd5b505af1158015611f4b573d6000803e3d6000fd5b5050505060005b868281518110611f7257634e487b7160e01b600052603260045260246000fd5b6020026020010151518110156120735760066003016000888481518110611fa957634e487b7160e01b600052603260045260246000fd5b60200260200101518381518110611fd057634e487b7160e01b600052603260045260246000fd5b60209081029190910181015182528101919091526040016000205460ff1661200a5760405162461bcd60e51b815260040161052c906144f0565b61206187838151811061202d57634e487b7160e01b600052603260045260246000fd5b6020026020010151828151811061205457634e487b7160e01b600052603260045260246000fd5b60200260200101516133b5565b8061206b816149cd565b915050611f52565b506000600260010188838151811061209b57634e487b7160e01b600052603260045260246000fd5b60200260200101516040516120b0919061405a565b908152602001604051809103902060009054906101000a90046001600160a01b031690506000816001600160a01b03166389af6107338a868151811061210657634e487b7160e01b600052603260045260246000fd5b60200260200101516040518363ffffffff1660e01b815260040161212b9291906141af565b602060405180830381600087803b15801561214557600080fd5b505af1158015612159573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061217d9190613f92565b905080841161218d576000612197565b612197818561494f565b9350505080806121a6906149cd565b915050611e41565b5080156121cd5760405162461bcd60e51b815260040161052c90614527565b836040516121db919061405a565b6040518091039020336001600160a01b0316600080516020614a158339815191528560405161066a9190614313565b60008060005b6002548110156122fd5760028054600391908390811061224057634e487b7160e01b600052603260045260246000fd5b906000526020600020016040516122579190614076565b908152604051908190036020018120546343a9ac3960e01b82526001600160a01b0316906343a9ac399061228f908790600401614111565b60206040518083038186803b1580156122a757600080fd5b505afa1580156122bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122df9190613f92565b6122e99083614937565b9150806122f5816149cd565b915050612210565b5092915050565b60008060008060005b6002548110156124135760008060026001016002600001848154811061234357634e487b7160e01b600052603260045260246000fd5b9060005260206000200160405161235a9190614076565b908152604051908190036020018120546303eba50760e01b82526001600160a01b0316906303eba50790612392908b90600401614111565b604080518083038186803b1580156123a957600080fd5b505afa1580156123bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123e19190613fcb565b90925090506123f08286614937565b94506123fc8185614937565b93505050808061240b906149cd565b91505061230d565b509092509050915091565b6060600061242c848461494f565b6001600160401b0381111561245157634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561248457816020015b606081526020019060019003908161246f5790505b509050835b83811015611d575760028054829081106124b357634e487b7160e01b600052603260045260246000fd5b9060005260206000200180546124c890614992565b80601f01602080910402602001604051908101604052809291908181526020018280546124f490614992565b80156125415780601f1061251657610100808354040283529160200191612541565b820191906000526020600020905b81548152906001019060200180831161252457829003601f168201915b5050505050828683612553919061494f565b8151811061257157634e487b7160e01b600052603260045260246000fd5b60200260200101819052508080612587906149cd565b915050612489565b3360009081526001602052604090205460ff166125be5760405162461bcd60e51b815260040161052c9061455e565b6000816001600160a01b03166306fdde036040518163ffffffff1660e01b815260040160006040518083038186803b1580156125f957600080fd5b505afa15801561260d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526126359190810190613d38565b905060026003018160405161264a919061405a565b9081526040519081900360200190205460ff161561267a5760405162461bcd60e51b815260040161052c906145b5565b610f4a81836131ad565b60025490565b60606000612698848461494f565b6001600160401b038111156126bd57634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156126f057816020015b60608152602001906001900390816126db5790505b509050835b83811015611d5757600680546007916000918490811061272557634e487b7160e01b600052603260045260246000fd5b90600052602060002001548152602001908152602001600020805461274990614992565b80601f016020809104026020016040519081016040528092919081815260200182805461277590614992565b80156127c25780601f10612797576101008083540402835291602001916127c2565b820191906000526020600020905b8154815290600101906020018083116127a557829003601f168201915b50505050508286836127d4919061494f565b815181106127f257634e487b7160e01b600052603260045260246000fd5b60200260200101819052508080612808906149cd565b9150506126f5565b3360009081526001602052604090205460ff1661283f5760405162461bcd60e51b815260040161052c9061455e565b6001600160a01b0381166128655760405162461bcd60e51b815260040161052c90614702565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b600b5460405163a933c20f60e01b815260609182916001600160a01b039091169063a933c20f906128be90339087906004016141af565b600060405180830381600087803b1580156128d857600080fd5b505af11580156128ec573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526129149190810190613bf1565b909250905060005b8251811015611a3a57600061295a84838151811061294a57634e487b7160e01b600052603260045260246000fd5b6020026020010151336001613084565b9050600260010184838151811061298157634e487b7160e01b600052603260045260246000fd5b6020026020010151604051612996919061405a565b908152602001604051809103902060009054906101000a90046001600160a01b03166001600160a01b031663fd38450433838686815181106129e857634e487b7160e01b600052603260045260246000fd5b60200260200101516040518463ffffffff1660e01b8152600401612a0e939291906141d3565b600060405180830381600087803b158015612a2857600080fd5b505af1158015612a3c573d6000803e3d6000fd5b50505050838281518110612a6057634e487b7160e01b600052603260045260246000fd5b6020026020010151604051612a75919061405a565b6040518091039020336001600160a01b0316600080516020614a158339815191526001604051612aa59190614313565b60405180910390a35080612ab8816149cd565b91505061291c565b6001600160a01b038216331480612ae657503360009081526001602052604090205460ff165b612b025760405162461bcd60e51b815260040161052c90614621565b604051600590612b1390839061405a565b9081526040519081900360200190205460ff16612b425760405162461bcd60e51b815260040161052c90614746565b600080600260010183604051612b58919061405a565b908152604051908190036020018120546318c880ef60e21b82526001600160a01b03169063632203bc90612b90908790600401614111565b6040805180830381600087803b158015612ba957600080fd5b505af1158015612bbd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612be19190613fcb565b600c5460405163fbe12f1d60e01b81529294509092506001600160a01b03169063fbe12f1d90612c1b908890889087908790600401614186565b600060405180830381600087803b158015612c3557600080fd5b505af1158015612c49573d6000803e3d6000fd5b505050505050505050565b3360009081526001602052604090205460ff16612c835760405162461bcd60e51b815260040161052c9061455e565b600b546040516343836c7f60e11b81526001600160a01b0390911690638706d8fe90610b829086908590879060040161435d565b3360009081526001602052604090205460ff16612ce65760405162461bcd60e51b815260040161052c9061455e565b6001600160a01b038116612d0c5760405162461bcd60e51b815260040161052c90614390565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b8251845114612d4f5760405162461bcd60e51b815260040161052c906145ea565b6000612d5c833384613084565b90506000806000600260010186604051612d76919061405a565b908152604051908190036020018120546319309eb560e21b82526001600160a01b0316906364c27ad490612db090339088906004016141af565b602060405180830381600087803b158015612dca57600080fd5b505af1158015612dde573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e029190613f92565b905060005b8851811015612fa4576002600301898281518110612e3557634e487b7160e01b600052603260045260246000fd5b6020026020010151604051612e4a919061405a565b9081526040519081900360200190205460ff16612e795760405162461bcd60e51b815260040161052c90614746565b60008060026001018b8481518110612ea157634e487b7160e01b600052603260045260246000fd5b6020026020010151604051612eb6919061405a565b908152604051908190036020019020548a516001600160a01b039091169063daf73bbd9033908d9087908110612efc57634e487b7160e01b600052603260045260246000fd5b60200260200101516040518363ffffffff1660e01b8152600401612f219291906141af565b6040805180830381600087803b158015612f3a57600080fd5b505af1158015612f4e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f729190613fcb565b9092509050612f818287614937565b9550612f8d8186614937565b945050508080612f9c906149cd565b915050612e07565b5082811115612fc55760405162461bcd60e51b815260040161052c906146cb565b600c546001600160a01b031663c7ae05318a33612fe2858861494f565b866040518563ffffffff1660e01b81526004016130029493929190614186565b600060405180830381600087803b15801561301c57600080fd5b505af1158015613030573d6000803e3d6000fd5b5050505085604051613042919061405a565b6040518091039020336001600160a01b0316600080516020614a15833981519152876040516130719190614313565b60405180910390a3505050505050505050565b6060600260030184604051613099919061405a565b9081526040519081900360200190205460ff166130c85760405162461bcd60e51b815260040161052c90614746565b600a54604051635181db2b60e01b81526000916001600160a01b031690635181db2b906130fd9088908890889060040161432f565b600060405180830381600087803b15801561311757600080fd5b505af115801561312b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526131539190810190613c83565b905060005b81518110156131a45761319282828151811061318457634e487b7160e01b600052603260045260246000fd5b602002602001015187613302565b8061319c816149cd565b915050613158565b50949350505050565b6040516005906131be90849061405a565b9081526040519081900360200190205460ff161561321e57806002600101836040516131ea919061405a565b90815260405190819003602001902080546001600160a01b03929092166001600160a01b0319909216919091179055610f4a565b6001600260030183604051613233919061405a565b908152604051908190036020018120805492151560ff1990931692909217909155819060039061326490859061405a565b90815260405190819003602001812080546001600160a01b03939093166001600160a01b031990931692909217909155600254906004906132a690859061405a565b90815260405160209181900382019020919091556002805460018101825560009190915283516132fd927f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace909201918501906134e0565b505050565b60008281526009602052604090205460ff161561333e5760008281526007602090815260409091208251613338928401906134e0565b50610f4a565b6000828152600960209081526040808320805460ff1916600117905560078252909120825161336f928401906134e0565b5050600680546000838152600860205260408120829055600182018355919091527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0155565b60008181526009602052604090205460ff166133d0576134dd565b6000818152600960209081526040808320805460ff19169055600790915281206133f991613564565b60008181526008602052604081205460065490919061341a9060019061494f565b905060006006600001828154811061344257634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101548083526008909152604080832086905586835282209190915590508183146134a457806006600001848154811061349757634e487b7160e01b600052603260045260246000fd5b6000918252602090912001555b60068054806134c357634e487b7160e01b600052603160045260246000fd5b600190038181906000526020600020016000905590555050505b50565b8280546134ec90614992565b90600052602060002090601f01602090048101928261350e5760008555613554565b82601f1061352757805160ff1916838001178555613554565b82800160010185558215613554579182015b82811115613554578251825591602001919060010190613539565b5061356092915061359c565b5090565b50805461357090614992565b6000825580601f1061358257506134dd565b601f0160209004906000526020600020908101906134dd91905b5b80821115613560576000815560010161359d565b80356001600160a01b0381168114610d8657600080fd5b600082601f8301126135d8578081fd5b813560206135ed6135e8836148e1565b6148b8565b82815281810190858301855b8581101561362257613610898684358b010161373a565b845292840192908401906001016135f9565b5090979650505050505050565b600082601f83011261363f578081fd5b8135602061364f6135e8836148e1565b828152818101908583018385028701840188101561366b578586fd5b855b858110156136225761367e82613794565b8452928401929084019060010161366d565b600082601f8301126136a0578081fd5b813560206136b06135e8836148e1565b82815281810190858301855b85811015613622576136d3898684358b01016137a4565b845292840192908401906001016136bc565b600082601f8301126136f5578081fd5b815160206137056135e8836148e1565b82815281810190858301855b8581101561362257613728898684518b01016137f0565b84529284019290840190600101613711565b600082601f83011261374a578081fd5b8135602061375a6135e8836148e1565b8281528181019085830183850287018401881015613776578586fd5b855b8581101561362257813584529284019290840190600101613778565b80358015158114610d8657600080fd5b600082601f8301126137b4578081fd5b81356137c26135e882614904565b8181528460208386010111156137d6578283fd5b816020850160208301379081016020019190915292915050565b600082601f830112613800578081fd5b815161380e6135e882614904565b818152846020838601011115613822578283fd5b613833826020830160208701614966565b949350505050565b60006020828403121561384c578081fd5b613855826135b1565b9392505050565b6000806040838503121561386e578081fd5b613877836135b1565b9150613885602084016135b1565b90509250929050565b600080600080608085870312156138a3578182fd5b6138ac856135b1565b93506138ba602086016135b1565b925060408501356001600160401b03808211156138d5578384fd5b6138e188838901613690565b935060608701359150808211156138f6578283fd5b50613903878288016135c8565b91505092959194509250565b600080600060608486031215613923578081fd5b61392c846135b1565b925061393a602085016135b1565b915060408401356001600160401b03811115613954578182fd5b613960868287016137a4565b9150509250925092565b600080600080600060a08688031215613981578283fd5b61398a866135b1565b9450613998602087016135b1565b935060408601356001600160401b03808211156139b3578485fd5b6139bf89838a016137a4565b94506060880135935060808801359150808211156139db578283fd5b506139e8888289016137a4565b9150509295509295909350565b600080600060608486031215613a09578081fd5b613a12846135b1565b9250613a20602085016135b1565b9150604084013590509250925092565b600080600080600060a08688031215613a47578283fd5b613a50866135b1565b945060208601356001600160401b0380821115613a6b578485fd5b613a7789838a01613690565b95506040880135915080821115613a8c578485fd5b613a9889838a016135c8565b94506060880135915080821115613aad578283fd5b50613aba888289016137a4565b95989497509295608001359392505050565b600080600060608486031215613ae0578081fd5b613ae9846135b1565b925060208401356001600160401b0380821115613b04578283fd5b613b1087838801613690565b93506040860135915080821115613b25578283fd5b506139608682870161373a565b60008060408385031215613b44578182fd5b613b4d836135b1565b915061388560208401613794565b60006020808385031215613b6d578182fd5b82356001600160401b03811115613b82578283fd5b8301601f81018513613b92578283fd5b8035613ba06135e8826148e1565b8181528381019083850185840285018601891015613bbc578687fd5b8694505b83851015613be557613bd1816135b1565b835260019490940193918501918501613bc0565b50979650505050505050565b60008060408385031215613c03578182fd5b82516001600160401b0380821115613c19578384fd5b613c25868387016136e5565b93506020850151915080821115613c3a578283fd5b50613c47858286016136e5565b9150509250929050565b600060208284031215613c62578081fd5b81356001600160401b03811115613c77578182fd5b6138338482850161373a565b60006020808385031215613c95578182fd5b82516001600160401b03811115613caa578283fd5b8301601f81018513613cba578283fd5b8051613cc86135e8826148e1565b8181528381019083850185840285018601891015613ce4578687fd5b8694505b83851015613be5578051835260019490940193918501918501613ce8565b600060208284031215613d17578081fd5b81356001600160401b03811115613d2c578182fd5b613833848285016137a4565b600060208284031215613d49578081fd5b81516001600160401b03811115613d5e578182fd5b613833848285016137f0565b60008060408385031215613d7c578182fd5b82356001600160401b03811115613d91578283fd5b613d9d858286016137a4565b925050613885602084016135b1565b600080600080600080600060e0888a031215613dc6578485fd5b87356001600160401b0380821115613ddc578687fd5b613de88b838c016137a4565b9850613df660208b016135b1565b975060408a0135915080821115613e0b578687fd5b613e178b838c0161373a565b965060608a0135955060808a0135915080821115613e33578384fd5b613e3f8b838c0161362f565b9450613e4d60a08b01613794565b935060c08a0135915080821115613e62578283fd5b50613e6f8a828b016137a4565b91505092959891949750929550565b600080600060608486031215613e92578081fd5b83356001600160401b03811115613ea7578182fd5b613eb3868287016137a4565b935050613a20602085016135b1565b600080600080600080600060e0888a031215613edc578081fd5b87356001600160401b0380821115613ef2578283fd5b613efe8b838c016137a4565b9850613f0c60208b016135b1565b975060408a0135965060608a0135915080821115613f28578283fd5b613f348b838c0161362f565b9550613f4260808b01613794565b945060a08a0135915080821115613f57578283fd5b50613f648a828b016137a4565b92505060c0880135905092959891949750929550565b600060208284031215613f8b578081fd5b5035919050565b600060208284031215613fa3578081fd5b5051919050565b60008060408385031215613fbc578182fd5b50508035926020909101359150565b60008060408385031215613fdd578182fd5b505080516020909101519092909150565b6000815180845260208085019450808401835b8381101561401d57815187529582019590820190600101614001565b509495945050505050565b15159052565b60008151808452614046816020860160208601614966565b601f01601f19169290920160200192915050565b6000825161406c818460208701614966565b9190910192915050565b815460009081906002810460018083168061409257607f831692505b60208084108214156140b257634e487b7160e01b87526022600452602487fd5b8180156140c657600181146140d757614103565b60ff19861689528489019650614103565b6140e08a61492b565b885b868110156140fb5781548b8201529085019083016140e2565b505084890196505b509498975050505050505050565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061417c9083018461402e565b9695505050505050565b6001600160a01b0394851681529290931660208301526040820152606081019190915260800190565b6001600160a01b038316815260406020820181905260009061383390830184613fee565b6001600160a01b03841681526060602082018190526000906141f790830185613fee565b828103604084015261417c818561402e565b600060018060a01b03881682526020878184015260c0604084015261423160c0840188613fee565b8381036060850152865180825282880191830190845b81811015614265578351151583529284019291840191600101614247565b50506142746080860188614028565b84810360a0860152614286818761402e565b9b9a5050505050505050505050565b6000602080830181845280855180835260408601915060408482028701019250838701855b828110156142e857603f198886030184526142d685835161402e565b945092850192908501906001016142ba565b5092979650505050505050565b6000602082526138556020830184613fee565b901515815260200190565b90815260200190565b600060208252613855602083018461402e565b600060608252614342606083018661402e565b6001600160a01b039490941660208301525060400152919050565b600060608252614370606083018661402e565b6020830194909452506001600160a01b0391909116604090910152919050565b60208082526023908201527f48616e646c65723a204e66742063616e6e6f742062652061646472657373207a60408201526265726f60e81b606082015260800190565b60208082526018908201527f4f776e6572733a204f6e6c79205375706572204f776e65720000000000000000604082015260600190565b6020808252601a908201527f48616e646c65723a20437265617465206f6e65206279206f6e65000000000000604082015260600190565b6020808252601a908201527f48616e646c65723a2045766f6c7665206f6e65206279206f6e65000000000000604082015260600190565b6020808252601e908201527f48616e646c65723a2053656e646572206e6f7420617574686f72697a65640000604082015260600190565b60208082526021908201527f4f776e6572733a2043616e6e6f742072656d6f7665207375706572206f776e656040820152603960f91b606082015260800190565b6020808252601d908201527f48616e646c65723a20546f6b656e496420646f65736e74206578697374000000604082015260600190565b60208082526017908201527f48616e646c65723a204e69636520747279206275646479000000000000000000604082015260600190565b60208082526012908201527127bbb732b9399d1027b7363c9027bbb732b960711b604082015260600190565b60208082526011908201527012185b991b195c8e8813db9b1e4813999d607a1b604082015260600190565b6020808252818101527f48616e646c65723a204e6f64655479706520616c726561647920657869737473604082015260600190565b60208082526018908201527f48616e646c65723a204c656e677468206d69736d617463680000000000000000604082015260600190565b60208082526024908201527f48616e646c65723a20446f6e74206d6573732077697468206f7468657220636c60408201526361696d7360e01b606082015260800190565b6020808252601b908201527f48616e646c65723a20546f6b656e20646f65736e742065786973740000000000604082015260600190565b602080825260159082015274139bd919551e5c1948191bd95cdb9d08195e1a5cdd605a1b604082015260600190565b6020808252601b908201527f48616e646c65723a204e6f7420656e6f7567682070656e64696e670000000000604082015260600190565b60208082526024908201527f48616e646c65723a204c6f6f742063616e6e6f742062652061646472657373206040820152637a65726f60e01b606082015260800190565b6020808252601e908201527f48616e646c65723a204e6f64655479706520646f65736e742065786973740000604082015260600190565b60208082526025908201527f48616e646c65723a20436f756e74206d75737420626520677265617465722074604082015264068616e20360dc1b606082015260800190565b602080825260149082015273151bdad95b925908191bd95cdb9d08195e1a5cdd60621b604082015260600190565b60208082526027908201527f48616e646c65723a20537761707065722063616e6e6f742062652061646472656040820152667373207a65726f60c81b606082015260800190565b60208082526015908201527427bbb732b9399d1020b63932b0b23c9037bbb732b960591b604082015260600190565b60208082526011908201527027bbb732b9399d102737ba1037bbb732b960791b604082015260600190565b600083825260406020830152613833604083018461402e565b918252602082015260400190565b6040518181016001600160401b03811182821017156148d9576148d96149fe565b604052919050565b60006001600160401b038211156148fa576148fa6149fe565b5060209081020190565b60006001600160401b0382111561491d5761491d6149fe565b50601f01601f191660200190565b60009081526020902090565b6000821982111561494a5761494a6149e8565b500190565b600082821015614961576149616149e8565b500390565b60005b83811015614981578181015183820152602001614969565b83811115611a3a5750506000910152565b6002810460018216806149a657607f821691505b602082108114156149c757634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156149e1576149e16149e8565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fdfe3c8006180c21a8a3a5910855aaa92c2043f55f5a5cc6d89097bfafdfc5fe18eca2646970667358221220296ff4454b66ffcb34247735b1125faadf0c14ea3a8a9947010fae8fa97d77d264736f6c63430008000033

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