Contract Overview |  GU_LegendaryPackFour
Balance: 1.9908 Ether
Ether Value: $234.20 (@ $117.64/ETH)
Transactions: 27513 txns
Misc:
Address Watch: Add To Watch List
Contract Creator: 0xbea8c2f97fa34dc1cfdd7acbdc8226fb1c8c7473at txn 0x9a8874f00d0da4bdb54be6a0ee0092d9292501379554651be997a70362227e92
Token Balance:
 Latest 25 transactions from a total of 27513 transactions
(+1 PendingTxn)

TxHash Age From To Value [TxFee]
0x71d91224ea7b712145d51298a1d7b1136ebc23c53adfe2b7e08a7496d9070d99(pending)0xbb372b06aaeef2a869d4519c92658a2a6a493c07  IN  0xc47d7d42e44b2e04c83a45cf45898e597a0c23110 Ether(Pending)
0xd62ba19f37bb49d1d2c7f8240bad2c499c9c097f07e714877a3914abd43820551 hr 55 mins ago0xbeb18ecb8fd20ea1997d7b699978a8720bf0ae0c  IN   GU_LegendaryPackFour0 Ether0.000275712
0x495b992cb8f51297285c04e3455eb63d79f2f7f9d1b2c473c9fb1e82bc4cd18a1 hr 55 mins ago0xbdb1b430f194b6f5eb161948dfb15c07836889f4  IN   GU_LegendaryPackFour0 Ether0.000235435
0x1b98e6654c4cbf5828bbf4ea0dcfc733af042cb5a80465b768466a38649d07e01 hr 56 mins ago0xd94d7922ed9dfa3bdb4253773bcdc78d5fc162e6  IN   GU_LegendaryPackFour0.672 Ether0.001698588
0xc5d2c170d4bb37f97a14cf06071af6aae4e9d34dcb3878c656100c607c5b3ef52 hrs 34 mins ago0x1957918384929d6d8a895fb84e56b0afe194ce4b  IN   GU_LegendaryPackFour0 Ether0.000565044
0x55bf2a39144e391787a16e53f99749703e9fb9906c10b0b6efedcd9be732f9772 hrs 35 mins ago0xfc6963d9441bb7a971d3b0261d42b32dbaf75b29  IN   GU_LegendaryPackFour0.112 Ether0.001038026
0x29acb5e1c4d64600d7a232354f133a7941edc9908d9e1e69b61cb6b4508639393 hrs 53 mins ago0xf4401f0c1e1ef54a0419f58b46422b48c556ed92  IN   GU_LegendaryPackFour0 Ether0.0001677248
0x46d236666b61819ffae76b51b6ec268abc024f0546b0cf1b8a8e236330e81d6e3 hrs 53 mins ago0xdec5db28010a9c5a079a48902ea43bdee33892bf  IN   GU_LegendaryPackFour0 Ether0.0001677248
0x0e672bb6e94cd3b12e897efc6e08226764b6153e97ad11da78ae7727dd14d7d33 hrs 53 mins ago0xee57c8206f27cdf944ac0a6a93c89c6e19221bca  IN   GU_LegendaryPackFour0 Ether0.000275712
0xa14ca1218061bdedf6ad93684d0c508706c211de4815447fa584e5f1c36454f83 hrs 53 mins ago0x0e20374d8623d6c706aa74e73d2ce529c7e8940b  IN   GU_LegendaryPackFour0 Ether0.000275712
0x91dfef09012e3981bbea638bd7b5bfba4f0a878cdfa46617c142e051d23cab0d3 hrs 53 mins ago0xa6eec10c55ec14d530654596099ffc2373959fa5  IN   GU_LegendaryPackFour0 Ether0.000565044
0x61f7423a464c644ba41f0e5148455d7cbf5663202f1491ad8aa2d33ce95c47dc3 hrs 54 mins ago0x12bcefaff8878f84fdd4ce2f33c3b49ee43de948  IN   GU_LegendaryPackFour0.672 Ether0.0012550678
0x940e551953db8aaca5c49deb8affb7fc89addbd196ba5ab35eecbb9af52200cc4 hrs 4 mins ago0x70503b46df27cc04292e6803be55896a9455e7c5  IN   GU_LegendaryPackFour0 Ether0.000376696
0x77f2215504e8253e03f32af44e002d4af7e72555abeb242fa9c46787fb2a9b7d4 hrs 5 mins ago0x12bcefaff8878f84fdd4ce2f33c3b49ee43de948  IN   GU_LegendaryPackFour0.672 Ether0.0012550678
0x1fedc63f11891ff92edb858681ca7e1765a3a46070409113462d1c7ae74e6e404 hrs 19 mins ago0xff92938f77b287e16a891507d288e729b9f8c465  IN   GU_LegendaryPackFour0 Ether0.0001286656
0xb20dc80f19da568dadba18c8045b9e0e7358c0039c1568add5a4bf9955bee0934 hrs 19 mins ago0xf98d98e65ff508b10132ab647f90eb290f907084  IN   GU_LegendaryPackFour0 Ether0.000275712
0x318c76e5ed53d43e10e2ca68e260dbb44aac508163cdf40e57b813bd42f185204 hrs 20 mins ago0x0f523ca1894b7d01260d5d7a22ba675cd0b33da7  IN   GU_LegendaryPackFour0 Ether0.000565044
0xe38092c7cd61ca2055abe155d0ccb08eed9b0377e910200ac118f1e700e053fc4 hrs 22 mins ago0x12bcefaff8878f84fdd4ce2f33c3b49ee43de948  IN   GU_LegendaryPackFour0.672 Ether0.0010946456
0x945bddcd00b5ceca21c2afcb236c39aca493b237f7fe8e7df5872a5384b999154 hrs 45 mins ago0x62b8b7b7af7cb5847dd7335e0b6b4229cd1b7d48  IN   GU_LegendaryPackFour0 Ether0.00282973
0x05b33257f19ec23475d60357ce1bbd8a6744dd835641de71ec59e11c963050714 hrs 45 mins ago0x62b8b7b7af7cb5847dd7335e0b6b4229cd1b7d48  IN   GU_LegendaryPackFour0 Ether0.00834749
0x8d01197f3bd1846dae610f3f5c05b86f7243597d30e8aa8d0fcd300932d4936f5 hrs 17 mins ago0xe125c5f5d619d42cb94bc52bfb04e21e6bd64c4c  IN   GU_LegendaryPackFour0 Ether0.000252736
0x8bc11ef61cbbdfff4509d2a613af0a243914e310f4bd9ba824b1770ddefc1daa5 hrs 18 mins ago0x0bf9d05e7bdc0c6c208c220d4cf0cf0bdeca1942  IN   GU_LegendaryPackFour0 Ether0.000235435
0x56830bdb1fc9c573759363c6da9261a779c62b326dc1d8be6c85e45d2539e7345 hrs 18 mins ago0x9e5cc4e3a108b4ee189fbdad630be612e0154d35  IN   GU_LegendaryPackFour0.672 Ether0.001038026
0x094fda08b70f53a8ac71d24c587637920597e171c8b2d9a6b9e2d6ed3c3c0f365 hrs 32 mins ago0x582fe7be370a94b4b3bbeb198340f7bc48c30dc4  IN   GU_LegendaryPackFour0 Ether0.000252736
0xf57584e0e53cdfcc555b6854e8b809a33228ee125b063ee89ea6bf8850c9dec75 hrs 32 mins ago0x1d3092830fc021a2af659c718d4e075748597be6  IN   GU_LegendaryPackFour0 Ether0.000252736
[ Download CSV Export  ] 
 Internal Transactions as a result of Contract Execution
 Latest 25 Internal Txns, Click here To View More View All
