Contract 0xafa2d5adb646dd90424f522ba8ee8cc118534c48

Contract Overview

Balance:
0 Ether
Txn Hash Method
Block
From
To
Value
0xa015f7c5c1fbfc4840871e2517020293d07c9565e3e57092bee67e3c06889301Set Approval For...41699012019-04-07 22:58:00799 days 4 hrs ago0xcc6ccadf4ed489688fec3d28c1df493fc160848b IN  0xafa2d5adb646dd90424f522ba8ee8cc118534c480 Ether0.000183124
0x42adcdd28b6dafdcdc13fd748453a10356a0aa271c91766d90383e5b73108b63Set Approval For...37233072019-01-20 10:02:43876 days 17 hrs ago0x0270b4c3334d189814d6b5eff5df2a877cf88c1c IN  0xafa2d5adb646dd90424f522ba8ee8cc118534c480 Ether0.000183124
0xd434fa414998586e04b8c9aa563fb0be96066c7ce5bec9e2a491cc8cc893af1fSet Approval For...31446242018-10-11 22:31:15977 days 4 hrs ago0x0239769a1adf4def9f07da824b80b9c4fcb59593 IN  0xafa2d5adb646dd90424f522ba8ee8cc118534c480 Ether0.000183124
0xbfd927de811384c6478f30db2d6d35975088ce48cd386e6d793e84c0472b10a4Set Approval For...30239892018-09-20 23:37:03998 days 3 hrs ago0x431e44389a003f0ec6e83b3578db5075a44ac523 IN  0xafa2d5adb646dd90424f522ba8ee8cc118534c480 Ether0.000183124
0x50f7adff5b8d89c21959e7dd7d787765e2bda417bbef90e12efc159195fc07c5Set Approval For...30074052018-09-18 2:30:591001 days 41 mins ago0x6be4a7bbb812bfa6a63126ee7b76c8a13529bdb8 IN  0xafa2d5adb646dd90424f522ba8ee8cc118534c480 Ether0.000320467
0xbd550c9f3c67b9a608eac3e8993fb736f905dea857e192a96be12945f439edd9Set Approval For...25196462018-06-24 18:26:161086 days 8 hrs ago0xe96a1b303a1eb8d04fb973eb2b291b8d591c8f72 IN  0xafa2d5adb646dd90424f522ba8ee8cc118534c480 Ether0.000045781
0x9923880615222beb3860a3f3077db39b8c6abe1da7f890386a07932d8ab8fe08Approve24152372018-06-06 15:23:541104 days 11 hrs ago0xe96a1b303a1eb8d04fb973eb2b291b8d591c8f72 IN  0xafa2d5adb646dd90424f522ba8ee8cc118534c480 Ether0.0000462581
0x4549ed5eee868048e85aa9aa9806b19bdf7fafb3695eefe3099175acc38dd6bbApprove22564612018-05-10 1:49:341132 days 1 hr ago0x1bcd7fc3aa5ea863d52a54827f21f42e1ac2ef47 IN  0xafa2d5adb646dd90424f522ba8ee8cc118534c480 Ether0.0001387743
0x30305b8422eeac031b7a6f5c9fe954535d917539380a50507a58d01f3f8605d2Approve21051952018-04-13 19:32:511158 days 7 hrs ago0x3dbce7daff19f3f3169a705341d513a69e3cc40a IN  0xafa2d5adb646dd90424f522ba8ee8cc118534c480 Ether0.0000462581
0xa75ca57ab43b335c97efc1f7b0673cddcd4a3c1988164f6a042152e1b5e09c2bSet Pack Sale Ad...20870532018-04-10 15:57:171161 days 11 hrs ago0x3dbce7daff19f3f3169a705341d513a69e3cc40a IN  0xafa2d5adb646dd90424f522ba8ee8cc118534c480 Ether0.0045917100
0x430c1316b7729806188b005555e01a07c92f0390b5e70c2cc3597d75d8dd34d00x6060604020870492018-04-10 15:56:171161 days 11 hrs ago0x3dbce7daff19f3f3169a705341d513a69e3cc40a IN  Contract Creation0 Ether0.2823998100
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x8888386f16cbf3562f56105fd2ec7c0129b0238cee10ed95007784ffd4fbf74a39265272019-02-24 16:49:50841 days 10 hrs ago 0xd464fb5c288c3756252b8f13dcc2ec1dc54aae59 0xafa2d5adb646dd90424f522ba8ee8cc118534c480 Ether
0xb3127277f46910291c0d23ba42893f878f29e1356ccf475d8a942f89ed06a16337233102019-01-20 10:03:28876 days 17 hrs ago 0xca3427060dde4bfccc7c59985ae673bf7e27c860 0xafa2d5adb646dd90424f522ba8ee8cc118534c480 Ether
0xfa7a5cc0c457f6951f9bcccf3e26134218799cc4441756cc35fdaf7e4a12c15a37232992019-01-20 10:00:43876 days 17 hrs ago 0x3a09e6d30b948082e42c91a459c02fe16ef1abfb 0xafa2d5adb646dd90424f522ba8ee8cc118534c480 Ether
0x139ee76b1aeff32c6fe7fc6b9eb86bce4ab00a921777dc9f91a8766964447eaa33994682018-11-25 4:37:22932 days 22 hrs ago 0x55f4925f280b0f010fbe3b2cd81d7cf28a9ce1fa 0xafa2d5adb646dd90424f522ba8ee8cc118534c480 Ether
0x78ace309f061599d7b0451b3b0509ea8b52b27668c765be74944f0097e90719e30241002018-09-21 0:04:48998 days 3 hrs ago 0x5160c13a9d34a018090f1bd42f5fc0ebf47bf46f 0xafa2d5adb646dd90424f522ba8ee8cc118534c480 Ether
0xa8c454c1aed0d17d43350d07e63187fe8df5d95d28914c4c0881ace92beeafe730171492018-09-19 19:07:00999 days 8 hrs ago 0x3a09e6d30b948082e42c91a459c02fe16ef1abfb 0xafa2d5adb646dd90424f522ba8ee8cc118534c480 Ether
0x1cc3689ce46c6ed49a379419a43d9871c47190653ac9cb7526a4efbbd0b939f130074152018-09-18 2:33:291001 days 38 mins ago 0x55f4925f280b0f010fbe3b2cd81d7cf28a9ce1fa 0xafa2d5adb646dd90424f522ba8ee8cc118534c480 Ether
0xcb5cf0f93abff4feef543ff5351cc27072347427ff5bdeb61752f90872dd071324152482018-06-06 15:26:391104 days 11 hrs ago 0xed6cfc67429e8eb9b4562ea6d7d54ffcc4b726bd 0xafa2d5adb646dd90424f522ba8ee8cc118534c480 Ether
0xda20730ecec317c71b5748ec049a3e9d5ec4f67bacd27609218578e3cd32563c24152372018-06-06 15:23:541104 days 11 hrs ago 0xed6cfc67429e8eb9b4562ea6d7d54ffcc4b726bd 0xafa2d5adb646dd90424f522ba8ee8cc118534c480 Ether
0xed0bdfd6311ee90f81d497b7db65059ae360feb14e22e79cefa728a7e56f677b24152292018-06-06 15:21:541104 days 11 hrs ago 0xed6cfc67429e8eb9b4562ea6d7d54ffcc4b726bd 0xafa2d5adb646dd90424f522ba8ee8cc118534c480 Ether
0x29b876dea50e1df9889f7b93e43ef3102855a194708ef0a2fbb6b36bd7444e4522564622018-05-10 1:49:491132 days 1 hr ago 0xed6cfc67429e8eb9b4562ea6d7d54ffcc4b726bd 0xafa2d5adb646dd90424f522ba8ee8cc118534c480 Ether
0x489360243efc22af37437f2972b028279c4acd81842d0e877f5d5485b840e16521886982018-04-28 7:28:491143 days 19 hrs ago 0xed6cfc67429e8eb9b4562ea6d7d54ffcc4b726bd 0xafa2d5adb646dd90424f522ba8ee8cc118534c480 Ether
0x5a9888cacde6d6ef9d1ab8db6eded74d56c916375512fed9eab73727be0553c821523942018-04-22 0:12:381150 days 2 hrs ago 0xa9f4c98bee45bf80af617baa2cc0c7341dc179ae 0xafa2d5adb646dd90424f522ba8ee8cc118534c480 Ether
0x5a9888cacde6d6ef9d1ab8db6eded74d56c916375512fed9eab73727be0553c821523942018-04-22 0:12:381150 days 2 hrs ago 0xa9f4c98bee45bf80af617baa2cc0c7341dc179ae 0xafa2d5adb646dd90424f522ba8ee8cc118534c480 Ether
0x5a9888cacde6d6ef9d1ab8db6eded74d56c916375512fed9eab73727be0553c821523942018-04-22 0:12:381150 days 2 hrs ago 0xa9f4c98bee45bf80af617baa2cc0c7341dc179ae 0xafa2d5adb646dd90424f522ba8ee8cc118534c480 Ether
0x5a9888cacde6d6ef9d1ab8db6eded74d56c916375512fed9eab73727be0553c821523942018-04-22 0:12:381150 days 2 hrs ago 0xa9f4c98bee45bf80af617baa2cc0c7341dc179ae 0xafa2d5adb646dd90424f522ba8ee8cc118534c480 Ether
0xefa3a836211ff1d9933a133ef84d74e9aea2eff49c85c58e11501c723fedeb8321523842018-04-22 0:10:081150 days 3 hrs ago 0xa9f4c98bee45bf80af617baa2cc0c7341dc179ae 0xafa2d5adb646dd90424f522ba8ee8cc118534c480 Ether
0xefa3a836211ff1d9933a133ef84d74e9aea2eff49c85c58e11501c723fedeb8321523842018-04-22 0:10:081150 days 3 hrs ago 0xa9f4c98bee45bf80af617baa2cc0c7341dc179ae 0xafa2d5adb646dd90424f522ba8ee8cc118534c480 Ether
0xefa3a836211ff1d9933a133ef84d74e9aea2eff49c85c58e11501c723fedeb8321523842018-04-22 0:10:081150 days 3 hrs ago 0xa9f4c98bee45bf80af617baa2cc0c7341dc179ae 0xafa2d5adb646dd90424f522ba8ee8cc118534c480 Ether
0xefa3a836211ff1d9933a133ef84d74e9aea2eff49c85c58e11501c723fedeb8321523842018-04-22 0:10:081150 days 3 hrs ago 0xa9f4c98bee45bf80af617baa2cc0c7341dc179ae 0xafa2d5adb646dd90424f522ba8ee8cc118534c480 Ether
0x075a1dbcbe63f163aae5e7c9c237c5cbff1fd673cb07be11afe511045bfcb39821449362018-04-20 17:08:081151 days 10 hrs ago 0xa9f4c98bee45bf80af617baa2cc0c7341dc179ae 0xafa2d5adb646dd90424f522ba8ee8cc118534c480 Ether
0x075a1dbcbe63f163aae5e7c9c237c5cbff1fd673cb07be11afe511045bfcb39821449362018-04-20 17:08:081151 days 10 hrs ago 0xa9f4c98bee45bf80af617baa2cc0c7341dc179ae 0xafa2d5adb646dd90424f522ba8ee8cc118534c480 Ether
0x075a1dbcbe63f163aae5e7c9c237c5cbff1fd673cb07be11afe511045bfcb39821449362018-04-20 17:08:081151 days 10 hrs ago 0xa9f4c98bee45bf80af617baa2cc0c7341dc179ae 0xafa2d5adb646dd90424f522ba8ee8cc118534c480 Ether
0x075a1dbcbe63f163aae5e7c9c237c5cbff1fd673cb07be11afe511045bfcb39821449362018-04-20 17:08:081151 days 10 hrs ago 0xa9f4c98bee45bf80af617baa2cc0c7341dc179ae 0xafa2d5adb646dd90424f522ba8ee8cc118534c480 Ether
0x96af664cee79fbd3bde0fdda24af5ed25dd991cfac08bf914a9ff6e1d6a7434521401912018-04-19 21:21:531152 days 5 hrs ago 0xa9f4c98bee45bf80af617baa2cc0c7341dc179ae 0xafa2d5adb646dd90424f522ba8ee8cc118534c480 Ether
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
StrikersMinting

