ETH Price: $3,552.68 (+1.59%)
Gas: 45 Gwei

Contract

0xC2E9A923A9BC9db5409d35AE30974C76b6E401F9
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Value
Withdraw52118052018-03-07 9:23:402213 days ago1520414620IN
0xC2E9A923...6b6E401F9
0 ETH0.000154195
Buy Pack52117722018-03-07 9:15:452213 days ago1520414145IN
0xC2E9A923...6b6E401F9
0.01 ETH0.000115595
Buy Pack52117672018-03-07 9:14:452213 days ago1520414085IN
0xC2E9A923...6b6E401F9
0.005 ETH0.000115595
Buy Pack52117652018-03-07 9:13:512213 days ago1520414031IN
0xC2E9A923...6b6E401F9
0.01 ETH0.001313995
Buy Pack52117652018-03-07 9:13:512213 days ago1520414031IN
0xC2E9A923...6b6E401F9
0.1 ETH0.001313995
Buy Pack52117612018-03-07 9:12:462213 days ago1520413966IN
0xC2E9A923...6b6E401F9
0.005 ETH0.001313995
Buy Pack52117582018-03-07 9:12:032213 days ago1520413923IN
0xC2E9A923...6b6E401F9
0.05 ETH0.001313995
Buy Pack52117382018-03-07 9:06:292213 days ago1520413589IN
0xC2E9A923...6b6E401F9
0.1 ETH0.001313995
Approve52087512018-03-06 20:53:012213 days ago1520369581IN
0xC2E9A923...6b6E401F9
0 ETH0.000137553
Approve52087172018-03-06 20:46:092213 days ago1520369169IN
0xC2E9A923...6b6E401F9
0 ETH0.00009172
Buy Pack52080112018-03-06 17:50:452213 days ago1520358645IN
0xC2E9A923...6b6E401F9
0.01 ETH0.001388995
Drain Stack52050872018-03-06 5:57:242214 days ago1520315844IN
0xC2E9A923...6b6E401F9
0 ETH0.0012
Raise Slammer52050312018-03-06 5:42:372214 days ago1520314957IN
0xC2E9A923...6b6E401F9
0 ETH0.000094622
End Coin Flip52050172018-03-06 5:39:192214 days ago1520314759IN
0xC2E9A923...6b6E401F9
0 ETH0.000138492
Start Coin Flip52050082018-03-06 5:36:542214 days ago1520314614IN
0xC2E9A923...6b6E401F9
0 ETH0.000060622
Start Coin Flip52050072018-03-06 5:36:462214 days ago1520314606IN
0xC2E9A923...6b6E401F9
0 ETH0.000154742
Accept Counter S...52049972018-03-06 5:34:082214 days ago1520314448IN
0xC2E9A923...6b6E401F9
0 ETH0.000977532
Submit Counter S...52049872018-03-06 5:31:162214 days ago1520314276IN
0xC2E9A923...6b6E401F9
0 ETH0.000597312
Submit Stack52049862018-03-06 5:31:092214 days ago1520314269IN
0xC2E9A923...6b6E401F9
0 ETH0.000433472
Submit Stack52044072018-03-06 3:10:172214 days ago1520305817IN
0xC2E9A923...6b6E401F9
0 ETH0.000553472
Buy Pack52043842018-03-06 3:05:262214 days ago1520305526IN
0xC2E9A923...6b6E401F9
0.005 ETH0.000555592
Buy Pack52043842018-03-06 3:05:262214 days ago1520305526IN
0xC2E9A923...6b6E401F9
0.005 ETH0.000555592
Buy Pack52043402018-03-06 2:53:012214 days ago1520304781IN
0xC2E9A923...6b6E401F9
0.005 ETH0.001666786
Buy Pack52043382018-03-06 2:52:192214 days ago1520304739IN
0xC2E9A923...6b6E401F9
0.005 ETH0.001666786
Throw Slammer52032252018-03-05 22:21:132214 days ago1520288473IN
0xC2E9A923...6b6E401F9
0 ETH0.000634625
View all transactions

Latest 1 internal transaction

Advanced mode:
Parent Txn Hash Block From To Value
52118052018-03-07 9:23:402213 days ago1520414620
0xC2E9A923...6b6E401F9
0.426 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Cryptogs

Compiler Version
v0.4.18+commit.9cf6e910

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

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

pragma solidity ^0.4.15;

/*
  https://cryptogs.io
  --Austin Thomas Griffith for ETHDenver
  ( PS this gas guzzling beast is still unaudited )
*/


//adapted from https://github.com/ethereum/EIPs/issues/721
// thanks to Dieter Shirley && http://axiomzen.co

contract NFT {

  function NFT() public { }

  mapping (uint256 => address) public tokenIndexToOwner;
  mapping (address => uint256) ownershipTokenCount;
  mapping (uint256 => address) public tokenIndexToApproved;

  function transfer(address _to,uint256 _tokenId) external {
      require(_to != address(0));
      require(_to != address(this));
      require(_owns(msg.sender, _tokenId));
      _transfer(msg.sender, _to, _tokenId);
  }
  function _transfer(address _from, address _to, uint256 _tokenId) internal {
      ownershipTokenCount[_to]++;
      tokenIndexToOwner[_tokenId] = _to;
      if (_from != address(0)) {
          ownershipTokenCount[_from]--;
          delete tokenIndexToApproved[_tokenId];
      }
      Transfer(_from, _to, _tokenId);
  }
  event Transfer(address from, address to, uint256 tokenId);

  function transferFrom(address _from,address _to,uint256 _tokenId) external {
      require(_to != address(0));
      require(_to != address(this));
      require(_approvedFor(msg.sender, _tokenId));
      require(_owns(_from, _tokenId));
      _transfer(_from, _to, _tokenId);
  }

  function _owns(address _claimant, uint256 _tokenId) internal view returns (bool) {
      return tokenIndexToOwner[_tokenId] == _claimant;
  }
  function _approvedFor(address _claimant, uint256 _tokenId) internal view returns (bool) {
      return tokenIndexToApproved[_tokenId] == _claimant;
  }
  function _approve(uint256 _tokenId, address _approved) internal {
      tokenIndexToApproved[_tokenId] = _approved;
  }

  function approve(address _to,uint256 _tokenId) public returns (bool) {
      require(_owns(msg.sender, _tokenId));
      _approve(_tokenId, _to);
      Approval(msg.sender, _to, _tokenId);
      return true;
  }
  event Approval(address owner, address approved, uint256 tokenId);

  function balanceOf(address _owner) public view returns (uint256 count) {
      return ownershipTokenCount[_owner];
  }

  function ownerOf(uint256 _tokenId) external view returns (address owner) {
      owner = tokenIndexToOwner[_tokenId];
      require(owner != address(0));
  }

  function allowance(address _claimant, uint256 _tokenId) public view returns (bool) {
      return _approvedFor(_claimant,_tokenId);
  }
}