ParentTxHash Block Age From To Value
0x1b98e6654c4cbf5828bbf4ea0dcfc733af042cb5a80465b768466a38649d07e071031471 hr 56 mins ago0xc47d7d42e44b2e04c83a45cf45898e597a0c23110x91b9d2835ad914bc1dcfe09bd1816febd04fd6890.672 Ether
0x55bf2a39144e391787a16e53f99749703e9fb9906c10b0b6efedcd9be732f97771030112 hrs 35 mins ago0xc47d7d42e44b2e04c83a45cf45898e597a0c23110x91b9d2835ad914bc1dcfe09bd1816febd04fd6890.112 Ether
0x61f7423a464c644ba41f0e5148455d7cbf5663202f1491ad8aa2d33ce95c47dc71027303 hrs 54 mins ago0xc47d7d42e44b2e04c83a45cf45898e597a0c23110x91b9d2835ad914bc1dcfe09bd1816febd04fd6890.672 Ether
0x77f2215504e8253e03f32af44e002d4af7e72555abeb242fa9c46787fb2a9b7d71027014 hrs 5 mins ago0xc47d7d42e44b2e04c83a45cf45898e597a0c23110x91b9d2835ad914bc1dcfe09bd1816febd04fd6890.672 Ether
0xe38092c7cd61ca2055abe155d0ccb08eed9b0377e910200ac118f1e700e053fc71026514 hrs 22 mins ago0xc47d7d42e44b2e04c83a45cf45898e597a0c23110x91b9d2835ad914bc1dcfe09bd1816febd04fd6890.672 Ether
0x56830bdb1fc9c573759363c6da9261a779c62b326dc1d8be6c85e45d2539e73471024675 hrs 18 mins ago0xc47d7d42e44b2e04c83a45cf45898e597a0c23110x91b9d2835ad914bc1dcfe09bd1816febd04fd6890.672 Ether
0xe9911abc730210ec80e88cfaa1c92fd60299fd6dd85bb70af7db38e79c86b12771024065 hrs 33 mins ago0xc47d7d42e44b2e04c83a45cf45898e597a0c23110x91b9d2835ad914bc1dcfe09bd1816febd04fd6890.1008 Ether
0xe9911abc730210ec80e88cfaa1c92fd60299fd6dd85bb70af7db38e79c86b12771024065 hrs 33 mins ago0xc47d7d42e44b2e04c83a45cf45898e597a0c23110x013ec57d1237e7727f818b1a35e3506f754304e40.0112 Ether
0xe924209fa69da71344862a5f5d90029a9ce283719dad0050368b0662a0e1a69771023645 hrs 46 mins ago0xc47d7d42e44b2e04c83a45cf45898e597a0c23110x91b9d2835ad914bc1dcfe09bd1816febd04fd6890.672 Ether
0x851ed720c139c99049db9d3e493ff6c22dadc095fd11ab6c5f80b2efe797be1871023415 hrs 52 mins ago0xc47d7d42e44b2e04c83a45cf45898e597a0c23110x91b9d2835ad914bc1dcfe09bd1816febd04fd6890.672 Ether
0x87e29c2f162f43c7fe2452356f602307e093a715285080ca7046dcb68481f55371022926 hrs 7 mins ago0xc47d7d42e44b2e04c83a45cf45898e597a0c23110x91b9d2835ad914bc1dcfe09bd1816febd04fd6890.672 Ether
0x3f54ca36c006d02c6f49d35d75ff8a35c645ffde4a0e1a6c73861a764c48d36e71018068 hrs 22 mins ago0xc47d7d42e44b2e04c83a45cf45898e597a0c23110x91b9d2835ad914bc1dcfe09bd1816febd04fd6890.1008 Ether
0x3f54ca36c006d02c6f49d35d75ff8a35c645ffde4a0e1a6c73861a764c48d36e71018068 hrs 22 mins ago0xc47d7d42e44b2e04c83a45cf45898e597a0c23110x013ec57d1237e7727f818b1a35e3506f754304e40.0112 Ether
0xfe81ee8dff55331da240541a5862c597758989fb694d4a20ef3299cd1991429371016259 hrs 10 mins ago0xc47d7d42e44b2e04c83a45cf45898e597a0c23110x91b9d2835ad914bc1dcfe09bd1816febd04fd6890.112 Ether
0x39e6b2c37cc43bbab083c8a59e527200d8812ceea0dd959b2d29f243b8f8b11771014989 hrs 45 mins ago0xc47d7d42e44b2e04c83a45cf45898e597a0c23110x91b9d2835ad914bc1dcfe09bd1816febd04fd6890.1008 Ether
0x39e6b2c37cc43bbab083c8a59e527200d8812ceea0dd959b2d29f243b8f8b11771014989 hrs 45 mins ago0xc47d7d42e44b2e04c83a45cf45898e597a0c23110x013ec57d1237e7727f818b1a35e3506f754304e40.0112 Ether
0x0a5a7a3a5f6574cbd0c0dc472dc059ee5b0ee650e018dada709280323608a7de71014829 hrs 51 mins ago0xc47d7d42e44b2e04c83a45cf45898e597a0c23110x91b9d2835ad914bc1dcfe09bd1816febd04fd6890.1008 Ether
0x0a5a7a3a5f6574cbd0c0dc472dc059ee5b0ee650e018dada709280323608a7de71014829 hrs 51 mins ago0xc47d7d42e44b2e04c83a45cf45898e597a0c23110x013ec57d1237e7727f818b1a35e3506f754304e40.0112 Ether
0xb64c4d241439e6fd0dd5e5d0a907d4b62eb22cd44aadbcac8a316854021eb9b071014729 hrs 54 mins ago0xc47d7d42e44b2e04c83a45cf45898e597a0c23110x91b9d2835ad914bc1dcfe09bd1816febd04fd6890.672 Ether
0xc108376860c629b1c1121c2a941bef3c2fad95fff29101bacd87288508311237710145710 hrs ago0xc47d7d42e44b2e04c83a45cf45898e597a0c23110x91b9d2835ad914bc1dcfe09bd1816febd04fd6890.1008 Ether
0xc108376860c629b1c1121c2a941bef3c2fad95fff29101bacd87288508311237710145710 hrs ago0xc47d7d42e44b2e04c83a45cf45898e597a0c23110x013ec57d1237e7727f818b1a35e3506f754304e40.0112 Ether
0x920f3f38d59bdb08f60e3680701cd574251ba2aa00069906fb93e13d89f85802710126610 hrs 55 mins ago0xc47d7d42e44b2e04c83a45cf45898e597a0c23110x91b9d2835ad914bc1dcfe09bd1816febd04fd6890.112 Ether
0xec2678ec922a1ac05fc90227ca3e9de5e2cecb18ba7b347bf8fafdf82ddf67dd710125510 hrs 56 mins ago0xc47d7d42e44b2e04c83a45cf45898e597a0c23110x91b9d2835ad914bc1dcfe09bd1816febd04fd6890.112 Ether
0x5e42518956f0d27343a5733c1c77834d0e16974b65a102df95bf0abe65b1acc9710123511 hrs 3 mins ago0xc47d7d42e44b2e04c83a45cf45898e597a0c23110x91b9d2835ad914bc1dcfe09bd1816febd04fd6890.112 Ether
0x664293c30e59c5214d7dbe61865cb9a0e8540cbea3532f1b74262f436297fbd5710086612 hrs 43 mins ago0xc47d7d42e44b2e04c83a45cf45898e597a0c23110x91b9d2835ad914bc1dcfe09bd1816febd04fd6890.1008 Ether
[ Download CSV Export  ] 
Warning: The Compiled Contract might be susceptible to ExpExponentCleanup (medium/high-severity), EventStructWrongData (very low-severity) SolidityCompiler Bugs.

Contract Source Code Verified (Exact Match)
Contract Name: LegendaryPackFour
Compiler Text: v0.4.24+commit.e67f0147
Optimization Enabled: Yes
Runs (Optimiser):  200



  Contract Source Code   Find Similiar Contracts

pragma solidity 0.4.24;

contract Ownable {

    address public owner;

    constructor() public {
        owner = msg.sender;
    }

    function setOwner(address _owner) public onlyOwner {
        owner = _owner;
    }

    modifier onlyOwner {
        require(msg.sender == owner);
        _;
    }

}

contract Vault is Ownable { 

    function () public payable {

    }

    function getBalance() public view returns (uint) {
        return address(this).balance;
    }

    function withdraw(uint amount) public onlyOwner {
        require(address(this).balance >= amount);
        owner.transfer(amount);
    }

    function withdrawAll() public onlyOwner {
        withdraw(address(this).balance);
    }
}

contract ERC20 {

    event Approval(address indexed owner, address indexed spender, uint256 value);
    event Transfer(address indexed from, address indexed to, uint256 value);
    
    function allowance(address owner, address spender) public view returns (uint256);
    
    function transferFrom(address from, address to, uint256 value) public returns (bool);

    function approve(address spender, uint256 value) public returns (bool);

    function totalSupply() public view returns (uint256);

    function balanceOf(address who) public view returns (uint256);
    
    function transfer(address to, uint256 value) public returns (bool);
    
}

