Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 387 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Mint Subscriptio... | 18352477 | 474 days ago | IN | 0.02 ETH | 0.00139099 | ||||
Set Subscription... | 18341985 | 476 days ago | IN | 0 ETH | 0.00053745 | ||||
Set Subscription... | 18293928 | 482 days ago | IN | 0 ETH | 0.0002251 | ||||
Set Subscription... | 18293925 | 482 days ago | IN | 0 ETH | 0.00023785 | ||||
Mint Subscriptio... | 18293920 | 482 days ago | IN | 0.01 ETH | 0.00191778 | ||||
Set Subscription... | 18293875 | 482 days ago | IN | 0 ETH | 0.00018993 | ||||
Set Subscription... | 18101651 | 509 days ago | IN | 0 ETH | 0.00048758 | ||||
Set Subscription... | 18101522 | 509 days ago | IN | 0 ETH | 0.00037993 | ||||
Set Subscription... | 18101514 | 509 days ago | IN | 0 ETH | 0.00036848 | ||||
Mint Subscriptio... | 17772021 | 555 days ago | IN | 0.18 ETH | 0.01059924 | ||||
Mint Subscriptio... | 17395285 | 608 days ago | IN | 0.18 ETH | 0.00819479 | ||||
Set Subscription... | 17294677 | 622 days ago | IN | 0 ETH | 0.00192229 | ||||
Mint Subscriptio... | 17059667 | 656 days ago | IN | 0.2 ETH | 0.00649571 | ||||
Switch Genesis M... | 17046325 | 657 days ago | IN | 0 ETH | 0.00118249 | ||||
Mint Subscriptio... | 17046300 | 657 days ago | IN | 0.6 ETH | 0.01913617 | ||||
Mint Subscriptio... | 17046290 | 657 days ago | IN | 0.6 ETH | 0.01867533 | ||||
Mint Subscriptio... | 17046286 | 657 days ago | IN | 0.6 ETH | 0.01664955 | ||||
Mint Subscriptio... | 17046257 | 657 days ago | IN | 0.2 ETH | 0.01327526 | ||||
Mint Subscriptio... | 17041071 | 658 days ago | IN | 0.2 ETH | 0.00780861 | ||||
Mint Subscriptio... | 17041040 | 658 days ago | IN | 1.8 ETH | 0.027644 | ||||
Mint Subscriptio... | 17041009 | 658 days ago | IN | 0.2 ETH | 0.00611831 | ||||
Mint Subscriptio... | 16978336 | 667 days ago | IN | 0.2 ETH | 0.00915888 | ||||
Mint Subscriptio... | 16935320 | 673 days ago | IN | 0.2 ETH | 0.01020219 | ||||
Mint Subscriptio... | 16880081 | 681 days ago | IN | 0.2 ETH | 0.00368706 | ||||
Mint Subscriptio... | 16819767 | 690 days ago | IN | 0.2 ETH | 0.01349616 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
18352477 | 474 days ago | 0.02 ETH | ||||
18293920 | 482 days ago | 0.01 ETH | ||||
18293920 | 482 days ago | 0.01 ETH | ||||
17772021 | 555 days ago | 0.18 ETH | ||||
17395285 | 608 days ago | 0.18 ETH | ||||
17059667 | 656 days ago | 0.2 ETH | ||||
17046300 | 657 days ago | 0.6 ETH | ||||
17046290 | 657 days ago | 0.6 ETH | ||||
17046286 | 657 days ago | 0.6 ETH | ||||
17046257 | 657 days ago | 0.2 ETH | ||||
17041071 | 658 days ago | 0.2 ETH | ||||
17041040 | 658 days ago | 1.8 ETH | ||||
17041009 | 658 days ago | 0.2 ETH | ||||
16978336 | 667 days ago | 0.2 ETH | ||||
16935320 | 673 days ago | 0.2 ETH | ||||
16880081 | 681 days ago | 0.2 ETH | ||||
16819767 | 690 days ago | 0.2 ETH | ||||
16780550 | 695 days ago | 0.2 ETH | ||||
16700248 | 706 days ago | 0.2 ETH | ||||
16700221 | 706 days ago | 0.2 ETH | ||||
16670252 | 711 days ago | 0.2 ETH | ||||
16670226 | 711 days ago | 0.2 ETH | ||||
16586274 | 722 days ago | 0.6 ETH | ||||
16586259 | 722 days ago | 0.4 ETH | ||||
16586241 | 722 days ago | 0.8 ETH |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
DynamicNft
Compiler Version
v0.8.11+commit.d7f03943
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity 0.8.11; import "@openzeppelin/contracts/access/AccessControl.sol"; import "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol"; import "./interfaces/ITreasury.sol"; import "./interfaces/IDynamic.sol"; import "./interfaces/INft.sol"; import "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol"; contract DynamicNft is AccessControl, IDynamic { bytes32 public constant EXECUTOR_ROLE = keccak256("EXECUTOR_ROLE"); bytes32 public constant NFT_ROLE = keccak256("NFT_ROLE"); bytes32 public constant ADMIN_ROLE = keccak256("ADMIN_ROLE"); bytes32 public merkleRoot = 0xa0fd9888b738d87f115429a3520fdbd602fbe89c095c2a6f2f1f5af661dfc43d; bytes32 public constant ZEROSTATE = 0x0000000000000000000000000000000000000000000000000000000000000000; address public immutable treasuryAddress; address private cap3Wallet; address public genesisContractAddress; address public subsContractAddress; uint256 public genesisPrice = 2 ether; uint256 private projectId = 1; uint256 public genesisSupply = 2000; uint256 public subscriptionSupply = 7000; uint256 private genesisVotingPower = 2; uint256 private subscriptionVotingPower = 1; uint256 private treasuryLimit = 1e6; uint256 public projectFund = 1e5; bool public genesisStatus; bool public subscriptionStatus; SubscriptionStage public subsStage; SubscriptionTierDetails public subscriptionDetails; bool public distributeFlag; bool public refundFlag; struct Genesis { uint256 tokenId; address owner; bool claimed; } struct Subscription { uint256 tokenId; uint256 renewalExpire; uint256 price; address owner; bool expired; bool renewed; } struct Project { string id; string description; address author; bool funded; } struct SubscriptionTierDetails { uint256 tierOnePrice; uint256 tierTwoPrice; uint256 tierThreePrice; uint256 tierFourPrice; uint256 tierOneQuantities; uint256 tierTwoQuantities; uint256 tierThreeQuantities; uint256 tierFourQuantities; } enum TOKEN { GENESIS, SUBSCRIPTION } enum SubscriptionStage { TIER_ONE, TIER_TWO, TIER_THREE, TIER_FOUR } /*------ Events -------*/ event SubscriptionMintStateUpdated(bool state); event GenesisMintStateUpdated(bool state); event GenesisMinted(address to, uint256 id, uint16 quantity); event SubscriptionMinted(address to, uint256 id, uint16 quantity); event SubscriptionRenewed(address holder, uint256 tokenId); event ExpiredSubscription(address holder, uint256 renewalExpire, uint256 tokenId); event MerkleRootSet(bytes32 _merkleRoot); event TreasuryLimitSet(uint256 newLimit, uint256 oldLimit); event SubscriptionBalanceUpdated(uint256 TokenSupply, uint256 tokenId); event ProposalApproved(string id, string _title, address author, uint256 amount); event ProposalFunded(string id, uint256 amount); event UpdatedBackendAddress(address backendAddress, string Role); event DistributionActive(); event NftTransfered(address to, uint256 tokenId, bool isGenesis); event SubscriptionStageUpdated(uint256 newStage); event SubscriptionPriceUpdated(uint256 stage, uint256 newPrice); event SubscriptionQuantitesUpdated(uint256 stage, uint256 newQuantity); event Refunded(address sender, uint256[] tokenIds, uint256 amount); mapping(string => Project) private proposals; mapping(uint256 => Genesis) public genesisHolder; mapping(uint256 => Subscription) public subsHolder; mapping(address => uint256) public referralCodes; mapping(uint256 => address) public codeToAddress; mapping(address => uint8) public toRefund; AggregatorV3Interface internal priceFeed; constructor( address _genesis, address _subscription, address _treasury, address _cap3Wallet, address _priceFeedAggregator, address[] memory _admins ) { require(_genesis != address(0), "ADDRESS ZERO"); require(_subscription != address(0), "ADDRESS ZERO"); require(_treasury != address(0), "ADDRESS ZERO"); require(_cap3Wallet != address(0), "ADDRESS ZERO"); require(_priceFeedAggregator != address(0), "ADDRESS ZER0"); subsContractAddress = _subscription; genesisContractAddress = _genesis; treasuryAddress = _treasury; cap3Wallet = _cap3Wallet; priceFeed = AggregatorV3Interface(_priceFeedAggregator); _setRoleAdmin(ADMIN_ROLE, ADMIN_ROLE); _setRoleAdmin(EXECUTOR_ROLE, ADMIN_ROLE); _setupRole(ADMIN_ROLE, _msgSender()); _setupRole(ADMIN_ROLE, _admins[0]); _setupRole(ADMIN_ROLE, _admins[1]); _setupRole(ADMIN_ROLE, address(this)); _setupRole(NFT_ROLE, _genesis); _setupRole(NFT_ROLE, _subscription); subscriptionDetails.tierOnePrice = 0.2 ether; subscriptionDetails.tierTwoPrice = 0.22 ether; subscriptionDetails.tierThreePrice = 0.24 ether; subscriptionDetails.tierFourPrice = 0.26 ether; subscriptionDetails.tierOneQuantities = 1750; subscriptionDetails.tierTwoQuantities = 1750; subscriptionDetails.tierThreeQuantities = 1750; subscriptionDetails.tierFourQuantities = 1750; } /*------- State Changing Functions ------*/ function mintGenesis( address _to, bytes32[] calldata _merkleProof, uint256 _quantity ) public payable { INft GenesisNft = INft(genesisContractAddress); require((GenesisNft.totalSupply() + _quantity) <= (genesisSupply / 4), "MAX QUANTITY REACHED"); require(msg.value >= (genesisPrice * _quantity), "INSUFFICIENT MINTING VALUE"); require(genesisStatus, "GENESIS MINT CURRENTLY INACTIVE"); require(GenesisNft.totalSupply() < 500, "INSUFICIENT GENESIS STOCK"); if (merkleRoot != ZEROSTATE) { require(verifyMerkleProof(_to, _merkleProof), "INVALID MERKLE PROOF"); } uint256 _id = GenesisNft.currentIndex(); for (uint256 x = _id; x < (_quantity + _id); x++) { genesisHolder[x] = Genesis({tokenId: _id, owner: _to, claimed: false}); } GenesisNft.mint(_to, _quantity); (bool success, ) = cap3Wallet.call{value: msg.value}(""); require(success, "MINT:ETH TRANSFER FAILED"); if (GenesisNft.totalSupply() == (genesisSupply / 4)) { genesisStatus = false; } emit GenesisMinted(_to, _id, uint16(_quantity)); } function mintGiftGenesis(address _to) public onlyRole(ADMIN_ROLE) { INft GenesisNft = INft(genesisContractAddress); require(genesisStatus, "GENESIS MINT CURRENTLY INACTIVE"); require(GenesisNft.totalSupply() < 500, "INSUFICIENT GENESIS STOCK"); uint256 _id = GenesisNft.currentIndex(); genesisHolder[_id] = Genesis({tokenId: _id, owner: _to, claimed: false}); GenesisNft.mint(_to, 1); if (GenesisNft.totalSupply() == 500) { genesisStatus = false; } emit GenesisMinted(_to, _id, 1); } function mintSubscription( address _to, uint256 _quantity, uint256 _referralCode ) public payable { INft SubscriptionNft = INft(subsContractAddress); uint256 amountPaidPerNFT; require(subscriptionStatus, "SUBS MINT CURRENTLY INACTIVE"); require(SubscriptionNft.totalSupply() + _quantity <= subscriptionSupply, "INSUFICIENT SUBSCRIPTION STOCK"); if (subsStage == SubscriptionStage.TIER_ONE) { if (_quantity + SubscriptionNft.totalSupply() <= subscriptionDetails.tierOneQuantities) { require(msg.value >= (subscriptionDetails.tierOnePrice * _quantity), "INSUFFICIENT MINTING VALUE"); amountPaidPerNFT = subscriptionDetails.tierOnePrice; } else { uint256 amountLeftOfTierOne = subscriptionDetails.tierOneQuantities - SubscriptionNft.totalSupply(); uint256 amountToPayTierOne = amountLeftOfTierOne * subscriptionDetails.tierOnePrice; uint256 amountOfTierTwoMinted = _quantity - amountLeftOfTierOne; uint256 amountToPayTierTwo = amountOfTierTwoMinted * subscriptionDetails.tierTwoPrice; require(msg.value == (amountToPayTierOne + amountToPayTierTwo), "INSUFFICIENT MINTING VALUE"); amountPaidPerNFT = subscriptionDetails.tierOnePrice; } } else if (subsStage == SubscriptionStage.TIER_TWO) { if ( _quantity + SubscriptionNft.totalSupply() <= subscriptionDetails.tierTwoQuantities + subscriptionDetails.tierOneQuantities ) { require(msg.value == (subscriptionDetails.tierTwoPrice * _quantity), "INSUFFICIENT MINTING VALUE"); amountPaidPerNFT = subscriptionDetails.tierTwoPrice; } else { uint256 amountLeftOfTierTwo = (subscriptionDetails.tierTwoQuantities + subscriptionDetails.tierOneQuantities) - SubscriptionNft.totalSupply(); uint256 amountToPayTierTwo = amountLeftOfTierTwo * subscriptionDetails.tierTwoPrice; uint256 amountOfTierThreeMinted = _quantity - amountLeftOfTierTwo; uint256 amountToPayTierThree = amountOfTierThreeMinted * subscriptionDetails.tierThreePrice; require(msg.value == (amountToPayTierTwo + amountToPayTierThree), "INSUFFICIENT MINTING VALUE"); amountPaidPerNFT = subscriptionDetails.tierTwoPrice; } } else if (subsStage == SubscriptionStage.TIER_THREE) { if ( _quantity + SubscriptionNft.totalSupply() <= subscriptionDetails.tierThreeQuantities + subscriptionDetails.tierTwoQuantities + subscriptionDetails.tierOneQuantities ) { require(msg.value == (subscriptionDetails.tierThreePrice * _quantity), "INSUFFICIENT MINTING VALUE"); amountPaidPerNFT = subscriptionDetails.tierThreePrice; } else { uint256 amountLeftOfTierThree = (subscriptionDetails.tierTwoQuantities + subscriptionDetails.tierOneQuantities + subscriptionDetails.tierThreeQuantities) - SubscriptionNft.totalSupply(); uint256 amountToPayTierThree = amountLeftOfTierThree * subscriptionDetails.tierThreePrice; uint256 amountOfTierFourMinted = _quantity - amountLeftOfTierThree; uint256 amountToPayTierFour = amountOfTierFourMinted * subscriptionDetails.tierFourPrice; require(msg.value == (amountToPayTierThree + amountToPayTierFour), "INSUFFICIENT MINTING VALUE"); amountPaidPerNFT = subscriptionDetails.tierThreePrice; } } else if (subsStage == SubscriptionStage.TIER_FOUR) { require(msg.value == (subscriptionDetails.tierFourPrice * _quantity), "INSUFFICIENT MINTING VALUE"); amountPaidPerNFT = subscriptionDetails.tierFourPrice; } uint256 _id = SubscriptionNft.currentIndex(); do { subsHolder[_id] = Subscription({ tokenId: _id, owner: _to, price: amountPaidPerNFT, expired: false, renewed: false, renewalExpire: 0 }); unchecked { ++_id; } } while (_id < (_quantity + SubscriptionNft.currentIndex())); SubscriptionNft.mint(_to, _quantity); if ( SubscriptionNft.totalSupply() >= (subscriptionDetails.tierThreeQuantities + subscriptionDetails.tierTwoQuantities + subscriptionDetails.tierOneQuantities) ) { subsStage = SubscriptionStage.TIER_FOUR; } else if ( SubscriptionNft.totalSupply() >= (subscriptionDetails.tierTwoQuantities + subscriptionDetails.tierOneQuantities) ) { subsStage = SubscriptionStage.TIER_THREE; } else if (SubscriptionNft.totalSupply() >= subscriptionDetails.tierOneQuantities) { subsStage = SubscriptionStage.TIER_TWO; } if (referralCodes[msg.sender] == 0) { uint256 referralCode = _generateReferralCode(msg.sender, _quantity); referralCodes[msg.sender] = referralCode; codeToAddress[referralCode] = msg.sender; } if (_referralCode != 0) { require(isCodeValid(_referralCode), "INVALID REFERRAL CODE"); address referee = codeToAddress[_referralCode]; ITreasury treasury = ITreasury(payable(treasuryAddress)); treasury.payReward(referee); } cap3TreasuryFundShare(msg.value); emit SubscriptionMinted(_to, _id, uint16(_quantity)); } function refund(bool _state) public onlyRole(ADMIN_ROLE) { require(genesisStatus == false, "GENESIS MINT STILL OPEN"); string memory boolString = _state == true ? "true" : "false"; require(refundFlag != _state, string(abi.encodePacked("Refund Flag already ", boolString))); refundFlag = _state; } function claimRefund(uint256[] calldata tokenIds) public { INft GenesisNft = INft(genesisContractAddress); ITreasury treasury = ITreasury(treasuryAddress); require(genesisStatus == false, "GENESIS MINT STILL OPEN"); require(refundFlag == true, "REFUND NOT OPEN"); uint256 arrayLength = tokenIds.length; uint256[] memory refundedTokens = new uint256[](arrayLength); for (uint256 i = 0; i < tokenIds.length; i++) { uint256 tokenId = tokenIds[i]; if (GenesisNft.ownerOf(tokenId) == msg.sender) { uint256 refundAmount = genesisPrice; GenesisNft.burn(tokenId); delete (genesisHolder[tokenId]); treasury.payRefund(msg.sender, refundAmount); refundedTokens[i] = tokenId; } } emit Refunded(msg.sender, refundedTokens, genesisPrice); } function isCodeValid(uint256 _code) public view returns (bool) { address referee = codeToAddress[_code]; if (referee == address(0)) { return false; } else { return true; } } function setDistibuteGenesisTokensActive() public onlyRole(ADMIN_ROLE) { require(genesisStatus == false, "GENESIS MINT STILL OPEN"); require(distributeFlag != true, "PHASE ALREADY ACTIVE"); distributeFlag = true; emit DistributionActive(); } function claimDistributedTokens(uint256 _tokenID) public { INft GenesisNft = INft(genesisContractAddress); require(distributeFlag == true, "DISTRIBUTION NOT OPEN"); require(!genesisHolder[_tokenID].claimed, "ALREADY CLAIMED"); require(msg.sender == genesisHolder[_tokenID].owner, "NOT NFT OWNER"); uint256 _id = GenesisNft.currentIndex(); do { genesisHolder[_id] = Genesis({tokenId: _id, owner: msg.sender, claimed: true}); unchecked { ++_id; } } while (_id < (3 + GenesisNft.currentIndex())); genesisHolder[_tokenID].claimed = true; GenesisNft.mint(msg.sender, 3); emit GenesisMinted(msg.sender, _id, 3); } function burnToken(uint256 _tokenId) public { INft GenesisNft = INft(genesisContractAddress); require(GenesisNft.totalSupply() < 500, "TOKENS SOLDOUT"); require(GenesisNft.ownerOf(_tokenId) == msg.sender, "NOT TOKEN HOLDER"); GenesisNft.burn(_tokenId); delete (genesisHolder[_tokenId]); unchecked { toRefund[msg.sender] += 1; } } function transferNft(address _to, uint256 _tokenId) public onlyRole(NFT_ROLE) { INft GenesisNft = INft(genesisContractAddress); INft SubscriptionNft = INft(subsContractAddress); if (msg.sender == genesisContractAddress) { require(_tokenId <= GenesisNft.totalSupply(), "INVALID ID"); Genesis storage token = genesisHolder[_tokenId]; token.owner = _to; emit NftTransfered(_to, _tokenId, true); } else if (msg.sender == subsContractAddress) { require(_tokenId <= SubscriptionNft.totalSupply(), "INVALID ID"); Subscription storage token = subsHolder[_tokenId]; token.owner = _to; emit NftTransfered(_to, _tokenId, false); } } function subscriptionExpiry(uint256 _tokenId) external onlyRole(EXECUTOR_ROLE) { INft SubscriptionNft = INft(subsContractAddress); require(_tokenId <= SubscriptionNft.currentIndex(), "INVALID ID"); Subscription storage token = subsHolder[_tokenId]; require(token.expired == false, "TOKEN ALREADY EXPIRED"); token.expired = true; if (token.renewed == true) { _updateSubscriptionMintBalance(_tokenId); token.renewalExpire = 0; } else token.renewalExpire = block.timestamp + 7 days; emit ExpiredSubscription(token.owner, token.renewalExpire, token.tokenId); } function renewSubscription(uint256 _tokenId) public payable { Subscription storage token = subsHolder[_tokenId]; require(msg.value == (token.price), "INSUFFICIENT AMOUNT SENT"); require(token.renewalExpire > 0, "SUBSCRIPTION NOT EXPIRED"); require(block.timestamp <= token.renewalExpire, "RENEWAL DATE HAS EXPIRED"); require(token.renewed == false, "ALREADY RENEWED"); cap3TreasuryFundShare(msg.value); token.renewed = true; token.expired = false; emit SubscriptionRenewed(msg.sender, token.tokenId); } function updateSubscriptionMintBalance(uint256 _tokenId) public onlyRole(EXECUTOR_ROLE) { _updateSubscriptionMintBalance(_tokenId); } function _updateSubscriptionMintBalance(uint256 _tokenId) internal { Subscription storage token = subsHolder[_tokenId]; require(token.expired == true, "NON EXPIRED TOKEN"); require(block.timestamp >= token.renewalExpire, "RENEWAL DATELINE NOT PASSED"); unchecked { subscriptionSupply++; } emit SubscriptionBalanceUpdated(subscriptionSupply, _tokenId); } function addApprovedProposal( string memory _id, string memory _title, address _author ) public onlyRole(ADMIN_ROLE) { proposals[_id] = Project({id: _id, description: _title, author: _author, funded: false}); ITreasury treasury = ITreasury(payable(treasuryAddress)); uint256 dollarValueOfEth = getLatestPrice(); uint256 _funds = (projectFund * 10**18) / dollarValueOfEth; treasury.setProjectBalance(_author, _funds); emit ProposalApproved(_id, _title, _author, _funds); } function fundProposal(string memory _id, uint256 _amount) public onlyRole(ADMIN_ROLE) { Project memory proposal = proposals[_id]; require(proposal.funded == false, "PROJECT HAS BEEN FUNDED"); ITreasury treasury = ITreasury(treasuryAddress); treasury.withdrawToProjectWallet(proposal.author, _amount); if (treasury.getProjectBalance(proposal.author) == 0) { proposal.funded = true; } emit ProposalFunded(_id, _amount); } function cap3TreasuryFundShare(uint256 _amount) internal { uint256 dollarValueOfEth = getLatestPrice(); uint256 limitInEth = (treasuryLimit * 10**18) / dollarValueOfEth; if (address(treasuryAddress).balance > limitInEth) { uint256 extraBalance = address(treasuryAddress).balance - limitInEth; ITreasury treasury = ITreasury(payable(treasuryAddress)); treasury.payRefund(cap3Wallet, extraBalance); (bool success, ) = cap3Wallet.call{value: _amount}(""); require(success, "MINT:ETH TRANSFER FAILED"); } else if (address(treasuryAddress).balance == limitInEth) { (bool success, ) = cap3Wallet.call{value: _amount}(""); require(success, "MINT:ETH TRANSFER FAILED"); } else if ((address(treasuryAddress).balance + _amount) > limitInEth) { uint256 treasuryAmount = limitInEth - address(treasuryAddress).balance; uint256 cap3amount = _amount - treasuryAmount; (bool success, ) = treasuryAddress.call{value: treasuryAmount}(""); require(success, "MINT:ETH TRANSFER FAILED"); (success, ) = cap3Wallet.call{value: cap3amount}(""); require(success, "MINT:ETH TRANSFER FAILED"); } else if ((address(treasuryAddress).balance + _amount) <= limitInEth) { (bool success, ) = treasuryAddress.call{value: _amount}(""); require(success, "MINT:ETH TRANSFER FAILED"); } } function setTreasuryLimit(uint256 _newLimit) public onlyRole(ADMIN_ROLE) { _setTreasuryLimit(_newLimit); } function switchGenesisMint(bool _state) public onlyRole(ADMIN_ROLE) { string memory boolString = _state == true ? "true" : "false"; require(genesisStatus != _state, string(abi.encodePacked("Genesis Flag already ", boolString))); genesisStatus = _state; emit GenesisMintStateUpdated(_state); } function switchSubscriptionMint(bool _state) public onlyRole(ADMIN_ROLE) { string memory boolString = _state == true ? "true" : "false"; require(subscriptionStatus != _state, string(abi.encodePacked("Subscription Flag already ", boolString))); subscriptionStatus = _state; emit SubscriptionMintStateUpdated(_state); } function switchSubscriptionStage(uint256 _stage) public onlyRole(ADMIN_ROLE) { require(_stage <= 4, "Invalid stage"); require(_stage > 0, "Invalid stage"); if (_stage == 1) { subsStage = SubscriptionStage.TIER_ONE; } else if (_stage == 2) { subsStage = SubscriptionStage.TIER_TWO; } else if (_stage == 3) { subsStage = SubscriptionStage.TIER_THREE; } else { subsStage = SubscriptionStage.TIER_FOUR; } emit SubscriptionStageUpdated(_stage); } function setMerkleRoot(bytes32 _merkleRoot) public onlyRole(ADMIN_ROLE) { merkleRoot = _merkleRoot; emit MerkleRootSet(_merkleRoot); } function setBackendAdress(address _backendAddress) public onlyRole(ADMIN_ROLE) { require(_backendAddress != address(0), "ADDRESS ZERO"); _setupRole(EXECUTOR_ROLE, _backendAddress); emit UpdatedBackendAddress(_backendAddress, "EXECUTOR_ROLE"); } function setGenesisVotingPower(uint256 newVotingPower) public onlyRole(ADMIN_ROLE) { genesisVotingPower = newVotingPower; } function setAdminRole(address _adminAddress) public onlyRole(ADMIN_ROLE) { _setupRole(ADMIN_ROLE, _adminAddress); } function setGenesisPrice(uint256 price) public onlyRole(ADMIN_ROLE) { genesisPrice = price; } function setSubscriptionPrice(uint256 price, uint256 tier) public onlyRole(ADMIN_ROLE) { if (tier == 1) { subscriptionDetails.tierOnePrice = price; } else if (tier == 2) { subscriptionDetails.tierTwoPrice = price; } else if (tier == 3) { subscriptionDetails.tierThreePrice = price; } else if (tier == 4) { subscriptionDetails.tierFourPrice = price; } emit SubscriptionPriceUpdated(tier, price); } function setSubscriptionQuantities(uint256 quantity, uint256 tier) public onlyRole(ADMIN_ROLE) { if (tier == 1) { subscriptionDetails.tierOneQuantities = quantity; } else if (tier == 2) { subscriptionDetails.tierTwoQuantities = quantity; } else if (tier == 3) { subscriptionDetails.tierThreeQuantities = quantity; } else if (tier == 4) { subscriptionDetails.tierFourQuantities = quantity; } emit SubscriptionQuantitesUpdated(tier, quantity); } function setProjectFundDollars(uint256 price) public onlyRole(ADMIN_ROLE) { projectFund = price; } function setSubscriptionVotingPower(uint256 newVotingPower) public onlyRole(ADMIN_ROLE) { subscriptionVotingPower = newVotingPower; } function setCap3Wallet(address _wallet) public onlyRole(ADMIN_ROLE) { cap3Wallet = _wallet; } function setGenesisSupply(uint256 _newGenesisSupply) public onlyRole(ADMIN_ROLE) { INft GenesisNft = INft(genesisContractAddress); require(_newGenesisSupply >= GenesisNft.totalSupply()); genesisSupply = _newGenesisSupply; } function setGenesisMintPublic() public onlyRole(ADMIN_ROLE) { merkleRoot = ZEROSTATE; emit MerkleRootSet(merkleRoot); } function setSubscriptionSupply(uint256 _newSubscriptionSupply) public onlyRole(ADMIN_ROLE) { INft SubscriptionNft = INft(subsContractAddress); require(_newSubscriptionSupply >= SubscriptionNft.totalSupply()); subscriptionSupply = _newSubscriptionSupply; } /*------ View Functions -------*/ function verifyMerkleProof(address _user, bytes32[] calldata _merkleProof) public view returns (bool) { return MerkleProof.verify(_merkleProof, merkleRoot, keccak256(abi.encodePacked(_user))); } function getGenesisSupply() public view returns (uint256) { return genesisSupply; } function getSubscriptionSupply() public view returns (uint256) { return subscriptionSupply; } function getProposal(string memory _tokenId) public view returns (Project memory) { return proposals[_tokenId]; } function getGenesisHolder(uint256 _tokenId) public view returns (Genesis memory) { return genesisHolder[_tokenId]; } function getSubscriptionHolder(uint256 _tokenId) public view returns (Subscription memory) { return subsHolder[_tokenId]; } function getTreasuryLimit() public view returns (uint256) { return treasuryLimit; } function getCap3WalletAddress() public view returns (address) { return cap3Wallet; } function subscriptionHasExpired(uint256 _tokenId) public view returns (bool) { Subscription storage token = subsHolder[_tokenId]; return token.expired; } function userVotingPower(address _holder) public view returns (uint256) { INft GenesisNft = INft(genesisContractAddress); uint256 votingPower = 0; votingPower += getValidSubscriptions(_holder) * subscriptionVotingPower; votingPower += GenesisNft.balanceOf(_holder) * genesisVotingPower; return votingPower; } function getValidSubscriptions(address _holder) public view returns (uint256) { INft SubscriptionNft = INft(subsContractAddress); uint256 subscriptionsValid = 0; uint256 subscriptionsIndex = 1; uint256 subscriptionsChecked = 0; while (subscriptionsChecked < SubscriptionNft.balanceOf(_holder)) { if (SubscriptionNft.ownerOf(subscriptionsIndex) == _holder) { if (!subscriptionHasExpired(subscriptionsIndex)) { subscriptionsValid++; } subscriptionsChecked++; } subscriptionsIndex++; } return subscriptionsValid; } function getLatestPrice() public view returns (uint256) { ( , /*uint80 roundID*/ int256 price, /*uint startedAt*/ /*uint timeStamp*/ /*uint80 answeredInRound*/ , , ) = priceFeed.latestRoundData(); return uint256(price / 10**8); } function getReferralCode(address _referee) public view returns (uint256) { return referralCodes[_referee]; } /*------ Internal Functions -------*/ function _setTreasuryLimit(uint256 _newLimit) internal { uint256 oldLimit = treasuryLimit; treasuryLimit = _newLimit; emit TreasuryLimitSet(_newLimit, oldLimit); } function _generateReferralCode(address _sender, uint256 _numberOfTokensMinted) internal view returns (uint256) { uint256 randomHash = uint256(keccak256(abi.encode(_sender, _numberOfTokensMinted, block.timestamp))); uint256 code = randomHash % 10000000; return code; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (access/AccessControl.sol) pragma solidity ^0.8.0; import "./IAccessControl.sol"; import "../utils/Context.sol"; import "../utils/Strings.sol"; import "../utils/introspection/ERC165.sol"; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view virtual override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `_msgSender()` is missing `role`. * Overriding this function changes the behavior of the {onlyRole} modifier. * * Format of the revert message is described in {_checkRole}. * * _Available since v4.6._ */ function _checkRole(bytes32 role) internal view virtual { _checkRole(role, _msgSender()); } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ */ function _checkRole(bytes32 role, address account) internal view virtual { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", Strings.toHexString(uint160(account), 20), " is missing role ", Strings.toHexString(uint256(role), 32) ) ) ); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been revoked `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== * * NOTE: This function is deprecated in favor of {_grantRole}. */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Grants `role` to `account`. * * Internal function without access restriction. */ function _grantRole(bytes32 role, address account) internal virtual { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } /** * @dev Revokes `role` from `account`. * * Internal function without access restriction. */ function _revokeRole(bytes32 role, address account) internal virtual { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Trees proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the merkle tree could be reinterpreted as a leaf value. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = _efficientHash(computedHash, proofElement); } else { // Hash(current element of the proof + current computed hash) computedHash = _efficientHash(proofElement, computedHash); } } return computedHash; } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.11; interface ITreasury { function withdrawToProjectWallet(address projectWallet, uint256 amount) external; function shutdown(bool _isShutdown) external; function viewFundsInTreasury() external view returns (uint256); function payRefund(address _to, uint256 _amount) external; function setProjectBalance(address _projectWallet, uint256 _balance) external; function getProjectBalance(address _projectWallet) external view returns (uint256); function moveFundsOutOfTreasury() external; function setAdminRole(address _adminAddress) external; function payReward(address _to) external; }
// SPDX-License-Identifier: MIT pragma solidity 0.8.11; interface IDynamic { function renewSubscription(uint256 tokenid) external payable; function mintGenesis( address to, bytes32[] calldata _merkleProof, uint256 amount ) external payable; function mintGiftGenesis(address _to) external; function mintSubscription( address to, uint256 amount, uint256 code ) external payable; function setDistibuteGenesisTokensActive() external; function claimDistributedTokens(uint256 tokenId) external; function subscriptionExpiry(uint256 tokenId) external; function updateSubscriptionMintBalance(uint256 tokenId) external; function addApprovedProposal( string memory id, string memory title, address author ) external; function transferNft(address _to, uint256 _tokenId) external; function fundProposal(string memory id, uint256 amount) external; function getReferralCode(address referree) external view returns (uint256); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.11; import "erc721a/contracts/IERC721A.sol"; interface INft is IERC721A { function mint(address to, uint256 amount) external; function burn(uint256 tokenId) external; function currentIndex() external returns (uint256); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface AggregatorV3Interface { function decimals() external view returns (uint8); function description() external view returns (string memory); function version() external view returns (uint256); // getRoundData and latestRoundData should both raise "No data present" // if they do not have data to report, instead of returning unset values // which could be misinterpreted as actual reported values. function getRoundData(uint80 _roundId) external view returns ( uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound ); function latestRoundData() external view returns ( uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound ); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol) pragma solidity ^0.8.0; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT // ERC721A Contracts v4.2.2 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721A. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * The caller cannot approve to their own address. */ error ApproveToCaller(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the * ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); /** * The `quantity` minted with ERC2309 exceeds the safety limit. */ error MintERC2309QuantityExceedsLimit(); /** * The `extraData` cannot be set on an unintialized ownership slot. */ error OwnershipNotInitializedForExtraData(); // ============================================================= // STRUCTS // ============================================================= struct TokenOwnership { // The address of the owner. address addr; // Stores the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}. uint24 extraData; } // ============================================================= // TOKEN COUNTERS // ============================================================= /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() external view returns (uint256); // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); // ============================================================= // IERC721 // ============================================================= /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables * (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, * checking first that contract recipients are aware of the ERC721 protocol * to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move * this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} * whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the * zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) external view returns (bool); // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); // ============================================================= // IERC2309 // ============================================================= /** * @dev Emitted when tokens in `fromTokenId` to `toTokenId` * (inclusive) is transferred from `from` to `to`, as defined in the * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard. * * See {_mintERC2309} for more details. */ event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to); }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_genesis","type":"address"},{"internalType":"address","name":"_subscription","type":"address"},{"internalType":"address","name":"_treasury","type":"address"},{"internalType":"address","name":"_cap3Wallet","type":"address"},{"internalType":"address","name":"_priceFeedAggregator","type":"address"},{"internalType":"address[]","name":"_admins","type":"address[]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[],"name":"DistributionActive","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"holder","type":"address"},{"indexed":false,"internalType":"uint256","name":"renewalExpire","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ExpiredSubscription","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"state","type":"bool"}],"name":"GenesisMintStateUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint16","name":"quantity","type":"uint16"}],"name":"GenesisMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"MerkleRootSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isGenesis","type":"bool"}],"name":"NftTransfered","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"id","type":"string"},{"indexed":false,"internalType":"string","name":"_title","type":"string"},{"indexed":false,"internalType":"address","name":"author","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ProposalApproved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"id","type":"string"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ProposalFunded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Refunded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"TokenSupply","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"SubscriptionBalanceUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"state","type":"bool"}],"name":"SubscriptionMintStateUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint16","name":"quantity","type":"uint16"}],"name":"SubscriptionMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"stage","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"SubscriptionPriceUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"stage","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newQuantity","type":"uint256"}],"name":"SubscriptionQuantitesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"holder","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"SubscriptionRenewed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newStage","type":"uint256"}],"name":"SubscriptionStageUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newLimit","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oldLimit","type":"uint256"}],"name":"TreasuryLimitSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"backendAddress","type":"address"},{"indexed":false,"internalType":"string","name":"Role","type":"string"}],"name":"UpdatedBackendAddress","type":"event"},{"inputs":[],"name":"ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EXECUTOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NFT_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ZEROSTATE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_id","type":"string"},{"internalType":"string","name":"_title","type":"string"},{"internalType":"address","name":"_author","type":"address"}],"name":"addApprovedProposal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"burnToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenID","type":"uint256"}],"name":"claimDistributedTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"claimRefund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"codeToAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"distributeFlag","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_id","type":"string"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"fundProposal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"genesisContractAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"genesisHolder","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"bool","name":"claimed","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"genesisPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"genesisStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"genesisSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCap3WalletAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getGenesisHolder","outputs":[{"components":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"bool","name":"claimed","type":"bool"}],"internalType":"struct DynamicNft.Genesis","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getGenesisSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLatestPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_tokenId","type":"string"}],"name":"getProposal","outputs":[{"components":[{"internalType":"string","name":"id","type":"string"},{"internalType":"string","name":"description","type":"string"},{"internalType":"address","name":"author","type":"address"},{"internalType":"bool","name":"funded","type":"bool"}],"internalType":"struct DynamicNft.Project","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_referee","type":"address"}],"name":"getReferralCode","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getSubscriptionHolder","outputs":[{"components":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"renewalExpire","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"bool","name":"expired","type":"bool"},{"internalType":"bool","name":"renewed","type":"bool"}],"internalType":"struct DynamicNft.Subscription","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSubscriptionSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTreasuryLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_holder","type":"address"}],"name":"getValidSubscriptions","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_code","type":"uint256"}],"name":"isCodeValid","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"},{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"mintGenesis","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"mintGiftGenesis","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_quantity","type":"uint256"},{"internalType":"uint256","name":"_referralCode","type":"uint256"}],"name":"mintSubscription","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"projectFund","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"referralCodes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"refund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"refundFlag","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"renewSubscription","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_adminAddress","type":"address"}],"name":"setAdminRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_backendAddress","type":"address"}],"name":"setBackendAdress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"}],"name":"setCap3Wallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setDistibuteGenesisTokensActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setGenesisMintPublic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setGenesisPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newGenesisSupply","type":"uint256"}],"name":"setGenesisSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newVotingPower","type":"uint256"}],"name":"setGenesisVotingPower","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setProjectFundDollars","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"tier","type":"uint256"}],"name":"setSubscriptionPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"uint256","name":"tier","type":"uint256"}],"name":"setSubscriptionQuantities","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newSubscriptionSupply","type":"uint256"}],"name":"setSubscriptionSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newVotingPower","type":"uint256"}],"name":"setSubscriptionVotingPower","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newLimit","type":"uint256"}],"name":"setTreasuryLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"subsContractAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"subsHolder","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"renewalExpire","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"bool","name":"expired","type":"bool"},{"internalType":"bool","name":"renewed","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"subsStage","outputs":[{"internalType":"enum DynamicNft.SubscriptionStage","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"subscriptionDetails","outputs":[{"internalType":"uint256","name":"tierOnePrice","type":"uint256"},{"internalType":"uint256","name":"tierTwoPrice","type":"uint256"},{"internalType":"uint256","name":"tierThreePrice","type":"uint256"},{"internalType":"uint256","name":"tierFourPrice","type":"uint256"},{"internalType":"uint256","name":"tierOneQuantities","type":"uint256"},{"internalType":"uint256","name":"tierTwoQuantities","type":"uint256"},{"internalType":"uint256","name":"tierThreeQuantities","type":"uint256"},{"internalType":"uint256","name":"tierFourQuantities","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"subscriptionExpiry","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"subscriptionHasExpired","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"subscriptionStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"subscriptionSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"switchGenesisMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"switchSubscriptionMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stage","type":"uint256"}],"name":"switchSubscriptionStage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"toRefund","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"transferNft","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasuryAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"updateSubscriptionMintBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_holder","type":"address"}],"name":"userVotingPower","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"verifyMerkleProof","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60a06040527fa0fd9888b738d87f115429a3520fdbd602fbe89c095c2a6f2f1f5af661dfc43d60001b600155671bc16d674ec8000060055560016006556107d0600755611b5860085560026009556001600a55620f4240600b55620186a0600c553480156200006d57600080fd5b5060405162006287380380620062878339810160408190526200009091620004f0565b6001600160a01b038616620000db5760405162461bcd60e51b815260206004820152600c60248201526b41444452455353205a45524f60a01b60448201526064015b60405180910390fd5b6001600160a01b038516620001225760405162461bcd60e51b815260206004820152600c60248201526b41444452455353205a45524f60a01b6044820152606401620000d2565b6001600160a01b038416620001695760405162461bcd60e51b815260206004820152600c60248201526b41444452455353205a45524f60a01b6044820152606401620000d2565b6001600160a01b038316620001b05760405162461bcd60e51b815260206004820152600c60248201526b41444452455353205a45524f60a01b6044820152606401620000d2565b6001600160a01b038216620001f75760405162461bcd60e51b815260206004820152600c60248201526b041444452455353205a4552360a41b6044820152606401620000d2565b600480546001600160a01b038088166001600160a01b0319928316179092556003805489841690831617905585821660805260028054868416908316179055601d805492851692909116919091179055620002626000805160206200626783398151915280620003c2565b6200029d7fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6360008051602062006267833981519152620003c2565b620002b860008051602062006267833981519152336200040d565b620002f66000805160206200626783398151915282600081518110620002e257620002e262000621565b60200260200101516200040d60201b60201c565b620003206000805160206200626783398151915282600181518110620002e257620002e262000621565b6200033b60008051602062006267833981519152306200040d565b6200035660008051602062006247833981519152876200040d565b6200037160008051602062006247833981519152866200040d565b50506702c68af0bb140000600e55505067030d98d59a960000600f555050670354a6ba7a18000060105567039bb49f599a00006011556106d660128190556013819055601481905560155562000637565b600082815260208190526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6200041982826200041d565b5050565b6000828152602081815260408083206001600160a01b038516845290915290205460ff1662000419576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055620004793390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b80516001600160a01b0381168114620004d557600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60008060008060008060c087890312156200050a57600080fd5b6200051587620004bd565b9550602062000526818901620004bd565b95506200053660408901620004bd565b94506200054660608901620004bd565b93506200055660808901620004bd565b60a08901519093506001600160401b03808211156200057457600080fd5b818a0191508a601f8301126200058957600080fd5b8151818111156200059e576200059e620004da565b8060051b604051601f19603f83011681018181108582111715620005c657620005c6620004da565b60405291825284820192508381018501918d831115620005e557600080fd5b938501935b828510156200060e57620005fe85620004bd565b84529385019392850192620005ea565b8096505050505050509295509295509295565b634e487b7160e01b600052603260045260246000fd5b608051615b99620006ae60003960008181610bf00152818161116901528181611476015281816142ba0152818161436c0152818161494e0152818161498d015281816149df01528181614abe01528181614b7501528181614bb001528181614beb01528181614cfe0152614d2d0152615b996000f3fe60806040526004361061043c5760003560e01c8063800114a811610234578063c6a087701161012e578063d71bb37b116100b6578063f54a6f831161007a578063f54a6f8314610f2a578063f5602f6414610f4a578063f684f33c14610fee578063f7646a5f14611022578063fcf3763d1461104057600080fd5b8063d71bb37b14610eaf578063d7e6040c14610ec2578063e57d925a14610ee2578063eb3c267b14610f02578063f1f1000014610f1557600080fd5b8063cf563343116100fd578063cf56334314610e21578063cfba18f614610e40578063d2b7d43c14610e55578063d3d7837014610e75578063d547741f14610e8f57600080fd5b8063c6a0877014610c12578063ccc7139c14610d24578063ccf3126214610d66578063cefa7b6d14610e0157600080fd5b806392c40344116101bc578063ab147e4b11610180578063ab147e4b14610b10578063bdaa41ae14610b7e578063c56f19a514610b9e578063c5967b8f14610bbe578063c5f956af14610bde57600080fd5b806392c4034414610a785780639534dd3e14610aae5780639eb1f05414610adb578063a0f3b87614610af0578063a217fddf14610adb57600080fd5b8063887e7acf11610203578063887e7acf146109ee57806388949d9314610a0e5780638980ecc914610a235780638e15f47314610a4357806391d1485414610a5857600080fd5b8063800114a814610974578063819b86331461099457806382737c97146109b457806382b8fbd6146109ce57600080fd5b80634c92c5561161034557806360eb674b116102cd57806375b238fc1161029157806375b238fc146108c35780637a700bce146108e55780637b47ec1a146108fa5780637cb647591461091a5780637f56a53c1461093a57600080fd5b806360eb674b146107d257806361f36462146107f257806369acaa5e146108125780636d936a9714610880578063728cce7c146108ad57600080fd5b80635c69cbac116103145780635c69cbac1461071c5780635c8f54df1461073c5780635e13a1341461078a5780635fce793e1461079d57806360cc1121146107b257600080fd5b80634c92c556146106a657806355360f19146106c6578063556c1a71146106e657806358f94491146106fc57600080fd5b80632f2ff15d116103c85780633a55308d116103975780633a55308d1461061b5780633f1e762a146106315780634528c9b0146106515780634adc7cfd146106705780634bbf179b1461069057600080fd5b80632f2ff15d1461059b57806336568abe146105bb57806336921ec4146105db57806336b1b6a4146105fb57600080fd5b80631b1037cc1161040f5780631b1037cc146104e8578063248a9ca31461050857806325d3a09d146105385780632a20044d146105655780632eb4a7ab1461058557600080fd5b806301ffc9a714610441578063033670ec1461047657806307bd026514610498578063152f7361146104c8575b600080fd5b34801561044d57600080fd5b5061046161045c366004615103565b611060565b60405190151581526020015b60405180910390f35b34801561048257600080fd5b506104966104913660046151e5565b611097565b005b3480156104a457600080fd5b506104ba600080516020615b2483398151915281565b60405190815260200161046d565b3480156104d457600080fd5b506104966104e336600461525d565b611263565b3480156104f457600080fd5b506104966105033660046152a2565b611590565b34801561051457600080fd5b506104ba6105233660046152bf565b60009081526020819052604090206001015490565b34801561054457600080fd5b506105586105533660046152d8565b61166d565b60405161046d9190615365565b34801561057157600080fd5b506104966105803660046152a2565b611809565b34801561059157600080fd5b506104ba60015481565b3480156105a757600080fd5b506104966105b63660046153cc565b611844565b3480156105c757600080fd5b506104966105d63660046153cc565b61186e565b3480156105e757600080fd5b506104966105f63660046152bf565b6118ec565b34801561060757600080fd5b506104ba6106163660046152a2565b611a30565b34801561062757600080fd5b506104ba60085481565b34801561063d57600080fd5b5061049661064c3660046152bf565b611af0565b34801561065d57600080fd5b50600d5461046190610100900460ff1681565b34801561067c57600080fd5b5061049661068b3660046152a2565b611b0e565b34801561069c57600080fd5b506104ba60075481565b3480156106b257600080fd5b506104966106c13660046152bf565b611b3e565b3480156106d257600080fd5b506104ba6106e13660046152a2565b611e4c565b3480156106f257600080fd5b506104ba600c5481565b34801561070857600080fd5b506104966107173660046152a2565b611fa6565b34801561072857600080fd5b506104966107373660046152bf565b6122ab565b34801561074857600080fd5b506107726107573660046152bf565b601b602052600090815260409020546001600160a01b031681565b6040516001600160a01b03909116815260200161046d565b610496610798366004615448565b612345565b3480156107a957600080fd5b506007546104ba565b3480156107be57600080fd5b506104966107cd3660046154a4565b612817565b3480156107de57600080fd5b506104616107ed3660046154d0565b612a60565b3480156107fe57600080fd5b5061049661080d3660046152bf565b612ad8565b34801561081e57600080fd5b5061085b61082d3660046152bf565b601860205260009081526040902080546001909101546001600160a01b03811690600160a01b900460ff1683565b604080519384526001600160a01b03909216602084015215159082015260600161046d565b34801561088c57600080fd5b50600d546108a09062010000900460ff1681565b60405161046d919061553b565b3480156108b957600080fd5b506104ba60055481565b3480156108cf57600080fd5b506104ba600080516020615b4483398151915281565b3480156108f157600080fd5b506008546104ba565b34801561090657600080fd5b506104966109153660046152bf565b612af6565b34801561092657600080fd5b506104966109353660046152bf565b612d01565b34801561094657600080fd5b506104616109553660046152bf565b600090815260196020526040902060030154600160a01b900460ff1690565b34801561098057600080fd5b50600454610772906001600160a01b031681565b3480156109a057600080fd5b506104966109af3660046152bf565b612d4e565b3480156109c057600080fd5b50600d546104619060ff1681565b3480156109da57600080fd5b506104966109e9366004615563565b612d6c565b3480156109fa57600080fd5b50610496610a093660046152bf565b612e62565b348015610a1a57600080fd5b50610496612e83565b348015610a2f57600080fd5b50610496610a3e3660046152bf565b612ed8565b348015610a4f57600080fd5b506104ba612ef6565b348015610a6457600080fd5b50610461610a733660046153cc565b612f8c565b348015610a8457600080fd5b506104ba610a933660046152a2565b6001600160a01b03166000908152601a602052604090205490565b348015610aba57600080fd5b506104ba610ac93660046152a2565b601a6020526000908152604090205481565b348015610ae757600080fd5b506104ba600081565b348015610afc57600080fd5b50610496610b0b3660046152bf565b612fb5565b348015610b1c57600080fd5b50600e54600f54601054601154601254601354601454601554610b43979695949392919088565b604080519889526020890197909752958701949094526060860192909252608085015260a084015260c083015260e08201526101000161046d565b348015610b8a57600080fd5b50610496610b99366004615563565b613163565b348015610baa57600080fd5b50610496610bb93660046152bf565b613267565b348015610bca57600080fd5b50610461610bd93660046152bf565b6132ff565b348015610bea57600080fd5b506107727f000000000000000000000000000000000000000000000000000000000000000081565b348015610c1e57600080fd5b50610cd0610c2d3660046152bf565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915250600090815260196020908152604091829020825160c081018452815481526001820154928101929092526002810154928201929092526003909101546001600160a01b038116606083015260ff600160a01b8204811615156080840152600160a81b90910416151560a082015290565b60405161046d91908151815260208083015190820152604080830151908201526060808301516001600160a01b03169082015260808083015115159082015260a09182015115159181019190915260c00190565b348015610d3057600080fd5b50610d54610d3f3660046152a2565b601c6020526000908152604090205460ff1681565b60405160ff909116815260200161046d565b348015610d7257600080fd5b50610dc7610d813660046152bf565b6019602052600090815260409020805460018201546002830154600390930154919290916001600160a01b0381169060ff600160a01b8204811691600160a81b90041686565b604080519687526020870195909552938501929092526001600160a01b0316606084015215156080830152151560a082015260c00161046d565b348015610e0d57600080fd5b50600354610772906001600160a01b031681565b348015610e2d57600080fd5b5060165461046190610100900460ff1681565b348015610e4c57600080fd5b50610496613334565b348015610e6157600080fd5b50610496610e703660046152bf565b6133f7565b348015610e8157600080fd5b506016546104619060ff1681565b348015610e9b57600080fd5b50610496610eaa3660046153cc565b613418565b610496610ebd3660046152bf565b61343d565b348015610ece57600080fd5b50610496610edd366004615585565b6135ec565b348015610eee57600080fd5b50610496610efd366004615563565b613682565b610496610f103660046155a7565b61377d565b348015610f2157600080fd5b50600b546104ba565b348015610f3657600080fd5b50610496610f453660046155dc565b614358565b348015610f5657600080fd5b50610fc1610f653660046152bf565b60408051606080820183526000808352602080840182905292840181905293845260188252928290208251938401835280548452600101546001600160a01b03811691840191909152600160a01b900460ff1615159082015290565b60408051825181526020808401516001600160a01b0316908201529181015115159082015260600161046d565b348015610ffa57600080fd5b506104ba7f8736816fdbcc15d6cc3f6dcf60e42b0ef33eb02281d312c807a38b4ad09190c081565b34801561102e57600080fd5b506002546001600160a01b0316610772565b34801561104c57600080fd5b5061049661105b366004615585565b61463d565b60006001600160e01b03198216637965db0b60e01b148061109157506301ffc9a760e01b6001600160e01b03198316145b92915050565b600080516020615b448339815191526110af816146d3565b60408051608081018252858152602081018590526001600160a01b038416818301526000606082015290516017906110e890879061561e565b9081526020016040518091039020600082015181600001908051906020019061111292919061506a565b50602082810151805161112b926001850192019061506a565b506040820151600290910180546060909301511515600160a01b026001600160a81b03199093166001600160a01b03909216919091179190911790557f00000000000000000000000000000000000000000000000000000000000000006000611192612ef6565b9050600081600c54670de0b6b3a76400006111ad9190615650565b6111b79190615685565b60405163d28ace9960e01b81526001600160a01b038781166004830152602482018390529192509084169063d28ace9990604401600060405180830381600087803b15801561120557600080fd5b505af1158015611219573d6000803e3d6000fd5b505050507fe2094cfca7face17092ea395948297bb659dc04721977074a67b8439ef4bbc21878787846040516112529493929190615699565b60405180910390a150505050505050565b600080516020615b4483398151915261127b816146d3565b600060178460405161128d919061561e565b90815260200160405180910390206040518060800160405290816000820180546112b6906156db565b80601f01602080910402602001604051908101604052809291908181526020018280546112e2906156db565b801561132f5780601f106113045761010080835404028352916020019161132f565b820191906000526020600020905b81548152906001019060200180831161131257829003601f168201915b50505050508152602001600182018054611348906156db565b80601f0160208091040260200160405190810160405280929190818152602001828054611374906156db565b80156113c15780601f10611396576101008083540402835291602001916113c1565b820191906000526020600020905b8154815290600101906020018083116113a457829003601f168201915b5050509183525050600291909101546001600160a01b0381166020830152600160a01b900460ff16151560409091015260608101519091501561144b5760405162461bcd60e51b815260206004820152601760248201527f50524f4a45435420484153204245454e2046554e44454400000000000000000060448201526064015b60405180910390fd5b604081810151905163232a550160e21b81526001600160a01b039182166004820152602481018590527f000000000000000000000000000000000000000000000000000000000000000091821690638ca9540490604401600060405180830381600087803b1580156114bc57600080fd5b505af11580156114d0573d6000803e3d6000fd5b5050505060408281015190516302856c5760e41b81526001600160a01b03918216600482015290821690632856c57090602401602060405180830381865afa158015611520573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115449190615710565b61155057600160608301525b7fa4f7ac52f2d7303b14db7a6f86c3a581111fe0fb2e7a9fdc12fb47e69ac458468585604051611581929190615729565b60405180910390a15050505050565b600080516020615b448339815191526115a8816146d3565b6001600160a01b0382166115ed5760405162461bcd60e51b815260206004820152600c60248201526b41444452455353205a45524f60a01b6044820152606401611442565b611605600080516020615b24833981519152836146e0565b604080516001600160a01b038416815260208101829052600d918101919091526c4558454355544f525f524f4c4560981b60608201527fd063779f8be6b49dbff1347e87a6be2e91ce10d6584838bd5bfc09cb780fd4ec906080015b60405180910390a15050565b60408051608081018252606080825260208201819052600082840181905290820152905160179061169f90849061561e565b90815260200160405180910390206040518060800160405290816000820180546116c8906156db565b80601f01602080910402602001604051908101604052809291908181526020018280546116f4906156db565b80156117415780601f1061171657610100808354040283529160200191611741565b820191906000526020600020905b81548152906001019060200180831161172457829003601f168201915b5050505050815260200160018201805461175a906156db565b80601f0160208091040260200160405190810160405280929190818152602001828054611786906156db565b80156117d35780601f106117a8576101008083540402835291602001916117d3565b820191906000526020600020905b8154815290600101906020018083116117b657829003601f168201915b5050509183525050600291909101546001600160a01b0381166020830152600160a01b900460ff16151560409091015292915050565b600080516020615b44833981519152611821816146d3565b50600280546001600160a01b0319166001600160a01b0392909216919091179055565b60008281526020819052604090206001015461185f816146d3565b61186983836146e6565b505050565b6001600160a01b03811633146118de5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401611442565b6118e8828261476a565b5050565b600080516020615b44833981519152611904816146d3565b60048211156119455760405162461bcd60e51b815260206004820152600d60248201526c496e76616c696420737461676560981b6044820152606401611442565b600082116119855760405162461bcd60e51b815260206004820152600d60248201526c496e76616c696420737461676560981b6044820152606401611442565b81600114156119ac57600d80546000919062ff0000191662010000835b0217905550611a00565b81600214156119cd57600d80546001919062ff0000191662010000836119a2565b81600314156119ee57600d80546002919062ff0000191662010000836119a2565b600d805462ff00001916620300001790555b6040518281527f3b5b51b70427504df5cb536d263f0e41793d8b99947a8fe09fa665dbd8c4b8fa90602001611661565b600354600a546000916001600160a01b0316908290611a4e85611e4c565b611a589190615650565b611a62908261574b565b6009546040516370a0823160e01b81526001600160a01b03878116600483015292935090918416906370a0823190602401602060405180830381865afa158015611ab0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ad49190615710565b611ade9190615650565b611ae8908261574b565b949350505050565b600080516020615b44833981519152611b08816146d3565b50600c55565b600080516020615b44833981519152611b26816146d3565b6118e8600080516020615b44833981519152836146e0565b6003546016546001600160a01b039091169060ff161515600114611b9c5760405162461bcd60e51b81526020600482015260156024820152742224a9aa2924a12aaa24a7a7102727aa1027a822a760591b6044820152606401611442565b600082815260186020526040902060010154600160a01b900460ff1615611bf75760405162461bcd60e51b815260206004820152600f60248201526e105314915051164810d31052535151608a1b6044820152606401611442565b6000828152601860205260409020600101546001600160a01b03163314611c505760405162461bcd60e51b815260206004820152600d60248201526c2727aa1027232a1027aba722a960991b6044820152606401611442565b6000816001600160a01b03166326987b606040518163ffffffff1660e01b81526004016020604051808303816000875af1158015611c92573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cb69190615710565b90505b604080516060810182528281523360208083019182526001838501818152600087815260188452868120955186559351948201805491511515600160a01b026001600160a81b03199092166001600160a01b03968716179190911790558451630134c3db60e51b81529451950194928616936326987b6093600480830194919283900301908290875af1158015611d54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d789190615710565b611d8390600361574b565b8110611cb95760008381526018602052604090819020600101805460ff60a01b1916600160a01b179055516340c10f1960e01b8152336004820152600360248201526001600160a01b038316906340c10f1990604401600060405180830381600087803b158015611df357600080fd5b505af1158015611e07573d6000803e3d6000fd5b505050507fc52c24f72d8c313ac367a81b5c004f343f024b4620f5d0d737e44e1dbfce570a33826003604051611e3f93929190615763565b60405180910390a1505050565b6004546000906001600160a01b0316816001815b6040516370a0823160e01b81526001600160a01b0387811660048301528516906370a0823190602401602060405180830381865afa158015611ea6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611eca9190615710565b811015611f9c576040516331a9108f60e11b8152600481018390526001600160a01b038088169190861690636352211e90602401602060405180830381865afa158015611f1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f3f9190615788565b6001600160a01b03161415611f8a57600082815260196020526040902060030154600160a01b900460ff16611f7c5782611f78816157a5565b9350505b80611f86816157a5565b9150505b81611f94816157a5565b925050611e60565b5090949350505050565b600080516020615b44833981519152611fbe816146d3565b600354600d546001600160a01b039091169060ff1661201f5760405162461bcd60e51b815260206004820152601f60248201527f47454e45534953204d494e542043555252454e544c5920494e414354495645006044820152606401611442565b6101f4816001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612060573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120849190615710565b106120cd5760405162461bcd60e51b8152602060048201526019602482015278494e535546494349454e542047454e455349532053544f434b60381b6044820152606401611442565b6000816001600160a01b03166326987b606040518163ffffffff1660e01b81526004016020604051808303816000875af115801561210f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121339190615710565b604080516060810182528281526001600160a01b0387811660208084018281526000858701818152888252601890935286902094518555516001948501805492511515600160a01b026001600160a81b03199093169185169190911791909117905592516340c10f1960e01b815260048101939093526024830191909152919250908316906340c10f1990604401600060405180830381600087803b1580156121db57600080fd5b505af11580156121ef573d6000803e3d6000fd5b50505050816001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612231573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122559190615710565b6101f4141561226957600d805460ff191690555b7fc52c24f72d8c313ac367a81b5c004f343f024b4620f5d0d737e44e1dbfce570a8482600160405161229d93929190615763565b60405180910390a150505050565b600080516020615b448339815191526122c3816146d3565b600354604080516318160ddd60e01b815290516001600160a01b039092169182916318160ddd9160048083019260209291908290030181865afa15801561230e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123329190615710565b83101561233e57600080fd5b5050600755565b6003546007546001600160a01b039091169061236390600490615685565b82826001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156123a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123c69190615710565b6123d0919061574b565b11156124155760405162461bcd60e51b81526020600482015260146024820152731350560814555053951255164814915050d2115160621b6044820152606401611442565b816005546124239190615650565b3410156124425760405162461bcd60e51b8152600401611442906157c0565b600d5460ff166124945760405162461bcd60e51b815260206004820152601f60248201527f47454e45534953204d494e542043555252454e544c5920494e414354495645006044820152606401611442565b6101f4816001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124f99190615710565b106125425760405162461bcd60e51b8152602060048201526019602482015278494e535546494349454e542047454e455349532053544f434b60381b6044820152606401611442565b6001541561259857612555858585612a60565b6125985760405162461bcd60e51b815260206004820152601460248201527324a72b20a624a21026a2a925a62290282927a7a360611b6044820152606401611442565b6000816001600160a01b03166326987b606040518163ffffffff1660e01b81526004016020604051808303816000875af11580156125da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125fe9190615710565b9050805b61260c828561574b565b81101561268a57604080516060810182528381526001600160a01b03808a16602080840191825260008486018181528782526018909252949094209251835551600192909201805493511515600160a01b026001600160a81b0319909416929091169190911791909117905580612682816157a5565b915050612602565b506040516340c10f1960e01b81526001600160a01b038781166004830152602482018590528316906340c10f1990604401600060405180830381600087803b1580156126d557600080fd5b505af11580156126e9573d6000803e3d6000fd5b5050600254604051600093506001600160a01b03909116915034908381818185875af1925050503d806000811461273c576040519150601f19603f3d011682016040523d82523d6000602084013e612741565b606091505b50509050806127625760405162461bcd60e51b8152600401611442906157f7565b60046007546127719190615685565b836001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156127af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127d39190615710565b14156127e457600d805460ff191690555b7fc52c24f72d8c313ac367a81b5c004f343f024b4620f5d0d737e44e1dbfce570a87838660405161125293929190615763565b7f8736816fdbcc15d6cc3f6dcf60e42b0ef33eb02281d312c807a38b4ad09190c0612841816146d3565b6003546004546001600160a01b0391821691163382141561295257816001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561289a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128be9190615710565b8411156128dd5760405162461bcd60e51b81526004016114429061582e565b600084815260186020908152604091829020600180820180546001600160a01b038b166001600160a01b0319909116811790915584519081529283018890528284015291517f72d0cb759def45a6b25b87c464329db59ab471725fa8f0f40a20ebf1347e79cf9181900360600190a150612a59565b6004546001600160a01b0316331415612a5957806001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129c79190615710565b8411156129e65760405162461bcd60e51b81526004016114429061582e565b60008481526019602090815260408083206003810180546001600160a01b0319166001600160a01b038b169081179091558251908152928301889052908201929092527f72d0cb759def45a6b25b87c464329db59ab471725fa8f0f40a20ebf1347e79cf906060015b60405180910390a1505b5050505050565b6000611ae8838380806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506001546040516bffffffffffffffffffffffff1960608b901b1660208201529092506034019050604051602081830303815290604052805190602001206147cf565b600080516020615b44833981519152612af0816146d3565b50600555565b600354604080516318160ddd60e01b815290516001600160a01b03909216916101f49183916318160ddd916004808201926020929091908290030181865afa158015612b46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b6a9190615710565b10612ba85760405162461bcd60e51b815260206004820152600e60248201526d1513d2d15394c814d3d31113d55560921b6044820152606401611442565b6040516331a9108f60e11b81526004810183905233906001600160a01b03831690636352211e90602401602060405180830381865afa158015612bef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c139190615788565b6001600160a01b031614612c5c5760405162461bcd60e51b815260206004820152601060248201526f2727aa102a27a5a2a7102427a62222a960811b6044820152606401611442565b604051630852cd8d60e31b8152600481018390526001600160a01b038216906342966c6890602401600060405180830381600087803b158015612c9e57600080fd5b505af1158015612cb2573d6000803e3d6000fd5b50505060009283525050601860209081526040808320838155600190810180546001600160a81b0319169055338452601c909252909120805460ff19811660ff91821690930116919091179055565b600080516020615b44833981519152612d19816146d3565b60018290556040518281527f42cbc405e4dbf1b691e85b9a34b08ecfcf7a9ad9078bf4d645ccfa1fac11c10b90602001611661565b600080516020615b44833981519152612d66816146d3565b50600a55565b600080516020615b44833981519152612d84816146d3565b6000600183151514612db3576040518060400160405280600581526020016466616c736560d81b815250612dd1565b604051806040016040528060048152602001637472756560e01b8152505b600d5460405191925060ff161515841515141590612df3908390602001615852565b60405160208183030381529060405290612e205760405162461bcd60e51b8152600401611442919061588f565b50600d805460ff19168415159081179091556040519081527f73ff70d0f3fe64e33491c2d95862f53fb6edee19bbbe0571258cd2b843be56f390602001611e3f565b600080516020615b44833981519152612e7a816146d3565b6118e8826147e5565b600080516020615b44833981519152612e9b816146d3565b600060018190556040519081527f42cbc405e4dbf1b691e85b9a34b08ecfcf7a9ad9078bf4d645ccfa1fac11c10b9060200160405180910390a150565b600080516020615b44833981519152612ef0816146d3565b50600955565b600080601d60009054906101000a90046001600160a01b03166001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa158015612f4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f7091906158c1565b5050509150506305f5e10081612f869190615911565b91505090565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b600080516020615b24833981519152612fcd816146d3565b6004805460408051630134c3db60e51b815290516001600160a01b039092169283926326987b6092808301926020929182900301816000875af1158015613018573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061303c9190615710565b83111561305b5760405162461bcd60e51b81526004016114429061582e565b60008381526019602052604090206003810154600160a01b900460ff16156130bd5760405162461bcd60e51b81526020600482015260156024820152741513d2d15388105314915051164811561412549151605a1b6044820152606401611442565b60038101805460ff60a01b1916600160a01b1790819055600160a81b900460ff161515600114156130fd576130f184614823565b60006001820155613110565b61310a4262093a8061574b565b60018201555b600381015460018201548254604080516001600160a01b0390941684526020840192909252908201527f146e2067061333417794029a9a05049d132ffb00573b7ca02e0fe1ed7c3d81419060600161229d565b600080516020615b4483398151915261317b816146d3565b60006001831515146131aa576040518060400160405280600581526020016466616c736560d81b8152506131c8565b604051806040016040528060048152602001637472756560e01b8152505b600d5460405191925060ff6101009091041615158415151415906131f090839060200161593f565b6040516020818303038152906040529061321d5760405162461bcd60e51b8152600401611442919061588f565b50600d80548415156101000261ff00199091161790556040517f6e8dbb1aa7bd0534f16a32affa6f050089b701ba51e4fcf9a592030bb86b4d0090611e3f90851515815260200190565b600080516020615b4483398151915261327f816146d3565b60048054604080516318160ddd60e01b815290516001600160a01b039092169283926318160ddd9280830192602092918290030181865afa1580156132c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132ec9190615710565b8310156132f857600080fd5b5050600855565b6000818152601b60205260408120546001600160a01b0316806133255750600092915050565b50600192915050565b50919050565b600080516020615b4483398151915261334c816146d3565b600d5460ff161561336f5760405162461bcd60e51b815260040161144290615984565b60165460ff161515600114156133be5760405162461bcd60e51b8152602060048201526014602482015273504841534520414c52454144592041435449564560601b6044820152606401611442565b6016805460ff191660011790556040517f64e0c8a0519d92df641708a4d9fcb54a93091f969f66e40114d940e710b07e7190600090a150565b600080516020615b2483398151915261340f816146d3565b6118e882614823565b600082815260208190526040902060010154613433816146d3565b611869838361476a565b60008181526019602052604090206002810154341461349e5760405162461bcd60e51b815260206004820152601860248201527f494e53554646494349454e5420414d4f554e542053454e5400000000000000006044820152606401611442565b60008160010154116134f25760405162461bcd60e51b815260206004820152601860248201527f535542534352495054494f4e204e4f54204558504952454400000000000000006044820152606401611442565b80600101544211156135465760405162461bcd60e51b815260206004820152601860248201527f52454e4557414c204441544520484153204558504952454400000000000000006044820152606401611442565b6003810154600160a81b900460ff16156135945760405162461bcd60e51b815260206004820152600f60248201526e10531491505116481491539155d151608a1b6044820152606401611442565b61359d3461491a565b60038101805461ffff60a01b1916600160a81b17905580546040805133815260208101929092527f0e3bc79b6527253ae333c773455df588f62bcc1ad9726d42dbdc179356232a609101611661565b600080516020615b44833981519152613604816146d3565b816001141561361757601283905561364c565b816002141561362a57601383905561364c565b816003141561363d57601483905561364c565b816004141561364c5760158390555b60408051838152602081018590527f2710bf08da5310971a5b8c2a84795bf6929b431b3674876fb9c4807304ca18219101611e3f565b600080516020615b4483398151915261369a816146d3565b600d5460ff16156136bd5760405162461bcd60e51b815260040161144290615984565b60006001831515146136ec576040518060400160405280600581526020016466616c736560d81b81525061370a565b604051806040016040528060048152602001637472756560e01b8152505b60165460405191925060ff6101009091041615158415151415906137329083906020016159bb565b6040516020818303038152906040529061375f5760405162461bcd60e51b8152600401611442919061588f565b5050601680549215156101000261ff00199093169290921790915550565b600454600d546001600160a01b0390911690600090610100900460ff166137e65760405162461bcd60e51b815260206004820152601c60248201527f53554253204d494e542043555252454e544c5920494e414354495645000000006044820152606401611442565b60085484836001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613828573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061384c9190615710565b613856919061574b565b11156138a45760405162461bcd60e51b815260206004820152601e60248201527f494e535546494349454e5420535542534352495054494f4e2053544f434b00006044820152606401611442565b6000600d5462010000900460ff1660038111156138c3576138c3615525565b1415613a5457600e60040154826001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561390d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139319190615710565b61393b908661574b565b1161397657600e5461394e908590615650565b34101561396d5760405162461bcd60e51b8152600401611442906157c0565b50600e54613e50565b6000826001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156139b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139da9190615710565b6012546139e791906159f7565b600e549091506000906139fa9083615650565b90506000613a0883886159f7565b600f54909150600090613a1b9083615650565b9050613a27818461574b565b3414613a455760405162461bcd60e51b8152600401611442906157c0565b5050600e549250613e50915050565b6001600d5462010000900460ff166003811115613a7357613a73615525565b1415613c1a57601254601354613a89919061574b565b826001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613ac7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613aeb9190615710565b613af5908661574b565b11613b2f57600f54613b08908590615650565b3414613b265760405162461bcd60e51b8152600401611442906157c0565b50600f54613e50565b6000826001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613b6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b939190615710565b601254601354613ba3919061574b565b613bad91906159f7565b600f54909150600090613bc09083615650565b90506000613bce83886159f7565b601054909150600090613be19083615650565b9050613bed818461574b565b3414613c0b5760405162461bcd60e51b8152600401611442906157c0565b5050600f549250613e50915050565b6002600d5462010000900460ff166003811115613c3957613c39615525565b1415613dfa57601254601354601454613c52919061574b565b613c5c919061574b565b826001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613c9a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613cbe9190615710565b613cc8908661574b565b11613d0257601054613cdb908590615650565b3414613cf95760405162461bcd60e51b8152600401611442906157c0565b50601054613e50565b6000826001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613d42573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d669190615710565b601454601254601354613d79919061574b565b613d83919061574b565b613d8d91906159f7565b601054909150600090613da09083615650565b90506000613dae83886159f7565b601154909150600090613dc19083615650565b9050613dcd818461574b565b3414613deb5760405162461bcd60e51b8152600401611442906157c0565b50506010549250613e50915050565b6003600d5462010000900460ff166003811115613e1957613e19615525565b1415613e5057601154613e2d908590615650565b3414613e4b5760405162461bcd60e51b8152600401611442906157c0565b506011545b6000826001600160a01b03166326987b606040518163ffffffff1660e01b81526004016020604051808303816000875af1158015613e92573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613eb69190615710565b90505b6040805160c081018252828152600060208083018281528385018781526001600160a01b03808d16606087019081526080870186815260a088018781528a88526019875289882098518955945160018981019190915593516002890155905160039097018054915194511515600160a81b0260ff60a81b19951515600160a01b026001600160a81b0319909316988416989098179190911793909316959095179091558451630134c3db60e51b81529451950194928716936326987b6093600480830194919283900301908290875af1158015613f9a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613fbe9190615710565b613fc8908661574b565b8110613eb9576040516340c10f1960e01b81526001600160a01b038781166004830152602482018790528416906340c10f1990604401600060405180830381600087803b15801561401857600080fd5b505af115801561402c573d6000803e3d6000fd5b505060125460135460145491935061404592509061574b565b61404f919061574b565b836001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561408d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140b19190615710565b106140d457600d80546003919062ff0000191662010000835b02179055506141e2565b6012546013546140e4919061574b565b836001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015614122573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141469190615710565b1061416357600d80546002919062ff0000191662010000836140ca565b600e60040154836001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156141a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141cb9190615710565b106141e257600d805462ff00001916620100001790555b336000908152601a60205260409020546142355760006142023387614d96565b336000818152601a60209081526040808320859055938252601b90529190912080546001600160a01b0319169091179055505b831561431c57614244846132ff565b6142885760405162461bcd60e51b8152602060048201526015602482015274494e56414c494420524546455252414c20434f444560581b6044820152606401611442565b6000848152601b602052604090819020549051638e9b277d60e01b81526001600160a01b0391821660048201819052917f00000000000000000000000000000000000000000000000000000000000000009190821690638e9b277d90602401600060405180830381600087803b15801561430157600080fd5b505af1158015614315573d6000803e3d6000fd5b5050505050505b6143253461491a565b7f46f317c500150db0b1e1358b3f5a7ca75e9e9149c9cc09bb33800bebed251d1a868287604051612a4f93929190615763565b600354600d546001600160a01b03909116907f00000000000000000000000000000000000000000000000000000000000000009060ff16156143ac5760405162461bcd60e51b815260040161144290615984565b60165460ff6101009091041615156001146143fb5760405162461bcd60e51b815260206004820152600f60248201526e2922a32aa722102727aa1027a822a760891b6044820152606401611442565b8260008167ffffffffffffffff8111156144175761441761512d565b604051908082528060200260200182016040528015614440578160200160208202803683370190505b50905060005b8581101561460757600087878381811061446257614462615a0e565b905060200201359050336001600160a01b0316866001600160a01b0316636352211e836040518263ffffffff1660e01b81526004016144a391815260200190565b602060405180830381865afa1580156144c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144e49190615788565b6001600160a01b031614156145f457600554604051630852cd8d60e31b8152600481018390526001600160a01b038816906342966c6890602401600060405180830381600087803b15801561453857600080fd5b505af115801561454c573d6000803e3d6000fd5b505050600083815260186020526040808220918255600190910180546001600160a81b031916905551635db20cb360e01b8152336004820152602481018390526001600160a01b0388169150635db20cb390604401600060405180830381600087803b1580156145bb57600080fd5b505af11580156145cf573d6000803e3d6000fd5b50505050818484815181106145e6576145e6615a0e565b602002602001018181525050505b50806145ff816157a5565b915050614446565b507f4784ac7c4ae7a1a7b199148d69994201d4c3c04e388c38b86febb1424a779aa63382600554604051612a4f93929190615a24565b600080516020615b44833981519152614655816146d3565b816001141561466857600e83905561469d565b816002141561467b57600f83905561469d565b816003141561468e57601083905561469d565b816004141561469d5760118390555b60408051838152602081018590527ff68b6199a6c7e5df3005a4142808bc836237ab35986a197b454750d532b568069101611e3f565b6146dd8133614def565b50565b6118e882825b6146f08282612f8c565b6118e8576000828152602081815260408083206001600160a01b03851684529091529020805460ff191660011790556147263390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6147748282612f8c565b156118e8576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6000826147dc8584614e53565b14949350505050565b600b80549082905560408051838152602081018390527f0a65a2e4b472c0dc0a4ddb3f4556f0c8ad844d7258c295eb94f7abbf4bea20849101611661565b60008181526019602052604090206003810154600160a01b900460ff1615156001146148855760405162461bcd60e51b81526020600482015260116024820152702727a71022ac2824a922a2102a27a5a2a760791b6044820152606401611442565b80600101544210156148d95760405162461bcd60e51b815260206004820152601b60248201527f52454e4557414c20444154454c494e45204e4f542050415353454400000000006044820152606401611442565b600880546001019081905560408051918252602082018490527f4053e12081b3855cd0fe8634bd7a50b80121749a9ab43be4e8724b7ca46d724a9101611661565b6000614924612ef6565b9050600081600b54670de0b6b3a764000061493f9190615650565b6149499190615685565b9050807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316311115614abb5760006149b3826001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016316159f7565b600254604051635db20cb360e01b81526001600160a01b039182166004820152602481018390529192507f00000000000000000000000000000000000000000000000000000000000000009190821690635db20cb390604401600060405180830381600087803b158015614a2657600080fd5b505af1158015614a3a573d6000803e3d6000fd5b5050600254604051600093506001600160a01b03909116915087908381818185875af1925050503d8060008114614a8d576040519150601f19603f3d011682016040523d82523d6000602084013e614a92565b606091505b5050905080614ab35760405162461bcd60e51b8152600401611442906157f7565b505050505050565b807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316311415614b66576002546040516000916001600160a01b03169085908381818185875af1925050503d8060008114614b3a576040519150601f19603f3d011682016040523d82523d6000602084013e614b3f565b606091505b5050905080614b605760405162461bcd60e51b8152600401611442906157f7565b50505050565b80614b9b846001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163161574b565b1115614cef576000614bd76001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001631836159f7565b90506000614be582866159f7565b905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168360405160006040518083038185875af1925050503d8060008114614c54576040519150601f19603f3d011682016040523d82523d6000602084013e614c59565b606091505b5050905080614c7a5760405162461bcd60e51b8152600401611442906157f7565b6002546040516001600160a01b03909116908390600081818185875af1925050503d8060008114614cc7576040519150601f19603f3d011682016040523d82523d6000602084013e614ccc565b606091505b50508091505080614ab35760405162461bcd60e51b8152600401611442906157f7565b80614d24846001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163161574b565b116118695760007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168460405160006040518083038185875af1925050503d8060008114614b3a576040519150601f19603f3d011682016040523d82523d6000602084013e614b3f565b604080516001600160a01b0384166020820152908101829052426060820152600090819060800160408051601f19818403018152919052805160209091012090506000614de66298968083615a83565b95945050505050565b614df98282612f8c565b6118e857614e11816001600160a01b03166014614ec7565b614e1c836020614ec7565b604051602001614e2d929190615a97565b60408051601f198184030181529082905262461bcd60e51b82526114429160040161588f565b600081815b8451811015614ebf576000858281518110614e7557614e75615a0e565b60200260200101519050808311614e9b5760008381526020829052604090209250614eac565b600081815260208490526040902092505b5080614eb7816157a5565b915050614e58565b509392505050565b60606000614ed6836002615650565b614ee190600261574b565b67ffffffffffffffff811115614ef957614ef961512d565b6040519080825280601f01601f191660200182016040528015614f23576020820181803683370190505b509050600360fc1b81600081518110614f3e57614f3e615a0e565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110614f6d57614f6d615a0e565b60200101906001600160f81b031916908160001a9053506000614f91846002615650565b614f9c90600161574b565b90505b6001811115615014576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110614fd057614fd0615a0e565b1a60f81b828281518110614fe657614fe6615a0e565b60200101906001600160f81b031916908160001a90535060049490941c9361500d81615b0c565b9050614f9f565b5083156150635760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401611442565b9392505050565b828054615076906156db565b90600052602060002090601f01602090048101928261509857600085556150de565b82601f106150b157805160ff19168380011785556150de565b828001600101855582156150de579182015b828111156150de5782518255916020019190600101906150c3565b506150ea9291506150ee565b5090565b5b808211156150ea57600081556001016150ef565b60006020828403121561511557600080fd5b81356001600160e01b03198116811461506357600080fd5b634e487b7160e01b600052604160045260246000fd5b600082601f83011261515457600080fd5b813567ffffffffffffffff8082111561516f5761516f61512d565b604051601f8301601f19908116603f011681019082821181831017156151975761519761512d565b816040528381528660208588010111156151b057600080fd5b836020870160208301376000602085830101528094505050505092915050565b6001600160a01b03811681146146dd57600080fd5b6000806000606084860312156151fa57600080fd5b833567ffffffffffffffff8082111561521257600080fd5b61521e87838801615143565b9450602086013591508082111561523457600080fd5b5061524186828701615143565b9250506040840135615252816151d0565b809150509250925092565b6000806040838503121561527057600080fd5b823567ffffffffffffffff81111561528757600080fd5b61529385828601615143565b95602094909401359450505050565b6000602082840312156152b457600080fd5b8135615063816151d0565b6000602082840312156152d157600080fd5b5035919050565b6000602082840312156152ea57600080fd5b813567ffffffffffffffff81111561530157600080fd5b611ae884828501615143565b60005b83811015615328578181015183820152602001615310565b83811115614b605750506000910152565b6000815180845261535181602086016020860161530d565b601f01601f19169290920160200192915050565b60208152600082516080602084015261538160a0840182615339565b90506020840151601f1984830301604085015261539e8282615339565b60408601516001600160a01b0316606086810191909152909501511515608090940193909352509192915050565b600080604083850312156153df57600080fd5b8235915060208301356153f1816151d0565b809150509250929050565b60008083601f84011261540e57600080fd5b50813567ffffffffffffffff81111561542657600080fd5b6020830191508360208260051b850101111561544157600080fd5b9250929050565b6000806000806060858703121561545e57600080fd5b8435615469816151d0565b9350602085013567ffffffffffffffff81111561548557600080fd5b615491878288016153fc565b9598909750949560400135949350505050565b600080604083850312156154b757600080fd5b82356154c2816151d0565b946020939093013593505050565b6000806000604084860312156154e557600080fd5b83356154f0816151d0565b9250602084013567ffffffffffffffff81111561550c57600080fd5b615518868287016153fc565b9497909650939450505050565b634e487b7160e01b600052602160045260246000fd5b602081016004831061555d57634e487b7160e01b600052602160045260246000fd5b91905290565b60006020828403121561557557600080fd5b8135801515811461506357600080fd5b6000806040838503121561559857600080fd5b50508035926020909101359150565b6000806000606084860312156155bc57600080fd5b83356155c7816151d0565b95602085013595506040909401359392505050565b600080602083850312156155ef57600080fd5b823567ffffffffffffffff81111561560657600080fd5b615612858286016153fc565b90969095509350505050565b6000825161563081846020870161530d565b9190910192915050565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161561566a5761566a61563a565b500290565b634e487b7160e01b600052601260045260246000fd5b6000826156945761569461566f565b500490565b6080815260006156ac6080830187615339565b82810360208401526156be8187615339565b6001600160a01b0395909516604084015250506060015292915050565b600181811c908216806156ef57607f821691505b6020821081141561332e57634e487b7160e01b600052602260045260246000fd5b60006020828403121561572257600080fd5b5051919050565b60408152600061573c6040830185615339565b90508260208301529392505050565b6000821982111561575e5761575e61563a565b500190565b6001600160a01b03939093168352602083019190915261ffff16604082015260600190565b60006020828403121561579a57600080fd5b8151615063816151d0565b60006000198214156157b9576157b961563a565b5060010190565b6020808252601a908201527f494e53554646494349454e54204d494e54494e472056414c5545000000000000604082015260600190565b60208082526018908201527f4d494e543a455448205452414e53464552204641494c45440000000000000000604082015260600190565b6020808252600a90820152691253959053125108125160b21b604082015260600190565b74023b2b732b9b4b990233630b39030b63932b0b23c9605d1b81526000825161588281601585016020870161530d565b9190910160150192915050565b6020815260006150636020830184615339565b805169ffffffffffffffffffff811681146158bc57600080fd5b919050565b600080600080600060a086880312156158d957600080fd5b6158e2866158a2565b9450602086015193506040860151925060608601519150615905608087016158a2565b90509295509295909350565b6000826159205761592061566f565b600160ff1b82146000198414161561593a5761593a61563a565b500590565b7f537562736372697074696f6e20466c616720616c72656164792000000000000081526000825161597781601a85016020870161530d565b91909101601a0192915050565b60208082526017908201527f47454e45534953204d494e54205354494c4c204f50454e000000000000000000604082015260600190565b7302932b33ab73210233630b39030b63932b0b23c960651b8152600082516159ea81601485016020870161530d565b9190910160140192915050565b600082821015615a0957615a0961563a565b500390565b634e487b7160e01b600052603260045260246000fd5b6001600160a01b038416815260606020808301829052845191830182905260009185820191906080850190845b81811015615a6d57845183529383019391830191600101615a51565b5050809350505050826040830152949350505050565b600082615a9257615a9261566f565b500690565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351615acf81601785016020880161530d565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351615b0081602884016020880161530d565b01602801949350505050565b600081615b1b57615b1b61563a565b50600019019056fed8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e63a49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775a2646970667358221220a50a3849f9920f4b0ae0f6e1fdf952cb4d84f98f4a401926bb7daa7fc31525c364736f6c634300080b00338736816fdbcc15d6cc3f6dcf60e42b0ef33eb02281d312c807a38b4ad09190c0a49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c217750000000000000000000000006fcea20172299c6a1a07ea1730b5a6600321b15f000000000000000000000000fefc20ba3d59431044b9f4a943b132cd99235b1c000000000000000000000000c99365816bbbe19123e15a36dd3309ac0441d8bc000000000000000000000000168fe4ebf3ba698d60b5b5f9189fc2d3bece22170000000000000000000000005f4ec3df9cbd43714fe2740f5e3616155c5b841900000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000003000000000000000000000000168fe4ebf3ba698d60b5b5f9189fc2d3bece2217000000000000000000000000ecff2245b01cc32d32b466631c052249c953ad8c000000000000000000000000b93081bdab3d54736caae7f3bb09e7bcddd26fed
Deployed Bytecode
0x60806040526004361061043c5760003560e01c8063800114a811610234578063c6a087701161012e578063d71bb37b116100b6578063f54a6f831161007a578063f54a6f8314610f2a578063f5602f6414610f4a578063f684f33c14610fee578063f7646a5f14611022578063fcf3763d1461104057600080fd5b8063d71bb37b14610eaf578063d7e6040c14610ec2578063e57d925a14610ee2578063eb3c267b14610f02578063f1f1000014610f1557600080fd5b8063cf563343116100fd578063cf56334314610e21578063cfba18f614610e40578063d2b7d43c14610e55578063d3d7837014610e75578063d547741f14610e8f57600080fd5b8063c6a0877014610c12578063ccc7139c14610d24578063ccf3126214610d66578063cefa7b6d14610e0157600080fd5b806392c40344116101bc578063ab147e4b11610180578063ab147e4b14610b10578063bdaa41ae14610b7e578063c56f19a514610b9e578063c5967b8f14610bbe578063c5f956af14610bde57600080fd5b806392c4034414610a785780639534dd3e14610aae5780639eb1f05414610adb578063a0f3b87614610af0578063a217fddf14610adb57600080fd5b8063887e7acf11610203578063887e7acf146109ee57806388949d9314610a0e5780638980ecc914610a235780638e15f47314610a4357806391d1485414610a5857600080fd5b8063800114a814610974578063819b86331461099457806382737c97146109b457806382b8fbd6146109ce57600080fd5b80634c92c5561161034557806360eb674b116102cd57806375b238fc1161029157806375b238fc146108c35780637a700bce146108e55780637b47ec1a146108fa5780637cb647591461091a5780637f56a53c1461093a57600080fd5b806360eb674b146107d257806361f36462146107f257806369acaa5e146108125780636d936a9714610880578063728cce7c146108ad57600080fd5b80635c69cbac116103145780635c69cbac1461071c5780635c8f54df1461073c5780635e13a1341461078a5780635fce793e1461079d57806360cc1121146107b257600080fd5b80634c92c556146106a657806355360f19146106c6578063556c1a71146106e657806358f94491146106fc57600080fd5b80632f2ff15d116103c85780633a55308d116103975780633a55308d1461061b5780633f1e762a146106315780634528c9b0146106515780634adc7cfd146106705780634bbf179b1461069057600080fd5b80632f2ff15d1461059b57806336568abe146105bb57806336921ec4146105db57806336b1b6a4146105fb57600080fd5b80631b1037cc1161040f5780631b1037cc146104e8578063248a9ca31461050857806325d3a09d146105385780632a20044d146105655780632eb4a7ab1461058557600080fd5b806301ffc9a714610441578063033670ec1461047657806307bd026514610498578063152f7361146104c8575b600080fd5b34801561044d57600080fd5b5061046161045c366004615103565b611060565b60405190151581526020015b60405180910390f35b34801561048257600080fd5b506104966104913660046151e5565b611097565b005b3480156104a457600080fd5b506104ba600080516020615b2483398151915281565b60405190815260200161046d565b3480156104d457600080fd5b506104966104e336600461525d565b611263565b3480156104f457600080fd5b506104966105033660046152a2565b611590565b34801561051457600080fd5b506104ba6105233660046152bf565b60009081526020819052604090206001015490565b34801561054457600080fd5b506105586105533660046152d8565b61166d565b60405161046d9190615365565b34801561057157600080fd5b506104966105803660046152a2565b611809565b34801561059157600080fd5b506104ba60015481565b3480156105a757600080fd5b506104966105b63660046153cc565b611844565b3480156105c757600080fd5b506104966105d63660046153cc565b61186e565b3480156105e757600080fd5b506104966105f63660046152bf565b6118ec565b34801561060757600080fd5b506104ba6106163660046152a2565b611a30565b34801561062757600080fd5b506104ba60085481565b34801561063d57600080fd5b5061049661064c3660046152bf565b611af0565b34801561065d57600080fd5b50600d5461046190610100900460ff1681565b34801561067c57600080fd5b5061049661068b3660046152a2565b611b0e565b34801561069c57600080fd5b506104ba60075481565b3480156106b257600080fd5b506104966106c13660046152bf565b611b3e565b3480156106d257600080fd5b506104ba6106e13660046152a2565b611e4c565b3480156106f257600080fd5b506104ba600c5481565b34801561070857600080fd5b506104966107173660046152a2565b611fa6565b34801561072857600080fd5b506104966107373660046152bf565b6122ab565b34801561074857600080fd5b506107726107573660046152bf565b601b602052600090815260409020546001600160a01b031681565b6040516001600160a01b03909116815260200161046d565b610496610798366004615448565b612345565b3480156107a957600080fd5b506007546104ba565b3480156107be57600080fd5b506104966107cd3660046154a4565b612817565b3480156107de57600080fd5b506104616107ed3660046154d0565b612a60565b3480156107fe57600080fd5b5061049661080d3660046152bf565b612ad8565b34801561081e57600080fd5b5061085b61082d3660046152bf565b601860205260009081526040902080546001909101546001600160a01b03811690600160a01b900460ff1683565b604080519384526001600160a01b03909216602084015215159082015260600161046d565b34801561088c57600080fd5b50600d546108a09062010000900460ff1681565b60405161046d919061553b565b3480156108b957600080fd5b506104ba60055481565b3480156108cf57600080fd5b506104ba600080516020615b4483398151915281565b3480156108f157600080fd5b506008546104ba565b34801561090657600080fd5b506104966109153660046152bf565b612af6565b34801561092657600080fd5b506104966109353660046152bf565b612d01565b34801561094657600080fd5b506104616109553660046152bf565b600090815260196020526040902060030154600160a01b900460ff1690565b34801561098057600080fd5b50600454610772906001600160a01b031681565b3480156109a057600080fd5b506104966109af3660046152bf565b612d4e565b3480156109c057600080fd5b50600d546104619060ff1681565b3480156109da57600080fd5b506104966109e9366004615563565b612d6c565b3480156109fa57600080fd5b50610496610a093660046152bf565b612e62565b348015610a1a57600080fd5b50610496612e83565b348015610a2f57600080fd5b50610496610a3e3660046152bf565b612ed8565b348015610a4f57600080fd5b506104ba612ef6565b348015610a6457600080fd5b50610461610a733660046153cc565b612f8c565b348015610a8457600080fd5b506104ba610a933660046152a2565b6001600160a01b03166000908152601a602052604090205490565b348015610aba57600080fd5b506104ba610ac93660046152a2565b601a6020526000908152604090205481565b348015610ae757600080fd5b506104ba600081565b348015610afc57600080fd5b50610496610b0b3660046152bf565b612fb5565b348015610b1c57600080fd5b50600e54600f54601054601154601254601354601454601554610b43979695949392919088565b604080519889526020890197909752958701949094526060860192909252608085015260a084015260c083015260e08201526101000161046d565b348015610b8a57600080fd5b50610496610b99366004615563565b613163565b348015610baa57600080fd5b50610496610bb93660046152bf565b613267565b348015610bca57600080fd5b50610461610bd93660046152bf565b6132ff565b348015610bea57600080fd5b506107727f000000000000000000000000c99365816bbbe19123e15a36dd3309ac0441d8bc81565b348015610c1e57600080fd5b50610cd0610c2d3660046152bf565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915250600090815260196020908152604091829020825160c081018452815481526001820154928101929092526002810154928201929092526003909101546001600160a01b038116606083015260ff600160a01b8204811615156080840152600160a81b90910416151560a082015290565b60405161046d91908151815260208083015190820152604080830151908201526060808301516001600160a01b03169082015260808083015115159082015260a09182015115159181019190915260c00190565b348015610d3057600080fd5b50610d54610d3f3660046152a2565b601c6020526000908152604090205460ff1681565b60405160ff909116815260200161046d565b348015610d7257600080fd5b50610dc7610d813660046152bf565b6019602052600090815260409020805460018201546002830154600390930154919290916001600160a01b0381169060ff600160a01b8204811691600160a81b90041686565b604080519687526020870195909552938501929092526001600160a01b0316606084015215156080830152151560a082015260c00161046d565b348015610e0d57600080fd5b50600354610772906001600160a01b031681565b348015610e2d57600080fd5b5060165461046190610100900460ff1681565b348015610e4c57600080fd5b50610496613334565b348015610e6157600080fd5b50610496610e703660046152bf565b6133f7565b348015610e8157600080fd5b506016546104619060ff1681565b348015610e9b57600080fd5b50610496610eaa3660046153cc565b613418565b610496610ebd3660046152bf565b61343d565b348015610ece57600080fd5b50610496610edd366004615585565b6135ec565b348015610eee57600080fd5b50610496610efd366004615563565b613682565b610496610f103660046155a7565b61377d565b348015610f2157600080fd5b50600b546104ba565b348015610f3657600080fd5b50610496610f453660046155dc565b614358565b348015610f5657600080fd5b50610fc1610f653660046152bf565b60408051606080820183526000808352602080840182905292840181905293845260188252928290208251938401835280548452600101546001600160a01b03811691840191909152600160a01b900460ff1615159082015290565b60408051825181526020808401516001600160a01b0316908201529181015115159082015260600161046d565b348015610ffa57600080fd5b506104ba7f8736816fdbcc15d6cc3f6dcf60e42b0ef33eb02281d312c807a38b4ad09190c081565b34801561102e57600080fd5b506002546001600160a01b0316610772565b34801561104c57600080fd5b5061049661105b366004615585565b61463d565b60006001600160e01b03198216637965db0b60e01b148061109157506301ffc9a760e01b6001600160e01b03198316145b92915050565b600080516020615b448339815191526110af816146d3565b60408051608081018252858152602081018590526001600160a01b038416818301526000606082015290516017906110e890879061561e565b9081526020016040518091039020600082015181600001908051906020019061111292919061506a565b50602082810151805161112b926001850192019061506a565b506040820151600290910180546060909301511515600160a01b026001600160a81b03199093166001600160a01b03909216919091179190911790557f000000000000000000000000c99365816bbbe19123e15a36dd3309ac0441d8bc6000611192612ef6565b9050600081600c54670de0b6b3a76400006111ad9190615650565b6111b79190615685565b60405163d28ace9960e01b81526001600160a01b038781166004830152602482018390529192509084169063d28ace9990604401600060405180830381600087803b15801561120557600080fd5b505af1158015611219573d6000803e3d6000fd5b505050507fe2094cfca7face17092ea395948297bb659dc04721977074a67b8439ef4bbc21878787846040516112529493929190615699565b60405180910390a150505050505050565b600080516020615b4483398151915261127b816146d3565b600060178460405161128d919061561e565b90815260200160405180910390206040518060800160405290816000820180546112b6906156db565b80601f01602080910402602001604051908101604052809291908181526020018280546112e2906156db565b801561132f5780601f106113045761010080835404028352916020019161132f565b820191906000526020600020905b81548152906001019060200180831161131257829003601f168201915b50505050508152602001600182018054611348906156db565b80601f0160208091040260200160405190810160405280929190818152602001828054611374906156db565b80156113c15780601f10611396576101008083540402835291602001916113c1565b820191906000526020600020905b8154815290600101906020018083116113a457829003601f168201915b5050509183525050600291909101546001600160a01b0381166020830152600160a01b900460ff16151560409091015260608101519091501561144b5760405162461bcd60e51b815260206004820152601760248201527f50524f4a45435420484153204245454e2046554e44454400000000000000000060448201526064015b60405180910390fd5b604081810151905163232a550160e21b81526001600160a01b039182166004820152602481018590527f000000000000000000000000c99365816bbbe19123e15a36dd3309ac0441d8bc91821690638ca9540490604401600060405180830381600087803b1580156114bc57600080fd5b505af11580156114d0573d6000803e3d6000fd5b5050505060408281015190516302856c5760e41b81526001600160a01b03918216600482015290821690632856c57090602401602060405180830381865afa158015611520573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115449190615710565b61155057600160608301525b7fa4f7ac52f2d7303b14db7a6f86c3a581111fe0fb2e7a9fdc12fb47e69ac458468585604051611581929190615729565b60405180910390a15050505050565b600080516020615b448339815191526115a8816146d3565b6001600160a01b0382166115ed5760405162461bcd60e51b815260206004820152600c60248201526b41444452455353205a45524f60a01b6044820152606401611442565b611605600080516020615b24833981519152836146e0565b604080516001600160a01b038416815260208101829052600d918101919091526c4558454355544f525f524f4c4560981b60608201527fd063779f8be6b49dbff1347e87a6be2e91ce10d6584838bd5bfc09cb780fd4ec906080015b60405180910390a15050565b60408051608081018252606080825260208201819052600082840181905290820152905160179061169f90849061561e565b90815260200160405180910390206040518060800160405290816000820180546116c8906156db565b80601f01602080910402602001604051908101604052809291908181526020018280546116f4906156db565b80156117415780601f1061171657610100808354040283529160200191611741565b820191906000526020600020905b81548152906001019060200180831161172457829003601f168201915b5050505050815260200160018201805461175a906156db565b80601f0160208091040260200160405190810160405280929190818152602001828054611786906156db565b80156117d35780601f106117a8576101008083540402835291602001916117d3565b820191906000526020600020905b8154815290600101906020018083116117b657829003601f168201915b5050509183525050600291909101546001600160a01b0381166020830152600160a01b900460ff16151560409091015292915050565b600080516020615b44833981519152611821816146d3565b50600280546001600160a01b0319166001600160a01b0392909216919091179055565b60008281526020819052604090206001015461185f816146d3565b61186983836146e6565b505050565b6001600160a01b03811633146118de5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401611442565b6118e8828261476a565b5050565b600080516020615b44833981519152611904816146d3565b60048211156119455760405162461bcd60e51b815260206004820152600d60248201526c496e76616c696420737461676560981b6044820152606401611442565b600082116119855760405162461bcd60e51b815260206004820152600d60248201526c496e76616c696420737461676560981b6044820152606401611442565b81600114156119ac57600d80546000919062ff0000191662010000835b0217905550611a00565b81600214156119cd57600d80546001919062ff0000191662010000836119a2565b81600314156119ee57600d80546002919062ff0000191662010000836119a2565b600d805462ff00001916620300001790555b6040518281527f3b5b51b70427504df5cb536d263f0e41793d8b99947a8fe09fa665dbd8c4b8fa90602001611661565b600354600a546000916001600160a01b0316908290611a4e85611e4c565b611a589190615650565b611a62908261574b565b6009546040516370a0823160e01b81526001600160a01b03878116600483015292935090918416906370a0823190602401602060405180830381865afa158015611ab0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ad49190615710565b611ade9190615650565b611ae8908261574b565b949350505050565b600080516020615b44833981519152611b08816146d3565b50600c55565b600080516020615b44833981519152611b26816146d3565b6118e8600080516020615b44833981519152836146e0565b6003546016546001600160a01b039091169060ff161515600114611b9c5760405162461bcd60e51b81526020600482015260156024820152742224a9aa2924a12aaa24a7a7102727aa1027a822a760591b6044820152606401611442565b600082815260186020526040902060010154600160a01b900460ff1615611bf75760405162461bcd60e51b815260206004820152600f60248201526e105314915051164810d31052535151608a1b6044820152606401611442565b6000828152601860205260409020600101546001600160a01b03163314611c505760405162461bcd60e51b815260206004820152600d60248201526c2727aa1027232a1027aba722a960991b6044820152606401611442565b6000816001600160a01b03166326987b606040518163ffffffff1660e01b81526004016020604051808303816000875af1158015611c92573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cb69190615710565b90505b604080516060810182528281523360208083019182526001838501818152600087815260188452868120955186559351948201805491511515600160a01b026001600160a81b03199092166001600160a01b03968716179190911790558451630134c3db60e51b81529451950194928616936326987b6093600480830194919283900301908290875af1158015611d54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d789190615710565b611d8390600361574b565b8110611cb95760008381526018602052604090819020600101805460ff60a01b1916600160a01b179055516340c10f1960e01b8152336004820152600360248201526001600160a01b038316906340c10f1990604401600060405180830381600087803b158015611df357600080fd5b505af1158015611e07573d6000803e3d6000fd5b505050507fc52c24f72d8c313ac367a81b5c004f343f024b4620f5d0d737e44e1dbfce570a33826003604051611e3f93929190615763565b60405180910390a1505050565b6004546000906001600160a01b0316816001815b6040516370a0823160e01b81526001600160a01b0387811660048301528516906370a0823190602401602060405180830381865afa158015611ea6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611eca9190615710565b811015611f9c576040516331a9108f60e11b8152600481018390526001600160a01b038088169190861690636352211e90602401602060405180830381865afa158015611f1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f3f9190615788565b6001600160a01b03161415611f8a57600082815260196020526040902060030154600160a01b900460ff16611f7c5782611f78816157a5565b9350505b80611f86816157a5565b9150505b81611f94816157a5565b925050611e60565b5090949350505050565b600080516020615b44833981519152611fbe816146d3565b600354600d546001600160a01b039091169060ff1661201f5760405162461bcd60e51b815260206004820152601f60248201527f47454e45534953204d494e542043555252454e544c5920494e414354495645006044820152606401611442565b6101f4816001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612060573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120849190615710565b106120cd5760405162461bcd60e51b8152602060048201526019602482015278494e535546494349454e542047454e455349532053544f434b60381b6044820152606401611442565b6000816001600160a01b03166326987b606040518163ffffffff1660e01b81526004016020604051808303816000875af115801561210f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121339190615710565b604080516060810182528281526001600160a01b0387811660208084018281526000858701818152888252601890935286902094518555516001948501805492511515600160a01b026001600160a81b03199093169185169190911791909117905592516340c10f1960e01b815260048101939093526024830191909152919250908316906340c10f1990604401600060405180830381600087803b1580156121db57600080fd5b505af11580156121ef573d6000803e3d6000fd5b50505050816001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612231573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122559190615710565b6101f4141561226957600d805460ff191690555b7fc52c24f72d8c313ac367a81b5c004f343f024b4620f5d0d737e44e1dbfce570a8482600160405161229d93929190615763565b60405180910390a150505050565b600080516020615b448339815191526122c3816146d3565b600354604080516318160ddd60e01b815290516001600160a01b039092169182916318160ddd9160048083019260209291908290030181865afa15801561230e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123329190615710565b83101561233e57600080fd5b5050600755565b6003546007546001600160a01b039091169061236390600490615685565b82826001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156123a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123c69190615710565b6123d0919061574b565b11156124155760405162461bcd60e51b81526020600482015260146024820152731350560814555053951255164814915050d2115160621b6044820152606401611442565b816005546124239190615650565b3410156124425760405162461bcd60e51b8152600401611442906157c0565b600d5460ff166124945760405162461bcd60e51b815260206004820152601f60248201527f47454e45534953204d494e542043555252454e544c5920494e414354495645006044820152606401611442565b6101f4816001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124f99190615710565b106125425760405162461bcd60e51b8152602060048201526019602482015278494e535546494349454e542047454e455349532053544f434b60381b6044820152606401611442565b6001541561259857612555858585612a60565b6125985760405162461bcd60e51b815260206004820152601460248201527324a72b20a624a21026a2a925a62290282927a7a360611b6044820152606401611442565b6000816001600160a01b03166326987b606040518163ffffffff1660e01b81526004016020604051808303816000875af11580156125da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125fe9190615710565b9050805b61260c828561574b565b81101561268a57604080516060810182528381526001600160a01b03808a16602080840191825260008486018181528782526018909252949094209251835551600192909201805493511515600160a01b026001600160a81b0319909416929091169190911791909117905580612682816157a5565b915050612602565b506040516340c10f1960e01b81526001600160a01b038781166004830152602482018590528316906340c10f1990604401600060405180830381600087803b1580156126d557600080fd5b505af11580156126e9573d6000803e3d6000fd5b5050600254604051600093506001600160a01b03909116915034908381818185875af1925050503d806000811461273c576040519150601f19603f3d011682016040523d82523d6000602084013e612741565b606091505b50509050806127625760405162461bcd60e51b8152600401611442906157f7565b60046007546127719190615685565b836001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156127af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127d39190615710565b14156127e457600d805460ff191690555b7fc52c24f72d8c313ac367a81b5c004f343f024b4620f5d0d737e44e1dbfce570a87838660405161125293929190615763565b7f8736816fdbcc15d6cc3f6dcf60e42b0ef33eb02281d312c807a38b4ad09190c0612841816146d3565b6003546004546001600160a01b0391821691163382141561295257816001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561289a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128be9190615710565b8411156128dd5760405162461bcd60e51b81526004016114429061582e565b600084815260186020908152604091829020600180820180546001600160a01b038b166001600160a01b0319909116811790915584519081529283018890528284015291517f72d0cb759def45a6b25b87c464329db59ab471725fa8f0f40a20ebf1347e79cf9181900360600190a150612a59565b6004546001600160a01b0316331415612a5957806001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129c79190615710565b8411156129e65760405162461bcd60e51b81526004016114429061582e565b60008481526019602090815260408083206003810180546001600160a01b0319166001600160a01b038b169081179091558251908152928301889052908201929092527f72d0cb759def45a6b25b87c464329db59ab471725fa8f0f40a20ebf1347e79cf906060015b60405180910390a1505b5050505050565b6000611ae8838380806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506001546040516bffffffffffffffffffffffff1960608b901b1660208201529092506034019050604051602081830303815290604052805190602001206147cf565b600080516020615b44833981519152612af0816146d3565b50600555565b600354604080516318160ddd60e01b815290516001600160a01b03909216916101f49183916318160ddd916004808201926020929091908290030181865afa158015612b46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b6a9190615710565b10612ba85760405162461bcd60e51b815260206004820152600e60248201526d1513d2d15394c814d3d31113d55560921b6044820152606401611442565b6040516331a9108f60e11b81526004810183905233906001600160a01b03831690636352211e90602401602060405180830381865afa158015612bef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c139190615788565b6001600160a01b031614612c5c5760405162461bcd60e51b815260206004820152601060248201526f2727aa102a27a5a2a7102427a62222a960811b6044820152606401611442565b604051630852cd8d60e31b8152600481018390526001600160a01b038216906342966c6890602401600060405180830381600087803b158015612c9e57600080fd5b505af1158015612cb2573d6000803e3d6000fd5b50505060009283525050601860209081526040808320838155600190810180546001600160a81b0319169055338452601c909252909120805460ff19811660ff91821690930116919091179055565b600080516020615b44833981519152612d19816146d3565b60018290556040518281527f42cbc405e4dbf1b691e85b9a34b08ecfcf7a9ad9078bf4d645ccfa1fac11c10b90602001611661565b600080516020615b44833981519152612d66816146d3565b50600a55565b600080516020615b44833981519152612d84816146d3565b6000600183151514612db3576040518060400160405280600581526020016466616c736560d81b815250612dd1565b604051806040016040528060048152602001637472756560e01b8152505b600d5460405191925060ff161515841515141590612df3908390602001615852565b60405160208183030381529060405290612e205760405162461bcd60e51b8152600401611442919061588f565b50600d805460ff19168415159081179091556040519081527f73ff70d0f3fe64e33491c2d95862f53fb6edee19bbbe0571258cd2b843be56f390602001611e3f565b600080516020615b44833981519152612e7a816146d3565b6118e8826147e5565b600080516020615b44833981519152612e9b816146d3565b600060018190556040519081527f42cbc405e4dbf1b691e85b9a34b08ecfcf7a9ad9078bf4d645ccfa1fac11c10b9060200160405180910390a150565b600080516020615b44833981519152612ef0816146d3565b50600955565b600080601d60009054906101000a90046001600160a01b03166001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa158015612f4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f7091906158c1565b5050509150506305f5e10081612f869190615911565b91505090565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b600080516020615b24833981519152612fcd816146d3565b6004805460408051630134c3db60e51b815290516001600160a01b039092169283926326987b6092808301926020929182900301816000875af1158015613018573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061303c9190615710565b83111561305b5760405162461bcd60e51b81526004016114429061582e565b60008381526019602052604090206003810154600160a01b900460ff16156130bd5760405162461bcd60e51b81526020600482015260156024820152741513d2d15388105314915051164811561412549151605a1b6044820152606401611442565b60038101805460ff60a01b1916600160a01b1790819055600160a81b900460ff161515600114156130fd576130f184614823565b60006001820155613110565b61310a4262093a8061574b565b60018201555b600381015460018201548254604080516001600160a01b0390941684526020840192909252908201527f146e2067061333417794029a9a05049d132ffb00573b7ca02e0fe1ed7c3d81419060600161229d565b600080516020615b4483398151915261317b816146d3565b60006001831515146131aa576040518060400160405280600581526020016466616c736560d81b8152506131c8565b604051806040016040528060048152602001637472756560e01b8152505b600d5460405191925060ff6101009091041615158415151415906131f090839060200161593f565b6040516020818303038152906040529061321d5760405162461bcd60e51b8152600401611442919061588f565b50600d80548415156101000261ff00199091161790556040517f6e8dbb1aa7bd0534f16a32affa6f050089b701ba51e4fcf9a592030bb86b4d0090611e3f90851515815260200190565b600080516020615b4483398151915261327f816146d3565b60048054604080516318160ddd60e01b815290516001600160a01b039092169283926318160ddd9280830192602092918290030181865afa1580156132c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132ec9190615710565b8310156132f857600080fd5b5050600855565b6000818152601b60205260408120546001600160a01b0316806133255750600092915050565b50600192915050565b50919050565b600080516020615b4483398151915261334c816146d3565b600d5460ff161561336f5760405162461bcd60e51b815260040161144290615984565b60165460ff161515600114156133be5760405162461bcd60e51b8152602060048201526014602482015273504841534520414c52454144592041435449564560601b6044820152606401611442565b6016805460ff191660011790556040517f64e0c8a0519d92df641708a4d9fcb54a93091f969f66e40114d940e710b07e7190600090a150565b600080516020615b2483398151915261340f816146d3565b6118e882614823565b600082815260208190526040902060010154613433816146d3565b611869838361476a565b60008181526019602052604090206002810154341461349e5760405162461bcd60e51b815260206004820152601860248201527f494e53554646494349454e5420414d4f554e542053454e5400000000000000006044820152606401611442565b60008160010154116134f25760405162461bcd60e51b815260206004820152601860248201527f535542534352495054494f4e204e4f54204558504952454400000000000000006044820152606401611442565b80600101544211156135465760405162461bcd60e51b815260206004820152601860248201527f52454e4557414c204441544520484153204558504952454400000000000000006044820152606401611442565b6003810154600160a81b900460ff16156135945760405162461bcd60e51b815260206004820152600f60248201526e10531491505116481491539155d151608a1b6044820152606401611442565b61359d3461491a565b60038101805461ffff60a01b1916600160a81b17905580546040805133815260208101929092527f0e3bc79b6527253ae333c773455df588f62bcc1ad9726d42dbdc179356232a609101611661565b600080516020615b44833981519152613604816146d3565b816001141561361757601283905561364c565b816002141561362a57601383905561364c565b816003141561363d57601483905561364c565b816004141561364c5760158390555b60408051838152602081018590527f2710bf08da5310971a5b8c2a84795bf6929b431b3674876fb9c4807304ca18219101611e3f565b600080516020615b4483398151915261369a816146d3565b600d5460ff16156136bd5760405162461bcd60e51b815260040161144290615984565b60006001831515146136ec576040518060400160405280600581526020016466616c736560d81b81525061370a565b604051806040016040528060048152602001637472756560e01b8152505b60165460405191925060ff6101009091041615158415151415906137329083906020016159bb565b6040516020818303038152906040529061375f5760405162461bcd60e51b8152600401611442919061588f565b5050601680549215156101000261ff00199093169290921790915550565b600454600d546001600160a01b0390911690600090610100900460ff166137e65760405162461bcd60e51b815260206004820152601c60248201527f53554253204d494e542043555252454e544c5920494e414354495645000000006044820152606401611442565b60085484836001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613828573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061384c9190615710565b613856919061574b565b11156138a45760405162461bcd60e51b815260206004820152601e60248201527f494e535546494349454e5420535542534352495054494f4e2053544f434b00006044820152606401611442565b6000600d5462010000900460ff1660038111156138c3576138c3615525565b1415613a5457600e60040154826001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561390d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139319190615710565b61393b908661574b565b1161397657600e5461394e908590615650565b34101561396d5760405162461bcd60e51b8152600401611442906157c0565b50600e54613e50565b6000826001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156139b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139da9190615710565b6012546139e791906159f7565b600e549091506000906139fa9083615650565b90506000613a0883886159f7565b600f54909150600090613a1b9083615650565b9050613a27818461574b565b3414613a455760405162461bcd60e51b8152600401611442906157c0565b5050600e549250613e50915050565b6001600d5462010000900460ff166003811115613a7357613a73615525565b1415613c1a57601254601354613a89919061574b565b826001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613ac7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613aeb9190615710565b613af5908661574b565b11613b2f57600f54613b08908590615650565b3414613b265760405162461bcd60e51b8152600401611442906157c0565b50600f54613e50565b6000826001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613b6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b939190615710565b601254601354613ba3919061574b565b613bad91906159f7565b600f54909150600090613bc09083615650565b90506000613bce83886159f7565b601054909150600090613be19083615650565b9050613bed818461574b565b3414613c0b5760405162461bcd60e51b8152600401611442906157c0565b5050600f549250613e50915050565b6002600d5462010000900460ff166003811115613c3957613c39615525565b1415613dfa57601254601354601454613c52919061574b565b613c5c919061574b565b826001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613c9a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613cbe9190615710565b613cc8908661574b565b11613d0257601054613cdb908590615650565b3414613cf95760405162461bcd60e51b8152600401611442906157c0565b50601054613e50565b6000826001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613d42573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d669190615710565b601454601254601354613d79919061574b565b613d83919061574b565b613d8d91906159f7565b601054909150600090613da09083615650565b90506000613dae83886159f7565b601154909150600090613dc19083615650565b9050613dcd818461574b565b3414613deb5760405162461bcd60e51b8152600401611442906157c0565b50506010549250613e50915050565b6003600d5462010000900460ff166003811115613e1957613e19615525565b1415613e5057601154613e2d908590615650565b3414613e4b5760405162461bcd60e51b8152600401611442906157c0565b506011545b6000826001600160a01b03166326987b606040518163ffffffff1660e01b81526004016020604051808303816000875af1158015613e92573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613eb69190615710565b90505b6040805160c081018252828152600060208083018281528385018781526001600160a01b03808d16606087019081526080870186815260a088018781528a88526019875289882098518955945160018981019190915593516002890155905160039097018054915194511515600160a81b0260ff60a81b19951515600160a01b026001600160a81b0319909316988416989098179190911793909316959095179091558451630134c3db60e51b81529451950194928716936326987b6093600480830194919283900301908290875af1158015613f9a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613fbe9190615710565b613fc8908661574b565b8110613eb9576040516340c10f1960e01b81526001600160a01b038781166004830152602482018790528416906340c10f1990604401600060405180830381600087803b15801561401857600080fd5b505af115801561402c573d6000803e3d6000fd5b505060125460135460145491935061404592509061574b565b61404f919061574b565b836001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561408d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140b19190615710565b106140d457600d80546003919062ff0000191662010000835b02179055506141e2565b6012546013546140e4919061574b565b836001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015614122573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141469190615710565b1061416357600d80546002919062ff0000191662010000836140ca565b600e60040154836001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156141a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141cb9190615710565b106141e257600d805462ff00001916620100001790555b336000908152601a60205260409020546142355760006142023387614d96565b336000818152601a60209081526040808320859055938252601b90529190912080546001600160a01b0319169091179055505b831561431c57614244846132ff565b6142885760405162461bcd60e51b8152602060048201526015602482015274494e56414c494420524546455252414c20434f444560581b6044820152606401611442565b6000848152601b602052604090819020549051638e9b277d60e01b81526001600160a01b0391821660048201819052917f000000000000000000000000c99365816bbbe19123e15a36dd3309ac0441d8bc9190821690638e9b277d90602401600060405180830381600087803b15801561430157600080fd5b505af1158015614315573d6000803e3d6000fd5b5050505050505b6143253461491a565b7f46f317c500150db0b1e1358b3f5a7ca75e9e9149c9cc09bb33800bebed251d1a868287604051612a4f93929190615763565b600354600d546001600160a01b03909116907f000000000000000000000000c99365816bbbe19123e15a36dd3309ac0441d8bc9060ff16156143ac5760405162461bcd60e51b815260040161144290615984565b60165460ff6101009091041615156001146143fb5760405162461bcd60e51b815260206004820152600f60248201526e2922a32aa722102727aa1027a822a760891b6044820152606401611442565b8260008167ffffffffffffffff8111156144175761441761512d565b604051908082528060200260200182016040528015614440578160200160208202803683370190505b50905060005b8581101561460757600087878381811061446257614462615a0e565b905060200201359050336001600160a01b0316866001600160a01b0316636352211e836040518263ffffffff1660e01b81526004016144a391815260200190565b602060405180830381865afa1580156144c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144e49190615788565b6001600160a01b031614156145f457600554604051630852cd8d60e31b8152600481018390526001600160a01b038816906342966c6890602401600060405180830381600087803b15801561453857600080fd5b505af115801561454c573d6000803e3d6000fd5b505050600083815260186020526040808220918255600190910180546001600160a81b031916905551635db20cb360e01b8152336004820152602481018390526001600160a01b0388169150635db20cb390604401600060405180830381600087803b1580156145bb57600080fd5b505af11580156145cf573d6000803e3d6000fd5b50505050818484815181106145e6576145e6615a0e565b602002602001018181525050505b50806145ff816157a5565b915050614446565b507f4784ac7c4ae7a1a7b199148d69994201d4c3c04e388c38b86febb1424a779aa63382600554604051612a4f93929190615a24565b600080516020615b44833981519152614655816146d3565b816001141561466857600e83905561469d565b816002141561467b57600f83905561469d565b816003141561468e57601083905561469d565b816004141561469d5760118390555b60408051838152602081018590527ff68b6199a6c7e5df3005a4142808bc836237ab35986a197b454750d532b568069101611e3f565b6146dd8133614def565b50565b6118e882825b6146f08282612f8c565b6118e8576000828152602081815260408083206001600160a01b03851684529091529020805460ff191660011790556147263390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6147748282612f8c565b156118e8576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6000826147dc8584614e53565b14949350505050565b600b80549082905560408051838152602081018390527f0a65a2e4b472c0dc0a4ddb3f4556f0c8ad844d7258c295eb94f7abbf4bea20849101611661565b60008181526019602052604090206003810154600160a01b900460ff1615156001146148855760405162461bcd60e51b81526020600482015260116024820152702727a71022ac2824a922a2102a27a5a2a760791b6044820152606401611442565b80600101544210156148d95760405162461bcd60e51b815260206004820152601b60248201527f52454e4557414c20444154454c494e45204e4f542050415353454400000000006044820152606401611442565b600880546001019081905560408051918252602082018490527f4053e12081b3855cd0fe8634bd7a50b80121749a9ab43be4e8724b7ca46d724a9101611661565b6000614924612ef6565b9050600081600b54670de0b6b3a764000061493f9190615650565b6149499190615685565b9050807f000000000000000000000000c99365816bbbe19123e15a36dd3309ac0441d8bc6001600160a01b0316311115614abb5760006149b3826001600160a01b037f000000000000000000000000c99365816bbbe19123e15a36dd3309ac0441d8bc16316159f7565b600254604051635db20cb360e01b81526001600160a01b039182166004820152602481018390529192507f000000000000000000000000c99365816bbbe19123e15a36dd3309ac0441d8bc9190821690635db20cb390604401600060405180830381600087803b158015614a2657600080fd5b505af1158015614a3a573d6000803e3d6000fd5b5050600254604051600093506001600160a01b03909116915087908381818185875af1925050503d8060008114614a8d576040519150601f19603f3d011682016040523d82523d6000602084013e614a92565b606091505b5050905080614ab35760405162461bcd60e51b8152600401611442906157f7565b505050505050565b807f000000000000000000000000c99365816bbbe19123e15a36dd3309ac0441d8bc6001600160a01b0316311415614b66576002546040516000916001600160a01b03169085908381818185875af1925050503d8060008114614b3a576040519150601f19603f3d011682016040523d82523d6000602084013e614b3f565b606091505b5050905080614b605760405162461bcd60e51b8152600401611442906157f7565b50505050565b80614b9b846001600160a01b037f000000000000000000000000c99365816bbbe19123e15a36dd3309ac0441d8bc163161574b565b1115614cef576000614bd76001600160a01b037f000000000000000000000000c99365816bbbe19123e15a36dd3309ac0441d8bc1631836159f7565b90506000614be582866159f7565b905060007f000000000000000000000000c99365816bbbe19123e15a36dd3309ac0441d8bc6001600160a01b03168360405160006040518083038185875af1925050503d8060008114614c54576040519150601f19603f3d011682016040523d82523d6000602084013e614c59565b606091505b5050905080614c7a5760405162461bcd60e51b8152600401611442906157f7565b6002546040516001600160a01b03909116908390600081818185875af1925050503d8060008114614cc7576040519150601f19603f3d011682016040523d82523d6000602084013e614ccc565b606091505b50508091505080614ab35760405162461bcd60e51b8152600401611442906157f7565b80614d24846001600160a01b037f000000000000000000000000c99365816bbbe19123e15a36dd3309ac0441d8bc163161574b565b116118695760007f000000000000000000000000c99365816bbbe19123e15a36dd3309ac0441d8bc6001600160a01b03168460405160006040518083038185875af1925050503d8060008114614b3a576040519150601f19603f3d011682016040523d82523d6000602084013e614b3f565b604080516001600160a01b0384166020820152908101829052426060820152600090819060800160408051601f19818403018152919052805160209091012090506000614de66298968083615a83565b95945050505050565b614df98282612f8c565b6118e857614e11816001600160a01b03166014614ec7565b614e1c836020614ec7565b604051602001614e2d929190615a97565b60408051601f198184030181529082905262461bcd60e51b82526114429160040161588f565b600081815b8451811015614ebf576000858281518110614e7557614e75615a0e565b60200260200101519050808311614e9b5760008381526020829052604090209250614eac565b600081815260208490526040902092505b5080614eb7816157a5565b915050614e58565b509392505050565b60606000614ed6836002615650565b614ee190600261574b565b67ffffffffffffffff811115614ef957614ef961512d565b6040519080825280601f01601f191660200182016040528015614f23576020820181803683370190505b509050600360fc1b81600081518110614f3e57614f3e615a0e565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110614f6d57614f6d615a0e565b60200101906001600160f81b031916908160001a9053506000614f91846002615650565b614f9c90600161574b565b90505b6001811115615014576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110614fd057614fd0615a0e565b1a60f81b828281518110614fe657614fe6615a0e565b60200101906001600160f81b031916908160001a90535060049490941c9361500d81615b0c565b9050614f9f565b5083156150635760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401611442565b9392505050565b828054615076906156db565b90600052602060002090601f01602090048101928261509857600085556150de565b82601f106150b157805160ff19168380011785556150de565b828001600101855582156150de579182015b828111156150de5782518255916020019190600101906150c3565b506150ea9291506150ee565b5090565b5b808211156150ea57600081556001016150ef565b60006020828403121561511557600080fd5b81356001600160e01b03198116811461506357600080fd5b634e487b7160e01b600052604160045260246000fd5b600082601f83011261515457600080fd5b813567ffffffffffffffff8082111561516f5761516f61512d565b604051601f8301601f19908116603f011681019082821181831017156151975761519761512d565b816040528381528660208588010111156151b057600080fd5b836020870160208301376000602085830101528094505050505092915050565b6001600160a01b03811681146146dd57600080fd5b6000806000606084860312156151fa57600080fd5b833567ffffffffffffffff8082111561521257600080fd5b61521e87838801615143565b9450602086013591508082111561523457600080fd5b5061524186828701615143565b9250506040840135615252816151d0565b809150509250925092565b6000806040838503121561527057600080fd5b823567ffffffffffffffff81111561528757600080fd5b61529385828601615143565b95602094909401359450505050565b6000602082840312156152b457600080fd5b8135615063816151d0565b6000602082840312156152d157600080fd5b5035919050565b6000602082840312156152ea57600080fd5b813567ffffffffffffffff81111561530157600080fd5b611ae884828501615143565b60005b83811015615328578181015183820152602001615310565b83811115614b605750506000910152565b6000815180845261535181602086016020860161530d565b601f01601f19169290920160200192915050565b60208152600082516080602084015261538160a0840182615339565b90506020840151601f1984830301604085015261539e8282615339565b60408601516001600160a01b0316606086810191909152909501511515608090940193909352509192915050565b600080604083850312156153df57600080fd5b8235915060208301356153f1816151d0565b809150509250929050565b60008083601f84011261540e57600080fd5b50813567ffffffffffffffff81111561542657600080fd5b6020830191508360208260051b850101111561544157600080fd5b9250929050565b6000806000806060858703121561545e57600080fd5b8435615469816151d0565b9350602085013567ffffffffffffffff81111561548557600080fd5b615491878288016153fc565b9598909750949560400135949350505050565b600080604083850312156154b757600080fd5b82356154c2816151d0565b946020939093013593505050565b6000806000604084860312156154e557600080fd5b83356154f0816151d0565b9250602084013567ffffffffffffffff81111561550c57600080fd5b615518868287016153fc565b9497909650939450505050565b634e487b7160e01b600052602160045260246000fd5b602081016004831061555d57634e487b7160e01b600052602160045260246000fd5b91905290565b60006020828403121561557557600080fd5b8135801515811461506357600080fd5b6000806040838503121561559857600080fd5b50508035926020909101359150565b6000806000606084860312156155bc57600080fd5b83356155c7816151d0565b95602085013595506040909401359392505050565b600080602083850312156155ef57600080fd5b823567ffffffffffffffff81111561560657600080fd5b615612858286016153fc565b90969095509350505050565b6000825161563081846020870161530d565b9190910192915050565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161561566a5761566a61563a565b500290565b634e487b7160e01b600052601260045260246000fd5b6000826156945761569461566f565b500490565b6080815260006156ac6080830187615339565b82810360208401526156be8187615339565b6001600160a01b0395909516604084015250506060015292915050565b600181811c908216806156ef57607f821691505b6020821081141561332e57634e487b7160e01b600052602260045260246000fd5b60006020828403121561572257600080fd5b5051919050565b60408152600061573c6040830185615339565b90508260208301529392505050565b6000821982111561575e5761575e61563a565b500190565b6001600160a01b03939093168352602083019190915261ffff16604082015260600190565b60006020828403121561579a57600080fd5b8151615063816151d0565b60006000198214156157b9576157b961563a565b5060010190565b6020808252601a908201527f494e53554646494349454e54204d494e54494e472056414c5545000000000000604082015260600190565b60208082526018908201527f4d494e543a455448205452414e53464552204641494c45440000000000000000604082015260600190565b6020808252600a90820152691253959053125108125160b21b604082015260600190565b74023b2b732b9b4b990233630b39030b63932b0b23c9605d1b81526000825161588281601585016020870161530d565b9190910160150192915050565b6020815260006150636020830184615339565b805169ffffffffffffffffffff811681146158bc57600080fd5b919050565b600080600080600060a086880312156158d957600080fd5b6158e2866158a2565b9450602086015193506040860151925060608601519150615905608087016158a2565b90509295509295909350565b6000826159205761592061566f565b600160ff1b82146000198414161561593a5761593a61563a565b500590565b7f537562736372697074696f6e20466c616720616c72656164792000000000000081526000825161597781601a85016020870161530d565b91909101601a0192915050565b60208082526017908201527f47454e45534953204d494e54205354494c4c204f50454e000000000000000000604082015260600190565b7302932b33ab73210233630b39030b63932b0b23c960651b8152600082516159ea81601485016020870161530d565b9190910160140192915050565b600082821015615a0957615a0961563a565b500390565b634e487b7160e01b600052603260045260246000fd5b6001600160a01b038416815260606020808301829052845191830182905260009185820191906080850190845b81811015615a6d57845183529383019391830191600101615a51565b5050809350505050826040830152949350505050565b600082615a9257615a9261566f565b500690565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351615acf81601785016020880161530d565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351615b0081602884016020880161530d565b01602801949350505050565b600081615b1b57615b1b61563a565b50600019019056fed8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e63a49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775a2646970667358221220a50a3849f9920f4b0ae0f6e1fdf952cb4d84f98f4a401926bb7daa7fc31525c364736f6c634300080b0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000006fcea20172299c6a1a07ea1730b5a6600321b15f000000000000000000000000fefc20ba3d59431044b9f4a943b132cd99235b1c000000000000000000000000c99365816bbbe19123e15a36dd3309ac0441d8bc000000000000000000000000168fe4ebf3ba698d60b5b5f9189fc2d3bece22170000000000000000000000005f4ec3df9cbd43714fe2740f5e3616155c5b841900000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000003000000000000000000000000168fe4ebf3ba698d60b5b5f9189fc2d3bece2217000000000000000000000000ecff2245b01cc32d32b466631c052249c953ad8c000000000000000000000000b93081bdab3d54736caae7f3bb09e7bcddd26fed
-----Decoded View---------------
Arg [0] : _genesis (address): 0x6fceA20172299C6A1A07Ea1730B5a6600321B15f
Arg [1] : _subscription (address): 0xFefc20bA3d59431044b9F4a943B132cD99235b1C
Arg [2] : _treasury (address): 0xc99365816bBbe19123E15A36dd3309Ac0441D8bC
Arg [3] : _cap3Wallet (address): 0x168FE4EBf3ba698d60b5B5f9189Fc2d3beCE2217
Arg [4] : _priceFeedAggregator (address): 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419
Arg [5] : _admins (address[]): 0x168FE4EBf3ba698d60b5B5f9189Fc2d3beCE2217,0xecfF2245B01cc32D32B466631c052249C953AD8c,0xB93081bdaB3D54736CaAE7F3BB09e7bcDdD26fed
-----Encoded View---------------
10 Constructor Arguments found :
Arg [0] : 0000000000000000000000006fcea20172299c6a1a07ea1730b5a6600321b15f
Arg [1] : 000000000000000000000000fefc20ba3d59431044b9f4a943b132cd99235b1c
Arg [2] : 000000000000000000000000c99365816bbbe19123e15a36dd3309ac0441d8bc
Arg [3] : 000000000000000000000000168fe4ebf3ba698d60b5b5f9189fc2d3bece2217
Arg [4] : 0000000000000000000000005f4ec3df9cbd43714fe2740f5e3616155c5b8419
Arg [5] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [7] : 000000000000000000000000168fe4ebf3ba698d60b5b5f9189fc2d3bece2217
Arg [8] : 000000000000000000000000ecff2245b01cc32d32b466631c052249c953ad8c
Arg [9] : 000000000000000000000000b93081bdab3d54736caae7f3bb09e7bcddd26fed
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ 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.