ETH Price: $2,768.94 (+4.90%)

Token

CryptoSports Football Fantasy Sports (CSNFL)
 

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

Balance
2 CSNFL
0x79254095a33a150eced014a50cd5c01933cb2dd4
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# 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

Contract ABI

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

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.