Compiler Version
v0.4.21+commit.dfe3193c

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2018-04-10
*/

pragma solidity ^0.4.18;

/**
 * @title ERC721 Non-Fungible Token Standard basic interface
 * @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
 */
contract ERC721Basic {
  event Transfer(address indexed _from, address indexed _to, uint256 _tokenId);
  event Approval(address indexed _owner, address indexed _approved, uint256 _tokenId);
  event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);  

  function balanceOf(address _owner) public view returns (uint256 _balance);
  function ownerOf(uint256 _tokenId) public view returns (address _owner);
  function exists(uint256 _tokenId) public view returns (bool _exists);
  
  function approve(address _to, uint256 _tokenId) public;
  function getApproved(uint256 _tokenId) public view returns (address _operator);
  
  function setApprovalForAll(address _operator, bool _approved) public;
  function isApprovedForAll(address _owner, address _operator) public view returns (bool);

  function transferFrom(address _from, address _to, uint256 _tokenId) public;
  function safeTransferFrom(address _from, address _to, uint256 _tokenId) public;  
  function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes _data) public;
}



/**
 * @title Ownable
 * @dev The Ownable contract has an owner address, and provides basic authorization control
 * functions, this simplifies the implementation of "user permissions".
 */
contract Ownable {
  address public owner;


  event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);


  /**
   * @dev The Ownable constructor sets the original `owner` of the contract to the sender
   * account.
   */
  function Ownable() public {
    owner = msg.sender;
  }

  /**
   * @dev Throws if called by any account other than the owner.
   */
  modifier onlyOwner() {
    require(msg.sender == owner);
    _;
  }

  /**
   * @dev Allows the current owner to transfer control of the contract to a newOwner.
   * @param newOwner The address to transfer ownership to.
   */
  function transferOwnership(address newOwner) public onlyOwner {
    require(newOwner != address(0));
    OwnershipTransferred(owner, newOwner);
    owner = newOwner;
  }

}


