Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0.897661928589675801 ETH
Eth Value
$2,999.04 (@ $3,340.95/ETH)Token Holdings
More Info
Private Name Tags
ContractCreator
TokenTracker
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x8d8747a0f4774217dd284205f33f6160bf6199daeca38defd0e71f7dfb963580 | Create Sale Auct... | (pending) | 30 hrs ago | IN | 0 ETH | (Pending) | |||
0x62406de748156301b60dee811c0f47f7f15be9f269c12241052f12cf90571cd6 | Create Sale Auct... | (pending) | 32 hrs ago | IN | 0 ETH | (Pending) | |||
Safe Transfer Fr... | 21438938 | 3 days ago | IN | 0 ETH | 0.00203031 | ||||
Safe Transfer Fr... | 21438862 | 3 days ago | IN | 0 ETH | 0.00185773 | ||||
Set Approval For... | 21399901 | 9 days ago | IN | 0 ETH | 0.00021333 | ||||
Set Approval For... | 21027608 | 61 days ago | IN | 0 ETH | 0.00034023 | ||||
Set Approval For... | 20815408 | 90 days ago | IN | 0 ETH | 0.00060107 | ||||
Set Approval For... | 20604476 | 120 days ago | IN | 0 ETH | 0.00003811 | ||||
Set Approval For... | 20579954 | 123 days ago | IN | 0 ETH | 0.00008441 | ||||
Set Approval For... | 20566549 | 125 days ago | IN | 0 ETH | 0.00006557 | ||||
Set Approval For... | 20515651 | 132 days ago | IN | 0 ETH | 0.00021134 | ||||
Safe Transfer Fr... | 20515531 | 132 days ago | IN | 0 ETH | 0.00023966 | ||||
Safe Transfer Fr... | 20515455 | 132 days ago | IN | 0 ETH | 0.00010271 | ||||
Set Approval For... | 20440737 | 142 days ago | IN | 0 ETH | 0.00009127 | ||||
Set Approval For... | 20440699 | 142 days ago | IN | 0 ETH | 0.00005071 | ||||
Set Approval For... | 20379904 | 151 days ago | IN | 0 ETH | 0.00007804 | ||||
Set Approval For... | 20257899 | 168 days ago | IN | 0 ETH | 0.00009355 | ||||
Set Approval For... | 20209761 | 175 days ago | IN | 0 ETH | 0.00017314 | ||||
Breed With | 20193828 | 177 days ago | IN | 0 ETH | 0.0000364 | ||||
Breed With | 20150739 | 183 days ago | IN | 0.0013 ETH | 0.00032867 | ||||
Set Approval For... | 20010277 | 203 days ago | IN | 0 ETH | 0.00068505 | ||||
Set Approval For... | 19902078 | 218 days ago | IN | 0 ETH | 0.00010433 | ||||
Set Approval For... | 19843200 | 226 days ago | IN | 0 ETH | 0.00025359 | ||||
Transfer From | 19752296 | 239 days ago | IN | 0 ETH | 0.00015122 | ||||
Transfer | 19752285 | 239 days ago | IN | 0 ETH | 0.00012973 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
12382607 | 1326 days ago | 0.79314692 ETH | ||||
12295689 | 1340 days ago | 0.01 ETH | ||||
12202276 | 1354 days ago | 0.03 ETH | ||||
12186955 | 1356 days ago | 0.03 ETH | ||||
12045065 | 1378 days ago | 0.03 ETH | ||||
12045065 | 1378 days ago | 0.03 ETH | ||||
12045065 | 1378 days ago | 0.03 ETH | ||||
11476771 | 1465 days ago | 0.03 ETH | ||||
11434957 | 1472 days ago | 0.03 ETH | ||||
11188266 | 1510 days ago | 0.003 ETH | ||||
11188143 | 1510 days ago | 0.01 ETH | ||||
11186994 | 1510 days ago | 0.001192 ETH | ||||
11182223 | 1511 days ago | 0.005 ETH | ||||
11181224 | 1511 days ago | 0.001108 ETH | ||||
11176352 | 1512 days ago | 0.001048 ETH | ||||
11175454 | 1512 days ago | 0.006 ETH | ||||
11173732 | 1512 days ago | 0.001 ETH | ||||
11173732 | 1512 days ago | 0.002027 ETH | ||||
11173261 | 1512 days ago | 0.001003 ETH | ||||
11173191 | 1512 days ago | 0.0065 ETH | ||||
11173191 | 1512 days ago | 0.007503 ETH | ||||
11166401 | 1513 days ago | 0.002 ETH | ||||
11128045 | 1519 days ago | 0.001 ETH | ||||
11117328 | 1521 days ago | 0.002 ETH | ||||
11056139 | 1530 days ago | 0.001 ETH |
Loading...
Loading
Contract Name:
BlockchainCutiesCore
Compiler Version
v0.4.21+commit.dfe3193c
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2018-04-25 */ pragma solidity ^0.4.20; /// BlockchainCuties: Collectible and breedable cuties on the Ethereum blockchain. /// https://blockchaincuties.co/ /// @title defined the interface that will be referenced in main Cutie contract contract GeneMixerInterface { /// @dev simply a boolean to indicate this is the contract we expect to be function isGeneMixer() external pure returns (bool); /// @dev given genes of cutie 1 & 2, return a genetic combination - may have a random factor /// @param genes1 genes of mom /// @param genes2 genes of dad /// @return the genes that are supposed to be passed down the child function mixGenes(uint256 genes1, uint256 genes2) public view returns (uint256); function canBreed(uint40 momId, uint256 genes1, uint40 dadId, uint256 genes2) public view returns (bool); } /// @author https://BlockChainArchitect.iocontract Bank is CutiePluginBase contract PluginInterface { /// @dev simply a boolean to indicate this is the contract we expect to be function isPluginInterface() public pure returns (bool); function onRemove() public; /// @dev Begins new feature. /// @param _cutieId - ID of token to auction, sender must be owner. /// @param _parameter - arbitrary parameter /// @param _seller - Old owner, if not the message sender function run( uint40 _cutieId, uint256 _parameter, address _seller ) public payable; /// @dev Begins new feature, approved and signed by COO. /// @param _cutieId - ID of token to auction, sender must be owner. /// @param _parameter - arbitrary parameter function runSigned( uint40 _cutieId, uint256 _parameter, address _owner ) external payable; function withdraw() public; } /// @title Auction Market for Blockchain Cuties. /// @author https://BlockChainArchitect.io contract MarketInterface { function withdrawEthFromBalance() external; function createAuction(uint40 _cutieId, uint128 _startPrice, uint128 _endPrice, uint40 _duration, address _seller) public payable; function bid(uint40 _cutieId) public payable; function cancelActiveAuctionWhenPaused(uint40 _cutieId) public; function getAuctionInfo(uint40 _cutieId) public view returns ( address seller, uint128 startPrice, uint128 endPrice, uint40 duration, uint40 startedAt, uint128 featuringFee ); } /// @title BlockchainCuties: Collectible and breedable cuties on the Ethereum blockchain. /// @author https://BlockChainArchitect.io /// @dev This is the BlockchainCuties configuration. It can be changed redeploying another version. contract ConfigInterface { function isConfig() public pure returns (bool); function getCooldownIndexFromGeneration(uint16 _generation) public view returns (uint16); function getCooldownEndTimeFromIndex(uint16 _cooldownIndex) public view returns (uint40); function getCooldownIndexCount() public view returns (uint256); function getBabyGen(uint16 _momGen, uint16 _dadGen) public pure returns (uint16); function getTutorialBabyGen(uint16 _dadGen) public pure returns (uint16); function getBreedingFee(uint40 _momId, uint40 _dadId) public pure returns (uint256); } /// @dev Note: the ERC-165 identifier for this interface is 0xf0b9e5ba interface ERC721TokenReceiver { /// @notice Handle the receipt of an NFT /// @dev The ERC721 smart contract calls this function on the recipient /// after a `transfer`. This function MAY throw to revert and reject the /// transfer. This function MUST use 50,000 gas or less. Return of other /// than the magic value MUST result in the transaction being reverted. /// Note: the contract address is always the message sender. /// @param _from The sending address /// @param _tokenId The NFT identifier which is being transfered /// @param data Additional data with no specified format /// @return `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))` /// unless throwing function onERC721Received(address _from, uint256 _tokenId, bytes data) external returns(bytes4); } /// @title BlockchainCuties: Collectible and breedable cuties on the Ethereum blockchain. /// @author https://BlockChainArchitect.io /// @dev This is the main BlockchainCuties contract. For separated logical sections the code is divided in // several separately-instantiated sibling contracts that handle auctions and the genetic combination algorithm. // By keeping auctions separate it is possible to upgrade them without disrupting the main contract that tracks // the ownership of the cutie. The genetic combination algorithm is kept separate so that all of the rest of the // code can be open-sourced. // The contracts: // // - BlockchainCuties: The fundamental code, including main data storage, constants and data types, as well as // internal functions for managing these items ans ERC-721 implementation. // Various addresses and constraints for operations can be executed only by specific roles - // Owner, Operator and Parties. // Methods for interacting with additional features (Plugins). // The methods for breeding and keeping track of breeding offers, relies on external genetic combination // contract. // Public methods for auctioning or bidding or breeding. // // - SaleMarket and BreedingMarket: The actual auction functionality is handled in two sibling contracts - one // for sales and one for breeding. Auction creation and bidding is mostly mediated through this side of // the core contract. // // - Effects: Contracts allow to use item effects on cuties, implemented as plugins. Items are not stored in // blockchain to not overload Ethereum network. Operator generates signatures, and Plugins check it // and perform effect. // // - ItemMarket: Plugin contract used to transfer money from buyer to seller. // // - Bank: Plugin contract used to receive payments for payed features. contract BlockchainCutiesCore /*is ERC721, CutieCoreInterface*/ { /// @notice A descriptive name for a collection of NFTs in this contract function name() external pure returns (string _name) { return "BlockchainCuties"; } /// @notice An abbreviated name for NFTs in this contract function symbol() external pure returns (string _symbol) { return "BC"; } /// @notice Query if a contract implements an interface /// @param interfaceID The interface identifier, as specified in ERC-165 /// @dev Interface identification is specified in ERC-165. This function /// uses less than 30,000 gas. /// @return `true` if the contract implements `interfaceID` and /// `interfaceID` is not 0xffffffff, `false` otherwise function supportsInterface(bytes4 interfaceID) external pure returns (bool) { return interfaceID == 0x6466353c || interfaceID == bytes4(keccak256('supportsInterface(bytes4)')); } event Transfer(address indexed _from, address indexed _to, uint256 _tokenId); event Approval(address indexed _owner, address indexed _approved, uint256 _tokenId); event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved); /// @dev The Birth event is fired as soon as a new cutie is created. This /// is any time a cutie comes into existence through the giveBirth method, as well as /// when a new gen0 cutie is created. event Birth(address indexed owner, uint40 cutieId, uint40 momId, uint40 dadId, uint256 genes); /// @dev This struct represents a blockchain Cutie. It was ensured that struct fits well into /// exactly two 256-bit words. The order of the members in this structure /// matters because of the Ethereum byte-packing rules. /// Reference: http://solidity.readthedocs.io/en/develop/miscellaneous.html struct Cutie { // The Cutie's genetic code is in these 256-bits. Cutie's genes never change. uint256 genes; // The timestamp from the block when this cutie was created. uint40 birthTime; // The minimum timestamp after which the cutie can start breeding // again. uint40 cooldownEndTime; // The cutie's parents ID is set to 0 for gen0 cuties. // Because of using 32-bit unsigned integers the limit is 4 billion cuties. // Current Ethereum annual limit is about 500 million transactions. uint40 momId; uint40 dadId; // Set the index in the cooldown array (see below) that means // the current cooldown duration for this Cutie. Starts at 0 // for gen0 cats, and is initialized to floor(generation/2) for others. // Incremented by one for each successful breeding, regardless // of being cutie mom or cutie dad. uint16 cooldownIndex; // The "generation number" of the cutie. Cutioes minted by the contract // for sale are called "gen0" with generation number of 0. All other cuties' // generation number is the larger of their parents' two generation // numbers, plus one (i.e. max(mom.generation, dad.generation) + 1) uint16 generation; // Some optional data used by external contracts // Cutie struct is 2x256 bits long. uint64 optional; } /// @dev An array containing the Cutie struct for all Cuties in existence. The ID /// of each cutie is actually an index into this array. ID 0 is the parent /// of all generation 0 cats, and both parents to itself. It is an invalid genetic code. Cutie[] public cuties; /// @dev A mapping from cutie IDs to the address that owns them. All cuties have /// some valid owner address, even gen0 cuties are created with a non-zero owner. mapping (uint40 => address) public cutieIndexToOwner; // @dev A mapping from owner address to count of tokens that address owns. // Used internally inside balanceOf() to resolve ownership count. mapping (address => uint256) ownershipTokenCount; /// @dev A mapping from CutieIDs to an address that has been approved to call /// transferFrom(). A Cutie can have one approved address for transfer /// at any time. A zero value means that there is no outstanding approval. mapping (uint40 => address) public cutieIndexToApproved; /// @dev A mapping from CutieIDs to an address that has been approved to use /// this Cutie for breeding via breedWith(). A Cutie can have one approved /// address for breeding at any time. A zero value means that there is no outstanding approval. mapping (uint40 => address) public sireAllowedToAddress; /// @dev The address of the Market contract used to sell cuties. This /// contract used both peer-to-peer sales and the gen0 sales that are /// initiated each 15 minutes. MarketInterface public saleMarket; /// @dev The address of a custom Market subclassed contract used for breeding /// auctions. Is to be separated from saleMarket as the actions taken on success /// after a sales and breeding auction are quite different. MarketInterface public breedingMarket; // Modifiers to check that inputs can be safely stored with a certain // number of bits. modifier canBeStoredIn40Bits(uint256 _value) { require(_value <= 0xFFFFFFFFFF); _; } /// @notice Returns the total number of Cuties in existence. /// @dev Required for ERC-721 compliance. function totalSupply() external view returns (uint256) { return cuties.length - 1; } /// @notice Returns the total number of Cuties in existence. /// @dev Required for ERC-721 compliance. function _totalSupply() internal view returns (uint256) { return cuties.length - 1; } // Internal utility functions assume that their input arguments // are valid. Public methods sanitize their inputs and follow // the required logic. /// @dev Checks if a given address is the current owner of a certain Cutie. /// @param _claimant the address we are validating against. /// @param _cutieId cutie id, only valid when > 0 function _isOwner(address _claimant, uint40 _cutieId) internal view returns (bool) { return cutieIndexToOwner[_cutieId] == _claimant; } /// @dev Checks if a given address currently has transferApproval for a certain Cutie. /// @param _claimant the address we are confirming the cutie is approved for. /// @param _cutieId cutie id, only valid when > 0 function _approvedFor(address _claimant, uint40 _cutieId) internal view returns (bool) { return cutieIndexToApproved[_cutieId] == _claimant; } /// @dev Marks an address as being approved for transferFrom(), overwriting any previous /// approval. Setting _approved to address(0) clears all transfer approval. /// NOTE: _approve() does NOT send the Approval event. This is done on purpose: /// _approve() and transferFrom() are used together for putting Cuties on auction. /// There is no value in spamming the log with Approval events in that case. function _approve(uint40 _cutieId, address _approved) internal { cutieIndexToApproved[_cutieId] = _approved; } /// @notice Returns the number of Cuties owned by a specific address. /// @param _owner The owner address to check. /// @dev Required for ERC-721 compliance function balanceOf(address _owner) external view returns (uint256 count) { return ownershipTokenCount[_owner]; } /// @notice Transfers a Cutie to another address. When transferring to a smart /// contract, ensure that it is aware of ERC-721 (or /// BlockchainCuties specifically), otherwise the Cutie may be lost forever. /// @param _to The address of the recipient, can be a user or contract. /// @param _cutieId The ID of the Cutie to transfer. /// @dev Required for ERC-721 compliance. function transfer(address _to, uint256 _cutieId) external whenNotPaused canBeStoredIn40Bits(_cutieId) { // You can only send your own cutie. require(_isOwner(msg.sender, uint40(_cutieId))); // Reassign ownership, clear pending approvals, emit Transfer event. _transfer(msg.sender, _to, uint40(_cutieId)); } /// @notice Grant another address the right to transfer a perticular Cutie via transferFrom(). /// This flow is preferred for transferring NFTs to contracts. /// @param _to The address to be granted transfer approval. Pass address(0) to clear all approvals. /// @param _cutieId The ID of the Cutie that can be transferred if this call succeeds. /// @dev Required for ERC-721 compliance. function approve(address _to, uint256 _cutieId) external whenNotPaused canBeStoredIn40Bits(_cutieId) { // Only cutie's owner can grant transfer approval. require(_isOwner(msg.sender, uint40(_cutieId))); // Registering approval replaces any previous approval. _approve(uint40(_cutieId), _to); // Emit approval event. emit Approval(msg.sender, _to, _cutieId); } /// @notice Transfers the ownership of an NFT from one address to another address. /// @dev Throws unless `msg.sender` is the current owner, an authorized /// operator, or the approved address for this NFT. Throws if `_from` is /// not the current owner. Throws if `_to` is the zero address. Throws if /// `_tokenId` is not a valid NFT. When transfer is complete, this function /// checks if `_to` is a smart contract (code size > 0). If so, it calls /// `onERC721Received` on `_to` and throws if the return value is not /// `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`. /// @param _from The current owner of the NFT /// @param _to The new owner /// @param _tokenId The NFT to transfer /// @param data Additional data with no specified format, sent in call to `_to` function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes data) external whenNotPaused canBeStoredIn40Bits(_tokenId) { require(_to != address(0)); require(_to != address(this)); require(_to != address(saleMarket)); require(_to != address(breedingMarket)); // Check for approval and valid ownership require(_approvedFor(msg.sender, uint40(_tokenId)) || _isApprovedForAll(_from, msg.sender)); require(_isOwner(_from, uint40(_tokenId))); // Reassign ownership, clearing pending approvals and emitting Transfer event. _transfer(_from, _to, uint40(_tokenId)); ERC721TokenReceiver (_to).onERC721Received(_from, _tokenId, data); } /// @notice Transfers the ownership of an NFT from one address to another address /// @dev This works identically to the other function with an extra data parameter, /// except this function just sets data to "" /// @param _from The current owner of the NFT /// @param _to The new owner /// @param _tokenId The NFT to transfer function safeTransferFrom(address _from, address _to, uint256 _tokenId) external whenNotPaused canBeStoredIn40Bits(_tokenId) { require(_to != address(0)); require(_to != address(this)); require(_to != address(saleMarket)); require(_to != address(breedingMarket)); // Check for approval and valid ownership require(_approvedFor(msg.sender, uint40(_tokenId)) || _isApprovedForAll(_from, msg.sender)); require(_isOwner(_from, uint40(_tokenId))); // Reassign ownership, clearing pending approvals and emitting Transfer event. _transfer(_from, _to, uint40(_tokenId)); } /// @notice Transfer a Cutie owned by another address, for which the calling address /// has been granted transfer approval by the owner. /// @param _from The address that owns the Cutie to be transfered. /// @param _to Any address, including the caller address, can take ownership of the Cutie. /// @param _tokenId The ID of the Cutie to be transferred. /// @dev Required for ERC-721 compliance. function transferFrom(address _from, address _to, uint256 _tokenId) external whenNotPaused canBeStoredIn40Bits(_tokenId) { // Check for approval and valid ownership require(_approvedFor(msg.sender, uint40(_tokenId)) || _isApprovedForAll(_from, msg.sender)); require(_isOwner(_from, uint40(_tokenId))); // Reassign ownership, clearing pending approvals and emitting Transfer event. _transfer(_from, _to, uint40(_tokenId)); } /// @notice Returns the address currently assigned ownership of a given Cutie. /// @dev Required for ERC-721 compliance. function ownerOf(uint256 _cutieId) external view canBeStoredIn40Bits(_cutieId) returns (address owner) { owner = cutieIndexToOwner[uint40(_cutieId)]; require(owner != address(0)); } /// @notice Returns the nth Cutie assigned to an address, with n specified by the /// _index argument. /// @param _owner The owner of the Cuties we are interested in. /// @param _index The zero-based index of the cutie within the owner's list of cuties. /// Must be less than balanceOf(_owner). /// @dev This method must not be called by smart contract code. It will almost /// certainly blow past the block gas limit once there are a large number of /// Cuties in existence. Exists only to allow off-chain queries of ownership. /// Optional method for ERC-721. function tokenOfOwnerByIndex(address _owner, uint256 _index) external view returns (uint256 cutieId) { uint40 count = 0; for (uint40 i = 1; i <= _totalSupply(); ++i) { if (cutieIndexToOwner[i] == _owner) { if (count == _index) { return i; } else { count++; } } } revert(); } /// @notice Enumerate valid NFTs /// @dev Throws if `_index` >= `totalSupply()`. /// @param _index A counter less than `totalSupply()` /// @return The token identifier for the `_index`th NFT, /// (sort order not specified) function tokenByIndex(uint256 _index) external pure returns (uint256) { return _index; } /// @dev A mapping from Cuties owner (account) to an address that has been approved to call /// transferFrom() for all cuties, owned by owner. /// Only one approved address is permitted for each account for transfer /// at any time. A zero value means there is no outstanding approval. mapping (address => address) public addressToApprovedAll; /// @notice Enable or disable approval for a third party ("operator") to manage /// all your asset. /// @dev Emits the ApprovalForAll event /// @param _operator Address to add to the set of authorized operators. /// @param _approved True if the operators is approved, false to revoke approval function setApprovalForAll(address _operator, bool _approved) external { if (_approved) { addressToApprovedAll[msg.sender] = _operator; } else { delete addressToApprovedAll[msg.sender]; } emit ApprovalForAll(msg.sender, _operator, _approved); } /// @notice Get the approved address for a single NFT /// @dev Throws if `_tokenId` is not a valid NFT /// @param _tokenId The NFT to find the approved address for /// @return The approved address for this NFT, or the zero address if there is none function getApproved(uint256 _tokenId) external view canBeStoredIn40Bits(_tokenId) returns (address) { require(_tokenId <= _totalSupply()); if (cutieIndexToApproved[uint40(_tokenId)] != address(0)) { return cutieIndexToApproved[uint40(_tokenId)]; } address owner = cutieIndexToOwner[uint40(_tokenId)]; return addressToApprovedAll[owner]; } /// @notice Query if an address is an authorized operator for another address /// @param _owner The address that owns the NFTs /// @param _operator The address that acts on behalf of the owner /// @return True if `_operator` is an approved operator for `_owner`, false otherwise function isApprovedForAll(address _owner, address _operator) external view returns (bool) { return addressToApprovedAll[_owner] == _operator; } function _isApprovedForAll(address _owner, address _operator) internal view returns (bool) { return addressToApprovedAll[_owner] == _operator; } ConfigInterface public config; /// @dev Update the address of the config contract. /// @param _address An address of a ConfigInterface contract instance to be used from this point forward. function setConfigAddress(address _address) public onlyOwner { ConfigInterface candidateContract = ConfigInterface(_address); require(candidateContract.isConfig()); // Set the new contract address config = candidateContract; } function getCooldownIndexFromGeneration(uint16 _generation) internal view returns (uint16) { return config.getCooldownIndexFromGeneration(_generation); } /// @dev An internal method that creates a new cutie and stores it. This /// method does not check anything and should only be called when the /// input data is valid for sure. Will generate both a Birth event /// and a Transfer event. /// @param _momId The cutie ID of the mom of this cutie (zero for gen0) /// @param _dadId The cutie ID of the dad of this cutie (zero for gen0) /// @param _generation The generation number of this cutie, must be computed by caller. /// @param _genes The cutie's genetic code. /// @param _owner The initial owner of this cutie, must be non-zero (except for the unCutie, ID 0) function _createCutie( uint40 _momId, uint40 _dadId, uint16 _generation, uint16 _cooldownIndex, uint256 _genes, address _owner, uint40 _birthTime ) internal returns (uint40) { Cutie memory _cutie = Cutie({ genes: _genes, birthTime: _birthTime, cooldownEndTime: 0, momId: _momId, dadId: _dadId, cooldownIndex: _cooldownIndex, generation: _generation, optional: 0 }); uint256 newCutieId256 = cuties.push(_cutie) - 1; // Check if id can fit into 40 bits require(newCutieId256 <= 0xFFFFFFFFFF); uint40 newCutieId = uint40(newCutieId256); // emit the birth event emit Birth(_owner, newCutieId, _cutie.momId, _cutie.dadId, _cutie.genes); // This will assign ownership, as well as emit the Transfer event as // per ERC721 draft _transfer(0, _owner, newCutieId); return newCutieId; } /// @notice Returns all the relevant information about a certain cutie. /// @param _id The ID of the cutie of interest. function getCutie(uint40 _id) external view returns ( uint256 genes, uint40 birthTime, uint40 cooldownEndTime, uint40 momId, uint40 dadId, uint16 cooldownIndex, uint16 generation ) { Cutie storage cutie = cuties[_id]; genes = cutie.genes; birthTime = cutie.birthTime; cooldownEndTime = cutie.cooldownEndTime; momId = cutie.momId; dadId = cutie.dadId; cooldownIndex = cutie.cooldownIndex; generation = cutie.generation; } /// @dev Assigns ownership of a particular Cutie to an address. function _transfer(address _from, address _to, uint40 _cutieId) internal { // since the number of cuties is capped to 2^40 // there is no way to overflow this ownershipTokenCount[_to]++; // transfer ownership cutieIndexToOwner[_cutieId] = _to; // When creating new cuties _from is 0x0, but we cannot account that address. if (_from != address(0)) { ownershipTokenCount[_from]--; // once the cutie is transferred also clear breeding allowances delete sireAllowedToAddress[_cutieId]; // clear any previously approved ownership exchange delete cutieIndexToApproved[_cutieId]; } // Emit the transfer event. emit Transfer(_from, _to, _cutieId); } /// @dev For transferring a cutie owned by this contract to the specified address. /// Used to rescue lost cuties. (There is no "proper" flow where this contract /// should be the owner of any Cutie. This function exists for us to reassign /// the ownership of Cuties that users may have accidentally sent to our address.) /// @param _cutieId - ID of cutie /// @param _recipient - Address to send the cutie to function restoreCutieToAddress(uint40 _cutieId, address _recipient) public onlyOperator whenNotPaused { require(_isOwner(this, _cutieId)); _transfer(this, _recipient, _cutieId); } address ownerAddress; address operatorAddress; bool public paused = false; modifier onlyOwner() { require(msg.sender == ownerAddress); _; } function setOwner(address _newOwner) public onlyOwner { require(_newOwner != address(0)); ownerAddress = _newOwner; } modifier onlyOperator() { require(msg.sender == operatorAddress || msg.sender == ownerAddress); _; } function setOperator(address _newOperator) public onlyOwner { require(_newOperator != address(0)); operatorAddress = _newOperator; } modifier whenNotPaused() { require(!paused); _; } modifier whenPaused { require(paused); _; } function pause() public onlyOwner whenNotPaused { paused = true; } string public metadataUrlPrefix = "https://blockchaincuties.co/cutie/"; string public metadataUrlSuffix = ".svg"; /// @notice A distinct Uniform Resource Identifier (URI) for a given asset. /// @dev Throws if `_tokenId` is not a valid NFT. URIs are defined in RFC /// 3986. The URI may point to a JSON file that conforms to the "ERC721 /// Metadata JSON Schema". function tokenURI(uint256 _tokenId) external view returns (string infoUrl) { return concat(toSlice(metadataUrlPrefix), toSlice(concat(toSlice(uintToString(_tokenId)), toSlice(metadataUrlSuffix)))); } function setMetadataUrl(string _metadataUrlPrefix, string _metadataUrlSuffix) public onlyOwner { metadataUrlPrefix = _metadataUrlPrefix; metadataUrlSuffix = _metadataUrlSuffix; } mapping(address => PluginInterface) public plugins; PluginInterface[] public pluginsArray; mapping(uint40 => address) public usedSignes; uint40 public minSignId; event GenesChanged(uint40 indexed cutieId, uint256 oldValue, uint256 newValue); event CooldownEndTimeChanged(uint40 indexed cutieId, uint40 oldValue, uint40 newValue); event CooldownIndexChanged(uint40 indexed cutieId, uint16 ololdValue, uint16 newValue); event GenerationChanged(uint40 indexed cutieId, uint16 oldValue, uint16 newValue); event OptionalChanged(uint40 indexed cutieId, uint64 oldValue, uint64 newValue); event SignUsed(uint40 signId, address sender); event MinSignSet(uint40 signId); /// @dev Sets the reference to the plugin contract. /// @param _address - Address of plugin contract. function addPlugin(address _address) public onlyOwner { PluginInterface candidateContract = PluginInterface(_address); // verify that a contract is what we expect require(candidateContract.isPluginInterface()); // Set the new contract address plugins[_address] = candidateContract; pluginsArray.push(candidateContract); } /// @dev Remove plugin and calls onRemove to cleanup function removePlugin(address _address) public onlyOwner { plugins[_address].onRemove(); delete plugins[_address]; uint256 kindex = 0; while (kindex < pluginsArray.length) { if (address(pluginsArray[kindex]) == _address) { pluginsArray[kindex] = pluginsArray[pluginsArray.length-1]; pluginsArray.length--; } else { kindex++; } } } /// @dev Put a cutie up for plugin feature. function runPlugin( address _pluginAddress, uint40 _cutieId, uint256 _parameter ) public whenNotPaused payable { // If cutie is already on any auction or in adventure, this will throw // because it will be owned by the other contract. // If _cutieId is 0, then cutie is not used on this feature. require(_cutieId == 0 || _isOwner(msg.sender, _cutieId)); require(address(plugins[_pluginAddress]) != address(0)); if (_cutieId > 0) { _approve(_cutieId, _pluginAddress); } // Plugin contract throws if inputs are invalid and clears // transfer after escrowing the cutie. plugins[_pluginAddress].run.value(msg.value)( _cutieId, _parameter, msg.sender ); } /// @dev Called from plugin contract when using items as effect function getGenes(uint40 _id) public view returns ( uint256 genes ) { Cutie storage cutie = cuties[_id]; genes = cutie.genes; } /// @dev Called from plugin contract when using items as effect function changeGenes( uint40 _cutieId, uint256 _genes) public whenNotPaused { // if caller is registered plugin contract require(address(plugins[msg.sender]) != address(0)); Cutie storage cutie = cuties[_cutieId]; if (cutie.genes != _genes) { emit GenesChanged(_cutieId, cutie.genes, _genes); cutie.genes = _genes; } } function getCooldownEndTime(uint40 _id) public view returns ( uint40 cooldownEndTime ) { Cutie storage cutie = cuties[_id]; cooldownEndTime = cutie.cooldownEndTime; } function changeCooldownEndTime( uint40 _cutieId, uint40 _cooldownEndTime) public whenNotPaused { require(address(plugins[msg.sender]) != address(0)); Cutie storage cutie = cuties[_cutieId]; if (cutie.cooldownEndTime != _cooldownEndTime) { emit CooldownEndTimeChanged(_cutieId, cutie.cooldownEndTime, _cooldownEndTime); cutie.cooldownEndTime = _cooldownEndTime; } } function getCooldownIndex(uint40 _id) public view returns ( uint16 cooldownIndex ) { Cutie storage cutie = cuties[_id]; cooldownIndex = cutie.cooldownIndex; } function changeCooldownIndex( uint40 _cutieId, uint16 _cooldownIndex) public whenNotPaused { require(address(plugins[msg.sender]) != address(0)); Cutie storage cutie = cuties[_cutieId]; if (cutie.cooldownIndex != _cooldownIndex) { emit CooldownIndexChanged(_cutieId, cutie.cooldownIndex, _cooldownIndex); cutie.cooldownIndex = _cooldownIndex; } } function changeGeneration( uint40 _cutieId, uint16 _generation) public whenNotPaused { require(address(plugins[msg.sender]) != address(0)); Cutie storage cutie = cuties[_cutieId]; if (cutie.generation != _generation) { emit GenerationChanged(_cutieId, cutie.generation, _generation); cutie.generation = _generation; } } function getGeneration(uint40 _id) public view returns (uint16 generation) { Cutie storage cutie = cuties[_id]; generation = cutie.generation; } function changeOptional( uint40 _cutieId, uint64 _optional) public whenNotPaused { require(address(plugins[msg.sender]) != address(0)); Cutie storage cutie = cuties[_cutieId]; if (cutie.optional != _optional) { emit OptionalChanged(_cutieId, cutie.optional, _optional); cutie.optional = _optional; } } function getOptional(uint40 _id) public view returns (uint64 optional) { Cutie storage cutie = cuties[_id]; optional = cutie.optional; } /// @dev Common function to be used also in backend function hashArguments( address _pluginAddress, uint40 _signId, uint40 _cutieId, uint128 _value, uint256 _parameter) public pure returns (bytes32 msgHash) { msgHash = keccak256(_pluginAddress, _signId, _cutieId, _value, _parameter); } /// @dev Common function to be used also in backend function getSigner( address _pluginAddress, uint40 _signId, uint40 _cutieId, uint128 _value, uint256 _parameter, uint8 _v, bytes32 _r, bytes32 _s ) public pure returns (address) { bytes32 msgHash = hashArguments(_pluginAddress, _signId, _cutieId, _value, _parameter); return ecrecover(msgHash, _v, _r, _s); } /// @dev Common function to be used also in backend function isValidSignature( address _pluginAddress, uint40 _signId, uint40 _cutieId, uint128 _value, uint256 _parameter, uint8 _v, bytes32 _r, bytes32 _s ) public view returns (bool) { return getSigner(_pluginAddress, _signId, _cutieId, _value, _parameter, _v, _r, _s) == operatorAddress; } /// @dev Put a cutie up for plugin feature with signature. /// Can be used for items equip, item sales and other features. /// Signatures are generated by Operator role. function runPluginSigned( address _pluginAddress, uint40 _signId, uint40 _cutieId, uint128 _value, uint256 _parameter, uint8 _v, bytes32 _r, bytes32 _s ) public whenNotPaused payable { // If cutie is already on any auction or in adventure, this will throw // as it will be owned by the other contract. // If _cutieId is 0, then cutie is not used on this feature. require(_cutieId == 0 || _isOwner(msg.sender, _cutieId)); require(address(plugins[_pluginAddress]) != address(0)); require (usedSignes[_signId] == address(0)); require (_signId >= minSignId); // value can also be zero for free calls require (_value <= msg.value); require (isValidSignature(_pluginAddress, _signId, _cutieId, _value, _parameter, _v, _r, _s)); usedSignes[_signId] = msg.sender; emit SignUsed(_signId, msg.sender); // Plugin contract throws if inputs are invalid and clears // transfer after escrowing the cutie. plugins[_pluginAddress].runSigned.value(_value)( _cutieId, _parameter, msg.sender ); } /// @dev Sets minimal signId, than can be used. /// All unused signatures less than signId will be cancelled on off-chain server /// and unused items will be transfered back to owner. function setMinSign(uint40 _newMinSignId) public onlyOperator { require (_newMinSignId > minSignId); minSignId = _newMinSignId; emit MinSignSet(minSignId); } event BreedingApproval(address indexed _owner, address indexed _approved, uint256 _tokenId); // Set in case the core contract is broken and an upgrade is required address public upgradedContractAddress; function isCutieCore() pure public returns (bool) { return true; } /// @notice Creates the main BlockchainCuties smart contract instance. function BlockchainCutiesCore() public { // Starts paused. paused = true; // the creator of the contract is the initial owner ownerAddress = msg.sender; // the creator of the contract is also the initial operator operatorAddress = msg.sender; // start with the mythical cutie 0 - so there are no generation-0 parent issues _createCutie(0, 0, 0, 0, uint256(-1), address(0), 0); } event ContractUpgrade(address newContract); /// @dev Aimed to mark the smart contract as upgraded if there is a crucial /// bug. This keeps track of the new contract and indicates that the new address is set. /// Updating to the new contract address is up to the clients. (This contract will /// be paused indefinitely if such an upgrade takes place.) /// @param _newAddress new address function setUpgradedAddress(address _newAddress) public onlyOwner whenPaused { require(_newAddress != address(0)); upgradedContractAddress = _newAddress; emit ContractUpgrade(upgradedContractAddress); } /// @dev Import cuties from previous version of Core contract. /// @param _oldAddress Old core contract address /// @param _fromIndex (inclusive) /// @param _toIndex (inclusive) function migrate(address _oldAddress, uint40 _fromIndex, uint40 _toIndex) public onlyOwner whenPaused { require(_totalSupply() + 1 == _fromIndex); BlockchainCutiesCore old = BlockchainCutiesCore(_oldAddress); for (uint40 i = _fromIndex; i <= _toIndex; i++) { uint256 genes; uint40 birthTime; uint40 cooldownEndTime; uint40 momId; uint40 dadId; uint16 cooldownIndex; uint16 generation; (genes, birthTime, cooldownEndTime, momId, dadId, cooldownIndex, generation) = old.getCutie(i); Cutie memory _cutie = Cutie({ genes: genes, birthTime: birthTime, cooldownEndTime: cooldownEndTime, momId: momId, dadId: dadId, cooldownIndex: cooldownIndex, generation: generation, optional: 0 }); cuties.push(_cutie); } } /// @dev Import cuties from previous version of Core contract (part 2). /// @param _oldAddress Old core contract address /// @param _fromIndex (inclusive) /// @param _toIndex (inclusive) function migrate2(address _oldAddress, uint40 _fromIndex, uint40 _toIndex, address saleAddress, address breedingAddress) public onlyOwner whenPaused { BlockchainCutiesCore old = BlockchainCutiesCore(_oldAddress); MarketInterface oldSaleMarket = MarketInterface(saleAddress); MarketInterface oldBreedingMarket = MarketInterface(breedingAddress); for (uint40 i = _fromIndex; i <= _toIndex; i++) { address owner = old.ownerOf(i); if (owner == saleAddress) { (owner,,,,,) = oldSaleMarket.getAuctionInfo(i); } if (owner == breedingAddress) { (owner,,,,,) = oldBreedingMarket.getAuctionInfo(i); } _transfer(0, owner, i); } } /// @dev Override unpause so it requires upgradedContractAddress not set, because then the contract was upgraded. function unpause() public onlyOwner whenPaused { require(upgradedContractAddress == address(0)); paused = false; } // Counts the number of cuties the contract owner has created. uint40 public promoCutieCreatedCount; uint40 public gen0CutieCreatedCount; uint40 public gen0Limit = 50000; uint40 public promoLimit = 5000; /// @dev Creates a new gen0 cutie with the given genes and /// creates an auction for it. function createGen0Auction(uint256 _genes, uint128 startPrice, uint128 endPrice, uint40 duration) public onlyOperator { require(gen0CutieCreatedCount < gen0Limit); uint40 cutieId = _createCutie(0, 0, 0, 0, _genes, address(this), uint40(now)); _approve(cutieId, saleMarket); saleMarket.createAuction( cutieId, startPrice, endPrice, duration, address(this) ); gen0CutieCreatedCount++; } function createPromoCutie(uint256 _genes, address _owner) public onlyOperator { require(promoCutieCreatedCount < promoLimit); if (_owner == address(0)) { _owner = operatorAddress; } promoCutieCreatedCount++; gen0CutieCreatedCount++; _createCutie(0, 0, 0, 0, _genes, _owner, uint40(now)); } /// @dev Put a cutie up for auction to be dad. /// Performs checks to ensure the cutie can be dad, then /// delegates to reverse auction. /// Optional money amount can be sent to contract to feature auction. /// Pricea are available on web. function createBreedingAuction( uint40 _cutieId, uint128 _startPrice, uint128 _endPrice, uint40 _duration ) public whenNotPaused payable { // Auction contract checks input sizes // If cutie is already on any auction, this will throw // because it will be owned by the auction contract. require(_isOwner(msg.sender, _cutieId)); require(canBreed(_cutieId)); _approve(_cutieId, breedingMarket); // breeding auction function is called if inputs are invalid and clears // transfer and sire approval after escrowing the cutie. breedingMarket.createAuction.value(msg.value)( _cutieId, _startPrice, _endPrice, _duration, msg.sender ); } /// @dev Sets the reference to the breeding auction. /// @param _breedingAddress - Address of breeding market contract. /// @param _saleAddress - Address of sale market contract. function setMarketAddress(address _breedingAddress, address _saleAddress) public onlyOwner { //require(address(breedingMarket) == address(0)); //require(address(saleMarket) == address(0)); breedingMarket = MarketInterface(_breedingAddress); saleMarket = MarketInterface(_saleAddress); } /// @dev Completes a breeding auction by bidding. /// Immediately breeds the winning mom with the dad on auction. /// @param _dadId - ID of the dad on auction. /// @param _momId - ID of the mom owned by the bidder. function bidOnBreedingAuction( uint40 _dadId, uint40 _momId ) public payable whenNotPaused returns (uint256) { // Auction contract checks input sizes require(_isOwner(msg.sender, _momId)); require(canBreed(_momId)); require(_canMateViaMarketplace(_momId, _dadId)); // Take breeding fee uint256 fee = getBreedingFee(_momId, _dadId); require(msg.value >= fee); // breeding auction will throw if the bid fails. breedingMarket.bid.value(msg.value - fee)(_dadId); return _breedWith(_momId, _dadId); } /// @dev Put a cutie up for auction. /// Does some ownership trickery for creating auctions in one transaction. /// Optional money amount can be sent to contract to feature auction. /// Pricea are available on web. function createSaleAuction( uint40 _cutieId, uint128 _startPrice, uint128 _endPrice, uint40 _duration ) public whenNotPaused payable { // Auction contract checks input sizes // If cutie is already on any auction, this will throw // because it will be owned by the auction contract. require(_isOwner(msg.sender, _cutieId)); _approve(_cutieId, saleMarket); // Sale auction throws if inputs are invalid and clears // transfer and sire approval after escrowing the cutie. saleMarket.createAuction.value(msg.value)( _cutieId, _startPrice, _endPrice, _duration, msg.sender ); } /// @dev The address of the sibling contract that is used to implement the genetic combination algorithm. GeneMixerInterface geneMixer; /// @dev Check if dad has authorized breeding with the mom. True if both dad /// and mom have the same owner, or if the dad has given breeding permission to /// the mom's owner (via approveBreeding()). function _isBreedingPermitted(uint40 _dadId, uint40 _momId) internal view returns (bool) { address momOwner = cutieIndexToOwner[_momId]; address dadOwner = cutieIndexToOwner[_dadId]; // Breeding is approved if they have same owner, or if the mom's owner was given // permission to breed with the dad. return (momOwner == dadOwner || sireAllowedToAddress[_dadId] == momOwner); } /// @dev Update the address of the genetic contract. /// @param _address An address of a GeneMixer contract instance to be used from this point forward. function setGeneMixerAddress(address _address) public onlyOwner { GeneMixerInterface candidateContract = GeneMixerInterface(_address); require(candidateContract.isGeneMixer()); // Set the new contract address geneMixer = candidateContract; } /// @dev Checks that a given cutie is able to breed. Requires that the /// current cooldown is finished (for dads) function _canBreed(Cutie _cutie) internal view returns (bool) { return _cutie.cooldownEndTime <= now; } /// @notice Grants approval to another user to sire with one of your Cuties. /// @param _addr The address that will be able to sire with your Cutie. Set to /// address(0) to clear all breeding approvals for this Cutie. /// @param _dadId A Cutie that you own that _addr will now be able to dad with. function approveBreeding(address _addr, uint40 _dadId) public whenNotPaused { require(_isOwner(msg.sender, _dadId)); sireAllowedToAddress[_dadId] = _addr; emit BreedingApproval(msg.sender, _addr, _dadId); } /// @dev Set the cooldownEndTime for the given Cutie, based on its current cooldownIndex. /// Also increments the cooldownIndex (unless it has hit the cap). /// @param _cutie A reference to the Cutie in storage which needs its timer started. function _triggerCooldown(uint40 _cutieId, Cutie storage _cutie) internal { // Compute the end of the cooldown time, based on current cooldownIndex uint40 oldValue = _cutie.cooldownIndex; _cutie.cooldownEndTime = config.getCooldownEndTimeFromIndex(_cutie.cooldownIndex); emit CooldownEndTimeChanged(_cutieId, oldValue, _cutie.cooldownEndTime); // Increment the breeding count. if (_cutie.cooldownIndex + 1 < config.getCooldownIndexCount()) { uint16 oldValue2 = _cutie.cooldownIndex; _cutie.cooldownIndex++; emit CooldownIndexChanged(_cutieId, oldValue2, _cutie.cooldownIndex); } } /// @notice Checks that a certain cutie is not /// in the middle of a breeding cooldown and is able to breed. /// @param _cutieId reference the id of the cutie, any user can inquire about it function canBreed(uint40 _cutieId) public view returns (bool) { require(_cutieId > 0); Cutie storage cutie = cuties[_cutieId]; return _canBreed(cutie); } /// @dev Check if given mom and dad are a valid mating pair. function _canPairMate( Cutie storage _mom, uint40 _momId, Cutie storage _dad, uint40 _dadId ) private view returns(bool) { // A Cutie can't breed with itself. if (_dadId == _momId) { return false; } // Cuties can't breed with their parents. if (_mom.momId == _dadId) { return false; } if (_mom.dadId == _dadId) { return false; } if (_dad.momId == _momId) { return false; } if (_dad.dadId == _momId) { return false; } // We can short circuit the sibling check (below) if either cat is // gen zero (has a mom ID of zero). if (_dad.momId == 0) { return true; } if (_mom.momId == 0) { return true; } // Cuties can't breed with full or half siblings. if (_dad.momId == _mom.momId) { return false; } if (_dad.momId == _mom.dadId) { return false; } if (_dad.dadId == _mom.momId) { return false; } if (_dad.dadId == _mom.dadId) { return false; } if (geneMixer.canBreed(_momId, _mom.genes, _dadId, _dad.genes)) { return true; } return false; } /// @notice Checks to see if two cuties can breed together (checks both /// ownership and breeding approvals, but does not check if both cuties are ready for /// breeding). /// @param _momId The ID of the proposed mom. /// @param _dadId The ID of the proposed dad. function canBreedWith(uint40 _momId, uint40 _dadId) public view returns(bool) { require(_momId > 0); require(_dadId > 0); Cutie storage mom = cuties[_momId]; Cutie storage dad = cuties[_dadId]; return _canPairMate(mom, _momId, dad, _dadId) && _isBreedingPermitted(_dadId, _momId); } /// @dev Internal check to see if a given dad and mom are a valid mating pair for /// breeding via market (this method doesn't check ownership and if mating is allowed). function _canMateViaMarketplace(uint40 _momId, uint40 _dadId) internal view returns (bool) { Cutie storage mom = cuties[_momId]; Cutie storage dad = cuties[_dadId]; return _canPairMate(mom, _momId, dad, _dadId); } function getBreedingFee(uint40 _momId, uint40 _dadId) public view returns (uint256) { return config.getBreedingFee(_momId, _dadId); } /// @notice Breed cuties that you own, or for which you /// have previously been given Breeding approval. Will either make your cutie give birth, or will /// fail. /// @param _momId The ID of the Cutie acting as mom (will end up give birth if successful) /// @param _dadId The ID of the Cutie acting as dad (will begin its breeding cooldown if successful) function breedWith(uint40 _momId, uint40 _dadId) public whenNotPaused payable returns (uint40) { // Caller must own the mom. require(_isOwner(msg.sender, _momId)); // Neither dad nor mom can be on auction during // breeding. // For mom: The caller of this function can't be the owner of the mom // because the owner of a Cutie on auction is the auction house, and the // auction house will never call breedWith(). // For dad: Similarly, a dad on auction will be owned by the auction house // and the act of transferring ownership will have cleared any outstanding // breeding approval. // Thus we don't need check if either cutie // is on auction. // Check that mom and dad are both owned by caller, or that the dad // has given breeding permission to caller (i.e. mom's owner). // Will fail for _dadId = 0 require(_isBreedingPermitted(_dadId, _momId)); // Check breeding fee require(getBreedingFee(_momId, _dadId) <= msg.value); // Grab a reference to the potential mom Cutie storage mom = cuties[_momId]; // Make sure mom's cooldown isn't active, or in the middle of a breeding cooldown require(_canBreed(mom)); // Grab a reference to the potential dad Cutie storage dad = cuties[_dadId]; // Make sure dad cooldown isn't active, or in the middle of a breeding cooldown require(_canBreed(dad)); // Test that these cuties are a valid mating pair. require(_canPairMate( mom, _momId, dad, _dadId )); return _breedWith(_momId, _dadId); } /// @dev Internal utility function to start breeding, assumes that all breeding /// requirements have been checked. function _breedWith(uint40 _momId, uint40 _dadId) internal returns (uint40) { // Grab a reference to the Cuties from storage. Cutie storage dad = cuties[_dadId]; Cutie storage mom = cuties[_momId]; // Trigger the cooldown for both parents. _triggerCooldown(_dadId, dad); _triggerCooldown(_momId, mom); // Clear breeding permission for both parents. delete sireAllowedToAddress[_momId]; delete sireAllowedToAddress[_dadId]; // Check that the mom is a valid cutie. require(mom.birthTime != 0); // Determine the higher generation number of the two parents uint16 babyGen = config.getBabyGen(mom.generation, dad.generation); // Call the gene mixing operation. uint256 childGenes = geneMixer.mixGenes(mom.genes, dad.genes); // Make the new cutie address owner = cutieIndexToOwner[_momId]; uint40 cutieId = _createCutie(_momId, _dadId, babyGen, getCooldownIndexFromGeneration(babyGen), childGenes, owner, mom.cooldownEndTime); // return the new cutie's ID return cutieId; } mapping(address => uint40) isTutorialPetUsed; /// @dev Completes a breeding tutorial cutie (non existing in blockchain) /// with auction by bidding. Immediately breeds with dad on auction. /// @param _dadId - ID of the dad on auction. function bidOnBreedingAuctionTutorial( uint40 _dadId ) public payable whenNotPaused returns (uint) { require(isTutorialPetUsed[msg.sender] == 0); // Take breeding fee uint256 fee = getBreedingFee(0, _dadId); require(msg.value >= fee); // breeding auction will throw if the bid fails. breedingMarket.bid.value(msg.value - fee)(_dadId); // Grab a reference to the Cuties from storage. Cutie storage dad = cuties[_dadId]; // Trigger the cooldown for parent. _triggerCooldown(_dadId, dad); // Clear breeding permission for parent. delete sireAllowedToAddress[_dadId]; uint16 babyGen = config.getTutorialBabyGen(dad.generation); // tutorial pet genome is zero uint256 childGenes = geneMixer.mixGenes(0x0, dad.genes); // tutorial pet id is zero uint40 cutieId = _createCutie(0, _dadId, babyGen, getCooldownIndexFromGeneration(babyGen), childGenes, msg.sender, 12); isTutorialPetUsed[msg.sender] = cutieId; // return the new cutie's ID return cutieId; } address party1address; address party2address; address party3address; address party4address; address party5address; /// @dev Setup project owners function setParties(address _party1, address _party2, address _party3, address _party4, address _party5) public onlyOwner { require(_party1 != address(0)); require(_party2 != address(0)); require(_party3 != address(0)); require(_party4 != address(0)); require(_party5 != address(0)); party1address = _party1; party2address = _party2; party3address = _party3; party4address = _party4; party5address = _party5; } /// @dev Reject all Ether which is not from game contracts from being sent here. function() external payable { require( msg.sender == address(saleMarket) || msg.sender == address(breedingMarket) || address(plugins[msg.sender]) != address(0) ); } /// @dev The balance transfer from the market and plugins contract /// to the CutieCore contract. function withdrawBalances() external { require( msg.sender == ownerAddress || msg.sender == operatorAddress); saleMarket.withdrawEthFromBalance(); breedingMarket.withdrawEthFromBalance(); for (uint32 i = 0; i < pluginsArray.length; ++i) { pluginsArray[i].withdraw(); } } /// @dev The balance transfer from CutieCore contract to project owners function withdrawEthFromBalance() external { require( msg.sender == party1address || msg.sender == party2address || msg.sender == party3address || msg.sender == party4address || msg.sender == party5address || msg.sender == ownerAddress || msg.sender == operatorAddress); require(party1address != 0); require(party2address != 0); require(party3address != 0); require(party4address != 0); require(party5address != 0); uint256 total = address(this).balance; party1address.transfer(total*105/1000); party2address.transfer(total*105/1000); party3address.transfer(total*140/1000); party4address.transfer(total*140/1000); party5address.transfer(total*510/1000); } /* * @title String & slice utility library for Solidity contracts. * @author Nick Johnson <[email protected]> * * @dev Functionality in this library is largely implemented using an * abstraction called a 'slice'. A slice represents a part of a string - * anything from the entire string to a single character, or even no * characters at all (a 0-length slice). Since a slice only has to specify * an offset and a length, copying and manipulating slices is a lot less * expensive than copying and manipulating the strings they reference. * * To further reduce gas costs, most functions on slice that need to return * a slice modify the original one instead of allocating a new one; for * instance, `s.split(".")` will return the text up to the first '.', * modifying s to only contain the remainder of the string after the '.'. * In situations where you do not want to modify the original slice, you * can make a copy first with `.copy()`, for example: * `s.copy().split(".")`. Try and avoid using this idiom in loops; since * Solidity has no memory management, it will result in allocating many * short-lived slices that are later discarded. * * Functions that return two slices come in two versions: a non-allocating * version that takes the second slice as an argument, modifying it in * place, and an allocating version that allocates and returns the second * slice; see `nextRune` for example. * * Functions that have to copy string data will return strings rather than * slices; these can be cast back to slices for further processing if * required. * * For convenience, some functions are provided with non-modifying * variants that create a new slice and return both; for instance, * `s.splitNew('.')` leaves s unmodified, and returns two values * corresponding to the left and right parts of the string. */ struct slice { uint _len; uint _ptr; } /* * @dev Returns a slice containing the entire string. * @param self The string to make a slice from. * @return A newly allocated slice containing the entire string. */ function toSlice(string self) internal pure returns (slice) { uint ptr; assembly { ptr := add(self, 0x20) } return slice(bytes(self).length, ptr); } function memcpy(uint dest, uint src, uint len) private pure { // Copy word-length chunks while possible for(; len >= 32; len -= 32) { assembly { mstore(dest, mload(src)) } dest += 32; src += 32; } // Copy remaining bytes uint mask = 256 ** (32 - len) - 1; assembly { let srcpart := and(mload(src), not(mask)) let destpart := and(mload(dest), mask) mstore(dest, or(destpart, srcpart)) } } /* * @dev Returns a newly allocated string containing the concatenation of * `self` and `other`. * @param self The first slice to concatenate. * @param other The second slice to concatenate. * @return The concatenation of the two strings. */ function concat(slice self, slice other) internal pure returns (string) { string memory ret = new string(self._len + other._len); uint retptr; assembly { retptr := add(ret, 32) } memcpy(retptr, self._ptr, self._len); memcpy(retptr + self._len, other._ptr, other._len); return ret; } function uintToString(uint256 a) internal pure returns (string result) { string memory r = ""; do { uint b = a % 10; a /= 10; string memory c = ""; if (b == 0) c = "0"; else if (b == 1) c = "1"; else if (b == 2) c = "2"; else if (b == 3) c = "3"; else if (b == 4) c = "4"; else if (b == 5) c = "5"; else if (b == 6) c = "6"; else if (b == 7) c = "7"; else if (b == 8) c = "8"; else if (b == 9) c = "9"; r = concat(toSlice(c), toSlice(r)); } while (a > 0); result = r; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"constant":true,"inputs":[],"name":"gen0CutieCreatedCount","outputs":[{"name":"","type":"uint40"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"_cutieId","type":"uint40"}],"name":"canBreed","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"_name","type":"string"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_party1","type":"address"},{"name":"_party2","type":"address"},{"name":"_party3","type":"address"},{"name":"_party4","type":"address"},{"name":"_party5","type":"address"}],"name":"setParties","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_cutieId","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"upgradedContractAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"addressToApprovedAll","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint40"}],"name":"cutieIndexToApproved","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newOwner","type":"address"}],"name":"setOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_dadId","type":"uint40"}],"name":"bidOnBreedingAuctionTutorial","outputs":[{"name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_genes","type":"uint256"},{"name":"_owner","type":"address"}],"name":"createPromoCutie","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_id","type":"uint40"}],"name":"getCooldownIndex","outputs":[{"name":"cooldownIndex","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"name":"cutieId","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_id","type":"uint40"}],"name":"getOptional","outputs":[{"name":"optional","type":"uint64"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newMinSignId","type":"uint40"}],"name":"setMinSign","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_breedingAddress","type":"address"},{"name":"_saleAddress","type":"address"}],"name":"setMarketAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_pluginAddress","type":"address"},{"name":"_signId","type":"uint40"},{"name":"_cutieId","type":"uint40"},{"name":"_value","type":"uint128"},{"name":"_parameter","type":"uint256"},{"name":"_v","type":"uint8"},{"name":"_r","type":"bytes32"},{"name":"_s","type":"bytes32"}],"name":"isValidSignature","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"plugins","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isCutieCore","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"_index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"_cutieId","type":"uint40"},{"name":"_startPrice","type":"uint128"},{"name":"_endPrice","type":"uint128"},{"name":"_duration","type":"uint40"}],"name":"createSaleAuction","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint40"}],"name":"sireAllowedToAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"breedingMarket","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_cutieId","type":"uint40"},{"name":"_generation","type":"uint16"}],"name":"changeGeneration","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newAddress","type":"address"}],"name":"setUpgradedAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_cutieId","type":"uint256"}],"name":"ownerOf","outputs":[{"name":"owner","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_momId","type":"uint40"},{"name":"_dadId","type":"uint40"}],"name":"getBreedingFee","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_cutieId","type":"uint40"},{"name":"_optional","type":"uint64"}],"name":"changeOptional","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"withdrawBalances","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"count","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"withdrawEthFromBalance","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_cutieId","type":"uint40"},{"name":"_startPrice","type":"uint128"},{"name":"_endPrice","type":"uint128"},{"name":"_duration","type":"uint40"}],"name":"createBreedingAuction","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"config","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_metadataUrlPrefix","type":"string"},{"name":"_metadataUrlSuffix","type":"string"}],"name":"setMetadataUrl","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_oldAddress","type":"address"},{"name":"_fromIndex","type":"uint40"},{"name":"_toIndex","type":"uint40"},{"name":"saleAddress","type":"address"},{"name":"breedingAddress","type":"address"}],"name":"migrate2","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"}],"name":"setConfigAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_pluginAddress","type":"address"},{"name":"_cutieId","type":"uint40"},{"name":"_parameter","type":"uint256"}],"name":"runPlugin","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"promoLimit","outputs":[{"name":"","type":"uint40"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"minSignId","outputs":[{"name":"","type":"uint40"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_pluginAddress","type":"address"},{"name":"_signId","type":"uint40"},{"name":"_cutieId","type":"uint40"},{"name":"_value","type":"uint128"},{"name":"_parameter","type":"uint256"},{"name":"_v","type":"uint8"},{"name":"_r","type":"bytes32"},{"name":"_s","type":"bytes32"}],"name":"getSigner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"_symbol","type":"string"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"_id","type":"uint40"}],"name":"getGenes","outputs":[{"name":"genes","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_pluginAddress","type":"address"},{"name":"_signId","type":"uint40"},{"name":"_cutieId","type":"uint40"},{"name":"_value","type":"uint128"},{"name":"_parameter","type":"uint256"},{"name":"_v","type":"uint8"},{"name":"_r","type":"bytes32"},{"name":"_s","type":"bytes32"}],"name":"runPluginSigned","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"_id","type":"uint40"}],"name":"getGeneration","outputs":[{"name":"generation","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_genes","type":"uint256"},{"name":"startPrice","type":"uint128"},{"name":"endPrice","type":"uint128"},{"name":"duration","type":"uint40"}],"name":"createGen0Auction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_operator","type":"address"},{"name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"}],"name":"removePlugin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_cutieId","type":"uint40"},{"name":"_recipient","type":"address"}],"name":"restoreCutieToAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_cutieId","type":"uint256"}],"name":"transfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint40"}],"name":"cutieIndexToOwner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newOperator","type":"address"}],"name":"setOperator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint40"}],"name":"usedSignes","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"},{"name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_pluginAddress","type":"address"},{"name":"_signId","type":"uint40"},{"name":"_cutieId","type":"uint40"},{"name":"_value","type":"uint128"},{"name":"_parameter","type":"uint256"}],"name":"hashArguments","outputs":[{"name":"msgHash","type":"bytes32"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"_momId","type":"uint40"},{"name":"_dadId","type":"uint40"}],"name":"breedWith","outputs":[{"name":"","type":"uint40"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"cuties","outputs":[{"name":"genes","type":"uint256"},{"name":"birthTime","type":"uint40"},{"name":"cooldownEndTime","type":"uint40"},{"name":"momId","type":"uint40"},{"name":"dadId","type":"uint40"},{"name":"cooldownIndex","type":"uint16"},{"name":"generation","type":"uint16"},{"name":"optional","type":"uint64"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_cutieId","type":"uint40"},{"name":"_cooldownEndTime","type":"uint40"}],"name":"changeCooldownEndTime","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"metadataUrlPrefix","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"name":"infoUrl","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_cutieId","type":"uint40"},{"name":"_cooldownIndex","type":"uint16"}],"name":"changeCooldownIndex","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"metadataUrlSuffix","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"}],"name":"addPlugin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_momId","type":"uint40"},{"name":"_dadId","type":"uint40"}],"name":"canBreedWith","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"promoCutieCreatedCount","outputs":[{"name":"","type":"uint40"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_cutieId","type":"uint40"},{"name":"_genes","type":"uint256"}],"name":"changeGenes","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"}],"name":"setGeneMixerAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"saleMarket","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_id","type":"uint40"}],"name":"getCutie","outputs":[{"name":"genes","type":"uint256"},{"name":"birthTime","type":"uint40"},{"name":"cooldownEndTime","type":"uint40"},{"name":"momId","type":"uint40"},{"name":"dadId","type":"uint40"},{"name":"cooldownIndex","type":"uint16"},{"name":"generation","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"gen0Limit","outputs":[{"name":"","type":"uint40"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_oldAddress","type":"address"},{"name":"_fromIndex","type":"uint40"},{"name":"_toIndex","type":"uint40"}],"name":"migrate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"pluginsArray","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_dadId","type":"uint40"},{"name":"_momId","type":"uint40"}],"name":"bidOnBreedingAuction","outputs":[{"name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"_id","type":"uint40"}],"name":"getCooldownEndTime","outputs":[{"name":"cooldownEndTime","type":"uint40"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_addr","type":"address"},{"name":"_dadId","type":"uint40"}],"name":"approveBreeding","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_from","type":"address"},{"indexed":true,"name":"_to","type":"address"},{"indexed":false,"name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":true,"name":"_approved","type":"address"},{"indexed":false,"name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":true,"name":"_operator","type":"address"},{"indexed":false,"name":"_approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":false,"name":"cutieId","type":"uint40"},{"indexed":false,"name":"momId","type":"uint40"},{"indexed":false,"name":"dadId","type":"uint40"},{"indexed":false,"name":"genes","type":"uint256"}],"name":"Birth","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"cutieId","type":"uint40"},{"indexed":false,"name":"oldValue","type":"uint256"},{"indexed":false,"name":"newValue","type":"uint256"}],"name":"GenesChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"cutieId","type":"uint40"},{"indexed":false,"name":"oldValue","type":"uint40"},{"indexed":false,"name":"newValue","type":"uint40"}],"name":"CooldownEndTimeChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"cutieId","type":"uint40"},{"indexed":false,"name":"ololdValue","type":"uint16"},{"indexed":false,"name":"newValue","type":"uint16"}],"name":"CooldownIndexChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"cutieId","type":"uint40"},{"indexed":false,"name":"oldValue","type":"uint16"},{"indexed":false,"name":"newValue","type":"uint16"}],"name":"GenerationChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"cutieId","type":"uint40"},{"indexed":false,"name":"oldValue","type":"uint64"},{"indexed":false,"name":"newValue","type":"uint64"}],"name":"OptionalChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"signId","type":"uint40"},{"indexed":false,"name":"sender","type":"address"}],"name":"SignUsed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"signId","type":"uint40"}],"name":"MinSignSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":true,"name":"_approved","type":"address"},{"indexed":false,"name":"_tokenId","type":"uint256"}],"name":"BreedingApproval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newContract","type":"address"}],"name":"ContractUpgrade","type":"event"}]
Contract Creation Code
60606040818152600a805460a060020a60ff02191690555190810160405280602281526020017f68747470733a2f2f626c6f636b636861696e6375746965732e636f2f6375746981526020017f652f000000000000000000000000000000000000000000000000000000000000815250600b90805162000084929160200190620004e0565b5060408051908101604052600481527f2e737667000000000000000000000000000000000000000000000000000000006020820152600c908051620000ce929160200190620004e0565b506011805469ffffffffff0000000000191666c350000000000017605060020a64ffffffffff0219166b13880000000000000000000017905534156200011357600080fd5b600a805460098054600160a060020a033316600160a060020a0319918216811790925560a060020a60ff02199092167401000000000000000000000000000000000000000017919091161790556200018260008080806000198180640100000000620047076200018982021704565b5062000620565b60006200019562000565565b600080610100604051908101604090815288825264ffffffffff808816602084015260009183018290528d811660608401528c16608083015261ffff808b1660a08401528b1660c083015260e082018190528054919450600191808301620001fe8382620005a9565b6000928352602090922086916002020181518155602082015160018201805464ffffffffff191664ffffffffff9290921691909117905560408201518160010160056101000a81548164ffffffffff021916908364ffffffffff160217905550606082015181600101600a6101000a81548164ffffffffff021916908364ffffffffff160217905550608082015181600101600f6101000a81548164ffffffffff021916908364ffffffffff16021790555060a08201518160010160146101000a81548161ffff021916908361ffff16021790555060c08201518160010160166101000a81548161ffff021916908361ffff16021790555060e08201516001909101805467ffffffffffffffff92909216780100000000000000000000000000000000000000000000000002600160c060020a039092169190911790555003915064ffffffffff8211156200035257600080fd5b5080600160a060020a0386167f689df1285a731b7022f6ff5c63e6b7c58c891df5b4530f12b7be0ec9ad03ecdb8260608601518660800151875160405164ffffffffff9485168152928416602084015292166040808301919091526060820192909252608001905180910390a2620003db6000878364010000000062004975620003e982021704565b9a9950505050505050505050565b600160a060020a0380831660008181526002602090815260408083208054600190810190915564ffffffffff8716845290915290208054600160a060020a03191690911790558316156200048c57600160a060020a0383166000908152600260209081526040808320805460001901905564ffffffffff84168352600482528083208054600160a060020a03199081169091556003909252909120805490911690555b81600160a060020a031683600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405164ffffffffff909116815260200160405180910390a3505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200052357805160ff191683800117855562000553565b8280016001018555821562000553579182015b828111156200055357825182559160200191906001019062000536565b5062000561929150620005dd565b5090565b6101006040519081016040908152600080835260208301819052908201819052606082018190526080820181905260a0820181905260c0820181905260e082015290565b815481835581811511620005d857600202816002028360005260206000209182019101620005d89190620005fd565b505050565b620005fa91905b80821115620005615760008155600101620005e4565b90565b620005fa91905b8082111562000561576000808255600182015560020162000604565b61551e80620006306000396000f3006060604052600436106103ac5763ffffffff60e060020a60003504166219a46b811461040857806301ffc9a71461043557806305910b911461047e57806306fdde031461049b578063081812fc1461052557806308ba7ee714610557578063095ea7b31461058e5780630da2e088146105b05780630dca63e8146105c357806310e9678b146105e257806313af4035146105ff57806318160ddd1461061e5780631bbfce0e14610643578063210fcbf61461065557806323b872dd146106775780632917f1621461069f5780632f745c59146106d35780633e6d4e12146106f55780633f4ba83a1461072f57806340a92f0f1461074257806342842e0e1461075f578063430c73c51461078757806345c7a092146107ac5780634b12e643146107f65780634d6a813a146108155780634f6ccce71461082857806350bc6bba1461083e578063551799131461086b5780635a390a5f146108885780635a3f88f01461089b5780635c975abb146108bf5780635f24f6fe146108d25780636352211e146108f157806366dc860a146109075780636c2959361461092a5780636ccbb0ab1461095457806370a0823114610967578063776247c41461098657806378a6c6d21461099957806379502c55146109c657806379edfa7d146109d9578063839daf1d14610a6c57806383a12de914610aaa5780638456cb5914610ac9578063887e0c0714610adc578063889231c114610afd5780638f9a57ef14610b1057806394e50e7a14610b2357806395d89b4114610b6d578063999d394714610b805780639ad73f2014610b9d5780639c91ae2014610bdc5780639de8302f14610bf9578063a22cb46514610c2b578063a4d95b6414610c4f578063a86ee74614610c6e578063a9059cbb14610c97578063b1d9549714610cb9578063b3ab15fb14610cd6578063b5113bf614610cf5578063b88d4fde14610d12578063bdad811214610d49578063c30bc5ef14610d87578063c44f217414610d9f578063c479142114610e16578063c7047fa714610e39578063c87b56dd14610e4c578063cf7e69f814610e62578063d4d6d36614610e86578063d8867fc814610e99578063d997933f14610eb8578063e09ef83e14610edb578063e1af915d14610eee578063e205842414610f0e578063e33607da14610f2d578063e39bdfab14610f40578063e515a4d114610fab578063e985e9c514610fbe578063edc9f18214610fe3578063f3ca087314611012578063f3cb180514611028578063f6dfcff714611040578063fb43b2a21461105d575b60055433600160a060020a03908116911614806103d7575060065433600160a060020a039081169116145b806103fb5750600160a060020a033381166000908152600d60205260409020541615155b151561040657600080fd5b005b341561041357600080fd5b61041b611086565b60405164ffffffffff909116815260200160405180910390f35b341561044057600080fd5b61046a7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1960043516611093565b604051901515815260200160405180910390f35b341561048957600080fd5b61046a64ffffffffff60043516611155565b34156104a657600080fd5b6104ae61122e565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156104ea5780820151838201526020016104d2565b50505050905090810190601f1680156105175780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561053057600080fd5b61053b600435611270565b604051600160a060020a03909116815260200160405180910390f35b341561056257600080fd5b610406600160a060020a0360043581169060243581169060443581169060643581169060843516611325565b341561059957600080fd5b610406600160a060020a0360043516602435611408565b34156105bb57600080fd5b61053b61149d565b34156105ce57600080fd5b61053b600160a060020a03600435166114b5565b34156105ed57600080fd5b61053b64ffffffffff600435166114d0565b341561060a57600080fd5b610406600160a060020a03600435166114eb565b341561062957600080fd5b61063161153d565b60405190815260200160405180910390f35b61063164ffffffffff60043516611547565b341561066057600080fd5b610406600435600160a060020a03602435166117a0565b341561068257600080fd5b610406600160a060020a03600435811690602435166044356118c2565b34156106aa57600080fd5b6106bc64ffffffffff60043516611937565b60405161ffff909116815260200160405180910390f35b34156106de57600080fd5b610631600160a060020a0360043516602435611976565b341561070057600080fd5b61071264ffffffffff600435166119f5565b60405167ffffffffffffffff909116815260200160405180910390f35b341561073a57600080fd5b610406611a3a565b341561074d57600080fd5b61040664ffffffffff60043516611aac565b341561076a57600080fd5b610406600160a060020a0360043581169060243516604435611b57565b341561079257600080fd5b610406600160a060020a0360043581169060243516611bed565b34156107b757600080fd5b61046a600160a060020a036004351664ffffffffff602435811690604435166001608060020a036064351660843560ff60a4351660c43560e435611c36565b341561080157600080fd5b61053b600160a060020a0360043516611c6c565b341561082057600080fd5b61046a611c87565b341561083357600080fd5b61063160043561126d565b61040664ffffffffff6004358116906001608060020a036024358116916044359091169060643516611c8c565b341561087657600080fd5b61053b64ffffffffff60043516611d67565b341561089357600080fd5b61053b611d82565b34156108a657600080fd5b61040664ffffffffff6004351661ffff60243516611d91565b34156108ca57600080fd5b61046a611ea2565b34156108dd57600080fd5b610406600160a060020a0360043516611eb2565b34156108fc57600080fd5b61053b600435611f78565b341561091257600080fd5b61063164ffffffffff60043581169060243516611fbb565b341561093557600080fd5b61040664ffffffffff6004351667ffffffffffffffff60243516612031565b341561095f57600080fd5b610406612159565b341561097257600080fd5b610631600160a060020a03600435166122c0565b341561099157600080fd5b6104066122db565b61040664ffffffffff6004358116906001608060020a036024358116916044359091169060643516612533565b34156109d157600080fd5b61053b61260b565b34156109e457600080fd5b61040660046024813581810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284378201915050505050509190803590602001908201803590602001908080601f01602080910402602001604051908101604052818152929190602084018383808284375094965061261a95505050505050565b3415610a7757600080fd5b610406600160a060020a0360043581169064ffffffffff602435811691604435909116906064358116906084351661265c565b3415610ab557600080fd5b610406600160a060020a0360043516612886565b3415610ad457600080fd5b610406612928565b610406600160a060020a036004351664ffffffffff60243516604435612980565b3415610b0857600080fd5b61041b612a8e565b3415610b1b57600080fd5b61041b612aa2565b3415610b2e57600080fd5b61053b600160a060020a036004351664ffffffffff602435811690604435166001608060020a036064351660843560ff60a4351660c43560e435612aaf565b3415610b7857600080fd5b6104ae612b30565b3415610b8b57600080fd5b61063164ffffffffff60043516612b71565b610406600160a060020a036004351664ffffffffff602435811690604435166001608060020a036064351660843560ff60a4351660c43560e435612ba2565b3415610be757600080fd5b6106bc64ffffffffff60043516612d91565b3415610c0457600080fd5b6104066004356001608060020a036024358116906044351664ffffffffff60643516612dd0565b3415610c3657600080fd5b610406600160a060020a03600435166024351515612f0a565b3415610c5a57600080fd5b610406600160a060020a0360043516612fb8565b3415610c7957600080fd5b61040664ffffffffff60043516600160a060020a0360243516613125565b3415610ca257600080fd5b610406600160a060020a0360043516602435613192565b3415610cc457600080fd5b61053b64ffffffffff600435166131dc565b3415610ce157600080fd5b610406600160a060020a03600435166131f7565b3415610d0057600080fd5b61053b64ffffffffff60043516613249565b3415610d1d57600080fd5b610406600160a060020a0360048035821691602480359091169160443591606435908101910135613264565b3415610d5457600080fd5b610631600160a060020a036004351664ffffffffff602435811690604435166001608060020a03606435166084356133db565b61041b64ffffffffff60043581169060243516613478565b3415610daa57600080fd5b610db5600435613688565b60405197885264ffffffffff9687166020890152948616604080890191909152938616606088015291909416608086015261ffff93841660a086015290921660c084015267ffffffffffffffff1660e0830152610100909101905180910390f35b3415610e2157600080fd5b61040664ffffffffff60043581169060243516613709565b3415610e4457600080fd5b6104ae61381a565b3415610e5757600080fd5b6104ae6004356138b8565b3415610e6d57600080fd5b61040664ffffffffff6004351661ffff602435166139f0565b3415610e9157600080fd5b6104ae613aff565b3415610ea457600080fd5b610406600160a060020a0360043516613b6a565b3415610ec357600080fd5b61046a64ffffffffff60043581169060243516613c56565b3415610ee657600080fd5b61041b613cea565b3415610ef957600080fd5b61040664ffffffffff60043516602435613d14565b3415610f1957600080fd5b610406600160a060020a0360043516613dd0565b3415610f3857600080fd5b61053b613e72565b3415610f4b57600080fd5b610f5d64ffffffffff60043516613e81565b60405196875264ffffffffff958616602088015293851660408088019190915292851660608701529316608085015261ffff92831660a0850152911660c083015260e0909101905180910390f35b3415610fb657600080fd5b61041b613f0b565b3415610fc957600080fd5b61046a600160a060020a0360043581169060243516613f21565b3415610fee57600080fd5b610406600160a060020a036004351664ffffffffff60243581169060443516613f43565b341561101d57600080fd5b61053b600435614230565b61063164ffffffffff60043581169060243516614258565b341561104b57600080fd5b61041b64ffffffffff60043516614347565b341561106857600080fd5b610406600160a060020a036004351664ffffffffff6024351661438b565b60115464ffffffffff1681565b60007f6466353c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff198316148061114f57506040517f737570706f727473496e74657266616365286279746573342900000000000000815260190160405180910390207bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b92915050565b60008064ffffffffff831681901161116c57600080fd5b6000805464ffffffffff851690811061118157fe5b906000526020600020906002020190506112258161010060405190810160409081528254825260019092015464ffffffffff8082166020840152650100000000008204811693830193909352605060020a810483166060830152607860020a8104909216608082015260a060020a820461ffff90811660a083015260b060020a83041660c082015260c060020a90910467ffffffffffffffff1660e0820152614431565b91505b50919050565b61123661537d565b60408051908101604052601081527f426c6f636b636861696e43757469657300000000000000000000000000000000602082015290505b90565b6000808264ffffffffff81111561128657600080fd5b61128e61153d565b84111561129a57600080fd5b64ffffffffff8416600090815260036020526040902054600160a060020a0316156112e65764ffffffffff8416600090815260036020526040902054600160a060020a0316925061131e565b64ffffffffff8416600090815260016020908152604080832054600160a060020a039081168085526007909352922054909116935091505b5050919050565b60095433600160a060020a0390811691161461134057600080fd5b600160a060020a038516151561135557600080fd5b600160a060020a038416151561136a57600080fd5b600160a060020a038316151561137f57600080fd5b600160a060020a038216151561139457600080fd5b600160a060020a03811615156113a957600080fd5b60148054600160a060020a0319908116600160a060020a03978816179091556015805482169587169590951790945560168054851693861693909317909255601780548416918516919091179055601880549092169216919091179055565b600a5460a060020a900460ff161561141f57600080fd5b8064ffffffffff81111561143257600080fd5b61143c3383614448565b151561144757600080fd5b611451828461446f565b82600160a060020a031633600160a060020a03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405190815260200160405180910390a3505050565b601054650100000000009004600160a060020a031681565b600760205260009081526040902054600160a060020a031681565b600360205260009081526040902054600160a060020a031681565b60095433600160a060020a0390811691161461150657600080fd5b600160a060020a038116151561151b57600080fd5b60098054600160a060020a031916600160a060020a0392909216919091179055565b6000546000190190565b600080600080600080600a60149054906101000a900460ff1615151561156c57600080fd5b600160a060020a03331660009081526013602052604090205464ffffffffff161561159657600080fd5b6115a1600088611fbb565b945034859010156115b157600080fd5b600654600160a060020a031663c170fd54348790038960405160e060020a63ffffffff851602815264ffffffffff90911660048201526024016000604051808303818588803b151561160257600080fd5b5af1151561160f57600080fd5b5050505060008764ffffffffff1681548110151561162957fe5b9060005260206000209060020201935061164387856144a6565b64ffffffffff8716600090815260046020526040908190208054600160a060020a03191690556008546001860154600160a060020a039091169163656e8d6f9160b060020a900461ffff16905160e060020a63ffffffff841602815261ffff9091166004820152602401602060405180830381600087803b15156116c657600080fd5b5af115156116d357600080fd5b50505060405180516012548654919550600160a060020a03169150638d8b1b889060009060405160e060020a63ffffffff851602815260048101929092526024820152604401602060405180830381600087803b151561173257600080fd5b5af1151561173f57600080fd5b5050506040518051905091506117646000888561175b8761469d565b8633600c614707565b33600160a060020a03166000908152601360205260409020805464ffffffffff191664ffffffffff929092169182179055979650505050505050565b600a5433600160a060020a03908116911614806117cb575060095433600160a060020a039081169116145b15156117d657600080fd5b601154601054605060020a90910464ffffffffff908116790100000000000000000000000000000000000000000000000000909204161061181657600080fd5b600160a060020a03811615156118345750600a54600160a060020a03165b60108054600164ffffffffff790100000000000000000000000000000000000000000000000000808404821683018216027fffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffff909316929092179092556011805480831690930190911664ffffffffff199092169190911790556118bd6000808080868642614707565b505050565b600a5460a060020a900460ff16156118d957600080fd5b8064ffffffffff8111156118ec57600080fd5b6118f6338361494e565b8061190657506119068433613f21565b151561191157600080fd5b61191b8483614448565b151561192657600080fd5b611931848484614975565b50505050565b60008060008364ffffffffff1681548110151561195057fe5b600091825260209091206002909102016001015460a060020a900461ffff169392505050565b60008060015b61198461153d565b64ffffffffff8216116119e85764ffffffffff8116600090815260016020526040902054600160a060020a03868116911614156119e057838264ffffffffff1614156119d9578064ffffffffff1692506119ed565b6001909101905b60010161197c565b600080fd5b505092915050565b60008060008364ffffffffff16815481101515611a0e57fe5b600091825260209091206002909102016001015460c060020a900467ffffffffffffffff169392505050565b60095433600160a060020a03908116911614611a5557600080fd5b600a5460a060020a900460ff161515611a6d57600080fd5b601054650100000000009004600160a060020a031615611a8c57600080fd5b600a805474ff000000000000000000000000000000000000000019169055565b600a5433600160a060020a0390811691161480611ad7575060095433600160a060020a039081169116145b1515611ae257600080fd5b60105464ffffffffff90811690821611611afb57600080fd5b6010805464ffffffffff191664ffffffffff83811691909117918290557f61adbe79b14a8cd89d2e6b327307808e258e0e9a9da800e5c9c5cf5b20efc91c911660405164ffffffffff909116815260200160405180910390a150565b600a5460a060020a900460ff1615611b6e57600080fd5b8064ffffffffff811115611b8157600080fd5b600160a060020a0383161515611b9657600080fd5b30600160a060020a031683600160a060020a031614151515611bb757600080fd5b600554600160a060020a0384811691161415611bd257600080fd5b600654600160a060020a03848116911614156118ec57600080fd5b60095433600160a060020a03908116911614611c0857600080fd5b60068054600160a060020a03938416600160a060020a03199182161790915560058054929093169116179055565b600a54600090600160a060020a0316611c558a8a8a8a8a8a8a8a612aaf565b600160a060020a0316149998505050505050505050565b600d60205260009081526040902054600160a060020a031681565b600190565b600a5460a060020a900460ff1615611ca357600080fd5b611cad3385614448565b1515611cb857600080fd5b600554611ccf908590600160a060020a031661446f565b600554600160a060020a031663c1d1faf334868686863360405160e060020a63ffffffff891602815264ffffffffff95861660048201526001608060020a0394851660248201529290931660448301529092166064830152600160a060020a0316608482015260a4016000604051808303818588803b1515611d5057600080fd5b5af11515611d5d57600080fd5b5050505050505050565b600460205260009081526040902054600160a060020a031681565b600654600160a060020a031681565b600a5460009060a060020a900460ff1615611dab57600080fd5b600160a060020a033381166000908152600d6020526040902054161515611dd157600080fd5b6000805464ffffffffff8516908110611de657fe5b60009182526020909120600290910201600181015490915061ffff83811660b060020a90920416146118bd57600181015464ffffffffff8416907f253c1885cda0cc3462691396c0720f0b8d26a408db39c442f6cba580aa2bacbe9060b060020a900461ffff168460405161ffff9283168152911660208201526040908101905180910390a260018101805461ffff841660b060020a0277ffff0000000000000000000000000000000000000000000019909116179055505050565b600a5460a060020a900460ff1681565b60095433600160a060020a03908116911614611ecd57600080fd5b600a5460a060020a900460ff161515611ee557600080fd5b600160a060020a0381161515611efa57600080fd5b6010805478ffffffffffffffffffffffffffffffffffffffff0000000000191665010000000000600160a060020a03848116820292909217928390557f450db8da6efbe9c22f2347f7c2021231df1fc58d3ae9a2fa75d39fa446199305920416604051600160a060020a03909116815260200160405180910390a150565b60008164ffffffffff811115611f8d57600080fd5b64ffffffffff8316600090815260016020526040902054600160a060020a0316915081151561122857600080fd5b600854600090600160a060020a03166366dc860a848460405160e060020a63ffffffff851602815264ffffffffff928316600482015291166024820152604401602060405180830381600087803b151561201457600080fd5b5af1151561202157600080fd5b5050506040518051949350505050565b600a5460009060a060020a900460ff161561204b57600080fd5b600160a060020a033381166000908152600d602052604090205416151561207157600080fd5b6000805464ffffffffff851690811061208657fe5b60009182526020909120600290910201600181015490915067ffffffffffffffff83811660c060020a90920416146118bd57600181015464ffffffffff8416907f0e4fadd6d53b262b076fce73fbf5c344b680a42f10f095326782f42d56b9beb29060c060020a900467ffffffffffffffff168460405167ffffffffffffffff9283168152911660208201526040908101905180910390a260018101805467ffffffffffffffff841660c060020a0277ffffffffffffffffffffffffffffffffffffffffffffffff909116179055505050565b60095460009033600160a060020a03908116911614806121875750600a5433600160a060020a039081169116145b151561219257600080fd5b600554600160a060020a031663776247c46040518163ffffffff1660e060020a028152600401600060405180830381600087803b15156121d157600080fd5b5af115156121de57600080fd5b5050600654600160a060020a0316905063776247c46040518163ffffffff1660e060020a028152600401600060405180830381600087803b151561222157600080fd5b5af1151561222e57600080fd5b505050600090505b600e5463ffffffff821610156122bd57600e805463ffffffff831690811061225a57fe5b600091825260209091200154600160a060020a0316633ccfd60b6040518163ffffffff1660e060020a028152600401600060405180830381600087803b15156122a257600080fd5b5af115156122af57600080fd5b505050806001019050612236565b50565b600160a060020a031660009081526002602052604090205490565b60145460009033600160a060020a0390811691161480612309575060155433600160a060020a039081169116145b80612322575060165433600160a060020a039081169116145b8061233b575060175433600160a060020a039081169116145b80612354575060185433600160a060020a039081169116145b8061236d575060095433600160a060020a039081169116145b806123865750600a5433600160a060020a039081169116145b151561239157600080fd5b601454600160a060020a031615156123a857600080fd5b601554600160a060020a031615156123bf57600080fd5b601654600160a060020a031615156123d657600080fd5b601754600160a060020a031615156123ed57600080fd5b601854600160a060020a0316151561240457600080fd5b50601454600160a060020a033081163191166108fc6103e860698402049081150290604051600060405180830381858888f19350505050151561244657600080fd5b601554600160a060020a03166103e8606983020480156108fc0290604051600060405180830381858888f19350505050151561248157600080fd5b601654600160a060020a03166103e8608c83020480156108fc0290604051600060405180830381858888f1935050505015156124bc57600080fd5b601754600160a060020a03166103e8608c83020480156108fc0290604051600060405180830381858888f1935050505015156124f757600080fd5b601854600160a060020a03166103e86101fe83020480156108fc0290604051600060405180830381858888f1935050505015156122bd57600080fd5b600a5460a060020a900460ff161561254a57600080fd5b6125543385614448565b151561255f57600080fd5b61256884611155565b151561257357600080fd5b60065461258a908590600160a060020a031661446f565b600654600160a060020a031663c1d1faf334868686863360405160e060020a63ffffffff891602815264ffffffffff95861660048201526001608060020a0394851660248201529290931660448301529092166064830152600160a060020a0316608482015260a4016000604051808303818588803b1515611d5057600080fd5b600854600160a060020a031681565b60095433600160a060020a0390811691161461263557600080fd5b600b82805161264892916020019061538f565b50600c8180516118bd92916020019061538f565b600954600090819081908190819033600160a060020a0390811691161461268257600080fd5b600a5460a060020a900460ff16151561269a57600080fd5b8994508693508592508891505b64ffffffffff8089169083161161287a5784600160a060020a0316636352211e8360405160e060020a63ffffffff841602815264ffffffffff9091166004820152602401602060405180830381600087803b151561270457600080fd5b5af1151561271157600080fd5b50505060405180519050905086600160a060020a031681600160a060020a031614156127c05783600160a060020a0316639ccaec988360405160e060020a63ffffffff841602815264ffffffffff909116600482015260240160c060405180830381600087803b151561278357600080fd5b5af1151561279057600080fd5b50505060405180519060200180519060200180519060200180519060200180519060200180515094955050505050505b85600160a060020a031681600160a060020a031614156128635782600160a060020a0316639ccaec988360405160e060020a63ffffffff841602815264ffffffffff909116600482015260240160c060405180830381600087803b151561282657600080fd5b5af1151561283357600080fd5b50505060405180519060200180519060200180519060200180519060200180519060200180515094955050505050505b61286f60008284614975565b6001909101906126a7565b50505050505050505050565b60095460009033600160a060020a039081169116146128a457600080fd5b5080600160a060020a03811663dcb31b826040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156128e357600080fd5b5af115156128f057600080fd5b50505060405180519050151561290557600080fd5b60088054600160a060020a031916600160a060020a039290921691909117905550565b60095433600160a060020a0390811691161461294357600080fd5b600a5460a060020a900460ff161561295a57600080fd5b600a805474ff0000000000000000000000000000000000000000191660a060020a179055565b600a5460a060020a900460ff161561299757600080fd5b64ffffffffff821615806129b057506129b03383614448565b15156129bb57600080fd5b600160a060020a038381166000908152600d60205260409020541615156129e157600080fd5b60008264ffffffffff1611156129fb576129fb828461446f565b600160a060020a038084166000908152600d602052604090819020549091169063a055d4559034908590859033905160e060020a63ffffffff871602815264ffffffffff90931660048401526024830191909152600160a060020a031660448201526064016000604051808303818588803b1515612a7857600080fd5b5af11515612a8557600080fd5b50505050505050565b601154605060020a900464ffffffffff1681565b60105464ffffffffff1681565b600080612abf8a8a8a8a8a6133db565b90506001818686866040516000815260200160405260405193845260ff9092166020808501919091526040808501929092526060840192909252608090920191516020810390808403906000865af11515612b1957600080fd5b5050602060405103519a9950505050505050505050565b612b3861537d565b60408051908101604052600281527f42430000000000000000000000000000000000000000000000000000000000006020820152905090565b60008060008364ffffffffff16815481101515612b8a57fe5b60009182526020909120600290910201549392505050565b600a5460a060020a900460ff1615612bb957600080fd5b64ffffffffff86161580612bd25750612bd23387614448565b1515612bdd57600080fd5b600160a060020a038881166000908152600d6020526040902054161515612c0357600080fd5b64ffffffffff87166000908152600f6020526040902054600160a060020a031615612c2d57600080fd5b60105464ffffffffff9081169088161015612c4757600080fd5b346001608060020a0386161115612c5d57600080fd5b612c6d8888888888888888611c36565b1515612c7857600080fd5b64ffffffffff87166000908152600f6020526040908190208054600160a060020a03191633600160a060020a038116919091179091557f3b213e544d7183ac9b8a682aa7ad1d52d0b2c05c7aba9bf7bc025d7b3847b63e918991905164ffffffffff9092168252600160a060020a031660208201526040908101905180910390a1600160a060020a038089166000908152600d6020526040908190205490911690639652713e9087908990889033905160e060020a63ffffffff871602815264ffffffffff90931660048401526024830191909152600160a060020a031660448201526064016000604051808303818588803b1515612d7657600080fd5b5af11515612d8357600080fd5b505050505050505050505050565b60008060008364ffffffffff16815481101515612daa57fe5b600091825260209091206002909102016001015460b060020a900461ffff169392505050565b600a5460009033600160a060020a0390811691161480612dfe575060095433600160a060020a039081169116145b1515612e0957600080fd5b60115464ffffffffff6501000000000082048116911610612e2957600080fd5b612e3a600080600080893042614707565b600554909150612e54908290600160a060020a031661446f565b600554600160a060020a031663c1d1faf3828686863060405160e060020a63ffffffff881602815264ffffffffff95861660048201526001608060020a0394851660248201529290931660448301529092166064830152600160a060020a0316608482015260a401600060405180830381600087803b1515612ed557600080fd5b5af11515612ee257600080fd5b50506011805464ffffffffff8082166001011664ffffffffff19909116179055505050505050565b8015612f445733600160a060020a0390811660009081526007602052604090208054600160a060020a031916918416919091179055612f6b565b600160a060020a03331660009081526007602052604090208054600160a060020a03191690555b81600160a060020a031633600160a060020a03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051901515815260200160405180910390a35050565b60095460009033600160a060020a03908116911614612fd657600080fd5b600160a060020a038083166000908152600d6020526040908190205490911690631195236990518163ffffffff1660e060020a028152600401600060405180830381600087803b151561302857600080fd5b5af1151561303557600080fd5b50505050600160a060020a0381166000908152600d602052604081208054600160a060020a03191690555b600e548110156131215781600160a060020a0316600e8281548110151561308357fe5b600091825260209091200154600160a060020a0316141561311857600e805460001981019081106130b057fe5b600091825260209091200154600e8054600160a060020a0390921691839081106130d657fe5b60009182526020909120018054600160a060020a031916600160a060020a0392909216919091179055600e80549061311290600019830161540d565b5061311c565b6001015b613060565b5050565b600a5433600160a060020a0390811691161480613150575060095433600160a060020a039081169116145b151561315b57600080fd5b600a5460a060020a900460ff161561317257600080fd5b61317c3083614448565b151561318757600080fd5b613121308284614975565b600a5460a060020a900460ff16156131a957600080fd5b8064ffffffffff8111156131bc57600080fd5b6131c63383614448565b15156131d157600080fd5b6118bd338484614975565b600160205260009081526040902054600160a060020a031681565b60095433600160a060020a0390811691161461321257600080fd5b600160a060020a038116151561322757600080fd5b600a8054600160a060020a031916600160a060020a0392909216919091179055565b600f60205260009081526040902054600160a060020a031681565b600a5460a060020a900460ff161561327b57600080fd5b8264ffffffffff81111561328e57600080fd5b600160a060020a03851615156132a357600080fd5b30600160a060020a031685600160a060020a0316141515156132c457600080fd5b600554600160a060020a03868116911614156132df57600080fd5b600654600160a060020a03868116911614156132fa57600080fd5b613304338561494e565b8061331457506133148633613f21565b151561331f57600080fd5b6133298685614448565b151561333457600080fd5b61333f868686614975565b84600160a060020a031663f0b9e5ba8786868660405160e060020a63ffffffff8716028152600160a060020a0385166004820190815260248201859052606060448301908152606483018490529091608401848480828437820191505095505050505050602060405180830381600087803b15156133bc57600080fd5b5af115156133c957600080fd5b50505060405180515050505050505050565b60008585858585604051600160a060020a03959095166c0100000000000000000000000002855264ffffffffff9384167b0100000000000000000000000000000000000000000000000000000090810260148701529290931690910260198401526001608060020a031670010000000000000000000000000000000002601e830152602e820152604e016040518091039020905095945050505050565b600a546000908190819060a060020a900460ff161561349657600080fd5b6134a03386614448565b15156134ab57600080fd5b6134b58486614a6b565b15156134c057600080fd5b346134cb8686611fbb565b11156134d657600080fd5b6000805464ffffffffff87169081106134eb57fe5b9060005260206000209060020201915061358f8261010060405190810160409081528254825260019092015464ffffffffff8082166020840152650100000000008204811693830193909352605060020a810483166060830152607860020a8104909216608082015260a060020a820461ffff90811660a083015260b060020a83041660c082015260c060020a90910467ffffffffffffffff1660e0820152614431565b151561359a57600080fd5b6000805464ffffffffff86169081106135af57fe5b906000526020600020906002020190506136538161010060405190810160409081528254825260019092015464ffffffffff8082166020840152650100000000008204811693830193909352605060020a810483166060830152607860020a8104909216608082015260a060020a820461ffff90811660a083015260b060020a83041660c082015260c060020a90910467ffffffffffffffff1660e0820152614431565b151561365e57600080fd5b61366a82868387614ad4565b151561367557600080fd5b61367f8585614d2a565b95945050505050565b600080548290811061369657fe5b60009182526020909120600290910201805460019091015490915064ffffffffff80821691650100000000008104821691605060020a8204811691607860020a81049091169061ffff60a060020a820481169160b060020a81049091169067ffffffffffffffff60c060020a9091041688565b600a5460009060a060020a900460ff161561372357600080fd5b600160a060020a033381166000908152600d602052604090205416151561374957600080fd5b6000805464ffffffffff851690811061375e57fe5b60009182526020909120600290910201600181015490915064ffffffffff8381166501000000000090920416146118bd57600181015464ffffffffff808516917fd82e4273ca71de0024aece65309941bf92bf97c355ca08ed03de5d18c09b38189165010000000000909104168460405164ffffffffff9283168152911660208201526040908101905180910390a260018101805464ffffffffff8416650100000000000269ffffffffff000000000019909116179055505050565b600b8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156138b05780601f10613885576101008083540402835291602001916138b0565b820191906000526020600020905b81548152906001019060200180831161389357829003601f168201915b505050505081565b6138c061537d565b61114f613966600b8054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561395c5780601f106139315761010080835404028352916020019161395c565b820191906000526020600020905b81548152906001019060200180831161393f57829003601f168201915b5050505050614f32565b6139eb61397861397d61397887614f5a565b614f32565b6139eb600c8054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561395c5780601f106139315761010080835404028352916020019161395c565b615270565b600a5460009060a060020a900460ff1615613a0a57600080fd5b600160a060020a033381166000908152600d6020526040902054161515613a3057600080fd5b6000805464ffffffffff8516908110613a4557fe5b60009182526020909120600290910201600181015490915061ffff83811660a060020a90920416146118bd57600181015464ffffffffff8416907f0b95606a57983e48ae4c9631df8d2e17766c3017421531c1004a4882888ef2749060a060020a900461ffff168460405161ffff9283168152911660208201526040908101905180910390a260018101805461ffff841660a060020a0275ffff000000000000000000000000000000000000000019909116179055505050565b600c8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156138b05780601f10613885576101008083540402835291602001916138b0565b60095460009033600160a060020a03908116911614613b8857600080fd5b5080600160a060020a0381166394a892336040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515613bc757600080fd5b5af11515613bd457600080fd5b505050604051805190501515613be957600080fd5b600160a060020a038281166000908152600d602052604090208054600160a060020a031916918316919091179055600e805460018101613c29838261540d565b5060009182526020909120018054600160a060020a031916600160a060020a039290921691909117905550565b6000808064ffffffffff8516819011613c6e57600080fd5b600064ffffffffff851611613c8257600080fd5b6000805464ffffffffff8716908110613c9757fe5b9060005260206000209060020201915060008464ffffffffff16815481101515613cbd57fe5b90600052602060002090600202019050613cd982868387614ad4565b801561367f575061367f8486614a6b565b601054790100000000000000000000000000000000000000000000000000900464ffffffffff1681565b600a5460009060a060020a900460ff1615613d2e57600080fd5b600160a060020a033381166000908152600d6020526040902054161515613d5457600080fd5b6000805464ffffffffff8516908110613d6957fe5b906000526020600020906002020190508181600001541415156118bd578264ffffffffff167fbecce9a2928a6d9bbe3755bd02387af9dbe05d1ecfa05028c33d7245e24a860c82600001548460405191825260208201526040908101905180910390a25550565b60095460009033600160a060020a03908116911614613dee57600080fd5b5080600160a060020a0381166390da7c3c6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515613e2d57600080fd5b5af11515613e3a57600080fd5b505050604051805190501515613e4f57600080fd5b60128054600160a060020a031916600160a060020a039290921691909117905550565b600554600160a060020a031681565b60008060008060008060008060008964ffffffffff16815481101515613ea357fe5b600091825260209091206002909102018054600190910154909a64ffffffffff8083169b5065010000000000830481169a50605060020a830481169950607860020a830416975061ffff60a060020a83048116975060b060020a909204909116945092505050565b60115465010000000000900464ffffffffff1681565b600160a060020a03918216600090815260076020526040902054821691161490565b6000806000806000806000806000613f59615431565b60095433600160a060020a03908116911614613f7457600080fd5b600a5460a060020a900460ff161515613f8c57600080fd5b8b64ffffffffff16613f9c61153d565b60010114613fa957600080fd5b8c99508b98505b64ffffffffff808c16908a16116142215789600160a060020a031663e39bdfab8a60405160e060020a63ffffffff841602815264ffffffffff909116600482015260240160e060405180830381600087803b151561400d57600080fd5b5af1151561401a57600080fd5b5050506040518051906020018051906020018051906020018051906020018051906020018051906020018051969e50949c50929a50909850965094509092506101009050604051908101604052808981526020018864ffffffffff1681526020018764ffffffffff1681526020018664ffffffffff1681526020018564ffffffffff1681526020018461ffff1681526020018361ffff168152602001600067ffffffffffffffff168152509050600080548060010182816140db9190615475565b6000928352602090922083916002020181518155602082015160018201805464ffffffffff191664ffffffffff9290921691909117905560408201518160010160056101000a81548164ffffffffff021916908364ffffffffff160217905550606082015181600101600a6101000a81548164ffffffffff021916908364ffffffffff160217905550608082015181600101600f6101000a81548164ffffffffff021916908364ffffffffff16021790555060a08201518160010160146101000a81548161ffff021916908361ffff16021790555060c08201518160010160166101000a81548161ffff021916908361ffff16021790555060e08201516001918201805467ffffffffffffffff9290921660c060020a0277ffffffffffffffffffffffffffffffffffffffffffffffff9092169190911790559a909a019950613fb09050565b50505050505050505050505050565b600e80548290811061423e57fe5b600091825260209091200154600160a060020a0316905081565b600a54600090819060a060020a900460ff161561427457600080fd5b61427e3384614448565b151561428957600080fd5b61429283611155565b151561429d57600080fd5b6142a783856152dc565b15156142b257600080fd5b6142bc8385611fbb565b905034819010156142cc57600080fd5b600654600160a060020a031663c170fd54348390038660405160e060020a63ffffffff851602815264ffffffffff90911660048201526024016000604051808303818588803b151561431d57600080fd5b5af1151561432a57600080fd5b505050506143388385614d2a565b64ffffffffff16949350505050565b60008060008364ffffffffff1681548110151561436057fe5b600091825260209091206002909102016001015465010000000000900464ffffffffff169392505050565b600a5460a060020a900460ff16156143a257600080fd5b6143ac3382614448565b15156143b757600080fd5b64ffffffffff8116600090815260046020526040908190208054600160a060020a031916600160a060020a038581169182179092559133909116907fe53f1ce10d7caafaafcb8d2857c06db87da891294ba914f8436e31b905e1e0e79084905164ffffffffff909116815260200160405180910390a35050565b600042826040015164ffffffffff16111592915050565b64ffffffffff16600090815260016020526040902054600160a060020a0391821691161490565b64ffffffffff9190911660009081526003602052604090208054600160a060020a031916600160a060020a03909216919091179055565b600181015460085460a060020a90910461ffff1690600090600160a060020a03166306347def8360405160e060020a63ffffffff841602815261ffff9091166004820152602401602060405180830381600087803b151561450657600080fd5b5af1151561451357600080fd5b505050604051805160018501805469ffffffffff000000000019166501000000000064ffffffffff9384168102919091179182905587831693507fd82e4273ca71de0024aece65309941bf92bf97c355ca08ed03de5d18c09b3818928692919091041660405164ffffffffff9283168152911660208201526040908101905180910390a2600854600160a060020a031663732606fc6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156145d657600080fd5b5af115156145e357600080fd5b505050604051805160018086015461ffff60a060020a9091048116909101161015905061193157506001808301805461ffff60a060020a80830482169485018216810275ffff000000000000000000000000000000000000000019909316929092179283905564ffffffffff8716927f0b95606a57983e48ae4c9631df8d2e17766c3017421531c1004a4882888ef27492859291041660405161ffff9283168152911660208201526040908101905180910390a250505050565b600854600090600160a060020a0316635757dcdf8360405160e060020a63ffffffff841602815261ffff9091166004820152602401602060405180830381600087803b15156146eb57600080fd5b5af115156146f857600080fd5b50505060405180519392505050565b6000614711615431565b600080610100604051908101604090815288825264ffffffffff808816602084015260009183018290528d811660608401528c16608083015261ffff808b1660a08401528b1660c083015260e0820181905280549194506001918083016147788382615475565b6000928352602090922086916002020181518155602082015160018201805464ffffffffff191664ffffffffff9290921691909117905560408201518160010160056101000a81548164ffffffffff021916908364ffffffffff160217905550606082015181600101600a6101000a81548164ffffffffff021916908364ffffffffff160217905550608082015181600101600f6101000a81548164ffffffffff021916908364ffffffffff16021790555060a08201518160010160146101000a81548161ffff021916908361ffff16021790555060c08201518160010160166101000a81548161ffff021916908361ffff16021790555060e08201516001909101805467ffffffffffffffff9290921660c060020a0277ffffffffffffffffffffffffffffffffffffffffffffffff9092169190911790555003915064ffffffffff8211156148c757600080fd5b5080600160a060020a0386167f689df1285a731b7022f6ff5c63e6b7c58c891df5b4530f12b7be0ec9ad03ecdb8260608601518660800151875160405164ffffffffff9485168152928416602084015292166040808301919091526060820192909252608001905180910390a261494060008783614975565b9a9950505050505050505050565b64ffffffffff16600090815260036020526040902054600160a060020a0391821691161490565b600160a060020a0380831660008181526002602090815260408083208054600190810190915564ffffffffff8716845290915290208054600160a060020a0319169091179055831615614a1757600160a060020a0383166000908152600260209081526040808320805460001901905564ffffffffff84168352600482528083208054600160a060020a03199081169091556003909252909120805490911690555b81600160a060020a031683600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405164ffffffffff909116815260200160405180910390a3505050565b64ffffffffff8082166000908152600160205260408082205492851682528120549091600160a060020a0390811691168082148061367f575064ffffffffff8516600090815260046020526040902054600160a060020a03908116908316149250505092915050565b60008364ffffffffff168264ffffffffff161415614af457506000614d22565b600185015464ffffffffff838116605060020a909204161415614b1957506000614d22565b600185015464ffffffffff838116607860020a909204161415614b3e57506000614d22565b600183015464ffffffffff858116605060020a909204161415614b6357506000614d22565b600183015464ffffffffff858116607860020a909204161415614b8857506000614d22565b6001830154605060020a900464ffffffffff161515614ba957506001614d22565b6001850154605060020a900464ffffffffff161515614bca57506001614d22565b60018581015490840154605060020a9182900464ffffffffff90811692909104161415614bf957506000614d22565b60018086015490840154605060020a900464ffffffffff908116607860020a909204161415614c2a57506000614d22565b60018086015490840154607860020a900464ffffffffff908116605060020a909204161415614c5b57506000614d22565b60018581015490840154607860020a9182900464ffffffffff90811692909104161415614c8a57506000614d22565b60125485548454600160a060020a039092169163c868a569918791869060405160e060020a63ffffffff871602815264ffffffffff94851660048201526024810193909352921660448201526064810191909152608401602060405180830381600087803b1515614cfa57600080fd5b5af11515614d0757600080fd5b5050506040518051905015614d1e57506001614d22565b5060005b949350505050565b6000806000806000806000808864ffffffffff16815481101515614d4a57fe5b9060005260206000209060020201955060008964ffffffffff16815481101515614d7057fe5b90600052602060002090600202019450614d8a88876144a6565b614d9489866144a6565b64ffffffffff808a166000908152600460205260408082208054600160a060020a03199081169091558b841683529120805490911690556001860154161515614ddc57600080fd5b60085460018681015490880154600160a060020a0390921691631af97fb79161ffff60b060020a91829004811692919091041660405160e060020a63ffffffff851602815261ffff928316600482015291166024820152604401602060405180830381600087803b1515614e4f57600080fd5b5af11515614e5c57600080fd5b505050604051805160125487548954929750600160a060020a039091169250638d8b1b889160405160e060020a63ffffffff851602815260048101929092526024820152604401602060405180830381600087803b1515614ebc57600080fd5b5af11515614ec957600080fd5b505050604051805164ffffffffff8b16600090815260016020526040902054909450600160a060020a03169250614f259050898986614f078161469d565b60018a01548890889065010000000000900464ffffffffff16614707565b9998505050505050505050565b614f3a6154a1565b602082016040805190810160405280845181526020019190915292915050565b614f6261537d565b614f6a61537d565b6000614f7461537d565b60206040519081016040526000815292505b600a808604950691506020604051908101604052600081529050811515614fe25760408051908101604052600181527f300000000000000000000000000000000000000000000000000000000000000060208201529050615242565b81600114156150265760408051908101604052600181527f310000000000000000000000000000000000000000000000000000000000000060208201529050615242565b816002141561506a5760408051908101604052600181527f320000000000000000000000000000000000000000000000000000000000000060208201529050615242565b81600314156150ae5760408051908101604052600181527f330000000000000000000000000000000000000000000000000000000000000060208201529050615242565b81600414156150f25760408051908101604052600181527f340000000000000000000000000000000000000000000000000000000000000060208201529050615242565b81600514156151365760408051908101604052600181527f350000000000000000000000000000000000000000000000000000000000000060208201529050615242565b816006141561517a5760408051908101604052600181527f360000000000000000000000000000000000000000000000000000000000000060208201529050615242565b81600714156151be5760408051908101604052600181527f370000000000000000000000000000000000000000000000000000000000000060208201529050615242565b81600814156152025760408051908101604052600181527f380000000000000000000000000000000000000000000000000000000000000060208201529050615242565b81600914156152425760408051908101604052600181527f3900000000000000000000000000000000000000000000000000000000000000602082015290505b61525761524e82614f32565b6139eb85614f32565b9250600085111561526757614f86565b50909392505050565b61527861537d565b61528061537d565b600083518551016040518059106152945750595b818152601f19601f8301168101602001604052905091506020820190506152c18186602001518751615338565b6152d48551820185602001518651615338565b509392505050565b6000806000808564ffffffffff168154811015156152f657fe5b9060005260206000209060020201915060008464ffffffffff1681548110151561531c57fe5b9060005260206000209060020201905061367f82868387614ad4565b60005b6020821061535e578251845260208401935060208301925060208203915061533b565b6001826020036101000a03905080198351168185511617909352505050565b60206040519081016040526000815290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106153d057805160ff19168380011785556153fd565b828001600101855582156153fd579182015b828111156153fd5782518255916020019190600101906153e2565b506154099291506154b8565b5090565b8154818355818115116118bd576000838152602090206118bd9181019083016154b8565b6101006040519081016040908152600080835260208301819052908201819052606082018190526080820181905260a0820181905260c0820181905260e082015290565b8154818355818115116118bd576002028160020283600052602060002091820191016118bd91906154d2565b604080519081016040526000808252602082015290565b61126d91905b8082111561540957600081556001016154be565b61126d91905b8082111561540957600080825560018201556002016154d85600a165627a7a72305820fccbe691abb06d9806ab2748d7bf4cc1482eac0cf5def2e6910ac841da66403b0029
Deployed Bytecode
0x6060604052600436106103ac5763ffffffff60e060020a60003504166219a46b811461040857806301ffc9a71461043557806305910b911461047e57806306fdde031461049b578063081812fc1461052557806308ba7ee714610557578063095ea7b31461058e5780630da2e088146105b05780630dca63e8146105c357806310e9678b146105e257806313af4035146105ff57806318160ddd1461061e5780631bbfce0e14610643578063210fcbf61461065557806323b872dd146106775780632917f1621461069f5780632f745c59146106d35780633e6d4e12146106f55780633f4ba83a1461072f57806340a92f0f1461074257806342842e0e1461075f578063430c73c51461078757806345c7a092146107ac5780634b12e643146107f65780634d6a813a146108155780634f6ccce71461082857806350bc6bba1461083e578063551799131461086b5780635a390a5f146108885780635a3f88f01461089b5780635c975abb146108bf5780635f24f6fe146108d25780636352211e146108f157806366dc860a146109075780636c2959361461092a5780636ccbb0ab1461095457806370a0823114610967578063776247c41461098657806378a6c6d21461099957806379502c55146109c657806379edfa7d146109d9578063839daf1d14610a6c57806383a12de914610aaa5780638456cb5914610ac9578063887e0c0714610adc578063889231c114610afd5780638f9a57ef14610b1057806394e50e7a14610b2357806395d89b4114610b6d578063999d394714610b805780639ad73f2014610b9d5780639c91ae2014610bdc5780639de8302f14610bf9578063a22cb46514610c2b578063a4d95b6414610c4f578063a86ee74614610c6e578063a9059cbb14610c97578063b1d9549714610cb9578063b3ab15fb14610cd6578063b5113bf614610cf5578063b88d4fde14610d12578063bdad811214610d49578063c30bc5ef14610d87578063c44f217414610d9f578063c479142114610e16578063c7047fa714610e39578063c87b56dd14610e4c578063cf7e69f814610e62578063d4d6d36614610e86578063d8867fc814610e99578063d997933f14610eb8578063e09ef83e14610edb578063e1af915d14610eee578063e205842414610f0e578063e33607da14610f2d578063e39bdfab14610f40578063e515a4d114610fab578063e985e9c514610fbe578063edc9f18214610fe3578063f3ca087314611012578063f3cb180514611028578063f6dfcff714611040578063fb43b2a21461105d575b60055433600160a060020a03908116911614806103d7575060065433600160a060020a039081169116145b806103fb5750600160a060020a033381166000908152600d60205260409020541615155b151561040657600080fd5b005b341561041357600080fd5b61041b611086565b60405164ffffffffff909116815260200160405180910390f35b341561044057600080fd5b61046a7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1960043516611093565b604051901515815260200160405180910390f35b341561048957600080fd5b61046a64ffffffffff60043516611155565b34156104a657600080fd5b6104ae61122e565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156104ea5780820151838201526020016104d2565b50505050905090810190601f1680156105175780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561053057600080fd5b61053b600435611270565b604051600160a060020a03909116815260200160405180910390f35b341561056257600080fd5b610406600160a060020a0360043581169060243581169060443581169060643581169060843516611325565b341561059957600080fd5b610406600160a060020a0360043516602435611408565b34156105bb57600080fd5b61053b61149d565b34156105ce57600080fd5b61053b600160a060020a03600435166114b5565b34156105ed57600080fd5b61053b64ffffffffff600435166114d0565b341561060a57600080fd5b610406600160a060020a03600435166114eb565b341561062957600080fd5b61063161153d565b60405190815260200160405180910390f35b61063164ffffffffff60043516611547565b341561066057600080fd5b610406600435600160a060020a03602435166117a0565b341561068257600080fd5b610406600160a060020a03600435811690602435166044356118c2565b34156106aa57600080fd5b6106bc64ffffffffff60043516611937565b60405161ffff909116815260200160405180910390f35b34156106de57600080fd5b610631600160a060020a0360043516602435611976565b341561070057600080fd5b61071264ffffffffff600435166119f5565b60405167ffffffffffffffff909116815260200160405180910390f35b341561073a57600080fd5b610406611a3a565b341561074d57600080fd5b61040664ffffffffff60043516611aac565b341561076a57600080fd5b610406600160a060020a0360043581169060243516604435611b57565b341561079257600080fd5b610406600160a060020a0360043581169060243516611bed565b34156107b757600080fd5b61046a600160a060020a036004351664ffffffffff602435811690604435166001608060020a036064351660843560ff60a4351660c43560e435611c36565b341561080157600080fd5b61053b600160a060020a0360043516611c6c565b341561082057600080fd5b61046a611c87565b341561083357600080fd5b61063160043561126d565b61040664ffffffffff6004358116906001608060020a036024358116916044359091169060643516611c8c565b341561087657600080fd5b61053b64ffffffffff60043516611d67565b341561089357600080fd5b61053b611d82565b34156108a657600080fd5b61040664ffffffffff6004351661ffff60243516611d91565b34156108ca57600080fd5b61046a611ea2565b34156108dd57600080fd5b610406600160a060020a0360043516611eb2565b34156108fc57600080fd5b61053b600435611f78565b341561091257600080fd5b61063164ffffffffff60043581169060243516611fbb565b341561093557600080fd5b61040664ffffffffff6004351667ffffffffffffffff60243516612031565b341561095f57600080fd5b610406612159565b341561097257600080fd5b610631600160a060020a03600435166122c0565b341561099157600080fd5b6104066122db565b61040664ffffffffff6004358116906001608060020a036024358116916044359091169060643516612533565b34156109d157600080fd5b61053b61260b565b34156109e457600080fd5b61040660046024813581810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284378201915050505050509190803590602001908201803590602001908080601f01602080910402602001604051908101604052818152929190602084018383808284375094965061261a95505050505050565b3415610a7757600080fd5b610406600160a060020a0360043581169064ffffffffff602435811691604435909116906064358116906084351661265c565b3415610ab557600080fd5b610406600160a060020a0360043516612886565b3415610ad457600080fd5b610406612928565b610406600160a060020a036004351664ffffffffff60243516604435612980565b3415610b0857600080fd5b61041b612a8e565b3415610b1b57600080fd5b61041b612aa2565b3415610b2e57600080fd5b61053b600160a060020a036004351664ffffffffff602435811690604435166001608060020a036064351660843560ff60a4351660c43560e435612aaf565b3415610b7857600080fd5b6104ae612b30565b3415610b8b57600080fd5b61063164ffffffffff60043516612b71565b610406600160a060020a036004351664ffffffffff602435811690604435166001608060020a036064351660843560ff60a4351660c43560e435612ba2565b3415610be757600080fd5b6106bc64ffffffffff60043516612d91565b3415610c0457600080fd5b6104066004356001608060020a036024358116906044351664ffffffffff60643516612dd0565b3415610c3657600080fd5b610406600160a060020a03600435166024351515612f0a565b3415610c5a57600080fd5b610406600160a060020a0360043516612fb8565b3415610c7957600080fd5b61040664ffffffffff60043516600160a060020a0360243516613125565b3415610ca257600080fd5b610406600160a060020a0360043516602435613192565b3415610cc457600080fd5b61053b64ffffffffff600435166131dc565b3415610ce157600080fd5b610406600160a060020a03600435166131f7565b3415610d0057600080fd5b61053b64ffffffffff60043516613249565b3415610d1d57600080fd5b610406600160a060020a0360048035821691602480359091169160443591606435908101910135613264565b3415610d5457600080fd5b610631600160a060020a036004351664ffffffffff602435811690604435166001608060020a03606435166084356133db565b61041b64ffffffffff60043581169060243516613478565b3415610daa57600080fd5b610db5600435613688565b60405197885264ffffffffff9687166020890152948616604080890191909152938616606088015291909416608086015261ffff93841660a086015290921660c084015267ffffffffffffffff1660e0830152610100909101905180910390f35b3415610e2157600080fd5b61040664ffffffffff60043581169060243516613709565b3415610e4457600080fd5b6104ae61381a565b3415610e5757600080fd5b6104ae6004356138b8565b3415610e6d57600080fd5b61040664ffffffffff6004351661ffff602435166139f0565b3415610e9157600080fd5b6104ae613aff565b3415610ea457600080fd5b610406600160a060020a0360043516613b6a565b3415610ec357600080fd5b61046a64ffffffffff60043581169060243516613c56565b3415610ee657600080fd5b61041b613cea565b3415610ef957600080fd5b61040664ffffffffff60043516602435613d14565b3415610f1957600080fd5b610406600160a060020a0360043516613dd0565b3415610f3857600080fd5b61053b613e72565b3415610f4b57600080fd5b610f5d64ffffffffff60043516613e81565b60405196875264ffffffffff958616602088015293851660408088019190915292851660608701529316608085015261ffff92831660a0850152911660c083015260e0909101905180910390f35b3415610fb657600080fd5b61041b613f0b565b3415610fc957600080fd5b61046a600160a060020a0360043581169060243516613f21565b3415610fee57600080fd5b610406600160a060020a036004351664ffffffffff60243581169060443516613f43565b341561101d57600080fd5b61053b600435614230565b61063164ffffffffff60043581169060243516614258565b341561104b57600080fd5b61041b64ffffffffff60043516614347565b341561106857600080fd5b610406600160a060020a036004351664ffffffffff6024351661438b565b60115464ffffffffff1681565b60007f6466353c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff198316148061114f57506040517f737570706f727473496e74657266616365286279746573342900000000000000815260190160405180910390207bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b92915050565b60008064ffffffffff831681901161116c57600080fd5b6000805464ffffffffff851690811061118157fe5b906000526020600020906002020190506112258161010060405190810160409081528254825260019092015464ffffffffff8082166020840152650100000000008204811693830193909352605060020a810483166060830152607860020a8104909216608082015260a060020a820461ffff90811660a083015260b060020a83041660c082015260c060020a90910467ffffffffffffffff1660e0820152614431565b91505b50919050565b61123661537d565b60408051908101604052601081527f426c6f636b636861696e43757469657300000000000000000000000000000000602082015290505b90565b6000808264ffffffffff81111561128657600080fd5b61128e61153d565b84111561129a57600080fd5b64ffffffffff8416600090815260036020526040902054600160a060020a0316156112e65764ffffffffff8416600090815260036020526040902054600160a060020a0316925061131e565b64ffffffffff8416600090815260016020908152604080832054600160a060020a039081168085526007909352922054909116935091505b5050919050565b60095433600160a060020a0390811691161461134057600080fd5b600160a060020a038516151561135557600080fd5b600160a060020a038416151561136a57600080fd5b600160a060020a038316151561137f57600080fd5b600160a060020a038216151561139457600080fd5b600160a060020a03811615156113a957600080fd5b60148054600160a060020a0319908116600160a060020a03978816179091556015805482169587169590951790945560168054851693861693909317909255601780548416918516919091179055601880549092169216919091179055565b600a5460a060020a900460ff161561141f57600080fd5b8064ffffffffff81111561143257600080fd5b61143c3383614448565b151561144757600080fd5b611451828461446f565b82600160a060020a031633600160a060020a03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405190815260200160405180910390a3505050565b601054650100000000009004600160a060020a031681565b600760205260009081526040902054600160a060020a031681565b600360205260009081526040902054600160a060020a031681565b60095433600160a060020a0390811691161461150657600080fd5b600160a060020a038116151561151b57600080fd5b60098054600160a060020a031916600160a060020a0392909216919091179055565b6000546000190190565b600080600080600080600a60149054906101000a900460ff1615151561156c57600080fd5b600160a060020a03331660009081526013602052604090205464ffffffffff161561159657600080fd5b6115a1600088611fbb565b945034859010156115b157600080fd5b600654600160a060020a031663c170fd54348790038960405160e060020a63ffffffff851602815264ffffffffff90911660048201526024016000604051808303818588803b151561160257600080fd5b5af1151561160f57600080fd5b5050505060008764ffffffffff1681548110151561162957fe5b9060005260206000209060020201935061164387856144a6565b64ffffffffff8716600090815260046020526040908190208054600160a060020a03191690556008546001860154600160a060020a039091169163656e8d6f9160b060020a900461ffff16905160e060020a63ffffffff841602815261ffff9091166004820152602401602060405180830381600087803b15156116c657600080fd5b5af115156116d357600080fd5b50505060405180516012548654919550600160a060020a03169150638d8b1b889060009060405160e060020a63ffffffff851602815260048101929092526024820152604401602060405180830381600087803b151561173257600080fd5b5af1151561173f57600080fd5b5050506040518051905091506117646000888561175b8761469d565b8633600c614707565b33600160a060020a03166000908152601360205260409020805464ffffffffff191664ffffffffff929092169182179055979650505050505050565b600a5433600160a060020a03908116911614806117cb575060095433600160a060020a039081169116145b15156117d657600080fd5b601154601054605060020a90910464ffffffffff908116790100000000000000000000000000000000000000000000000000909204161061181657600080fd5b600160a060020a03811615156118345750600a54600160a060020a03165b60108054600164ffffffffff790100000000000000000000000000000000000000000000000000808404821683018216027fffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffff909316929092179092556011805480831690930190911664ffffffffff199092169190911790556118bd6000808080868642614707565b505050565b600a5460a060020a900460ff16156118d957600080fd5b8064ffffffffff8111156118ec57600080fd5b6118f6338361494e565b8061190657506119068433613f21565b151561191157600080fd5b61191b8483614448565b151561192657600080fd5b611931848484614975565b50505050565b60008060008364ffffffffff1681548110151561195057fe5b600091825260209091206002909102016001015460a060020a900461ffff169392505050565b60008060015b61198461153d565b64ffffffffff8216116119e85764ffffffffff8116600090815260016020526040902054600160a060020a03868116911614156119e057838264ffffffffff1614156119d9578064ffffffffff1692506119ed565b6001909101905b60010161197c565b600080fd5b505092915050565b60008060008364ffffffffff16815481101515611a0e57fe5b600091825260209091206002909102016001015460c060020a900467ffffffffffffffff169392505050565b60095433600160a060020a03908116911614611a5557600080fd5b600a5460a060020a900460ff161515611a6d57600080fd5b601054650100000000009004600160a060020a031615611a8c57600080fd5b600a805474ff000000000000000000000000000000000000000019169055565b600a5433600160a060020a0390811691161480611ad7575060095433600160a060020a039081169116145b1515611ae257600080fd5b60105464ffffffffff90811690821611611afb57600080fd5b6010805464ffffffffff191664ffffffffff83811691909117918290557f61adbe79b14a8cd89d2e6b327307808e258e0e9a9da800e5c9c5cf5b20efc91c911660405164ffffffffff909116815260200160405180910390a150565b600a5460a060020a900460ff1615611b6e57600080fd5b8064ffffffffff811115611b8157600080fd5b600160a060020a0383161515611b9657600080fd5b30600160a060020a031683600160a060020a031614151515611bb757600080fd5b600554600160a060020a0384811691161415611bd257600080fd5b600654600160a060020a03848116911614156118ec57600080fd5b60095433600160a060020a03908116911614611c0857600080fd5b60068054600160a060020a03938416600160a060020a03199182161790915560058054929093169116179055565b600a54600090600160a060020a0316611c558a8a8a8a8a8a8a8a612aaf565b600160a060020a0316149998505050505050505050565b600d60205260009081526040902054600160a060020a031681565b600190565b600a5460a060020a900460ff1615611ca357600080fd5b611cad3385614448565b1515611cb857600080fd5b600554611ccf908590600160a060020a031661446f565b600554600160a060020a031663c1d1faf334868686863360405160e060020a63ffffffff891602815264ffffffffff95861660048201526001608060020a0394851660248201529290931660448301529092166064830152600160a060020a0316608482015260a4016000604051808303818588803b1515611d5057600080fd5b5af11515611d5d57600080fd5b5050505050505050565b600460205260009081526040902054600160a060020a031681565b600654600160a060020a031681565b600a5460009060a060020a900460ff1615611dab57600080fd5b600160a060020a033381166000908152600d6020526040902054161515611dd157600080fd5b6000805464ffffffffff8516908110611de657fe5b60009182526020909120600290910201600181015490915061ffff83811660b060020a90920416146118bd57600181015464ffffffffff8416907f253c1885cda0cc3462691396c0720f0b8d26a408db39c442f6cba580aa2bacbe9060b060020a900461ffff168460405161ffff9283168152911660208201526040908101905180910390a260018101805461ffff841660b060020a0277ffff0000000000000000000000000000000000000000000019909116179055505050565b600a5460a060020a900460ff1681565b60095433600160a060020a03908116911614611ecd57600080fd5b600a5460a060020a900460ff161515611ee557600080fd5b600160a060020a0381161515611efa57600080fd5b6010805478ffffffffffffffffffffffffffffffffffffffff0000000000191665010000000000600160a060020a03848116820292909217928390557f450db8da6efbe9c22f2347f7c2021231df1fc58d3ae9a2fa75d39fa446199305920416604051600160a060020a03909116815260200160405180910390a150565b60008164ffffffffff811115611f8d57600080fd5b64ffffffffff8316600090815260016020526040902054600160a060020a0316915081151561122857600080fd5b600854600090600160a060020a03166366dc860a848460405160e060020a63ffffffff851602815264ffffffffff928316600482015291166024820152604401602060405180830381600087803b151561201457600080fd5b5af1151561202157600080fd5b5050506040518051949350505050565b600a5460009060a060020a900460ff161561204b57600080fd5b600160a060020a033381166000908152600d602052604090205416151561207157600080fd5b6000805464ffffffffff851690811061208657fe5b60009182526020909120600290910201600181015490915067ffffffffffffffff83811660c060020a90920416146118bd57600181015464ffffffffff8416907f0e4fadd6d53b262b076fce73fbf5c344b680a42f10f095326782f42d56b9beb29060c060020a900467ffffffffffffffff168460405167ffffffffffffffff9283168152911660208201526040908101905180910390a260018101805467ffffffffffffffff841660c060020a0277ffffffffffffffffffffffffffffffffffffffffffffffff909116179055505050565b60095460009033600160a060020a03908116911614806121875750600a5433600160a060020a039081169116145b151561219257600080fd5b600554600160a060020a031663776247c46040518163ffffffff1660e060020a028152600401600060405180830381600087803b15156121d157600080fd5b5af115156121de57600080fd5b5050600654600160a060020a0316905063776247c46040518163ffffffff1660e060020a028152600401600060405180830381600087803b151561222157600080fd5b5af1151561222e57600080fd5b505050600090505b600e5463ffffffff821610156122bd57600e805463ffffffff831690811061225a57fe5b600091825260209091200154600160a060020a0316633ccfd60b6040518163ffffffff1660e060020a028152600401600060405180830381600087803b15156122a257600080fd5b5af115156122af57600080fd5b505050806001019050612236565b50565b600160a060020a031660009081526002602052604090205490565b60145460009033600160a060020a0390811691161480612309575060155433600160a060020a039081169116145b80612322575060165433600160a060020a039081169116145b8061233b575060175433600160a060020a039081169116145b80612354575060185433600160a060020a039081169116145b8061236d575060095433600160a060020a039081169116145b806123865750600a5433600160a060020a039081169116145b151561239157600080fd5b601454600160a060020a031615156123a857600080fd5b601554600160a060020a031615156123bf57600080fd5b601654600160a060020a031615156123d657600080fd5b601754600160a060020a031615156123ed57600080fd5b601854600160a060020a0316151561240457600080fd5b50601454600160a060020a033081163191166108fc6103e860698402049081150290604051600060405180830381858888f19350505050151561244657600080fd5b601554600160a060020a03166103e8606983020480156108fc0290604051600060405180830381858888f19350505050151561248157600080fd5b601654600160a060020a03166103e8608c83020480156108fc0290604051600060405180830381858888f1935050505015156124bc57600080fd5b601754600160a060020a03166103e8608c83020480156108fc0290604051600060405180830381858888f1935050505015156124f757600080fd5b601854600160a060020a03166103e86101fe83020480156108fc0290604051600060405180830381858888f1935050505015156122bd57600080fd5b600a5460a060020a900460ff161561254a57600080fd5b6125543385614448565b151561255f57600080fd5b61256884611155565b151561257357600080fd5b60065461258a908590600160a060020a031661446f565b600654600160a060020a031663c1d1faf334868686863360405160e060020a63ffffffff891602815264ffffffffff95861660048201526001608060020a0394851660248201529290931660448301529092166064830152600160a060020a0316608482015260a4016000604051808303818588803b1515611d5057600080fd5b600854600160a060020a031681565b60095433600160a060020a0390811691161461263557600080fd5b600b82805161264892916020019061538f565b50600c8180516118bd92916020019061538f565b600954600090819081908190819033600160a060020a0390811691161461268257600080fd5b600a5460a060020a900460ff16151561269a57600080fd5b8994508693508592508891505b64ffffffffff8089169083161161287a5784600160a060020a0316636352211e8360405160e060020a63ffffffff841602815264ffffffffff9091166004820152602401602060405180830381600087803b151561270457600080fd5b5af1151561271157600080fd5b50505060405180519050905086600160a060020a031681600160a060020a031614156127c05783600160a060020a0316639ccaec988360405160e060020a63ffffffff841602815264ffffffffff909116600482015260240160c060405180830381600087803b151561278357600080fd5b5af1151561279057600080fd5b50505060405180519060200180519060200180519060200180519060200180519060200180515094955050505050505b85600160a060020a031681600160a060020a031614156128635782600160a060020a0316639ccaec988360405160e060020a63ffffffff841602815264ffffffffff909116600482015260240160c060405180830381600087803b151561282657600080fd5b5af1151561283357600080fd5b50505060405180519060200180519060200180519060200180519060200180519060200180515094955050505050505b61286f60008284614975565b6001909101906126a7565b50505050505050505050565b60095460009033600160a060020a039081169116146128a457600080fd5b5080600160a060020a03811663dcb31b826040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156128e357600080fd5b5af115156128f057600080fd5b50505060405180519050151561290557600080fd5b60088054600160a060020a031916600160a060020a039290921691909117905550565b60095433600160a060020a0390811691161461294357600080fd5b600a5460a060020a900460ff161561295a57600080fd5b600a805474ff0000000000000000000000000000000000000000191660a060020a179055565b600a5460a060020a900460ff161561299757600080fd5b64ffffffffff821615806129b057506129b03383614448565b15156129bb57600080fd5b600160a060020a038381166000908152600d60205260409020541615156129e157600080fd5b60008264ffffffffff1611156129fb576129fb828461446f565b600160a060020a038084166000908152600d602052604090819020549091169063a055d4559034908590859033905160e060020a63ffffffff871602815264ffffffffff90931660048401526024830191909152600160a060020a031660448201526064016000604051808303818588803b1515612a7857600080fd5b5af11515612a8557600080fd5b50505050505050565b601154605060020a900464ffffffffff1681565b60105464ffffffffff1681565b600080612abf8a8a8a8a8a6133db565b90506001818686866040516000815260200160405260405193845260ff9092166020808501919091526040808501929092526060840192909252608090920191516020810390808403906000865af11515612b1957600080fd5b5050602060405103519a9950505050505050505050565b612b3861537d565b60408051908101604052600281527f42430000000000000000000000000000000000000000000000000000000000006020820152905090565b60008060008364ffffffffff16815481101515612b8a57fe5b60009182526020909120600290910201549392505050565b600a5460a060020a900460ff1615612bb957600080fd5b64ffffffffff86161580612bd25750612bd23387614448565b1515612bdd57600080fd5b600160a060020a038881166000908152600d6020526040902054161515612c0357600080fd5b64ffffffffff87166000908152600f6020526040902054600160a060020a031615612c2d57600080fd5b60105464ffffffffff9081169088161015612c4757600080fd5b346001608060020a0386161115612c5d57600080fd5b612c6d8888888888888888611c36565b1515612c7857600080fd5b64ffffffffff87166000908152600f6020526040908190208054600160a060020a03191633600160a060020a038116919091179091557f3b213e544d7183ac9b8a682aa7ad1d52d0b2c05c7aba9bf7bc025d7b3847b63e918991905164ffffffffff9092168252600160a060020a031660208201526040908101905180910390a1600160a060020a038089166000908152600d6020526040908190205490911690639652713e9087908990889033905160e060020a63ffffffff871602815264ffffffffff90931660048401526024830191909152600160a060020a031660448201526064016000604051808303818588803b1515612d7657600080fd5b5af11515612d8357600080fd5b505050505050505050505050565b60008060008364ffffffffff16815481101515612daa57fe5b600091825260209091206002909102016001015460b060020a900461ffff169392505050565b600a5460009033600160a060020a0390811691161480612dfe575060095433600160a060020a039081169116145b1515612e0957600080fd5b60115464ffffffffff6501000000000082048116911610612e2957600080fd5b612e3a600080600080893042614707565b600554909150612e54908290600160a060020a031661446f565b600554600160a060020a031663c1d1faf3828686863060405160e060020a63ffffffff881602815264ffffffffff95861660048201526001608060020a0394851660248201529290931660448301529092166064830152600160a060020a0316608482015260a401600060405180830381600087803b1515612ed557600080fd5b5af11515612ee257600080fd5b50506011805464ffffffffff8082166001011664ffffffffff19909116179055505050505050565b8015612f445733600160a060020a0390811660009081526007602052604090208054600160a060020a031916918416919091179055612f6b565b600160a060020a03331660009081526007602052604090208054600160a060020a03191690555b81600160a060020a031633600160a060020a03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051901515815260200160405180910390a35050565b60095460009033600160a060020a03908116911614612fd657600080fd5b600160a060020a038083166000908152600d6020526040908190205490911690631195236990518163ffffffff1660e060020a028152600401600060405180830381600087803b151561302857600080fd5b5af1151561303557600080fd5b50505050600160a060020a0381166000908152600d602052604081208054600160a060020a03191690555b600e548110156131215781600160a060020a0316600e8281548110151561308357fe5b600091825260209091200154600160a060020a0316141561311857600e805460001981019081106130b057fe5b600091825260209091200154600e8054600160a060020a0390921691839081106130d657fe5b60009182526020909120018054600160a060020a031916600160a060020a0392909216919091179055600e80549061311290600019830161540d565b5061311c565b6001015b613060565b5050565b600a5433600160a060020a0390811691161480613150575060095433600160a060020a039081169116145b151561315b57600080fd5b600a5460a060020a900460ff161561317257600080fd5b61317c3083614448565b151561318757600080fd5b613121308284614975565b600a5460a060020a900460ff16156131a957600080fd5b8064ffffffffff8111156131bc57600080fd5b6131c63383614448565b15156131d157600080fd5b6118bd338484614975565b600160205260009081526040902054600160a060020a031681565b60095433600160a060020a0390811691161461321257600080fd5b600160a060020a038116151561322757600080fd5b600a8054600160a060020a031916600160a060020a0392909216919091179055565b600f60205260009081526040902054600160a060020a031681565b600a5460a060020a900460ff161561327b57600080fd5b8264ffffffffff81111561328e57600080fd5b600160a060020a03851615156132a357600080fd5b30600160a060020a031685600160a060020a0316141515156132c457600080fd5b600554600160a060020a03868116911614156132df57600080fd5b600654600160a060020a03868116911614156132fa57600080fd5b613304338561494e565b8061331457506133148633613f21565b151561331f57600080fd5b6133298685614448565b151561333457600080fd5b61333f868686614975565b84600160a060020a031663f0b9e5ba8786868660405160e060020a63ffffffff8716028152600160a060020a0385166004820190815260248201859052606060448301908152606483018490529091608401848480828437820191505095505050505050602060405180830381600087803b15156133bc57600080fd5b5af115156133c957600080fd5b50505060405180515050505050505050565b60008585858585604051600160a060020a03959095166c0100000000000000000000000002855264ffffffffff9384167b0100000000000000000000000000000000000000000000000000000090810260148701529290931690910260198401526001608060020a031670010000000000000000000000000000000002601e830152602e820152604e016040518091039020905095945050505050565b600a546000908190819060a060020a900460ff161561349657600080fd5b6134a03386614448565b15156134ab57600080fd5b6134b58486614a6b565b15156134c057600080fd5b346134cb8686611fbb565b11156134d657600080fd5b6000805464ffffffffff87169081106134eb57fe5b9060005260206000209060020201915061358f8261010060405190810160409081528254825260019092015464ffffffffff8082166020840152650100000000008204811693830193909352605060020a810483166060830152607860020a8104909216608082015260a060020a820461ffff90811660a083015260b060020a83041660c082015260c060020a90910467ffffffffffffffff1660e0820152614431565b151561359a57600080fd5b6000805464ffffffffff86169081106135af57fe5b906000526020600020906002020190506136538161010060405190810160409081528254825260019092015464ffffffffff8082166020840152650100000000008204811693830193909352605060020a810483166060830152607860020a8104909216608082015260a060020a820461ffff90811660a083015260b060020a83041660c082015260c060020a90910467ffffffffffffffff1660e0820152614431565b151561365e57600080fd5b61366a82868387614ad4565b151561367557600080fd5b61367f8585614d2a565b95945050505050565b600080548290811061369657fe5b60009182526020909120600290910201805460019091015490915064ffffffffff80821691650100000000008104821691605060020a8204811691607860020a81049091169061ffff60a060020a820481169160b060020a81049091169067ffffffffffffffff60c060020a9091041688565b600a5460009060a060020a900460ff161561372357600080fd5b600160a060020a033381166000908152600d602052604090205416151561374957600080fd5b6000805464ffffffffff851690811061375e57fe5b60009182526020909120600290910201600181015490915064ffffffffff8381166501000000000090920416146118bd57600181015464ffffffffff808516917fd82e4273ca71de0024aece65309941bf92bf97c355ca08ed03de5d18c09b38189165010000000000909104168460405164ffffffffff9283168152911660208201526040908101905180910390a260018101805464ffffffffff8416650100000000000269ffffffffff000000000019909116179055505050565b600b8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156138b05780601f10613885576101008083540402835291602001916138b0565b820191906000526020600020905b81548152906001019060200180831161389357829003601f168201915b505050505081565b6138c061537d565b61114f613966600b8054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561395c5780601f106139315761010080835404028352916020019161395c565b820191906000526020600020905b81548152906001019060200180831161393f57829003601f168201915b5050505050614f32565b6139eb61397861397d61397887614f5a565b614f32565b6139eb600c8054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561395c5780601f106139315761010080835404028352916020019161395c565b615270565b600a5460009060a060020a900460ff1615613a0a57600080fd5b600160a060020a033381166000908152600d6020526040902054161515613a3057600080fd5b6000805464ffffffffff8516908110613a4557fe5b60009182526020909120600290910201600181015490915061ffff83811660a060020a90920416146118bd57600181015464ffffffffff8416907f0b95606a57983e48ae4c9631df8d2e17766c3017421531c1004a4882888ef2749060a060020a900461ffff168460405161ffff9283168152911660208201526040908101905180910390a260018101805461ffff841660a060020a0275ffff000000000000000000000000000000000000000019909116179055505050565b600c8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156138b05780601f10613885576101008083540402835291602001916138b0565b60095460009033600160a060020a03908116911614613b8857600080fd5b5080600160a060020a0381166394a892336040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515613bc757600080fd5b5af11515613bd457600080fd5b505050604051805190501515613be957600080fd5b600160a060020a038281166000908152600d602052604090208054600160a060020a031916918316919091179055600e805460018101613c29838261540d565b5060009182526020909120018054600160a060020a031916600160a060020a039290921691909117905550565b6000808064ffffffffff8516819011613c6e57600080fd5b600064ffffffffff851611613c8257600080fd5b6000805464ffffffffff8716908110613c9757fe5b9060005260206000209060020201915060008464ffffffffff16815481101515613cbd57fe5b90600052602060002090600202019050613cd982868387614ad4565b801561367f575061367f8486614a6b565b601054790100000000000000000000000000000000000000000000000000900464ffffffffff1681565b600a5460009060a060020a900460ff1615613d2e57600080fd5b600160a060020a033381166000908152600d6020526040902054161515613d5457600080fd5b6000805464ffffffffff8516908110613d6957fe5b906000526020600020906002020190508181600001541415156118bd578264ffffffffff167fbecce9a2928a6d9bbe3755bd02387af9dbe05d1ecfa05028c33d7245e24a860c82600001548460405191825260208201526040908101905180910390a25550565b60095460009033600160a060020a03908116911614613dee57600080fd5b5080600160a060020a0381166390da7c3c6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515613e2d57600080fd5b5af11515613e3a57600080fd5b505050604051805190501515613e4f57600080fd5b60128054600160a060020a031916600160a060020a039290921691909117905550565b600554600160a060020a031681565b60008060008060008060008060008964ffffffffff16815481101515613ea357fe5b600091825260209091206002909102018054600190910154909a64ffffffffff8083169b5065010000000000830481169a50605060020a830481169950607860020a830416975061ffff60a060020a83048116975060b060020a909204909116945092505050565b60115465010000000000900464ffffffffff1681565b600160a060020a03918216600090815260076020526040902054821691161490565b6000806000806000806000806000613f59615431565b60095433600160a060020a03908116911614613f7457600080fd5b600a5460a060020a900460ff161515613f8c57600080fd5b8b64ffffffffff16613f9c61153d565b60010114613fa957600080fd5b8c99508b98505b64ffffffffff808c16908a16116142215789600160a060020a031663e39bdfab8a60405160e060020a63ffffffff841602815264ffffffffff909116600482015260240160e060405180830381600087803b151561400d57600080fd5b5af1151561401a57600080fd5b5050506040518051906020018051906020018051906020018051906020018051906020018051906020018051969e50949c50929a50909850965094509092506101009050604051908101604052808981526020018864ffffffffff1681526020018764ffffffffff1681526020018664ffffffffff1681526020018564ffffffffff1681526020018461ffff1681526020018361ffff168152602001600067ffffffffffffffff168152509050600080548060010182816140db9190615475565b6000928352602090922083916002020181518155602082015160018201805464ffffffffff191664ffffffffff9290921691909117905560408201518160010160056101000a81548164ffffffffff021916908364ffffffffff160217905550606082015181600101600a6101000a81548164ffffffffff021916908364ffffffffff160217905550608082015181600101600f6101000a81548164ffffffffff021916908364ffffffffff16021790555060a08201518160010160146101000a81548161ffff021916908361ffff16021790555060c08201518160010160166101000a81548161ffff021916908361ffff16021790555060e08201516001918201805467ffffffffffffffff9290921660c060020a0277ffffffffffffffffffffffffffffffffffffffffffffffff9092169190911790559a909a019950613fb09050565b50505050505050505050505050565b600e80548290811061423e57fe5b600091825260209091200154600160a060020a0316905081565b600a54600090819060a060020a900460ff161561427457600080fd5b61427e3384614448565b151561428957600080fd5b61429283611155565b151561429d57600080fd5b6142a783856152dc565b15156142b257600080fd5b6142bc8385611fbb565b905034819010156142cc57600080fd5b600654600160a060020a031663c170fd54348390038660405160e060020a63ffffffff851602815264ffffffffff90911660048201526024016000604051808303818588803b151561431d57600080fd5b5af1151561432a57600080fd5b505050506143388385614d2a565b64ffffffffff16949350505050565b60008060008364ffffffffff1681548110151561436057fe5b600091825260209091206002909102016001015465010000000000900464ffffffffff169392505050565b600a5460a060020a900460ff16156143a257600080fd5b6143ac3382614448565b15156143b757600080fd5b64ffffffffff8116600090815260046020526040908190208054600160a060020a031916600160a060020a038581169182179092559133909116907fe53f1ce10d7caafaafcb8d2857c06db87da891294ba914f8436e31b905e1e0e79084905164ffffffffff909116815260200160405180910390a35050565b600042826040015164ffffffffff16111592915050565b64ffffffffff16600090815260016020526040902054600160a060020a0391821691161490565b64ffffffffff9190911660009081526003602052604090208054600160a060020a031916600160a060020a03909216919091179055565b600181015460085460a060020a90910461ffff1690600090600160a060020a03166306347def8360405160e060020a63ffffffff841602815261ffff9091166004820152602401602060405180830381600087803b151561450657600080fd5b5af1151561451357600080fd5b505050604051805160018501805469ffffffffff000000000019166501000000000064ffffffffff9384168102919091179182905587831693507fd82e4273ca71de0024aece65309941bf92bf97c355ca08ed03de5d18c09b3818928692919091041660405164ffffffffff9283168152911660208201526040908101905180910390a2600854600160a060020a031663732606fc6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156145d657600080fd5b5af115156145e357600080fd5b505050604051805160018086015461ffff60a060020a9091048116909101161015905061193157506001808301805461ffff60a060020a80830482169485018216810275ffff000000000000000000000000000000000000000019909316929092179283905564ffffffffff8716927f0b95606a57983e48ae4c9631df8d2e17766c3017421531c1004a4882888ef27492859291041660405161ffff9283168152911660208201526040908101905180910390a250505050565b600854600090600160a060020a0316635757dcdf8360405160e060020a63ffffffff841602815261ffff9091166004820152602401602060405180830381600087803b15156146eb57600080fd5b5af115156146f857600080fd5b50505060405180519392505050565b6000614711615431565b600080610100604051908101604090815288825264ffffffffff808816602084015260009183018290528d811660608401528c16608083015261ffff808b1660a08401528b1660c083015260e0820181905280549194506001918083016147788382615475565b6000928352602090922086916002020181518155602082015160018201805464ffffffffff191664ffffffffff9290921691909117905560408201518160010160056101000a81548164ffffffffff021916908364ffffffffff160217905550606082015181600101600a6101000a81548164ffffffffff021916908364ffffffffff160217905550608082015181600101600f6101000a81548164ffffffffff021916908364ffffffffff16021790555060a08201518160010160146101000a81548161ffff021916908361ffff16021790555060c08201518160010160166101000a81548161ffff021916908361ffff16021790555060e08201516001909101805467ffffffffffffffff9290921660c060020a0277ffffffffffffffffffffffffffffffffffffffffffffffff9092169190911790555003915064ffffffffff8211156148c757600080fd5b5080600160a060020a0386167f689df1285a731b7022f6ff5c63e6b7c58c891df5b4530f12b7be0ec9ad03ecdb8260608601518660800151875160405164ffffffffff9485168152928416602084015292166040808301919091526060820192909252608001905180910390a261494060008783614975565b9a9950505050505050505050565b64ffffffffff16600090815260036020526040902054600160a060020a0391821691161490565b600160a060020a0380831660008181526002602090815260408083208054600190810190915564ffffffffff8716845290915290208054600160a060020a0319169091179055831615614a1757600160a060020a0383166000908152600260209081526040808320805460001901905564ffffffffff84168352600482528083208054600160a060020a03199081169091556003909252909120805490911690555b81600160a060020a031683600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405164ffffffffff909116815260200160405180910390a3505050565b64ffffffffff8082166000908152600160205260408082205492851682528120549091600160a060020a0390811691168082148061367f575064ffffffffff8516600090815260046020526040902054600160a060020a03908116908316149250505092915050565b60008364ffffffffff168264ffffffffff161415614af457506000614d22565b600185015464ffffffffff838116605060020a909204161415614b1957506000614d22565b600185015464ffffffffff838116607860020a909204161415614b3e57506000614d22565b600183015464ffffffffff858116605060020a909204161415614b6357506000614d22565b600183015464ffffffffff858116607860020a909204161415614b8857506000614d22565b6001830154605060020a900464ffffffffff161515614ba957506001614d22565b6001850154605060020a900464ffffffffff161515614bca57506001614d22565b60018581015490840154605060020a9182900464ffffffffff90811692909104161415614bf957506000614d22565b60018086015490840154605060020a900464ffffffffff908116607860020a909204161415614c2a57506000614d22565b60018086015490840154607860020a900464ffffffffff908116605060020a909204161415614c5b57506000614d22565b60018581015490840154607860020a9182900464ffffffffff90811692909104161415614c8a57506000614d22565b60125485548454600160a060020a039092169163c868a569918791869060405160e060020a63ffffffff871602815264ffffffffff94851660048201526024810193909352921660448201526064810191909152608401602060405180830381600087803b1515614cfa57600080fd5b5af11515614d0757600080fd5b5050506040518051905015614d1e57506001614d22565b5060005b949350505050565b6000806000806000806000808864ffffffffff16815481101515614d4a57fe5b9060005260206000209060020201955060008964ffffffffff16815481101515614d7057fe5b90600052602060002090600202019450614d8a88876144a6565b614d9489866144a6565b64ffffffffff808a166000908152600460205260408082208054600160a060020a03199081169091558b841683529120805490911690556001860154161515614ddc57600080fd5b60085460018681015490880154600160a060020a0390921691631af97fb79161ffff60b060020a91829004811692919091041660405160e060020a63ffffffff851602815261ffff928316600482015291166024820152604401602060405180830381600087803b1515614e4f57600080fd5b5af11515614e5c57600080fd5b505050604051805160125487548954929750600160a060020a039091169250638d8b1b889160405160e060020a63ffffffff851602815260048101929092526024820152604401602060405180830381600087803b1515614ebc57600080fd5b5af11515614ec957600080fd5b505050604051805164ffffffffff8b16600090815260016020526040902054909450600160a060020a03169250614f259050898986614f078161469d565b60018a01548890889065010000000000900464ffffffffff16614707565b9998505050505050505050565b614f3a6154a1565b602082016040805190810160405280845181526020019190915292915050565b614f6261537d565b614f6a61537d565b6000614f7461537d565b60206040519081016040526000815292505b600a808604950691506020604051908101604052600081529050811515614fe25760408051908101604052600181527f300000000000000000000000000000000000000000000000000000000000000060208201529050615242565b81600114156150265760408051908101604052600181527f310000000000000000000000000000000000000000000000000000000000000060208201529050615242565b816002141561506a5760408051908101604052600181527f320000000000000000000000000000000000000000000000000000000000000060208201529050615242565b81600314156150ae5760408051908101604052600181527f330000000000000000000000000000000000000000000000000000000000000060208201529050615242565b81600414156150f25760408051908101604052600181527f340000000000000000000000000000000000000000000000000000000000000060208201529050615242565b81600514156151365760408051908101604052600181527f350000000000000000000000000000000000000000000000000000000000000060208201529050615242565b816006141561517a5760408051908101604052600181527f360000000000000000000000000000000000000000000000000000000000000060208201529050615242565b81600714156151be5760408051908101604052600181527f370000000000000000000000000000000000000000000000000000000000000060208201529050615242565b81600814156152025760408051908101604052600181527f380000000000000000000000000000000000000000000000000000000000000060208201529050615242565b81600914156152425760408051908101604052600181527f3900000000000000000000000000000000000000000000000000000000000000602082015290505b61525761524e82614f32565b6139eb85614f32565b9250600085111561526757614f86565b50909392505050565b61527861537d565b61528061537d565b600083518551016040518059106152945750595b818152601f19601f8301168101602001604052905091506020820190506152c18186602001518751615338565b6152d48551820185602001518651615338565b509392505050565b6000806000808564ffffffffff168154811015156152f657fe5b9060005260206000209060020201915060008464ffffffffff1681548110151561531c57fe5b9060005260206000209060020201905061367f82868387614ad4565b60005b6020821061535e578251845260208401935060208301925060208203915061533b565b6001826020036101000a03905080198351168185511617909352505050565b60206040519081016040526000815290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106153d057805160ff19168380011785556153fd565b828001600101855582156153fd579182015b828111156153fd5782518255916020019190600101906153e2565b506154099291506154b8565b5090565b8154818355818115116118bd576000838152602090206118bd9181019083016154b8565b6101006040519081016040908152600080835260208301819052908201819052606082018190526080820181905260a0820181905260c0820181905260e082015290565b8154818355818115116118bd576002028160020283600052602060002091820191016118bd91906154d2565b604080519081016040526000808252602082015290565b61126d91905b8082111561540957600081556001016154be565b61126d91905b8082111561540957600080825560018201556002016154d85600a165627a7a72305820fccbe691abb06d9806ab2748d7bf4cc1482eac0cf5def2e6910ac841da66403b0029
Swarm Source
bzzr://fccbe691abb06d9806ab2748d7bf4cc1482eac0cf5def2e6910ac841da66403b
Loading...
Loading
Loading...
Loading
OVERVIEW
Collectible crypto game with adventures where you get to play with puppies, lizards, bear cubs, cats and other real and fantasy creatures alike. Each cutie, which is an ERC-721 token.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.