library SafeMath {

  /**
  * @dev Multiplies two numbers, throws on overflow.
  */
  function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {
    // Gas optimization: this is cheaper than asserting 'a' not being zero, but the
    // benefit is lost if 'b' is also tested.
    // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
    if (a == 0) {
      return 0;
    }

    c = a * b;
    assert(c / a == b);
    return c;
  }

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

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

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

contract TournamentPass is ERC20, Ownable {

    using SafeMath for uint256;

    Vault vault;

    constructor(Vault _vault) public {
        vault = _vault;
    }

    mapping(address => uint256) balances;
    mapping (address => mapping (address => uint256)) internal allowed;
    address[] public minters;
    uint256 supply;
    uint mintLimit = 20000;
    
    function name() public view returns (string){
        return "GU Tournament Passes";
    }

    function symbol() public view returns (string) {
        return "PASS";
    }

    function addMinter(address minter) public onlyOwner {
        minters.push(minter);
    }

    function totalSupply() public view returns (uint256) {
        return supply;
    }

    function transfer(address _to, uint256 _value) public returns (bool) {
        require(_to != address(0));
        require(_value <= balances[msg.sender]);

        balances[msg.sender] = balances[msg.sender].sub(_value);
        balances[_to] = balances[_to].add(_value);
        emit Transfer(msg.sender, _to, _value);
        return true;
    }

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

    function isMinter(address test) internal view returns (bool) {
        for (uint i = 0; i < minters.length; i++) {
            if (minters[i] == test) {
                return true;
            }
        }
        return false;
    }

    function mint(address to, uint amount) public returns (bool) {
        require(isMinter(msg.sender));
        if (amount.add(supply) > mintLimit) {
            return false;
        } 
        supply = supply.add(amount);
        balances[to] = balances[to].add(amount);
        emit Transfer(address(0), to, amount);
        return true;
    }

    function approve(address _spender, uint256 _value) public returns (bool) {
        allowed[msg.sender][_spender] = _value;
        emit Approval(msg.sender, _spender, _value);
        return true;
    }

    function transferFrom(address _from, address _to, uint256 _value) public returns (bool) {
        require(_to != address(0));
        require(_value <= balances[_from]);
        require(_value <= allowed[_from][msg.sender]);

        balances[_from] = balances[_from].sub(_value);
        balances[_to] = balances[_to].add(_value);
        allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value);
        emit Transfer(_from, _to, _value);
        return true;
    }

    function increaseApproval(address spender, uint256 addedValue) public returns (bool) {
        allowed[msg.sender][spender] = allowed[msg.sender][spender].add(addedValue);
        emit Approval(msg.sender, spender, allowed[msg.sender][spender]);
        return true;
    }

    function decreaseApproval(address spender, uint256 subtractedValue) public returns (bool) {
        uint256 oldValue = allowed[msg.sender][spender];
        if (subtractedValue > oldValue) {
            allowed[msg.sender][spender] = 0;
        } else {
            allowed[msg.sender][spender] = oldValue.sub(subtractedValue);
        }
        emit Approval(msg.sender, spender, allowed[msg.sender][spender]);
        return true;
    }

    function allowance(address _owner, address _spender) public view returns (uint256 remaining) {
        return allowed[_owner][_spender];
    }

    uint public price = 250 finney;

    function purchase(uint amount) public payable {
        
        require(msg.value >= price.mul(amount));
        require(supply.add(amount) <= mintLimit);

        supply = supply.add(amount);
        balances[msg.sender] = balances[msg.sender].add(amount);
        emit Transfer(address(0), msg.sender, amount);

        address(vault).transfer(msg.value);
    }

}

contract CappedVault is Vault { 

    uint public limit;
    uint withdrawn = 0;

    constructor() public {
        limit = 33333 ether;
    }

    function () public payable {
        require(total() + msg.value <= limit);
    }

    function total() public view returns(uint) {
        return getBalance() + withdrawn;
    }

    function withdraw(uint amount) public onlyOwner {
        require(address(this).balance >= amount);
        owner.transfer(amount);
        withdrawn += amount;
    }

}


contract PreviousInterface {

    function ownerOf(uint id) public view returns (address);

    function getCard(uint id) public view returns (uint16, uint16);

    function totalSupply() public view returns (uint);

    function burnCount() public view returns (uint);

}

contract Pausable is Ownable {
    
    event Pause();
    event Unpause();

    bool public paused = false;


    /**
    * @dev Modifier to make a function callable only when the contract is not paused.
    */
    modifier whenNotPaused() {
        require(!paused);
        _;
    }

    /**
    * @dev Modifier to make a function callable only when the contract is paused.
    */
    modifier whenPaused() {
        require(paused);
        _;
    }

    /**
    * @dev called by the owner to pause, triggers stopped state
    */
    function pause() onlyOwner whenNotPaused public {
        paused = true;
        emit Pause();
    }

    /**
    * @dev called by the owner to unpause, returns to normal state
    */
    function unpause() onlyOwner whenPaused public {
        paused = false;
        emit Unpause();
    }
}

contract Governable {

    event Pause();
    event Unpause();

    address public governor;
    bool public paused = false;

    constructor() public {
        governor = msg.sender;
    }

    function setGovernor(address _gov) public onlyGovernor {
        governor = _gov;
    }

    modifier onlyGovernor {
        require(msg.sender == governor);
        _;
    }

    /**
    * @dev Modifier to make a function callable only when the contract is not paused.
    */
    modifier whenNotPaused() {
        require(!paused);
        _;
    }

    /**
    * @dev Modifier to make a function callable only when the contract is paused.
    */
    modifier whenPaused() {
        require(paused);
        _;
    }

    /**
    * @dev called by the owner to pause, triggers stopped state
    */
    function pause() onlyGovernor whenNotPaused public {
        paused = true;
        emit Pause();
    }

    /**
    * @dev called by the owner to unpause, returns to normal state
    */
    function unpause() onlyGovernor whenPaused public {
        paused = false;
        emit Unpause();
    }

}

contract CardBase is Governable {


    struct Card {
        uint16 proto;
        uint16 purity;
    }

    function getCard(uint id) public view returns (uint16 proto, uint16 purity) {
        Card memory card = cards[id];
        return (card.proto, card.purity);
    }

    function getShine(uint16 purity) public pure returns (uint8) {
        return uint8(purity / 1000);
    }

    Card[] public cards;
    
}