contract OraclizeStringUtils {
  function strConcat(string _a, string _b) internal pure returns (string) {
    bytes memory _ba = bytes(_a);
    bytes memory _bb = bytes(_b);
    string memory ab = new string(_ba.length + _bb.length);
    bytes memory bab = bytes(ab);
    uint k = 0;
    for (uint i = 0; i < _ba.length; i++) bab[k++] = _ba[i];
    for (i = 0; i < _bb.length; i++) bab[k++] = _bb[i];
    return string(bab);
  }

  function uint2str(uint i) internal pure returns (string){
    if (i == 0) return "0";
    uint j = i;
    uint len;
    while (j != 0) {
      len++;
      j /= 10;
    }
    bytes memory bstr = new bytes(len);
    uint k = len - 1;
    while (i != 0) {
      bstr[k--] = byte(48 + i % 10);
      i /= 10;
    }
    return string(bstr);
  }
}










contract PackSaleState is Ownable {
  /// @dev Emit this event when the owner changes the contract state.
  event SaleStateChanged(SaleState state);

  /// @dev All the possible states of the PackSale
  enum SaleState {
    // We still have the possiblity of minting more runs.
    WaitingForNextRun,

    // Owner is in the process of loading packs into the contract
    LoadingPacks,

    // Done loading packs for this run, but not yet selling
    DoneLoadingPacks,

    // Sale is on!
    Selling,

    // For some reason, we had to pause the sale (TODO: maybe make this a public boolean? see Pausable)
    SalePaused,

    // We have sold out and will not be minting any more cards.
    SaleComplete
  }

  // @dev Sanity check that allows us to ensure that we are pointing to the
  //  right auction in our setSiringAuctionAddress() call.
  bool public isPackSale = true;

  /// @dev The contract's current state. Defaults to WaitingForNextRun (0)
  SaleState public state;

  /// @dev Modifier to make a function callable only when the contract is a given state.
  modifier requireState(SaleState _state) {
    require(state == _state);
    _;
  }

  /// @dev Modifier to make a function callable only when the contract is NOT a given state.
  modifier requireNotState(SaleState _state) {
    require(state != _state);
    _;
  }

  /// @dev Called by owner to change the contract's state
  function changeState(SaleState _state) public onlyOwner {
    state = _state;
    emit SaleStateChanged(state);
  }
}


/// @dev The contract that allows the contract owner to load shuffled packs of cards
contract PackFactory is PackSaleState {

  // The only way to buy Series 1 cards is in packs of 4.
  // NB: we generate and store the shuffled packs in advance but only actually mint the cards when a pack is sold (see PackSale contract).
  // To save on storage, we use uint32 to represent a pack, with each of the 4 groups of 8 bits representing a playerId (see WorldCupInfo contract).
  // For example:
  // Pack = 00011000000001100000001000010010
  // Card 1 = 00011000 = playerId 24
  // Card 2 = 00000110 = playerId 6
  // Card 3 = 00000010 = playerId 2
  // Card 4 = 00010010 = playerId 18

  event StartedMinting(uint8 runNumber);
  event FinishedMinting(uint8 runNumber);

  // The number of cards in a pack
  uint8 public constant PACK_SIZE = 4;

  // Sets a hard cap on the number of packs that will ever be minted
  uint32 public constant PACKS_MINTED_LIMIT = 200000;

  // Keeps track of the packs minted to make sure we don't go over the limit
  uint32 public totalPacksMinted;

  uint8 public currentRunNumber;

  mapping (uint8 => uint32) public packsMintedForRun;

  //mapping (uint8 => mapping (uint8 => uint16)) public playerCountForRun;

  // NOT public, but verifiable with an off-chain call
  uint32[] shuffledPacks;

  // All below is for Series 1 only
  function startNewRun() external onlyOwner requireState(SaleState.WaitingForNextRun) {
    currentRunNumber++;
    emit StartedMinting(currentRunNumber);
    changeState(SaleState.LoadingPacks);
  }

  function loadShuffledPacks(uint32[] _shuffledPacks) external onlyOwner requireState(SaleState.LoadingPacks) {
    uint32 newPackCount = uint32(_shuffledPacks.length);
    require(totalPacksMinted + newPackCount <= PACKS_MINTED_LIMIT);
    shuffledPacks = _shuffledPacks;
    totalPacksMinted += newPackCount;
    packsMintedForRun[currentRunNumber] += newPackCount;
  }

  function finishRun() external onlyOwner requireState(SaleState.LoadingPacks) {
    emit FinishedMinting(currentRunNumber);
    changeState(SaleState.DoneLoadingPacks);
  }

  // TODO: only to be called off-chain
  /*function playerCountForRun(uint8 _runId, uint8 _playerId) external view returns (uint) {
    playerCardsSoldForRun[_runId][_playerId] + left to be sold
  }*/
}


/// @dev We use the interface here (instead of importing StrikersMinting) to avoid circular imports
///   (StrikersMinting already imports PackSale to make sure only it can call mintSeries1Card)
contract StrikersMintingInterface {
  function mintSeries1Card(uint8 _playerId, uint8 _runId, uint16 _mintNumber, address _owner) external returns (uint256);
}

contract PackSale is PackFactory {
  event PackBought(address indexed buyer, uint256[] pack);
  event PackPriceChanged(uint256 packPrice);

  event SaleStarted(uint8 runNumber);
  event SalePaused(uint8 runNumber);
  event SaleFinished(uint8 runNumber);

  // Can be adjusted as needed
  uint256 public packPrice = 0.03 ether;

  mapping (uint8 => uint32) public packsSoldForRun;

  // actually maybe we don't want to expose this...
  mapping (uint8 => mapping (uint8 => uint16)) playerCardsSoldForRun;

  StrikersMintingInterface public strikersMinting;

  function PackSale(address _strikersMintingAddress) public {
    strikersMinting = StrikersMintingInterface(_strikersMintingAddress);
  }

  function setPackPrice(uint _packPrice) public onlyOwner requireNotState(SaleState.Selling) {
    packPrice = _packPrice;
    emit PackPriceChanged(packPrice);
  }

  function() external payable {
    buyPack();
  }

  function startSale() external onlyOwner requireState(SaleState.DoneLoadingPacks) {
    emit SaleStarted(currentRunNumber);
    changeState(SaleState.Selling);
  }

  function pauseSale() external onlyOwner requireState(SaleState.Selling) {
    emit SalePaused(currentRunNumber);
    changeState(SaleState.SalePaused);
  }

  // TODO: buyPack for someone else (giftPack?)
  function buyPack() public requireState(SaleState.Selling) {
    // TODO: require proper ether amount
    require(shuffledPacks.length > 0);
    uint32 pack = _removePackAtIndex(0);
    uint8 mask = 255;
    uint256[] memory newCards = new uint256[](PACK_SIZE);
    for (uint8 i = 1; i <= PACK_SIZE; i++) {
      uint8 shift = 32 - (i * 8);
      uint8 playerId = uint8((pack >> shift) & mask);
      // TODO: mintNumber
      uint256 cardId = strikersMinting.mintSeries1Card(playerId, currentRunNumber, 0, msg.sender);
      newCards[i-1] = cardId;
    }
    packsSoldForRun[currentRunNumber]++;
    emit PackBought(msg.sender, newCards);
  }

  function _removePackAtIndex(uint256 _index) internal returns (uint32) {
    uint256 lastIndex = shuffledPacks.length - 1;
    require(_index <= lastIndex);
    uint32 pack = shuffledPacks[_index];
    shuffledPacks[_index] = shuffledPacks[lastIndex];
    shuffledPacks.length--;
    return pack;
  }
}









