ERC-721
Overview
Max Total Supply
610 CSNFL
Holders
4
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
2 CSNFLLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Source Code Verified (Exact Match)
Contract Name:
CSportsCore
Compiler Version
v0.4.25+commit.59dbf8f1
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2018-09-30 */ pragma solidity ^0.4.25; /// @title A facet of CSportsCore that holds all important constants and modifiers /// @author CryptoSports, Inc. (https://cryptosports.team)) /// @dev See the CSportsCore contract documentation to understand how the various CSports contract facets are arranged. contract CSportsConstants { /// @dev The maximum # of marketing tokens that can ever be created /// by the commissioner. uint16 public MAX_MARKETING_TOKENS = 2500; /// @dev The starting price for commissioner auctions (if the average /// of the last 2 is less than this, we will use this value) /// A finney is 1/1000 of an ether. uint256 public COMMISSIONER_AUCTION_FLOOR_PRICE = 5 finney; // 5 finney for production, 15 for script testing and 1 finney for Rinkeby /// @dev The duration of commissioner auctions uint256 public COMMISSIONER_AUCTION_DURATION = 14 days; // 30 days for testing; /// @dev Number of seconds in a week uint32 constant WEEK_SECS = 1 weeks; } /// @title A facet of CSportsCore that manages an individual's authorized role against access privileges. /// @author CryptoSports, Inc. (https://cryptosports.team)) /// @dev See the CSportsCore contract documentation to understand how the various CSports contract facets are arranged. contract CSportsAuth is CSportsConstants { // This facet controls access control for CryptoSports. There are four roles managed here: // // - The CEO: The CEO can reassign other roles and change the addresses of our dependent smart // contracts. It is also the only role that can unpause the smart contract. It is initially // set to the address that created the smart contract in the CSportsCore constructor. // // - The CFO: The CFO can withdraw funds from CSportsCore and its auction contracts. // // - The COO: The COO can perform administrative functions. // // - The Commisioner can perform "oracle" functions like adding new real world players, // setting players active/inactive, and scoring contests. // /// @dev Emited when contract is upgraded - See README.md for updgrade plan event ContractUpgrade(address newContract); /// The addresses of the accounts (or contracts) that can execute actions within each roles. address public ceoAddress; address public cfoAddress; address public cooAddress; address public commissionerAddress; /// @dev Keeps track whether the contract is paused. When that is true, most actions are blocked bool public paused = false; /// @dev Flag that identifies whether or not we are in development and should allow development /// only functions to be called. bool public isDevelopment = true; /// @dev Access modifier to allow access to development mode functions modifier onlyUnderDevelopment() { require(isDevelopment == true); _; } /// @dev Access modifier for CEO-only functionality modifier onlyCEO() { require(msg.sender == ceoAddress); _; } /// @dev Access modifier for CFO-only functionality modifier onlyCFO() { require(msg.sender == cfoAddress); _; } /// @dev Access modifier for COO-only functionality modifier onlyCOO() { require(msg.sender == cooAddress); _; } /// @dev Access modifier for Commissioner-only functionality modifier onlyCommissioner() { require(msg.sender == commissionerAddress); _; } /// @dev Requires any one of the C level addresses modifier onlyCLevel() { require( msg.sender == cooAddress || msg.sender == ceoAddress || msg.sender == cfoAddress || msg.sender == commissionerAddress ); _; } /// @dev prevents contracts from hitting the method modifier notContract() { address _addr = msg.sender; uint256 _codeLength; assembly {_codeLength := extcodesize(_addr)} require(_codeLength == 0); _; } /// @dev One way switch to set the contract into prodution mode. This is one /// way in that the contract can never be set back into development mode. Calling /// this function will block all future calls to functions that are meant for /// access only while we are under development. It will also enable more strict /// additional checking on various parameters and settings. function setProduction() public onlyCEO onlyUnderDevelopment { isDevelopment = false; } /// @dev Assigns a new address to act as the CEO. Only available to the current CEO. /// @param _newCEO The address of the new CEO function setCEO(address _newCEO) public onlyCEO { require(_newCEO != address(0)); ceoAddress = _newCEO; } /// @dev Assigns a new address to act as the CFO. Only available to the current CEO. /// @param _newCFO The address of the new CFO function setCFO(address _newCFO) public onlyCEO { require(_newCFO != address(0)); cfoAddress = _newCFO; } /// @dev Assigns a new address to act as the COO. Only available to the current CEO. /// @param _newCOO The address of the new COO function setCOO(address _newCOO) public onlyCEO { require(_newCOO != address(0)); cooAddress = _newCOO; } /// @dev Assigns a new address to act as the Commissioner. Only available to the current CEO. /// @param _newCommissioner The address of the new COO function setCommissioner(address _newCommissioner) public onlyCEO { require(_newCommissioner != address(0)); commissionerAddress = _newCommissioner; } /// @dev Assigns all C-Level addresses /// @param _ceo CEO address /// @param _cfo CFO address /// @param _coo COO address /// @param _commish Commissioner address function setCLevelAddresses(address _ceo, address _cfo, address _coo, address _commish) public onlyCEO { require(_ceo != address(0)); require(_cfo != address(0)); require(_coo != address(0)); require(_commish != address(0)); ceoAddress = _ceo; cfoAddress = _cfo; cooAddress = _coo; commissionerAddress = _commish; } /// @dev Transfers the balance of this contract to the CFO function withdrawBalance() external onlyCFO { cfoAddress.transfer(address(this).balance); } /*** Pausable functionality adapted from OpenZeppelin ***/ /// @dev Modifier to allow actions only when the contract IS NOT paused modifier whenNotPaused() { require(!paused); _; } /// @dev Modifier to allow actions only when the contract IS paused modifier whenPaused { require(paused); _; } /// @dev Called by any "C-level" role to pause the contract. Used only when /// a bug or exploit is detected and we need to limit damage. function pause() public onlyCLevel whenNotPaused { paused = true; } /// @dev Unpauses the smart contract. Can only be called by the CEO, since /// one reason we may pause the contract is when CFO or COO accounts are /// compromised. function unpause() public onlyCEO whenPaused { paused = false; } } /// @dev Interface required by league roster contract to access /// the mintPlayers(...) function interface CSportsRosterInterface { /// @dev Called by core contract as a sanity check function isLeagueRosterContract() external pure returns (bool); /// @dev Called to indicate that a commissioner auction has completed function commissionerAuctionComplete(uint32 _rosterIndex, uint128 _price) external; /// @dev Called to indicate that a commissioner auction was canceled function commissionerAuctionCancelled(uint32 _rosterIndex) external view; /// @dev Returns the metadata for a specific real world player token function getMetadata(uint128 _md5Token) external view returns (string); /// @dev Called to return a roster index given the MD5 function getRealWorldPlayerRosterIndex(uint128 _md5Token) external view returns (uint128); /// @dev Returns a player structure given its index function realWorldPlayerFromIndex(uint128 idx) external view returns (uint128 md5Token, uint128 prevCommissionerSalePrice, uint64 lastMintedTime, uint32 mintedCount, bool hasActiveCommissionerAuction, bool mintingEnabled); /// @dev Called to update a real world player entry - only used dureing development function updateRealWorldPlayer(uint32 _rosterIndex, uint128 _prevCommissionerSalePrice, uint64 _lastMintedTime, uint32 _mintedCount, bool _hasActiveCommissionerAuction, bool _mintingEnabled) external; } /// @dev This is the data structure that holds a roster player in the CSportsLeagueRoster /// contract. Also referenced by CSportsCore. /// @author CryptoSports, Inc. (http://cryptosports.team) contract CSportsRosterPlayer { struct RealWorldPlayer { // The player's certified identification. This is the md5 hash of // {player's last name}-{player's first name}-{player's birthday in YYYY-MM-DD format}-{serial number} // where the serial number is usually 0, but gives us an ability to deal with making // sure all MD5s are unique. uint128 md5Token; // Stores the average sale price of the most recent 2 commissioner sales uint128 prevCommissionerSalePrice; // The last time this real world player was minted. uint64 lastMintedTime; // The number of PlayerTokens minted for this real world player uint32 mintedCount; // When true, there is an active auction for this player owned by // the commissioner (indicating a gen0 minting auction is in progress) bool hasActiveCommissionerAuction; // Indicates this real world player can be actively minted bool mintingEnabled; // Any metadata we want to attach to this player (in JSON format) string metadata; } } /// @title CSportsTeam Interface /// @dev This interface defines methods required by the CSportsContestCore /// in implementing a contest. /// @author CryptoSports contract CSportsTeam { bool public isTeamContract; /// @dev Define team events event TeamCreated(uint256 teamId, address owner); event TeamUpdated(uint256 teamId); event TeamReleased(uint256 teamId); event TeamScored(uint256 teamId, int32 score, uint32 place); event TeamPaid(uint256 teamId); function setCoreContractAddress(address _address) public; function setLeagueRosterContractAddress(address _address) public; function setContestContractAddress(address _address) public; function createTeam(address _owner, uint32[] _tokenIds) public returns (uint32); function updateTeam(address _owner, uint32 _teamId, uint8[] _indices, uint32[] _tokenIds) public; function releaseTeam(uint32 _teamId) public; function getTeamOwner(uint32 _teamId) public view returns (address); function scoreTeams(uint32[] _teamIds, int32[] _scores, uint32[] _places) public; function getScore(uint32 _teamId) public view returns (int32); function getPlace(uint32 _teamId) public view returns (uint32); function ownsPlayerTokens(uint32 _teamId) public view returns (bool); function refunded(uint32 _teamId) public; function tokenIdsForTeam(uint32 _teamId) public view returns (uint32, uint32[50]); function getTeam(uint32 _teamId) public view returns ( address _owner, int32 _score, uint32 _place, bool _holdsEntryFee, bool _ownsPlayerTokens); } /// @title Base contract for CryptoSports. Holds all common structs, events and base variables. /// @author CryptoSports, Inc. (http://cryptosports.team) /// @dev See the CSportsCore contract documentation to understand how the various contract facets are arranged. contract CSportsBase is CSportsAuth, CSportsRosterPlayer { /// @dev This emits when ownership of any NFT changes by any mechanism. /// This event emits when NFTs are created (`from` == 0) and destroyed /// (`to` == 0). Exception: during contract creation, any number of NFTs /// may be created and assigned without emitting Transfer. At the time of /// any transfer, the approved address for that NFT (if any) is reset to none. event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /// @dev This emits when the approved address for an NFT is changed or /// reaffirmed. The zero address indicates there is no approved address. /// When a Transfer event emits, this also indicates that the approved /// address for that NFT (if any) is reset to none. event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /// @dev This emits when an operator is enabled or disabled for an owner. /// The operator can manage all NFTs of the owner. event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /// @dev This emits when a commissioner auction is successfully closed event CommissionerAuctionSuccessful(uint256 tokenId, uint256 totalPrice, address winner); /// @dev This emits when a commissioner auction is canceled event CommissionerAuctionCanceled(uint256 tokenId); /******************/ /*** DATA TYPES ***/ /******************/ /// @dev The main player token structure. Every released player in the League /// is represented by a single instance of this structure. struct PlayerToken { // @dev ID of the real world player this token represents. We can only have // a max of 4,294,967,295 real world players, which seems to be enough for // a while (haha) uint32 realWorldPlayerId; // @dev Serial number indicating the number of PlayerToken(s) for this // same realWorldPlayerId existed at the time this token was minted. uint32 serialNumber; // The timestamp from the block when this player token was minted. uint64 mintedTime; // The most recent sale price of the player token in an auction uint128 mostRecentPrice; } /**************************/ /*** MAPPINGS (STORAGE) ***/ /**************************/ /// @dev A mapping from a PlayerToken ID to the address that owns it. All /// PlayerTokens have an owner (newly minted PlayerTokens are owned by /// the core contract). mapping (uint256 => address) public playerTokenToOwner; /// @dev Maps a PlayerToken ID to an address approved to take ownership. mapping (uint256 => address) public playerTokenToApproved; // @dev A mapping to a given address' tokens mapping(address => uint32[]) public ownedTokens; // @dev A mapping that relates a token id to an index into the // ownedTokens[currentOwner] array. mapping(uint32 => uint32) tokenToOwnedTokensIndex; /// @dev Maps operators mapping(address => mapping(address => bool)) operators; // This mapping and corresponding uint16 represent marketing tokens // that can be created by the commissioner (up to remainingMarketingTokens) // and then given to third parties in the form of 4 words that sha256 // hash into the key for the mapping. // // Maps uint256(keccak256) => leagueRosterPlayerMD5 uint16 public remainingMarketingTokens = MAX_MARKETING_TOKENS; mapping (uint256 => uint128) marketingTokens; /***************/ /*** STORAGE ***/ /***************/ /// @dev Instance of our CSportsLeagueRoster contract. Can be set by /// the CEO only once because this immutable tie to the league roster /// is what relates a playerToken to a real world player. If we could /// update the leagueRosterContract, we could in effect de-value the /// ownership of a playerToken by switching the real world player it /// represents. CSportsRosterInterface public leagueRosterContract; /// @dev Addresses of team contract that is authorized to hold player /// tokens for contests. CSportsTeam public teamContract; /// @dev An array containing all PlayerTokens in existence. PlayerToken[] public playerTokens; /************************************/ /*** RESTRICTED C-LEVEL FUNCTIONS ***/ /************************************/ /// @dev Sets the reference to the CSportsLeagueRoster contract. /// @param _address - Address of CSportsLeagueRoster contract. function setLeagueRosterContractAddress(address _address) public onlyCEO { // This method may only be called once to guarantee the immutable // nature of owning a real world player. if (!isDevelopment) { require(leagueRosterContract == address(0)); } CSportsRosterInterface candidateContract = CSportsRosterInterface(_address); // NOTE: verify that a contract is what we expect (not foolproof, just // a sanity check) require(candidateContract.isLeagueRosterContract()); // Set the new contract address leagueRosterContract = candidateContract; } /// @dev Adds an authorized team contract that can hold player tokens /// on behalf of a contest, and will return them to the original /// owner when the contest is complete (or if entry is canceled by /// the original owner, or if the contest is canceled). function setTeamContractAddress(address _address) public onlyCEO { CSportsTeam candidateContract = CSportsTeam(_address); // NOTE: verify that a contract is what we expect (not foolproof, just // a sanity check) require(candidateContract.isTeamContract()); // Set the new contract address teamContract = candidateContract; } /**************************/ /*** INTERNAL FUNCTIONS ***/ /**************************/ /// @dev Identifies whether or not the addressToTest is a contract or not /// @param addressToTest The address we are interested in function _isContract(address addressToTest) internal view returns (bool) { uint size; assembly { size := extcodesize(addressToTest) } return (size > 0); } /// @dev Returns TRUE if the token exists /// @param _tokenId ID to check function _tokenExists(uint256 _tokenId) internal view returns (bool) { return (_tokenId < playerTokens.length); } /// @dev An internal method that mints a new playerToken and stores it /// in the playerTokens array. /// @param _realWorldPlayerId ID of the real world player to mint /// @param _serialNumber - Indicates the number of playerTokens for _realWorldPlayerId /// that exist prior to this to-be-minted playerToken. /// @param _owner - The owner of this newly minted playerToken function _mintPlayer(uint32 _realWorldPlayerId, uint32 _serialNumber, address _owner) internal returns (uint32) { // We are careful here to make sure the calling contract keeps within // our structure's size constraints. Highly unlikely we would ever // get to a point where these constraints would be a problem. require(_realWorldPlayerId < 4294967295); require(_serialNumber < 4294967295); PlayerToken memory _player = PlayerToken({ realWorldPlayerId: _realWorldPlayerId, serialNumber: _serialNumber, mintedTime: uint64(now), mostRecentPrice: 0 }); uint256 newPlayerTokenId = playerTokens.push(_player) - 1; // It's probably never going to happen, 4 billion playerToken(s) is A LOT, but // let's just be 100% sure we never let this happen. require(newPlayerTokenId < 4294967295); // This will assign ownership, and also emit the Transfer event as // per ERC721 draft _transfer(0, _owner, newPlayerTokenId); return uint32(newPlayerTokenId); } /// @dev Removes a token (specified by ID) from ownedTokens and /// tokenToOwnedTokensIndex mappings for a given address. /// @param _from Address to remove from /// @param _tokenId ID of token to remove function _removeTokenFrom(address _from, uint256 _tokenId) internal { // Grab the index into the _from owner's ownedTokens array uint32 fromIndex = tokenToOwnedTokensIndex[uint32(_tokenId)]; // Remove the _tokenId from ownedTokens[_from] array uint lastIndex = ownedTokens[_from].length - 1; uint32 lastToken = ownedTokens[_from][lastIndex]; // Swap the last token into the fromIndex position (which is _tokenId's // location in the ownedTokens array) and shorten the array ownedTokens[_from][fromIndex] = lastToken; ownedTokens[_from].length--; // Since we moved lastToken, we need to update its // entry in the tokenToOwnedTokensIndex tokenToOwnedTokensIndex[lastToken] = fromIndex; // _tokenId is no longer mapped tokenToOwnedTokensIndex[uint32(_tokenId)] = 0; } /// @dev Adds a token (specified by ID) to ownedTokens and /// tokenToOwnedTokensIndex mappings for a given address. /// @param _to Address to add to /// @param _tokenId ID of token to remove function _addTokenTo(address _to, uint256 _tokenId) internal { uint32 toIndex = uint32(ownedTokens[_to].push(uint32(_tokenId))) - 1; tokenToOwnedTokensIndex[uint32(_tokenId)] = toIndex; } /// @dev Assigns ownership of a specific PlayerToken to an address. /// @param _from - Address of who this transfer is from /// @param _to - Address of who to tranfer to /// @param _tokenId - The ID of the playerToken to transfer function _transfer(address _from, address _to, uint256 _tokenId) internal { // transfer ownership playerTokenToOwner[_tokenId] = _to; // When minting brand new PlayerTokens, the _from is 0x0, but we don't deal with // owned tokens for the 0x0 address. if (_from != address(0)) { // Remove the _tokenId from ownedTokens[_from] array (remove first because // this method will zero out the tokenToOwnedTokensIndex[_tokenId], which would // stomp on the _addTokenTo setting of this value) _removeTokenFrom(_from, _tokenId); // Clear our approved mapping for this token delete playerTokenToApproved[_tokenId]; } // Now add the token to the _to address' ownership structures _addTokenTo(_to, _tokenId); // Emit the transfer event. emit Transfer(_from, _to, _tokenId); } /// @dev Converts a uint to its string equivalent /// @param v uint to convert function uintToString(uint v) internal pure returns (string str) { bytes32 b32 = uintToBytes32(v); str = bytes32ToString(b32); } /// @dev Converts a uint to a bytes32 /// @param v uint to convert function uintToBytes32(uint v) internal pure returns (bytes32 ret) { if (v == 0) { ret = '0'; } else { while (v > 0) { ret = bytes32(uint(ret) / (2 ** 8)); ret |= bytes32(((v % 10) + 48) * 2 ** (8 * 31)); v /= 10; } } return ret; } /// @dev Converts bytes32 to a string /// @param data bytes32 to convert function bytes32ToString (bytes32 data) internal pure returns (string) { uint count = 0; bytes memory bytesString = new bytes(32); // = new bytes[]; //(32); for (uint j=0; j<32; j++) { byte char = byte(bytes32(uint(data) * 2 ** (8 * j))); if (char != 0) { bytesString[j] = char; count++; } else { break; } } bytes memory s = new bytes(count); for (j = 0; j < count; j++) { s[j] = bytesString[j]; } return string(s); } } /// @title ERC-721 Non-Fungible Token Standard /// @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md /// Note: the ERC-165 identifier for this interface is 0x80ac58cd. interface ERC721 /* is ERC165 */ { /// @dev This emits when ownership of any NFT changes by any mechanism. /// This event emits when NFTs are created (`from` == 0) and destroyed /// (`to` == 0). Exception: during contract creation, any number of NFTs /// may be created and assigned without emitting Transfer. At the time of /// any transfer, the approved address for that NFT (if any) is reset to none. /// /// MOVED THIS TO CSportsBase because of how class structure is derived. /// event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId); /// @dev This emits when the approved address for an NFT is changed or /// reaffirmed. The zero address indicates there is no approved address. /// When a Transfer event emits, this also indicates that the approved /// address for that NFT (if any) is reset to none. event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId); /// @dev This emits when an operator is enabled or disabled for an owner. /// The operator can manage all NFTs of the owner. event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved); /// @notice Count all NFTs assigned to an owner /// @dev NFTs assigned to the zero address are considered invalid, and this /// function throws for queries about the zero address. /// @param _owner An address for whom to query the balance /// @return The number of NFTs owned by `_owner`, possibly zero function balanceOf(address _owner) external view returns (uint256); /// @notice Find the owner of an NFT /// @dev NFTs assigned to zero address are considered invalid, and queries /// about them do throw. /// @param _tokenId The identifier for an NFT /// @return The address of the owner of the NFT function ownerOf(uint256 _tokenId) external view returns (address); /// @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,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 payable; /// @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 payable; /// @notice Transfer ownership of an NFT -- THE CALLER IS RESPONSIBLE /// TO CONFIRM THAT `_to` IS CAPABLE OF RECEIVING NFTS OR ELSE /// THEY MAY BE PERMANENTLY LOST /// @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. /// @param _from The current owner of the NFT /// @param _to The new owner /// @param _tokenId The NFT to transfer function transferFrom(address _from, address _to, uint256 _tokenId) external payable; /// @notice Change or reaffirm the approved address for an NFT /// @dev The zero address indicates there is no approved address. /// Throws unless `msg.sender` is the current NFT owner, or an authorized /// operator of the current owner. /// @param _approved The new approved NFT controller /// @param _tokenId The NFT to approve function approve(address _approved, uint256 _tokenId) external payable; /// @notice Enable or disable approval for a third party ("operator") to manage /// all of `msg.sender`'s assets /// @dev Emits the ApprovalForAll event. The contract MUST allow /// multiple operators per owner. /// @param _operator Address to add to the set of authorized operators /// @param _approved True if the operator is approved, false to revoke approval function setApprovalForAll(address _operator, bool _approved) external; /// @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 returns (address); /// @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); } /// @title ERC-721 Non-Fungible Token Standard, optional metadata extension /// @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md /// Note: the ERC-165 identifier for this interface is 0x5b5e139f. interface ERC721Metadata /* is ERC721 */ { /// @notice A descriptive name for a collection of NFTs in this contract function name() external view returns (string _name); /// @notice An abbreviated name for NFTs in this contract function symbol() external view returns (string _symbol); /// @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); } /// @title ERC-721 Non-Fungible Token Standard, optional enumeration extension /// @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md /// Note: the ERC-165 identifier for this interface is 0x780e9d63. interface ERC721Enumerable /* is ERC721 */ { /// @notice Count NFTs tracked by this contract /// @return A count of valid NFTs tracked by this contract, where each one of /// them has an assigned and queryable owner not equal to the zero address function totalSupply() external view returns (uint256); /// @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 view returns (uint256); /// @notice Enumerate NFTs assigned to an owner /// @dev Throws if `_index` >= `balanceOf(_owner)` or if /// `_owner` is the zero address, representing invalid NFTs. /// @param _owner An address where we are interested in NFTs owned by them /// @param _index A counter less than `balanceOf(_owner)` /// @return The token identifier for the `_index`th NFT assigned to `_owner`, /// (sort order not specified) function tokenOfOwnerByIndex(address _owner, uint256 _index) external view returns (uint256); } /// @dev Note: the ERC-165 identifier for this interface is 0x150b7a02. 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. Return of other than the magic value MUST result in the /// transaction being reverted. /// Note: the contract address is always the message sender. /// @param _operator The address which called `safeTransferFrom` function /// @param _from The address which previously owned the token /// @param _tokenId The NFT identifier which is being transferred /// @param _data Additional data with no specified format /// @return `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` /// unless throwing function onERC721Received(address _operator, address _from, uint256 _tokenId, bytes _data) external returns(bytes4); } interface ERC165 { /// @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 view returns (bool); } /// @title The facet of the CSports core contract that manages ownership, ERC-721 compliant. /// @author CryptoSports, Inc. (http://cryptosports.team) /// @dev Ref: https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md#specification /// See the CSportsCore contract documentation to understand how the various contract facets are arranged. contract CSportsOwnership is CSportsBase { /// @notice These are set in the contract constructor at deployment time string _name; string _symbol; string _tokenURI; // bool public implementsERC721 = true; // function implementsERC721() public pure returns (bool) { return true; } /// @notice A descriptive name for a collection of NFTs in this contract function name() external view returns (string) { return _name; } /// @notice An abbreviated name for NFTs in this contract function symbol() external view returns (string) { return _symbol; } /// @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 ret) { string memory tokenIdAsString = uintToString(uint(_tokenId)); ret = string (abi.encodePacked(_tokenURI, tokenIdAsString, "/")); } /// @notice Find the owner of an NFT /// @dev NFTs assigned to zero address are considered invalid, and queries /// about them do throw. /// @param _tokenId The identifier for an NFT /// @return The address of the owner of the NFT function ownerOf(uint256 _tokenId) public view returns (address owner) { owner = playerTokenToOwner[_tokenId]; require(owner != address(0)); } /// @notice Count all NFTs assigned to an owner /// @dev NFTs assigned to the zero address are considered invalid, and this /// function throws for queries about the zero address. /// @param _owner An address for whom to query the balance /// @return The number of NFTs owned by `_owner`, possibly zero function balanceOf(address _owner) public view returns (uint256 count) { // I am not a big fan of referencing a property on an array element // that may not exist. But if it does not exist, Solidity will return 0 // which is right. return ownedTokens[_owner].length; } /// @notice Transfer ownership of an NFT -- THE CALLER IS RESPONSIBLE /// TO CONFIRM THAT `_to` IS CAPABLE OF RECEIVING NFTS OR ELSE /// THEY MAY BE PERMANENTLY LOST /// @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. /// @param _from The current owner of the NFT /// @param _to The new owner /// @param _tokenId The NFT to transfer function transferFrom( address _from, address _to, uint256 _tokenId ) public whenNotPaused { require(_to != address(0)); require (_tokenExists(_tokenId)); // Check for approval and valid ownership require(_approvedFor(_to, _tokenId)); require(_owns(_from, _tokenId)); // Validate the sender require(_owns(msg.sender, _tokenId) || // sender owns the token (msg.sender == playerTokenToApproved[_tokenId]) || // sender is the approved address operators[_from][msg.sender]); // sender is an authorized operator for this token // Reassign ownership (also clears pending approvals and emits Transfer event). _transfer(_from, _to, _tokenId); } /// @notice Transfer ownership of a batch of NFTs -- THE CALLER IS RESPONSIBLE /// TO CONFIRM THAT `_to` IS CAPABLE OF RECEIVING NFTS OR ELSE /// THEY MAY BE PERMANENTLY LOST /// @dev Throws unless `msg.sender` is the current owner, an authorized /// operator, or the approved address for all NFTs. Throws if `_from` is /// not the current owner. Throws if `_to` is the zero address. Throws if /// any `_tokenId` is not a valid NFT. /// @param _from - Current owner of the token being authorized for transfer /// @param _to - Address we are transferring to /// @param _tokenIds The IDs of the PlayerTokens that can be transferred if this call succeeds. function batchTransferFrom( address _from, address _to, uint32[] _tokenIds ) public whenNotPaused { for (uint32 i = 0; i < _tokenIds.length; i++) { uint32 _tokenId = _tokenIds[i]; // Check for approval and valid ownership require(_approvedFor(_to, _tokenId)); require(_owns(_from, _tokenId)); // Validate the sender require(_owns(msg.sender, _tokenId) || // sender owns the token (msg.sender == playerTokenToApproved[_tokenId]) || // sender is the approved address operators[_from][msg.sender]); // sender is an authorized operator for this token // Reassign ownership, clear pending approvals (not necessary here), // and emit Transfer event. _transfer(_from, _to, _tokenId); } } /// @notice Change or reaffirm the approved address for an NFT /// @dev The zero address indicates there is no approved address. /// Throws unless `msg.sender` is the current NFT owner, or an authorized /// operator of the current owner. /// @param _to The new approved NFT controller /// @param _tokenId The NFT to approve function approve( address _to, uint256 _tokenId ) public whenNotPaused { address owner = ownerOf(_tokenId); require(_to != owner); // Only an owner or authorized operator can grant transfer approval. require((msg.sender == owner) || (operators[ownerOf(_tokenId)][msg.sender])); // Register the approval (replacing any previous approval). _approve(_tokenId, _to); // Emit approval event. emit Approval(msg.sender, _to, _tokenId); } /// @notice Change or reaffirm the approved address for an NFT /// @dev The zero address indicates there is no approved address. /// Throws unless `msg.sender` is the current NFT owner, or an authorized /// operator of the current owner. /// @param _to The address to be granted transfer approval. Pass address(0) to /// clear all approvals. /// @param _tokenIds The IDs of the PlayerTokens that can be transferred if this call succeeds. function batchApprove( address _to, uint32[] _tokenIds ) public whenNotPaused { for (uint32 i = 0; i < _tokenIds.length; i++) { uint32 _tokenId = _tokenIds[i]; // Only an owner or authorized operator can grant transfer approval. require(_owns(msg.sender, _tokenId) || (operators[ownerOf(_tokenId)][msg.sender])); // Register the approval (replacing any previous approval). _approve(_tokenId, _to); // Emit approval event. emit Approval(msg.sender, _to, _tokenId); } } /// @notice Escrows all of the tokensIds passed by transfering ownership /// to the teamContract. CAN ONLY BE CALLED BY THE CURRENT TEAM CONTRACT. /// @param _owner - Current owner of the token being authorized for transfer /// @param _tokenIds The IDs of the PlayerTokens that can be transferred if this call succeeds. function batchEscrowToTeamContract( address _owner, uint32[] _tokenIds ) public whenNotPaused { require(teamContract != address(0)); require(msg.sender == address(teamContract)); for (uint32 i = 0; i < _tokenIds.length; i++) { uint32 _tokenId = _tokenIds[i]; // Only an owner can transfer the token. require(_owns(_owner, _tokenId)); // Reassign ownership, clear pending approvals (not necessary here), // and emit Transfer event. _transfer(_owner, teamContract, _tokenId); } } bytes4 constant TOKEN_RECEIVED_SIG = bytes4(keccak256("onERC721Received(address,uint256,bytes)")); /// @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,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 payable { transferFrom(_from, _to, _tokenId); if (_isContract(_to)) { ERC721TokenReceiver receiver = ERC721TokenReceiver(_to); bytes4 response = receiver.onERC721Received.gas(50000)(msg.sender, _from, _tokenId, data); require(response == TOKEN_RECEIVED_SIG); } } /// @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 payable { require(_to != address(0)); transferFrom(_from, _to, _tokenId); if (_isContract(_to)) { ERC721TokenReceiver receiver = ERC721TokenReceiver(_to); bytes4 response = receiver.onERC721Received.gas(50000)(msg.sender, _from, _tokenId, ""); require(response == TOKEN_RECEIVED_SIG); } } /// @notice Count NFTs tracked by this contract /// @return A count of valid NFTs tracked by this contract, where each one of /// them has an assigned and queryable owner not equal to the zero address function totalSupply() public view returns (uint) { return playerTokens.length; } /// @notice Enumerate NFTs assigned to an owner /// @dev Throws if `index` >= `balanceOf(owner)` or if /// `owner` is the zero address, representing invalid NFTs. /// @param owner An address where we are interested in NFTs owned by them /// @param index A counter less than `balanceOf(owner)` /// @return The token identifier for the `index`th NFT assigned to `owner`, /// (sort order not specified) function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 _tokenId) { require(owner != address(0)); require(index < balanceOf(owner)); return ownedTokens[owner][index]; } /// @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 view returns (uint256) { require (_tokenExists(index)); return index; } /// @notice Enable or disable approval for a third party ("operator") to manage /// all of `msg.sender`'s assets /// @dev Emits the ApprovalForAll event. The contract MUST allow /// multiple operators per owner. /// @param _operator Address to add to the set of authorized operators /// @param _approved True if the operator is approved, false to revoke approval function setApprovalForAll(address _operator, bool _approved) external { require(_operator != msg.sender); operators[msg.sender][_operator] = _approved; 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 returns (address) { require(_tokenExists(_tokenId)); return playerTokenToApproved[_tokenId]; } /// @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) public pure returns (bool) { return ( interfaceID == this.supportsInterface.selector || // ERC165 interfaceID == 0x5b5e139f || // ERC721Metadata interfaceID == 0x80ac58cd || // ERC-721 interfaceID == 0x780e9d63); // ERC721Enumerable } // Internal utility functions: These functions all assume that their input arguments // are valid. We leave it to public methods to sanitize their inputs and follow // the required logic. /// @dev Checks if a given address is the current owner of a particular PlayerToken. /// @param _claimant the address we are validating against. /// @param _tokenId kitten id, only valid when > 0 function _owns(address _claimant, uint256 _tokenId) internal view returns (bool) { return playerTokenToOwner[_tokenId] == _claimant; } /// @dev Checks if a given address currently has transferApproval for a particular PlayerToken. /// @param _claimant the address we are confirming PlayerToken is approved for. /// @param _tokenId PlayerToken id, only valid when > 0 function _approvedFor(address _claimant, uint256 _tokenId) internal view returns (bool) { return playerTokenToApproved[_tokenId] == _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 intentional because /// _approve() and transferFrom() are used together for putting PlayerToken on auction, and /// there is no value in spamming the log with Approval events in that case. function _approve(uint256 _tokenId, address _approved) internal { playerTokenToApproved[_tokenId] = _approved; } } /// @dev Interface to the sale clock auction contract interface CSportsAuctionInterface { /// @dev Sanity check that allows us to ensure that we are pointing to the /// right auction in our setSaleAuctionAddress() call. function isSaleClockAuction() external pure returns (bool); /// @dev Creates and begins a new auction. /// @param _tokenId - ID of token to auction, sender must be owner. /// @param _startingPrice - Price of item (in wei) at beginning of auction. /// @param _endingPrice - Price of item (in wei) at end of auction. /// @param _duration - Length of auction (in seconds). /// @param _seller - Seller, if not the message sender function createAuction( uint256 _tokenId, uint256 _startingPrice, uint256 _endingPrice, uint256 _duration, address _seller ) external; /// @dev Reprices (and updates duration) of an array of tokens that are currently /// being auctioned by this contract. /// @param _tokenIds Array of tokenIds corresponding to auctions being updated /// @param _startingPrices New starting prices /// @param _endingPrices New ending price /// @param _duration New duration /// @param _seller Address of the seller in all specified auctions to be updated function repriceAuctions( uint256[] _tokenIds, uint256[] _startingPrices, uint256[] _endingPrices, uint256 _duration, address _seller ) external; /// @dev Cancels an auction that hasn't been won yet by calling /// the super(...) and then notifying any listener. /// @param _tokenId - ID of token on auction function cancelAuction(uint256 _tokenId) external; /// @dev Withdraw the total contract balance to the core contract function withdrawBalance() external; } /// @title Interface to allow a contract to listen to auction events. contract SaleClockAuctionListener { function implementsSaleClockAuctionListener() public pure returns (bool); function auctionCreated(uint256 tokenId, address seller, uint128 startingPrice, uint128 endingPrice, uint64 duration) public; function auctionSuccessful(uint256 tokenId, uint128 totalPrice, address seller, address buyer) public; function auctionCancelled(uint256 tokenId, address seller) public; } /// @title The facet of the CSports core contract that manages interfacing with auctions /// @author CryptoSports, Inc. (http://cryptosports.team) /// See the CSportsCore contract documentation to understand how the various contract facets are arranged. contract CSportsAuction is CSportsOwnership, SaleClockAuctionListener { // Holds a reference to our saleClockAuctionContract CSportsAuctionInterface public saleClockAuctionContract; /// @dev SaleClockAuctionLIstener interface method concrete implementation function implementsSaleClockAuctionListener() public pure returns (bool) { return true; } /// @dev SaleClockAuctionLIstener interface method concrete implementation function auctionCreated(uint256 /* tokenId */, address /* seller */, uint128 /* startingPrice */, uint128 /* endingPrice */, uint64 /* duration */) public { require (saleClockAuctionContract != address(0)); require (msg.sender == address(saleClockAuctionContract)); } /// @dev SaleClockAuctionLIstener interface method concrete implementation /// @param tokenId - ID of the token whose auction successfully completed /// @param totalPrice - Price at which the auction closed at /// @param seller - Account address of the auction seller /// @param winner - Account address of the auction winner (buyer) function auctionSuccessful(uint256 tokenId, uint128 totalPrice, address seller, address winner) public { require (saleClockAuctionContract != address(0)); require (msg.sender == address(saleClockAuctionContract)); // Record the most recent sale price to the token PlayerToken storage _playerToken = playerTokens[tokenId]; _playerToken.mostRecentPrice = totalPrice; if (seller == address(this)) { // We completed a commissioner auction! leagueRosterContract.commissionerAuctionComplete(playerTokens[tokenId].realWorldPlayerId, totalPrice); emit CommissionerAuctionSuccessful(tokenId, totalPrice, winner); } } /// @dev SaleClockAuctionLIstener interface method concrete implementation /// @param tokenId - ID of the token whose auction was cancelled /// @param seller - Account address of seller who decided to cancel the auction function auctionCancelled(uint256 tokenId, address seller) public { require (saleClockAuctionContract != address(0)); require (msg.sender == address(saleClockAuctionContract)); if (seller == address(this)) { // We cancelled a commissioner auction! leagueRosterContract.commissionerAuctionCancelled(playerTokens[tokenId].realWorldPlayerId); emit CommissionerAuctionCanceled(tokenId); } } /// @dev Sets the reference to the sale auction. /// @param _address - Address of sale contract. function setSaleAuctionContractAddress(address _address) public onlyCEO { require(_address != address(0)); CSportsAuctionInterface candidateContract = CSportsAuctionInterface(_address); // Sanity check require(candidateContract.isSaleClockAuction()); // Set the new contract address saleClockAuctionContract = candidateContract; } /// @dev Allows the commissioner to cancel his auctions (which are owned /// by this contract) function cancelCommissionerAuction(uint32 tokenId) public onlyCommissioner { require(saleClockAuctionContract != address(0)); saleClockAuctionContract.cancelAuction(tokenId); } /// @dev Put a player up for auction. The message sender must own the /// player token being put up for auction. /// @param _playerTokenId - ID of playerToken to be auctioned /// @param _startingPrice - Starting price in wei /// @param _endingPrice - Ending price in wei /// @param _duration - Duration in seconds function createSaleAuction( uint256 _playerTokenId, uint256 _startingPrice, uint256 _endingPrice, uint256 _duration ) public whenNotPaused { // Auction contract checks input sizes // If player is already on any auction, this will throw // because it will be owned by the auction contract. require(_owns(msg.sender, _playerTokenId)); _approve(_playerTokenId, saleClockAuctionContract); // saleClockAuctionContract.createAuction throws if inputs are invalid and clears // transfer after escrowing the player. saleClockAuctionContract.createAuction( _playerTokenId, _startingPrice, _endingPrice, _duration, msg.sender ); } /// @dev Transfers the balance of the sale auction contract /// to the CSportsCore contract. We use two-step withdrawal to /// avoid two transfer calls in the auction bid function. /// To withdraw from this CSportsCore contract, the CFO must call /// the withdrawBalance(...) function defined in CSportsAuth. function withdrawAuctionBalances() external onlyCOO { saleClockAuctionContract.withdrawBalance(); } } /// @title The facet of the CSportsCore contract that manages minting new PlayerTokens /// @author CryptoSports, Inc. (http://cryptosports.team) /// See the CSportsCore contract documentation to understand how the various contract facets are arranged. contract CSportsMinting is CSportsAuction { /// @dev MarketingTokenRedeemed event is fired when a marketing token has been redeemed event MarketingTokenRedeemed(uint256 hash, uint128 rwpMd5, address indexed recipient); /// @dev MarketingTokenCreated event is fired when a marketing token has been created event MarketingTokenCreated(uint256 hash, uint128 rwpMd5); /// @dev MarketingTokenReplaced event is fired when a marketing token has been replaced event MarketingTokenReplaced(uint256 oldHash, uint256 newHash, uint128 rwpMd5); /// @dev Sanity check that identifies this contract as having minting capability function isMinter() public pure returns (bool) { return true; } /// @dev Utility function to make it easy to keccak256 a string in python or javascript using /// the exact algorythm used by Solidity. function getKeccak256(string stringToHash) public pure returns (uint256) { return uint256(keccak256(abi.encodePacked(stringToHash))); } /// @dev Allows the commissioner to load up our marketingTokens mapping with up to /// MAX_MARKETING_TOKENS marketing tokens that can be created if one knows the words /// to keccak256 and match the keywordHash passed here. Use web3.utils.soliditySha3(param1 [, param2, ...]) /// to create this hash. /// /// ONLY THE COMMISSIONER CAN CREATE MARKETING TOKENS, AND ONLY UP TO MAX_MARKETING_TOKENS OF THEM /// /// @param keywordHash - keccak256 of a known set of keyWords /// @param md5Token - The md5 key in the leagueRosterContract that specifies the player /// player token that will be minted and transfered by the redeemMarketingToken(...) method. function addMarketingToken(uint256 keywordHash, uint128 md5Token) public onlyCommissioner { require(remainingMarketingTokens > 0); require(marketingTokens[keywordHash] == 0); // Make sure the md5Token exists in the league roster uint128 _rosterIndex = leagueRosterContract.getRealWorldPlayerRosterIndex(md5Token); require(_rosterIndex != 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF); // Map the keyword Hash to the RWP md5 and decrement the remainingMarketingTokens property remainingMarketingTokens--; marketingTokens[keywordHash] = md5Token; emit MarketingTokenCreated(keywordHash, md5Token); } /// @dev This method allows the commish to replace an existing marketing token that has /// not been used with a new one (new hash and mdt). Since we are replacing, we co not /// have to deal with remainingMarketingTokens in any way. This is to allow for replacing /// marketing tokens that have not been redeemed and aren't likely to be redeemed (breakage) /// /// ONLY THE COMMISSIONER CAN ACCESS THIS METHOD /// /// @param oldKeywordHash Hash to replace /// @param newKeywordHash Hash to replace with /// @param md5Token The md5 key in the leagueRosterContract that specifies the player function replaceMarketingToken(uint256 oldKeywordHash, uint256 newKeywordHash, uint128 md5Token) public onlyCommissioner { uint128 _md5Token = marketingTokens[oldKeywordHash]; if (_md5Token != 0) { marketingTokens[oldKeywordHash] = 0; marketingTokens[newKeywordHash] = md5Token; emit MarketingTokenReplaced(oldKeywordHash, newKeywordHash, md5Token); } } /// @dev Returns the real world player's MD5 key from a keywords string. A 0x00 returned /// value means the keyword string parameter isn't mapped to a marketing token. /// @param keyWords Keywords to use to look up RWP MD5 // /// ANYONE CAN VALIDATE A KEYWORD STRING (MAP IT TO AN MD5 IF IT HAS ONE) /// /// @param keyWords - A string that will keccak256 to an entry in the marketingTokens /// mapping (or not) function MD5FromMarketingKeywords(string keyWords) public view returns (uint128) { uint256 keyWordsHash = uint256(keccak256(abi.encodePacked(keyWords))); uint128 _md5Token = marketingTokens[keyWordsHash]; return _md5Token; } /// @dev Allows anyone to try to redeem a marketing token by passing N words that will /// be SHA256'ed to match an entry in our marketingTokens mapping. If a match is found, /// a CryptoSports token is created that corresponds to the md5 retrieved /// from the marketingTokens mapping and its owner is assigned as the msg.sender. /// /// ANYONE CAN REDEEM A MARKETING token /// /// @param keyWords - A string that will keccak256 to an entry in the marketingTokens mapping function redeemMarketingToken(string keyWords) public { uint256 keyWordsHash = uint256(keccak256(abi.encodePacked(keyWords))); uint128 _md5Token = marketingTokens[keyWordsHash]; if (_md5Token != 0) { // Only one redemption per set of keywords marketingTokens[keyWordsHash] = 0; uint128 _rosterIndex = leagueRosterContract.getRealWorldPlayerRosterIndex(_md5Token); if (_rosterIndex != 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) { // Grab the real world player record from the leagueRosterContract RealWorldPlayer memory _rwp; (_rwp.md5Token, _rwp.prevCommissionerSalePrice, _rwp.lastMintedTime, _rwp.mintedCount, _rwp.hasActiveCommissionerAuction, _rwp.mintingEnabled) = leagueRosterContract.realWorldPlayerFromIndex(_rosterIndex); // Mint this player, sending it to the message sender _mintPlayer(uint32(_rosterIndex), _rwp.mintedCount, msg.sender); // Finally, update our realWorldPlayer record to reflect the fact that we just // minted a new one, and there is an active commish auction. The only portion of // the RWP record we change here is an update to the mingedCount. leagueRosterContract.updateRealWorldPlayer(uint32(_rosterIndex), _rwp.prevCommissionerSalePrice, uint64(now), _rwp.mintedCount + 1, _rwp.hasActiveCommissionerAuction, _rwp.mintingEnabled); emit MarketingTokenRedeemed(keyWordsHash, _rwp.md5Token, msg.sender); } } } /// @dev Returns an array of minimum auction starting prices for an array of players /// specified by their MD5s. /// @param _md5Tokens MD5s in the league roster for the players we are inquiring about. function minStartPriceForCommishAuctions(uint128[] _md5Tokens) public view onlyCommissioner returns (uint128[50]) { require (_md5Tokens.length <= 50); uint128[50] memory minPricesArray; for (uint32 i = 0; i < _md5Tokens.length; i++) { uint128 _md5Token = _md5Tokens[i]; uint128 _rosterIndex = leagueRosterContract.getRealWorldPlayerRosterIndex(_md5Token); if (_rosterIndex == 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) { // Cannot mint a non-existent real world player continue; } RealWorldPlayer memory _rwp; (_rwp.md5Token, _rwp.prevCommissionerSalePrice, _rwp.lastMintedTime, _rwp.mintedCount, _rwp.hasActiveCommissionerAuction, _rwp.mintingEnabled) = leagueRosterContract.realWorldPlayerFromIndex(_rosterIndex); // Skip this if there is no player associated with the md5 specified if (_rwp.md5Token != _md5Token) continue; minPricesArray[i] = uint128(_computeNextCommissionerPrice(_rwp.prevCommissionerSalePrice)); } return minPricesArray; } /// @dev Creates newly minted playerTokens and puts them up for auction. This method /// can only be called by the commissioner, and checks to make sure certian minting /// conditions are met (reverting if not met): /// * The MD5 of the RWP specified must exist in the CSportsLeagueRoster contract /// * Cannot mint a realWorldPlayer that currently has an active commissioner auction /// * Cannot mint realWorldPlayer that does not have minting enabled /// * Cannot mint realWorldPlayer with a start price exceeding our minimum /// If any of the above conditions fails to be met, then no player tokens will be /// minted. /// /// *** ONLY THE COMMISSIONER OR THE LEAGUE ROSTER CONTRACT CAN CALL THIS FUNCTION *** /// /// @param _md5Tokens - array of md5Tokens representing realWorldPlayer that we are minting. /// @param _startPrice - the starting price for the auction (0 will set to current minimum price) function mintPlayers(uint128[] _md5Tokens, uint256 _startPrice, uint256 _endPrice, uint256 _duration) public { require(leagueRosterContract != address(0)); require(saleClockAuctionContract != address(0)); require((msg.sender == commissionerAddress) || (msg.sender == address(leagueRosterContract))); for (uint32 i = 0; i < _md5Tokens.length; i++) { uint128 _md5Token = _md5Tokens[i]; uint128 _rosterIndex = leagueRosterContract.getRealWorldPlayerRosterIndex(_md5Token); if (_rosterIndex == 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) { // Cannot mint a non-existent real world player continue; } // We don't have to check _rosterIndex here because the getRealWorldPlayerRosterIndex(...) // method always returns a valid index. RealWorldPlayer memory _rwp; (_rwp.md5Token, _rwp.prevCommissionerSalePrice, _rwp.lastMintedTime, _rwp.mintedCount, _rwp.hasActiveCommissionerAuction, _rwp.mintingEnabled) = leagueRosterContract.realWorldPlayerFromIndex(_rosterIndex); if (_rwp.md5Token != _md5Token) continue; if (!_rwp.mintingEnabled) continue; // Enforce the restrictions that there can ever only be a single outstanding commissioner // auction - no new minting if there is an active commissioner auction for this real world player if (_rwp.hasActiveCommissionerAuction) continue; // Ensure that our price is not less than a minimum uint256 _minStartPrice = _computeNextCommissionerPrice(_rwp.prevCommissionerSalePrice); // Make sure the start price exceeds our minimum acceptable if (_startPrice < _minStartPrice) { _startPrice = _minStartPrice; } // Mint the new player token uint32 _playerId = _mintPlayer(uint32(_rosterIndex), _rwp.mintedCount, address(this)); // @dev Approve ownership transfer to the saleClockAuctionContract (which is required by // the createAuction(...) which will escrow the playerToken) _approve(_playerId, saleClockAuctionContract); // Apply the default duration if (_duration == 0) { _duration = COMMISSIONER_AUCTION_DURATION; } // By setting our _endPrice to zero, we become immune to the USD <==> ether // conversion rate. No matter how high ether goes, our auction price will get // to a USD value that is acceptable to someone (assuming 0 is acceptable that is). // This also helps for players that aren't in very much demand. saleClockAuctionContract.createAuction( _playerId, _startPrice, _endPrice, _duration, address(this) ); // Finally, update our realWorldPlayer record to reflect the fact that we just // minted a new one, and there is an active commish auction. leagueRosterContract.updateRealWorldPlayer(uint32(_rosterIndex), _rwp.prevCommissionerSalePrice, uint64(now), _rwp.mintedCount + 1, true, _rwp.mintingEnabled); } } /// @dev Reprices (and updates duration) of an array of tokens that are currently /// being auctioned by this contract. Since this function can only be called by /// the commissioner, we don't do a lot of checking of parameters and things. /// The SaleClockAuction's repriceAuctions method assures that the CSportsCore /// contract is the "seller" of the token (meaning it is a commissioner auction). /// @param _tokenIds Array of tokenIds corresponding to auctions being updated /// @param _startingPrices New starting prices for each token being repriced /// @param _endingPrices New ending price /// @param _duration New duration function repriceAuctions( uint256[] _tokenIds, uint256[] _startingPrices, uint256[] _endingPrices, uint256 _duration ) external onlyCommissioner { // We cannot reprice below our player minimum for (uint32 i = 0; i < _tokenIds.length; i++) { uint32 _tokenId = uint32(_tokenIds[i]); PlayerToken memory pt = playerTokens[_tokenId]; RealWorldPlayer memory _rwp; (_rwp.md5Token, _rwp.prevCommissionerSalePrice, _rwp.lastMintedTime, _rwp.mintedCount, _rwp.hasActiveCommissionerAuction, _rwp.mintingEnabled) = leagueRosterContract.realWorldPlayerFromIndex(pt.realWorldPlayerId); uint256 _minStartPrice = _computeNextCommissionerPrice(_rwp.prevCommissionerSalePrice); // We require the price to be >= our _minStartPrice require(_startingPrices[i] >= _minStartPrice); } // Note we pass in this CSportsCore contract address as the seller, making sure the only auctions // that can be repriced by this method are commissioner auctions. saleClockAuctionContract.repriceAuctions(_tokenIds, _startingPrices, _endingPrices, _duration, address(this)); } /// @dev Allows the commissioner to create a sale auction for a token /// that is owned by the core contract. Can only be called when not paused /// and only by the commissioner /// @param _playerTokenId - ID of the player token currently owned by the core contract /// @param _startingPrice - Starting price for the auction /// @param _endingPrice - Ending price for the auction /// @param _duration - Duration of the auction (in seconds) function createCommissionerAuction(uint32 _playerTokenId, uint256 _startingPrice, uint256 _endingPrice, uint256 _duration) public whenNotPaused onlyCommissioner { require(leagueRosterContract != address(0)); require(_playerTokenId < playerTokens.length); // If player is already on any auction, this will throw because it will not be owned by // this CSportsCore contract (as all commissioner tokens are if they are not currently // on auction). // Any token owned by the CSportsCore contract by definition is a commissioner auction // that was canceled which makes it OK to re-list. require(_owns(address(this), _playerTokenId)); // (1) Grab the real world token ID (md5) PlayerToken memory pt = playerTokens[_playerTokenId]; // (2) Get the full real world player record from its roster index RealWorldPlayer memory _rwp; (_rwp.md5Token, _rwp.prevCommissionerSalePrice, _rwp.lastMintedTime, _rwp.mintedCount, _rwp.hasActiveCommissionerAuction, _rwp.mintingEnabled) = leagueRosterContract.realWorldPlayerFromIndex(pt.realWorldPlayerId); // Ensure that our starting price is not less than a minimum uint256 _minStartPrice = _computeNextCommissionerPrice(_rwp.prevCommissionerSalePrice); if (_startingPrice < _minStartPrice) { _startingPrice = _minStartPrice; } // Apply the default duration if (_duration == 0) { _duration = COMMISSIONER_AUCTION_DURATION; } // Approve the token for transfer _approve(_playerTokenId, saleClockAuctionContract); // saleClockAuctionContract.createAuction throws if inputs are invalid and clears // transfer after escrowing the player. saleClockAuctionContract.createAuction( _playerTokenId, _startingPrice, _endingPrice, _duration, address(this) ); } /// @dev Computes the next commissioner auction starting price equal to /// the previous real world player sale price + 25% (with a floor). function _computeNextCommissionerPrice(uint128 prevTwoCommissionerSalePriceAve) internal view returns (uint256) { uint256 nextPrice = prevTwoCommissionerSalePriceAve + (prevTwoCommissionerSalePriceAve / 4); // sanity check to ensure we don't overflow arithmetic (this big number is 2^128-1). if (nextPrice > 340282366920938463463374607431768211455) { nextPrice = 340282366920938463463374607431768211455; } // We never auction for less than our floor if (nextPrice < COMMISSIONER_AUCTION_FLOOR_PRICE) { nextPrice = COMMISSIONER_AUCTION_FLOOR_PRICE; } return nextPrice; } } /// @notice This is the main contract that implements the csports ERC721 token. /// @author CryptoSports, Inc. (http://cryptosports.team) /// @dev This contract is made up of a series of parent classes so that we could /// break the code down into meaningful amounts of related functions in /// single files, as opposed to having one big file. The purpose of /// each facet is given here: /// /// CSportsConstants - This facet holds constants used throughout. /// CSportsAuth - /// CSportsBase - /// CSportsOwnership - /// CSportsAuction - /// CSportsMinting - /// CSportsCore - This is the main CSports constract implementing the CSports /// Fantash Football League. It manages contract upgrades (if / when /// they might occur), and has generally useful helper methods. /// /// This CSportsCore contract interacts with the CSportsLeagueRoster contract /// to determine which PlayerTokens to mint. /// /// This CSportsCore contract interacts with the TimeAuction contract /// to implement and run PlayerToken auctions (sales). contract CSportsCore is CSportsMinting { /// @dev Used by other contracts as a sanity check bool public isCoreContract = true; // Set if (hopefully not) the core contract needs to be upgraded. Can be // set by the CEO but only when paused. When successfully set, we can never // unpause this contract. See the unpause() method overridden by this class. address public newContractAddress; /// @notice Class constructor creates the main CSportsCore smart contract instance. /// @param nftName The ERC721 name for the contract /// @param nftSymbol The ERC721 symbol for the contract /// @param nftTokenURI The ERC721 token uri for the contract constructor(string nftName, string nftSymbol, string nftTokenURI) public { // New contract starts paused. paused = true; /// @notice storage for the fields that identify this 721 token _name = nftName; _symbol = nftSymbol; _tokenURI = nftTokenURI; // All C-level roles are the message sender ceoAddress = msg.sender; cfoAddress = msg.sender; cooAddress = msg.sender; commissionerAddress = msg.sender; } /// @dev Reject all Ether except if it's from one of our approved sources function() external payable { /*require( msg.sender == address(saleClockAuctionContract) );*/ } /// --------------------------------------------------------------------------- /// /// ----------------------------- PUBLIC FUNCTIONS ---------------------------- /// /// --------------------------------------------------------------------------- /// /// @dev Used to mark the smart contract as upgraded, in case there is a serious /// bug. This method does nothing but keep track of the new contract and /// emit a message indicating that the new address is set. It's up to clients of this /// contract to update to the new contract address in that case. (This contract will /// be paused indefinitely if such an upgrade takes place.) /// @param _v2Address new address function upgradeContract(address _v2Address) public onlyCEO whenPaused { newContractAddress = _v2Address; emit ContractUpgrade(_v2Address); } /// @dev Override unpause so it requires all external contract addresses /// to be set before contract can be unpaused. Also require that we have /// set a valid season and the contract has not been upgraded. function unpause() public onlyCEO whenPaused { require(leagueRosterContract != address(0)); require(saleClockAuctionContract != address(0)); require(newContractAddress == address(0)); // Actually unpause the contract. super.unpause(); } /// @dev Consolidates setting of contract links into a single call for deployment expediency function setLeagueRosterAndSaleAndTeamContractAddress(address _leagueAddress, address _saleAddress, address _teamAddress) public onlyCEO { setLeagueRosterContractAddress(_leagueAddress); setSaleAuctionContractAddress(_saleAddress); setTeamContractAddress(_teamAddress); } /// @dev Returns all the relevant information about a specific playerToken. ///@param _playerTokenID - player token ID we are seeking the full player token info for function getPlayerToken(uint32 _playerTokenID) public view returns ( uint32 realWorldPlayerId, uint32 serialNumber, uint64 mintedTime, uint128 mostRecentPrice) { require(_playerTokenID < playerTokens.length); PlayerToken storage pt = playerTokens[_playerTokenID]; realWorldPlayerId = pt.realWorldPlayerId; serialNumber = pt.serialNumber; mostRecentPrice = pt.mostRecentPrice; mintedTime = pt.mintedTime; } /// @dev Returns the realWorldPlayer MD5 ID for a given playerTokenID /// @param _playerTokenID - player token ID we are seeking the associated realWorldPlayer md5 for function realWorldPlayerTokenForPlayerTokenId(uint32 _playerTokenID) public view returns (uint128 md5Token) { require(_playerTokenID < playerTokens.length); PlayerToken storage pt = playerTokens[_playerTokenID]; RealWorldPlayer memory _rwp; (_rwp.md5Token, _rwp.prevCommissionerSalePrice, _rwp.lastMintedTime, _rwp.mintedCount, _rwp.hasActiveCommissionerAuction, _rwp.mintingEnabled) = leagueRosterContract.realWorldPlayerFromIndex(pt.realWorldPlayerId); md5Token = _rwp.md5Token; } /// @dev Returns the realWorldPlayer Metadata for a given playerTokenID /// @param _playerTokenID - player token ID we are seeking the associated realWorldPlayer md5 for function realWorldPlayerMetadataForPlayerTokenId(uint32 _playerTokenID) public view returns (string metadata) { require(_playerTokenID < playerTokens.length); PlayerToken storage pt = playerTokens[_playerTokenID]; RealWorldPlayer memory _rwp; (_rwp.md5Token, _rwp.prevCommissionerSalePrice, _rwp.lastMintedTime, _rwp.mintedCount, _rwp.hasActiveCommissionerAuction, _rwp.mintingEnabled) = leagueRosterContract.realWorldPlayerFromIndex(pt.realWorldPlayerId); metadata = leagueRosterContract.getMetadata(_rwp.md5Token); } /// --------------------------------------------------------------------------- /// /// ------------------------- RESTRICTED FUNCTIONS ---------------------------- /// /// --------------------------------------------------------------------------- /// /// @dev Updates a particular realRealWorldPlayer. Note that the md5Token is immutable. Can only be /// called by the CEO and is used in development stage only as it is only needed by our test suite. /// @param _rosterIndex - Index into realWorldPlayers of the entry to change. /// @param _prevCommissionerSalePrice - Average of the 2 most recent sale prices in commissioner auctions /// @param _lastMintedTime - Time this real world player was last minted /// @param _mintedCount - The number of playerTokens that have been minted for this player /// @param _hasActiveCommissionerAuction - Whether or not there is an active commissioner auction for this player /// @param _mintingEnabled - Denotes whether or not we should mint new playerTokens for this real world player function updateRealWorldPlayer(uint32 _rosterIndex, uint128 _prevCommissionerSalePrice, uint64 _lastMintedTime, uint32 _mintedCount, bool _hasActiveCommissionerAuction, bool _mintingEnabled) public onlyCEO onlyUnderDevelopment { require(leagueRosterContract != address(0)); leagueRosterContract.updateRealWorldPlayer(_rosterIndex, _prevCommissionerSalePrice, _lastMintedTime, _mintedCount, _hasActiveCommissionerAuction, _mintingEnabled); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"constant":true,"inputs":[{"name":"stringToHash","type":"string"}],"name":"getKeccak256","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"","type":"uint256"},{"name":"","type":"address"},{"name":"","type":"uint128"},{"name":"","type":"uint128"},{"name":"","type":"uint64"}],"name":"auctionCreated","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"cfoAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","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":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"ceoAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"implementsERC721","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_playerTokenID","type":"uint32"}],"name":"realWorldPlayerTokenForPlayerTokenId","outputs":[{"name":"md5Token","type":"uint128"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isDevelopment","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","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":false,"inputs":[{"name":"_newCEO","type":"address"}],"name":"setCEO","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newCOO","type":"address"}],"name":"setCOO","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_md5Tokens","type":"uint128[]"}],"name":"minStartPriceForCommishAuctions","outputs":[{"name":"","type":"uint128[50]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"remainingMarketingTokens","outputs":[{"name":"","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"commissionerAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"},{"name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"name":"_tokenId","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"playerTokens","outputs":[{"name":"realWorldPlayerId","type":"uint32"},{"name":"serialNumber","type":"uint32"},{"name":"mintedTime","type":"uint64"},{"name":"mostRecentPrice","type":"uint128"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"keywordHash","type":"uint256"},{"name":"md5Token","type":"uint128"}],"name":"addMarketingToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"COMMISSIONER_AUCTION_DURATION","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_ceo","type":"address"},{"name":"_cfo","type":"address"},{"name":"_coo","type":"address"},{"name":"_commish","type":"address"}],"name":"setCLevelAddresses","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_playerTokenId","type":"uint256"},{"name":"_startingPrice","type":"uint256"},{"name":"_endingPrice","type":"uint256"},{"name":"_duration","type":"uint256"}],"name":"createSaleAuction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"tokenId","type":"uint256"},{"name":"totalPrice","type":"uint128"},{"name":"seller","type":"address"},{"name":"winner","type":"address"}],"name":"auctionSuccessful","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"}],"name":"setLeagueRosterContractAddress","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":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"keyWords","type":"string"}],"name":"redeemMarketingToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"playerTokenToApproved","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newCFO","type":"address"}],"name":"setCFO","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newCommissioner","type":"address"}],"name":"setCommissioner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_playerTokenId","type":"uint32"},{"name":"_startingPrice","type":"uint256"},{"name":"_endingPrice","type":"uint256"},{"name":"_duration","type":"uint256"}],"name":"createCommissionerAuction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isMinter","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"_rosterIndex","type":"uint32"},{"name":"_prevCommissionerSalePrice","type":"uint128"},{"name":"_lastMintedTime","type":"uint64"},{"name":"_mintedCount","type":"uint32"},{"name":"_hasActiveCommissionerAuction","type":"bool"},{"name":"_mintingEnabled","type":"bool"}],"name":"updateRealWorldPlayer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenIds","type":"uint32[]"}],"name":"batchTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isCoreContract","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"withdrawBalance","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_tokenIds","type":"uint32[]"}],"name":"batchApprove","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"name":"owner","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"newContractAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"playerTokenToOwner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"count","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_MARKETING_TOKENS","outputs":[{"name":"","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"tokenId","type":"uint256"},{"name":"seller","type":"address"}],"name":"auctionCancelled","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_playerTokenID","type":"uint32"}],"name":"realWorldPlayerMetadataForPlayerTokenId","outputs":[{"name":"metadata","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"keyWords","type":"string"}],"name":"MD5FromMarketingKeywords","outputs":[{"name":"","type":"uint128"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"withdrawAuctionBalances","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_tokenIds","type":"uint256[]"},{"name":"_startingPrices","type":"uint256[]"},{"name":"_endingPrices","type":"uint256[]"},{"name":"_duration","type":"uint256"}],"name":"repriceAuctions","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"tokenId","type":"uint32"}],"name":"cancelCommissionerAuction","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":true,"inputs":[],"name":"COMMISSIONER_AUCTION_FLOOR_PRICE","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_md5Tokens","type":"uint128[]"},{"name":"_startPrice","type":"uint256"},{"name":"_endPrice","type":"uint256"},{"name":"_duration","type":"uint256"}],"name":"mintPlayers","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"cooAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"leagueRosterContract","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"}],"name":"setTeamContractAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"teamContract","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":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"_playerTokenID","type":"uint32"}],"name":"getPlayerToken","outputs":[{"name":"realWorldPlayerId","type":"uint32"},{"name":"serialNumber","type":"uint32"},{"name":"mintedTime","type":"uint64"},{"name":"mostRecentPrice","type":"uint128"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"saleClockAuctionContract","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"name":"ret","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"setProduction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_leagueAddress","type":"address"},{"name":"_saleAddress","type":"address"},{"name":"_teamAddress","type":"address"}],"name":"setLeagueRosterAndSaleAndTeamContractAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"uint256"}],"name":"ownedTokens","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"}],"name":"setSaleAuctionContractAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_owner","type":"address"},{"name":"_tokenIds","type":"uint32[]"}],"name":"batchEscrowToTeamContract","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"implementsSaleClockAuctionListener","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"_v2Address","type":"address"}],"name":"upgradeContract","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"oldKeywordHash","type":"uint256"},{"name":"newKeywordHash","type":"uint256"},{"name":"md5Token","type":"uint128"}],"name":"replaceMarketingToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"nftName","type":"string"},{"name":"nftSymbol","type":"string"},{"name":"nftTokenURI","type":"string"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":false,"name":"hash","type":"uint256"},{"indexed":false,"name":"rwpMd5","type":"uint128"},{"indexed":true,"name":"recipient","type":"address"}],"name":"MarketingTokenRedeemed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"hash","type":"uint256"},{"indexed":false,"name":"rwpMd5","type":"uint128"}],"name":"MarketingTokenCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"oldHash","type":"uint256"},{"indexed":false,"name":"newHash","type":"uint256"},{"indexed":false,"name":"rwpMd5","type":"uint128"}],"name":"MarketingTokenReplaced","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":true,"name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"approved","type":"address"},{"indexed":true,"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":false,"name":"tokenId","type":"uint256"},{"indexed":false,"name":"totalPrice","type":"uint256"},{"indexed":false,"name":"winner","type":"address"}],"name":"CommissionerAuctionSuccessful","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"tokenId","type":"uint256"}],"name":"CommissionerAuctionCanceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newContract","type":"address"}],"name":"ContractUpgrade","type":"event"}]
Contract Creation Code
60806040526000805461ffff199081166109c417918290556611c37937e08000600155621275006002556006805460a060020a61ffff0219167501000000000000000000000000000000000000000000179055600c805490911661ffff929092169190911790556014805460a060020a60ff021916740100000000000000000000000000000000000000001790553480156200009a57600080fd5b5060405162004ab638038062004ab68339810160409081528151602080840151928401516006805460a060020a60ff021916740100000000000000000000000000000000000000001790559184018051909493840193929092019162000107916011919086019062000174565b5081516200011d90601290602085019062000174565b5080516200013390601390602084019062000174565b50506003805433600160a060020a03199182168117909255600480548216831790556005805482168317905560068054909116909117905550620002199050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620001b757805160ff1916838001178555620001e7565b82800160010185558215620001e7579182015b82811115620001e7578251825591602001919060010190620001ca565b50620001f5929150620001f9565b5090565b6200021691905b80821115620001f5576000815560010162000200565b90565b61488d80620002296000396000f30060806040526004361061033e5763ffffffff60e060020a600035041662f86ac7811461034057806301ffc9a7146103ab57806304869083146103e15780630519ce791461042457806306fdde0314610455578063081812fc146104df578063095ea7b3146104f75780630a0f81681461051b5780631051db341461053057806318160ddd146105455780631ace88a41461055a5780631cc14cbc1461059457806323b872dd146105a957806327d7874c146105d35780632ba73c15146105f45780632bfe243f146106155780632d90dd92146106a35780632e43ec0c146106cf5780632f745c59146106e457806330d1f3e314610708578063325ecf9914610761578063334e712f1461078557806336e685f51461079a5780633d7d3f5a146107cd5780633d83230f146107ee5780633f4ba83a1461082457806341ba70111461083957806342842e0e1461085a5780634682ff71146108775780634df6d048146108d05780634e0a3379146108e85780634e0c4a9c146109095780634e41ebf61461092a5780634f6ccce71461095157806350e59eb3146105305780635436717914610969578063555fe48a146109b25780635c975abb14610a1d5780635ecb659414610a325780635fd8c71014610a475780636275448e14610a5c5780636352211e14610abf5780636af04a5714610ad75780636bb2374a14610aec57806370a0823114610b0457806370ffffec14610b255780637290c21d14610b3a57806375d955f714610b5e5780638456cb5914610b7c57806387800ce214610b9157806391876e5714610bea57806393afbdae14610bff57806395d89b4114610c3a5780639ca3669d14610c4f578063a22cb46514610c6d578063a974139414610c93578063aba2362814610ca8578063b047fb5014610d0a578063b352c56214610d1f578063b42d3b4014610d34578063b5d7d3d814610d55578063b88d4fde14610d6a578063b9931d3014610d96578063c501386314610db4578063c87b56dd14610dc9578063ce88a9ce14610de1578063d5bcecab14610df6578063e149f03614610e23578063e3a531a314610e60578063ea8037d614610e81578063eaf4170c14610530578063eb2c022314610ee4578063f418b15314610f05575b005b34801561034c57600080fd5b506040805160206004803580820135601f8101849004840285018401909552848452610399943694929360249392840191908190840183828082843750949750610f2c9650505050505050565b60408051918252519081900360200190f35b3480156103b757600080fd5b506103cd600160e060020a031960043516610ff8565b604080519115158252519081900360200190f35b3480156103ed57600080fd5b5061033e600435600160a060020a03602435166001608060020a036044358116906064351667ffffffffffffffff608435166110c9565b34801561043057600080fd5b506104396110fe565b60408051600160a060020a039092168252519081900360200190f35b34801561046157600080fd5b5061046a61110d565b6040805160208082528351818301528351919283929083019185019080838360005b838110156104a457818101518382015260200161048c565b50505050905090810190601f1680156104d15780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156104eb57600080fd5b506104396004356111a4565b34801561050357600080fd5b5061033e600160a060020a03600435166024356111d6565b34801561052757600080fd5b506104396112b0565b34801561053c57600080fd5b506103cd6112bf565b34801561055157600080fd5b506103996112c4565b34801561056657600080fd5b5061057863ffffffff600435166112ca565b604080516001608060020a039092168252519081900360200190f35b3480156105a057600080fd5b506103cd6113ff565b3480156105b557600080fd5b5061033e600160a060020a0360043581169060243516604435611421565b3480156105df57600080fd5b5061033e600160a060020a03600435166114ff565b34801561060057600080fd5b5061033e600160a060020a036004351661154d565b34801561062157600080fd5b506040805160206004803580820135838102808601850190965280855261066a9536959394602494938501929182918501908490808284375094975061159b9650505050505050565b604051808261064080838360005b83811015610690578181015183820152602001610678565b5050505090500191505060405180910390f35b3480156106af57600080fd5b506106b86117ee565b6040805161ffff9092168252519081900360200190f35b3480156106db57600080fd5b506104396117f8565b3480156106f057600080fd5b50610399600160a060020a0360043516602435611807565b34801561071457600080fd5b50610720600435611881565b6040805163ffffffff958616815293909416602084015267ffffffffffffffff909116828401526001608060020a0316606082015290519081900360800190f35b34801561076d57600080fd5b5061033e6004356001608060020a03602435166118d9565b34801561079157600080fd5b50610399611a53565b3480156107a657600080fd5b5061033e600160a060020a0360043581169060243581169060443581169060643516611a59565b3480156107d957600080fd5b5061033e600435602435604435606435611b14565b3480156107fa57600080fd5b5061033e6004356001608060020a0360243516600160a060020a0360443581169060643516611bf6565b34801561083057600080fd5b5061033e611d52565b34801561084557600080fd5b5061033e600160a060020a0360043516611dcf565b61033e600160a060020a0360043581169060243516604435611ebf565b34801561088357600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261033e9436949293602493928401919081908401838280828437509497506120189650505050505050565b3480156108dc57600080fd5b506104396004356123da565b3480156108f457600080fd5b5061033e600160a060020a03600435166123f5565b34801561091557600080fd5b5061033e600160a060020a0360043516612443565b34801561093657600080fd5b5061033e63ffffffff60043516602435604435606435612491565b34801561095d57600080fd5b5061039960043561275f565b34801561097557600080fd5b5061033e63ffffffff6004358116906001608060020a03602435169067ffffffffffffffff604435169060643516608435151560a4351515612779565b3480156109be57600080fd5b50604080516020600460443581810135838102808601850190965280855261033e958335600160a060020a0390811696602480359092169636969560649592949301928291850190849080828437509497506128969650505050505050565b348015610a2957600080fd5b506103cd6129a9565b348015610a3e57600080fd5b506103cd6129b9565b348015610a5357600080fd5b5061033e6129c9565b348015610a6857600080fd5b5060408051602060046024803582810135848102808701860190975280865261033e968435600160a060020a031696369660449591949091019291829185019084908082843750949750612a1d9650505050505050565b348015610acb57600080fd5b50610439600435612b2b565b348015610ae357600080fd5b50610439612b4f565b348015610af857600080fd5b50610439600435612b5e565b348015610b1057600080fd5b50610399600160a060020a0360043516612b79565b348015610b3157600080fd5b506106b8612b94565b348015610b4657600080fd5b5061033e600435600160a060020a0360243516612b9e565b348015610b6a57600080fd5b5061046a63ffffffff60043516612c96565b348015610b8857600080fd5b5061033e612eb9565b348015610b9d57600080fd5b506040805160206004803580820135601f8101849004840285018401909552848452610578943694929360249392840191908190840183828082843750949750612f4e9650505050505050565b348015610bf657600080fd5b5061033e613034565b348015610c0b57600080fd5b5061033e60246004803582810192908201359181358083019290820135916044359182019101356064356130b2565b348015610c4657600080fd5b5061046a6133b3565b348015610c5b57600080fd5b5061033e63ffffffff60043516613414565b348015610c7957600080fd5b5061033e600160a060020a036004351660243515156134c1565b348015610c9f57600080fd5b50610399613545565b348015610cb457600080fd5b506040805160206004803580820135838102808601850190965280855261033e953695939460249493850192918291850190849080828437509497505084359550505060208301359260400135915061354b9050565b348015610d1657600080fd5b5061043961396e565b348015610d2b57600080fd5b5061043961397d565b348015610d4057600080fd5b5061033e600160a060020a036004351661398c565b348015610d6157600080fd5b50610439613a41565b61033e600160a060020a0360048035821691602480359091169160443591606435908101910135613a50565b348015610da257600080fd5b5061072063ffffffff60043516613bb5565b348015610dc057600080fd5b50610439613c3d565b348015610dd557600080fd5b5061046a600435613c4c565b348015610ded57600080fd5b5061033e613d4c565b348015610e0257600080fd5b5061033e600160a060020a0360043581169060243581169060443516613db1565b348015610e2f57600080fd5b50610e47600160a060020a0360043516602435613de3565b6040805163ffffffff9092168252519081900360200190f35b348015610e6c57600080fd5b5061033e600160a060020a0360043516613e2b565b348015610e8d57600080fd5b5060408051602060046024803582810135848102808701860190975280865261033e968435600160a060020a031696369660449591949091019291829185019084908082843750949750613ef59650505050505050565b348015610ef057600080fd5b5061033e600160a060020a0360043516613fb7565b348015610f1157600080fd5b5061033e6004356024356001608060020a036044351661403a565b6000816040516020018082805190602001908083835b60208310610f615780518252601f199092019160209182019101610f42565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040526040518082805190602001908083835b60208310610fc45780518252601f199092019160209182019101610fa5565b5181516020939093036101000a6000190180199091169216919091179052604051920182900390912093505050505b919050565b6000600160e060020a031982167f01ffc9a700000000000000000000000000000000000000000000000000000000148061105b57507f5b5e139f00000000000000000000000000000000000000000000000000000000600160e060020a03198316145b8061108f57507f80ac58cd00000000000000000000000000000000000000000000000000000000600160e060020a03198316145b806110c357507f780e9d6300000000000000000000000000000000000000000000000000000000600160e060020a03198316145b92915050565b601454600160a060020a031615156110e057600080fd5b601454600160a060020a031633146110f757600080fd5b5050505050565b600454600160a060020a031681565b60118054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156111995780601f1061116e57610100808354040283529160200191611199565b820191906000526020600020905b81548152906001019060200180831161117c57829003601f168201915b505050505090505b90565b60006111af826140fb565b15156111ba57600080fd5b50600090815260086020526040902054600160a060020a031690565b60065460009060a060020a900460ff16156111f057600080fd5b6111f982612b2b565b9050600160a060020a03838116908216141561121457600080fd5b33600160a060020a038216148061125e5750600b600061123384612b2b565b600160a060020a031681526020808201929092526040908101600090812033825290925290205460ff165b151561126957600080fd5b6112738284614102565b6040518290600160a060020a0385169033907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590600090a4505050565b600354600160a060020a031681565b600190565b60105490565b6000806112d5614798565b60105463ffffffff8516106112e957600080fd5b6010805463ffffffff86169081106112fd57fe5b600091825260208220600e54910180546040805160e060020a63632f83eb02815263ffffffff909216600483015251919550600160a060020a039092169263632f83eb9260248082019360c093909283900390910190829087803b15801561136457600080fd5b505af1158015611378573d6000803e3d6000fd5b505050506040513d60c081101561138e57600080fd5b50805160208083015160408085015160608087015160808089015160a0998a01511515998b01999099529715159789019790975263ffffffff9096169587019590955267ffffffffffffffff909416938501939093526001608060020a039283169084015216908190529392505050565b6006547501000000000000000000000000000000000000000000900460ff1681565b60065460a060020a900460ff161561143857600080fd5b600160a060020a038216151561144d57600080fd5b611456816140fb565b151561146157600080fd5b61146b8282614130565b151561147657600080fd5b6114808382614150565b151561148b57600080fd5b6114953382614150565b806114b65750600081815260086020526040902054600160a060020a031633145b806114e45750600160a060020a0383166000908152600b6020908152604080832033845290915290205460ff165b15156114ef57600080fd5b6114fa838383614170565b505050565b600354600160a060020a0316331461151657600080fd5b600160a060020a038116151561152b57600080fd5b60038054600160a060020a031916600160a060020a0392909216919091179055565b600354600160a060020a0316331461156457600080fd5b600160a060020a038116151561157957600080fd5b60058054600160a060020a031916600160a060020a0392909216919091179055565b6115a36147d6565b6115ab6147d6565b60008060006115b8614798565b600654600160a060020a031633146115cf57600080fd5b8651603210156115de57600080fd5b600093505b86518463ffffffff1610156117e357868463ffffffff1681518110151561160657fe5b6020908102909101810151600e546040805160e160020a6375145d770281526001608060020a03841660048201529051929650600160a060020a039091169263ea28baee926024808401938290030181600087803b15801561166757600080fd5b505af115801561167b573d6000803e3d6000fd5b505050506040513d602081101561169157600080fd5b505191506001608060020a0380831614156116ab576117d8565b600e546040805160e060020a63632f83eb0281526001608060020a03851660048201529051600160a060020a039092169163632f83eb9160248082019260c0929091908290030181600087803b15801561170457600080fd5b505af1158015611718573d6000803e3d6000fd5b505050506040513d60c081101561172e57600080fd5b50805160208083015160408085015160608087015160808089015160a0998a01511515998b01999099529715159789019790975263ffffffff9096169587019590955267ffffffffffffffff909416938501939093526001608060020a03928316908401528116808352908416146117a5576117d8565b6117b2816020015161421a565b8563ffffffff8616603281106117c457fe5b6001608060020a0390921660209290920201525b6001909301926115e3565b509295945050505050565b600c5461ffff1681565b600654600160a060020a031681565b6000600160a060020a038316151561181e57600080fd5b61182783612b79565b821061183257600080fd5b600160a060020a038316600090815260096020526040902080548390811061185657fe5b6000918252602090912060088204015460079091166004026101000a900463ffffffff169392505050565b601080548290811061188f57fe5b60009182526020909120015463ffffffff80821692506401000000008204169068010000000000000000810467ffffffffffffffff1690608060020a90046001608060020a031684565b600654600090600160a060020a031633146118f357600080fd5b600c54600061ffff9091161161190857600080fd5b6000838152600d60205260409020546001608060020a03161561192a57600080fd5b600e546040805160e160020a6375145d770281526001608060020a03851660048201529051600160a060020a039092169163ea28baee916024808201926020929091908290030181600087803b15801561198357600080fd5b505af1158015611997573d6000803e3d6000fd5b505050506040513d60208110156119ad57600080fd5b505190506001608060020a0380821614156119c757600080fd5b600c805461ffff19811661ffff918216600019019091161790556000838152600d602090815260409182902080546fffffffffffffffffffffffffffffffff19166001608060020a03861690811790915582518681529182015281517fac5613cd90c9b419cafa2ae0a50e724f1ec5ee58680ba98df619f9d6199c1138929181900390910190a1505050565b60025481565b600354600160a060020a03163314611a7057600080fd5b600160a060020a0384161515611a8557600080fd5b600160a060020a0383161515611a9a57600080fd5b600160a060020a0382161515611aaf57600080fd5b600160a060020a0381161515611ac457600080fd5b60038054600160a060020a03958616600160a060020a0319918216179091556004805494861694821694909417909355600580549285169284169290921790915560068054919093169116179055565b60065460a060020a900460ff1615611b2b57600080fd5b611b353385614150565b1515611b4057600080fd5b601454611b57908590600160a060020a0316614102565b601454604080517f27ebe40a000000000000000000000000000000000000000000000000000000008152600481018790526024810186905260448101859052606481018490523360848201529051600160a060020a03909216916327ebe40a9160a48082019260009290919082900301818387803b158015611bd857600080fd5b505af1158015611bec573d6000803e3d6000fd5b5050505050505050565b601454600090600160a060020a03161515611c1057600080fd5b601454600160a060020a03163314611c2757600080fd5b6010805486908110611c3557fe5b600091825260209091200180546001608060020a03808716608060020a0291161781559050600160a060020a0383163014156110f757600e5460108054600160a060020a03909216916313e8360d919088908110611c8f57fe5b60009182526020822001546040805163ffffffff85811660e060020a02825290921660048301526001608060020a0389166024830152516044808301939282900301818387803b158015611ce257600080fd5b505af1158015611cf6573d6000803e3d6000fd5b5050604080518881526001608060020a0388166020820152600160a060020a0386168183015290517f2c828d5a092351b455bd3fb7415c4c54d05c22862126f1dd525a7aaa6ef144a69350908190036060019150a15050505050565b600354600160a060020a03163314611d6957600080fd5b60065460a060020a900460ff161515611d8157600080fd5b600e54600160a060020a03161515611d9857600080fd5b601454600160a060020a03161515611daf57600080fd5b601554600160a060020a031615611dc557600080fd5b611dcd614264565b565b600354600090600160a060020a03163314611de957600080fd5b6006547501000000000000000000000000000000000000000000900460ff161515611e2457600e54600160a060020a031615611e2457600080fd5b81905080600160a060020a03166319d375f16040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015611e6557600080fd5b505af1158015611e79573d6000803e3d6000fd5b505050506040513d6020811015611e8f57600080fd5b50511515611e9c57600080fd5b600e8054600160a060020a031916600160a060020a039290921691909117905550565b600080600160a060020a0384161515611ed757600080fd5b611ee2858585611421565b611eeb846142b3565b156110f757604080517f150b7a02000000000000000000000000000000000000000000000000000000008152336004820152600160a060020a038781166024830152604482018690526080606483015260006084830181905292518795509085169263150b7a029261c3509260c48083019360209383900390910190829088803b158015611f7857600080fd5b5087f1158015611f8c573d6000803e3d6000fd5b50505050506040513d6020811015611fa357600080fd5b5051604080517f6f6e455243373231526563656976656428616464726573732c75696e7432353681527f2c6279746573290000000000000000000000000000000000000000000000000060208201529051908190036027019020909150600160e060020a03198083169116146110f757600080fd5b6000806000612025614798565b846040516020018082805190602001908083835b602083106120585780518252601f199092019160209182019101612039565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040526040518082805190602001908083835b602083106120bb5780518252601f19909201916020918201910161209c565b51815160209384036101000a600019018019909216911617905260408051929094018290039091206000818152600d90925292902054919750506001608060020a0316945050831590506110f7576000848152600d6020908152604080832080546fffffffffffffffffffffffffffffffff19169055600e54815160e160020a6375145d770281526001608060020a03881660048201529151600160a060020a039091169363ea28baee93602480850194919392918390030190829087803b15801561218657600080fd5b505af115801561219a573d6000803e3d6000fd5b505050506040513d60208110156121b057600080fd5b505191506001608060020a03808316146110f757600e546040805160e060020a63632f83eb0281526001608060020a03851660048201529051600160a060020a039092169163632f83eb9160248082019260c0929091908290030181600087803b15801561221d57600080fd5b505af1158015612231573d6000803e3d6000fd5b505050506040513d60c081101561224757600080fd5b50805160208083015160408085015160608087015160808089015160a0998a01511515998b01999099529715159789019790975263ffffffff90961695870186905267ffffffffffffffff16908601526001608060020a03908116918501919091521682526122b8908390336142bb565b50600e5460208201516060830151608084015160a0850151604080517f5436717900000000000000000000000000000000000000000000000000000000815263ffffffff89811660048301526001608060020a0390961660248201524267ffffffffffffffff166044820152600190940190941660648401529015156084830152151560a48201529051600160a060020a039092169163543671799160c48082019260009290919082900301818387803b15801561237557600080fd5b505af1158015612389573d6000803e3d6000fd5b50508251604080518881526001608060020a03909216602083015280513394507fda16be24a464fba0949b7f7459d1effe21067107b44fe43a1cd76882e6cf10f79350918290030190a25050505050565b600860205260009081526040902054600160a060020a031681565b600354600160a060020a0316331461240c57600080fd5b600160a060020a038116151561242157600080fd5b60048054600160a060020a031916600160a060020a0392909216919091179055565b600354600160a060020a0316331461245a57600080fd5b600160a060020a038116151561246f57600080fd5b60068054600160a060020a031916600160a060020a0392909216919091179055565b6124996147f6565b6124a1614798565b60065460009060a060020a900460ff16156124bb57600080fd5b600654600160a060020a031633146124d257600080fd5b600e54600160a060020a031615156124e957600080fd5b60105463ffffffff8816106124fd57600080fd5b61250d308863ffffffff16614150565b151561251857600080fd5b6010805463ffffffff891690811061252c57fe5b6000918252602080832060408051608081018252939091015463ffffffff80821680865264010000000083049091169385019390935268010000000000000000810467ffffffffffffffff1684830152608060020a90046001608060020a03166060840152600e54815160e060020a63632f83eb02815260048101939093529051929650600160a060020a03169263632f83eb9260248084019360c0939083900390910190829087803b1580156125e257600080fd5b505af11580156125f6573d6000803e3d6000fd5b505050506040513d60c081101561260c57600080fd5b50805160208083015160408085015160608087015160808089015160a0998a01511515998c0199909952971515978a019790975263ffffffff9096169588019590955267ffffffffffffffff909416938601939093526001608060020a03928316908501819052911683526126809061421a565b90508086101561268e578095505b83151561269b5760025493505b6014546126b89063ffffffff891690600160a060020a0316614102565b601454604080517f27ebe40a00000000000000000000000000000000000000000000000000000000815263ffffffff8a1660048201526024810189905260448101889052606481018790523060848201529051600160a060020a03909216916327ebe40a9160a48082019260009290919082900301818387803b15801561273e57600080fd5b505af1158015612752573d6000803e3d6000fd5b5050505050505050505050565b600061276a826140fb565b151561277557600080fd5b5090565b600354600160a060020a0316331461279057600080fd5b6006547501000000000000000000000000000000000000000000900460ff1615156001146127bd57600080fd5b600e54600160a060020a031615156127d457600080fd5b600e54604080517f5436717900000000000000000000000000000000000000000000000000000000815263ffffffff808a1660048301526001608060020a038916602483015267ffffffffffffffff8816604483015286166064820152841515608482015283151560a48201529051600160a060020a039092169163543671799160c48082019260009290919082900301818387803b15801561287657600080fd5b505af115801561288a573d6000803e3d6000fd5b50505050505050505050565b600654600090819060a060020a900460ff16156128b257600080fd5b600091505b82518263ffffffff1610156110f757828263ffffffff168151811015156128da57fe5b9060200190602002015190506128f6848263ffffffff16614130565b151561290157600080fd5b612911858263ffffffff16614150565b151561291c57600080fd5b61292c338263ffffffff16614150565b80612954575063ffffffff8116600090815260086020526040902054600160a060020a031633145b806129825750600160a060020a0385166000908152600b6020908152604080832033845290915290205460ff165b151561298d57600080fd5b61299e85858363ffffffff16614170565b6001909101906128b7565b60065460a060020a900460ff1681565b60145460a060020a900460ff1681565b600454600160a060020a031633146129e057600080fd5b600454604051600160a060020a0390911690303180156108fc02916000818181858888f19350505050158015612a1a573d6000803e3d6000fd5b50565b600654600090819060a060020a900460ff1615612a3957600080fd5b600091505b82518263ffffffff161015612b2557828263ffffffff16815181101515612a6157fe5b906020019060200201519050612a7d338263ffffffff16614150565b80612ac15750600b6000612a968363ffffffff16612b2b565b600160a060020a031681526020808201929092526040908101600090812033825290925290205460ff165b1515612acc57600080fd5b612adc8163ffffffff1685614102565b60405163ffffffff821690600160a060020a0386169033907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590600090a4600190910190612a3e565b50505050565b600081815260076020526040902054600160a060020a0316801515610ff357600080fd5b601554600160a060020a031681565b600760205260009081526040902054600160a060020a031681565b600160a060020a031660009081526009602052604090205490565b60005461ffff1681565b601454600160a060020a03161515612bb557600080fd5b601454600160a060020a03163314612bcc57600080fd5b600160a060020a038116301415612c9257600e5460108054600160a060020a0390921691638b52463a919085908110612c0157fe5b60009182526020822001546040805163ffffffff85811660e060020a0282529092166004830152516024808301939282900301818387803b158015612c4557600080fd5b505af1158015612c59573d6000803e3d6000fd5b50506040805185815290517f21ba71a6e82e1270ffb5b0c8f5b92134ed3c0444b338bc5b82e1e26352f2d2499350908190036020019150a15b5050565b60606000612ca2614798565b60105463ffffffff851610612cb657600080fd5b6010805463ffffffff8616908110612cca57fe5b600091825260208220600e54910180546040805160e060020a63632f83eb02815263ffffffff909216600483015251919550600160a060020a039092169263632f83eb9260248082019360c093909283900390910190829087803b158015612d3157600080fd5b505af1158015612d45573d6000803e3d6000fd5b505050506040513d60c0811015612d5b57600080fd5b50805160208083015160408085015160608087015160808089015160a0998a01511515998b01999099529715159789019790975263ffffffff9096169587019590955267ffffffffffffffff909416858501526001608060020a039081169185019190915216808352600e5482517f390209c100000000000000000000000000000000000000000000000000000000815260048101929092529151600160a060020a039092169163390209c19160248082019260009290919082900301818387803b158015612e2957600080fd5b505af1158015612e3d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015612e6657600080fd5b810190808051640100000000811115612e7e57600080fd5b82016020810184811115612e9157600080fd5b8151640100000000811182820187101715612eab57600080fd5b509098975050505050505050565b600554600160a060020a0316331480612edc5750600354600160a060020a031633145b80612ef15750600454600160a060020a031633145b80612f065750600654600160a060020a031633145b1515612f1157600080fd5b60065460a060020a900460ff1615612f2857600080fd5b6006805474ff0000000000000000000000000000000000000000191660a060020a179055565b6000806000836040516020018082805190602001908083835b60208310612f865780518252601f199092019160209182019101612f67565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040526040518082805190602001908083835b60208310612fe95780518252601f199092019160209182019101612fca565b51815160209384036101000a600019018019909216911617905260408051929094018290039091206000908152600d90915291909120546001608060020a0316979650505050505050565b600554600160a060020a0316331461304b57600080fd5b601460009054906101000a9004600160a060020a0316600160a060020a0316635fd8c7106040518163ffffffff1660e060020a028152600401600060405180830381600087803b15801561309e57600080fd5b505af1158015612b25573d6000803e3d6000fd5b6000806130bd6147f6565b6130c5614798565b600654600090600160a060020a031633146130df57600080fd5b600094505b63ffffffff85168b11156132aa578b8b63ffffffff871681811061310457fe5b90506020020135935060108463ffffffff1681548110151561312257fe5b6000918252602080832060408051608081018252939091015463ffffffff80821680865264010000000083049091169385019390935268010000000000000000810467ffffffffffffffff1684830152608060020a90046001608060020a03166060840152600e54815160e060020a63632f83eb02815260048101939093529051929650600160a060020a03169263632f83eb9260248084019360c0939083900390910190829087803b1580156131d857600080fd5b505af11580156131ec573d6000803e3d6000fd5b505050506040513d60c081101561320257600080fd5b50805160208083015160408085015160608087015160808089015160a0998a01511515998c0199909952971515978a019790975263ffffffff9096169588019590955267ffffffffffffffff909416938601939093526001608060020a03928316908501819052911683526132769061421a565b9050808a8a63ffffffff881681811061328b57fe5b905060200201351015151561329f57600080fd5b6001909401936130e4565b601460009054906101000a9004600160a060020a0316600160a060020a0316639decde198d8d8d8d8d8d8d306040518963ffffffff1660e060020a0281526004018080602001806020018060200186815260200185600160a060020a0316600160a060020a0316815260200184810384528c8c8281815260200192506020028082843790910185810384528a8152602090810191508b908b0280828437909101858103835288815260209081019150899089028082843782019150509b505050505050505050505050600060405180830381600087803b15801561338d57600080fd5b505af11580156133a1573d6000803e3d6000fd5b50505050505050505050505050505050565b60128054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156111995780601f1061116e57610100808354040283529160200191611199565b600654600160a060020a0316331461342b57600080fd5b601454600160a060020a0316151561344257600080fd5b601454604080517f96b5a75500000000000000000000000000000000000000000000000000000000815263ffffffff841660048201529051600160a060020a03909216916396b5a7559160248082019260009290919082900301818387803b1580156134ad57600080fd5b505af11580156110f7573d6000803e3d6000fd5b600160a060020a0382163314156134d757600080fd5b336000818152600b60209081526040808320600160a060020a03871680855290835292819020805460ff1916861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b60015481565b6000806000613558614798565b600e546000908190600160a060020a0316151561357457600080fd5b601454600160a060020a0316151561358b57600080fd5b600654600160a060020a03163314806135ae5750600e54600160a060020a031633145b15156135b957600080fd5b600095505b89518663ffffffff16101561288a57898663ffffffff168151811015156135e157fe5b6020908102909101810151600e546040805160e160020a6375145d770281526001608060020a03841660048201529051929850600160a060020a039091169263ea28baee926024808401938290030181600087803b15801561364257600080fd5b505af1158015613656573d6000803e3d6000fd5b505050506040513d602081101561366c57600080fd5b505193506001608060020a03808516141561368657613963565b600e546040805160e060020a63632f83eb0281526001608060020a03871660048201529051600160a060020a039092169163632f83eb9160248082019260c0929091908290030181600087803b1580156136df57600080fd5b505af11580156136f3573d6000803e3d6000fd5b505050506040513d60c081101561370957600080fd5b50805160208083015160408085015160608087015160808089015160a0998a01511515998d0199909952971515978b019790975263ffffffff9096169589019590955267ffffffffffffffff909416938701939093526001608060020a039283169086015281168085529086161461378057613963565b8260a00151151561379057613963565b82608001511561379f57613963565b6137ac836020015161421a565b9150818910156137ba578198505b6137c9848460600151306142bb565b6014549091506137e99063ffffffff831690600160a060020a0316614102565b8615156137f65760025496505b601454604080517f27ebe40a00000000000000000000000000000000000000000000000000000000815263ffffffff84166004820152602481018c9052604481018b9052606481018a90523060848201529051600160a060020a03909216916327ebe40a9160a48082019260009290919082900301818387803b15801561387c57600080fd5b505af1158015613890573d6000803e3d6000fd5b5050600e546020860151606087015160a0880151604080517f5436717900000000000000000000000000000000000000000000000000000000815263ffffffff8c811660048301526001608060020a0390951660248201524267ffffffffffffffff166044820152600193840190941660648501526084840192909252151560a483015251600160a060020a0390921693506354367179925060c48082019260009290919082900301818387803b15801561394a57600080fd5b505af115801561395e573d6000803e3d6000fd5b505050505b6001909501946135be565b600554600160a060020a031681565b600e54600160a060020a031681565b600354600090600160a060020a031633146139a657600080fd5b81905080600160a060020a0316637d58dbb46040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156139e757600080fd5b505af11580156139fb573d6000803e3d6000fd5b505050506040513d6020811015613a1157600080fd5b50511515613a1e57600080fd5b600f8054600160a060020a031916600160a060020a039290921691909117905550565b600f54600160a060020a031681565b600080613a5e878787611421565b613a67866142b3565b15613bac576040517f150b7a020000000000000000000000000000000000000000000000000000000081523360048201818152600160a060020a038a8116602485015260448401899052608060648501908152608485018890528a96509086169363150b7a029361c3509390928d928c928c928c9260a40184848082843782019150509650505050505050602060405180830381600088803b158015613b0c57600080fd5b5087f1158015613b20573d6000803e3d6000fd5b50505050506040513d6020811015613b3757600080fd5b5051604080517f6f6e455243373231526563656976656428616464726573732c75696e7432353681527f2c6279746573290000000000000000000000000000000000000000000000000060208201529051908190036027019020909150600160e060020a0319808316911614613bac57600080fd5b50505050505050565b60008060008060006010805490508663ffffffff16101515613bd657600080fd5b6010805463ffffffff8816908110613bea57fe5b60009182526020909120015463ffffffff808216986401000000008304909116975068010000000000000000820467ffffffffffffffff169650608060020a9091046001608060020a0316945092505050565b601454600160a060020a031681565b606080613c58836143f1565b90506013816040516020018083805460018160011615610100020316600290048015613cbb5780601f10613c99576101008083540402835291820191613cbb565b820191906000526020600020905b815481529060010190602001808311613ca7575b5050825160208401908083835b60208310613ce75780518252601f199092019160209182019101613cc8565b6001836020036101000a038019825116818451168082178552505050505050905001807f2f0000000000000000000000000000000000000000000000000000000000000081525060010192505050604051602081830303815290604052915050919050565b600354600160a060020a03163314613d6357600080fd5b6006547501000000000000000000000000000000000000000000900460ff161515600114613d9057600080fd5b6006805475ff00000000000000000000000000000000000000000019169055565b600354600160a060020a03163314613dc857600080fd5b613dd183611dcf565b613dda82613e2b565b6114fa8161398c565b600960205281600052604060002081815481101515613dfe57fe5b9060005260206000209060089182820401919006600402915091509054906101000a900463ffffffff1681565b600354600090600160a060020a03163314613e4557600080fd5b600160a060020a0382161515613e5a57600080fd5b81905080600160a060020a03166385b861886040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015613e9b57600080fd5b505af1158015613eaf573d6000803e3d6000fd5b505050506040513d6020811015613ec557600080fd5b50511515613ed257600080fd5b60148054600160a060020a031916600160a060020a039290921691909117905550565b600654600090819060a060020a900460ff1615613f1157600080fd5b600f54600160a060020a03161515613f2857600080fd5b600f54600160a060020a03163314613f3f57600080fd5b600091505b82518263ffffffff161015612b2557828263ffffffff16815181101515613f6757fe5b906020019060200201519050613f83848263ffffffff16614150565b1515613f8e57600080fd5b600f54613fac908590600160a060020a031663ffffffff8416614170565b600190910190613f44565b600354600160a060020a03163314613fce57600080fd5b60065460a060020a900460ff161515613fe657600080fd5b60158054600160a060020a038316600160a060020a0319909116811790915560408051918252517f450db8da6efbe9c22f2347f7c2021231df1fc58d3ae9a2fa75d39fa4461993059181900360200190a150565b600654600090600160a060020a0316331461405457600080fd5b506000838152600d60205260409020546001608060020a03168015612b25576000848152600d6020908152604080832080546fffffffffffffffffffffffffffffffff199081169091558684529281902080546001608060020a03871694168417905580518781529182018690528181019290925290517f45f1783956ce716709d857d37617b2f6a942f9eca570e9e903c7eec4befbf3329181900360600190a150505050565b6010541190565b6000918252600860205260409091208054600160a060020a031916600160a060020a03909216919091179055565b600090815260086020526040902054600160a060020a0391821691161490565b600090815260076020526040902054600160a060020a0391821691161490565b60008181526007602052604090208054600160a060020a031916600160a060020a03848116919091179091558316156141ca576141ad8382614410565b60008181526008602052604090208054600160a060020a03191690555b6141d4828261454e565b8082600160a060020a031684600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008060046001608060020a0384160483016001608060020a031690506001608060020a0381111561425057506001608060020a035b6001548110156110c3575060015492915050565b600354600160a060020a0316331461427b57600080fd5b60065460a060020a900460ff16151561429357600080fd5b6006805474ff000000000000000000000000000000000000000019169055565b6000903b1190565b60006142c56147f6565b600063ffffffff868116106142d957600080fd5b63ffffffff858116106142eb57600080fd5b50506040805160808101825263ffffffff80871682528581166020830190815267ffffffffffffffff42811694840194855260006060850181815260108054600181018255925285517f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae672830180549551985192516001608060020a03908116608060020a029390951668010000000000000000026fffffffffffffffff0000000000000000199988166401000000000267ffffffff000000001993891663ffffffff19909816979097179290921695909517979097169690961790911694909417905590919081106143dc57600080fd5b6143e860008583614170565b95945050505050565b606060006143fe836145c4565b90506144098161461d565b9392505050565b63ffffffff8082166000908152600a6020908152604080832054600160a060020a03871684526009909252822080549190931692600019820192918390811061445557fe5b60009182526020808320600883040154600160a060020a038916845260099091526040909220805460079092166004026101000a90920463ffffffff90811693508392919086169081106144a557fe5b90600052602060002090600891828204019190066004026101000a81548163ffffffff021916908363ffffffff1602179055506009600086600160a060020a0316600160a060020a03168152602001908152602001600020805480919060019003614510919061481d565b5063ffffffff9081166000908152600a6020526040808220805495841663ffffffff1996871617905594909116815292909220805490911690555050565b600160a060020a03909116600090815260096020908152604080832080546001810182559084528284206008820401805463ffffffff968716600460078516026101000a81810290890219909216919091179091558452600a90925290912080549290911663ffffffff19909216919091179055565b60008115156145f457507f3000000000000000000000000000000000000000000000000000000000000000610ff3565b6000821115610ff35761010081049050600a820660300160f860020a0217600a820491506145f4565b60408051602080825281830190925260609160009183918391829184919080820161040080388339019050509350600092505b60208310156146e6576008830260020a870291507fff000000000000000000000000000000000000000000000000000000000000008216156146d65781848481518110151561469b57fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506001909401936146db565b6146e6565b600190920191614650565b846040519080825280601f01601f191660200182016040528015614714578160200160208202803883390190505b509050600092505b8483101561478e57838381518110151561473257fe5b90602001015160f860020a900460f860020a02818481518110151561475357fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060019092019161471c565b9695505050505050565b6040805160e08101825260008082526020820181905291810182905260608082018390526080820183905260a082019290925260c081019190915290565b610640604051908101604052806032906020820280388339509192915050565b60408051608081018252600080825260208201819052918101829052606081019190915290565b8154818355818111156114fa576000838152602090206114fa916111a19160086007928301819004820192860104015b80821115612775576000815560010161484d5600a165627a7a723058207f843893d21ff1c0b8c8ceb8b84a4c1995365f30f82cd381686835129a8ef93b0029000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000002443727970746f53706f72747320466f6f7462616c6c2046616e746173792053706f72747300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000543534e464c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002d68747470733a2f2f6170692e63727970746f73706f7274733732312e636f6d2f6e666c2f746f6b656e7572692f00000000000000000000000000000000000000
Deployed Bytecode
0x60806040526004361061033e5763ffffffff60e060020a600035041662f86ac7811461034057806301ffc9a7146103ab57806304869083146103e15780630519ce791461042457806306fdde0314610455578063081812fc146104df578063095ea7b3146104f75780630a0f81681461051b5780631051db341461053057806318160ddd146105455780631ace88a41461055a5780631cc14cbc1461059457806323b872dd146105a957806327d7874c146105d35780632ba73c15146105f45780632bfe243f146106155780632d90dd92146106a35780632e43ec0c146106cf5780632f745c59146106e457806330d1f3e314610708578063325ecf9914610761578063334e712f1461078557806336e685f51461079a5780633d7d3f5a146107cd5780633d83230f146107ee5780633f4ba83a1461082457806341ba70111461083957806342842e0e1461085a5780634682ff71146108775780634df6d048146108d05780634e0a3379146108e85780634e0c4a9c146109095780634e41ebf61461092a5780634f6ccce71461095157806350e59eb3146105305780635436717914610969578063555fe48a146109b25780635c975abb14610a1d5780635ecb659414610a325780635fd8c71014610a475780636275448e14610a5c5780636352211e14610abf5780636af04a5714610ad75780636bb2374a14610aec57806370a0823114610b0457806370ffffec14610b255780637290c21d14610b3a57806375d955f714610b5e5780638456cb5914610b7c57806387800ce214610b9157806391876e5714610bea57806393afbdae14610bff57806395d89b4114610c3a5780639ca3669d14610c4f578063a22cb46514610c6d578063a974139414610c93578063aba2362814610ca8578063b047fb5014610d0a578063b352c56214610d1f578063b42d3b4014610d34578063b5d7d3d814610d55578063b88d4fde14610d6a578063b9931d3014610d96578063c501386314610db4578063c87b56dd14610dc9578063ce88a9ce14610de1578063d5bcecab14610df6578063e149f03614610e23578063e3a531a314610e60578063ea8037d614610e81578063eaf4170c14610530578063eb2c022314610ee4578063f418b15314610f05575b005b34801561034c57600080fd5b506040805160206004803580820135601f8101849004840285018401909552848452610399943694929360249392840191908190840183828082843750949750610f2c9650505050505050565b60408051918252519081900360200190f35b3480156103b757600080fd5b506103cd600160e060020a031960043516610ff8565b604080519115158252519081900360200190f35b3480156103ed57600080fd5b5061033e600435600160a060020a03602435166001608060020a036044358116906064351667ffffffffffffffff608435166110c9565b34801561043057600080fd5b506104396110fe565b60408051600160a060020a039092168252519081900360200190f35b34801561046157600080fd5b5061046a61110d565b6040805160208082528351818301528351919283929083019185019080838360005b838110156104a457818101518382015260200161048c565b50505050905090810190601f1680156104d15780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156104eb57600080fd5b506104396004356111a4565b34801561050357600080fd5b5061033e600160a060020a03600435166024356111d6565b34801561052757600080fd5b506104396112b0565b34801561053c57600080fd5b506103cd6112bf565b34801561055157600080fd5b506103996112c4565b34801561056657600080fd5b5061057863ffffffff600435166112ca565b604080516001608060020a039092168252519081900360200190f35b3480156105a057600080fd5b506103cd6113ff565b3480156105b557600080fd5b5061033e600160a060020a0360043581169060243516604435611421565b3480156105df57600080fd5b5061033e600160a060020a03600435166114ff565b34801561060057600080fd5b5061033e600160a060020a036004351661154d565b34801561062157600080fd5b506040805160206004803580820135838102808601850190965280855261066a9536959394602494938501929182918501908490808284375094975061159b9650505050505050565b604051808261064080838360005b83811015610690578181015183820152602001610678565b5050505090500191505060405180910390f35b3480156106af57600080fd5b506106b86117ee565b6040805161ffff9092168252519081900360200190f35b3480156106db57600080fd5b506104396117f8565b3480156106f057600080fd5b50610399600160a060020a0360043516602435611807565b34801561071457600080fd5b50610720600435611881565b6040805163ffffffff958616815293909416602084015267ffffffffffffffff909116828401526001608060020a0316606082015290519081900360800190f35b34801561076d57600080fd5b5061033e6004356001608060020a03602435166118d9565b34801561079157600080fd5b50610399611a53565b3480156107a657600080fd5b5061033e600160a060020a0360043581169060243581169060443581169060643516611a59565b3480156107d957600080fd5b5061033e600435602435604435606435611b14565b3480156107fa57600080fd5b5061033e6004356001608060020a0360243516600160a060020a0360443581169060643516611bf6565b34801561083057600080fd5b5061033e611d52565b34801561084557600080fd5b5061033e600160a060020a0360043516611dcf565b61033e600160a060020a0360043581169060243516604435611ebf565b34801561088357600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261033e9436949293602493928401919081908401838280828437509497506120189650505050505050565b3480156108dc57600080fd5b506104396004356123da565b3480156108f457600080fd5b5061033e600160a060020a03600435166123f5565b34801561091557600080fd5b5061033e600160a060020a0360043516612443565b34801561093657600080fd5b5061033e63ffffffff60043516602435604435606435612491565b34801561095d57600080fd5b5061039960043561275f565b34801561097557600080fd5b5061033e63ffffffff6004358116906001608060020a03602435169067ffffffffffffffff604435169060643516608435151560a4351515612779565b3480156109be57600080fd5b50604080516020600460443581810135838102808601850190965280855261033e958335600160a060020a0390811696602480359092169636969560649592949301928291850190849080828437509497506128969650505050505050565b348015610a2957600080fd5b506103cd6129a9565b348015610a3e57600080fd5b506103cd6129b9565b348015610a5357600080fd5b5061033e6129c9565b348015610a6857600080fd5b5060408051602060046024803582810135848102808701860190975280865261033e968435600160a060020a031696369660449591949091019291829185019084908082843750949750612a1d9650505050505050565b348015610acb57600080fd5b50610439600435612b2b565b348015610ae357600080fd5b50610439612b4f565b348015610af857600080fd5b50610439600435612b5e565b348015610b1057600080fd5b50610399600160a060020a0360043516612b79565b348015610b3157600080fd5b506106b8612b94565b348015610b4657600080fd5b5061033e600435600160a060020a0360243516612b9e565b348015610b6a57600080fd5b5061046a63ffffffff60043516612c96565b348015610b8857600080fd5b5061033e612eb9565b348015610b9d57600080fd5b506040805160206004803580820135601f8101849004840285018401909552848452610578943694929360249392840191908190840183828082843750949750612f4e9650505050505050565b348015610bf657600080fd5b5061033e613034565b348015610c0b57600080fd5b5061033e60246004803582810192908201359181358083019290820135916044359182019101356064356130b2565b348015610c4657600080fd5b5061046a6133b3565b348015610c5b57600080fd5b5061033e63ffffffff60043516613414565b348015610c7957600080fd5b5061033e600160a060020a036004351660243515156134c1565b348015610c9f57600080fd5b50610399613545565b348015610cb457600080fd5b506040805160206004803580820135838102808601850190965280855261033e953695939460249493850192918291850190849080828437509497505084359550505060208301359260400135915061354b9050565b348015610d1657600080fd5b5061043961396e565b348015610d2b57600080fd5b5061043961397d565b348015610d4057600080fd5b5061033e600160a060020a036004351661398c565b348015610d6157600080fd5b50610439613a41565b61033e600160a060020a0360048035821691602480359091169160443591606435908101910135613a50565b348015610da257600080fd5b5061072063ffffffff60043516613bb5565b348015610dc057600080fd5b50610439613c3d565b348015610dd557600080fd5b5061046a600435613c4c565b348015610ded57600080fd5b5061033e613d4c565b348015610e0257600080fd5b5061033e600160a060020a0360043581169060243581169060443516613db1565b348015610e2f57600080fd5b50610e47600160a060020a0360043516602435613de3565b6040805163ffffffff9092168252519081900360200190f35b348015610e6c57600080fd5b5061033e600160a060020a0360043516613e2b565b348015610e8d57600080fd5b5060408051602060046024803582810135848102808701860190975280865261033e968435600160a060020a031696369660449591949091019291829185019084908082843750949750613ef59650505050505050565b348015610ef057600080fd5b5061033e600160a060020a0360043516613fb7565b348015610f1157600080fd5b5061033e6004356024356001608060020a036044351661403a565b6000816040516020018082805190602001908083835b60208310610f615780518252601f199092019160209182019101610f42565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040526040518082805190602001908083835b60208310610fc45780518252601f199092019160209182019101610fa5565b5181516020939093036101000a6000190180199091169216919091179052604051920182900390912093505050505b919050565b6000600160e060020a031982167f01ffc9a700000000000000000000000000000000000000000000000000000000148061105b57507f5b5e139f00000000000000000000000000000000000000000000000000000000600160e060020a03198316145b8061108f57507f80ac58cd00000000000000000000000000000000000000000000000000000000600160e060020a03198316145b806110c357507f780e9d6300000000000000000000000000000000000000000000000000000000600160e060020a03198316145b92915050565b601454600160a060020a031615156110e057600080fd5b601454600160a060020a031633146110f757600080fd5b5050505050565b600454600160a060020a031681565b60118054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156111995780601f1061116e57610100808354040283529160200191611199565b820191906000526020600020905b81548152906001019060200180831161117c57829003601f168201915b505050505090505b90565b60006111af826140fb565b15156111ba57600080fd5b50600090815260086020526040902054600160a060020a031690565b60065460009060a060020a900460ff16156111f057600080fd5b6111f982612b2b565b9050600160a060020a03838116908216141561121457600080fd5b33600160a060020a038216148061125e5750600b600061123384612b2b565b600160a060020a031681526020808201929092526040908101600090812033825290925290205460ff165b151561126957600080fd5b6112738284614102565b6040518290600160a060020a0385169033907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590600090a4505050565b600354600160a060020a031681565b600190565b60105490565b6000806112d5614798565b60105463ffffffff8516106112e957600080fd5b6010805463ffffffff86169081106112fd57fe5b600091825260208220600e54910180546040805160e060020a63632f83eb02815263ffffffff909216600483015251919550600160a060020a039092169263632f83eb9260248082019360c093909283900390910190829087803b15801561136457600080fd5b505af1158015611378573d6000803e3d6000fd5b505050506040513d60c081101561138e57600080fd5b50805160208083015160408085015160608087015160808089015160a0998a01511515998b01999099529715159789019790975263ffffffff9096169587019590955267ffffffffffffffff909416938501939093526001608060020a039283169084015216908190529392505050565b6006547501000000000000000000000000000000000000000000900460ff1681565b60065460a060020a900460ff161561143857600080fd5b600160a060020a038216151561144d57600080fd5b611456816140fb565b151561146157600080fd5b61146b8282614130565b151561147657600080fd5b6114808382614150565b151561148b57600080fd5b6114953382614150565b806114b65750600081815260086020526040902054600160a060020a031633145b806114e45750600160a060020a0383166000908152600b6020908152604080832033845290915290205460ff165b15156114ef57600080fd5b6114fa838383614170565b505050565b600354600160a060020a0316331461151657600080fd5b600160a060020a038116151561152b57600080fd5b60038054600160a060020a031916600160a060020a0392909216919091179055565b600354600160a060020a0316331461156457600080fd5b600160a060020a038116151561157957600080fd5b60058054600160a060020a031916600160a060020a0392909216919091179055565b6115a36147d6565b6115ab6147d6565b60008060006115b8614798565b600654600160a060020a031633146115cf57600080fd5b8651603210156115de57600080fd5b600093505b86518463ffffffff1610156117e357868463ffffffff1681518110151561160657fe5b6020908102909101810151600e546040805160e160020a6375145d770281526001608060020a03841660048201529051929650600160a060020a039091169263ea28baee926024808401938290030181600087803b15801561166757600080fd5b505af115801561167b573d6000803e3d6000fd5b505050506040513d602081101561169157600080fd5b505191506001608060020a0380831614156116ab576117d8565b600e546040805160e060020a63632f83eb0281526001608060020a03851660048201529051600160a060020a039092169163632f83eb9160248082019260c0929091908290030181600087803b15801561170457600080fd5b505af1158015611718573d6000803e3d6000fd5b505050506040513d60c081101561172e57600080fd5b50805160208083015160408085015160608087015160808089015160a0998a01511515998b01999099529715159789019790975263ffffffff9096169587019590955267ffffffffffffffff909416938501939093526001608060020a03928316908401528116808352908416146117a5576117d8565b6117b2816020015161421a565b8563ffffffff8616603281106117c457fe5b6001608060020a0390921660209290920201525b6001909301926115e3565b509295945050505050565b600c5461ffff1681565b600654600160a060020a031681565b6000600160a060020a038316151561181e57600080fd5b61182783612b79565b821061183257600080fd5b600160a060020a038316600090815260096020526040902080548390811061185657fe5b6000918252602090912060088204015460079091166004026101000a900463ffffffff169392505050565b601080548290811061188f57fe5b60009182526020909120015463ffffffff80821692506401000000008204169068010000000000000000810467ffffffffffffffff1690608060020a90046001608060020a031684565b600654600090600160a060020a031633146118f357600080fd5b600c54600061ffff9091161161190857600080fd5b6000838152600d60205260409020546001608060020a03161561192a57600080fd5b600e546040805160e160020a6375145d770281526001608060020a03851660048201529051600160a060020a039092169163ea28baee916024808201926020929091908290030181600087803b15801561198357600080fd5b505af1158015611997573d6000803e3d6000fd5b505050506040513d60208110156119ad57600080fd5b505190506001608060020a0380821614156119c757600080fd5b600c805461ffff19811661ffff918216600019019091161790556000838152600d602090815260409182902080546fffffffffffffffffffffffffffffffff19166001608060020a03861690811790915582518681529182015281517fac5613cd90c9b419cafa2ae0a50e724f1ec5ee58680ba98df619f9d6199c1138929181900390910190a1505050565b60025481565b600354600160a060020a03163314611a7057600080fd5b600160a060020a0384161515611a8557600080fd5b600160a060020a0383161515611a9a57600080fd5b600160a060020a0382161515611aaf57600080fd5b600160a060020a0381161515611ac457600080fd5b60038054600160a060020a03958616600160a060020a0319918216179091556004805494861694821694909417909355600580549285169284169290921790915560068054919093169116179055565b60065460a060020a900460ff1615611b2b57600080fd5b611b353385614150565b1515611b4057600080fd5b601454611b57908590600160a060020a0316614102565b601454604080517f27ebe40a000000000000000000000000000000000000000000000000000000008152600481018790526024810186905260448101859052606481018490523360848201529051600160a060020a03909216916327ebe40a9160a48082019260009290919082900301818387803b158015611bd857600080fd5b505af1158015611bec573d6000803e3d6000fd5b5050505050505050565b601454600090600160a060020a03161515611c1057600080fd5b601454600160a060020a03163314611c2757600080fd5b6010805486908110611c3557fe5b600091825260209091200180546001608060020a03808716608060020a0291161781559050600160a060020a0383163014156110f757600e5460108054600160a060020a03909216916313e8360d919088908110611c8f57fe5b60009182526020822001546040805163ffffffff85811660e060020a02825290921660048301526001608060020a0389166024830152516044808301939282900301818387803b158015611ce257600080fd5b505af1158015611cf6573d6000803e3d6000fd5b5050604080518881526001608060020a0388166020820152600160a060020a0386168183015290517f2c828d5a092351b455bd3fb7415c4c54d05c22862126f1dd525a7aaa6ef144a69350908190036060019150a15050505050565b600354600160a060020a03163314611d6957600080fd5b60065460a060020a900460ff161515611d8157600080fd5b600e54600160a060020a03161515611d9857600080fd5b601454600160a060020a03161515611daf57600080fd5b601554600160a060020a031615611dc557600080fd5b611dcd614264565b565b600354600090600160a060020a03163314611de957600080fd5b6006547501000000000000000000000000000000000000000000900460ff161515611e2457600e54600160a060020a031615611e2457600080fd5b81905080600160a060020a03166319d375f16040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015611e6557600080fd5b505af1158015611e79573d6000803e3d6000fd5b505050506040513d6020811015611e8f57600080fd5b50511515611e9c57600080fd5b600e8054600160a060020a031916600160a060020a039290921691909117905550565b600080600160a060020a0384161515611ed757600080fd5b611ee2858585611421565b611eeb846142b3565b156110f757604080517f150b7a02000000000000000000000000000000000000000000000000000000008152336004820152600160a060020a038781166024830152604482018690526080606483015260006084830181905292518795509085169263150b7a029261c3509260c48083019360209383900390910190829088803b158015611f7857600080fd5b5087f1158015611f8c573d6000803e3d6000fd5b50505050506040513d6020811015611fa357600080fd5b5051604080517f6f6e455243373231526563656976656428616464726573732c75696e7432353681527f2c6279746573290000000000000000000000000000000000000000000000000060208201529051908190036027019020909150600160e060020a03198083169116146110f757600080fd5b6000806000612025614798565b846040516020018082805190602001908083835b602083106120585780518252601f199092019160209182019101612039565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040526040518082805190602001908083835b602083106120bb5780518252601f19909201916020918201910161209c565b51815160209384036101000a600019018019909216911617905260408051929094018290039091206000818152600d90925292902054919750506001608060020a0316945050831590506110f7576000848152600d6020908152604080832080546fffffffffffffffffffffffffffffffff19169055600e54815160e160020a6375145d770281526001608060020a03881660048201529151600160a060020a039091169363ea28baee93602480850194919392918390030190829087803b15801561218657600080fd5b505af115801561219a573d6000803e3d6000fd5b505050506040513d60208110156121b057600080fd5b505191506001608060020a03808316146110f757600e546040805160e060020a63632f83eb0281526001608060020a03851660048201529051600160a060020a039092169163632f83eb9160248082019260c0929091908290030181600087803b15801561221d57600080fd5b505af1158015612231573d6000803e3d6000fd5b505050506040513d60c081101561224757600080fd5b50805160208083015160408085015160608087015160808089015160a0998a01511515998b01999099529715159789019790975263ffffffff90961695870186905267ffffffffffffffff16908601526001608060020a03908116918501919091521682526122b8908390336142bb565b50600e5460208201516060830151608084015160a0850151604080517f5436717900000000000000000000000000000000000000000000000000000000815263ffffffff89811660048301526001608060020a0390961660248201524267ffffffffffffffff166044820152600190940190941660648401529015156084830152151560a48201529051600160a060020a039092169163543671799160c48082019260009290919082900301818387803b15801561237557600080fd5b505af1158015612389573d6000803e3d6000fd5b50508251604080518881526001608060020a03909216602083015280513394507fda16be24a464fba0949b7f7459d1effe21067107b44fe43a1cd76882e6cf10f79350918290030190a25050505050565b600860205260009081526040902054600160a060020a031681565b600354600160a060020a0316331461240c57600080fd5b600160a060020a038116151561242157600080fd5b60048054600160a060020a031916600160a060020a0392909216919091179055565b600354600160a060020a0316331461245a57600080fd5b600160a060020a038116151561246f57600080fd5b60068054600160a060020a031916600160a060020a0392909216919091179055565b6124996147f6565b6124a1614798565b60065460009060a060020a900460ff16156124bb57600080fd5b600654600160a060020a031633146124d257600080fd5b600e54600160a060020a031615156124e957600080fd5b60105463ffffffff8816106124fd57600080fd5b61250d308863ffffffff16614150565b151561251857600080fd5b6010805463ffffffff891690811061252c57fe5b6000918252602080832060408051608081018252939091015463ffffffff80821680865264010000000083049091169385019390935268010000000000000000810467ffffffffffffffff1684830152608060020a90046001608060020a03166060840152600e54815160e060020a63632f83eb02815260048101939093529051929650600160a060020a03169263632f83eb9260248084019360c0939083900390910190829087803b1580156125e257600080fd5b505af11580156125f6573d6000803e3d6000fd5b505050506040513d60c081101561260c57600080fd5b50805160208083015160408085015160608087015160808089015160a0998a01511515998c0199909952971515978a019790975263ffffffff9096169588019590955267ffffffffffffffff909416938601939093526001608060020a03928316908501819052911683526126809061421a565b90508086101561268e578095505b83151561269b5760025493505b6014546126b89063ffffffff891690600160a060020a0316614102565b601454604080517f27ebe40a00000000000000000000000000000000000000000000000000000000815263ffffffff8a1660048201526024810189905260448101889052606481018790523060848201529051600160a060020a03909216916327ebe40a9160a48082019260009290919082900301818387803b15801561273e57600080fd5b505af1158015612752573d6000803e3d6000fd5b5050505050505050505050565b600061276a826140fb565b151561277557600080fd5b5090565b600354600160a060020a0316331461279057600080fd5b6006547501000000000000000000000000000000000000000000900460ff1615156001146127bd57600080fd5b600e54600160a060020a031615156127d457600080fd5b600e54604080517f5436717900000000000000000000000000000000000000000000000000000000815263ffffffff808a1660048301526001608060020a038916602483015267ffffffffffffffff8816604483015286166064820152841515608482015283151560a48201529051600160a060020a039092169163543671799160c48082019260009290919082900301818387803b15801561287657600080fd5b505af115801561288a573d6000803e3d6000fd5b50505050505050505050565b600654600090819060a060020a900460ff16156128b257600080fd5b600091505b82518263ffffffff1610156110f757828263ffffffff168151811015156128da57fe5b9060200190602002015190506128f6848263ffffffff16614130565b151561290157600080fd5b612911858263ffffffff16614150565b151561291c57600080fd5b61292c338263ffffffff16614150565b80612954575063ffffffff8116600090815260086020526040902054600160a060020a031633145b806129825750600160a060020a0385166000908152600b6020908152604080832033845290915290205460ff165b151561298d57600080fd5b61299e85858363ffffffff16614170565b6001909101906128b7565b60065460a060020a900460ff1681565b60145460a060020a900460ff1681565b600454600160a060020a031633146129e057600080fd5b600454604051600160a060020a0390911690303180156108fc02916000818181858888f19350505050158015612a1a573d6000803e3d6000fd5b50565b600654600090819060a060020a900460ff1615612a3957600080fd5b600091505b82518263ffffffff161015612b2557828263ffffffff16815181101515612a6157fe5b906020019060200201519050612a7d338263ffffffff16614150565b80612ac15750600b6000612a968363ffffffff16612b2b565b600160a060020a031681526020808201929092526040908101600090812033825290925290205460ff165b1515612acc57600080fd5b612adc8163ffffffff1685614102565b60405163ffffffff821690600160a060020a0386169033907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590600090a4600190910190612a3e565b50505050565b600081815260076020526040902054600160a060020a0316801515610ff357600080fd5b601554600160a060020a031681565b600760205260009081526040902054600160a060020a031681565b600160a060020a031660009081526009602052604090205490565b60005461ffff1681565b601454600160a060020a03161515612bb557600080fd5b601454600160a060020a03163314612bcc57600080fd5b600160a060020a038116301415612c9257600e5460108054600160a060020a0390921691638b52463a919085908110612c0157fe5b60009182526020822001546040805163ffffffff85811660e060020a0282529092166004830152516024808301939282900301818387803b158015612c4557600080fd5b505af1158015612c59573d6000803e3d6000fd5b50506040805185815290517f21ba71a6e82e1270ffb5b0c8f5b92134ed3c0444b338bc5b82e1e26352f2d2499350908190036020019150a15b5050565b60606000612ca2614798565b60105463ffffffff851610612cb657600080fd5b6010805463ffffffff8616908110612cca57fe5b600091825260208220600e54910180546040805160e060020a63632f83eb02815263ffffffff909216600483015251919550600160a060020a039092169263632f83eb9260248082019360c093909283900390910190829087803b158015612d3157600080fd5b505af1158015612d45573d6000803e3d6000fd5b505050506040513d60c0811015612d5b57600080fd5b50805160208083015160408085015160608087015160808089015160a0998a01511515998b01999099529715159789019790975263ffffffff9096169587019590955267ffffffffffffffff909416858501526001608060020a039081169185019190915216808352600e5482517f390209c100000000000000000000000000000000000000000000000000000000815260048101929092529151600160a060020a039092169163390209c19160248082019260009290919082900301818387803b158015612e2957600080fd5b505af1158015612e3d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015612e6657600080fd5b810190808051640100000000811115612e7e57600080fd5b82016020810184811115612e9157600080fd5b8151640100000000811182820187101715612eab57600080fd5b509098975050505050505050565b600554600160a060020a0316331480612edc5750600354600160a060020a031633145b80612ef15750600454600160a060020a031633145b80612f065750600654600160a060020a031633145b1515612f1157600080fd5b60065460a060020a900460ff1615612f2857600080fd5b6006805474ff0000000000000000000000000000000000000000191660a060020a179055565b6000806000836040516020018082805190602001908083835b60208310612f865780518252601f199092019160209182019101612f67565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040526040518082805190602001908083835b60208310612fe95780518252601f199092019160209182019101612fca565b51815160209384036101000a600019018019909216911617905260408051929094018290039091206000908152600d90915291909120546001608060020a0316979650505050505050565b600554600160a060020a0316331461304b57600080fd5b601460009054906101000a9004600160a060020a0316600160a060020a0316635fd8c7106040518163ffffffff1660e060020a028152600401600060405180830381600087803b15801561309e57600080fd5b505af1158015612b25573d6000803e3d6000fd5b6000806130bd6147f6565b6130c5614798565b600654600090600160a060020a031633146130df57600080fd5b600094505b63ffffffff85168b11156132aa578b8b63ffffffff871681811061310457fe5b90506020020135935060108463ffffffff1681548110151561312257fe5b6000918252602080832060408051608081018252939091015463ffffffff80821680865264010000000083049091169385019390935268010000000000000000810467ffffffffffffffff1684830152608060020a90046001608060020a03166060840152600e54815160e060020a63632f83eb02815260048101939093529051929650600160a060020a03169263632f83eb9260248084019360c0939083900390910190829087803b1580156131d857600080fd5b505af11580156131ec573d6000803e3d6000fd5b505050506040513d60c081101561320257600080fd5b50805160208083015160408085015160608087015160808089015160a0998a01511515998c0199909952971515978a019790975263ffffffff9096169588019590955267ffffffffffffffff909416938601939093526001608060020a03928316908501819052911683526132769061421a565b9050808a8a63ffffffff881681811061328b57fe5b905060200201351015151561329f57600080fd5b6001909401936130e4565b601460009054906101000a9004600160a060020a0316600160a060020a0316639decde198d8d8d8d8d8d8d306040518963ffffffff1660e060020a0281526004018080602001806020018060200186815260200185600160a060020a0316600160a060020a0316815260200184810384528c8c8281815260200192506020028082843790910185810384528a8152602090810191508b908b0280828437909101858103835288815260209081019150899089028082843782019150509b505050505050505050505050600060405180830381600087803b15801561338d57600080fd5b505af11580156133a1573d6000803e3d6000fd5b50505050505050505050505050505050565b60128054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156111995780601f1061116e57610100808354040283529160200191611199565b600654600160a060020a0316331461342b57600080fd5b601454600160a060020a0316151561344257600080fd5b601454604080517f96b5a75500000000000000000000000000000000000000000000000000000000815263ffffffff841660048201529051600160a060020a03909216916396b5a7559160248082019260009290919082900301818387803b1580156134ad57600080fd5b505af11580156110f7573d6000803e3d6000fd5b600160a060020a0382163314156134d757600080fd5b336000818152600b60209081526040808320600160a060020a03871680855290835292819020805460ff1916861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b60015481565b6000806000613558614798565b600e546000908190600160a060020a0316151561357457600080fd5b601454600160a060020a0316151561358b57600080fd5b600654600160a060020a03163314806135ae5750600e54600160a060020a031633145b15156135b957600080fd5b600095505b89518663ffffffff16101561288a57898663ffffffff168151811015156135e157fe5b6020908102909101810151600e546040805160e160020a6375145d770281526001608060020a03841660048201529051929850600160a060020a039091169263ea28baee926024808401938290030181600087803b15801561364257600080fd5b505af1158015613656573d6000803e3d6000fd5b505050506040513d602081101561366c57600080fd5b505193506001608060020a03808516141561368657613963565b600e546040805160e060020a63632f83eb0281526001608060020a03871660048201529051600160a060020a039092169163632f83eb9160248082019260c0929091908290030181600087803b1580156136df57600080fd5b505af11580156136f3573d6000803e3d6000fd5b505050506040513d60c081101561370957600080fd5b50805160208083015160408085015160608087015160808089015160a0998a01511515998d0199909952971515978b019790975263ffffffff9096169589019590955267ffffffffffffffff909416938701939093526001608060020a039283169086015281168085529086161461378057613963565b8260a00151151561379057613963565b82608001511561379f57613963565b6137ac836020015161421a565b9150818910156137ba578198505b6137c9848460600151306142bb565b6014549091506137e99063ffffffff831690600160a060020a0316614102565b8615156137f65760025496505b601454604080517f27ebe40a00000000000000000000000000000000000000000000000000000000815263ffffffff84166004820152602481018c9052604481018b9052606481018a90523060848201529051600160a060020a03909216916327ebe40a9160a48082019260009290919082900301818387803b15801561387c57600080fd5b505af1158015613890573d6000803e3d6000fd5b5050600e546020860151606087015160a0880151604080517f5436717900000000000000000000000000000000000000000000000000000000815263ffffffff8c811660048301526001608060020a0390951660248201524267ffffffffffffffff166044820152600193840190941660648501526084840192909252151560a483015251600160a060020a0390921693506354367179925060c48082019260009290919082900301818387803b15801561394a57600080fd5b505af115801561395e573d6000803e3d6000fd5b505050505b6001909501946135be565b600554600160a060020a031681565b600e54600160a060020a031681565b600354600090600160a060020a031633146139a657600080fd5b81905080600160a060020a0316637d58dbb46040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156139e757600080fd5b505af11580156139fb573d6000803e3d6000fd5b505050506040513d6020811015613a1157600080fd5b50511515613a1e57600080fd5b600f8054600160a060020a031916600160a060020a039290921691909117905550565b600f54600160a060020a031681565b600080613a5e878787611421565b613a67866142b3565b15613bac576040517f150b7a020000000000000000000000000000000000000000000000000000000081523360048201818152600160a060020a038a8116602485015260448401899052608060648501908152608485018890528a96509086169363150b7a029361c3509390928d928c928c928c9260a40184848082843782019150509650505050505050602060405180830381600088803b158015613b0c57600080fd5b5087f1158015613b20573d6000803e3d6000fd5b50505050506040513d6020811015613b3757600080fd5b5051604080517f6f6e455243373231526563656976656428616464726573732c75696e7432353681527f2c6279746573290000000000000000000000000000000000000000000000000060208201529051908190036027019020909150600160e060020a0319808316911614613bac57600080fd5b50505050505050565b60008060008060006010805490508663ffffffff16101515613bd657600080fd5b6010805463ffffffff8816908110613bea57fe5b60009182526020909120015463ffffffff808216986401000000008304909116975068010000000000000000820467ffffffffffffffff169650608060020a9091046001608060020a0316945092505050565b601454600160a060020a031681565b606080613c58836143f1565b90506013816040516020018083805460018160011615610100020316600290048015613cbb5780601f10613c99576101008083540402835291820191613cbb565b820191906000526020600020905b815481529060010190602001808311613ca7575b5050825160208401908083835b60208310613ce75780518252601f199092019160209182019101613cc8565b6001836020036101000a038019825116818451168082178552505050505050905001807f2f0000000000000000000000000000000000000000000000000000000000000081525060010192505050604051602081830303815290604052915050919050565b600354600160a060020a03163314613d6357600080fd5b6006547501000000000000000000000000000000000000000000900460ff161515600114613d9057600080fd5b6006805475ff00000000000000000000000000000000000000000019169055565b600354600160a060020a03163314613dc857600080fd5b613dd183611dcf565b613dda82613e2b565b6114fa8161398c565b600960205281600052604060002081815481101515613dfe57fe5b9060005260206000209060089182820401919006600402915091509054906101000a900463ffffffff1681565b600354600090600160a060020a03163314613e4557600080fd5b600160a060020a0382161515613e5a57600080fd5b81905080600160a060020a03166385b861886040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015613e9b57600080fd5b505af1158015613eaf573d6000803e3d6000fd5b505050506040513d6020811015613ec557600080fd5b50511515613ed257600080fd5b60148054600160a060020a031916600160a060020a039290921691909117905550565b600654600090819060a060020a900460ff1615613f1157600080fd5b600f54600160a060020a03161515613f2857600080fd5b600f54600160a060020a03163314613f3f57600080fd5b600091505b82518263ffffffff161015612b2557828263ffffffff16815181101515613f6757fe5b906020019060200201519050613f83848263ffffffff16614150565b1515613f8e57600080fd5b600f54613fac908590600160a060020a031663ffffffff8416614170565b600190910190613f44565b600354600160a060020a03163314613fce57600080fd5b60065460a060020a900460ff161515613fe657600080fd5b60158054600160a060020a038316600160a060020a0319909116811790915560408051918252517f450db8da6efbe9c22f2347f7c2021231df1fc58d3ae9a2fa75d39fa4461993059181900360200190a150565b600654600090600160a060020a0316331461405457600080fd5b506000838152600d60205260409020546001608060020a03168015612b25576000848152600d6020908152604080832080546fffffffffffffffffffffffffffffffff199081169091558684529281902080546001608060020a03871694168417905580518781529182018690528181019290925290517f45f1783956ce716709d857d37617b2f6a942f9eca570e9e903c7eec4befbf3329181900360600190a150505050565b6010541190565b6000918252600860205260409091208054600160a060020a031916600160a060020a03909216919091179055565b600090815260086020526040902054600160a060020a0391821691161490565b600090815260076020526040902054600160a060020a0391821691161490565b60008181526007602052604090208054600160a060020a031916600160a060020a03848116919091179091558316156141ca576141ad8382614410565b60008181526008602052604090208054600160a060020a03191690555b6141d4828261454e565b8082600160a060020a031684600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008060046001608060020a0384160483016001608060020a031690506001608060020a0381111561425057506001608060020a035b6001548110156110c3575060015492915050565b600354600160a060020a0316331461427b57600080fd5b60065460a060020a900460ff16151561429357600080fd5b6006805474ff000000000000000000000000000000000000000019169055565b6000903b1190565b60006142c56147f6565b600063ffffffff868116106142d957600080fd5b63ffffffff858116106142eb57600080fd5b50506040805160808101825263ffffffff80871682528581166020830190815267ffffffffffffffff42811694840194855260006060850181815260108054600181018255925285517f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae672830180549551985192516001608060020a03908116608060020a029390951668010000000000000000026fffffffffffffffff0000000000000000199988166401000000000267ffffffff000000001993891663ffffffff19909816979097179290921695909517979097169690961790911694909417905590919081106143dc57600080fd5b6143e860008583614170565b95945050505050565b606060006143fe836145c4565b90506144098161461d565b9392505050565b63ffffffff8082166000908152600a6020908152604080832054600160a060020a03871684526009909252822080549190931692600019820192918390811061445557fe5b60009182526020808320600883040154600160a060020a038916845260099091526040909220805460079092166004026101000a90920463ffffffff90811693508392919086169081106144a557fe5b90600052602060002090600891828204019190066004026101000a81548163ffffffff021916908363ffffffff1602179055506009600086600160a060020a0316600160a060020a03168152602001908152602001600020805480919060019003614510919061481d565b5063ffffffff9081166000908152600a6020526040808220805495841663ffffffff1996871617905594909116815292909220805490911690555050565b600160a060020a03909116600090815260096020908152604080832080546001810182559084528284206008820401805463ffffffff968716600460078516026101000a81810290890219909216919091179091558452600a90925290912080549290911663ffffffff19909216919091179055565b60008115156145f457507f3000000000000000000000000000000000000000000000000000000000000000610ff3565b6000821115610ff35761010081049050600a820660300160f860020a0217600a820491506145f4565b60408051602080825281830190925260609160009183918391829184919080820161040080388339019050509350600092505b60208310156146e6576008830260020a870291507fff000000000000000000000000000000000000000000000000000000000000008216156146d65781848481518110151561469b57fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506001909401936146db565b6146e6565b600190920191614650565b846040519080825280601f01601f191660200182016040528015614714578160200160208202803883390190505b509050600092505b8483101561478e57838381518110151561473257fe5b90602001015160f860020a900460f860020a02818481518110151561475357fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060019092019161471c565b9695505050505050565b6040805160e08101825260008082526020820181905291810182905260608082018390526080820183905260a082019290925260c081019190915290565b610640604051908101604052806032906020820280388339509192915050565b60408051608081018252600080825260208201819052918101829052606081019190915290565b8154818355818111156114fa576000838152602090206114fa916111a19160086007928301819004820192860104015b80821115612775576000815560010161484d5600a165627a7a723058207f843893d21ff1c0b8c8ceb8b84a4c1995365f30f82cd381686835129a8ef93b0029
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000002443727970746f53706f72747320466f6f7462616c6c2046616e746173792053706f72747300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000543534e464c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002d68747470733a2f2f6170692e63727970746f73706f7274733732312e636f6d2f6e666c2f746f6b656e7572692f00000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : nftName (string): CryptoSports Football Fantasy Sports
Arg [1] : nftSymbol (string): CSNFL
Arg [2] : nftTokenURI (string): https://api.cryptosports721.com/nfl/tokenuri/
-----Encoded View---------------
11 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000024
Arg [4] : 43727970746f53706f72747320466f6f7462616c6c2046616e74617379205370
Arg [5] : 6f72747300000000000000000000000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [7] : 43534e464c000000000000000000000000000000000000000000000000000000
Arg [8] : 000000000000000000000000000000000000000000000000000000000000002d
Arg [9] : 68747470733a2f2f6170692e63727970746f73706f7274733732312e636f6d2f
Arg [10] : 6e666c2f746f6b656e7572692f00000000000000000000000000000000000000
Swarm Source
bzzr://7f843893d21ff1c0b8c8ceb8b84a4c1995365f30f82cd381686835129a8ef93b
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.