contract CardProto is CardBase {

    event NewProtoCard(
        uint16 id, uint8 season, uint8 god, 
        Rarity rarity, uint8 mana, uint8 attack, 
        uint8 health, uint8 cardType, uint8 tribe, bool packable
    );

    struct Limit {
        uint64 limit;
        bool exists;
    }

    // limits for mythic cards
    mapping(uint16 => Limit) public limits;

    // can only set limits once
    function setLimit(uint16 id, uint64 limit) public onlyGovernor {
        Limit memory l = limits[id];
        require(!l.exists);
        limits[id] = Limit({
            limit: limit,
            exists: true
        });
    }

    function getLimit(uint16 id) public view returns (uint64 limit, bool set) {
        Limit memory l = limits[id];
        return (l.limit, l.exists);
    }

    // could make these arrays to save gas
    // not really necessary - will be update a very limited no of times
    mapping(uint8 => bool) public seasonTradable;
    mapping(uint8 => bool) public seasonTradabilityLocked;
    uint8 public currentSeason;

    function makeTradable(uint8 season) public onlyGovernor {
        seasonTradable[season] = true;
    }

    function makeUntradable(uint8 season) public onlyGovernor {
        require(!seasonTradabilityLocked[season]);
        seasonTradable[season] = false;
    }

    function makePermanantlyTradable(uint8 season) public onlyGovernor {
        require(seasonTradable[season]);
        seasonTradabilityLocked[season] = true;
    }

    function isTradable(uint16 proto) public view returns (bool) {
        return seasonTradable[protos[proto].season];
    }

    function nextSeason() public onlyGovernor {
        //Seasons shouldn't go to 0 if there is more than the uint8 should hold, the governor should know this ¯\_(ツ)_/¯ -M
        require(currentSeason <= 255); 

        currentSeason++;
        mythic.length = 0;
        legendary.length = 0;
        epic.length = 0;
        rare.length = 0;
        common.length = 0;
    }

    enum Rarity {
        Common,
        Rare,
        Epic,
        Legendary, 
        Mythic
    }

    uint8 constant SPELL = 1;
    uint8 constant MINION = 2;
    uint8 constant WEAPON = 3;
    uint8 constant HERO = 4;

    struct ProtoCard {
        bool exists;
        uint8 god;
        uint8 season;
        uint8 cardType;
        Rarity rarity;
        uint8 mana;
        uint8 attack;
        uint8 health;
        uint8 tribe;
    }

    // there is a particular design decision driving this:
    // need to be able to iterate over mythics only for card generation
    // don't store 5 different arrays: have to use 2 ids
    // better to bear this cost (2 bytes per proto card)
    // rather than 1 byte per instance

    uint16 public protoCount;
    
    mapping(uint16 => ProtoCard) protos;

    uint16[] public mythic;
    uint16[] public legendary;
    uint16[] public epic;
    uint16[] public rare;
    uint16[] public common;

    function addProtos(
        uint16[] externalIDs, uint8[] gods, Rarity[] rarities, uint8[] manas, uint8[] attacks, 
        uint8[] healths, uint8[] cardTypes, uint8[] tribes, bool[] packable
    ) public onlyGovernor returns(uint16) {

        for (uint i = 0; i < externalIDs.length; i++) {

            ProtoCard memory card = ProtoCard({
                exists: true,
                god: gods[i],
                season: currentSeason,
                cardType: cardTypes[i],
                rarity: rarities[i],
                mana: manas[i],
                attack: attacks[i],
                health: healths[i],
                tribe: tribes[i]
            });

            _addProto(externalIDs[i], card, packable[i]);
        }
        
    }

    function addProto(
        uint16 externalID, uint8 god, Rarity rarity, uint8 mana, uint8 attack, uint8 health, uint8 cardType, uint8 tribe, bool packable
    ) public onlyGovernor returns(uint16) {
        ProtoCard memory card = ProtoCard({
            exists: true,
            god: god,
            season: currentSeason,
            cardType: cardType,
            rarity: rarity,
            mana: mana,
            attack: attack,
            health: health,
            tribe: tribe
        });

        _addProto(externalID, card, packable);
    }

    function addWeapon(
        uint16 externalID, uint8 god, Rarity rarity, uint8 mana, uint8 attack, uint8 durability, bool packable
    ) public onlyGovernor returns(uint16) {

        ProtoCard memory card = ProtoCard({
            exists: true,
            god: god,
            season: currentSeason,
            cardType: WEAPON,
            rarity: rarity,
            mana: mana,
            attack: attack,
            health: durability,
            tribe: 0
        });

        _addProto(externalID, card, packable);
    }

    function addSpell(uint16 externalID, uint8 god, Rarity rarity, uint8 mana, bool packable) public onlyGovernor returns(uint16) {

        ProtoCard memory card = ProtoCard({
            exists: true,
            god: god,
            season: currentSeason,
            cardType: SPELL,
            rarity: rarity,
            mana: mana,
            attack: 0,
            health: 0,
            tribe: 0
        });

        _addProto(externalID, card, packable);
    }

    function addMinion(
        uint16 externalID, uint8 god, Rarity rarity, uint8 mana, uint8 attack, uint8 health, uint8 tribe, bool packable
    ) public onlyGovernor returns(uint16) {

        ProtoCard memory card = ProtoCard({
            exists: true,
            god: god,
            season: currentSeason,
            cardType: MINION,
            rarity: rarity,
            mana: mana,
            attack: attack,
            health: health,
            tribe: tribe
        });

        _addProto(externalID, card, packable);
    }

    function _addProto(uint16 externalID, ProtoCard memory card, bool packable) internal {

        require(!protos[externalID].exists);

        card.exists = true;

        protos[externalID] = card;

        protoCount++;

        emit NewProtoCard(
            externalID, currentSeason, card.god, 
            card.rarity, card.mana, card.attack, 
            card.health, card.cardType, card.tribe, packable
        );

        if (packable) {
            Rarity rarity = card.rarity;
            if (rarity == Rarity.Common) {
                common.push(externalID);
            } else if (rarity == Rarity.Rare) {
                rare.push(externalID);
            } else if (rarity == Rarity.Epic) {
                epic.push(externalID);
            } else if (rarity == Rarity.Legendary) {
                legendary.push(externalID);
            } else if (rarity == Rarity.Mythic) {
                mythic.push(externalID);
            } else {
                require(false);
            }
        }
    }

    function getProto(uint16 id) public view returns(
        bool exists, uint8 god, uint8 season, uint8 cardType, Rarity rarity, uint8 mana, uint8 attack, uint8 health, uint8 tribe
    ) {
        ProtoCard memory proto = protos[id];
        return (
            proto.exists,
            proto.god,
            proto.season,
            proto.cardType,
            proto.rarity,
            proto.mana,
            proto.attack,
            proto.health,
            proto.tribe
        );
    }

    function getRandomCard(Rarity rarity, uint16 random) public view returns (uint16) {
        // modulo bias is fine - creates rarity tiers etc
        // will obviously revert is there are no cards of that type: this is expected - should never happen
        if (rarity == Rarity.Common) {
            return common[random % common.length];
        } else if (rarity == Rarity.Rare) {
            return rare[random % rare.length];
        } else if (rarity == Rarity.Epic) {
            return epic[random % epic.length];
        } else if (rarity == Rarity.Legendary) {
            return legendary[random % legendary.length];
        } else if (rarity == Rarity.Mythic) {
            // make sure a mythic is available
            uint16 id;
            uint64 limit;
            bool set;
            for (uint i = 0; i < mythic.length; i++) {
                id = mythic[(random + i) % mythic.length];
                (limit, set) = getLimit(id);
                if (set && limit > 0){
                    return id;
                }
            }
            // if not, they get a legendary :(
            return legendary[random % legendary.length];
        }
        require(false);
        return 0;
    }

    // can never adjust tradable cards
    // each season gets a 'balancing beta'
    // totally immutable: season, rarity
    function replaceProto(
        uint16 index, uint8 god, uint8 cardType, uint8 mana, uint8 attack, uint8 health, uint8 tribe
    ) public onlyGovernor {
        ProtoCard memory pc = protos[index];
        require(!seasonTradable[pc.season]);
        protos[index] = ProtoCard({
            exists: true,
            god: god,
            season: pc.season,
            cardType: cardType,
            rarity: pc.rarity,
            mana: mana,
            attack: attack,
            health: health,
            tribe: tribe
        });
    }

}

contract MigrationInterface {

    function createCard(address user, uint16 proto, uint16 purity) public returns (uint);

    function getRandomCard(CardProto.Rarity rarity, uint16 random) public view returns (uint16);

    function migrate(uint id) public;

}
contract CardPackFour {

    MigrationInterface public migration;
    uint public creationBlock;

    constructor(MigrationInterface _core) public payable {
        migration = _core;
        creationBlock = 5939061 + 2000; // set to creation block of first contracts + 8 hours for down time
    }

    event Referral(address indexed referrer, uint value, address purchaser);

    /**
    * purchase 'count' of this type of pack
    */
    function purchase(uint16 packCount, address referrer) public payable;

    // store purity and shine as one number to save users gas
    function _getPurity(uint16 randOne, uint16 randTwo) internal pure returns (uint16) {
        if (randOne >= 998) {
            return 3000 + randTwo;
        } else if (randOne >= 988) {
            return 2000 + randTwo;
        } else if (randOne >= 938) {
            return 1000 + randTwo;
        } else {
            return randTwo;
        }
    }

}

contract FirstPheonix is Pausable {

    MigrationInterface core;

    constructor(MigrationInterface _core) public {
        core = _core;
    }

    address[] public approved;

    uint16 PHEONIX_PROTO = 380;

    mapping(address => bool) public claimed;

    function approvePack(address toApprove) public onlyOwner {
        approved.push(toApprove);
    }

    function isApproved(address test) public view returns (bool) {
        for (uint i = 0; i < approved.length; i++) {
            if (approved[i] == test) {
                return true;
            }
        }
        return false;
    }

    // pause once cards become tradable
    function claimPheonix(address user) public returns (bool){

        require(isApproved(msg.sender));

        if (claimed[user] || paused){
            return false;
        }

        claimed[user] = true;

        core.createCard(user, PHEONIX_PROTO, 0);

        return true;
    }

}