/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
 */
contract ERC721Enumerable is ERC721Basic {
  function totalSupply() public view returns (uint256);
  function tokenOfOwnerByIndex(address _owner, uint256 _index) public view returns (uint256 _tokenId);
  function tokenByIndex(uint256 _index) public view returns (uint256);
}

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
 */
contract ERC721Metadata is ERC721Basic {
  function name() public view returns (string _name);
  function symbol() public view returns (string _symbol);
  function tokenURI(uint256 _tokenId) public view returns (string);
}

/**
 * @title ERC-721 Non-Fungible Token Standard, full implementation interface
 * @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
 */
contract ERC721 is ERC721Basic, ERC721Enumerable, ERC721Metadata {
}





/**
 * @title ERC-721 methods shipped in OpenZeppelin v1.7.0, removed in the latest version of the standard
 * @dev Only use this interface for compatibility with previously deployed contracts
 * @dev Use ERC721 for interacting with new contracts which are standard-compliant
 */
contract DeprecatedERC721 is ERC721 {
  function takeOwnership(uint256 _tokenId) public;
  function transfer(address _to, uint256 _tokenId) public;
  function tokensOf(address _owner) public view returns (uint256[]);
}







/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 *  from ERC721 asset contracts.
 */
contract ERC721Receiver {
  /**
   * @dev Magic value to be returned upon successful reception of an NFT
   *  Equals to `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`,
   *  which can be also obtained as `ERC721Receiver(0).onERC721Received.selector`
   */
  bytes4 constant ERC721_RECEIVED = 0xf0b9e5ba; 

  /**
   * @notice Handle the receipt of an NFT
   * @dev The ERC721 smart contract calls this function on the recipient
   *  after a `safetransfer`. This function MAY throw to revert and reject the
   *  transfer. This function MUST use 50,000 gas or less. Return of other
   *  than the magic value MUST result in the transaction being reverted.
   *  Note: the contract address is always the message sender.
   * @param _from The sending address 
   * @param _tokenId The NFT identifier which is being transfered
   * @param _data Additional data with no specified format
   * @return `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`
   */
  function onERC721Received(address _from, uint256 _tokenId, bytes _data) public returns(bytes4);
}




/**
 * @title SafeMath
 * @dev Math operations with safety checks that throw on error
 */
library SafeMath {

  /**
  * @dev Multiplies two numbers, throws on overflow.
  */
  function mul(uint256 a, uint256 b) internal pure returns (uint256) {
    if (a == 0) {
      return 0;
    }
    uint256 c = a * b;
    assert(c / a == b);
    return c;
  }

  /**
  * @dev Integer division of two numbers, truncating the quotient.
  */
  function div(uint256 a, uint256 b) internal pure returns (uint256) {
    // assert(b > 0); // Solidity automatically throws when dividing by 0
    uint256 c = a / b;
    // assert(a == b * c + a % b); // There is no case in which this doesn't hold
    return c;
  }

  /**
  * @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
  */
  function sub(uint256 a, uint256 b) internal pure returns (uint256) {
    assert(b <= a);
    return a - b;
  }

  /**
  * @dev Adds two numbers, throws on overflow.
  */
  function add(uint256 a, uint256 b) internal pure returns (uint256) {
    uint256 c = a + b;
    assert(c >= a);
    return c;
  }
}



/**
 * Utility library of inline functions on addresses
 */
library AddressUtils {

  /**
   * Returns whether there is code in the target address
   * @dev This function will return false if invoked during the constructor of a contract,
   *  as the code is not actually created until after the constructor finishes.
   * @param addr address address to check
   * @return whether there is code in the target address
   */
  function isContract(address addr) internal view returns (bool) {
    uint256 size;
    assembly { size := extcodesize(addr) }
    return size > 0;
  }

}


/**
 * @title ERC721 Non-Fungible Token Standard basic implementation
 * @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
 */
