More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 1,291 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Withdraw | 16349327 | 737 days ago | IN | 0 ETH | 0.0021841 | ||||
Transfer | 15280122 | 891 days ago | IN | 0.01656 ETH | 0.00021984 | ||||
Transfer | 15278560 | 891 days ago | IN | 0.0124 ETH | 0.00043347 | ||||
Transfer | 14560092 | 1007 days ago | IN | 0.02 ETH | 0.00106526 | ||||
Transfer | 14525389 | 1013 days ago | IN | 0.02 ETH | 0.00115942 | ||||
Transfer | 14414687 | 1030 days ago | IN | 0.023196 ETH | 0.00050458 | ||||
Transfer | 14339728 | 1042 days ago | IN | 0.0328 ETH | 0.00061759 | ||||
Transfer | 14159575 | 1070 days ago | IN | 0.02516 ETH | 0.00237769 | ||||
Transfer | 13929585 | 1105 days ago | IN | 0.027272 ETH | 0.00160014 | ||||
Transfer | 13763746 | 1131 days ago | IN | 0.0172 ETH | 0.00148875 | ||||
Transfer | 13664523 | 1147 days ago | IN | 0.026 ETH | 0.0025515 | ||||
Transfer | 13575814 | 1161 days ago | IN | 0.024 ETH | 0.00220102 | ||||
Transfer | 13517766 | 1170 days ago | IN | 0.081 ETH | 0.00274906 | ||||
Transfer | 13491286 | 1174 days ago | IN | 0.032 ETH | 0.00218972 | ||||
Transfer | 13487258 | 1175 days ago | IN | 0.0248 ETH | 0.00166469 | ||||
Withdraw | 13460378 | 1179 days ago | IN | 0 ETH | 0.00490625 | ||||
Set New Main Don... | 13460366 | 1179 days ago | IN | 0 ETH | 0.0018661 | ||||
Add Donation Rec... | 13460365 | 1179 days ago | IN | 0 ETH | 0.00438023 | ||||
Remove Donation ... | 13460363 | 1179 days ago | IN | 0 ETH | 0.00243744 | ||||
Transfer | 13403210 | 1188 days ago | IN | 0.346 ETH | 0.0016844 | ||||
Transfer | 13397713 | 1189 days ago | IN | 0.0892 ETH | 0.00167089 | ||||
Transfer | 13358918 | 1195 days ago | IN | 0.185996 ETH | 0.00174756 | ||||
Transfer | 13316958 | 1201 days ago | IN | 0.027 ETH | 0.00119691 | ||||
Transfer | 13281463 | 1207 days ago | IN | 0.034 ETH | 0.00088416 | ||||
Transfer | 13281351 | 1207 days ago | IN | 0.0348 ETH | 0.00083742 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
21135777 | 66 days ago | 0.00205348 ETH | ||||
21135757 | 66 days ago | 0.0036 ETH | ||||
16590116 | 703 days ago | 0.005 ETH | ||||
16373923 | 733 days ago | 0.00504 ETH | ||||
16349327 | 737 days ago | 0.3188064 ETH | ||||
16349327 | 737 days ago | 0.0132836 ETH | ||||
16349327 | 737 days ago | 0.0132836 ETH | ||||
16349327 | 737 days ago | 0.0132836 ETH | ||||
16349327 | 737 days ago | 0.0398508 ETH | ||||
15917703 | 797 days ago | 0.0036 ETH | ||||
15881769 | 802 days ago | 0.00096 ETH | ||||
15764321 | 818 days ago | 0.00156 ETH | ||||
15594397 | 842 days ago | 0.006 ETH | ||||
15508432 | 855 days ago | 0.002 ETH | ||||
15508429 | 855 days ago | 0.002 ETH | ||||
13460378 | 1179 days ago | 15.42430743 ETH | ||||
13460378 | 1179 days ago | 0.64267947 ETH | ||||
13460378 | 1179 days ago | 0.64267947 ETH | ||||
13460378 | 1179 days ago | 0.64267947 ETH | ||||
13460378 | 1179 days ago | 1.92803842 ETH | ||||
13004266 | 1250 days ago | 84.07982923 ETH | ||||
13004266 | 1250 days ago | 3.50332621 ETH | ||||
13004266 | 1250 days ago | 3.50332621 ETH | ||||
13004266 | 1250 days ago | 3.50332621 ETH | ||||
13004266 | 1250 days ago | 10.50997865 ETH |
Loading...
Loading
Contract Name:
Sower
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity Standard Json-Input format)
//SPDX-License-Identifier: MIT pragma solidity ^0.8.0; // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@/@%,,,,,,,@#,@@@@@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&/%,,**,***,*,,,*(#@@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*%*,,**********,,/%%@@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#@*,************,/@(@@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(@(,**,********,/@/@@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@,%,,**********,,#*@@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.%,,*********,*&(@@@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&*(#(,,******,,,,,&/@@@@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&,&@#,,,*****,***,*%,@@@@@@@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&,(***,******************,%&&/&@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#@*,**************************,/&(#@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@,%*******************************,*,#,/@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@@@@@@@@@@#&***************************************#%*#@@@@@@@@ // @@@@@@@@@@@@@@@@@@@@@@@@@@*&*******************************************/%(%%%((@ // @@@@@@@@@@@@@@@@@@@@@@@@ %*****************************************************# // @@@@@@@@@@@@@@@@@@@@@&(%*************************************/&@(*************** // @@@@@@@@@@@@@@@@@@@#%%/***********%(#************************(//(((************# // @@@@@@@@@@@@@@@@@@/(************@#&&#/***************************************//% // @@@@@@@@@@@@@@@@#@**********&###@@@@&#&*************************************#/@@ // @@@@@@@@@@@@@@/%**********,%%@@@@@@@@*&************************************/#&@@ // @@@@@@@@@@@@%#/********/(#@@@@@@@@@@@@@(@%********************************&,@@@@ // @@@@@%#%####*********#(#@@@@@@@@@@@@@@@#@(******************************%&#@@@@@ // @@(@%/************@#@@@@@@@@@@@@@@@@@@@%@********************&*******@%,@@@@@@@@ // @/&//*////////*(@/@@@@@@@@@@@@@@@@@@@@&#/*////////////////**@%%(///%@@@@@@@@@@@@ // %(&/////////**%(&@@@@@@@@@@@@@@@@@@@@@(#//////////////////*/@*@@@@@@@@@@@@@@@@@@ // @@@*@@*//*#@&#@@@@@@@@@@@@@@@@@@@@@@@*@#*/////////////////*%@/@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@/#///////////////////%(%@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&/%///////////////////@##@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@/#///////////////////(@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@/#///////////////////%,@@@@@@@@@@@@@@@@ // @@@@@,@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(&#////////////////////@/@@@@@@@@@@@@@@@ // @@@,@@@@@@@,@@@@@@@@@@@@@@@@@@@@@@@@@@@@*&//////////////////////&%@@@@@@@@@@@@@@ // @@@@,@@@,@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%#&//////////////////////(&(@@@@@@@@@@@@@@ // @@@@@@@@@,@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(@*///////////////////////%/#@@@@@@@@@@ // @@@@@@,@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*@(/////////////////////////&&&@@@@@@@@@ // @@@,@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*@(////////////%%/////////////%(@@@@@@@@@ // @@@@@,@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&#(/////////////&/@#////////////(&*@@@@@@@@ // @@@@@@@,@@@@@@@@@@@@@@@@@@@@@@@@@@@@(@(((((((((((//#%&@#&/((((((((((((&*@@@@@@@@ // @@@@,@@@@,@@@@@@@@@@@@@@@@@@@@@@@@@%@((((((((((((#(%@@@@(@((((((((((((&/@@@@@@@@ // @@,@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@##((((((((((((&&@@@@#&@((((((((((((&,@@@@@@@@ // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(@%(((((((((((&/@@@@@@@(@((((((((((((&@&@@@@@@@ // @@@@@,@@@@@@@@@@@@@@@@@@@@@@@@@@@%(#(#########(%%@@@@@@@@@#&(#########(&@@@@@@@@ // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%###########@%%@@@@@@@@@/@%##########&/@@@@@@@@ // @@,@@@@@@@@@@@@@@@@@@@@@@@@@@@@/&##########%&#@@@@@@@@@@@/@%###########@#@@@@@@@ // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@&&%%%%%%%%%%%@#@@@@@@@@@@@@@&%%%%%%%%%%%%@@#@@@@@@@ // @@@@@@@@@@@@@@@@@@@@@@@@@@@@&%&%%%%%%%%%%&&#@@@@@@@@@@@@@@&@%%%%%%%%%%%@%@@@@@@@ // @@@@@@@@@@@@@@@@@@@@@@@@@@@@/@%%%%%%%%%%%%@#@@@@@@@@@@@@@@%@%%%%%%%%%%%&%@@@@@@@ // @@@@@@@@@@@@@@@@@@@@@@@@@@@@/@%%%%%%%%%%%%%&@/%@@@@@@@@@@@@@%%%%%%%%%%%%%@#@@@@@ // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&&&@@%&%%%%%%%%%%%@@&@@@@@@@@@%%%%%%%%%%%%%%%&@@#( // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&&&%%%%%%%%%%&&%@@@@@@&@%%%%%%%%%%%%%%%%%%%% // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@##%#@@@@#@@@@@@@@@@@@@@@@@@@#%%%%%%%%%%% import '@openzeppelin/contracts/utils/structs/EnumerableSet.sol'; import '@openzeppelin/contracts/security/ReentrancyGuard.sol'; import '@openzeppelin/contracts/access/Ownable.sol'; import './Variety/IVariety.sol'; import './EarlyBirdRegistry/IEarlyBirdRegistry.sol'; /// @title Sower /// @author Simon Fremaux (@dievardump) contract Sower is Ownable, ReentrancyGuard { using EnumerableSet for EnumerableSet.AddressSet; using EnumerableSet for EnumerableSet.UintSet; event Collected( address indexed operator, address indexed variety, uint256 indexed count, uint256 value ); event EarlyBirdSessionAdded(uint256 sessionId, uint256 projectId); event EarlyBirdSessionRemoved(uint256 sessionId, uint256 projectId); event VarietyAdded(address variety); event VarietyChanged(address variety); event VarietyEmpty(address variety); event DonationRecipientAdded(address recipient); event DonationRecipientRemoved(address recipient); struct VarietyData { uint8 maxPerCollect; // how many can be collected at once. 0 == no limit bool active; // if Variety is active or not bool curated; // curated Varieties can only be minted by Variety creator address location; // address of the Variety contract address creator; // creator of the variety (in case the contract opens to more creators) uint256 price; // price of collecting uint256 available; // how many are available uint256 reserve; // how many are reserve for creator uint256 earlyBirdUntil; // earlyBird limit timestamp uint256 earlyBirdSessionId; // earlyBirdSessionId } // main donation, we start with nfDAO address public mainDonation = 0x37133cda1941449cde7128f0C964C228F94844a8; // Varieties list mapping(address => VarietyData) public varieties; // list of known varieties address EnumerableSet.AddressSet internal knownVarieties; // list of address to whom I would like to donate EnumerableSet.AddressSet internal donations; // last generated seed bytes32 public lastSeed; // address who used their EarlyBird access mapping(uint256 => mapping(address => bool)) internal _earlyBirdsConsumed; // the early bird registry address public earlyBirdRegistry; // because I messed up the EarlyBird registration before the launch // I have to use EarlyBirdSession containing one or more EarlyBirgProjectID. mapping(uint256 => EnumerableSet.UintSet) internal earlyBirdSessions; constructor() { // Gitcoin Gnosis _addDonationRecipient(0xde21F729137C5Af1b01d73aF1dC21eFfa2B8a0d6); // WOCA _addDonationRecipient(0xCCa88b952976DA313Fb928111f2D5c390eE0D723); // Hardhat deploy / Jolly Roger _addDonationRecipient(0xF0D7a8198D75e10517f035CF11b928e9E2aB20f4); } /// @notice Allows collector to collect up to varietyData.maxPerCollect tokens from variety. /// @param count the number of tokens to collect /// @param variety the variety to collect from function plant(uint256 count, address variety) external payable nonReentrant { require(count > 0, '!count'); VarietyData storage varietyData = _getVariety(variety); // curated varieties have to be created in a specific way, with the seed, only by creator require(varietyData.curated == false, "Can't plant this Variety."); // varieties can be paused or out of stock require(varietyData.active == true, 'Variety paused or out of seeds.'); // if we are in an earlyBird phase if (varietyData.earlyBirdUntil >= block.timestamp) { require( isUserInEarlyBirdSession( msg.sender, varietyData.earlyBirdSessionId ), 'Not registered for EarlyBirds' ); require( _earlyBirdsConsumed[varietyData.earlyBirdSessionId][ msg.sender ] == false, 'Already used your EarlyBird' ); // set early bird as consumed _earlyBirdsConsumed[varietyData.earlyBirdSessionId][ msg.sender ] = true; require(count == 1, 'Early bird can only grab one'); } require( // verifies that there are enough tokens available for this variety (varietyData.available - varietyData.reserve) >= count && // and that the user doesn't request more than what is allowed in one tx (varietyData.maxPerCollect == 0 || uint256(varietyData.maxPerCollect) >= count), 'Too many requested.' ); address operator = msg.sender; require(msg.value == varietyData.price * count, 'Value error.'); _plant(varietyData, count, operator); } /// @notice Owner function to be able to get varieties from the reserve /// @param count how many the owner wants /// @param variety from what variety /// @param recipient might be a giveaway? recipient can be someone else than owner function plantFromReserve( uint256 count, address variety, address recipient ) external { require(count > 0, '!count'); VarietyData storage varietyData = _getVariety(variety); // curated varieties have to be created in a specific way, with the seed, only by creator require(varietyData.curated == false, "Can't plant this Variety."); // verify that caller is the variety creator // or there is no variety creator and the caller is current owner require( msg.sender == varietyData.creator || (varietyData.creator == address(0) && msg.sender == owner()), 'Not Variety creator.' ); require( varietyData.reserve >= count && varietyData.available >= count, 'Not enough reserve.' ); varietyData.reserve -= count; if (recipient == address(0)) { recipient = msg.sender; } _plant(varietyData, count, recipient); } /// @notice Some Varieties can not generate aesthetic output with random seeds. /// Those are "curated Varieties" that only the creator can mint from with curated seeds /// The resulting Seedlings will probably be gifted or sold directly on Marketplaces /// (direct sale or auction) /// @param variety the variety to create from /// @param recipient the recipient of the creation /// @param seeds the seeds to create function plantFromCurated( address variety, address recipient, bytes32[] memory seeds ) external { require(seeds.length > 0, '!count'); VarietyData storage varietyData = _getVariety(variety); // verify this variety is indeed a curated one require(varietyData.curated == true, 'Variety not curated.'); // verify that caller is the variety creator // or there is no variety creator and the caller is current owner require( msg.sender == varietyData.creator || (varietyData.creator == address(0) && msg.sender == owner()), 'Not Variety creator.' ); if (recipient == address(0)) { recipient = msg.sender; } _plantSeeds(varietyData, recipient, seeds); } /// @notice Helper to list all Varieties /// @return list of varieties function listVarieties() external view returns (VarietyData[] memory list) { uint256 count = knownVarieties.length(); list = new VarietyData[](count); for (uint256 i; i < count; i++) { list[i] = varieties[knownVarieties.at(i)]; } } /// @notice Adds a new variety to the list /// @param newVariety the variety to be added /// @param price the collection cost /// @param maxPerCollect how many can be collected at once; 0 == no limit /// @param active if the variety is active or not /// @param creator variety creator /// @param available variety supply /// @param reserve variety reserve for variety creator /// @param curated if the variety is curated; if yes only creator can mint from it function addVariety( address newVariety, uint256 price, uint8 maxPerCollect, bool active, address creator, uint256 available, uint256 reserve, bool curated ) external onlyOwner { require( !knownVarieties.contains(newVariety), 'Variety already exists.' ); knownVarieties.add(newVariety); varieties[newVariety] = VarietyData({ maxPerCollect: maxPerCollect, price: price, active: active, creator: creator, location: newVariety, available: available, reserve: reserve, curated: curated, earlyBirdUntil: 0, earlyBirdSessionId: 0 }); emit VarietyAdded(newVariety); } /// @notice Allows to toggle a variety active state /// @param variety the variety address /// @param isActive if active or not function setActive(address variety, bool isActive) public onlyOwner { VarietyData storage varietyData = _getVariety(variety); require( !isActive || varietyData.available > 0, "Can't activate empty variety." ); varietyData.active = isActive; emit VarietyChanged(variety); } /// @notice Allows to change the max per collect for a variety /// @param variety the variety address /// @param maxPerCollect new max per collect function setMaxPerCollect(address variety, uint8 maxPerCollect) external onlyOwner { VarietyData storage varietyData = _getVariety(variety); varietyData.maxPerCollect = maxPerCollect; emit VarietyChanged(variety); } /// @notice activate EarlyBird for a Variety. /// When earlyBird, only registered address can plant /// @param varieties_ the varieties address /// @param earlyBirdDuration duration of Early Bird from now on /// @param earlyBirdSessionId the session id containing projects to check on the EarlyBirdRegistry /// @param activateVariety if the variety must be automatically activated (meaning early bird starts now) function activateEarlyBird( address[] memory varieties_, uint256 earlyBirdDuration, uint256 earlyBirdSessionId, bool activateVariety ) external onlyOwner { require( earlyBirdSessions[earlyBirdSessionId].length() > 0, 'Session id empty' ); for (uint256 i; i < varieties_.length; i++) { VarietyData storage varietyData = _getVariety(varieties_[i]); varietyData.earlyBirdUntil = block.timestamp + earlyBirdDuration; varietyData.earlyBirdSessionId = earlyBirdSessionId; if (activateVariety) { setActive(varieties_[i], true); } else { emit VarietyChanged(varieties_[i]); } } } /// @notice sets early bird registry /// @param earlyBirdRegistry_ the registry function setEarlyBirdRegistry(address earlyBirdRegistry_) external onlyOwner { require(earlyBirdRegistry_ != address(0), 'Wrong address.'); earlyBirdRegistry = earlyBirdRegistry_; } /// @notice Allows to add an early bird project id to an "early bird session" /// @dev an early bird session is a group of early bird registrations projects /// @param sessionId the session to add to /// @param projectIds the projectIds (containing registration in EarlyBirdRegistry) to add function addEarlyBirdProjectToSession( uint256 sessionId, uint256[] memory projectIds ) external onlyOwner { require(sessionId > 0, "Session can't be 0"); for (uint256 i; i < projectIds.length; i++) { require( IEarlyBirdRegistry(earlyBirdRegistry).exists(projectIds[i]), 'Unknown early bird project' ); earlyBirdSessions[sessionId].add(projectIds[i]); emit EarlyBirdSessionAdded(sessionId, projectIds[i]); } } /// @notice Allows to remove an early bird project id from an "early bird session" /// @dev an early bird session is a group of early bird registrations projects /// @param sessionId the session to remove from /// @param projectIds the projectIds (containing registration in EarlyBirdRegistry) to remove function removeEarlyBirdProjectFromSession( uint256 sessionId, uint256[] memory projectIds ) external onlyOwner { require(sessionId > 0, "Session can't be 0"); for (uint256 i; i < projectIds.length; i++) { earlyBirdSessions[sessionId].remove(projectIds[i]); emit EarlyBirdSessionRemoved(sessionId, projectIds[i]); } } /// @notice Helper to know if a user is in any of the early bird list for current session /// @param user the user to test /// @param sessionId the session to test for /// @return if the user is registered or not function isUserInEarlyBirdSession(address user, uint256 sessionId) public view returns (bool) { // get all earlyBirdIds attached to the earlyBirdSession EnumerableSet.UintSet storage session = earlyBirdSessions[sessionId]; uint256 count = session.length(); for (uint256 i; i < count; i++) { // if the address is registered to any of those projectId if ( IEarlyBirdRegistry(earlyBirdRegistry).isRegistered( user, session.at(i) ) ) { return true; } } // else it's not an early bird return false; } /// @notice Helper to list all donation recipients /// @return list of donation recipients function listDonations() external view returns (address[] memory list) { uint256 count = donations.length(); list = new address[](count); for (uint256 i; i < count; i++) { list[i] = donations.at(i); } } /// @notice Allows to add a donation recipient /// @param recipient the recipient function addDonationRecipient(address recipient) external onlyOwner { _addDonationRecipient(recipient); } /// @notice Allows to remove a donation recipient /// @param recipient the recipient function removeDonationRecipient(address recipient) external onlyOwner { _removeDonationRecipient(recipient); } /// @notice Set mainDonation donation address /// @param newMainDonation the new address function setNewMainDonation(address newMainDonation) external onlyOwner { mainDonation = newMainDonation; } /// @notice This function allows Sower to answer to a seed change request /// in the event where a seed would produce errors of rendering /// 1) this function can only be called by Sower if the token owner /// asked for a new seed (see Variety contract) /// 2) this function will only be called if there is a rendering error /// @param tokenId the tokenId that needs update function updateTokenSeed(address variety, uint256 tokenId) external onlyOwner { require(knownVarieties.contains(variety), 'Unknown variety.'); IVariety(variety).changeSeedAfterRequest(tokenId); } /// @dev Owner withdraw balance function function withdraw() external onlyOwner { require(address(this).balance > 0, "I don't think so."); uint256 count = donations.length(); // forces mainDonation and donations to not be empty // Code is law. require( mainDonation != address(0) && count > 0, 'You have to give in order to get.' ); bool success; // 10% of current balance uint256 ten = address(this).balance / 10; // send 10% to mainDonation address (success, ) = mainDonation.call{value: ten}(''); require(success, '!success'); // share 10% between all other donation recipients uint256 parts = ten / count; for (uint256 i; i < count; i++) { (success, ) = donations.at(i).call{value: parts}(''); require(success, '!success'); } // send the rest to sender; use call since it might be a contract someday (success, ) = msg.sender.call{value: address(this).balance}(''); require(success, '!success'); } /// @dev Receive function for royalties receive() external payable {} /// @dev Internal collection method /// @param varietyData the varietyData /// @param count how many to collect /// @param operator Seedlings recipient function _plant( VarietyData storage varietyData, uint256 count, address operator ) internal { bytes32 seed = lastSeed; bytes32[] memory seeds = new bytes32[](count); bytes32 blockHash = blockhash(block.number - 1); uint256 timestamp = block.timestamp; // generate next seeds for (uint256 i; i < count; i++) { seed = _nextSeed(seed, timestamp, operator, blockHash); seeds[i] = seed; } // saves lastSeed before planting lastSeed = seed; _plantSeeds(varietyData, operator, seeds); } /// @dev Allows to plant a list of seeds /// @param varietyData the variety data /// @param collector the recipient of the Seedling /// @param seeds the seeds to plant function _plantSeeds( VarietyData storage varietyData, address collector, bytes32[] memory seeds ) internal { IVariety(varietyData.location).plant(collector, seeds); uint256 count = seeds.length; varietyData.available -= count; if (varietyData.available == 0) { varietyData.active = false; emit VarietyEmpty(varietyData.location); } emit Collected(collector, varietyData.location, count, msg.value); // if Variety has a creator that is not contract owner, send them the value directly if ( varietyData.creator != address(0) && msg.value > 0 && varietyData.creator != owner() ) { (bool success, ) = varietyData.creator.call{value: msg.value}(''); require(success, '!success'); } } /// @dev Calculate next seed using a few on chain data /// @param currentSeed the current seed /// @param timestamp current block timestamp /// @param operator current operator /// @param blockHash last block hash /// @return a new bytes32 seed function _nextSeed( bytes32 currentSeed, uint256 timestamp, address operator, bytes32 blockHash ) internal view returns (bytes32) { return keccak256( abi.encodePacked( currentSeed, timestamp, operator, blockHash, block.coinbase, block.difficulty, tx.gasprice ) ); } /// @notice Returns a variety, throws if does not exist /// @param variety the variety to get function _getVariety(address variety) internal view returns (VarietyData storage) { require(knownVarieties.contains(variety), 'Unknown variety.'); return varieties[variety]; } /// @dev Allows to add a donation recipient to the list of donations /// @param recipient the recipient function _addDonationRecipient(address recipient) internal { donations.add(recipient); emit DonationRecipientAdded(recipient); } /// @dev Allows to remove a donation recipient from the list of donations /// @param recipient the recipient function _removeDonationRecipient(address recipient) internal { donations.remove(recipient); emit DonationRecipientRemoved(recipient); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @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 ) external; /** * @dev Transfers `tokenId` token 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 Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @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 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); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * 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 approved 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; }
// SPDX-License-Identifier: MIT 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 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 pragma solidity ^0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping(bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; if (lastIndex != toDeleteIndex) { bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = valueIndex; // Replace lastvalue's index to valueIndex } // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } }
//SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /// @title IEarlyBirdRegistry /// @author Simon Fremaux (@dievardump) interface IEarlyBirdRegistry { /// @notice allows anyone to register a new project that accepts Early Birds registrations /// @param open if the early bird registration is open or only creator can register addresses /// @param endRegistration unix epoch timestamp of registration closing /// @param maxRegistration the max registration count /// @return projectId the project Id (useful if called by a contract) function registerProject( bool open, uint256 endRegistration, uint256 maxRegistration ) external returns (uint256 projectId); /// @notice tells if a project exists /// @param projectId project id to check /// @return if the project exists function exists(uint256 projectId) external view returns (bool); /// @notice Helper to paginate all address registered for a project /// @param projectId the project id /// @param offset index where to start /// @param limit how many to grab /// @return list of registered addresses function listRegistrations( uint256 projectId, uint256 offset, uint256 limit ) external view returns (address[] memory list); /// @notice Helper to know how many address registered to a project /// @param projectId the project id /// @return how many people registered function registeredCount(uint256 projectId) external view returns (uint256); /// @notice Helper to check if an address is registered for a project id /// @param check the address to check /// @param projectId the project id /// @return if the address was registered as an early bird function isRegistered(address check, uint256 projectId) external view returns (bool); /// @notice Allows a project creator to add early birds in Batch /// @dev msg.sender must be the projectId creator /// @param projectId to add to /// @param birds all addresses to add function registerBatchTo(uint256 projectId, address[] memory birds) external; }
//SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import '@openzeppelin/contracts/token/ERC721/IERC721.sol'; /// @title IVariety interface /// @author Simon Fremaux (@dievardump) interface IVariety is IERC721 { /// @notice mint `seeds.length` token(s) to `to` using `seeds` /// @param to token recipient /// @param seeds each token seed function plant(address to, bytes32[] memory seeds) external returns (uint256); /// @notice this function returns the seed associated to a tokenId /// @param tokenId to get the seed of function getTokenSeed(uint256 tokenId) external view returns (bytes32); /// @notice This function allows an owner to ask for a seed update /// this can be needed because although I test the contract as much as possible, /// it might be possible that one token does not render because the seed creates /// error or even "out of gas" computation. That's why this would allow an owner /// in such case, to request for a seed change that will then be triggered by Sower /// @param tokenId id to regenerate seed for function requestSeedChange(uint256 tokenId) external; /// @notice This function allows Sower to answer to a seed change request /// in the event where a seed would produce errors of rendering /// 1) this function can only be called by Sower if the token owner /// asked for a new seed /// 2) this function will only be called if there is a rendering error /// or, Vitalik Buterin forbid, a duplicate /// @param tokenId id to regenerate seed for function changeSeedAfterRequest(uint256 tokenId) external; }
{ "evmVersion": "istanbul", "libraries": {}, "metadata": { "bytecodeHash": "ipfs", "useLiteralContent": true }, "optimizer": { "enabled": true, "runs": 200 }, "remappings": [], "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"variety","type":"address"},{"indexed":true,"internalType":"uint256","name":"count","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Collected","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"recipient","type":"address"}],"name":"DonationRecipientAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"recipient","type":"address"}],"name":"DonationRecipientRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"sessionId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"projectId","type":"uint256"}],"name":"EarlyBirdSessionAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"sessionId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"projectId","type":"uint256"}],"name":"EarlyBirdSessionRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"variety","type":"address"}],"name":"VarietyAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"variety","type":"address"}],"name":"VarietyChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"variety","type":"address"}],"name":"VarietyEmpty","type":"event"},{"inputs":[{"internalType":"address[]","name":"varieties_","type":"address[]"},{"internalType":"uint256","name":"earlyBirdDuration","type":"uint256"},{"internalType":"uint256","name":"earlyBirdSessionId","type":"uint256"},{"internalType":"bool","name":"activateVariety","type":"bool"}],"name":"activateEarlyBird","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"}],"name":"addDonationRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"sessionId","type":"uint256"},{"internalType":"uint256[]","name":"projectIds","type":"uint256[]"}],"name":"addEarlyBirdProjectToSession","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newVariety","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint8","name":"maxPerCollect","type":"uint8"},{"internalType":"bool","name":"active","type":"bool"},{"internalType":"address","name":"creator","type":"address"},{"internalType":"uint256","name":"available","type":"uint256"},{"internalType":"uint256","name":"reserve","type":"uint256"},{"internalType":"bool","name":"curated","type":"bool"}],"name":"addVariety","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"earlyBirdRegistry","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"sessionId","type":"uint256"}],"name":"isUserInEarlyBirdSession","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastSeed","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"listDonations","outputs":[{"internalType":"address[]","name":"list","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"listVarieties","outputs":[{"components":[{"internalType":"uint8","name":"maxPerCollect","type":"uint8"},{"internalType":"bool","name":"active","type":"bool"},{"internalType":"bool","name":"curated","type":"bool"},{"internalType":"address","name":"location","type":"address"},{"internalType":"address","name":"creator","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"available","type":"uint256"},{"internalType":"uint256","name":"reserve","type":"uint256"},{"internalType":"uint256","name":"earlyBirdUntil","type":"uint256"},{"internalType":"uint256","name":"earlyBirdSessionId","type":"uint256"}],"internalType":"struct Sower.VarietyData[]","name":"list","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mainDonation","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"},{"internalType":"address","name":"variety","type":"address"}],"name":"plant","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"variety","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"bytes32[]","name":"seeds","type":"bytes32[]"}],"name":"plantFromCurated","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"},{"internalType":"address","name":"variety","type":"address"},{"internalType":"address","name":"recipient","type":"address"}],"name":"plantFromReserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"}],"name":"removeDonationRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"sessionId","type":"uint256"},{"internalType":"uint256[]","name":"projectIds","type":"uint256[]"}],"name":"removeEarlyBirdProjectFromSession","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"variety","type":"address"},{"internalType":"bool","name":"isActive","type":"bool"}],"name":"setActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"earlyBirdRegistry_","type":"address"}],"name":"setEarlyBirdRegistry","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"variety","type":"address"},{"internalType":"uint8","name":"maxPerCollect","type":"uint8"}],"name":"setMaxPerCollect","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newMainDonation","type":"address"}],"name":"setNewMainDonation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"variety","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"updateTokenSeed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"varieties","outputs":[{"internalType":"uint8","name":"maxPerCollect","type":"uint8"},{"internalType":"bool","name":"active","type":"bool"},{"internalType":"bool","name":"curated","type":"bool"},{"internalType":"address","name":"location","type":"address"},{"internalType":"address","name":"creator","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"available","type":"uint256"},{"internalType":"uint256","name":"reserve","type":"uint256"},{"internalType":"uint256","name":"earlyBirdUntil","type":"uint256"},{"internalType":"uint256","name":"earlyBirdSessionId","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6080604052600280546001600160a01b0319167337133cda1941449cde7128f0c964c228f94844a81790553480156200003757600080fd5b506200004333620000aa565b600180556200006673de21f729137c5af1b01d73af1dc21effa2b8a0d6620000fa565b6200008573cca88b952976da313fb928111f2d5c390ee0d723620000fa565b620000a473f0d7a8198d75e10517f035cf11b928e9e2ab20f4620000fa565b620001c7565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b620001158160066200015560201b62001d2f1790919060201c565b506040516001600160a01b03821681527fca488007cc2b15f5a8d88773f9d05607b671a2d71b61597dbaf261db800cd5f09060200160405180910390a150565b60006200016c836001600160a01b03841662000175565b90505b92915050565b6000818152600183016020526040812054620001be575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556200016f565b5060006200016f565b612b0380620001d76000396000f3fe60806040526004361061016a5760003560e01c80638da5cb5b116100d1578063c73135551161008a578063df3a70da11610064578063df3a70da146104f5578063f2fde38b14610515578063f6678d0e14610535578063fe911b9d1461054857600080fd5b8063c731355514610491578063d070b0fa146104b1578063d3d00d1a146104d557600080fd5b80638da5cb5b146103115780638ed6894d1461032f578063a38732501461034f578063a9fbcfce14610371578063aee349f814610451578063bde16bf61461047157600080fd5b80633ccfd60b116101235780633ccfd60b14610265578063425666841461027a57806344bc37921461029a5780634b3688a9146102ba5780634f6d92ff146102da578063715018a6146102fc57600080fd5b8063015f375e146101765780630f17f8be146101b3578063137a30a0146101e35780632995bb59146102055780632ce962cf1461022557806337fc3b941461024557600080fd5b3661017157005b600080fd5b34801561018257600080fd5b50600254610196906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101bf57600080fd5b506101d36101ce366004612512565b610568565b60405190151581526020016101aa565b3480156101ef57600080fd5b506102036101fe36600461253b565b610656565b005b34801561021157600080fd5b50610203610220366004612407565b6108b5565b34801561023157600080fd5b506102036102403660046124dc565b6108eb565b34801561025157600080fd5b506102036102603660046125c2565b6109d2565b34801561027157600080fd5b50610203610a50565b34801561028657600080fd5b506102036102953660046125f4565b610cd8565b3480156102a657600080fd5b506102036102b5366004612407565b610e74565b3480156102c657600080fd5b506102036102d5366004612741565b610ec0565b3480156102e657600080fd5b506102ef611008565b6040516101aa9190612883565b34801561030857600080fd5b506102036111c3565b34801561031d57600080fd5b506000546001600160a01b0316610196565b34801561033b57600080fd5b5061020361034a366004612706565b6111f9565b34801561035b57600080fd5b50610364611389565b6040516101aa9190612836565b34801561037d57600080fd5b506103f461038c366004612407565b6003602081905260009182526040909120805460018201546002830154938301546004840154600585015460069095015460ff808616976101008704821697620100008804909216966001600160a01b0363010000009091048116961694909390929091908a565b6040805160ff909b168b5298151560208b0152961515978901979097526001600160a01b03948516606089015293909216608087015260a086015260c085015260e0840152610100830191909152610120820152610140016101aa565b34801561045d57600080fd5b5061020361046c366004612407565b61144c565b34801561047d57600080fd5b5061020361048c366004612512565b61147f565b34801561049d57600080fd5b50600a54610196906001600160a01b031681565b3480156104bd57600080fd5b506104c760085481565b6040519081526020016101aa565b3480156104e157600080fd5b506102036104f0366004612407565b611551565b34801561050157600080fd5b50610203610510366004612741565b6115e4565b34801561052157600080fd5b50610203610530366004612407565b611820565b6102036105433660046126e4565b6118b8565b34801561055457600080fd5b50610203610563366004612421565b611c12565b6000818152600b602052604081208161058082611d4b565b905060005b8181101561064857600a546001600160a01b031663a8f1602c876105a98685611d55565b6040516001600160e01b031960e085901b1681526001600160a01b039092166004830152602482015260440160206040518083038186803b1580156105ed57600080fd5b505afa158015610601573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061062591906126b0565b156106365760019350505050610650565b8061064081612a78565b915050610585565b506000925050505b92915050565b6000546001600160a01b031633146106895760405162461bcd60e51b815260040161068090612980565b60405180910390fd5b610694600489611d61565b156106e15760405162461bcd60e51b815260206004820152601760248201527f5661726965747920616c7265616479206578697374732e0000000000000000006044820152606401610680565b6106ec600489611d2f565b506040518061014001604052808760ff16815260200186151581526020018215158152602001896001600160a01b03168152602001856001600160a01b03168152602001888152602001848152602001838152602001600081526020016000815250600360008a6001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff02191690831515021790555060408201518160000160026101000a81548160ff02191690831515021790555060608201518160000160036101000a8154816001600160a01b0302191690836001600160a01b0316021790555060808201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060a0820151816002015560c0820151816003015560e08201518160040155610100820151816005015561012082015181600601559050507f9df62e2bef589f1ef56a29eba6f67a2b7344e33884d1ffe52485363dbc59c480886040516108a391906001600160a01b0391909116815260200190565b60405180910390a15050505050505050565b6000546001600160a01b031633146108df5760405162461bcd60e51b815260040161068090612980565b6108e881611d83565b50565b6000546001600160a01b031633146109155760405162461bcd60e51b815260040161068090612980565b600061092083611dcf565b9050811580610933575060008160030154115b61097f5760405162461bcd60e51b815260206004820152601d60248201527f43616e277420616374697661746520656d70747920766172696574792e0000006044820152606401610680565b805461ff001916610100831515021781556040516001600160a01b03841681527f31ab44b76e0093397419e8e68538785363a4b6276baaafc11300050bf50a36f0906020015b60405180910390a1505050565b6000546001600160a01b031633146109fc5760405162461bcd60e51b815260040161068090612980565b6000610a0783611dcf565b805460ff191660ff84161781556040516001600160a01b03851681529091507f31ab44b76e0093397419e8e68538785363a4b6276baaafc11300050bf50a36f0906020016109c5565b6000546001600160a01b03163314610a7a5760405162461bcd60e51b815260040161068090612980565b60004711610abe5760405162461bcd60e51b815260206004820152601160248201527024903237b713ba103a3434b7359039b79760791b6044820152606401610680565b6000610aca6006611d4b565b6002549091506001600160a01b031615801590610ae75750600081115b610b3d5760405162461bcd60e51b815260206004820152602160248201527f596f75206861766520746f206769766520696e206f7264657220746f206765746044820152601760f91b6064820152608401610680565b600080610b4b600a47612a22565b6002546040519192506001600160a01b0316908290600081818185875af1925050503d8060008114610b99576040519150601f19603f3d011682016040523d82523d6000602084013e610b9e565b606091505b50508092505081610bc15760405162461bcd60e51b81526004016106809061295e565b6000610bcd8483612a22565b905060005b84811015610c6957610be5600682611d55565b6001600160a01b03168260405160006040518083038185875af1925050503d8060008114610c2f576040519150601f19603f3d011682016040523d82523d6000602084013e610c34565b606091505b50508094505083610c575760405162461bcd60e51b81526004016106809061295e565b80610c6181612a78565b915050610bd2565b5060405133904790600081818185875af1925050503d8060008114610caa576040519150601f19603f3d011682016040523d82523d6000602084013e610caf565b606091505b50508093505082610cd25760405162461bcd60e51b81526004016106809061295e565b50505050565b6000546001600160a01b03163314610d025760405162461bcd60e51b815260040161068090612980565b6000828152600b60205260408120610d1990611d4b565b11610d595760405162461bcd60e51b815260206004820152601060248201526f53657373696f6e20696420656d70747960801b6044820152606401610680565b60005b8451811015610e6d576000610d97868381518110610d8a57634e487b7160e01b600052603260045260246000fd5b6020026020010151611dcf565b9050610da38542612a0a565b6005820155600681018490558215610dec57610de7868381518110610dd857634e487b7160e01b600052603260045260246000fd5b602002602001015160016108eb565b610e5a565b7f31ab44b76e0093397419e8e68538785363a4b6276baaafc11300050bf50a36f0868381518110610e2d57634e487b7160e01b600052603260045260246000fd5b6020026020010151604051610e5191906001600160a01b0391909116815260200190565b60405180910390a15b5080610e6581612a78565b915050610d5c565b5050505050565b6000546001600160a01b03163314610e9e5760405162461bcd60e51b815260040161068090612980565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314610eea5760405162461bcd60e51b815260040161068090612980565b60008211610f2f5760405162461bcd60e51b8152602060048201526012602482015271053657373696f6e2063616e277420626520360741b6044820152606401610680565b60005b815181101561100357610f87828281518110610f5e57634e487b7160e01b600052603260045260246000fd5b6020026020010151600b6000868152602001908152602001600020611e3690919063ffffffff16565b507fdb36bca33c3376b85e3bf829bc3b3324e3be5fdd09bb3fd9b1ebee1402bcc65c83838381518110610fca57634e487b7160e01b600052603260045260246000fd5b6020026020010151604051610fe9929190918252602082015260400190565b60405180910390a180610ffb81612a78565b915050610f32565b505050565b606060006110166004611d4b565b90508067ffffffffffffffff81111561103f57634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156110be57816020015b604080516101408101825260008082526020808301829052928201819052606082018190526080820181905260a0820181905260c0820181905260e082018190526101008201819052610120820152825260001990920191018161105d5790505b50915060005b818110156111be57600360006110db600484611d55565b6001600160a01b0390811682526020808301939093526040918201600020825161014081018452815460ff808216835261010080830482161515978401979097526201000082041615159482019490945263010000009093048216606084015260018101549091166080830152600281015460a0830152600381015460c0830152600481015460e083015260058101549282019290925260069091015461012082015283518490839081106111a057634e487b7160e01b600052603260045260246000fd5b602002602001018190525080806111b690612a78565b9150506110c4565b505090565b6000546001600160a01b031633146111ed5760405162461bcd60e51b815260040161068090612980565b6111f76000611e42565b565b600083116112195760405162461bcd60e51b81526004016106809061293e565b600061122483611dcf565b805490915062010000900460ff161561127b5760405162461bcd60e51b815260206004820152601960248201527821b0b713ba10383630b73a103a3434b9902b30b934b2ba3c9760391b6044820152606401610680565b60018101546001600160a01b03163314806112b6575060018101546001600160a01b03161580156112b657506000546001600160a01b031633145b6112f95760405162461bcd60e51b81526020600482015260146024820152732737ba102b30b934b2ba3c9031b932b0ba37b91760611b6044820152606401610680565b83816004015410158015611311575083816003015410155b6113535760405162461bcd60e51b81526020600482015260136024820152722737ba1032b737bab3b4103932b9b2b93b329760691b6044820152606401610680565b838160040160008282546113679190612a61565b90915550506001600160a01b03821661137e573391505b610cd2818584611e92565b606060006113976006611d4b565b90508067ffffffffffffffff8111156113c057634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156113e9578160200160208202803683370190505b50915060005b818110156111be57611402600682611d55565b83828151811061142257634e487b7160e01b600052603260045260246000fd5b6001600160a01b03909216602092830291909101909101528061144481612a78565b9150506113ef565b6000546001600160a01b031633146114765760405162461bcd60e51b815260040161068090612980565b6108e881611fc2565b6000546001600160a01b031633146114a95760405162461bcd60e51b815260040161068090612980565b6114b4600483611d61565b6114f35760405162461bcd60e51b815260206004820152601060248201526f2ab735b737bbb7103b30b934b2ba3c9760811b6044820152606401610680565b604051632fd039d760e21b8152600481018290526001600160a01b0383169063bf40e75c90602401600060405180830381600087803b15801561153557600080fd5b505af1158015611549573d6000803e3d6000fd5b505050505050565b6000546001600160a01b0316331461157b5760405162461bcd60e51b815260040161068090612980565b6001600160a01b0381166115c25760405162461bcd60e51b815260206004820152600e60248201526d2bb937b7339030b2323932b9b99760911b6044820152606401610680565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b0316331461160e5760405162461bcd60e51b815260040161068090612980565b600082116116535760405162461bcd60e51b8152602060048201526012602482015271053657373696f6e2063616e277420626520360741b6044820152606401610680565b60005b815181101561100357600a5482516001600160a01b0390911690634f558e799084908490811061169657634e487b7160e01b600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b81526004016116bc91815260200190565b60206040518083038186803b1580156116d457600080fd5b505afa1580156116e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061170c91906126b0565b6117585760405162461bcd60e51b815260206004820152601a60248201527f556e6b6e6f776e206561726c7920626972642070726f6a6563740000000000006044820152606401610680565b6117a482828151811061177b57634e487b7160e01b600052603260045260246000fd5b6020026020010151600b600086815260200190815260200160002061200790919063ffffffff16565b507f1d64e6a58fdf96965bb3ef3d9a3d0205458f450d3b16e82ff0ea6558bcbd515a838383815181106117e757634e487b7160e01b600052603260045260246000fd5b6020026020010151604051611806929190918252602082015260400190565b60405180910390a18061181881612a78565b915050611656565b6000546001600160a01b0316331461184a5760405162461bcd60e51b815260040161068090612980565b6001600160a01b0381166118af5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610680565b6108e881611e42565b6002600154141561190b5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610680565b60026001558161192d5760405162461bcd60e51b81526004016106809061293e565b600061193882611dcf565b805490915062010000900460ff161561198f5760405162461bcd60e51b815260206004820152601960248201527821b0b713ba10383630b73a103a3434b9902b30b934b2ba3c9760391b6044820152606401610680565b805460ff6101009091041615156001146119eb5760405162461bcd60e51b815260206004820152601f60248201527f5661726965747920706175736564206f72206f7574206f662073656564732e006044820152606401610680565b42816005015410611b3957611a04338260060154610568565b611a505760405162461bcd60e51b815260206004820152601d60248201527f4e6f74207265676973746572656420666f72204561726c7942697264730000006044820152606401610680565b6006810154600090815260096020908152604080832033845290915290205460ff1615611abf5760405162461bcd60e51b815260206004820152601b60248201527f416c7265616479207573656420796f7572204561726c794269726400000000006044820152606401610680565b600681015460009081526009602090815260408083203384529091529020805460ff191660019081179091558314611b395760405162461bcd60e51b815260206004820152601c60248201527f4561726c7920626972642063616e206f6e6c792067726162206f6e65000000006044820152606401610680565b8281600401548260030154611b4e9190612a61565b10158015611b6c5750805460ff161580611b6c5750805460ff168311155b611bae5760405162461bcd60e51b81526020600482015260136024820152722a37b79036b0b73c903932b8bab2b9ba32b21760691b6044820152606401610680565b60028101543390611bc0908590612a42565b3414611bfd5760405162461bcd60e51b815260206004820152600c60248201526b2b30b63ab29032b93937b91760a11b6044820152606401610680565b611c08828583611e92565b5050600180555050565b6000815111611c335760405162461bcd60e51b81526004016106809061293e565b6000611c3e84611dcf565b805490915062010000900460ff161515600114611c945760405162461bcd60e51b81526020600482015260146024820152732b30b934b2ba3c903737ba1031bab930ba32b21760611b6044820152606401610680565b60018101546001600160a01b0316331480611ccf575060018101546001600160a01b0316158015611ccf57506000546001600160a01b031633145b611d125760405162461bcd60e51b81526020600482015260146024820152732737ba102b30b934b2ba3c9031b932b0ba37b91760611b6044820152606401610680565b6001600160a01b038316611d24573392505b610cd2818484612013565b6000611d44836001600160a01b038416612216565b9392505050565b6000610650825490565b6000611d448383612265565b6001600160a01b03811660009081526001830160205260408120541515611d44565b611d8e600682611d2f565b506040516001600160a01b03821681527fca488007cc2b15f5a8d88773f9d05607b671a2d71b61597dbaf261db800cd5f0906020015b60405180910390a150565b6000611ddc600483611d61565b611e1b5760405162461bcd60e51b815260206004820152601060248201526f2ab735b737bbb7103b30b934b2ba3c9760811b6044820152606401610680565b506001600160a01b0316600090815260036020526040902090565b6000611d44838361229d565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60085460008367ffffffffffffffff811115611ebe57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611ee7578160200160208202803683370190505b5090506000611ef7600143612a61565b4090504260005b86811015611fa8576040805160208082018890528183018590526bffffffffffffffffffffffff1960608a811b8216818501526074840188905241901b1660948301524460a88301523a60c8808401919091528351808403909101815260e89092019092528051910120945084848281518110611f8b57634e487b7160e01b600052603260045260246000fd5b602090810291909101015280611fa081612a78565b915050611efe565b506008849055611fb9878685612013565b50505050505050565b611fcd6006826123ba565b506040516001600160a01b03821681527f5cd081c85290f7314070d11dd6efb7798a61838e597f283577729384c1f804ff90602001611dc4565b6000611d448383612216565b82546040516314a009b360e31b815263010000009091046001600160a01b03169063a5004d989061204a90859085906004016127e0565b602060405180830381600087803b15801561206457600080fd5b505af1158015612078573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061209c91906126cc565b50600081519050808460030160008282546120b79190612a61565b9091555050600384015461211357835461ff00191680855560405163010000009091046001600160a01b031681527f3fbe4a96f809ac395dfe27412a3315e6f984ae7915418a15b197de44408a94ac9060200160405180910390a15b83546040513481528291630100000090046001600160a01b0390811691908616907fdcdcaef5de7ddddb7ef392b97e6b32c1c43fd5f5ed468fd987baaa3c5252f5f59060200160405180910390a460018401546001600160a01b03161580159061217d5750600034115b801561219c575060005460018501546001600160a01b03908116911614155b15610cd25760018401546040516000916001600160a01b03169034908381818185875af1925050503d80600081146121f0576040519150601f19603f3d011682016040523d82523d6000602084013e6121f5565b606091505b5050905080610e6d5760405162461bcd60e51b81526004016106809061295e565b600081815260018301602052604081205461225d57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610650565b506000610650565b600082600001828154811061228a57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905092915050565b600081815260018301602052604081205480156123b05760006122c1600183612a61565b85549091506000906122d590600190612a61565b905081811461235657600086600001828154811061230357634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508087600001848154811061233457634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255918252600188019052604090208390555b855486908061237557634e487b7160e01b600052603160045260246000fd5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610650565b6000915050610650565b6000611d44836001600160a01b03841661229d565b80356001600160a01b03811681146123e657600080fd5b919050565b80356123e681612abf565b803560ff811681146123e657600080fd5b600060208284031215612418578081fd5b611d44826123cf565b600080600060608486031215612435578182fd5b61243e846123cf565b9250602061244d8186016123cf565b9250604085013567ffffffffffffffff811115612468578283fd5b8501601f81018713612478578283fd5b803561248b612486826129e6565b6129b5565b8082825284820191508484018a868560051b87010111156124aa578687fd5b8694505b838510156124cc5780358352600194909401939185019185016124ae565b5080955050505050509250925092565b600080604083850312156124ee578182fd5b6124f7836123cf565b9150602083013561250781612abf565b809150509250929050565b60008060408385031215612524578182fd5b61252d836123cf565b946020939093013593505050565b600080600080600080600080610100898b031215612557578384fd5b612560896123cf565b97506020890135965061257560408a016123f6565b9550606089013561258581612abf565b945061259360808a016123cf565b935060a0890135925060c0890135915060e08901356125b181612abf565b809150509295985092959890939650565b600080604083850312156125d4578182fd5b6125dd836123cf565b91506125eb602084016123f6565b90509250929050565b60008060008060808587031215612609578384fd5b843567ffffffffffffffff81111561261f578485fd5b8501601f8101871361262f578485fd5b8035602061263f612486836129e6565b8083825282820191508285018b848660051b880101111561265e57898afd5b8995505b8486101561268757612673816123cf565b835260019590950194918301918301612662565b5097505087013594505050604085013591506126a5606086016123eb565b905092959194509250565b6000602082840312156126c1578081fd5b8151611d4481612abf565b6000602082840312156126dd578081fd5b5051919050565b600080604083850312156126f6578182fd5b823591506125eb602084016123cf565b60008060006060848603121561271a578081fd5b8335925061272a602085016123cf565b9150612738604085016123cf565b90509250925092565b60008060408385031215612753578182fd5b8235915060208084013567ffffffffffffffff811115612771578283fd5b8401601f81018613612781578283fd5b803561278f612486826129e6565b80828252848201915084840189868560051b87010111156127ae578687fd5b8694505b838510156127d05780358352600194909401939185019185016127b2565b5080955050505050509250929050565b6001600160a01b038316815260406020808301829052835191830182905260009184820191906060850190845b818110156128295784518352938301939183019160010161280d565b5090979650505050505050565b6020808252825182820181905260009190848201906040850190845b818110156128775783516001600160a01b031683529284019291840191600101612852565b50909695505050505050565b602080825282518282018190526000919060409081850190868401855b82811015612931578151805160ff16855286810151151587860152858101511515868601526060808201516001600160a01b03908116918701919091526080808301519091169086015260a0808201519086015260c0808201519086015260e080820151908601526101008082015190860152610120908101519085015261014090930192908501906001016128a0565b5091979650505050505050565b6020808252600690820152650858dbdd5b9d60d21b604082015260600190565b602080825260089082015267217375636365737360c01b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b604051601f8201601f1916810167ffffffffffffffff811182821017156129de576129de612aa9565b604052919050565b600067ffffffffffffffff821115612a0057612a00612aa9565b5060051b60200190565b60008219821115612a1d57612a1d612a93565b500190565b600082612a3d57634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615612a5c57612a5c612a93565b500290565b600082821015612a7357612a73612a93565b500390565b6000600019821415612a8c57612a8c612a93565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b80151581146108e857600080fdfea2646970667358221220adf32d48108439f2d10dc0f840148d755c3202b101acd8450dd93f056dd3f70d64736f6c63430008040033
Deployed Bytecode
0x60806040526004361061016a5760003560e01c80638da5cb5b116100d1578063c73135551161008a578063df3a70da11610064578063df3a70da146104f5578063f2fde38b14610515578063f6678d0e14610535578063fe911b9d1461054857600080fd5b8063c731355514610491578063d070b0fa146104b1578063d3d00d1a146104d557600080fd5b80638da5cb5b146103115780638ed6894d1461032f578063a38732501461034f578063a9fbcfce14610371578063aee349f814610451578063bde16bf61461047157600080fd5b80633ccfd60b116101235780633ccfd60b14610265578063425666841461027a57806344bc37921461029a5780634b3688a9146102ba5780634f6d92ff146102da578063715018a6146102fc57600080fd5b8063015f375e146101765780630f17f8be146101b3578063137a30a0146101e35780632995bb59146102055780632ce962cf1461022557806337fc3b941461024557600080fd5b3661017157005b600080fd5b34801561018257600080fd5b50600254610196906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101bf57600080fd5b506101d36101ce366004612512565b610568565b60405190151581526020016101aa565b3480156101ef57600080fd5b506102036101fe36600461253b565b610656565b005b34801561021157600080fd5b50610203610220366004612407565b6108b5565b34801561023157600080fd5b506102036102403660046124dc565b6108eb565b34801561025157600080fd5b506102036102603660046125c2565b6109d2565b34801561027157600080fd5b50610203610a50565b34801561028657600080fd5b506102036102953660046125f4565b610cd8565b3480156102a657600080fd5b506102036102b5366004612407565b610e74565b3480156102c657600080fd5b506102036102d5366004612741565b610ec0565b3480156102e657600080fd5b506102ef611008565b6040516101aa9190612883565b34801561030857600080fd5b506102036111c3565b34801561031d57600080fd5b506000546001600160a01b0316610196565b34801561033b57600080fd5b5061020361034a366004612706565b6111f9565b34801561035b57600080fd5b50610364611389565b6040516101aa9190612836565b34801561037d57600080fd5b506103f461038c366004612407565b6003602081905260009182526040909120805460018201546002830154938301546004840154600585015460069095015460ff808616976101008704821697620100008804909216966001600160a01b0363010000009091048116961694909390929091908a565b6040805160ff909b168b5298151560208b0152961515978901979097526001600160a01b03948516606089015293909216608087015260a086015260c085015260e0840152610100830191909152610120820152610140016101aa565b34801561045d57600080fd5b5061020361046c366004612407565b61144c565b34801561047d57600080fd5b5061020361048c366004612512565b61147f565b34801561049d57600080fd5b50600a54610196906001600160a01b031681565b3480156104bd57600080fd5b506104c760085481565b6040519081526020016101aa565b3480156104e157600080fd5b506102036104f0366004612407565b611551565b34801561050157600080fd5b50610203610510366004612741565b6115e4565b34801561052157600080fd5b50610203610530366004612407565b611820565b6102036105433660046126e4565b6118b8565b34801561055457600080fd5b50610203610563366004612421565b611c12565b6000818152600b602052604081208161058082611d4b565b905060005b8181101561064857600a546001600160a01b031663a8f1602c876105a98685611d55565b6040516001600160e01b031960e085901b1681526001600160a01b039092166004830152602482015260440160206040518083038186803b1580156105ed57600080fd5b505afa158015610601573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061062591906126b0565b156106365760019350505050610650565b8061064081612a78565b915050610585565b506000925050505b92915050565b6000546001600160a01b031633146106895760405162461bcd60e51b815260040161068090612980565b60405180910390fd5b610694600489611d61565b156106e15760405162461bcd60e51b815260206004820152601760248201527f5661726965747920616c7265616479206578697374732e0000000000000000006044820152606401610680565b6106ec600489611d2f565b506040518061014001604052808760ff16815260200186151581526020018215158152602001896001600160a01b03168152602001856001600160a01b03168152602001888152602001848152602001838152602001600081526020016000815250600360008a6001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff02191690831515021790555060408201518160000160026101000a81548160ff02191690831515021790555060608201518160000160036101000a8154816001600160a01b0302191690836001600160a01b0316021790555060808201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060a0820151816002015560c0820151816003015560e08201518160040155610100820151816005015561012082015181600601559050507f9df62e2bef589f1ef56a29eba6f67a2b7344e33884d1ffe52485363dbc59c480886040516108a391906001600160a01b0391909116815260200190565b60405180910390a15050505050505050565b6000546001600160a01b031633146108df5760405162461bcd60e51b815260040161068090612980565b6108e881611d83565b50565b6000546001600160a01b031633146109155760405162461bcd60e51b815260040161068090612980565b600061092083611dcf565b9050811580610933575060008160030154115b61097f5760405162461bcd60e51b815260206004820152601d60248201527f43616e277420616374697661746520656d70747920766172696574792e0000006044820152606401610680565b805461ff001916610100831515021781556040516001600160a01b03841681527f31ab44b76e0093397419e8e68538785363a4b6276baaafc11300050bf50a36f0906020015b60405180910390a1505050565b6000546001600160a01b031633146109fc5760405162461bcd60e51b815260040161068090612980565b6000610a0783611dcf565b805460ff191660ff84161781556040516001600160a01b03851681529091507f31ab44b76e0093397419e8e68538785363a4b6276baaafc11300050bf50a36f0906020016109c5565b6000546001600160a01b03163314610a7a5760405162461bcd60e51b815260040161068090612980565b60004711610abe5760405162461bcd60e51b815260206004820152601160248201527024903237b713ba103a3434b7359039b79760791b6044820152606401610680565b6000610aca6006611d4b565b6002549091506001600160a01b031615801590610ae75750600081115b610b3d5760405162461bcd60e51b815260206004820152602160248201527f596f75206861766520746f206769766520696e206f7264657220746f206765746044820152601760f91b6064820152608401610680565b600080610b4b600a47612a22565b6002546040519192506001600160a01b0316908290600081818185875af1925050503d8060008114610b99576040519150601f19603f3d011682016040523d82523d6000602084013e610b9e565b606091505b50508092505081610bc15760405162461bcd60e51b81526004016106809061295e565b6000610bcd8483612a22565b905060005b84811015610c6957610be5600682611d55565b6001600160a01b03168260405160006040518083038185875af1925050503d8060008114610c2f576040519150601f19603f3d011682016040523d82523d6000602084013e610c34565b606091505b50508094505083610c575760405162461bcd60e51b81526004016106809061295e565b80610c6181612a78565b915050610bd2565b5060405133904790600081818185875af1925050503d8060008114610caa576040519150601f19603f3d011682016040523d82523d6000602084013e610caf565b606091505b50508093505082610cd25760405162461bcd60e51b81526004016106809061295e565b50505050565b6000546001600160a01b03163314610d025760405162461bcd60e51b815260040161068090612980565b6000828152600b60205260408120610d1990611d4b565b11610d595760405162461bcd60e51b815260206004820152601060248201526f53657373696f6e20696420656d70747960801b6044820152606401610680565b60005b8451811015610e6d576000610d97868381518110610d8a57634e487b7160e01b600052603260045260246000fd5b6020026020010151611dcf565b9050610da38542612a0a565b6005820155600681018490558215610dec57610de7868381518110610dd857634e487b7160e01b600052603260045260246000fd5b602002602001015160016108eb565b610e5a565b7f31ab44b76e0093397419e8e68538785363a4b6276baaafc11300050bf50a36f0868381518110610e2d57634e487b7160e01b600052603260045260246000fd5b6020026020010151604051610e5191906001600160a01b0391909116815260200190565b60405180910390a15b5080610e6581612a78565b915050610d5c565b5050505050565b6000546001600160a01b03163314610e9e5760405162461bcd60e51b815260040161068090612980565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314610eea5760405162461bcd60e51b815260040161068090612980565b60008211610f2f5760405162461bcd60e51b8152602060048201526012602482015271053657373696f6e2063616e277420626520360741b6044820152606401610680565b60005b815181101561100357610f87828281518110610f5e57634e487b7160e01b600052603260045260246000fd5b6020026020010151600b6000868152602001908152602001600020611e3690919063ffffffff16565b507fdb36bca33c3376b85e3bf829bc3b3324e3be5fdd09bb3fd9b1ebee1402bcc65c83838381518110610fca57634e487b7160e01b600052603260045260246000fd5b6020026020010151604051610fe9929190918252602082015260400190565b60405180910390a180610ffb81612a78565b915050610f32565b505050565b606060006110166004611d4b565b90508067ffffffffffffffff81111561103f57634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156110be57816020015b604080516101408101825260008082526020808301829052928201819052606082018190526080820181905260a0820181905260c0820181905260e082018190526101008201819052610120820152825260001990920191018161105d5790505b50915060005b818110156111be57600360006110db600484611d55565b6001600160a01b0390811682526020808301939093526040918201600020825161014081018452815460ff808216835261010080830482161515978401979097526201000082041615159482019490945263010000009093048216606084015260018101549091166080830152600281015460a0830152600381015460c0830152600481015460e083015260058101549282019290925260069091015461012082015283518490839081106111a057634e487b7160e01b600052603260045260246000fd5b602002602001018190525080806111b690612a78565b9150506110c4565b505090565b6000546001600160a01b031633146111ed5760405162461bcd60e51b815260040161068090612980565b6111f76000611e42565b565b600083116112195760405162461bcd60e51b81526004016106809061293e565b600061122483611dcf565b805490915062010000900460ff161561127b5760405162461bcd60e51b815260206004820152601960248201527821b0b713ba10383630b73a103a3434b9902b30b934b2ba3c9760391b6044820152606401610680565b60018101546001600160a01b03163314806112b6575060018101546001600160a01b03161580156112b657506000546001600160a01b031633145b6112f95760405162461bcd60e51b81526020600482015260146024820152732737ba102b30b934b2ba3c9031b932b0ba37b91760611b6044820152606401610680565b83816004015410158015611311575083816003015410155b6113535760405162461bcd60e51b81526020600482015260136024820152722737ba1032b737bab3b4103932b9b2b93b329760691b6044820152606401610680565b838160040160008282546113679190612a61565b90915550506001600160a01b03821661137e573391505b610cd2818584611e92565b606060006113976006611d4b565b90508067ffffffffffffffff8111156113c057634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156113e9578160200160208202803683370190505b50915060005b818110156111be57611402600682611d55565b83828151811061142257634e487b7160e01b600052603260045260246000fd5b6001600160a01b03909216602092830291909101909101528061144481612a78565b9150506113ef565b6000546001600160a01b031633146114765760405162461bcd60e51b815260040161068090612980565b6108e881611fc2565b6000546001600160a01b031633146114a95760405162461bcd60e51b815260040161068090612980565b6114b4600483611d61565b6114f35760405162461bcd60e51b815260206004820152601060248201526f2ab735b737bbb7103b30b934b2ba3c9760811b6044820152606401610680565b604051632fd039d760e21b8152600481018290526001600160a01b0383169063bf40e75c90602401600060405180830381600087803b15801561153557600080fd5b505af1158015611549573d6000803e3d6000fd5b505050505050565b6000546001600160a01b0316331461157b5760405162461bcd60e51b815260040161068090612980565b6001600160a01b0381166115c25760405162461bcd60e51b815260206004820152600e60248201526d2bb937b7339030b2323932b9b99760911b6044820152606401610680565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b0316331461160e5760405162461bcd60e51b815260040161068090612980565b600082116116535760405162461bcd60e51b8152602060048201526012602482015271053657373696f6e2063616e277420626520360741b6044820152606401610680565b60005b815181101561100357600a5482516001600160a01b0390911690634f558e799084908490811061169657634e487b7160e01b600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b81526004016116bc91815260200190565b60206040518083038186803b1580156116d457600080fd5b505afa1580156116e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061170c91906126b0565b6117585760405162461bcd60e51b815260206004820152601a60248201527f556e6b6e6f776e206561726c7920626972642070726f6a6563740000000000006044820152606401610680565b6117a482828151811061177b57634e487b7160e01b600052603260045260246000fd5b6020026020010151600b600086815260200190815260200160002061200790919063ffffffff16565b507f1d64e6a58fdf96965bb3ef3d9a3d0205458f450d3b16e82ff0ea6558bcbd515a838383815181106117e757634e487b7160e01b600052603260045260246000fd5b6020026020010151604051611806929190918252602082015260400190565b60405180910390a18061181881612a78565b915050611656565b6000546001600160a01b0316331461184a5760405162461bcd60e51b815260040161068090612980565b6001600160a01b0381166118af5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610680565b6108e881611e42565b6002600154141561190b5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610680565b60026001558161192d5760405162461bcd60e51b81526004016106809061293e565b600061193882611dcf565b805490915062010000900460ff161561198f5760405162461bcd60e51b815260206004820152601960248201527821b0b713ba10383630b73a103a3434b9902b30b934b2ba3c9760391b6044820152606401610680565b805460ff6101009091041615156001146119eb5760405162461bcd60e51b815260206004820152601f60248201527f5661726965747920706175736564206f72206f7574206f662073656564732e006044820152606401610680565b42816005015410611b3957611a04338260060154610568565b611a505760405162461bcd60e51b815260206004820152601d60248201527f4e6f74207265676973746572656420666f72204561726c7942697264730000006044820152606401610680565b6006810154600090815260096020908152604080832033845290915290205460ff1615611abf5760405162461bcd60e51b815260206004820152601b60248201527f416c7265616479207573656420796f7572204561726c794269726400000000006044820152606401610680565b600681015460009081526009602090815260408083203384529091529020805460ff191660019081179091558314611b395760405162461bcd60e51b815260206004820152601c60248201527f4561726c7920626972642063616e206f6e6c792067726162206f6e65000000006044820152606401610680565b8281600401548260030154611b4e9190612a61565b10158015611b6c5750805460ff161580611b6c5750805460ff168311155b611bae5760405162461bcd60e51b81526020600482015260136024820152722a37b79036b0b73c903932b8bab2b9ba32b21760691b6044820152606401610680565b60028101543390611bc0908590612a42565b3414611bfd5760405162461bcd60e51b815260206004820152600c60248201526b2b30b63ab29032b93937b91760a11b6044820152606401610680565b611c08828583611e92565b5050600180555050565b6000815111611c335760405162461bcd60e51b81526004016106809061293e565b6000611c3e84611dcf565b805490915062010000900460ff161515600114611c945760405162461bcd60e51b81526020600482015260146024820152732b30b934b2ba3c903737ba1031bab930ba32b21760611b6044820152606401610680565b60018101546001600160a01b0316331480611ccf575060018101546001600160a01b0316158015611ccf57506000546001600160a01b031633145b611d125760405162461bcd60e51b81526020600482015260146024820152732737ba102b30b934b2ba3c9031b932b0ba37b91760611b6044820152606401610680565b6001600160a01b038316611d24573392505b610cd2818484612013565b6000611d44836001600160a01b038416612216565b9392505050565b6000610650825490565b6000611d448383612265565b6001600160a01b03811660009081526001830160205260408120541515611d44565b611d8e600682611d2f565b506040516001600160a01b03821681527fca488007cc2b15f5a8d88773f9d05607b671a2d71b61597dbaf261db800cd5f0906020015b60405180910390a150565b6000611ddc600483611d61565b611e1b5760405162461bcd60e51b815260206004820152601060248201526f2ab735b737bbb7103b30b934b2ba3c9760811b6044820152606401610680565b506001600160a01b0316600090815260036020526040902090565b6000611d44838361229d565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60085460008367ffffffffffffffff811115611ebe57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611ee7578160200160208202803683370190505b5090506000611ef7600143612a61565b4090504260005b86811015611fa8576040805160208082018890528183018590526bffffffffffffffffffffffff1960608a811b8216818501526074840188905241901b1660948301524460a88301523a60c8808401919091528351808403909101815260e89092019092528051910120945084848281518110611f8b57634e487b7160e01b600052603260045260246000fd5b602090810291909101015280611fa081612a78565b915050611efe565b506008849055611fb9878685612013565b50505050505050565b611fcd6006826123ba565b506040516001600160a01b03821681527f5cd081c85290f7314070d11dd6efb7798a61838e597f283577729384c1f804ff90602001611dc4565b6000611d448383612216565b82546040516314a009b360e31b815263010000009091046001600160a01b03169063a5004d989061204a90859085906004016127e0565b602060405180830381600087803b15801561206457600080fd5b505af1158015612078573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061209c91906126cc565b50600081519050808460030160008282546120b79190612a61565b9091555050600384015461211357835461ff00191680855560405163010000009091046001600160a01b031681527f3fbe4a96f809ac395dfe27412a3315e6f984ae7915418a15b197de44408a94ac9060200160405180910390a15b83546040513481528291630100000090046001600160a01b0390811691908616907fdcdcaef5de7ddddb7ef392b97e6b32c1c43fd5f5ed468fd987baaa3c5252f5f59060200160405180910390a460018401546001600160a01b03161580159061217d5750600034115b801561219c575060005460018501546001600160a01b03908116911614155b15610cd25760018401546040516000916001600160a01b03169034908381818185875af1925050503d80600081146121f0576040519150601f19603f3d011682016040523d82523d6000602084013e6121f5565b606091505b5050905080610e6d5760405162461bcd60e51b81526004016106809061295e565b600081815260018301602052604081205461225d57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610650565b506000610650565b600082600001828154811061228a57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905092915050565b600081815260018301602052604081205480156123b05760006122c1600183612a61565b85549091506000906122d590600190612a61565b905081811461235657600086600001828154811061230357634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508087600001848154811061233457634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255918252600188019052604090208390555b855486908061237557634e487b7160e01b600052603160045260246000fd5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610650565b6000915050610650565b6000611d44836001600160a01b03841661229d565b80356001600160a01b03811681146123e657600080fd5b919050565b80356123e681612abf565b803560ff811681146123e657600080fd5b600060208284031215612418578081fd5b611d44826123cf565b600080600060608486031215612435578182fd5b61243e846123cf565b9250602061244d8186016123cf565b9250604085013567ffffffffffffffff811115612468578283fd5b8501601f81018713612478578283fd5b803561248b612486826129e6565b6129b5565b8082825284820191508484018a868560051b87010111156124aa578687fd5b8694505b838510156124cc5780358352600194909401939185019185016124ae565b5080955050505050509250925092565b600080604083850312156124ee578182fd5b6124f7836123cf565b9150602083013561250781612abf565b809150509250929050565b60008060408385031215612524578182fd5b61252d836123cf565b946020939093013593505050565b600080600080600080600080610100898b031215612557578384fd5b612560896123cf565b97506020890135965061257560408a016123f6565b9550606089013561258581612abf565b945061259360808a016123cf565b935060a0890135925060c0890135915060e08901356125b181612abf565b809150509295985092959890939650565b600080604083850312156125d4578182fd5b6125dd836123cf565b91506125eb602084016123f6565b90509250929050565b60008060008060808587031215612609578384fd5b843567ffffffffffffffff81111561261f578485fd5b8501601f8101871361262f578485fd5b8035602061263f612486836129e6565b8083825282820191508285018b848660051b880101111561265e57898afd5b8995505b8486101561268757612673816123cf565b835260019590950194918301918301612662565b5097505087013594505050604085013591506126a5606086016123eb565b905092959194509250565b6000602082840312156126c1578081fd5b8151611d4481612abf565b6000602082840312156126dd578081fd5b5051919050565b600080604083850312156126f6578182fd5b823591506125eb602084016123cf565b60008060006060848603121561271a578081fd5b8335925061272a602085016123cf565b9150612738604085016123cf565b90509250925092565b60008060408385031215612753578182fd5b8235915060208084013567ffffffffffffffff811115612771578283fd5b8401601f81018613612781578283fd5b803561278f612486826129e6565b80828252848201915084840189868560051b87010111156127ae578687fd5b8694505b838510156127d05780358352600194909401939185019185016127b2565b5080955050505050509250929050565b6001600160a01b038316815260406020808301829052835191830182905260009184820191906060850190845b818110156128295784518352938301939183019160010161280d565b5090979650505050505050565b6020808252825182820181905260009190848201906040850190845b818110156128775783516001600160a01b031683529284019291840191600101612852565b50909695505050505050565b602080825282518282018190526000919060409081850190868401855b82811015612931578151805160ff16855286810151151587860152858101511515868601526060808201516001600160a01b03908116918701919091526080808301519091169086015260a0808201519086015260c0808201519086015260e080820151908601526101008082015190860152610120908101519085015261014090930192908501906001016128a0565b5091979650505050505050565b6020808252600690820152650858dbdd5b9d60d21b604082015260600190565b602080825260089082015267217375636365737360c01b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b604051601f8201601f1916810167ffffffffffffffff811182821017156129de576129de612aa9565b604052919050565b600067ffffffffffffffff821115612a0057612a00612aa9565b5060051b60200190565b60008219821115612a1d57612a1d612a93565b500190565b600082612a3d57634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615612a5c57612a5c612a93565b500290565b600082821015612a7357612a73612a93565b500390565b6000600019821415612a8c57612a8c612a93565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b80151581146108e857600080fdfea2646970667358221220adf32d48108439f2d10dc0f840148d755c3202b101acd8450dd93f056dd3f70d64736f6c63430008040033
Loading...
Loading
Loading...
Loading
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.