contract PresalePackFour is CardPackFour, Pausable {

    CappedVault public vault;

    Purchase[] public purchases;

    function getPurchaseCount() public view returns (uint) {
        return purchases.length;
    }

    struct Purchase {
        uint16 current;
        uint16 count;
        address user;
        uint randomness;
        uint64 commit;
    }

    event PacksPurchased(uint indexed id, address indexed user, uint16 count);
    event PackOpened(uint indexed id, uint16 startIndex, address indexed user, uint[] cardIDs);
    event RandomnessReceived(uint indexed id, address indexed user, uint16 count, uint randomness);
    event Recommit(uint indexed id);

    constructor(MigrationInterface _core, CappedVault _vault) public payable CardPackFour(_core) {
        vault = _vault;
    }

    function basePrice() public returns (uint);
    function getCardDetails(uint16 packIndex, uint8 cardIndex, uint result) public view returns (uint16 proto, uint16 purity);
    
    function packSize() public view returns (uint8) {
        return 5;
    }

    uint16 public perClaim = 15;

    function setPacksPerClaim(uint16 _perClaim) public onlyOwner {
        perClaim = _perClaim;
    }

    function packsPerClaim() public view returns (uint16) {
        return perClaim;
    }

    // start in bytes, length in bytes
    function extract(uint num, uint length, uint start) internal pure returns (uint) {
        return (((1 << (length * 8)) - 1) & (num >> ((start * 8) - 1)));
    }

    function purchaseFor(address user, uint16 packCount, address referrer) whenNotPaused public payable {
        _purchase(user, packCount, referrer);
    }

    function purchase(uint16 packCount, address referrer) whenNotPaused public payable {
        _purchase(msg.sender, packCount, referrer);
    }

    function _purchase(address user, uint16 packCount, address referrer) internal {
        require(packCount > 0);
        require(referrer != user);

        uint price = calculatePrice(basePrice(), packCount);

        require(msg.value >= price);

        Purchase memory p = Purchase({
            user: user,
            count: packCount,
            commit: uint64(block.number),
            randomness: 0,
            current: 0
        });

        uint id = purchases.push(p) - 1;

        emit PacksPurchased(id, user, packCount);

        if (referrer != address(0)) {
            uint commission = price / 10;
            referrer.transfer(commission);
            price -= commission;
            emit Referral(referrer, commission, user);
        }
        
        address(vault).transfer(price);
    }

    // can recommit
    // this gives you more chances
    // if no-one else sends the callback (should never happen)
    // still only get a random extra chance
    function recommit(uint id) public {

        Purchase storage p = purchases[id];

        require(p.randomness == 0);

        require(block.number >= p.commit + 256);

        p.commit = uint64(block.number);

        emit Recommit(id);
    }

    // can be called by anybody
    // can miners withhold blocks --> not really
    // giving up block reward for extra chance --> still really low
    function callback(uint id) public {

        Purchase storage p = purchases[id];

        require(p.randomness == 0);

        // must be within last 256 blocks, otherwise recommit
        require(block.number - 256 < p.commit);

        // can't callback on the original block
        require(uint64(block.number) != p.commit);

        bytes32 bhash = blockhash(p.commit);
        // will get the same on every block
        // only use properties which can't be altered by the user
        uint random = uint(keccak256(abi.encodePacked(bhash, p.user, address(this), p.count)));

        require(uint(bhash) != 0);

        p.randomness = random;

        emit RandomnessReceived(id, p.user, p.count, p.randomness);
    }

    function claim(uint id) public {
        
        Purchase storage p = purchases[id];

        require(canClaim);

        uint16 proto;
        uint16 purity;
        uint16 count = p.count;
        uint result = p.randomness;
        uint8 size = packSize();

        address user = p.user;
        uint16 current = p.current;

        require(result != 0); // have to wait for the callback
        // require(user == msg.sender); // not needed
        require(count > 0);

        uint[] memory ids = new uint[](size);

        uint16 end = current + packsPerClaim() > count ? count : current + packsPerClaim();

        require(end > current);

        for (uint16 i = current; i < end; i++) {
            for (uint8 j = 0; j < size; j++) {
                (proto, purity) = getCardDetails(i, j, result);
                ids[j] = migration.createCard(user, proto, purity);
            }
            emit PackOpened(id, (i * size), user, ids);
        }
        p.current += (end - current);
    }

    function predictPacks(uint id) external view returns (uint16[] protos, uint16[] purities) {

        Purchase memory p = purchases[id];

        uint16 proto;
        uint16 purity;
        uint16 count = p.count;
        uint result = p.randomness;
        uint8 size = packSize();

        purities = new uint16[](size * count);
        protos = new uint16[](size * count);

        for (uint16 i = 0; i < count; i++) {
            for (uint8 j = 0; j < size; j++) {
                (proto, purity) = getCardDetails(i, j, result);
                purities[(i * size) + j] = purity;
                protos[(i * size) + j] = proto;
            }
        }
        return (protos, purities);
    }

    function calculatePrice(uint base, uint16 packCount) public view returns (uint) {
        // roughly 6k blocks per day
        uint difference = block.number - creationBlock;
        uint numDays = difference / 6000;
        if (20 > numDays) {
            return (base - (((20 - numDays) * base) / 100)) * packCount;
        }
        return base * packCount;
    }

    function _getCommonPlusRarity(uint32 rand) internal pure returns (CardProto.Rarity) {
        if (rand == 999999) {
            return CardProto.Rarity.Mythic;
        } else if (rand >= 998345) {
            return CardProto.Rarity.Legendary;
        } else if (rand >= 986765) {
            return CardProto.Rarity.Epic;
        } else if (rand >= 924890) {
            return CardProto.Rarity.Rare;
        } else {
            return CardProto.Rarity.Common;
        }
    }

    function _getRarePlusRarity(uint32 rand) internal pure returns (CardProto.Rarity) {
        if (rand == 999999) {
            return CardProto.Rarity.Mythic;
        } else if (rand >= 981615) {
            return CardProto.Rarity.Legendary;
        } else if (rand >= 852940) {
            return CardProto.Rarity.Epic;
        } else {
            return CardProto.Rarity.Rare;
        } 
    }

    function _getEpicPlusRarity(uint32 rand) internal pure returns (CardProto.Rarity) {
        if (rand == 999999) {
            return CardProto.Rarity.Mythic;
        } else if (rand >= 981615) {
            return CardProto.Rarity.Legendary;
        } else {
            return CardProto.Rarity.Epic;
        }
    }

    function _getLegendaryPlusRarity(uint32 rand) internal pure returns (CardProto.Rarity) {
        if (rand == 999999) {
            return CardProto.Rarity.Mythic;
        } else {
            return CardProto.Rarity.Legendary;
        } 
    }

    bool public canClaim = true;

    function setCanClaim(bool claim) public onlyOwner {
        canClaim = claim;
    }

    function getComponents(
        uint16 i, uint8 j, uint rand
    ) internal returns (
        uint random, uint32 rarityRandom, uint16 purityOne, uint16 purityTwo, uint16 protoRandom
    ) {
        random = uint(keccak256(abi.encodePacked(i, rand, j)));
        rarityRandom = uint32(extract(random, 4, 10) % 1000000);
        purityOne = uint16(extract(random, 2, 4) % 1000);
        purityTwo = uint16(extract(random, 2, 6) % 1000);
        protoRandom = uint16(extract(random, 2, 8) % (2**16-1));
        return (random, rarityRandom, purityOne, purityTwo, protoRandom);
    }

    function withdraw() public onlyOwner {
        owner.transfer(address(this).balance);
    }

}

contract PackFourMultiplier is PresalePackFour {

    address[] public packs;
    uint16 public multiplier = 3;
    FirstPheonix pheonix;
    PreviousInterface old;

    uint16 public packLimit = 5;

    constructor(PreviousInterface _old, address[] _packs, MigrationInterface _core, CappedVault vault, FirstPheonix _pheonix) 
        public PresalePackFour(_core, vault) 
    {
        packs = _packs;
        pheonix = _pheonix;
        old = _old;
    }

    function getCardCount() internal view returns (uint) {
        return old.totalSupply() + old.burnCount();
    }

    function isPriorPack(address test) public view returns(bool) {
        for (uint i = 0; i < packs.length; i++) {
            if (packs[i] == test) {
                return true;
            }
        }
        return false;
    }

    event Status(uint before, uint aft);

    function claimMultiple(address pack, uint purchaseID) public returns (uint16, address) {

        require(isPriorPack(pack));

        uint length = getCardCount();

        PresalePackFour(pack).claim(purchaseID);

        uint lengthAfter = getCardCount();

        require(lengthAfter > length);

        uint16 cardDifference = uint16(lengthAfter - length);

        require(cardDifference % 5 == 0);

        uint16 packCount = cardDifference / 5;

        uint16 extra = packCount * multiplier;

        address lastCardOwner = old.ownerOf(lengthAfter - 1);

        Purchase memory p = Purchase({
            user: lastCardOwner,
            count: extra,
            commit: uint64(block.number),
            randomness: 0,
            current: 0
        });

        uint id = purchases.push(p) - 1;

        emit PacksPurchased(id, lastCardOwner, extra);

        // try to give them a first pheonix
        pheonix.claimPheonix(lastCardOwner);

        emit Status(length, lengthAfter);


        if (packCount <= packLimit) {
            for (uint i = 0; i < cardDifference; i++) {
                migration.migrate(lengthAfter - 1 - i);
            }
        }

        return (extra, lastCardOwner);
    }

    function setPackLimit(uint16 limit) public onlyOwner {
        packLimit = limit;
    }


}

