Contract 0xc47d7d42e44b2e04c83a45cf45898e597a0c2311

 

TxHash Block Age From To Value [TxFee]
0x73ffeaa4d21c95c6c0425c3a21042c5f3c7692e5aa9d67c17a146f0a91b338c474078281 hr 11 mins ago0xc00791bccc1b67e30a97d78958aa4aa6e4a3e2c5 IN  GU_LegendaryPackFour0 Ether0.005472753
0xcbc5e8f0747c59200b8ec9f3acfdfe6551f89b4163e884f9dc2782e702c4bbcd74078011 hr 17 mins ago0x276ce98508726e41695fbf9ee47d418002a3e940 IN  GU_LegendaryPackFour0 Ether0.001131992
0x22256adddf2a2feeb33010dd23c45352a248687e641dd06facdece73a5de920974077981 hr 17 mins ago0xaa800178c6a91af1d3af1b756ec1489bc1cb79fc IN  GU_LegendaryPackFour0 Ether0.001131992
0x25c014035592283d26abf4ab8f068d7898b7f41045e9ce2ae6b9614b7ef794d374071223 hrs 44 mins ago0xc00791bccc1b67e30a97d78958aa4aa6e4a3e2c5 IN  GU_LegendaryPackFour0 Ether0.004383692
0xf822312083ac47cfb87bb75829208a93d1fb51a77a8b76dcc837976e009006b774065135 hrs 57 mins ago0xc8b6c07dc3fccf30781abc0ca6971793ab04946e IN  GU_LegendaryPackFour0 Ether0.00011488
0x1d808caad1be748fcb634c8b17d15be4238f894e8570a28ab0e2848e9a36672174065135 hrs 57 mins ago0xecd622b8fd7439baaa09c48e112c438893496f49 IN  GU_LegendaryPackFour0 Ether0.000206784
0x1f82696d060c3ca927eaaefcbab03a76d815aa1a7fb529625ea452e1097bd5dd74065135 hrs 57 mins ago0x2f07cfa7cf7e56cb525586adbfa2f983160810ea IN  GU_LegendaryPackFour0 Ether0.000423783
0x526c2cfa49295cfbec54a3ec24dac9c0fa959bf0dec59205b91cc958fac8e82e74065105 hrs 57 mins ago0x0985224a811e65c235dbf4a2c2117712aabe4e39 IN  GU_LegendaryPackFour0.112 Ether0.001038026
0xf3bbb71ab7e4f64c7e21984470f66a26a81f8895fd32b8a77c5529dc87df45ba74061117 hrs 33 mins ago0xf6830759e8d0a10ac71bb61a39238877793f4983 IN  GU_LegendaryPackFour0 Ether0.000183808
0x1b99c00238d096d6e369e8ab1df01cc7a298be2028ab0abc334050ea7d049bb774061117 hrs 33 mins ago0xf98d98e65ff508b10132ab647f90eb290f907084 IN  GU_LegendaryPackFour0 Ether0.000183808
0x2c795380e9fdf2c3e3c72982f7b88b0c56973cf9f13a364a1fa1bc53e0f0c14274061117 hrs 33 mins ago0x45a0f916e11cbff1f002c6f4caead6ee9982b00c IN  GU_LegendaryPackFour0 Ether0.000183808
0x8cfb531fd851088f284ebffd563b819b53fccd81c6704636818550727e54d23874061097 hrs 34 mins ago0xff92938f77b287e16a891507d288e729b9f8c465 IN  GU_LegendaryPackFour0 Ether0.000376696
0xc733d290fce7924221477d3579a91e0d7e964312605ea05a6cab81c28ef0ac1b74061067 hrs 35 mins ago0x1665e27eced76a256710513605781b28e380bab6 IN  GU_LegendaryPackFour0.112 Ether0.001321124
0x6a79b11bf618842d6c13b9a445f002760609ff1106f353222df7deb08216218674056429 hrs 22 mins ago0xdaa58bdbc0268ae0caa1b134ed2ae9a905d0bd9a IN  GU_LegendaryPackFour0 Ether0.000329609
0xa31b99a35323da2428398be964816dca695edbc6d498d1dd34dc9948ce18c1d674056409 hrs 23 mins ago0x23b2bcae8dec395afd931f49ea8387937e515ca1 IN  GU_LegendaryPackFour0.672 Ether0.000377464
0x15eceea79821d756c0db5dac8577730b878285d6926b2dc8ba17b944f73689a2740485912 hrs 15 mins ago0x09bbf4e312c1aabe80951dd8b11889fe8eaac57b IN  GU_LegendaryPackFour0 Ether0.000376696
0x7afef5f4af144967a431a0121ddca9908e306e30d580812d054f686d43c7215e740485712 hrs 16 mins ago0xeb38a654c85464c6a9d8c69abb628676658e4676 IN  GU_LegendaryPackFour0 Ether0.000091904
0x1bcf6363e84463b196f84ac1d1b25d29cf90e93e8849d39b41a393bb52579f6e740485712 hrs 16 mins ago0xdef858b4d0dbe8bd5156e9154399aec4c92c3c84 IN  GU_LegendaryPackFour0 Ether0.000091904
0xf66b2fca78f8925eec6c94722f0d0a9661c1324741a0589e3baa565aa68fa390740485712 hrs 16 mins ago0xb4e88af27ad8eb4d86251e718fdda92a2a6ab5bb IN  GU_LegendaryPackFour0 Ether0.000091904
0x7e9e2896838aabe7dec55460ab2590a770e751b00cf23972b3ff9f284534101f740485612 hrs 16 mins ago0x8e98bf376a0de6e08bbfaa90d7146f3f1532f005 IN  GU_LegendaryPackFour0 Ether0.000091904
0x274327ea24d2ee2b9cbcc6c0ad723c2cc97181e41608e80787bd8e5e720b1b4e740485612 hrs 16 mins ago0xf6830759e8d0a10ac71bb61a39238877793f4983 IN  GU_LegendaryPackFour0 Ether0.000091904
0xb40c4b2e52d484af8533d39eea9b6c2a56160cbe9d9053dae74cf48abd73635b740485612 hrs 16 mins ago0x8b5272431bb368e77d381eaa1072778dae8761b5 IN  GU_LegendaryPackFour0 Ether0.000091904
0xc557c6f87da80da201197fcb5a0a364db21834fffeeae27f554043132ca33f4d740485612 hrs 16 mins ago0x0d8bd1369dab2fd8e39d0ec8a9fd54865b764885 IN  GU_LegendaryPackFour0 Ether0.0003814047
0x995ac62a89f9566bea48b7d95650a33b1d4def328ebbf276422329677b13b577740485512 hrs 16 mins ago0x7e8fb14c49ddf616d53aa1a6fda8b47e91ee9cd5 IN  GU_LegendaryPackFour0 Ether0.0001861056
0x4e5f70b0db8924b7184127bab30c1f38ab9eb5ab772d007a679cacc8e970631e740485512 hrs 16 mins ago0xcea8da439589f6cd4a2d07e8fec9dacb803a2b87 IN  GU_LegendaryPackFour0.112 Ether0.00105031
[ Download CSV Export 

Latest 25 internal transaction, Click here to view more Internal Transactions as a result of Contract Execution

Parent TxHash Block Age From To Value
0x526c2cfa49295cfbec54a3ec24dac9c0fa959bf0dec59205b91cc958fac8e82e74065105 hrs 57 mins ago0xc47d7d42e44b2e04c83a45cf45898e597a0c23110x91b9d2835ad914bc1dcfe09bd1816febd04fd6890.112 Ether
0xc733d290fce7924221477d3579a91e0d7e964312605ea05a6cab81c28ef0ac1b74061067 hrs 35 mins ago0xc47d7d42e44b2e04c83a45cf45898e597a0c23110x91b9d2835ad914bc1dcfe09bd1816febd04fd6890.112 Ether
0xa31b99a35323da2428398be964816dca695edbc6d498d1dd34dc9948ce18c1d674056409 hrs 23 mins ago0xc47d7d42e44b2e04c83a45cf45898e597a0c23110x91b9d2835ad914bc1dcfe09bd1816febd04fd6890.672 Ether
0x4e5f70b0db8924b7184127bab30c1f38ab9eb5ab772d007a679cacc8e970631e740485512 hrs 16 mins ago0xc47d7d42e44b2e04c83a45cf45898e597a0c23110x91b9d2835ad914bc1dcfe09bd1816febd04fd6890.1008 Ether
0x4e5f70b0db8924b7184127bab30c1f38ab9eb5ab772d007a679cacc8e970631e740485512 hrs 16 mins ago0xc47d7d42e44b2e04c83a45cf45898e597a0c23110x013ec57d1237e7727f818b1a35e3506f754304e40.0112 Ether
0xd676bfcff1438af85de4f53ecb9b17939217f2867ee1529b49d2ec1aa43138be740485412 hrs 17 mins ago0xc47d7d42e44b2e04c83a45cf45898e597a0c23110x91b9d2835ad914bc1dcfe09bd1816febd04fd6890.1008 Ether
0xd676bfcff1438af85de4f53ecb9b17939217f2867ee1529b49d2ec1aa43138be740485412 hrs 17 mins ago0xc47d7d42e44b2e04c83a45cf45898e597a0c23110x013ec57d1237e7727f818b1a35e3506f754304e40.0112 Ether
0xd4cb3df3a2188e94c334857d50dc606a7453e38b52058518ba18346853aada96740485112 hrs 17 mins ago0xc47d7d42e44b2e04c83a45cf45898e597a0c23110x91b9d2835ad914bc1dcfe09bd1816febd04fd6890.1008 Ether
0xd4cb3df3a2188e94c334857d50dc606a7453e38b52058518ba18346853aada96740485112 hrs 17 mins ago0xc47d7d42e44b2e04c83a45cf45898e597a0c23110x013ec57d1237e7727f818b1a35e3506f754304e40.0112 Ether
0x3f772476e8444f9dfa66189a8219231d12f92cabcae45f5479ab6fab05e54a8e740484812 hrs 18 mins ago0xc47d7d42e44b2e04c83a45cf45898e597a0c23110x91b9d2835ad914bc1dcfe09bd1816febd04fd6890.1008 Ether
0x3f772476e8444f9dfa66189a8219231d12f92cabcae45f5479ab6fab05e54a8e740484812 hrs 18 mins ago0xc47d7d42e44b2e04c83a45cf45898e597a0c23110x013ec57d1237e7727f818b1a35e3506f754304e40.0112 Ether
0xa38a707fc5b0be07b48f904c9f4ac5bc3ce28c9abdf4e40a7592b364116d0e53740478712 hrs 32 mins ago0xc47d7d42e44b2e04c83a45cf45898e597a0c23110x91b9d2835ad914bc1dcfe09bd1816febd04fd6890.112 Ether
0xee8641139fdc3da23c2fe9246fd93ae14bd0068e75413b98cd42952783d8961e740432614 hrs 15 mins ago0xc47d7d42e44b2e04c83a45cf45898e597a0c23110x91b9d2835ad914bc1dcfe09bd1816febd04fd6890.112 Ether
0xc5c006f29da2de8eef749381d593e3a4c05432dccff37e5847caed88cbdc6378740385915 hrs 55 mins ago0xc47d7d42e44b2e04c83a45cf45898e597a0c23110x91b9d2835ad914bc1dcfe09bd1816febd04fd6890.112 Ether
0x81dab74fbfd7f4c8a14a5196bd8a0316ee297a1ccc5b9ff191e9ada67d860cd5740184823 hrs 21 mins ago0xc47d7d42e44b2e04c83a45cf45898e597a0c23110x91b9d2835ad914bc1dcfe09bd1816febd04fd6890.1008 Ether
0x81dab74fbfd7f4c8a14a5196bd8a0316ee297a1ccc5b9ff191e9ada67d860cd5740184823 hrs 21 mins ago0xc47d7d42e44b2e04c83a45cf45898e597a0c23110xffd4c92f7ab9075e0faada86dfa22784bb4fe56c0.0112 Ether
0x1adb35d1405ff2f4adfa0ab97c96583abd01a68fb28e73cc7a1f93b75f1fa92574016301 day 9 mins ago0xc47d7d42e44b2e04c83a45cf45898e597a0c23110x91b9d2835ad914bc1dcfe09bd1816febd04fd6890.1008 Ether
0x1adb35d1405ff2f4adfa0ab97c96583abd01a68fb28e73cc7a1f93b75f1fa92574016301 day 9 mins ago0xc47d7d42e44b2e04c83a45cf45898e597a0c23110x9c05ac66e0f709bfca556cbcc57ce189c00cdccd0.0112 Ether
0x23fc1903ad4bf7b326bef73e251f112e4daa4d1bc51be7461706e43b621e065574015611 day 26 mins ago0xc47d7d42e44b2e04c83a45cf45898e597a0c23110x91b9d2835ad914bc1dcfe09bd1816febd04fd6890.1008 Ether
0x23fc1903ad4bf7b326bef73e251f112e4daa4d1bc51be7461706e43b621e065574015611 day 26 mins ago0xc47d7d42e44b2e04c83a45cf45898e597a0c23110x9c05ac66e0f709bfca556cbcc57ce189c00cdccd0.0112 Ether
0xf82bebcb17294fbb35e10e0edeef93f82f2bc00aace9b77fc2944ed677aab41474006651 day 3 hrs ago0xc47d7d42e44b2e04c83a45cf45898e597a0c23110x91b9d2835ad914bc1dcfe09bd1816febd04fd6890.112 Ether
0x26949074a343ddcef8aa57d1fb3c2917755f77481ae2915aedaca2d29cc5199374005971 day 4 hrs ago0xc47d7d42e44b2e04c83a45cf45898e597a0c23110x91b9d2835ad914bc1dcfe09bd1816febd04fd6892.016 Ether
0xb410e359a7738aec60cd5a2ebb4e808e5a84b364307b0df08a0975ea67da3d6474000701 day 5 hrs ago0xc47d7d42e44b2e04c83a45cf45898e597a0c23110x91b9d2835ad914bc1dcfe09bd1816febd04fd6890.1008 Ether
0xb410e359a7738aec60cd5a2ebb4e808e5a84b364307b0df08a0975ea67da3d6474000701 day 5 hrs ago0xc47d7d42e44b2e04c83a45cf45898e597a0c23110xd736144c39dac0122d70a2ca6b1725a67b0fc00b0.0112 Ether
0x96d97dc64db944dc8b7a05925281c1299f3f58aaddaf56f1a164a7df1ea274af73978831 day 14 hrs ago0xc47d7d42e44b2e04c83a45cf45898e597a0c23110x91b9d2835ad914bc1dcfe09bd1816febd04fd6890.1008 Ether
[ Download CSV Export 
Warning: The compiled contract might be susceptible to ExpExponentCleanup (medium/high-severity), EventStructWrongData (very low-severity) Solidity Compiler Bugs.

Contract Source Code Verified (Exact Match)

Contract Name:
LegendaryPackFour

Compiler Version
v0.4.24+commit.e67f0147

Optimization Enabled:
Yes

Runs (Optimizer):
200

Contract Source Code

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

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
Block Age Transaction Difficulty GasUsed Reward
Block Age Uncle Number Difficulty GasUsed Reward
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.