contract ERC721BasicToken is ERC721Basic {
  using SafeMath for uint256;
  using AddressUtils for address;
  
  // Equals to `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`
  // which can be also obtained as `ERC721Receiver(0).onERC721Received.selector`
  bytes4 constant ERC721_RECEIVED = 0xf0b9e5ba; 

  // Mapping from token ID to owner
  mapping (uint256 => address) internal tokenOwner;

  // Mapping from token ID to approved address
  mapping (uint256 => address) internal tokenApprovals;

  // Mapping from owner to number of owned token
  mapping (address => uint256) internal ownedTokensCount;

  // Mapping from owner to operator approvals
  mapping (address => mapping (address => bool)) internal operatorApprovals;

  /**
  * @dev Guarantees msg.sender is owner of the given token
  * @param _tokenId uint256 ID of the token to validate its ownership belongs to msg.sender
  */
  modifier onlyOwnerOf(uint256 _tokenId) {
    require(ownerOf(_tokenId) == msg.sender);
    _;
  }

  /**
  * @dev Checks msg.sender can transfer a token, by being owner, approved, or operator
  * @param _tokenId uint256 ID of the token to validate
  */
  modifier canTransfer(uint256 _tokenId) {
    require(isApprovedOrOwner(msg.sender, _tokenId));
    _;
  }

  /**
  * @dev Gets the balance of the specified address
  * @param _owner address to query the balance of
  * @return uint256 representing the amount owned by the passed address
  */
  function balanceOf(address _owner) public view returns (uint256) {
    require(_owner != address(0));
    return ownedTokensCount[_owner];
  }

  /**
  * @dev Gets the owner of the specified token ID
  * @param _tokenId uint256 ID of the token to query the owner of
  * @return owner address currently marked as the owner of the given token ID
  */
  function ownerOf(uint256 _tokenId) public view returns (address) {
    address owner = tokenOwner[_tokenId];
    require(owner != address(0));
    return owner;
  }

  /**
  * @dev Returns whether the specified token exists
  * @param _tokenId uint256 ID of the token to query the existance of
  * @return whether the token exists
  */
  function exists(uint256 _tokenId) public view returns (bool) {
    address owner = tokenOwner[_tokenId];
    return owner != address(0);
  }

  /**
  * @dev Approves another address to transfer the given token ID
  * @dev The zero address indicates there is no approved address.
  * @dev There can only be one approved address per token at a given time.
  * @dev Can only be called by the token owner or an approved operator.
  * @param _to address to be approved for the given token ID
  * @param _tokenId uint256 ID of the token to be approved
  */
  function approve(address _to, uint256 _tokenId) public {
    address owner = ownerOf(_tokenId);
    require(_to != owner);
    require(msg.sender == owner || isApprovedForAll(owner, msg.sender));

    if (getApproved(_tokenId) != address(0) || _to != address(0)) {
      tokenApprovals[_tokenId] = _to;
      Approval(owner, _to, _tokenId);
    }
  }

  /**
   * @dev Gets the approved address for a token ID, or zero if no address set
   * @param _tokenId uint256 ID of the token to query the approval of
   * @return address currently approved for a the given token ID
   */
  function getApproved(uint256 _tokenId) public view returns (address) {
    return tokenApprovals[_tokenId];
  }


  /**
  * @dev Sets or unsets the approval of a given operator
  * @dev An operator is allowed to transfer all tokens of the sender on their behalf
  * @param _to operator address to set the approval
  * @param _approved representing the status of the approval to be set
  */
  function setApprovalForAll(address _to, bool _approved) public {
    require(_to != msg.sender);
    operatorApprovals[msg.sender][_to] = _approved;
    ApprovalForAll(msg.sender, _to, _approved);
  }

  /**
   * @dev Tells whether an operator is approved by a given owner
   * @param _owner owner address which you want to query the approval of
   * @param _operator operator address which you want to query the approval of
   * @return bool whether the given operator is approved by the given owner
   */
  function isApprovedForAll(address _owner, address _operator) public view returns (bool) {
    return operatorApprovals[_owner][_operator];
  }

  /**
  * @dev Transfers the ownership of a given token ID to another address
  * @dev Usage of this method is discouraged, use `safeTransferFrom` whenever possible
  * @dev Requires the msg sender to be the owner, approved, or operator
  * @param _from current owner of the token
  * @param _to address to receive the ownership of the given token ID
  * @param _tokenId uint256 ID of the token to be transferred
  */
  function transferFrom(address _from, address _to, uint256 _tokenId) public canTransfer(_tokenId) {
    require(_from != address(0));
    require(_to != address(0));

    clearApproval(_from, _tokenId);
    removeTokenFrom(_from, _tokenId);
    addTokenTo(_to, _tokenId);
    
    Transfer(_from, _to, _tokenId);
  }

  /**
  * @dev Safely transfers the ownership of a given token ID to another address
  * @dev If the target address is a contract, it must implement `onERC721Received`,
  *  which is called upon a safe transfer, and return the magic value
  *  `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`; otherwise,
  *  the transfer is reverted.
  * @dev Requires the msg sender to be the owner, approved, or operator
  * @param _from current owner of the token
  * @param _to address to receive the ownership of the given token ID
  * @param _tokenId uint256 ID of the token to be transferred
  */
  function safeTransferFrom(address _from, address _to, uint256 _tokenId) public canTransfer(_tokenId) {
    safeTransferFrom(_from, _to, _tokenId, "");
  }

  /**
  * @dev Safely transfers the ownership of a given token ID to another address
  * @dev If the target address is a contract, it must implement `onERC721Received`,
  *  which is called upon a safe transfer, and return the magic value
  *  `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`; otherwise,
  *  the transfer is reverted.
  * @dev Requires the msg sender to be the owner, approved, or operator
  * @param _from current owner of the token
  * @param _to address to receive the ownership of the given token ID
  * @param _tokenId uint256 ID of the token to be transferred
  * @param _data bytes data to send along with a safe transfer check
  */
  function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes _data) public canTransfer(_tokenId) {
    transferFrom(_from, _to, _tokenId);
    require(checkAndCallSafeTransfer(_from, _to, _tokenId, _data));
  }

  /**
   * @dev Returns whether the given spender can transfer a given token ID
   * @param _spender address of the spender to query
   * @param _tokenId uint256 ID of the token to be transferred
   * @return bool whether the msg.sender is approved for the given token ID,
   *  is an operator of the owner, or is the owner of the token
   */
  function isApprovedOrOwner(address _spender, uint256 _tokenId) internal view returns (bool) {
    address owner = ownerOf(_tokenId);
    return _spender == owner || getApproved(_tokenId) == _spender || isApprovedForAll(owner, _spender);
  }

  /**
  * @dev Internal function to mint a new token
  * @dev Reverts if the given token ID already exists
  * @param _to The address that will own the minted token
  * @param _tokenId uint256 ID of the token to be minted by the msg.sender
  */
  function _mint(address _to, uint256 _tokenId) internal {
    require(_to != address(0));
    addTokenTo(_to, _tokenId);
    Transfer(address(0), _to, _tokenId);
  }

  /**
  * @dev Internal function to burn a specific token
  * @dev Reverts if the token does not exist
  * @param _tokenId uint256 ID of the token being burned by the msg.sender
  */
  function _burn(address _owner, uint256 _tokenId) internal {
    clearApproval(_owner, _tokenId);
    removeTokenFrom(_owner, _tokenId);
    Transfer(_owner, address(0), _tokenId);
  }

  /**
  * @dev Internal function to clear current approval of a given token ID
  * @dev Reverts if the given address is not indeed the owner of the token
  * @param _owner owner of the token
  * @param _tokenId uint256 ID of the token to be transferred
  */
  function clearApproval(address _owner, uint256 _tokenId) internal {
    require(ownerOf(_tokenId) == _owner);
    if (tokenApprovals[_tokenId] != address(0)) {
      tokenApprovals[_tokenId] = address(0);
      Approval(_owner, address(0), _tokenId);
    }
  }

  /**
  * @dev Internal function to add a token ID to the list of a given address
  * @param _to address representing the new owner of the given token ID
  * @param _tokenId uint256 ID of the token to be added to the tokens list of the given address
  */
  function addTokenTo(address _to, uint256 _tokenId) internal {
    require(tokenOwner[_tokenId] == address(0));
    tokenOwner[_tokenId] = _to;
    ownedTokensCount[_to] = ownedTokensCount[_to].add(1);
  }

  /**
  * @dev Internal function to remove a token ID from the list of a given address
  * @param _from address representing the previous owner of the given token ID
  * @param _tokenId uint256 ID of the token to be removed from the tokens list of the given address
  */
  function removeTokenFrom(address _from, uint256 _tokenId) internal {
    require(ownerOf(_tokenId) == _from);
    ownedTokensCount[_from] = ownedTokensCount[_from].sub(1);
    tokenOwner[_tokenId] = address(0);
  }

  /**
  * @dev Internal function to invoke `onERC721Received` on a target address
  * @dev The call is not executed if the target address is not a contract
  * @param _from address representing the previous owner of the given token ID
  * @param _to target address that will receive the tokens
  * @param _tokenId uint256 ID of the token to be transferred
  * @param _data bytes optional data to send along with the call
  * @return whether the call correctly returned the expected magic value
  */
  function checkAndCallSafeTransfer(address _from, address _to, uint256 _tokenId, bytes _data) internal returns (bool) {
    if (!_to.isContract()) {
      return true;
    }
    bytes4 retval = ERC721Receiver(_to).onERC721Received(_from, _tokenId, _data);
    return (retval == ERC721_RECEIVED);
  }
}



/**
 * @title Full ERC721 Token
 * This implementation includes all the required and some optional functionality of the ERC721 standard
 * Moreover, it includes approve all functionality using operator terminology
 * @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
 */