contract LegendaryPackFour is PackFourMultiplier {
    
    function basePrice() public returns (uint) {
        return 112 finney;
    }

    TournamentPass public tournament;

    constructor(PreviousInterface _old, address[] _packs, MigrationInterface _core, CappedVault vault, TournamentPass _tournament, FirstPheonix _pheonix) 
        public PackFourMultiplier(_old, _packs, _core, vault, _pheonix) {
        
        tournament = _tournament;
    }

    function purchase(uint16 packCount, address referrer) public payable {
        super.purchase(packCount, referrer);
        tournament.mint(msg.sender, packCount);
    }

    function claimMultiple(address pack, uint purchaseID) public returns (uint16, address) {
        uint16 extra;
        address user;
        (extra, user) = super.claimMultiple(pack, purchaseID);
        tournament.mint(user, extra);
    }

    function getCardDetails(uint16 packIndex, uint8 cardIndex, uint result) public view returns (uint16 proto, uint16 purity) {
        uint random;
        uint32 rarityRandom;
        uint16 protoRandom;
        uint16 purityOne;
        uint16 purityTwo;

        CardProto.Rarity rarity;

        (random, rarityRandom, purityOne, purityTwo, protoRandom) = getComponents(packIndex, cardIndex, result);

        if (cardIndex == 4) {
            rarity = _getLegendaryPlusRarity(rarityRandom);
        } else if (cardIndex == 3) {
            rarity = _getRarePlusRarity(rarityRandom);
        } else {
            rarity = _getCommonPlusRarity(rarityRandom);
        }

        purity = _getPurity(purityOne, purityTwo);
    
        proto = migration.getRandomCard(rarity, protoRandom);

        return (proto, purity);
    } 
    
}

    Contract ABI  