/**
 * @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 Cryptogs is NFT, Ownable {

    string public constant name = "Cryptogs";
    string public constant symbol = "POGS";

    string public constant purpose = "ETHDenver";
    string public constant contact = "https://cryptogs.io";
    string public constant author = "Austin Thomas Griffith";

    uint8 public constant FLIPPINESS = 64;
    uint8 public constant FLIPPINESSROUNDBONUS = 16;
    uint8 public constant TIMEOUTBLOCKS = 60;
    uint8 public constant BLOCKSUNTILCLEANUPSTACK=1;

    string public ipfs;
    function setIpfs(string _ipfs) public onlyOwner returns (bool){
      ipfs=_ipfs;
      IPFS(ipfs);
      return true;
    }
    event IPFS(string ipfs);

    function Cryptogs() public {
      //0 index should be a blank item owned by no one
      Item memory _item = Item({
        image: ""
      });
      items.push(_item);
    }

    address public slammerTime;
    function setSlammerTime(address _slammerTime) public onlyOwner returns (bool){
      //in order to trust that this contract isn't sending a players tokens
      // to a different contract, the slammertime contract is set once and
      // only once -- at deploy
      require(slammerTime==address(0));
      slammerTime=_slammerTime;
      return true;
    }

    struct Item{
      bytes32 image;
      //perhaps some are harder to flip over?
      //perhaps some have magical metadata?
      //I don't know, it's late and I'm weird
    }

    Item[] private items;

    function mint(bytes32 _image,address _owner) public onlyOwner returns (uint){
      uint256 newId = _mint(_image);
      _transfer(0, _owner, newId);
      Mint(items[newId].image,tokenIndexToOwner[newId],newId);
      return newId;
    }
    event Mint(bytes32 _image,address _owner,uint256 _id);

    function _mint(bytes32 _image) internal returns (uint){
      Item memory _item = Item({
        image: _image
      });
      uint256 newId = items.push(_item) - 1;
      tokensOfImage[items[newId].image]++;
      return newId;
    }

    Pack[] private packs;
    struct Pack{
      uint256[10] tokens;
      uint256 price;
    }
    function mintPack(uint256 _price,bytes32 _image1,bytes32 _image2,bytes32 _image3,bytes32 _image4,bytes32 _image5,bytes32 _image6,bytes32 _image7,bytes32 _image8,bytes32 _image9,bytes32 _image10) public onlyOwner returns (bool){
      uint256[10] memory tokens;
      tokens[0] = _mint(_image1);
      tokens[1] = _mint(_image2);
      tokens[2] = _mint(_image3);
      tokens[3] = _mint(_image4);
      tokens[4] = _mint(_image5);
      tokens[5] = _mint(_image6);
      tokens[6] = _mint(_image7);
      tokens[7] = _mint(_image8);
      tokens[8] = _mint(_image9);
      tokens[9] = _mint(_image10);
      Pack memory _pack = Pack({
        tokens: tokens,
        price: _price
      });
      MintPack(packs.push(_pack) - 1, _price,tokens[0],tokens[1],tokens[2],tokens[3],tokens[4],tokens[5],tokens[6],tokens[7],tokens[8],tokens[9]);
      return true;
    }
    event MintPack(uint256 packId,uint256 price,uint256 token1,uint256 token2,uint256 token3,uint256 token4,uint256 token5,uint256 token6,uint256 token7,uint256 token8,uint256 token9,uint256 token10);

    function buyPack(uint256 packId) public payable returns (bool) {
      //make sure pack is for sale
      require( packs[packId].price > 0 );
      //make sure they sent in enough value
      require( msg.value >= packs[packId].price );
      //right away set price to 0 to avoid some sort of reentrance
      packs[packId].price=0;
      //give tokens to owner
      for(uint8 i=0;i<10;i++){
        tokenIndexToOwner[packs[packId].tokens[i]]=msg.sender;
        _transfer(0, msg.sender, packs[packId].tokens[i]);
      }
      //clear the price so it is no longer for sale
      delete packs[packId];
      BuyPack(msg.sender,packId,msg.value);
    }
    event BuyPack(address sender, uint256 packId, uint256 price);

    //lets keep a count of how many of a specific image is created too
    //that will allow us to calculate rarity on-chain if we want
    mapping (bytes32 => uint256) public tokensOfImage;

    function getToken(uint256 _id) public view returns (address owner,bytes32 image,uint256 copies) {
      image = items[_id].image;
      copies = tokensOfImage[image];
      return (
        tokenIndexToOwner[_id],
        image,
        copies
      );
    }

    uint256 nonce = 0;

    struct Stack{
      //this will be an array of ids but for now just doing one for simplicity
      uint256[5] ids;
      address owner;
      uint32 block;

    }

    mapping (bytes32 => Stack) public stacks;
    mapping (bytes32 => bytes32) public stackCounter;

    function stackOwner(bytes32 _stack) public constant returns (address owner) {
      return stacks[_stack].owner;
    }

    function getStack(bytes32 _stack) public constant returns (address owner,uint32 block,uint256 token1,uint256 token2,uint256 token3,uint256 token4,uint256 token5) {
      return (stacks[_stack].owner,stacks[_stack].block,stacks[_stack].ids[0],stacks[_stack].ids[1],stacks[_stack].ids[2],stacks[_stack].ids[3],stacks[_stack].ids[4]);
    }

    //tx 1: of a game, player one approves the SlammerTime contract to take their tokens
    //this triggers an event to broadcast to other players that there is an open challenge
    function submitStack(uint256 _id,uint256 _id2,uint256 _id3,uint256 _id4,uint256 _id5, bool _public) public returns (bool) {
      //make sure slammerTime was set at deploy
      require(slammerTime!=address(0));
      //the sender must own the token
      require(tokenIndexToOwner[_id]==msg.sender);
      require(tokenIndexToOwner[_id2]==msg.sender);
      require(tokenIndexToOwner[_id3]==msg.sender);
      require(tokenIndexToOwner[_id4]==msg.sender);
      require(tokenIndexToOwner[_id5]==msg.sender);
      //they approve the slammertime contract to take the token away from them
      require(approve(slammerTime,_id));
      require(approve(slammerTime,_id2));
      require(approve(slammerTime,_id3));
      require(approve(slammerTime,_id4));
      require(approve(slammerTime,_id5));

      bytes32 stack = keccak256(nonce++,msg.sender);
      uint256[5] memory ids = [_id,_id2,_id3,_id4,_id5];
      stacks[stack] = Stack(ids,msg.sender,uint32(block.number));

      //the event is triggered to the frontend to display the stack
      //the frontend will check if they want it public or not
      SubmitStack(msg.sender,now,stack,_id,_id2,_id3,_id4,_id5,_public);
    }
    event SubmitStack(address indexed _sender,uint256 indexed timestamp,bytes32 indexed _stack,uint256 _token1,uint256 _token2,uint256 _token3,uint256 _token4,uint256 _token5,bool _public);

    //tx 2: of a game, player two approves the SlammerTime contract to take their tokens
    //this triggers an event to broadcast to player one that this player wants to rumble
    function submitCounterStack(bytes32 _stack, uint256 _id, uint256 _id2, uint256 _id3, uint256 _id4, uint256 _id5) public returns (bool) {
      //make sure slammerTime was set at deploy
      require(slammerTime!=address(0));
      //the sender must own the token
      require(tokenIndexToOwner[_id]==msg.sender);
      require(tokenIndexToOwner[_id2]==msg.sender);
      require(tokenIndexToOwner[_id3]==msg.sender);
      require(tokenIndexToOwner[_id4]==msg.sender);
      require(tokenIndexToOwner[_id5]==msg.sender);
      //they approve the slammertime contract to take the token away from them
      require(approve(slammerTime,_id));
      require(approve(slammerTime,_id2));
      require(approve(slammerTime,_id3));
      require(approve(slammerTime,_id4));
      require(approve(slammerTime,_id5));
      //stop playing with yourself
      require(msg.sender!=stacks[_stack].owner);

      bytes32 counterstack = keccak256(nonce++,msg.sender,_id);
      uint256[5] memory ids = [_id,_id2,_id3,_id4,_id5];
      stacks[counterstack] = Stack(ids,msg.sender,uint32(block.number));
      stackCounter[counterstack] = _stack;

      //the event is triggered to the frontend to display the stack
      //the frontend will check if they want it public or not
      CounterStack(msg.sender,now,_stack,counterstack,_id,_id2,_id3,_id4,_id5);
    }
    event CounterStack(address indexed _sender,uint256 indexed timestamp,bytes32 indexed _stack, bytes32 _counterStack, uint256 _token1, uint256 _token2, uint256 _token3, uint256 _token4, uint256 _token5);

    // if someone creates a stack they should be able to clean it up
    // its not really that big of a deal because we will have a timeout
    // in the frontent, but still...
    function cancelStack(bytes32 _stack) public returns (bool) {
      //it must be your stack
      require(msg.sender==stacks[_stack].owner);
      //make sure there is no mode set yet
      require(mode[_stack]==0);
      //make sure they aren't trying to cancel a counterstack using this function
      require(stackCounter[_stack]==0x00000000000000000000000000000000);

      delete stacks[_stack];

      CancelStack(msg.sender,now,_stack);
    }
    event CancelStack(address indexed _sender,uint256 indexed timestamp,bytes32 indexed _stack);

    function cancelCounterStack(bytes32 _stack,bytes32 _counterstack) public returns (bool) {
      //it must be your stack
      require(msg.sender==stacks[_counterstack].owner);
      //the counter must be a counter of stack 1
      require(stackCounter[_counterstack]==_stack);
      //make sure there is no mode set yet
      require(mode[_stack]==0);

      delete stacks[_counterstack];
      delete stackCounter[_counterstack];

      CancelCounterStack(msg.sender,now,_stack,_counterstack);
    }
    event CancelCounterStack(address indexed _sender,uint256 indexed timestamp,bytes32 indexed _stack,bytes32 _counterstack);

    mapping (bytes32 => bytes32) public counterOfStack;
    mapping (bytes32 => uint8) public mode;
    mapping (bytes32 => uint8) public round;
    mapping (bytes32 => uint32) public lastBlock;
    mapping (bytes32 => uint32) public commitBlock;
    mapping (bytes32 => address) public lastActor;
    mapping (bytes32 => uint256[10]) public mixedStack;

    //tx 3: of a game, player one approves counter stack and transfers everything in
    function acceptCounterStack(bytes32 _stack, bytes32 _counterStack) public returns (bool) {
      //sender must be owner of stack 1
      require(msg.sender==stacks[_stack].owner);
      //the counter must be a counter of stack 1
      require(stackCounter[_counterStack]==_stack);
      //make sure there is no mode set yet
      require(mode[_stack]==0);

      //do the transfer
      SlammerTime slammerTimeContract = SlammerTime(slammerTime);
      require( slammerTimeContract.startSlammerTime(msg.sender,stacks[_stack].ids,stacks[_counterStack].owner,stacks[_counterStack].ids) );

      //save the block for a timeout
      lastBlock[_stack]=uint32(block.number);
      lastActor[_stack]=stacks[_counterStack].owner;
      mode[_stack]=1;
      counterOfStack[_stack]=_counterStack;

      //// LOL @
      mixedStack[_stack][0] = stacks[_stack].ids[0];
      mixedStack[_stack][1] = stacks[_counterStack].ids[0];
      mixedStack[_stack][2] = stacks[_stack].ids[1];
      mixedStack[_stack][3] = stacks[_counterStack].ids[1];
      mixedStack[_stack][4] = stacks[_stack].ids[2];
      mixedStack[_stack][5] = stacks[_counterStack].ids[2];
      mixedStack[_stack][6] = stacks[_stack].ids[3];
      mixedStack[_stack][7] = stacks[_counterStack].ids[3];
      mixedStack[_stack][8] = stacks[_stack].ids[4];
      mixedStack[_stack][9] = stacks[_counterStack].ids[4];

      //let the front end know that the transfer is good and we are ready for the coin flip
      AcceptCounterStack(msg.sender,_stack,_counterStack);
    }
    event AcceptCounterStack(address indexed _sender,bytes32 indexed _stack, bytes32 indexed _counterStack);

    mapping (bytes32 => bytes32) public commit;

    function getMixedStack(bytes32 _stack) external view returns(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256){
      uint256[10] thisStack = mixedStack[_stack];
      return (thisStack[0],thisStack[1],thisStack[2],thisStack[3],thisStack[4],thisStack[5],thisStack[6],thisStack[7],thisStack[8],thisStack[9]);
    }

    //tx 4: player one commits and flips coin up
    //at this point, the timeout goes into effect and if any transaction including
    //the coin flip don't come back in time, we need to allow the other party
    //to withdraw all tokens... this keeps either player from refusing to
    //reveal their commit. (every tx from here on out needs to update the lastBlock and lastActor)
    //and in the withdraw function you check currentblock-lastBlock > timeout = refund to lastActor
    //and by refund I mean let them withdraw if they want
    //we could even have a little timer on the front end that tells you how long your opponnet has
    //before they will forfet
    function startCoinFlip(bytes32 _stack, bytes32 _counterStack, bytes32 _commit) public returns (bool) {
      //make sure it's the owner of the first stack (player one) doing the flip
      require(stacks[_stack].owner==msg.sender);
      //the counter must be a counter of stack 1
      require(stackCounter[_counterStack]==_stack);
      require(counterOfStack[_stack]==_counterStack);
      //make sure that we are in mode 1
      require(mode[_stack]==1);
      //store the commit for the next tx
      commit[_stack]=_commit;
      commitBlock[_stack]=uint32(block.number);
      //inc the mode to 2
      mode[_stack]=2;
      StartCoinFlip(_stack,_commit);
    }
    event StartCoinFlip(bytes32 stack, bytes32 commit);

    //tx5: player one ends coin flip with reveal
    function endCoinFlip(bytes32 _stack, bytes32 _counterStack, bytes32 _reveal) public returns (bool) {
      //make sure it's the owner of the first stack (player one) doing the flip
      require(stacks[_stack].owner==msg.sender);
      //the counter must be a counter of stack 1
      require(stackCounter[_counterStack]==_stack);
      require(counterOfStack[_stack]==_counterStack);
      //make sure that we are in mode 2
      require(mode[_stack]==2);

      //make sure hash of reveal == commit
      if(keccak256(_reveal)!=commit[_stack]){
        //commit/reveal failed.. this can happen if they
        //reload, so don't punish, just go back to the
        //start of the coin flip stage
        mode[_stack]=1;
        CoinFlipFail(_stack);
        return false;
      }else{
        //successful coin flip, ready to get random
        mode[_stack]=3;
        round[_stack]=1;
        bytes32 pseudoRandomHash = keccak256(_reveal,block.blockhash(commitBlock[_stack]));
        if(uint256(pseudoRandomHash)%2==0){
          //player1 goes first
          lastBlock[_stack]=uint32(block.number);
          lastActor[_stack]=stacks[_counterStack].owner;
          CoinFlipSuccess(_stack,stacks[_stack].owner,true);
        }else{
          //player2 goes first
          lastBlock[_stack]=uint32(block.number);
          lastActor[_stack]=stacks[_stack].owner;
          CoinFlipSuccess(_stack,stacks[_counterStack].owner,false);
        }
        return true;
      }

    }
    event CoinFlipSuccess(bytes32 indexed stack,address whosTurn,bool heads);
    event CoinFlipFail(bytes32 stack);


    //tx6 next player raises slammer
    function raiseSlammer(bytes32 _stack, bytes32 _counterStack, bytes32 _commit) public returns (bool) {
      if(lastActor[_stack]==stacks[_stack].owner){
        //it is player2's turn
        require(stacks[_counterStack].owner==msg.sender);
      }else{
        //it is player1's turn
        require(stacks[_stack].owner==msg.sender);
      }
      //the counter must be a counter of stack 1
      require(stackCounter[_counterStack]==_stack);
      require(counterOfStack[_stack]==_counterStack);
      //make sure that we are in mode 3
      require(mode[_stack]==3);
      //store the commit for the next tx
      commit[_stack]=_commit;
      commitBlock[_stack]=uint32(block.number);
      //inc the mode to 2
      mode[_stack]=4;
      RaiseSlammer(_stack,_commit);
    }
    event RaiseSlammer(bytes32 stack, bytes32 commit);


    //tx7 player throws slammer
    function throwSlammer(bytes32 _stack, bytes32 _counterStack, bytes32 _reveal) public returns (bool) {
      if(lastActor[_stack]==stacks[_stack].owner){
        //it is player2's turn
        require(stacks[_counterStack].owner==msg.sender);
      }else{
        //it is player1's turn
        require(stacks[_stack].owner==msg.sender);
      }
      //the counter must be a counter of stack 1
      require(stackCounter[_counterStack]==_stack);
      require(counterOfStack[_stack]==_counterStack);
      //make sure that we are in mode 4
      require(mode[_stack]==4);

      uint256[10] memory flipped;
      if(keccak256(_reveal)!=commit[_stack]){
        //commit/reveal failed.. this can happen if they
        //reload, so don't punish, just go back to the
        //start of the slammer raise
        mode[_stack]=3;
        throwSlammerEvent(_stack,msg.sender,address(0),flipped);
        return false;
      }else{
        //successful slam!!!!!!!!!!!! At this point I have officially been awake for 24 hours !!!!!!!!!!
        mode[_stack]=3;

        address previousLastActor = lastActor[_stack];

        bytes32 pseudoRandomHash = keccak256(_reveal,block.blockhash(commitBlock[_stack]));
        //Debug(_reveal,block.blockhash(block.number-1),pseudoRandomHash);
        if(lastActor[_stack]==stacks[_stack].owner){
          //player1 goes next
          lastBlock[_stack]=uint32(block.number);
          lastActor[_stack]=stacks[_counterStack].owner;
        }else{
          //player2 goes next
          lastBlock[_stack]=uint32(block.number);
          lastActor[_stack]=stacks[_stack].owner;
        }

        //look through the stack of remaining pogs and compare to byte to see if less than FLIPPINESS and transfer back to correct owner
        // oh man, that smells like reentrance --  I think the mode would actually break that right?
        bool done=true;
        uint8 randIndex = 0;
        for(uint8 i=0;i<10;i++){
          if(mixedStack[_stack][i]>0){
            //there is still a pog here, check for flip
            uint8 thisFlipper = uint8(pseudoRandomHash[randIndex++]);
            //DebugFlip(pseudoRandomHash,i,randIndex,thisFlipper,FLIPPINESS);
            if(thisFlipper<(FLIPPINESS+round[_stack]*FLIPPINESSROUNDBONUS)){
              //ITS A FLIP!
               uint256 tempId = mixedStack[_stack][i];
               flipped[i]=tempId;
               mixedStack[_stack][i]=0;
               SlammerTime slammerTimeContract = SlammerTime(slammerTime);
               //require( slammerTimeContract.transferBack(msg.sender,tempId) );
               slammerTimeContract.transferBack(msg.sender,tempId);
            }else{
              done=false;
            }
          }
        }

        throwSlammerEvent(_stack,msg.sender,previousLastActor,flipped);

        if(done){
          FinishGame(_stack);
          mode[_stack]=9;
          delete mixedStack[_stack];
          delete stacks[_stack];
          delete stackCounter[_counterStack];
          delete stacks[_counterStack];
          delete lastBlock[_stack];
          delete lastActor[_stack];
          delete counterOfStack[_stack];
          delete round[_stack];
          delete commitBlock[_stack];
          delete commit[_stack];
        }else{
          round[_stack]++;
        }

        return true;
      }
    }
    event ThrowSlammer(bytes32 indexed stack, address indexed whoDoneIt, address indexed otherPlayer, uint256 token1Flipped, uint256 token2Flipped, uint256 token3Flipped, uint256 token4Flipped, uint256 token5Flipped, uint256 token6Flipped, uint256 token7Flipped, uint256 token8Flipped, uint256 token9Flipped, uint256 token10Flipped);
    event FinishGame(bytes32 stack);

    function throwSlammerEvent(bytes32 stack,address whoDoneIt,address otherAccount, uint256[10] flipArray) internal {
      ThrowSlammer(stack,whoDoneIt,otherAccount,flipArray[0],flipArray[1],flipArray[2],flipArray[3],flipArray[4],flipArray[5],flipArray[6],flipArray[7],flipArray[8],flipArray[9]);
    }


    function drainStack(bytes32 _stack, bytes32 _counterStack) public returns (bool) {
      //this function is for the case of a timeout in the commit / reveal
      // if a player realizes they are going to lose, they can refuse to reveal
      // therefore we must have a timeout of TIMEOUTBLOCKS and if that time is reached
      // the other player can get in and drain the remaining tokens from the game
      require( stacks[_stack].owner==msg.sender || stacks[_counterStack].owner==msg.sender );
      //the counter must be a counter of stack 1
      require( stackCounter[_counterStack]==_stack );
      require( counterOfStack[_stack]==_counterStack );
      //the bad guy shouldn't be able to drain
      require( lastActor[_stack]==msg.sender );
      //must be after timeout period
      require( block.number - lastBlock[_stack] >= TIMEOUTBLOCKS);
      //game must still be going
      require( mode[_stack]<9 );

      for(uint8 i=0;i<10;i++){
        if(mixedStack[_stack][i]>0){
          uint256 tempId = mixedStack[_stack][i];
          mixedStack[_stack][i]=0;
          SlammerTime slammerTimeContract = SlammerTime(slammerTime);
          slammerTimeContract.transferBack(msg.sender,tempId);
        }
      }

      FinishGame(_stack);
      mode[_stack]=9;

      delete mixedStack[_stack];
      delete stacks[_stack];
      delete stackCounter[_counterStack];
      delete stacks[_counterStack];
      delete lastBlock[_stack];
      delete lastActor[_stack];
      delete counterOfStack[_stack];
      delete round[_stack];
      delete commitBlock[_stack];
      delete commit[_stack];

      DrainStack(_stack,_counterStack,msg.sender);
    }
    event DrainStack(bytes32 stack,bytes32 counterStack,address sender);

    function totalSupply() public view returns (uint) {
        return items.length - 1;
    }

    function tokensOfOwner(address _owner) external view returns(uint256[]) {
        uint256 tokenCount = balanceOf(_owner);
        if (tokenCount == 0) {
            return new uint256[](0);
        } else {
            uint256[] memory result = new uint256[](tokenCount);
            uint256 total = totalSupply();
            uint256 resultIndex = 0;
            uint256 id;
            for (id = 1; id <= total; id++) {
                if (tokenIndexToOwner[id] == _owner) {
                    result[resultIndex] = id;
                    resultIndex++;
                }
            }
            return result;
        }
    }

    function withdraw(uint256 _amount) public onlyOwner returns (bool) {
      require(this.balance >= _amount);
      assert(owner.send(_amount));
      return true;
    }

    function withdrawToken(address _token,uint256 _amount) public onlyOwner returns (bool) {
      StandardToken token = StandardToken(_token);
      token.transfer(msg.sender,_amount);
      return true;
    }
}

contract StandardToken {
  function transfer(address _to, uint256 _value) public returns (bool) { }
}

contract SlammerTime {
  function startSlammerTime(address _player1,uint256[5] _id1,address _player2,uint256[5] _id2) public returns (bool) { }
  function transferBack(address _toWhom, uint256 _id) public returns (bool) { }
}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_stack","type":"bytes32"}],"name":"stackOwner","outputs":[{"name":"owner","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"round","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"tokenIndexToOwner","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":"transferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_stack","type":"bytes32"},{"name":"_counterStack","type":"bytes32"}],"name":"acceptCounterStack","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_image","type":"bytes32"},{"name":"_owner","type":"address"}],"name":"mint","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_stack","type":"bytes32"},{"name":"_id","type":"uint256"},{"name":"_id2","type":"uint256"},{"name":"_id3","type":"uint256"},{"name":"_id4","type":"uint256"},{"name":"_id5","type":"uint256"}],"name":"submitCounterStack","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"contact","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"FLIPPINESS","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_price","type":"uint256"},{"name":"_image1","type":"bytes32"},{"name":"_image2","type":"bytes32"},{"name":"_image3","type":"bytes32"},{"name":"_image4","type":"bytes32"},{"name":"_image5","type":"bytes32"},{"name":"_image6","type":"bytes32"},{"name":"_image7","type":"bytes32"},{"name":"_image8","type":"bytes32"},{"name":"_image9","type":"bytes32"},{"name":"_image10","type":"bytes32"}],"name":"mintPack","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"BLOCKSUNTILCLEANUPSTACK","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"stacks","outputs":[{"name":"owner","type":"address"},{"name":"block","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_stack","type":"bytes32"},{"name":"_counterStack","type":"bytes32"},{"name":"_commit","type":"bytes32"}],"name":"raiseSlammer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_stack","type":"bytes32"}],"name":"getMixedStack","outputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_stack","type":"bytes32"},{"name":"_counterStack","type":"bytes32"},{"name":"_reveal","type":"bytes32"}],"name":"endCoinFlip","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"FLIPPINESSROUNDBONUS","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","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":"","type":"bytes32"}],"name":"tokensOfImage","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"lastActor","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_stack","type":"bytes32"},{"name":"_counterStack","type":"bytes32"}],"name":"drainStack","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"purpose","outputs":[{"name":"","type":"string"}],"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":"","type":"bytes32"}],"name":"lastBlock","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"commitBlock","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"slammerTime","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"name":"","type":"uint256[]"}],"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":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_token","type":"address"},{"name":"_amount","type":"uint256"}],"name":"withdrawToken","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"mode","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"author","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_stack","type":"bytes32"}],"name":"getStack","outputs":[{"name":"owner","type":"address"},{"name":"block","type":"uint32"},{"name":"token1","type":"uint256"},{"name":"token2","type":"uint256"},{"name":"token3","type":"uint256"},{"name":"token4","type":"uint256"},{"name":"token5","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"tokenIndexToApproved","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"transfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"},{"name":"","type":"uint256"}],"name":"mixedStack","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_stack","type":"bytes32"},{"name":"_counterstack","type":"bytes32"}],"name":"cancelCounterStack","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_ipfs","type":"string"}],"name":"setIpfs","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"ipfs","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"stackCounter","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"packId","type":"uint256"}],"name":"buyPack","outputs":[{"name":"","type":"bool"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"_claimant","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"allowance","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_stack","type":"bytes32"},{"name":"_counterStack","type":"bytes32"},{"name":"_reveal","type":"bytes32"}],"name":"throwSlammer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"TIMEOUTBLOCKS","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_id","type":"uint256"}],"name":"getToken","outputs":[{"name":"owner","type":"address"},{"name":"image","type":"bytes32"},{"name":"copies","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_stack","type":"bytes32"},{"name":"_counterStack","type":"bytes32"},{"name":"_commit","type":"bytes32"}],"name":"startCoinFlip","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_stack","type":"bytes32"}],"name":"cancelStack","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_id","type":"uint256"},{"name":"_id2","type":"uint256"},{"name":"_id3","type":"uint256"},{"name":"_id4","type":"uint256"},{"name":"_id5","type":"uint256"},{"name":"_public","type":"bool"}],"name":"submitStack","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"commit","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_slammerTime","type":"address"}],"name":"setSlammerTime","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"counterOfStack","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"ipfs","type":"string"}],"name":"IPFS","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_image","type":"bytes32"},{"indexed":false,"name":"_owner","type":"address"},{"indexed":false,"name":"_id","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"packId","type":"uint256"},{"indexed":false,"name":"price","type":"uint256"},{"indexed":false,"name":"token1","type":"uint256"},{"indexed":false,"name":"token2","type":"uint256"},{"indexed":false,"name":"token3","type":"uint256"},{"indexed":false,"name":"token4","type":"uint256"},{"indexed":false,"name":"token5","type":"uint256"},{"indexed":false,"name":"token6","type":"uint256"},{"indexed":false,"name":"token7","type":"uint256"},{"indexed":false,"name":"token8","type":"uint256"},{"indexed":false,"name":"token9","type":"uint256"},{"indexed":false,"name":"token10","type":"uint256"}],"name":"MintPack","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"sender","type":"address"},{"indexed":false,"name":"packId","type":"uint256"},{"indexed":false,"name":"price","type":"uint256"}],"name":"BuyPack","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_sender","type":"address"},{"indexed":true,"name":"timestamp","type":"uint256"},{"indexed":true,"name":"_stack","type":"bytes32"},{"indexed":false,"name":"_token1","type":"uint256"},{"indexed":false,"name":"_token2","type":"uint256"},{"indexed":false,"name":"_token3","type":"uint256"},{"indexed":false,"name":"_token4","type":"uint256"},{"indexed":false,"name":"_token5","type":"uint256"},{"indexed":false,"name":"_public","type":"bool"}],"name":"SubmitStack","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_sender","type":"address"},{"indexed":true,"name":"timestamp","type":"uint256"},{"indexed":true,"name":"_stack","type":"bytes32"},{"indexed":false,"name":"_counterStack","type":"bytes32"},{"indexed":false,"name":"_token1","type":"uint256"},{"indexed":false,"name":"_token2","type":"uint256"},{"indexed":false,"name":"_token3","type":"uint256"},{"indexed":false,"name":"_token4","type":"uint256"},{"indexed":false,"name":"_token5","type":"uint256"}],"name":"CounterStack","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_sender","type":"address"},{"indexed":true,"name":"timestamp","type":"uint256"},{"indexed":true,"name":"_stack","type":"bytes32"}],"name":"CancelStack","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_sender","type":"address"},{"indexed":true,"name":"timestamp","type":"uint256"},{"indexed":true,"name":"_stack","type":"bytes32"},{"indexed":false,"name":"_counterstack","type":"bytes32"}],"name":"CancelCounterStack","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_sender","type":"address"},{"indexed":true,"name":"_stack","type":"bytes32"},{"indexed":true,"name":"_counterStack","type":"bytes32"}],"name":"AcceptCounterStack","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"stack","type":"bytes32"},{"indexed":false,"name":"commit","type":"bytes32"}],"name":"StartCoinFlip","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"stack","type":"bytes32"},{"indexed":false,"name":"whosTurn","type":"address"},{"indexed":false,"name":"heads","type":"bool"}],"name":"CoinFlipSuccess","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"stack","type":"bytes32"}],"name":"CoinFlipFail","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"stack","type":"bytes32"},{"indexed":false,"name":"commit","type":"bytes32"}],"name":"RaiseSlammer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"stack","type":"bytes32"},{"indexed":true,"name":"whoDoneIt","type":"address"},{"indexed":true,"name":"otherPlayer","type":"address"},{"indexed":false,"name":"token1Flipped","type":"uint256"},{"indexed":false,"name":"token2Flipped","type":"uint256"},{"indexed":false,"name":"token3Flipped","type":"uint256"},{"indexed":false,"name":"token4Flipped","type":"uint256"},{"indexed":false,"name":"token5Flipped","type":"uint256"},{"indexed":false,"name":"token6Flipped","type":"uint256"},{"indexed":false,"name":"token7Flipped","type":"uint256"},{"indexed":false,"name":"token8Flipped","type":"uint256"},{"indexed":false,"name":"token9Flipped","type":"uint256"},{"indexed":false,"name":"token10Flipped","type":"uint256"}],"name":"ThrowSlammer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"stack","type":"bytes32"}],"name":"FinishGame","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"stack","type":"bytes32"},{"indexed":false,"name":"counterStack","type":"bytes32"},{"indexed":false,"name":"sender","type":"address"}],"name":"DrainStack","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":false,"name":"from","type":"address"},{"indexed":false,"name":"to","type":"address"},{"indexed":false,"name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"owner","type":"address"},{"indexed":false,"name":"approved","type":"address"},{"indexed":false,"name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"}]

6060604052600060095534156200001557600080fd5b6200001f6200007c565b60038054600160a060020a03191633600160a060020a03161790556020604051908101604052600081526006805491925090600181016200006183826200008e565b600092835260209092208391018151905550620000de915050565b60206040519081016040526000815290565b815481835581811511620000b557600083815260209020620000b5918101908301620000ba565b505050565b620000db91905b80821115620000d75760008155600101620000c1565b5090565b90565b61365980620000ee6000396000f3006060604052600436106102795763ffffffff60e060020a60003504166306fdde03811461027e578063086013c014610308578063095ea7b31461033a5780630dd5127d1461037057806318160ddd1461039c5780631d36e06c146103c157806323b872dd146103d757806324b77f0514610401578063293c6a3a1461041a57806329a404031461043c5780632e1a7d4d1461046157806333a8c45a14610477578063372e80c31461048a5780633791792a1461049d57806340a19a71146104d457806340ae7a5c146104e757806340b8783d14610525578063435ad5c1146105415780634bd8ae6f146105ad57806359828c99146105c95780636352211e146105dc5780636533b4bb146105f2578063686996a3146106085780636a8979991461061e57806370740aab1461063757806370a082311461064a57806370f6956a1461066957806374f6c562146106985780637712c870146106ae5780638462151c146106c15780638da5cb5b1461073357806395d89b41146107465780639e281a9814610759578063a591398b1461077b578063a6c3e6b914610791578063a716144a146107a4578063a8bd9c3214610807578063a9059cbb1461081d578063b20cf6fe1461083f578063b6ef78c214610858578063c31fa08314610871578063d7959cf9146108c2578063da87c969146108d5578063dc45bfb3146108eb578063ddc6a171146108f6578063de150d5d14610918578063e1757a3c14610934578063e4b50cb814610947578063e6e354071461098b578063e9db787b146109a7578063ed861328146109bd578063f14fcbc8146109e4578063f2fde38b146109fa578063f662112114610a19578063f903facc14610a38575b600080fd5b341561028957600080fd5b610291610a4e565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156102cd5780820151838201526020016102b5565b50505050905090810190601f1680156102fa5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561031357600080fd5b61031e600435610a85565b604051600160a060020a03909116815260200160405180910390f35b341561034557600080fd5b61035c600160a060020a0360043516602435610aa6565b604051901515815260200160405180910390f35b341561037b57600080fd5b610386600435610b20565b60405160ff909116815260200160405180910390f35b34156103a757600080fd5b6103af610b35565b60405190815260200160405180910390f35b34156103cc57600080fd5b61031e600435610b40565b34156103e257600080fd5b6103ff600160a060020a0360043581169060243516604435610b5b565b005b341561040c57600080fd5b61035c600435602435610bcb565b341561042557600080fd5b6103af600435600160a060020a0360243516610e47565b341561044757600080fd5b61035c60043560243560443560643560843560a435610f0a565b341561046c57600080fd5b61035c60043561126f565b341561048257600080fd5b6102916112dd565b341561049557600080fd5b610386611314565b34156104a857600080fd5b61035c60043560243560443560643560843560a43560c43560e435610104356101243561014435611319565b34156104df57600080fd5b6103866114f7565b34156104f257600080fd5b6104fd6004356114fc565b604051600160a060020a03909216825263ffffffff1660208201526040908101905180910390f35b341561053057600080fd5b61035c600435602435604435611529565b341561054c57600080fd5b61055760043561168a565b604051998a5260208a01989098526040808a01979097526060890195909552608088019390935260a087019190915260c086015260e0850152610100840152610120830191909152610140909101905180910390f35b34156105b857600080fd5b61035c6004356024356044356116dc565b34156105d457600080fd5b6103866119b4565b34156105e757600080fd5b61031e6004356119b9565b34156105fd57600080fd5b6103af6004356119dd565b341561061357600080fd5b61031e6004356119ef565b341561062957600080fd5b61035c600435602435611a0a565b341561064257600080fd5b610291611d86565b341561065557600080fd5b6103af600160a060020a0360043516611dbd565b341561067457600080fd5b61067f600435611dd8565b60405163ffffffff909116815260200160405180910390f35b34156106a357600080fd5b61067f600435611df0565b34156106b957600080fd5b61031e611e08565b34156106cc57600080fd5b6106e0600160a060020a0360043516611e17565b60405160208082528190810183818151815260200191508051906020019060200280838360005b8381101561071f578082015183820152602001610707565b505050509050019250505060405180910390f35b341561073e57600080fd5b61031e611ef8565b341561075157600080fd5b610291611f07565b341561076457600080fd5b61035c600160a060020a0360043516602435611f3e565b341561078657600080fd5b610386600435611fe2565b341561079c57600080fd5b610291611ff7565b34156107af57600080fd5b6107ba60043561202e565b604051600160a060020a03909716875263ffffffff90951660208701526040808701949094526060860192909252608085015260a084015260c083019190915260e0909101905180910390f35b341561081257600080fd5b61031e60043561207a565b341561082857600080fd5b6103ff600160a060020a0360043516602435612095565b341561084a57600080fd5b6103af6004356024356120ef565b341561086357600080fd5b61035c600435602435612111565b341561087c57600080fd5b61035c60046024813581810190830135806020601f820181900481020160405190810160405281815292919060208401838380828437509496506121f795505050505050565b34156108cd57600080fd5b6102916122db565b34156108e057600080fd5b6103af600435612379565b61035c60043561238b565b341561090157600080fd5b61035c600160a060020a036004351660243561255a565b341561092357600080fd5b61035c60043560243560443561256d565b341561093f57600080fd5b610386612b57565b341561095257600080fd5b61095d600435612b5c565b604051600160a060020a03909316835260208301919091526040808301919091526060909101905180910390f35b341561099657600080fd5b61035c600435602435604435612ba9565b34156109b257600080fd5b61035c600435612cab565b34156109c857600080fd5b61035c60043560243560443560643560843560a4351515612d72565b34156109ef57600080fd5b6103af600435613088565b3415610a0557600080fd5b6103ff600160a060020a036004351661309a565b3415610a2457600080fd5b61035c600160a060020a0360043516613128565b3415610a4357600080fd5b6103af600435613181565b60408051908101604052600881527f43727970746f6773000000000000000000000000000000000000000000000000602082015281565b6000818152600a6020526040902060050154600160a060020a03165b919050565b6000610ab23383613193565b1515610abd57600080fd5b610ac782846131b3565b7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925338484604051600160a060020a039384168152919092166020820152604080820192909252606001905180910390a150600192915050565b600e6020526000908152604090205460ff1681565b600654600019015b90565b600060208190529081526040902054600160a060020a031681565b600160a060020a0382161515610b7057600080fd5b30600160a060020a031682600160a060020a031614151515610b9157600080fd5b610b9b33826131e1565b1515610ba657600080fd5b610bb08382613193565b1515610bbb57600080fd5b610bc6838383613201565b505050565b6000828152600a6020526040812060050154819033600160a060020a03908116911614610bf757600080fd5b6000838152600b60205260409020548414610c1157600080fd5b6000848152600d602052604090205460ff1615610c2d57600080fd5b50600580546000858152600a602052604080822086835281832094850154600160a060020a0394851695869563291cef959533959390911692516020015260405163ffffffff861660e060020a028152600160a060020a038516600482019081529060c481019085906024015b815481526020019060010190808311610c9a575050600160a060020a038416815260c081019083906020015b815481526020019060010190808311610cc6575050945050505050602060405180830381600087803b1515610cfa57600080fd5b6102c65a03f11515610d0b57600080fd5b505050604051805190501515610d2057600080fd5b6000848152600f60209081526040808320805463ffffffff431663ffffffff19909116179055858352600a8083528184206005808201548a8752601186528487208054600160a060020a031916600160a060020a03928316179055600d8652848720805460ff19166001908117909155600c87528588208b90559386528487208054601290975296859020958655825486850155868401546002808801919091559383015460038088019190915584880154600480890191909155948401549287019290925581870154600687015590820154600786015594820154600885015501546009909201919091558491869133909116907fdd7fd1363175947f3a52d7ffa23edbf873a9960b97f9f425fd4846acd371b360905160405180910390a45092915050565b600354600090819033600160a060020a03908116911614610e6757600080fd5b610e70846132d6565b9050610e7e60008483613201565b7ff0bcd414edc501835c6c541058514fe45a43fa62a41671c9f62317c9889fcf7f600682815481101515610eae57fe5b600091825260208083209091015484835290829052604091829020549091600160a060020a0390911690849051928352600160a060020a0390911660208301526040808301919091526060909101905180910390a19392505050565b600080610f1561341a565b600554600160a060020a03161515610f2c57600080fd5b60008881526020819052604090205433600160a060020a03908116911614610f5357600080fd5b60008781526020819052604090205433600160a060020a03908116911614610f7a57600080fd5b60008681526020819052604090205433600160a060020a03908116911614610fa157600080fd5b60008581526020819052604090205433600160a060020a03908116911614610fc857600080fd5b60008481526020819052604090205433600160a060020a03908116911614610fef57600080fd5b60055461100590600160a060020a031689610aa6565b151561101057600080fd5b60055461102690600160a060020a031688610aa6565b151561103157600080fd5b60055461104790600160a060020a031687610aa6565b151561105257600080fd5b60055461106890600160a060020a031686610aa6565b151561107357600080fd5b60055461108990600160a060020a031685610aa6565b151561109457600080fd5b6000898152600a602052604090206005015433600160a060020a03908116911614156110bf57600080fd5b60098054600181019091553389604051928352600160a060020a03919091166c0100000000000000000000000002602083015260348201526054016040518091039020915060a06040519081016040528089815260200188815260200187815260200186815260200185815250905060606040519081016040908152828252600160a060020a03331660208084019190915263ffffffff4316828401526000858152600a9091522081516111769082906005613441565b506020820151600582018054600160a060020a031916600160a060020a039290921691909117905560408201516005909101805463ffffffff9290921660a060020a0277ffffffff000000000000000000000000000000000000000019909216919091179055506000828152600b6020526040908190208a905589904290600160a060020a033316907f47b61bcc3ca214175c4da7b195cc77174276ab281a2dc346245aa7dcf9289ad29086908d908d908d908d908d905195865260208601949094526040808601939093526060850191909152608084015260a083019190915260c0909101905180910390a450509695505050505050565b60035460009033600160a060020a0390811691161461128d57600080fd5b600160a060020a03301631829010156112a557600080fd5b600354600160a060020a031682156108fc0283604051600060405180830381858888f1935050505015156112d557fe5b506001919050565b60408051908101604052601381527f68747470733a2f2f63727970746f67732e696f00000000000000000000000000602082015281565b604081565b600061132361347f565b61132b61349a565b60035433600160a060020a0390811691161461134657600080fd5b61134f8d6132d6565b825261135a8c6132d6565b60208301526113688b6132d6565b60408301526113768a6132d6565b6060830152611384896132d6565b6080830152611392886132d6565b60a08301526113a0876132d6565b60c08301526113ae866132d6565b60e08301526113bc856132d6565b6101008301526113cb846132d6565b61012083015260408051908101604052808381526020018f81525090507f4a8f671d58a221ebb1bed4383288e424fe80b12424415a4f0d1a1678c46e918160016007805480600101828161141f91906134bc565b600092835260209092208591600b0201815161143e908290600a6134e8565b506020820151600a919091015550038f8451602086015160408701516060880151608089015160a08a015160c08b015160e08c01516101008d01516101208e01516040519b8c5260208c019a909a526040808c019990995260608b019790975260808a019590955260a089019390935260c088019190915260e0870152610100860152610120850152610140840152610160830191909152610180909101905180910390a15060019d9c50505050505050505050505050565b600181565b600a60205260009081526040902060050154600160a060020a0381169060a060020a900463ffffffff1682565b6000838152600a60209081526040808320600501546011909252822054600160a060020a0390811691161415611588576000838152600a602052604090206005015433600160a060020a0390811691161461158357600080fd5b6115b2565b6000848152600a602052604090206005015433600160a060020a039081169116146115b257600080fd5b6000838152600b602052604090205484146115cc57600080fd5b6000848152600c602052604090205483146115e657600080fd5b6000848152600d602052604090205460ff1660031461160457600080fd5b600084815260136020908152604080832085905560108252808320805463ffffffff431663ffffffff19909116179055600d90915290819020805460ff191660041790557fc0ff20cfe5392a20092ea7efbdcdf530829097f1647cdd9763afb3152abe66fb90859084905191825260208201526040908101905180910390a19392505050565b6000908152601260205260409020805460018201546002830154600384015460048501546005860154600687015460078801546008890154600990990154979996989597949693959294919390929190565b6000838152600a6020526040812060050154819033600160a060020a0390811691161461170857600080fd5b6000848152600b6020526040902054851461172257600080fd5b6000858152600c6020526040902054841461173c57600080fd5b6000858152600d602052604090205460ff1660021461175a57600080fd5b600085815260136020526040908190205490849051908152602001604051908190039020146117da576000858152600d602052604090819020805460ff191660011790557ff635b6ec989f4625e37238e46592f6b9244568bac6557b4a51e189a03ea2516b9086905190815260200160405180910390a1600091506119ac565b6000858152600d60209081526040808320805460ff19908116600317909155600e83528184208054909116600117905560109091529081902054849163ffffffff90911640905191825260208201526040908101905190819003902090506002810615156118f9576000858152600f60209081526040808320805463ffffffff431663ffffffff19909116179055868352600a8083528184206005908101548a8652601185528386208054600160a060020a031916600160a060020a0392831617905591909352928190209091015487927fa099bb85eb0810506ac87658bdecae67a43f87ce335e4e7e8521342e13d9e9729291169060019051600160a060020a039092168252151560208201526040908101905180910390a26119a7565b6000858152600f60209081526040808320805463ffffffff431663ffffffff19909116179055600a808352818420600590810154601185528386208054600160a060020a031916600160a060020a03928316179055898652919093528184209092015488937fa099bb85eb0810506ac87658bdecae67a43f87ce335e4e7e8521342e13d9e97293919091169151600160a060020a039092168252151560208201526040908101905180910390a25b600191505b509392505050565b601081565b600081815260208190526040902054600160a060020a0316801515610aa157600080fd5b60086020526000908152604090205481565b601160205260009081526040902054600160a060020a031681565b6000828152600a602052604081206005015481908190819033600160a060020a0390811691161480611a5957506000858152600a602052604090206005015433600160a060020a039081169116145b1515611a6457600080fd5b6000858152600b60205260409020548614611a7e57600080fd5b6000868152600c60205260409020548514611a9857600080fd5b60008681526011602052604090205433600160a060020a03908116911614611abf57600080fd5b6000868152600f6020526040902054603c63ffffffff90911643031015611ae557600080fd5b6000868152600d6020526040902054600960ff90911610611b0557600080fd5b600092505b600a8360ff161015611c0257600086815260126020526040812060ff8516600a8110611b3257fe5b01541115611bf757600086815260126020526040902060ff8416600a8110611b5657fe5b015460008781526012602052604081209193509060ff8516600a8110611b7857fe5b015550600554600160a060020a03168063c8f2835f338460006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515611bdb57600080fd5b6102c65a03f11515611bec57600080fd5b505050604051805150505b600190920191611b0a565b7fe5f81b734f3f18d93d36ec80c862452fc71443fc8ebf0e47d1c6d2f1dbd892e08660405190815260200160405180910390a16000868152600d60209081526040808320805460ff1916600917905560129091528120611c6191613515565b6000868152600a6020526040812090611c7a8282613527565b506005018054600160c060020a03191690556000858152600b60209081526040808320839055600a909152812090611cb28282613527565b506005018054600160c060020a03191690556000868152600f60209081526040808320805463ffffffff19908116909155601183528184208054600160a060020a0319169055600c8352818420849055600e8352818420805460ff1916905560108352818420805490911690556013909152808220919091557ffb2a8622b9c682baa4d8b678e6733ba9de2dd0e5c64083a82ffd4ab7499094e390879087903390519283526020830191909152600160a060020a03166040808301919091526060909101905180910390a150505092915050565b60408051908101604052600981527f45544844656e7665720000000000000000000000000000000000000000000000602082015281565b600160a060020a031660009081526001602052604090205490565b600f6020526000908152604090205463ffffffff1681565b60106020526000908152604090205463ffffffff1681565b600554600160a060020a031681565b611e1f61354a565b6000611e2961354a565b6000806000611e3787611dbd565b9450841515611e67576000604051805910611e4f5750595b90808252806020026020018201604052509550611eee565b84604051805910611e755750595b90808252806020026020018201604052509350611e90610b35565b925060009150600190505b828111611eea57600081815260208190526040902054600160a060020a0388811691161415611ee25780848381518110611ed157fe5b602090810290910101526001909101905b600101611e9b565b8395505b5050505050919050565b600354600160a060020a031681565b60408051908101604052600481527f504f475300000000000000000000000000000000000000000000000000000000602082015281565b600354600090819033600160a060020a03908116911614611f5e57600080fd5b5082600160a060020a03811663a9059cbb338560006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515611fbd57600080fd5b6102c65a03f11515611fce57600080fd5b505050604051805150600195945050505050565b600d6020526000908152604090205460ff1681565b60408051908101604052601681527f41757374696e2054686f6d617320477269666669746800000000000000000000602082015281565b6000908152600a6020526040902060058101548154600183015460028401546003850154600490950154600160a060020a0385169660a060020a90950463ffffffff1695939492939192565b600260205260009081526040902054600160a060020a031681565b600160a060020a03821615156120aa57600080fd5b30600160a060020a031682600160a060020a0316141515156120cb57600080fd5b6120d53382613193565b15156120e057600080fd5b6120eb338383613201565b5050565b601260205260008281526040902081600a811061210857fe5b01549150829050565b6000818152600a602052604081206005015433600160a060020a0390811691161461213b57600080fd5b6000828152600b6020526040902054831461215557600080fd5b6000838152600d602052604090205460ff161561217157600080fd5b6000828152600a602052604081209061218a8282613527565b506005018054600160c060020a03191690556000828152600b6020526040808220919091558390429033600160a060020a0316907f062e1030c9368c55de9601fd749b2f18ac68e0ac3a47b1efb13cab12a71e8c7d9086905190815260200160405180910390a492915050565b60035460009033600160a060020a0390811691161461221557600080fd5b600482805161222892916020019061355c565b507f3090bde09ffb6d36f4591138ff237ad3d1b676bc501c122d6976b94f3b23bfd76004604051602080825282546002600019610100600184161502019091160490820181905281906040820190849080156122c55780601f1061229a576101008083540402835291602001916122c5565b820191906000526020600020905b8154815290600101906020018083116122a857829003601f168201915b50509250505060405180910390a1506001919050565b60048054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156123715780601f1061234657610100808354040283529160200191612371565b820191906000526020600020905b81548152906001019060200180831161235457829003601f168201915b505050505081565b600b6020526000908152604090205481565b600080600060078481548110151561239f57fe5b90600052602060002090600b0201600a01541115156123bd57600080fd5b60078054849081106123cb57fe5b90600052602060002090600b0201600a015434101515156123eb57600080fd5b60006007848154811015156123fc57fe5b90600052602060002090600b0201600a0181905550600090505b600a8160ff1610156124c9573360008060078681548110151561243557fe5b60009182526020909120600b9091020160ff8516600a811061245357fe5b0154815260200190815260200160002060006101000a815481600160a060020a030219169083600160a060020a031602179055506124c160003360078681548110151561249c57fe5b60009182526020909120600b9091020160ff8516600a81106124ba57fe5b0154613201565b600101612416565b60078054849081106124d757fe5b600091825260208220600b90910201906124f18282613515565b600a82016000905550507f77169709497f21b632c8ed22314999645df83dda13ebcc08219e82776e6ceeb83384346040518084600160a060020a0316600160a060020a03168152602001838152602001828152602001935050505060405180910390a150919050565b600061256683836131e1565b9392505050565b600061257761347f565b6000858152600a602090815260408083206005015460119092528220548291829182918291829182918291600160a060020a03918216911614156125e45760008c8152600a602052604090206005015433600160a060020a039081169116146125df57600080fd5b61260e565b60008d8152600a602052604090206005015433600160a060020a0390811691161461260e57600080fd5b60008c8152600b60205260409020548d1461262857600080fd5b60008d8152600c60205260409020548c1461264257600080fd5b60008d8152600d602052604090205460ff1660041461266057600080fd5b60008d8152601360205260409081902054908c9051908152602001604051908190039020146126b95760008d8152600d60205260408120805460ff191660031790556126b0908e9033908c61335e565b60009950612b47565b60008d8152600d60209081526040808320805460ff19166003179055601182528083205460109092529182902054600160a060020a0390911699508c9163ffffffff90911640905191825260208201526040908101905190819003902060008e8152600a6020908152604080832060050154601190925290912054919850600160a060020a03918216911614156127fa5743600f60008f6000191660001916815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff160217905550600a60008d6000191660001916815260200190815260200160002060050160009054906101000a9004600160a060020a0316601160008f6000191660001916815260200190815260200160002060006101000a815481600160a060020a030219169083600160a060020a03160217905550612851565b60008d8152600f60209081526040808320805463ffffffff431663ffffffff19909116179055600a82528083206005015460119092529091208054600160a060020a031916600160a060020a039092169190911790555b6001955060009450600093505b600a8460ff1610156129e35760008d815260126020526040812060ff8616600a811061288657fe5b015411156129d8576001850194879060ff16602081106128a257fe5b60008f8152600e602052604090819020547f01000000000000000000000000000000000000000000000000000000000000009390921a830292909204945060ff908116601002909101811690841610156129d35760008d815260126020526040902060ff8516600a811061291257fe5b01549150818960ff8616600a811061292657fe5b6020908102919091019190915260008e815260129091526040812060ff8616600a811061294f57fe5b015550600554600160a060020a03168063c8f2835f338460006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b15156129b257600080fd5b6102c65a03f115156129c357600080fd5b50505060405180519050506129d8565b600095505b60019093019261285e565b6129ef8d338a8c61335e565b8515612b1f577fe5f81b734f3f18d93d36ec80c862452fc71443fc8ebf0e47d1c6d2f1dbd892e08d60405190815260200160405180910390a160008d8152600d60209081526040808320805460ff1916600917905560129091528120612a5491613515565b60008d8152600a6020526040812090612a6d8282613527565b506005018054600160c060020a031916905560008c8152600b60209081526040808320839055600a909152812090612aa58282613527565b506005018054600160c060020a031916905560008d8152600f60209081526040808320805463ffffffff19908116909155601183528184208054600160a060020a0319169055600c8352818420849055600e8352818420805460ff1916905560108352818420805490911690556013909152812055612b42565b60008d8152600e60205260409020805460ff8082166001011660ff199091161790555b600199505b5050505050505050509392505050565b603c81565b6000806000600684815481101515612b7057fe5b6000918252602080832091909101548083526008825260408084205497845291839052912054600160a060020a03169590949350915050565b6000838152600a602052604081206005015433600160a060020a03908116911614612bd357600080fd5b6000838152600b60205260409020548414612bed57600080fd5b6000848152600c60205260409020548314612c0757600080fd5b6000848152600d602052604090205460ff16600114612c2557600080fd5b600084815260136020908152604080832085905560108252808320805463ffffffff431663ffffffff19909116179055600d90915290819020805460ff191660021790557fe7734e0c9b6c6b123b7d035fcfbe050bf56999397e9807c82f841ebfccb16e6e90859084905191825260208201526040908101905180910390a19392505050565b6000818152600a602052604081206005015433600160a060020a03908116911614612cd557600080fd5b6000828152600d602052604090205460ff1615612cf157600080fd5b6000828152600b602052604090205415612d0a57600080fd5b6000828152600a6020526040812090612d238282613527565b506005018054600160c060020a0319169055814233600160a060020a03167f5988b3df3495bd77e3aea1be20b1e7a4750ef0d9a31fbc97a5b18d1c76b0a5d460405160405180910390a4919050565b600080612d7d61341a565b600554600160a060020a03161515612d9457600080fd5b60008981526020819052604090205433600160a060020a03908116911614612dbb57600080fd5b60008881526020819052604090205433600160a060020a03908116911614612de257600080fd5b60008781526020819052604090205433600160a060020a03908116911614612e0957600080fd5b60008681526020819052604090205433600160a060020a03908116911614612e3057600080fd5b60008581526020819052604090205433600160a060020a03908116911614612e5757600080fd5b600554612e6d90600160a060020a03168a610aa6565b1515612e7857600080fd5b600554612e8e90600160a060020a031689610aa6565b1515612e9957600080fd5b600554612eaf90600160a060020a031688610aa6565b1515612eba57600080fd5b600554612ed090600160a060020a031687610aa6565b1515612edb57600080fd5b600554612ef190600160a060020a031686610aa6565b1515612efc57600080fd5b600980546001810190915533604051918252600160a060020a03166c010000000000000000000000000260208201526034016040518091039020915060a0604051908101604052808a815260200189815260200188815260200187815260200186815250905060606040519081016040908152828252600160a060020a03331660208084019190915263ffffffff4316828401526000858152600a909152208151612faa9082906005613441565b506020820151600582018054600160a060020a031916600160a060020a039290921691909117905560408201516005909101805463ffffffff9290921660a060020a0277ffffffff000000000000000000000000000000000000000019909216919091179055508142600160a060020a0333167f39372912b756024e0f55c30508adca06029ca2e832fcfa2da38e30f2a0f4c3318c8c8c8c8c8c60405195865260208601949094526040808601939093526060850191909152608084015290151560a083015260c0909101905180910390a450509695505050505050565b60136020526000908152604090205481565b60035433600160a060020a039081169116146130b557600080fd5b600160a060020a03811615156130ca57600080fd5b600354600160a060020a0380831691167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360038054600160a060020a031916600160a060020a0392909216919091179055565b60035460009033600160a060020a0390811691161461314657600080fd5b600554600160a060020a03161561315c57600080fd5b5060058054600160a060020a038316600160a060020a03199091161790556001919050565b600c6020526000908152604090205481565b600090815260208190526040902054600160a060020a0391821691161490565b6000918252600260205260409091208054600160a060020a031916600160a060020a03909216919091179055565b600090815260026020526040902054600160a060020a0391821691161490565b600160a060020a038083166000818152600160208181526040808420805490930190925585835282905290208054600160a060020a031916909117905583161561328157600160a060020a03831660009081526001602090815260408083208054600019019055838352600290915290208054600160a060020a03191690555b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef838383604051600160a060020a039384168152919092166020820152604080820192909252606001905180910390a1505050565b60006132e061354a565b600060206040519081016040528481526006805491935060019180830161330783826135c9565b60009283526020909220859101815190555060068054929091039250600891600091908490811061333457fe5b60009182526020808320909101548352820192909252604001902080546001019055915050919050565b600160a060020a03828116908416857faac628e491aa8536c36958d1dc3e71f2b3acfceb21172980887d7c74bed416738451602086015160408701516060880151608089015160a08a015160c08b015160e08c01516101008d01516101208e0151604051998a5260208a01989098526040808a01979097526060890195909552608088019390935260a087019190915260c086015260e0850152610100840152610120830191909152610140909101905180910390a450505050565b60a06040519081016040526005815b60008152602001906001900390816134295790505090565b826005810192821561346f579160200282015b8281111561346f578251825591602001919060010190613454565b5061347b9291506135e9565b5090565b61014060405190810160405260008152600960208201613429565b610160604051908101604052806134af61347f565b8152602001600081525090565b815481835581811511610bc657600b0281600b028360005260206000209182019101610bc69190613603565b82600a810192821561346f579160200282018281111561346f578251825591602001919060010190613454565b5061352490600a8101906135e9565b50565b506000815560010160008155600101600081556001016000815560010160009055565b60206040519081016040526000815290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061359d57805160ff191683800117855561346f565b8280016001018555821561346f579182018281111561346f578251825591602001919060010190613454565b815481835581811511610bc657600083815260209020610bc69181019083015b610b3d91905b8082111561347b57600081556001016135ef565b610b3d91905b8082111561347b57600061361d8282613515565b506000600a820155600b016136095600a165627a7a723058205ce6b5eef6c7d8cbcb85c89b95ea79b09046690b3e79197947255e47278ac07b0029

Deployed Bytecode

0x6060604052600436106102795763ffffffff60e060020a60003504166306fdde03811461027e578063086013c014610308578063095ea7b31461033a5780630dd5127d1461037057806318160ddd1461039c5780631d36e06c146103c157806323b872dd146103d757806324b77f0514610401578063293c6a3a1461041a57806329a404031461043c5780632e1a7d4d1461046157806333a8c45a14610477578063372e80c31461048a5780633791792a1461049d57806340a19a71146104d457806340ae7a5c146104e757806340b8783d14610525578063435ad5c1146105415780634bd8ae6f146105ad57806359828c99146105c95780636352211e146105dc5780636533b4bb146105f2578063686996a3146106085780636a8979991461061e57806370740aab1461063757806370a082311461064a57806370f6956a1461066957806374f6c562146106985780637712c870146106ae5780638462151c146106c15780638da5cb5b1461073357806395d89b41146107465780639e281a9814610759578063a591398b1461077b578063a6c3e6b914610791578063a716144a146107a4578063a8bd9c3214610807578063a9059cbb1461081d578063b20cf6fe1461083f578063b6ef78c214610858578063c31fa08314610871578063d7959cf9146108c2578063da87c969146108d5578063dc45bfb3146108eb578063ddc6a171146108f6578063de150d5d14610918578063e1757a3c14610934578063e4b50cb814610947578063e6e354071461098b578063e9db787b146109a7578063ed861328146109bd578063f14fcbc8146109e4578063f2fde38b146109fa578063f662112114610a19578063f903facc14610a38575b600080fd5b341561028957600080fd5b610291610a4e565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156102cd5780820151838201526020016102b5565b50505050905090810190601f1680156102fa5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561031357600080fd5b61031e600435610a85565b604051600160a060020a03909116815260200160405180910390f35b341561034557600080fd5b61035c600160a060020a0360043516602435610aa6565b604051901515815260200160405180910390f35b341561037b57600080fd5b610386600435610b20565b60405160ff909116815260200160405180910390f35b34156103a757600080fd5b6103af610b35565b60405190815260200160405180910390f35b34156103cc57600080fd5b61031e600435610b40565b34156103e257600080fd5b6103ff600160a060020a0360043581169060243516604435610b5b565b005b341561040c57600080fd5b61035c600435602435610bcb565b341561042557600080fd5b6103af600435600160a060020a0360243516610e47565b341561044757600080fd5b61035c60043560243560443560643560843560a435610f0a565b341561046c57600080fd5b61035c60043561126f565b341561048257600080fd5b6102916112dd565b341561049557600080fd5b610386611314565b34156104a857600080fd5b61035c60043560243560443560643560843560a43560c43560e435610104356101243561014435611319565b34156104df57600080fd5b6103866114f7565b34156104f257600080fd5b6104fd6004356114fc565b604051600160a060020a03909216825263ffffffff1660208201526040908101905180910390f35b341561053057600080fd5b61035c600435602435604435611529565b341561054c57600080fd5b61055760043561168a565b604051998a5260208a01989098526040808a01979097526060890195909552608088019390935260a087019190915260c086015260e0850152610100840152610120830191909152610140909101905180910390f35b34156105b857600080fd5b61035c6004356024356044356116dc565b34156105d457600080fd5b6103866119b4565b34156105e757600080fd5b61031e6004356119b9565b34156105fd57600080fd5b6103af6004356119dd565b341561061357600080fd5b61031e6004356119ef565b341561062957600080fd5b61035c600435602435611a0a565b341561064257600080fd5b610291611d86565b341561065557600080fd5b6103af600160a060020a0360043516611dbd565b341561067457600080fd5b61067f600435611dd8565b60405163ffffffff909116815260200160405180910390f35b34156106a357600080fd5b61067f600435611df0565b34156106b957600080fd5b61031e611e08565b34156106cc57600080fd5b6106e0600160a060020a0360043516611e17565b60405160208082528190810183818151815260200191508051906020019060200280838360005b8381101561071f578082015183820152602001610707565b505050509050019250505060405180910390f35b341561073e57600080fd5b61031e611ef8565b341561075157600080fd5b610291611f07565b341561076457600080fd5b61035c600160a060020a0360043516602435611f3e565b341561078657600080fd5b610386600435611fe2565b341561079c57600080fd5b610291611ff7565b34156107af57600080fd5b6107ba60043561202e565b604051600160a060020a03909716875263ffffffff90951660208701526040808701949094526060860192909252608085015260a084015260c083019190915260e0909101905180910390f35b341561081257600080fd5b61031e60043561207a565b341561082857600080fd5b6103ff600160a060020a0360043516602435612095565b341561084a57600080fd5b6103af6004356024356120ef565b341561086357600080fd5b61035c600435602435612111565b341561087c57600080fd5b61035c60046024813581810190830135806020601f820181900481020160405190810160405281815292919060208401838380828437509496506121f795505050505050565b34156108cd57600080fd5b6102916122db565b34156108e057600080fd5b6103af600435612379565b61035c60043561238b565b341561090157600080fd5b61035c600160a060020a036004351660243561255a565b341561092357600080fd5b61035c60043560243560443561256d565b341561093f57600080fd5b610386612b57565b341561095257600080fd5b61095d600435612b5c565b604051600160a060020a03909316835260208301919091526040808301919091526060909101905180910390f35b341561099657600080fd5b61035c600435602435604435612ba9565b34156109b257600080fd5b61035c600435612cab565b34156109c857600080fd5b61035c60043560243560443560643560843560a4351515612d72565b34156109ef57600080fd5b6103af600435613088565b3415610a0557600080fd5b6103ff600160a060020a036004351661309a565b3415610a2457600080fd5b61035c600160a060020a0360043516613128565b3415610a4357600080fd5b6103af600435613181565b60408051908101604052600881527f43727970746f6773000000000000000000000000000000000000000000000000602082015281565b6000818152600a6020526040902060050154600160a060020a03165b919050565b6000610ab23383613193565b1515610abd57600080fd5b610ac782846131b3565b7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925338484604051600160a060020a039384168152919092166020820152604080820192909252606001905180910390a150600192915050565b600e6020526000908152604090205460ff1681565b600654600019015b90565b600060208190529081526040902054600160a060020a031681565b600160a060020a0382161515610b7057600080fd5b30600160a060020a031682600160a060020a031614151515610b9157600080fd5b610b9b33826131e1565b1515610ba657600080fd5b610bb08382613193565b1515610bbb57600080fd5b610bc6838383613201565b505050565b6000828152600a6020526040812060050154819033600160a060020a03908116911614610bf757600080fd5b6000838152600b60205260409020548414610c1157600080fd5b6000848152600d602052604090205460ff1615610c2d57600080fd5b50600580546000858152600a602052604080822086835281832094850154600160a060020a0394851695869563291cef959533959390911692516020015260405163ffffffff861660e060020a028152600160a060020a038516600482019081529060c481019085906024015b815481526020019060010190808311610c9a575050600160a060020a038416815260c081019083906020015b815481526020019060010190808311610cc6575050945050505050602060405180830381600087803b1515610cfa57600080fd5b6102c65a03f11515610d0b57600080fd5b505050604051805190501515610d2057600080fd5b6000848152600f60209081526040808320805463ffffffff431663ffffffff19909116179055858352600a8083528184206005808201548a8752601186528487208054600160a060020a031916600160a060020a03928316179055600d8652848720805460ff19166001908117909155600c87528588208b90559386528487208054601290975296859020958655825486850155868401546002808801919091559383015460038088019190915584880154600480890191909155948401549287019290925581870154600687015590820154600786015594820154600885015501546009909201919091558491869133909116907fdd7fd1363175947f3a52d7ffa23edbf873a9960b97f9f425fd4846acd371b360905160405180910390a45092915050565b600354600090819033600160a060020a03908116911614610e6757600080fd5b610e70846132d6565b9050610e7e60008483613201565b7ff0bcd414edc501835c6c541058514fe45a43fa62a41671c9f62317c9889fcf7f600682815481101515610eae57fe5b600091825260208083209091015484835290829052604091829020549091600160a060020a0390911690849051928352600160a060020a0390911660208301526040808301919091526060909101905180910390a19392505050565b600080610f1561341a565b600554600160a060020a03161515610f2c57600080fd5b60008881526020819052604090205433600160a060020a03908116911614610f5357600080fd5b60008781526020819052604090205433600160a060020a03908116911614610f7a57600080fd5b60008681526020819052604090205433600160a060020a03908116911614610fa157600080fd5b60008581526020819052604090205433600160a060020a03908116911614610fc857600080fd5b60008481526020819052604090205433600160a060020a03908116911614610fef57600080fd5b60055461100590600160a060020a031689610aa6565b151561101057600080fd5b60055461102690600160a060020a031688610aa6565b151561103157600080fd5b60055461104790600160a060020a031687610aa6565b151561105257600080fd5b60055461106890600160a060020a031686610aa6565b151561107357600080fd5b60055461108990600160a060020a031685610aa6565b151561109457600080fd5b6000898152600a602052604090206005015433600160a060020a03908116911614156110bf57600080fd5b60098054600181019091553389604051928352600160a060020a03919091166c0100000000000000000000000002602083015260348201526054016040518091039020915060a06040519081016040528089815260200188815260200187815260200186815260200185815250905060606040519081016040908152828252600160a060020a03331660208084019190915263ffffffff4316828401526000858152600a9091522081516111769082906005613441565b506020820151600582018054600160a060020a031916600160a060020a039290921691909117905560408201516005909101805463ffffffff9290921660a060020a0277ffffffff000000000000000000000000000000000000000019909216919091179055506000828152600b6020526040908190208a905589904290600160a060020a033316907f47b61bcc3ca214175c4da7b195cc77174276ab281a2dc346245aa7dcf9289ad29086908d908d908d908d908d905195865260208601949094526040808601939093526060850191909152608084015260a083019190915260c0909101905180910390a450509695505050505050565b60035460009033600160a060020a0390811691161461128d57600080fd5b600160a060020a03301631829010156112a557600080fd5b600354600160a060020a031682156108fc0283604051600060405180830381858888f1935050505015156112d557fe5b506001919050565b60408051908101604052601381527f68747470733a2f2f63727970746f67732e696f00000000000000000000000000602082015281565b604081565b600061132361347f565b61132b61349a565b60035433600160a060020a0390811691161461134657600080fd5b61134f8d6132d6565b825261135a8c6132d6565b60208301526113688b6132d6565b60408301526113768a6132d6565b6060830152611384896132d6565b6080830152611392886132d6565b60a08301526113a0876132d6565b60c08301526113ae866132d6565b60e08301526113bc856132d6565b6101008301526113cb846132d6565b61012083015260408051908101604052808381526020018f81525090507f4a8f671d58a221ebb1bed4383288e424fe80b12424415a4f0d1a1678c46e918160016007805480600101828161141f91906134bc565b600092835260209092208591600b0201815161143e908290600a6134e8565b506020820151600a919091015550038f8451602086015160408701516060880151608089015160a08a015160c08b015160e08c01516101008d01516101208e01516040519b8c5260208c019a909a526040808c019990995260608b019790975260808a019590955260a089019390935260c088019190915260e0870152610100860152610120850152610140840152610160830191909152610180909101905180910390a15060019d9c50505050505050505050505050565b600181565b600a60205260009081526040902060050154600160a060020a0381169060a060020a900463ffffffff1682565b6000838152600a60209081526040808320600501546011909252822054600160a060020a0390811691161415611588576000838152600a602052604090206005015433600160a060020a0390811691161461158357600080fd5b6115b2565b6000848152600a602052604090206005015433600160a060020a039081169116146115b257600080fd5b6000838152600b602052604090205484146115cc57600080fd5b6000848152600c602052604090205483146115e657600080fd5b6000848152600d602052604090205460ff1660031461160457600080fd5b600084815260136020908152604080832085905560108252808320805463ffffffff431663ffffffff19909116179055600d90915290819020805460ff191660041790557fc0ff20cfe5392a20092ea7efbdcdf530829097f1647cdd9763afb3152abe66fb90859084905191825260208201526040908101905180910390a19392505050565b6000908152601260205260409020805460018201546002830154600384015460048501546005860154600687015460078801546008890154600990990154979996989597949693959294919390929190565b6000838152600a6020526040812060050154819033600160a060020a0390811691161461170857600080fd5b6000848152600b6020526040902054851461172257600080fd5b6000858152600c6020526040902054841461173c57600080fd5b6000858152600d602052604090205460ff1660021461175a57600080fd5b600085815260136020526040908190205490849051908152602001604051908190039020146117da576000858152600d602052604090819020805460ff191660011790557ff635b6ec989f4625e37238e46592f6b9244568bac6557b4a51e189a03ea2516b9086905190815260200160405180910390a1600091506119ac565b6000858152600d60209081526040808320805460ff19908116600317909155600e83528184208054909116600117905560109091529081902054849163ffffffff90911640905191825260208201526040908101905190819003902090506002810615156118f9576000858152600f60209081526040808320805463ffffffff431663ffffffff19909116179055868352600a8083528184206005908101548a8652601185528386208054600160a060020a031916600160a060020a0392831617905591909352928190209091015487927fa099bb85eb0810506ac87658bdecae67a43f87ce335e4e7e8521342e13d9e9729291169060019051600160a060020a039092168252151560208201526040908101905180910390a26119a7565b6000858152600f60209081526040808320805463ffffffff431663ffffffff19909116179055600a808352818420600590810154601185528386208054600160a060020a031916600160a060020a03928316179055898652919093528184209092015488937fa099bb85eb0810506ac87658bdecae67a43f87ce335e4e7e8521342e13d9e97293919091169151600160a060020a039092168252151560208201526040908101905180910390a25b600191505b509392505050565b601081565b600081815260208190526040902054600160a060020a0316801515610aa157600080fd5b60086020526000908152604090205481565b601160205260009081526040902054600160a060020a031681565b6000828152600a602052604081206005015481908190819033600160a060020a0390811691161480611a5957506000858152600a602052604090206005015433600160a060020a039081169116145b1515611a6457600080fd5b6000858152600b60205260409020548614611a7e57600080fd5b6000868152600c60205260409020548514611a9857600080fd5b60008681526011602052604090205433600160a060020a03908116911614611abf57600080fd5b6000868152600f6020526040902054603c63ffffffff90911643031015611ae557600080fd5b6000868152600d6020526040902054600960ff90911610611b0557600080fd5b600092505b600a8360ff161015611c0257600086815260126020526040812060ff8516600a8110611b3257fe5b01541115611bf757600086815260126020526040902060ff8416600a8110611b5657fe5b015460008781526012602052604081209193509060ff8516600a8110611b7857fe5b015550600554600160a060020a03168063c8f2835f338460006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515611bdb57600080fd5b6102c65a03f11515611bec57600080fd5b505050604051805150505b600190920191611b0a565b7fe5f81b734f3f18d93d36ec80c862452fc71443fc8ebf0e47d1c6d2f1dbd892e08660405190815260200160405180910390a16000868152600d60209081526040808320805460ff1916600917905560129091528120611c6191613515565b6000868152600a6020526040812090611c7a8282613527565b506005018054600160c060020a03191690556000858152600b60209081526040808320839055600a909152812090611cb28282613527565b506005018054600160c060020a03191690556000868152600f60209081526040808320805463ffffffff19908116909155601183528184208054600160a060020a0319169055600c8352818420849055600e8352818420805460ff1916905560108352818420805490911690556013909152808220919091557ffb2a8622b9c682baa4d8b678e6733ba9de2dd0e5c64083a82ffd4ab7499094e390879087903390519283526020830191909152600160a060020a03166040808301919091526060909101905180910390a150505092915050565b60408051908101604052600981527f45544844656e7665720000000000000000000000000000000000000000000000602082015281565b600160a060020a031660009081526001602052604090205490565b600f6020526000908152604090205463ffffffff1681565b60106020526000908152604090205463ffffffff1681565b600554600160a060020a031681565b611e1f61354a565b6000611e2961354a565b6000806000611e3787611dbd565b9450841515611e67576000604051805910611e4f5750595b90808252806020026020018201604052509550611eee565b84604051805910611e755750595b90808252806020026020018201604052509350611e90610b35565b925060009150600190505b828111611eea57600081815260208190526040902054600160a060020a0388811691161415611ee25780848381518110611ed157fe5b602090810290910101526001909101905b600101611e9b565b8395505b5050505050919050565b600354600160a060020a031681565b60408051908101604052600481527f504f475300000000000000000000000000000000000000000000000000000000602082015281565b600354600090819033600160a060020a03908116911614611f5e57600080fd5b5082600160a060020a03811663a9059cbb338560006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515611fbd57600080fd5b6102c65a03f11515611fce57600080fd5b505050604051805150600195945050505050565b600d6020526000908152604090205460ff1681565b60408051908101604052601681527f41757374696e2054686f6d617320477269666669746800000000000000000000602082015281565b6000908152600a6020526040902060058101548154600183015460028401546003850154600490950154600160a060020a0385169660a060020a90950463ffffffff1695939492939192565b600260205260009081526040902054600160a060020a031681565b600160a060020a03821615156120aa57600080fd5b30600160a060020a031682600160a060020a0316141515156120cb57600080fd5b6120d53382613193565b15156120e057600080fd5b6120eb338383613201565b5050565b601260205260008281526040902081600a811061210857fe5b01549150829050565b6000818152600a602052604081206005015433600160a060020a0390811691161461213b57600080fd5b6000828152600b6020526040902054831461215557600080fd5b6000838152600d602052604090205460ff161561217157600080fd5b6000828152600a602052604081209061218a8282613527565b506005018054600160c060020a03191690556000828152600b6020526040808220919091558390429033600160a060020a0316907f062e1030c9368c55de9601fd749b2f18ac68e0ac3a47b1efb13cab12a71e8c7d9086905190815260200160405180910390a492915050565b60035460009033600160a060020a0390811691161461221557600080fd5b600482805161222892916020019061355c565b507f3090bde09ffb6d36f4591138ff237ad3d1b676bc501c122d6976b94f3b23bfd76004604051602080825282546002600019610100600184161502019091160490820181905281906040820190849080156122c55780601f1061229a576101008083540402835291602001916122c5565b820191906000526020600020905b8154815290600101906020018083116122a857829003601f168201915b50509250505060405180910390a1506001919050565b60048054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156123715780601f1061234657610100808354040283529160200191612371565b820191906000526020600020905b81548152906001019060200180831161235457829003601f168201915b505050505081565b600b6020526000908152604090205481565b600080600060078481548110151561239f57fe5b90600052602060002090600b0201600a01541115156123bd57600080fd5b60078054849081106123cb57fe5b90600052602060002090600b0201600a015434101515156123eb57600080fd5b60006007848154811015156123fc57fe5b90600052602060002090600b0201600a0181905550600090505b600a8160ff1610156124c9573360008060078681548110151561243557fe5b60009182526020909120600b9091020160ff8516600a811061245357fe5b0154815260200190815260200160002060006101000a815481600160a060020a030219169083600160a060020a031602179055506124c160003360078681548110151561249c57fe5b60009182526020909120600b9091020160ff8516600a81106124ba57fe5b0154613201565b600101612416565b60078054849081106124d757fe5b600091825260208220600b90910201906124f18282613515565b600a82016000905550507f77169709497f21b632c8ed22314999645df83dda13ebcc08219e82776e6ceeb83384346040518084600160a060020a0316600160a060020a03168152602001838152602001828152602001935050505060405180910390a150919050565b600061256683836131e1565b9392505050565b600061257761347f565b6000858152600a602090815260408083206005015460119092528220548291829182918291829182918291600160a060020a03918216911614156125e45760008c8152600a602052604090206005015433600160a060020a039081169116146125df57600080fd5b61260e565b60008d8152600a602052604090206005015433600160a060020a0390811691161461260e57600080fd5b60008c8152600b60205260409020548d1461262857600080fd5b60008d8152600c60205260409020548c1461264257600080fd5b60008d8152600d602052604090205460ff1660041461266057600080fd5b60008d8152601360205260409081902054908c9051908152602001604051908190039020146126b95760008d8152600d60205260408120805460ff191660031790556126b0908e9033908c61335e565b60009950612b47565b60008d8152600d60209081526040808320805460ff19166003179055601182528083205460109092529182902054600160a060020a0390911699508c9163ffffffff90911640905191825260208201526040908101905190819003902060008e8152600a6020908152604080832060050154601190925290912054919850600160a060020a03918216911614156127fa5743600f60008f6000191660001916815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff160217905550600a60008d6000191660001916815260200190815260200160002060050160009054906101000a9004600160a060020a0316601160008f6000191660001916815260200190815260200160002060006101000a815481600160a060020a030219169083600160a060020a03160217905550612851565b60008d8152600f60209081526040808320805463ffffffff431663ffffffff19909116179055600a82528083206005015460119092529091208054600160a060020a031916600160a060020a039092169190911790555b6001955060009450600093505b600a8460ff1610156129e35760008d815260126020526040812060ff8616600a811061288657fe5b015411156129d8576001850194879060ff16602081106128a257fe5b60008f8152600e602052604090819020547f01000000000000000000000000000000000000000000000000000000000000009390921a830292909204945060ff908116601002909101811690841610156129d35760008d815260126020526040902060ff8516600a811061291257fe5b01549150818960ff8616600a811061292657fe5b6020908102919091019190915260008e815260129091526040812060ff8616600a811061294f57fe5b015550600554600160a060020a03168063c8f2835f338460006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b15156129b257600080fd5b6102c65a03f115156129c357600080fd5b50505060405180519050506129d8565b600095505b60019093019261285e565b6129ef8d338a8c61335e565b8515612b1f577fe5f81b734f3f18d93d36ec80c862452fc71443fc8ebf0e47d1c6d2f1dbd892e08d60405190815260200160405180910390a160008d8152600d60209081526040808320805460ff1916600917905560129091528120612a5491613515565b60008d8152600a6020526040812090612a6d8282613527565b506005018054600160c060020a031916905560008c8152600b60209081526040808320839055600a909152812090612aa58282613527565b506005018054600160c060020a031916905560008d8152600f60209081526040808320805463ffffffff19908116909155601183528184208054600160a060020a0319169055600c8352818420849055600e8352818420805460ff1916905560108352818420805490911690556013909152812055612b42565b60008d8152600e60205260409020805460ff8082166001011660ff199091161790555b600199505b5050505050505050509392505050565b603c81565b6000806000600684815481101515612b7057fe5b6000918252602080832091909101548083526008825260408084205497845291839052912054600160a060020a03169590949350915050565b6000838152600a602052604081206005015433600160a060020a03908116911614612bd357600080fd5b6000838152600b60205260409020548414612bed57600080fd5b6000848152600c60205260409020548314612c0757600080fd5b6000848152600d602052604090205460ff16600114612c2557600080fd5b600084815260136020908152604080832085905560108252808320805463ffffffff431663ffffffff19909116179055600d90915290819020805460ff191660021790557fe7734e0c9b6c6b123b7d035fcfbe050bf56999397e9807c82f841ebfccb16e6e90859084905191825260208201526040908101905180910390a19392505050565b6000818152600a602052604081206005015433600160a060020a03908116911614612cd557600080fd5b6000828152600d602052604090205460ff1615612cf157600080fd5b6000828152600b602052604090205415612d0a57600080fd5b6000828152600a6020526040812090612d238282613527565b506005018054600160c060020a0319169055814233600160a060020a03167f5988b3df3495bd77e3aea1be20b1e7a4750ef0d9a31fbc97a5b18d1c76b0a5d460405160405180910390a4919050565b600080612d7d61341a565b600554600160a060020a03161515612d9457600080fd5b60008981526020819052604090205433600160a060020a03908116911614612dbb57600080fd5b60008881526020819052604090205433600160a060020a03908116911614612de257600080fd5b60008781526020819052604090205433600160a060020a03908116911614612e0957600080fd5b60008681526020819052604090205433600160a060020a03908116911614612e3057600080fd5b60008581526020819052604090205433600160a060020a03908116911614612e5757600080fd5b600554612e6d90600160a060020a03168a610aa6565b1515612e7857600080fd5b600554612e8e90600160a060020a031689610aa6565b1515612e9957600080fd5b600554612eaf90600160a060020a031688610aa6565b1515612eba57600080fd5b600554612ed090600160a060020a031687610aa6565b1515612edb57600080fd5b600554612ef190600160a060020a031686610aa6565b1515612efc57600080fd5b600980546001810190915533604051918252600160a060020a03166c010000000000000000000000000260208201526034016040518091039020915060a0604051908101604052808a815260200189815260200188815260200187815260200186815250905060606040519081016040908152828252600160a060020a03331660208084019190915263ffffffff4316828401526000858152600a909152208151612faa9082906005613441565b506020820151600582018054600160a060020a031916600160a060020a039290921691909117905560408201516005909101805463ffffffff9290921660a060020a0277ffffffff000000000000000000000000000000000000000019909216919091179055508142600160a060020a0333167f39372912b756024e0f55c30508adca06029ca2e832fcfa2da38e30f2a0f4c3318c8c8c8c8c8c60405195865260208601949094526040808601939093526060850191909152608084015290151560a083015260c0909101905180910390a450509695505050505050565b60136020526000908152604090205481565b60035433600160a060020a039081169116146130b557600080fd5b600160a060020a03811615156130ca57600080fd5b600354600160a060020a0380831691167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360038054600160a060020a031916600160a060020a0392909216919091179055565b60035460009033600160a060020a0390811691161461314657600080fd5b600554600160a060020a03161561315c57600080fd5b5060058054600160a060020a038316600160a060020a03199091161790556001919050565b600c6020526000908152604090205481565b600090815260208190526040902054600160a060020a0391821691161490565b6000918252600260205260409091208054600160a060020a031916600160a060020a03909216919091179055565b600090815260026020526040902054600160a060020a0391821691161490565b600160a060020a038083166000818152600160208181526040808420805490930190925585835282905290208054600160a060020a031916909117905583161561328157600160a060020a03831660009081526001602090815260408083208054600019019055838352600290915290208054600160a060020a03191690555b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef838383604051600160a060020a039384168152919092166020820152604080820192909252606001905180910390a1505050565b60006132e061354a565b600060206040519081016040528481526006805491935060019180830161330783826135c9565b60009283526020909220859101815190555060068054929091039250600891600091908490811061333457fe5b60009182526020808320909101548352820192909252604001902080546001019055915050919050565b600160a060020a03828116908416857faac628e491aa8536c36958d1dc3e71f2b3acfceb21172980887d7c74bed416738451602086015160408701516060880151608089015160a08a015160c08b015160e08c01516101008d01516101208e0151604051998a5260208a01989098526040808a01979097526060890195909552608088019390935260a087019190915260c086015260e0850152610100840152610120830191909152610140909101905180910390a450505050565b60a06040519081016040526005815b60008152602001906001900390816134295790505090565b826005810192821561346f579160200282015b8281111561346f578251825591602001919060010190613454565b5061347b9291506135e9565b5090565b61014060405190810160405260008152600960208201613429565b610160604051908101604052806134af61347f565b8152602001600081525090565b815481835581811511610bc657600b0281600b028360005260206000209182019101610bc69190613603565b82600a810192821561346f579160200282018281111561346f578251825591602001919060010190613454565b5061352490600a8101906135e9565b50565b506000815560010160008155600101600081556001016000815560010160009055565b60206040519081016040526000815290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061359d57805160ff191683800117855561346f565b8280016001018555821561346f579182018281111561346f578251825591602001919060010190613454565b815481835581811511610bc657600083815260209020610bc69181019083015b610b3d91905b8082111561347b57600081556001016135ef565b610b3d91905b8082111561347b57600061361d8282613515565b506000600a820155600b016136095600a165627a7a723058205ce6b5eef6c7d8cbcb85c89b95ea79b09046690b3e79197947255e47278ac07b0029

Swarm Source

bzzr://5ce6b5eef6c7d8cbcb85c89b95ea79b09046690b3e79197947255e47278ac07b

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Txn Hash Block Value Eth2 PubKey Valid
View All Deposits
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.