contract ERC721Token is ERC721, ERC721BasicToken {
  // Token name
  string internal name_;

  // Token symbol
  string internal symbol_;

  // Mapping from owner to list of owned token IDs
  mapping (address => uint256[]) internal ownedTokens;

  // Mapping from token ID to index of the owner tokens list
  mapping(uint256 => uint256) internal ownedTokensIndex;

  // Array with all token ids, used for enumeration
  uint256[] internal allTokens;

  // Mapping from token id to position in the allTokens array
  mapping(uint256 => uint256) internal allTokensIndex;

  // Optional mapping for token URIs 
  mapping(uint256 => string) internal tokenURIs;

  /**
  * @dev Constructor function
  */
  function ERC721Token(string _name, string _symbol) public {
    name_ = _name;
    symbol_ = _symbol;
  }

  /**
  * @dev Gets the token name
  * @return string representing the token name
  */
  function name() public view returns (string) {
    return name_;
  }

  /**
  * @dev Gets the token symbol
  * @return string representing the token symbol
  */
  function symbol() public view returns (string) {
    return symbol_;
  }

  /**
  * @dev Returns an URI for a given token ID
  * @dev Throws if the token ID does not exist. May return an empty string.
  * @param _tokenId uint256 ID of the token to query
  */
  function tokenURI(uint256 _tokenId) public view returns (string) {
    require(exists(_tokenId));
    return tokenURIs[_tokenId];
  }

  /**
  * @dev Internal function to set the token URI for a given token
  * @dev Reverts if the token ID does not exist
  * @param _tokenId uint256 ID of the token to set its URI
  * @param _uri string URI to assign
  */
  function _setTokenURI(uint256 _tokenId, string _uri) internal {
    require(exists(_tokenId));
    tokenURIs[_tokenId] = _uri;
  }

  /**
  * @dev Gets the token ID at a given index of the tokens list of the requested owner
  * @param _owner address owning the tokens list to be accessed
  * @param _index uint256 representing the index to be accessed of the requested tokens list
  * @return uint256 token ID at the given index of the tokens list owned by the requested address
  */
  function tokenOfOwnerByIndex(address _owner, uint256 _index) public view returns (uint256) {
    require(_index < balanceOf(_owner));
    return ownedTokens[_owner][_index];
  }

  /**
  * @dev Gets the total amount of tokens stored by the contract
  * @return uint256 representing the total amount of tokens
  */
  function totalSupply() public view returns (uint256) {
    return allTokens.length;
  }

  /**
  * @dev Gets the token ID at a given index of all the tokens in this contract
  * @dev Reverts if the index is greater or equal to the total number of tokens
  * @param _index uint256 representing the index to be accessed of the tokens list
  * @return uint256 token ID at the given index of the tokens list
  */
  function tokenByIndex(uint256 _index) public view returns (uint256) {
    require(_index < totalSupply());
    return allTokens[_index];
  }

  /**
  * @dev Internal function to add a token ID to the list of a given address
  * @param _to address representing the new owner of the given token ID
  * @param _tokenId uint256 ID of the token to be added to the tokens list of the given address
  */
  function addTokenTo(address _to, uint256 _tokenId) internal {
    super.addTokenTo(_to, _tokenId);
    uint256 length = ownedTokens[_to].length;
    ownedTokens[_to].push(_tokenId);
    ownedTokensIndex[_tokenId] = length;
  }

  /**
  * @dev Internal function to remove a token ID from the list of a given address
  * @param _from address representing the previous owner of the given token ID
  * @param _tokenId uint256 ID of the token to be removed from the tokens list of the given address
  */
  function removeTokenFrom(address _from, uint256 _tokenId) internal {
    super.removeTokenFrom(_from, _tokenId);

    uint256 tokenIndex = ownedTokensIndex[_tokenId];
    uint256 lastTokenIndex = ownedTokens[_from].length.sub(1);
    uint256 lastToken = ownedTokens[_from][lastTokenIndex];

    ownedTokens[_from][tokenIndex] = lastToken;
    ownedTokens[_from][lastTokenIndex] = 0;
    // Note that this will handle single-element arrays. In that case, both tokenIndex and lastTokenIndex are going to
    // be zero. Then we can make sure that we will remove _tokenId from the ownedTokens list since we are first swapping
    // the lastToken to the first position, and then dropping the element placed in the last position of the list

    ownedTokens[_from].length--;
    ownedTokensIndex[_tokenId] = 0;
    ownedTokensIndex[lastToken] = tokenIndex;
  }

  /**
  * @dev Internal function to mint a new token
  * @dev Reverts if the given token ID already exists
  * @param _to address the beneficiary that will own the minted token
  * @param _tokenId uint256 ID of the token to be minted by the msg.sender
  */
  function _mint(address _to, uint256 _tokenId) internal {
    super._mint(_to, _tokenId);
    
    allTokensIndex[_tokenId] = allTokens.length;
    allTokens.push(_tokenId);
  }

  /**
  * @dev Internal function to burn a specific token
  * @dev Reverts if the token does not exist
  * @param _owner owner of the token to burn
  * @param _tokenId uint256 ID of the token being burned by the msg.sender
  */
  function _burn(address _owner, uint256 _tokenId) internal {
    super._burn(_owner, _tokenId);

    // Clear metadata (if any)
    if (bytes(tokenURIs[_tokenId]).length != 0) {
      delete tokenURIs[_tokenId];
    }

    // Reorg all tokens array
    uint256 tokenIndex = allTokensIndex[_tokenId];
    uint256 lastTokenIndex = allTokens.length.sub(1);
    uint256 lastToken = allTokens[lastTokenIndex];

    allTokens[tokenIndex] = lastToken;
    allTokens[lastTokenIndex] = 0;

    allTokens.length--;
    allTokensIndex[_tokenId] = 0;
    allTokensIndex[lastToken] = tokenIndex;
  }

}




/// @title Base contract for CryptoStrikers. Defines what a card is and how to mint one.
/// @author The CryptoStrikers Team
contract StrikersBase is ERC721Token("CryptoStrikers", "STRK"), OraclizeStringUtils, Ownable {
  string constant API_URL = "https://us-central1-cryptostrikers-api.cloudfunctions.net/cards/";

  /// @dev Emit this event whenever we mint a new card
  ///  For Series 1 cards, this occurs during the minting of packs.
  ///  For Series 2 cards, we mint and award them as a prize for the daily challenge.
  event CardMinted(uint256 cardId);

  /// @dev The struct representing the game's main object, a sports trading card.
  struct Card {
    // The timestamp at which this card was minted.
    uint64 mintTime;

    // For each run, cards for a given player have their mintNumber
    // incremented in sequence. If we mint 1000 Messis, the third one
    // to be minted has mintNumber = 3 (out of 1000).
    uint16 mintNumber;

    // The ID of the player on this card. See the players array in WorldCupInfo
    uint8 playerId;

    // We will be issuing 2 series of cards, each by a different illustrator.
    // See xxxxx.sol for more info
    uint8 seriesId;

    // We reserve the right to mint multiple runs of each series.
    // See xxxxx.sol for more info
    uint8 runId;
  }

  /// @dev All the cards that have been minted, indexed by cardId.
  Card[] public cards;

  /// @dev Returns the API URL for each card
  ///   ex: https://us-central1-cryptostrikers-api.cloudfunctions.net/cards/22
  ///   The API will then return a JSON blob according to OpenSea's spec
  ///   see: https://developers.opensea.io/getting-started.html
  function tokenURI(uint256 _tokenId) public view returns (string) {
    require(exists(_tokenId));
    string memory _id = uint2str(_tokenId);
    return strConcat(API_URL, _id);
  }

  /// @dev An internal method that creates a new card and stores it.
  ///  Emits both a Birth and a Transfer event.
  /// @param _playerId The ID of the player on the card (see WorldCupInfo)
  /// @param _seriesId Series 1 or Series 2
  /// @param _runId The number of the run within the series
  /// @param _mintNumber The number of the card within the run
  function _mintCard(
    uint8 _playerId,
    uint8 _seriesId,
    uint8 _runId,
    uint16 _mintNumber,
    address _owner
  )
    internal
    returns (uint256)
  {
    Card memory newCard = Card({
      mintTime: uint64(now),
      mintNumber: _mintNumber,
      playerId: _playerId,
      seriesId: _seriesId,
      runId: _runId
    });
    uint256 newCardId = cards.push(newCard) - 1;
    emit CardMinted(newCardId);
    _mint(_owner, newCardId);
    return newCardId;
  }
}