[{"constant":true,"inputs":[],"name":"packSize","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_owner","type":"address"}],"name":"setOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"migration","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"creationBlock","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"multiplier","outputs":[{"name":"","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"tournament","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"id","type":"uint256"}],"name":"claim","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"packCount","type":"uint16"},{"name":"referrer","type":"address"}],"name":"purchase","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[],"name":"withdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"id","type":"uint256"}],"name":"recommit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"perClaim","outputs":[{"name":"","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"pack","type":"address"},{"name":"purchaseID","type":"uint256"}],"name":"claimMultiple","outputs":[{"name":"","type":"uint16"},{"name":"","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"canClaim","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"purchases","outputs":[{"name":"current","type":"uint16"},{"name":"count","type":"uint16"},{"name":"user","type":"address"},{"name":"randomness","type":"uint256"},{"name":"commit","type":"uint64"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"packsPerClaim","outputs":[{"name":"","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_perClaim","type":"uint16"}],"name":"setPacksPerClaim","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"user","type":"address"},{"name":"packCount","type":"uint16"},{"name":"referrer","type":"address"}],"name":"purchaseFor","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"packs","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"test","type":"address"}],"name":"isPriorPack","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getPurchaseCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"packIndex","type":"uint16"},{"name":"cardIndex","type":"uint8"},{"name":"result","type":"uint256"}],"name":"getCardDetails","outputs":[{"name":"proto","type":"uint16"},{"name":"purity","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"claim","type":"bool"}],"name":"setCanClaim","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"basePrice","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"id","type":"uint256"}],"name":"predictPacks","outputs":[{"name":"protos","type":"uint16[]"},{"name":"purities","type":"uint16[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"limit","type":"uint16"}],"name":"setPackLimit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"base","type":"uint256"},{"name":"packCount","type":"uint16"}],"name":"calculatePrice","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"packLimit","outputs":[{"name":"","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"vault","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"id","type":"uint256"}],"name":"callback","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"_old","type":"address"},{"name":"_packs","type":"address[]"},{"name":"_core","type":"address"},{"name":"vault","type":"address"},{"name":"_tournament","type":"address"},{"name":"_pheonix","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"before","type":"uint256"},{"indexed":false,"name":"aft","type":"uint256"}],"name":"Status","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"id","type":"uint256"},{"indexed":true,"name":"user","type":"address"},{"indexed":false,"name":"count","type":"uint16"}],"name":"PacksPurchased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"id","type":"uint256"},{"indexed":false,"name":"startIndex","type":"uint16"},{"indexed":true,"name":"user","type":"address"},{"indexed":false,"name":"cardIDs","type":"uint256[]"}],"name":"PackOpened","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"id","type":"uint256"},{"indexed":true,"name":"user","type":"address"},{"indexed":false,"name":"count","type":"uint16"},{"indexed":false,"name":"randomness","type":"uint256"}],"name":"RandomnessReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"id","type":"uint256"}],"name":"Recommit","type":"event"},{"anonymous":false,"inputs":[],"name":"Pause","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpause","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"referrer","type":"address"},{"indexed":false,"name":"value","type":"uint256"},{"indexed":false,"name":"purchaser","type":"address"}],"name":"Referral","type":"event"}]

  Contract Creation Code Switch To Opcodes View
60806040526002805460a060020a60ff02191690556005805462ff00001961ffff19918216600f17166201000017909155600780549091166003179055600880547405000000000000000000000000000000000000000060a060020a61ffff02199091161790553480156200007357600080fd5b50604051620021dc380380620021dc8339810160409081528151602080840151928401516060850151608086015160a087015160008054600160a060020a03808716600160a060020a031992831617909255625aa74560015560028054821633179055600380549286169290911691909117905595909601805194969095929491939092918791879187918791869162000113916006918701906200016f565b50600780546201000060b060020a03191662010000600160a060020a039384160217905560088054600160a060020a03199081169683169690961790556009805490951696169590951790925550620002039650505050505050565b828054828255906000526020600020908101928215620001c7579160200282015b82811115620001c75782518254600160a060020a031916600160a060020a0390911617825560209092019160019091019062000190565b50620001d5929150620001d9565b5090565b6200020091905b80821115620001d5578054600160a060020a0319168155600101620001e0565b90565b611fc980620002136000396000f3006080604052600436106101875763ffffffff60e060020a60003504166306a628d4811461018c57806313af4035146101b75780631705a3bd146101da578063176345141461020b5780631b3ed722146102325780631e0197e21461025e578063379607f514610273578063396c82281461028b5780633ccfd60b146102a65780633f4ba83a146102bb57806345d63b66146102d05780635c975abb146102e85780635f9602e8146103115780636bc3e4a8146103265780636dc7a627146103705780638392fe31146103855780638456cb59146103e15780638be4339b146103f65780638da5cb5b1461040b5780639a1f6a0f14610420578063b01d5b631461043c578063b84c13921461045e578063bd6cac4f14610476578063becd283f14610497578063c2f0bb29146104ac578063c503101e146104f2578063c7876ea41461050c578063ca2bf04714610521578063d42a5011146105d2578063e3f7faaf146105ee578063eb1098b81461060d578063fbfa77cf14610622578063ff585caf14610637575b600080fd5b34801561019857600080fd5b506101a161064f565b6040805160ff9092168252519081900360200190f35b3480156101c357600080fd5b506101d8600160a060020a0360043516610654565b005b3480156101e657600080fd5b506101ef61069a565b60408051600160a060020a039092168252519081900360200190f35b34801561021757600080fd5b506102206106a9565b60408051918252519081900360200190f35b34801561023e57600080fd5b506102476106af565b6040805161ffff9092168252519081900360200190f35b34801561026a57600080fd5b506101ef6106b9565b34801561027f57600080fd5b506101d86004356106c8565b6101d861ffff60043516600160a060020a03602435166109ba565b3480156102b257600080fd5b506101d8610a64565b3480156102c757600080fd5b506101d8610ab8565b3480156102dc57600080fd5b506101d8600435610b30565b3480156102f457600080fd5b506102fd610bd4565b604080519115158252519081900360200190f35b34801561031d57600080fd5b50610247610be4565b34801561033257600080fd5b5061034a600160a060020a0360043516602435610bee565b6040805161ffff9093168352600160a060020a0390911660208301528051918290030190f35b34801561037c57600080fd5b506102fd610cac565b34801561039157600080fd5b5061039d600435610cbb565b6040805161ffff9687168152949095166020850152600160a060020a0390921683850152606083015267ffffffffffffffff16608082015290519081900360a00190f35b3480156103ed57600080fd5b506101d8610d17565b34801561040257600080fd5b50610247610d94565b34801561041757600080fd5b506101ef610d9e565b34801561042c57600080fd5b506101d861ffff60043516610dad565b6101d8600160a060020a0360043581169061ffff602435169060443516610ddc565b34801561046a57600080fd5b506101ef600435610e03565b34801561048257600080fd5b506102fd600160a060020a0360043516610e2b565b3480156104a357600080fd5b50610220610e89565b3480156104b857600080fd5b506104d161ffff6004351660ff60243516604435610e8f565b6040805161ffff938416815291909216602082015281519081900390910190f35b3480156104fe57600080fd5b506101d86004351515610fbe565b34801561051857600080fd5b50610220610ff1565b34801561052d57600080fd5b50610539600435610ffd565b604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561057d578181015183820152602001610565565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156105bc5781810151838201526020016105a4565b5050505090500194505050505060405180910390f35b3480156105de57600080fd5b506101d861ffff600435166111c2565b3480156105fa57600080fd5b5061022060043561ffff6024351661120c565b34801561061957600080fd5b5061024761124d565b34801561062e57600080fd5b506101ef61125e565b34801561064357600080fd5b506101d860043561126d565b600590565b600254600160a060020a0316331461066b57600080fd5b6002805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600054600160a060020a031681565b60015481565b60075461ffff1681565b600954600160a060020a031681565b6000806000806000806000806060600080600060048d8154811015156106ea57fe5b90600052602060002090600302019b50600560029054906101000a900460ff16151561071557600080fd5b8b5460018d01546201000090910461ffff169950975061073361064f565b8c54909750600160a060020a03640100000000820416965061ffff16945087151561075d57600080fd5b600061ffff8a161161076e57600080fd5b8660ff1660405190808252806020026020018201604052801561079b578160200160208202803883390190505b5093508861ffff166107ab610d94565b860161ffff16116107c5576107be610d94565b85016107c7565b885b925061ffff808616908416116107dc57600080fd5b8491505b8261ffff168261ffff161015610993575060005b8660ff168160ff1610156108f35761080d82828a610e8f565b809b50819c5050506000809054906101000a9004600160a060020a0316600160a060020a031663fb36eba1878d8d6040518463ffffffff1660e060020a0281526004018084600160a060020a0316600160a060020a031681526020018361ffff1661ffff1681526020018261ffff1661ffff1681526020019350505050602060405180830381600087803b1580156108a457600080fd5b505af11580156108b8573d6000803e3d6000fd5b505050506040513d60208110156108ce57600080fd5b50518451859060ff84169081106108e157fe5b602090810290910101526001016107f4565b85600160a060020a03168d7f69ac64af86d3ef40c9def928534f6a6a9e12d85ec3af2948bd66b802afcc10468960ff16850287604051808361ffff1661ffff16815260200180602001828103825283818151815260200191508051906020019060200280838360005b8381101561097457818101518382015260200161095c565b50505050905001935050505060405180910390a36001909101906107e0565b5050895461ffff1981169390910361ffff9182160116919091179097555050505050505050565b6109c48282611442565b600954604080517f40c10f1900000000000000000000000000000000000000000000000000000000815233600482015261ffff851660248201529051600160a060020a03909216916340c10f19916044808201926020929091908290030181600087803b158015610a3457600080fd5b505af1158015610a48573d6000803e3d6000fd5b505050506040513d6020811015610a5e57600080fd5b50505050565b600254600160a060020a03163314610a7b57600080fd5b600254604051600160a060020a0390911690303180156108fc02916000818181858888f19350505050158015610ab5573d6000803e3d6000fd5b50565b600254600160a060020a03163314610acf57600080fd5b60025460a060020a900460ff161515610ae757600080fd5b6002805474ff0000000000000000000000000000000000000000191690556040517f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3390600090a1565b6000600482815481101515610b4157fe5b9060005260206000209060030201905080600101546000141515610b6457600080fd5b600281015467ffffffffffffffff9081166101000116431015610b8657600080fd5b60028101805467ffffffffffffffff19164367ffffffffffffffff1617905560405182907f29ef13d2827ff333d3fde4646988c3a7db16de1210f0c0b613fd0ac9773e4e7b90600090a25050565b60025460a060020a900460ff1681565b60055461ffff1681565b600080600080610bfe8686611468565b600954604080517f40c10f19000000000000000000000000000000000000000000000000000000008152600160a060020a03808516600483015261ffff86166024830152915194965092945016916340c10f19916044808201926020929091908290030181600087803b158015610c7457600080fd5b505af1158015610c88573d6000803e3d6000fd5b505050506040513d6020811015610c9e57600080fd5b509396929550919350505050565b60055462010000900460ff1681565b6004805482908110610cc957fe5b600091825260209091206003909102018054600182015460029092015461ffff80831694506201000083041692640100000000909204600160a060020a0316919067ffffffffffffffff1685565b600254600160a060020a03163314610d2e57600080fd5b60025460a060020a900460ff1615610d4557600080fd5b6002805474ff0000000000000000000000000000000000000000191660a060020a1790556040517f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62590600090a1565b60055461ffff1690565b600254600160a060020a031681565b600254600160a060020a03163314610dc457600080fd5b6005805461ffff191661ffff92909216919091179055565b60025460a060020a900460ff1615610df357600080fd5b610dfe8383836118ef565b505050565b6006805482908110610e1157fe5b600091825260209091200154600160a060020a0316905081565b6000805b600654811015610e7e5782600160a060020a0316600682815481101515610e5257fe5b600091825260209091200154600160a060020a03161415610e765760019150610e83565b600101610e2f565b600091505b50919050565b60045490565b600080600080600080600080610ea68b8b8b611b96565b9399509197509195509093509150600460ff8b161415610ed057610ec985611cfd565b9050610ef1565b8960ff1660031415610ee557610ec985611d21565b610eee85611d74565b90505b610efb8383611ddf565b6000546040517fcaa19168000000000000000000000000000000000000000000000000000000008152919850600160a060020a03169063caa19168908390879060049081019081908490811115610f4e57fe5b60ff1681526020018261ffff1661ffff16815260200192505050602060405180830381600087803b158015610f8257600080fd5b505af1158015610f96573d6000803e3d6000fd5b505050506040513d6020811015610fac57600080fd5b50519750505050505050935093915050565b600254600160a060020a03163314610fd557600080fd5b60058054911515620100000262ff000019909216919091179055565b67018de76816d8000090565b606080611008611f6f565b600080600080600080600060048b81548110151561102257fe5b60009182526020918290206040805160a0810182526003909302909101805461ffff808216855262010000820416948401859052600160a060020a03640100000000909104169183019190915260018101546060830181905260029091015467ffffffffffffffff16608083015290995090955093506110a061064f565b9250848360ff160261ffff166040519080825280602002602001820160405280156110d5578160200160208202803883390190505b509850848360ff160261ffff1660405190808252806020026020018201604052801561110b578160200160208202803883390190505b509950600091505b8461ffff168261ffff1610156111b5575060005b8260ff168160ff1610156111aa57611140828286610e8f565b8a51919850965086908a9061ffff60ff8781168702908616011690811061116357fe5b61ffff928316602091820290920101528a5188918c9160ff87811687029086160190911690811061119057fe5b61ffff909216602092830290910190910152600101611127565b600190910190611113565b5050505050505050915091565b600254600160a060020a031633146111d957600080fd5b6008805461ffff90921660a060020a0275ffff000000000000000000000000000000000000000019909216919091179055565b60015460009043036117708104601481101561123b5761ffff8416606460148390038702048603029250611245565b8361ffff16850292505b505092915050565b60085460a060020a900461ffff1681565b600354600160a060020a031681565b600080600060048481548110151561128157fe5b90600052602060002090600302019250826001015460001415156112a457600080fd5b600283015467ffffffffffffffff1660ff194301106112c257600080fd5b60028301544367ffffffffffffffff908116911614156112e157600080fd5b600283015483546040805167ffffffffffffffff9093164060208085018290526401000000008404600160a060020a03166c0100000000000000000000000090810286850152300260548601526201000090930461ffff167e010000000000000000000000000000000000000000000000000000000000000260688501528151808503604a018152606a90940191829052835190955090918291908401908083835b602083106113a25780518252601f199092019160209182019101611383565b5181516020939093036101000a600019018019909116921691909117905260405192018290039091209350505082151590506113dd57600080fd5b6001830181905582546040805162010000830461ffff168152602081018490528151640100000000909304600160a060020a03169287927fedb5ce4012b6e9c5904afa2ffad9811d5c2e91e6bca8914cf7e3ffc28e630c57928290030190a350505050565b60025460a060020a900460ff161561145957600080fd5b6114643383836118ef565b5050565b60008060008060008060008061147c611f6f565b6000806114888d610e2b565b151561149357600080fd5b61149b611e32565b98508c600160a060020a031663379607f58d6040518263ffffffff1660e060020a02815260040180828152602001915050600060405180830381600087803b1580156114e657600080fd5b505af11580156114fa573d6000803e3d6000fd5b50505050611506611e32565b975088881161151457600080fd5b8888039650600561ffff88160661ffff161561152f57600080fd5b600561ffff8816600754600854604080517f6352211e0000000000000000000000000000000000000000000000000000000081526000198e016004820152905194909304995061ffff90911689029750600160a060020a031691636352211e916024808201926020929091908290030181600087803b1580156115b157600080fd5b505af11580156115c5573d6000803e3d6000fd5b505050506040513d60208110156115db57600080fd5b50516040805160a081018252600080825261ffff8981166020848101828152600160a060020a038089168789018181526060890188815267ffffffffffffffff43811660808c01908152600480546001810182559b528b5160038c027f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b81018054995196519098166401000000000277ffffffffffffffffffffffffffffffffffffffff0000000019968d16620100000263ffff00001993909d1661ffff19909a1699909917919091169a909a17939093169590951790935591517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19c87015590517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19d90950180549590921667ffffffffffffffff19909516949094179055855191825294519599509297509095509285927f861fd6f8fe14603acc05fa404f8cca86371619cac8a65a92edf687f81b9bafbd928290030190a3600754604080517ff88218e0000000000000000000000000000000000000000000000000000000008152600160a060020a0387811660048301529151620100009093049091169163f88218e0916024808201926020929091908290030181600087803b1580156117c357600080fd5b505af11580156117d7573d6000803e3d6000fd5b505050506040513d60208110156117ed57600080fd5b5050604080518a8152602081018a905281517f31a1adb447f9b6b89f24bf104f0b7a06975ad9f35670dbfaf7ce29190ec54762929181900390910190a160085461ffff60a060020a9091048116908716116118dc575060005b8661ffff168110156118dc5760008054604080517f454b0608000000000000000000000000000000000000000000000000000000008152848c036000190160048201529051600160a060020a039092169263454b06089260248084019382900301818387803b1580156118b857600080fd5b505af11580156118cc573d6000803e3d6000fd5b5050600190920191506118469050565b50929b919a509098505050505050505050565b60006118f9611f6f565b60008061ffff8616811061190c57600080fd5b600160a060020a03858116908816141561192557600080fd5b611936611930610ff1565b8761120c565b93503484111561194557600080fd5b6040805160a081018252600080825261ffff8981166020808501828152600160a060020a03808f168789018181526060890188815267ffffffffffffffff43811660808c01908152600480546001810182559b528b5160038c027f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b81018054995196519098166401000000000277ffffffffffffffffffffffffffffffffffffffff0000000019968d16620100000263ffff00001993909d1661ffff19909a1699909917919091169a909a17939093169590951790935591517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19c87015590517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19d90950180549590921667ffffffffffffffff19909516949094179055855191825294519397509195509285927f861fd6f8fe14603acc05fa404f8cca86371619cac8a65a92edf687f81b9bafbd9281900390910190a3600160a060020a03851615611b525750604051600a840490600160a060020a0386169082156108fc029083906000818181858888f19350505050158015611b06573d6000803e3d6000fd5b5060408051828152600160a060020a03898116602083015282519684900396908816927f13aa7090696e2a1d666cfc6046f2f72f1c4e0290649b47bab28d1b370ad73783928290030190a25b600354604051600160a060020a039091169085156108fc029086906000818181858888f19350505050158015611b8c573d6000803e3d6000fd5b5050505050505050565b6000806000806000878688604051602001808461ffff1661ffff167e010000000000000000000000000000000000000000000000000000000000000281526002018381526020018260ff1660ff167f010000000000000000000000000000000000000000000000000000000000000002815260010193505050506040516020818303038152906040526040518082805190602001908083835b60208310611c4e5780518252601f199092019160209182019101611c2f565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020600190049450620f4240611c92866004600a611f4f565b811515611c9b57fe5b0693506103e8611cae8660026004611f4f565b811515611cb757fe5b0692506103e8611cca8660026006611f4f565b811515611cd357fe5b06915061ffff611ce68660026008611f4f565b811515611cef57fe5b069050939792965093509350565b60008163ffffffff16620f423f1415611d1857506004611d1c565b5060035b919050565b60008163ffffffff16620f423f1415611d3c57506004611d1c565b620efa6f63ffffffff831610611d5457506003611d1c565b620d03cc63ffffffff831610611d6c57506002611d1c565b506001611d1c565b60008163ffffffff16620f423f1415611d8f57506004611d1c565b620f3bc963ffffffff831610611da757506003611d1c565b620f0e8d63ffffffff831610611dbf57506002611d1c565b620e1cda63ffffffff831610611dd757506001611d1c565b506000611d1c565b60006103e661ffff841610611df95750610bb88101611e2c565b6103dc61ffff841610611e1157506107d08101611e2c565b6103aa61ffff841610611e2957506103e88101611e2c565b50805b92915050565b600854604080517f524773ce0000000000000000000000000000000000000000000000000000000081529051600092600160a060020a03169163524773ce91600480830192602092919082900301818787803b158015611e9157600080fd5b505af1158015611ea5573d6000803e3d6000fd5b505050506040513d6020811015611ebb57600080fd5b5051600854604080517f18160ddd0000000000000000000000000000000000000000000000000000000081529051600160a060020a03909216916318160ddd916004808201926020929091908290030181600087803b158015611f1d57600080fd5b505af1158015611f31573d6000803e3d6000fd5b505050506040513d6020811015611f4757600080fd5b505101905090565b6008828102600290810a60001990810192840201900a8404169392505050565b6040805160a081018252600080825260208201819052918101829052606081018290526080810191909152905600a165627a7a723058202bb0e18af9d3c4ac3fe49e0c26b611e7ba7ef487404bab268739ab50d17908fe0029000000000000000000000000512fbd15bde6570ff09e4438af27ede60402451500000000000000000000000000000000000000000000000000000000000000c00000000000000000000000006ebeaf8e8e946f0716e6533a6f2cefc83f60e8ab00000000000000000000000091b9d2835ad914bc1dcfe09bd1816febd04fd68900000000000000000000000022365168c8705e95b2d08876c23a8c13e3ad72e2000000000000000000000000657c8982d63f58ddd6a54c75591a572d4180cec800000000000000000000000000000000000000000000000000000000000000020000000000000000000000006c5dc1dcda3d309a6e919e6d0965f197e0fc19130000000000000000000000005789e2b5460cae9329d93a78511e2ac49f98a1f6

    Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000512fbd15bde6570ff09e4438af27ede60402451500000000000000000000000000000000000000000000000000000000000000c00000000000000000000000006ebeaf8e8e946f0716e6533a6f2cefc83f60e8ab00000000000000000000000091b9d2835ad914bc1dcfe09bd1816febd04fd68900000000000000000000000022365168c8705e95b2d08876c23a8c13e3ad72e2000000000000000000000000657c8982d63f58ddd6a54c75591a572d4180cec800000000000000000000000000000000000000000000000000000000000000020000000000000000000000006c5dc1dcda3d309a6e919e6d0965f197e0fc19130000000000000000000000005789e2b5460cae9329d93a78511e2ac49f98a1f6

-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 000000000000000000000000512fbd15bde6570ff09e4438af27ede604024515
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000006ebeaf8e8e946f0716e6533a6f2cefc83f60e8ab
Arg [3] : 00000000000000000000000091b9d2835ad914bc1dcfe09bd1816febd04fd689
Arg [4] : 00000000000000000000000022365168c8705e95b2d08876c23a8c13e3ad72e2
Arg [5] : 000000000000000000000000657c8982d63f58ddd6a54c75591a572d4180cec8
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [7] : 0000000000000000000000006c5dc1dcda3d309a6e919e6d0965f197e0fc1913
Arg [8] : 0000000000000000000000005789e2b5460cae9329d93a78511e2ac49f98a1f6


   Swarm Source:
bzzr://2bb0e18af9d3c4ac3fe49e0c26b611e7ba7ef487404bab268739ab50d17908fe

 

View All
Block Age transaction Difficulty GasUsed Reward
View All
Block Age UncleNumber Difficulty GasUsed Reward
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.