contract StrikersMinting is StrikersBase {
  /// @dev The address of the contract that manages the pack sale.
  PackSale public packSale;

  /// @dev Only the owner can update the address of the pack sale contract.
  /// @param _address The address of the new PackSale contract.
  function setPackSaleAddress(address _address) external onlyOwner {
    PackSale candidateContract = PackSale(_address);
    // Sanity check to make sure we're actually setting a PackSale contract...
    require(candidateContract.isPackSale());
    packSale = candidateContract;
  }

  function mintSeries1Card(
    uint8 _playerId,
    uint8 _runId,
    uint16 _mintNumber,
    address _owner
  )
    external
    returns (uint256)
  {
    // Only the PackSale contract can mint Series 1 cards!!!
    require(msg.sender == address(packSale));
    return _mintCard(_playerId, 1, _runId, _mintNumber, _owner);
  }
}

Contract ABI

[{"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":"totalSupply","outputs":[{"name":"","type":"uint256"}],"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":"_playerId","type":"uint8"},{"name":"_runId","type":"uint8"},{"name":"_mintNumber","type":"uint16"},{"name":"_owner","type":"address"}],"name":"mintSeries1Card","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"exists","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","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":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"packSale","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"cards","outputs":[{"name":"mintTime","type":"uint64"},{"name":"mintNumber","type":"uint16"},{"name":"playerId","type":"uint8"},{"name":"seriesId","type":"uint8"},{"name":"runId","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"}],"name":"setPackSaleAddress","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":"_to","type":"address"},{"name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"},{"name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"anonymous":false,"inputs":[{"indexed":false,"name":"cardId","type":"uint256"}],"name":"CardMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_from","type":"address"},{"indexed":true,"name":"_to","type":"address"},{"indexed":false,"name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":true,"name":"_approved","type":"address"},{"indexed":false,"name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":true,"name":"_operator","type":"address"},{"indexed":false,"name":"_approved","type":"bool"}],"name":"ApprovalForAll","type":"event"}]

60606040526040805190810160405280600e81526020017f43727970746f537472696b6572730000000000000000000000000000000000008152506040805190810160405280600481526020017f5354524b00000000000000000000000000000000000000000000000000000000815250816004908051906020019062000088929190620000eb565b508060059080519060200190620000a1929190620000eb565b50505033600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200019a565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200012e57805160ff19168380011785556200015f565b828001600101855582156200015f579182015b828111156200015e57825182559160200191906001019062000141565b5b5090506200016e919062000172565b5090565b6200019791905b808211156200019357600081600090555060010162000179565b5090565b90565b6127ac80620001aa6000396000f300606060405260043610610128576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde031461012d578063081812fc146101bb578063095ea7b31461021e57806318160ddd1461026057806323b872dd146102895780632e06a45d146102ea5780632f745c591461035c57806342842e0e146103b25780634f558e79146104135780634f6ccce71461044e5780636352211e1461048557806370a08231146104e85780638b84577d146105355780638da5cb5b1461058a5780638dc10768146105df578063914e45d01461066057806395d89b4114610699578063a22cb46514610727578063b88d4fde1461076b578063c87b56dd1461080f578063e985e9c5146108ab578063f2fde38b1461091b575b600080fd5b341561013857600080fd5b610140610954565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610180578082015181840152602081019050610165565b50505050905090810190601f1680156101ad5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156101c657600080fd5b6101dc60048080359060200190919050506109fc565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561022957600080fd5b61025e600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610a39565b005b341561026b57600080fd5b610273610bff565b6040518082815260200191505060405180910390f35b341561029457600080fd5b6102e8600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610c0c565b005b34156102f557600080fd5b610346600480803560ff1690602001909190803560ff1690602001909190803561ffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610d23565b6040518082815260200191505060405180910390f35b341561036757600080fd5b61039c600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610d99565b6040518082815260200191505060405180910390f35b34156103bd57600080fd5b610411600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610e11565b005b341561041e57600080fd5b6104346004808035906020019091905050610e49565b604051808215151515815260200191505060405180910390f35b341561045957600080fd5b61046f6004808035906020019091905050610eba565b6040518082815260200191505060405180910390f35b341561049057600080fd5b6104a66004808035906020019091905050610ef3565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156104f357600080fd5b61051f600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610f70565b6040518082815260200191505060405180910390f35b341561054057600080fd5b610548610ff4565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561059557600080fd5b61059d61101a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156105ea57600080fd5b6106006004808035906020019091905050611040565b604051808667ffffffffffffffff1667ffffffffffffffff1681526020018561ffff1661ffff1681526020018460ff1660ff1681526020018360ff1660ff1681526020018260ff1660ff1681526020019550505050505060405180910390f35b341561066b57600080fd5b610697600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506110cb565b005b34156106a457600080fd5b6106ac6111f6565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156106ec5780820151818401526020810190506106d1565b50505050905090810190601f1680156107195780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561073257600080fd5b610769600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035151590602001909190505061129e565b005b341561077657600080fd5b61080d600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919050506113da565b005b341561081a57600080fd5b6108306004808035906020019091905050611419565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610870578082015181840152602081019050610855565b50505050905090810190601f16801561089d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156108b657600080fd5b610901600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506114b6565b604051808215151515815260200191505060405180910390f35b341561092657600080fd5b610952600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061154a565b005b61095c6125dd565b60048054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156109f25780601f106109c7576101008083540402835291602001916109f2565b820191906000526020600020905b8154815290600101906020018083116109d557829003601f168201915b5050505050905090565b60006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a4482610ef3565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515610a8157600080fd5b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610ac15750610ac081336114b6565b5b1515610acc57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16610aed836109fc565b73ffffffffffffffffffffffffffffffffffffffff16141580610b3d5750600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b15610bfa57826001600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a35b505050565b6000600880549050905090565b80610c1733826116a2565b1515610c2257600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614151515610c5e57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515610c9a57600080fd5b610ca48483611737565b610cae84836118a0565b610cb88383611abb565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a350505050565b6000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610d8157600080fd5b610d8f856001868686611b8f565b9050949350505050565b6000610da483610f70565b82101515610db157600080fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481101515610dfd57fe5b906000526020600020900154905092915050565b80610e1c33826116a2565b1515610e2757600080fd5b610e4384848460206040519081016040528060008152506113da565b50505050565b60008060008084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415915050919050565b6000610ec4610bff565b82101515610ed157600080fd5b600882815481101515610ee057fe5b9060005260206000209001549050919050565b60008060008084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515610f6757600080fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515610fad57600080fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600c8181548110151561104f57fe5b90600052602060002090016000915090508060000160009054906101000a900467ffffffffffffffff16908060000160089054906101000a900461ffff169080600001600a9054906101000a900460ff169080600001600b9054906101000a900460ff169080600001600c9054906101000a900460ff16905085565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561112957600080fd5b8190508073ffffffffffffffffffffffffffffffffffffffff1663643445a66040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561118f57600080fd5b5af1151561119c57600080fd5b5050506040518051905015156111b157600080fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6111fe6125dd565b60058054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156112945780601f1061126957610100808354040283529160200191611294565b820191906000526020600020905b81548152906001019060200180831161127757829003601f168201915b5050505050905090565b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156112d957600080fd5b80600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051808215151515815260200191505060405180910390a35050565b816113e533826116a2565b15156113f057600080fd5b6113fb858585610c0c565b61140785858585611d0e565b151561141257600080fd5b5050505050565b6114216125dd565b6114296125dd565b61143283610e49565b151561143d57600080fd5b61144683611ed7565b90506114ae606060405190810160405280604081526020017f68747470733a2f2f75732d63656e7472616c312d63727970746f737472696b6581526020017f72732d6170692e636c6f756466756e6374696f6e732e6e65742f63617264732f81525082612029565b915050919050565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156115a657600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156115e257600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806116ae83610ef3565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061171d57508373ffffffffffffffffffffffffffffffffffffffff16611705846109fc565b73ffffffffffffffffffffffffffffffffffffffff16145b8061172e575061172d81856114b6565b5b91505092915050565b8173ffffffffffffffffffffffffffffffffffffffff1661175782610ef3565b73ffffffffffffffffffffffffffffffffffffffff1614151561177957600080fd5b600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561189c5760006001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a35b5050565b60008060006118af8585612209565b6007600085815260200190815260200160002054925061191b6001600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905061233790919063ffffffff16565b9150600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110151561196957fe5b906000526020600020900154905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020848154811015156119c457fe5b9060005260206000209001819055506000600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002083815481101515611a2157fe5b906000526020600020900181905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480919060019003611a8291906125f1565b50600060076000868152602001908152602001600020819055508260076000838152602001908152602001600020819055505050505050565b6000611ac78383612350565b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806001018281611b5d919061261d565b916000526020600020900160008490919091505550806007600084815260200190815260200160002081905550505050565b6000611b99612649565b600060a0604051908101604052804267ffffffffffffffff1681526020018661ffff1681526020018960ff1681526020018860ff1681526020018760ff1681525091506001600c8054806001018281611bf29190612690565b9160005260206000209001600085909190915060008201518160000160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060208201518160000160086101000a81548161ffff021916908361ffff160217905550604082015181600001600a6101000a81548160ff021916908360ff160217905550606082015181600001600b6101000a81548160ff021916908360ff160217905550608082015181600001600c6101000a81548160ff021916908360ff16021790555050500390507f220b53d3db6f7694ac363d118b95866fad85b0e6b18b77cbe36eb044996994a0816040518082815260200191505060405180910390a1611d0084826124a8565b809250505095945050505050565b600080611d308573ffffffffffffffffffffffffffffffffffffffff166124fc565b1515611d3f5760019150611ece565b8473ffffffffffffffffffffffffffffffffffffffff1663f0b9e5ba8786866040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015611e01578082015181840152602081019050611de6565b50505050905090810190601f168015611e2e5780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b1515611e4e57600080fd5b5af11515611e5b57600080fd5b50505060405180519050905063f0b9e5ba7c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505b50949350505050565b611edf6125dd565b600080611eea6126bc565b600080861415611f31576040805190810160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509450612020565b8593505b600084141515611f5b578280600101935050600a84811515611f5357fe5b049350611f35565b82604051805910611f695750595b9080825280601f01601f191660200182016040525091506001830390505b60008614151561201c57600a86811515611f9d57fe5b066030017f010000000000000000000000000000000000000000000000000000000000000002828280600190039350815181101515611fd857fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8681151561201457fe5b049550611f87565b8194505b50505050919050565b6120316125dd565b6120396126bc565b6120416126bc565b6120496125dd565b6120516126bc565b600080889550879450845186510160405180591061206c5750595b9080825280601f01601f1916602001820160405250935083925060009150600090505b85518110156121425785818151811015156120a657fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002838380600101945081518110151561210557fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350808060010191505061208f565b600090505b84518110156121fa57848181518110151561215e57fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f01000000000000000000000000000000000000000000000000000000000000000283838060010194508151811015156121bd57fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050612147565b82965050505050505092915050565b8173ffffffffffffffffffffffffffffffffffffffff1661222982610ef3565b73ffffffffffffffffffffffffffffffffffffffff1614151561224b57600080fd5b61229e6001600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461233790919063ffffffff16565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600080600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b600082821115151561234557fe5b818303905092915050565b600073ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415156123bd57600080fd5b8160008083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506124616001600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461250f90919063ffffffff16565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b6124b2828261252d565b6008805490506009600083815260200190815260200160002081905550600880548060010182816124e3919061261d565b9160005260206000209001600083909190915055505050565b600080823b905060008111915050919050565b600080828401905083811015151561252357fe5b8091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561256957600080fd5b6125738282611abb565b8173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b602060405190810160405280600081525090565b8154818355818115116126185781836000526020600020918201910161261791906126d0565b5b505050565b8154818355818115116126445781836000526020600020918201910161264391906126d0565b5b505050565b60a060405190810160405280600067ffffffffffffffff168152602001600061ffff168152602001600060ff168152602001600060ff168152602001600060ff1681525090565b8154818355818115116126b7578183600052602060002091820191016126b691906126f5565b5b505050565b602060405190810160405280600081525090565b6126f291905b808211156126ee5760008160009055506001016126d6565b5090565b90565b61277d91905b8082111561277957600080820160006101000a81549067ffffffffffffffff02191690556000820160086101000a81549061ffff021916905560008201600a6101000a81549060ff021916905560008201600b6101000a81549060ff021916905560008201600c6101000a81549060ff0219169055506001016126fb565b5090565b905600a165627a7a72305820788c2aaac34fd304bf91a19840cc27be12c40f80bd92044d57ee03c885c125190029

Swarm Source

bzzr://788c2aaac34fd304bf91a19840cc27be12c40f80bd92044d57ee03c885c12519
Block Transaction Difficulty Gas Used Reward
Block Uncle Number Difficulty Gas Used Reward
Loading