Contract Overview |  GU_EpicPackFour
Balance: 0.063 Ether
Ether Value: $7.83 (@ $124.35/ETH)
Transactions: 6095 txns
Misc:
Address Watch: Add To Watch List
Contract Creator: 0xbea8c2f97fa34dc1cfdd7acbdc8226fb1c8c7473at txn 0xbea924952c6c4d4526bb6fb0c167e00cdcfd44831389924750fdc76e091481af
Token Balance:
 Latest 25 transactions from a total of 6095 transactions

TxHash Age From To Value [TxFee]
0x17508d80a4e759482779e2c293a9f43d2f82d9a20fd51477d25b82d4e86158407 hrs 15 mins ago0x1375ee88d1357aee19bd5a90892cbd599852e102  IN   GU_EpicPackFour0 Ether0.00011477
0x467b95437c0db208d269cef8321279c476a527b7a0d832b3aa4cca50fa290ebe7 hrs 15 mins ago0x1ba94b4699898d02e6fd71b64502d8bb9681bdca  IN   GU_EpicPackFour0 Ether0.000275448
0x55c26c3c4fac924fe701c6d96c08bf708fb4fe8676ce267c92ce9c0c4163c4b57 hrs 15 mins ago0xb65f39d3c44b9d6cd626cec91fe8d3a015acd416  IN   GU_EpicPackFour0 Ether0.000275448
0x27e011c52eb3583ee0423bf902d9c5716618798434186477cd68ec7f781985247 hrs 15 mins ago0xdcb2cd57554db69c898b181ce7c7024efd951db6  IN   GU_EpicPackFour0 Ether0.000275448
0x0a0de799ae685b115f34ce7a341a8dfc723444a717f8fde6a61675f62b3d18607 hrs 15 mins ago0x07242ea48a9017c26927c0a06602f27b46ee5ec0  IN   GU_EpicPackFour0 Ether0.00056478
0x523141cc3875efc97eeb3ee05bb45a521c63c4d992411133e5142dd3412b86d07 hrs 18 mins ago0xa61773f57104d3df713d569d1a06457aaa1139e7  IN   GU_EpicPackFour0.45 Ether0.00084785
0x4c66fad829ea206c1563f2ce392c2687c7f0c34d78e3a7146c44ad9c7ea254fd8 hrs 44 mins ago0xa289364347bfc1912ab672425abe593ec01ca56e  IN   GU_EpicPackFour0 Ether0.006537448
0xe55de11883445a9584a163e75c574cf6a4c1176347aebc75dd45da0f3715b88d1 day 1 hr ago0x9ab89514609c6c387559e7131f1540faa57460d5  IN   GU_EpicPackFour0 Ether0.00056478
0x19a0dcf1cc400355be8963ce6e26a40c2b7154082a1a2dc33059e1873d2987691 day 1 hr ago0x0b4f222cb69554ee96bae54abbd5583d40539266  IN   GU_EpicPackFour0.075 Ether0.000763624
0xc58c1dc481bca9de62178794598bde5c3c88f87f27031a517c97e22bbba437131 day 2 hrs ago0xa6eec10c55ec14d530654596099ffc2373959fa5  IN   GU_EpicPackFour0 Ether0.000275448
0xc529edeb5c97fbbc4440af0e2074955b0e8688c111faa13128889b148e05d41a1 day 2 hrs ago0x8d834460fd589979c31c0c5df71bd7c94b969909  IN   GU_EpicPackFour0 Ether0.000275448
0xbb2f3e14995b55aa568d596efa79553b3d35976ab0f6cb52066d2956350ab1041 day 2 hrs ago0x0e20374d8623d6c706aa74e73d2ce529c7e8940b  IN   GU_EpicPackFour0 Ether0.00056478
0xf24c647c748e5d55331c112dd6d302460823f3055154313642bd11211fb63b7a1 day 2 hrs ago0x67e75b28cb999c447ee378d2f5f2544f59c6e62b  IN   GU_EpicPackFour0.075 Ether0.001441345
0x26915b05c4d4a140f0f491ca14a3baeb1f061bb78443df04e552de9601eb35981 day 5 hrs ago0x07242ea48a9017c26927c0a06602f27b46ee5ec0  IN   GU_EpicPackFour0 Ether0.000160678
0x7d39e7d81c529da5803103524668b2421ae945a4a097d3a28d0d9ac18097affd1 day 5 hrs ago0x1375ee88d1357aee19bd5a90892cbd599852e102  IN   GU_EpicPackFour0 Ether0.000160678
0x3e30d2789f310b27ad39a648e8a95544868c020ebbaa8518bc846833cf817fb41 day 5 hrs ago0xbf5fa59530ce3909bf0173de2dff29473db8add9  IN   GU_EpicPackFour0 Ether0.00022954
0x400b4ca55191f764141e11d6ce22c2c62a9d69603cfdfde69fd57614685d34db1 day 5 hrs ago0x7386f6be558b9f443dff4d74dbf6b3a27e9fcdbd  IN   GU_EpicPackFour0 Ether0.00047065
0xfbaa161c4b70b254896a3319cbf5cafadff8a2184d1bb6051b442eff18c4c3181 day 5 hrs ago0x3a0593a2a7d4fb8f2b7dc06f0435f748fa4900fb  IN   GU_EpicPackFour0.45 Ether0.000932635
0x6f4e8efb9d2c8971cb1f586c32da0e228bfa2e5f4e1d8923f30b50b708ff21271 day 6 hrs ago0x1bb246caf4905270a28172a4edb8df7daa3a5292  IN   GU_EpicPackFour0 Ether0.0001629734
0xad1fbf2689532df6197ae196cb427926dcc363a97f6dcb11b6babf55b391dea61 day 6 hrs ago0xf75454ab50f67e16452ac0b6a3fd9e9149973600  IN   GU_EpicPackFour0 Ether0.0003341615
0x85a9be53cf599777cc635ffe288d01ae5ca9ef4c7f85c6bc2947fd58a4c4d39b1 day 6 hrs ago0x3a0593a2a7d4fb8f2b7dc06f0435f748fa4900fb  IN   GU_EpicPackFour0.45 Ether0.0011106835
0x9e16a598ad205b6ab39918ed2066b2b455274f2a729e71ff539fd0fe820b2dc81 day 6 hrs ago0x2306323b6c462cbddccda190631ce59eaf6cbd05  IN   GU_EpicPackFour0 Ether0.0001629734
0x029dc1a2a2f51b5f1ce2a3123b81daafeb6d9111be8e95f5ee7be1ad6b85d94d1 day 6 hrs ago0x7e8fb14c49ddf616d53aa1a6fda8b47e91ee9cd5  IN   GU_EpicPackFour0 Ether0.0001629734
0xac7d56faf918a939f27d2c39ebea996e639ace0b6b03474ad9f113c6ca4612a21 day 6 hrs ago0x70503b46df27cc04292e6803be55896a9455e7c5  IN   GU_EpicPackFour0 Ether0.0003341615
0xa57f54d4d2b38ff0cc392d1f81fe7c26cf2e76a70e7ff37d907d2797bbd73de91 day 6 hrs ago0xd87a99c457c3b1da16c4a20b1ec212b16fbe00d8  IN   GU_EpicPackFour0.45 Ether0.001102205
[ 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
0x523141cc3875efc97eeb3ee05bb45a521c63c4d992411133e5142dd3412b86d070904357 hrs 18 mins ago0x482cf6a9d6b23452c81d4d0f0f139c1414963f890x91b9d2835ad914bc1dcfe09bd1816febd04fd6890.45 Ether
0x19a0dcf1cc400355be8963ce6e26a40c2b7154082a1a2dc33059e1873d29876970861101 day 1 hr ago0x482cf6a9d6b23452c81d4d0f0f139c1414963f890x91b9d2835ad914bc1dcfe09bd1816febd04fd6890.0675 Ether
0x19a0dcf1cc400355be8963ce6e26a40c2b7154082a1a2dc33059e1873d29876970861101 day 1 hr ago0x482cf6a9d6b23452c81d4d0f0f139c1414963f890x552c2a5a774ccaeec036d41c983808e3c76477e60.0075 Ether
0xf24c647c748e5d55331c112dd6d302460823f3055154313642bd11211fb63b7a70860551 day 2 hrs ago0x482cf6a9d6b23452c81d4d0f0f139c1414963f890x91b9d2835ad914bc1dcfe09bd1816febd04fd6890.075 Ether
0xfbaa161c4b70b254896a3319cbf5cafadff8a2184d1bb6051b442eff18c4c31870852371 day 5 hrs ago0x482cf6a9d6b23452c81d4d0f0f139c1414963f890x91b9d2835ad914bc1dcfe09bd1816febd04fd6890.45 Ether
0x85a9be53cf599777cc635ffe288d01ae5ca9ef4c7f85c6bc2947fd58a4c4d39b70850411 day 6 hrs ago0x482cf6a9d6b23452c81d4d0f0f139c1414963f890x91b9d2835ad914bc1dcfe09bd1816febd04fd6890.45 Ether
0xa57f54d4d2b38ff0cc392d1f81fe7c26cf2e76a70e7ff37d907d2797bbd73de970849951 day 6 hrs ago0x482cf6a9d6b23452c81d4d0f0f139c1414963f890x91b9d2835ad914bc1dcfe09bd1816febd04fd6890.45 Ether
0x65f95fbd9f5245c7366d8952b2e9fdf447e3cd66b8c889792ceaaa25a77a8cca70846421 day 8 hrs ago0x482cf6a9d6b23452c81d4d0f0f139c1414963f890x91b9d2835ad914bc1dcfe09bd1816febd04fd6890.075 Ether
0xf494c87cee9460108878e033fb9bb85b5a312afa3117da042fa3b3b46245f59470846401 day 8 hrs ago0x482cf6a9d6b23452c81d4d0f0f139c1414963f890x91b9d2835ad914bc1dcfe09bd1816febd04fd6890.075 Ether
0xa0cea9c5e5d681f9574c015d21cfbfc910759939a0732b9d70d26dd3fc3d76aa70846381 day 8 hrs ago0x482cf6a9d6b23452c81d4d0f0f139c1414963f890x91b9d2835ad914bc1dcfe09bd1816febd04fd6890.075 Ether
0x3803afc4a5869826a41cc7ed56389d9b3fbc0001919db8b2206d1c42bfd8f8e270844501 day 8 hrs ago0x482cf6a9d6b23452c81d4d0f0f139c1414963f890x91b9d2835ad914bc1dcfe09bd1816febd04fd6890.45 Ether
0x8f797fd9dbbd27fdeb3a7c25c35abc102c99a04f98082cdb299fe1fe10321f8e70844431 day 8 hrs ago0x482cf6a9d6b23452c81d4d0f0f139c1414963f890x91b9d2835ad914bc1dcfe09bd1816febd04fd6893.75 Ether
0x109658933619a6d589c8b21e2ec6f649de16bd74449404b7dc9dcb3357fd572f70844411 day 8 hrs ago0x482cf6a9d6b23452c81d4d0f0f139c1414963f890x91b9d2835ad914bc1dcfe09bd1816febd04fd6890.075 Ether
0x1b9f547f6fd27dadf5b3c7429be7604cb2065f4a22a426e8a45e7aac19ac806670844391 day 8 hrs ago0x482cf6a9d6b23452c81d4d0f0f139c1414963f890x91b9d2835ad914bc1dcfe09bd1816febd04fd6890.45 Ether
0x955f223e88b6cee06a649819ddf8b93002d83953a3040c69df2b23e2749aecf670843291 day 9 hrs ago0x482cf6a9d6b23452c81d4d0f0f139c1414963f890x91b9d2835ad914bc1dcfe09bd1816febd04fd6890.075 Ether
0x4a3f0c2a8d8777fc40f37808213cecf7396a4f2c0e5ca235769a9f0485ba068b70828771 day 15 hrs ago0x482cf6a9d6b23452c81d4d0f0f139c1414963f890x91b9d2835ad914bc1dcfe09bd1816febd04fd6890.405 Ether
0x4a3f0c2a8d8777fc40f37808213cecf7396a4f2c0e5ca235769a9f0485ba068b70828771 day 15 hrs ago0x482cf6a9d6b23452c81d4d0f0f139c1414963f890x525637c5234a0046c8097cdd1c088bcbe4372f3a0.045 Ether
0x8ead064d8acb698bebad5fd0939da6dc17af93c0fd7b6b24c551c0620cecd27870828161 day 15 hrs ago0x482cf6a9d6b23452c81d4d0f0f139c1414963f890x91b9d2835ad914bc1dcfe09bd1816febd04fd6890.075 Ether
0x7ccfe59c4fa2e30cb9dd98505957ba9b72692398816276771904709dd8ad013770828161 day 15 hrs ago0x482cf6a9d6b23452c81d4d0f0f139c1414963f890x91b9d2835ad914bc1dcfe09bd1816febd04fd6890.075 Ether
0x90c68d984b00dcc05629be26626816ba2d6adae81f1750e02e2393cd02bc930270827701 day 16 hrs ago0x482cf6a9d6b23452c81d4d0f0f139c1414963f890x91b9d2835ad914bc1dcfe09bd1816febd04fd6890.075 Ether
0x714a68b374a76d95c153e236458a68ffa117527d95b733f310e7ad522117160170827111 day 16 hrs ago0x482cf6a9d6b23452c81d4d0f0f139c1414963f890x91b9d2835ad914bc1dcfe09bd1816febd04fd6890.075 Ether
0xb931077b8b6e6df20babb7946b328ac6d0809339a17410dcb897d0884815c88270827091 day 16 hrs ago0x482cf6a9d6b23452c81d4d0f0f139c1414963f890x91b9d2835ad914bc1dcfe09bd1816febd04fd6890.075 Ether
0xda68c027668b6f448093187cd3e7df6c298a20a4a55c84968d09a5cfa35cb12570824711 day 17 hrs ago0x482cf6a9d6b23452c81d4d0f0f139c1414963f890x91b9d2835ad914bc1dcfe09bd1816febd04fd6890.075 Ether
0xa863e742e9cd64d68d6a9ded170912c60dd09d183ad0a50802005583d6bbaa0070823491 day 17 hrs ago0x482cf6a9d6b23452c81d4d0f0f139c1414963f890x91b9d2835ad914bc1dcfe09bd1816febd04fd6890.075 Ether
0xb5684553f78310e3fbc15f0a8ec08aa3dca70ea2a68b4b7cf56d21cb3b748d1b70821941 day 18 hrs ago0x482cf6a9d6b23452c81d4d0f0f139c1414963f890x91b9d2835ad914bc1dcfe09bd1816febd04fd6890.45 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: EpicPackFour
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 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 EpicPackFour is PackFourMultiplier {
    
    function basePrice() public returns (uint) {
        return 75 finney;
    }

    constructor(PreviousInterface _old, address[] _packs, MigrationInterface _core, CappedVault vault, FirstPheonix _pheonix) 
        public PackFourMultiplier(_old, _packs, _core, vault, _pheonix) {
        
    }  
    
    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 = _getEpicPlusRarity(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":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":"_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
60806040526002805460a060020a60ff02191690556005805462ff00001961ffff19918216600f17166201000017909155600780549091166003179055600880547405000000000000000000000000000000000000000060a060020a61ffff02199091161790553480156200007357600080fd5b5060405162001fde38038062001fde8339810160409081528151602080840151928401516060850151608086015160008054600160a060020a03808616600160a060020a031992831617909255625aa7456001556002805482163317905560038054928516929091169190911790559490950180519395909491939092869186918691869186916200010c916006919087019062000158565b50600780546201000060b060020a03191662010000600160a060020a039384160217905560088054600160a060020a031916959091169490941790935550620001ec9650505050505050565b828054828255906000526020600020908101928215620001b0579160200282015b82811115620001b05782518254600160a060020a031916600160a060020a0390911617825560209092019160019091019062000179565b50620001be929150620001c2565b5090565b620001e991905b80821115620001be578054600160a060020a0319168155600101620001c9565b90565b611de280620001fc6000396000f30060806040526004361061017c5763ffffffff60e060020a60003504166306a628d4811461018157806313af4035146101ac5780631705a3bd146101cf57806317634514146102005780631b3ed72214610227578063379607f514610253578063396c82281461026b5780633ccfd60b146102865780633f4ba83a1461029b57806345d63b66146102b05780635c975abb146102c85780635f9602e8146102f15780636bc3e4a8146103065780636dc7a627146103505780638392fe31146103655780638456cb59146103c15780638be4339b146103d65780638da5cb5b146103eb5780639a1f6a0f14610400578063b01d5b631461041c578063b84c13921461043e578063bd6cac4f14610456578063becd283f14610477578063c2f0bb291461048c578063c503101e146104d2578063c7876ea4146104ec578063ca2bf04714610501578063d42a5011146105b2578063e3f7faaf146105ce578063eb1098b8146105ed578063fbfa77cf14610602578063ff585caf14610617575b600080fd5b34801561018d57600080fd5b5061019661062f565b6040805160ff9092168252519081900360200190f35b3480156101b857600080fd5b506101cd600160a060020a0360043516610634565b005b3480156101db57600080fd5b506101e461067a565b60408051600160a060020a039092168252519081900360200190f35b34801561020c57600080fd5b50610215610689565b60408051918252519081900360200190f35b34801561023357600080fd5b5061023c61068f565b6040805161ffff9092168252519081900360200190f35b34801561025f57600080fd5b506101cd600435610699565b6101cd61ffff60043516600160a060020a036024351661098b565b34801561029257600080fd5b506101cd6109b1565b3480156102a757600080fd5b506101cd610a05565b3480156102bc57600080fd5b506101cd600435610a7d565b3480156102d457600080fd5b506102dd610b21565b604080519115158252519081900360200190f35b3480156102fd57600080fd5b5061023c610b31565b34801561031257600080fd5b5061032a600160a060020a0360043516602435610b3b565b6040805161ffff9093168352600160a060020a0390911660208301528051918290030190f35b34801561035c57600080fd5b506102dd610fc2565b34801561037157600080fd5b5061037d600435610fd1565b6040805161ffff9687168152949095166020850152600160a060020a0390921683850152606083015267ffffffffffffffff16608082015290519081900360a00190f35b3480156103cd57600080fd5b506101cd61102d565b3480156103e257600080fd5b5061023c6110aa565b3480156103f757600080fd5b506101e46110b4565b34801561040c57600080fd5b506101cd61ffff600435166110c3565b6101cd600160a060020a0360043581169061ffff6024351690604435166110f2565b34801561044a57600080fd5b506101e4600435611119565b34801561046257600080fd5b506102dd600160a060020a0360043516611141565b34801561048357600080fd5b5061021561119f565b34801561049857600080fd5b506104b161ffff6004351660ff602435166044356111a5565b6040805161ffff938416815291909216602082015281519081900390910190f35b3480156104de57600080fd5b506101cd60043515156112bf565b3480156104f857600080fd5b506102156112f2565b34801561050d57600080fd5b506105196004356112fe565b604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561055d578181015183820152602001610545565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561059c578181015183820152602001610584565b5050505090500194505050505060405180910390f35b3480156105be57600080fd5b506101cd61ffff600435166114c3565b3480156105da57600080fd5b5061021560043561ffff6024351661150d565b3480156105f957600080fd5b5061023c61154e565b34801561060e57600080fd5b506101e461155f565b34801561062357600080fd5b506101cd60043561156e565b600590565b600254600160a060020a0316331461064b57600080fd5b6002805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600054600160a060020a031681565b60015481565b60075461ffff1681565b6000806000806000806000806060600080600060048d8154811015156106bb57fe5b90600052602060002090600302019b50600560029054906101000a900460ff1615156106e657600080fd5b8b5460018d01546201000090910461ffff169950975061070461062f565b8c54909750600160a060020a03640100000000820416965061ffff16945087151561072e57600080fd5b600061ffff8a161161073f57600080fd5b8660ff1660405190808252806020026020018201604052801561076c578160200160208202803883390190505b5093508861ffff1661077c6110aa565b860161ffff16116107965761078f6110aa565b8501610798565b885b925061ffff808616908416116107ad57600080fd5b8491505b8261ffff168261ffff161015610964575060005b8660ff168160ff1610156108c4576107de82828a6111a5565b809b50819c5050506000809054906101000a9004600160a060020a0316600160a060020a031663fb36eba1878d8d6040518463ffffffff1660e060020a0281526004018084600160a060020a0316600160a060020a031681526020018361ffff1661ffff1681526020018261ffff1661ffff1681526020019350505050602060405180830381600087803b15801561087557600080fd5b505af1158015610889573d6000803e3d6000fd5b505050506040513d602081101561089f57600080fd5b50518451859060ff84169081106108b257fe5b602090810290910101526001016107c5565b85600160a060020a03168d7f69ac64af86d3ef40c9def928534f6a6a9e12d85ec3af2948bd66b802afcc10468960ff16850287604051808361ffff1661ffff16815260200180602001828103825283818151815260200191508051906020019060200280838360005b8381101561094557818101518382015260200161092d565b50505050905001935050505060405180910390a36001909101906107b1565b5050895461ffff1981169390910361ffff9182160116919091179097555050505050505050565b60025460a060020a900460ff16156109a257600080fd5b6109ad338383611743565b5050565b600254600160a060020a031633146109c857600080fd5b600254604051600160a060020a0390911690303180156108fc02916000818181858888f19350505050158015610a02573d6000803e3d6000fd5b50565b600254600160a060020a03163314610a1c57600080fd5b60025460a060020a900460ff161515610a3457600080fd5b6002805474ff0000000000000000000000000000000000000000191690556040517f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3390600090a1565b6000600482815481101515610a8e57fe5b9060005260206000209060030201905080600101546000141515610ab157600080fd5b600281015467ffffffffffffffff9081166101000116431015610ad357600080fd5b60028101805467ffffffffffffffff19164367ffffffffffffffff1617905560405182907f29ef13d2827ff333d3fde4646988c3a7db16de1210f0c0b613fd0ac9773e4e7b90600090a25050565b60025460a060020a900460ff1681565b60055461ffff1681565b600080600080600080600080610b4f611d88565b600080610b5b8d611141565b1515610b6657600080fd5b610b6e6119ea565b98508c600160a060020a031663379607f58d6040518263ffffffff1660e060020a02815260040180828152602001915050600060405180830381600087803b158015610bb957600080fd5b505af1158015610bcd573d6000803e3d6000fd5b50505050610bd96119ea565b9750888811610be757600080fd5b8888039650600561ffff88160661ffff1615610c0257600080fd5b600561ffff8816600754600854604080517f6352211e0000000000000000000000000000000000000000000000000000000081526000198e016004820152905194909304995061ffff90911689029750600160a060020a031691636352211e916024808201926020929091908290030181600087803b158015610c8457600080fd5b505af1158015610c98573d6000803e3d6000fd5b505050506040513d6020811015610cae57600080fd5b50516040805160a081018252600080825261ffff8981166020848101828152600160a060020a038089168789018181526060890188815267ffffffffffffffff43811660808c01908152600480546001810182559b528b5160038c027f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b81018054995196519098166401000000000277ffffffffffffffffffffffffffffffffffffffff0000000019968d16620100000263ffff00001993909d1661ffff19909a1699909917919091169a909a17939093169590951790935591517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19c87015590517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19d90950180549590921667ffffffffffffffff19909516949094179055855191825294519599509297509095509285927f861fd6f8fe14603acc05fa404f8cca86371619cac8a65a92edf687f81b9bafbd928290030190a3600754604080517ff88218e0000000000000000000000000000000000000000000000000000000008152600160a060020a0387811660048301529151620100009093049091169163f88218e0916024808201926020929091908290030181600087803b158015610e9657600080fd5b505af1158015610eaa573d6000803e3d6000fd5b505050506040513d6020811015610ec057600080fd5b5050604080518a8152602081018a905281517f31a1adb447f9b6b89f24bf104f0b7a06975ad9f35670dbfaf7ce29190ec54762929181900390910190a160085461ffff60a060020a909104811690871611610faf575060005b8661ffff16811015610faf5760008054604080517f454b0608000000000000000000000000000000000000000000000000000000008152848c036000190160048201529051600160a060020a039092169263454b06089260248084019382900301818387803b158015610f8b57600080fd5b505af1158015610f9f573d6000803e3d6000fd5b505060019092019150610f199050565b50929b919a509098505050505050505050565b60055462010000900460ff1681565b6004805482908110610fdf57fe5b600091825260209091206003909102018054600182015460029092015461ffff80831694506201000083041692640100000000909204600160a060020a0316919067ffffffffffffffff1685565b600254600160a060020a0316331461104457600080fd5b60025460a060020a900460ff161561105b57600080fd5b6002805474ff0000000000000000000000000000000000000000191660a060020a1790556040517f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62590600090a1565b60055461ffff1690565b600254600160a060020a031681565b600254600160a060020a031633146110da57600080fd5b6005805461ffff191661ffff92909216919091179055565b60025460a060020a900460ff161561110957600080fd5b611114838383611743565b505050565b600680548290811061112757fe5b600091825260209091200154600160a060020a0316905081565b6000805b6006548110156111945782600160a060020a031660068281548110151561116857fe5b600091825260209091200154600160a060020a0316141561118c5760019150611199565b600101611145565b600091505b50919050565b60045490565b6000806000806000806000806111bc8b8b8b611b07565b9399509197509195509093509150600460ff8b1614156111e6576111df85611c6e565b90506111f2565b6111ef85611caa565b90505b6111fc8383611d15565b6000546040517fcaa19168000000000000000000000000000000000000000000000000000000008152919850600160a060020a03169063caa1916890839087906004908101908190849081111561124f57fe5b60ff1681526020018261ffff1661ffff16815260200192505050602060405180830381600087803b15801561128357600080fd5b505af1158015611297573d6000803e3d6000fd5b505050506040513d60208110156112ad57600080fd5b50519750505050505050935093915050565b600254600160a060020a031633146112d657600080fd5b60058054911515620100000262ff000019909216919091179055565b67010a741a4627800090565b606080611309611d88565b600080600080600080600060048b81548110151561132357fe5b60009182526020918290206040805160a0810182526003909302909101805461ffff808216855262010000820416948401859052600160a060020a03640100000000909104169183019190915260018101546060830181905260029091015467ffffffffffffffff16608083015290995090955093506113a161062f565b9250848360ff160261ffff166040519080825280602002602001820160405280156113d6578160200160208202803883390190505b509850848360ff160261ffff1660405190808252806020026020018201604052801561140c578160200160208202803883390190505b509950600091505b8461ffff168261ffff1610156114b6575060005b8260ff168160ff1610156114ab576114418282866111a5565b8a51919850965086908a9061ffff60ff8781168702908616011690811061146457fe5b61ffff928316602091820290920101528a5188918c9160ff87811687029086160190911690811061149157fe5b61ffff909216602092830290910190910152600101611428565b600190910190611414565b5050505050505050915091565b600254600160a060020a031633146114da57600080fd5b6008805461ffff90921660a060020a0275ffff000000000000000000000000000000000000000019909216919091179055565b60015460009043036117708104601481101561153c5761ffff8416606460148390038702048603029250611546565b8361ffff16850292505b505092915050565b60085460a060020a900461ffff1681565b600354600160a060020a031681565b600080600060048481548110151561158257fe5b90600052602060002090600302019250826001015460001415156115a557600080fd5b600283015467ffffffffffffffff1660ff194301106115c357600080fd5b60028301544367ffffffffffffffff908116911614156115e257600080fd5b600283015483546040805167ffffffffffffffff9093164060208085018290526401000000008404600160a060020a03166c0100000000000000000000000090810286850152300260548601526201000090930461ffff167e010000000000000000000000000000000000000000000000000000000000000260688501528151808503604a018152606a90940191829052835190955090918291908401908083835b602083106116a35780518252601f199092019160209182019101611684565b5181516020939093036101000a600019018019909116921691909117905260405192018290039091209350505082151590506116de57600080fd5b6001830181905582546040805162010000830461ffff168152602081018490528151640100000000909304600160a060020a03169287927fedb5ce4012b6e9c5904afa2ffad9811d5c2e91e6bca8914cf7e3ffc28e630c57928290030190a350505050565b600061174d611d88565b60008061ffff8616811061176057600080fd5b600160a060020a03858116908816141561177957600080fd5b61178a6117846112f2565b8761150d565b93503484111561179957600080fd5b6040805160a081018252600080825261ffff8981166020808501828152600160a060020a03808f168789018181526060890188815267ffffffffffffffff43811660808c01908152600480546001810182559b528b5160038c027f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b81018054995196519098166401000000000277ffffffffffffffffffffffffffffffffffffffff0000000019968d16620100000263ffff00001993909d1661ffff19909a1699909917919091169a909a17939093169590951790935591517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19c87015590517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19d90950180549590921667ffffffffffffffff19909516949094179055855191825294519397509195509285927f861fd6f8fe14603acc05fa404f8cca86371619cac8a65a92edf687f81b9bafbd9281900390910190a3600160a060020a038516156119a65750604051600a840490600160a060020a0386169082156108fc029083906000818181858888f1935050505015801561195a573d6000803e3d6000fd5b5060408051828152600160a060020a03898116602083015282519684900396908816927f13aa7090696e2a1d666cfc6046f2f72f1c4e0290649b47bab28d1b370ad73783928290030190a25b600354604051600160a060020a039091169085156108fc029086906000818181858888f193505050501580156119e0573d6000803e3d6000fd5b5050505050505050565b600854604080517f524773ce0000000000000000000000000000000000000000000000000000000081529051600092600160a060020a03169163524773ce91600480830192602092919082900301818787803b158015611a4957600080fd5b505af1158015611a5d573d6000803e3d6000fd5b505050506040513d6020811015611a7357600080fd5b5051600854604080517f18160ddd0000000000000000000000000000000000000000000000000000000081529051600160a060020a03909216916318160ddd916004808201926020929091908290030181600087803b158015611ad557600080fd5b505af1158015611ae9573d6000803e3d6000fd5b505050506040513d6020811015611aff57600080fd5b505101905090565b6000806000806000878688604051602001808461ffff1661ffff167e010000000000000000000000000000000000000000000000000000000000000281526002018381526020018260ff1660ff167f010000000000000000000000000000000000000000000000000000000000000002815260010193505050506040516020818303038152906040526040518082805190602001908083835b60208310611bbf5780518252601f199092019160209182019101611ba0565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020600190049450620f4240611c03866004600a611d68565b811515611c0c57fe5b0693506103e8611c1f8660026004611d68565b811515611c2857fe5b0692506103e8611c3b8660026006611d68565b811515611c4457fe5b06915061ffff611c578660026008611d68565b811515611c6057fe5b069050939792965093509350565b60008163ffffffff16620f423f1415611c8957506004611ca5565b620efa6f63ffffffff831610611ca157506003611ca5565b5060025b919050565b60008163ffffffff16620f423f1415611cc557506004611ca5565b620f3bc963ffffffff831610611cdd57506003611ca5565b620f0e8d63ffffffff831610611cf557506002611ca5565b620e1cda63ffffffff831610611d0d57506001611ca5565b506000611ca5565b60006103e661ffff841610611d2f5750610bb88101611d62565b6103dc61ffff841610611d4757506107d08101611d62565b6103aa61ffff841610611d5f57506103e88101611d62565b50805b92915050565b6008828102600290810a60001990810192840201900a8404169392505050565b6040805160a081018252600080825260208201819052918101829052606081018290526080810191909152905600a165627a7a72305820e3b2a3ffab668c5b4e2f1a0f6bbbe36547c93331b309a946a1f6fd0dc33f0ad50029000000000000000000000000512fbd15bde6570ff09e4438af27ede60402451500000000000000000000000000000000000000000000000000000000000000a00000000000000000000000006ebeaf8e8e946f0716e6533a6f2cefc83f60e8ab00000000000000000000000091b9d2835ad914bc1dcfe09bd1816febd04fd689000000000000000000000000657c8982d63f58ddd6a54c75591a572d4180cec80000000000000000000000000000000000000000000000000000000000000002000000000000000000000000e5dc9d1b58fd5a95fc20a6c6afaa76d44d70a7df0000000000000000000000006e0051c750b81f583f42f93a48d56497779992d8

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

-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 000000000000000000000000512fbd15bde6570ff09e4438af27ede604024515
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 0000000000000000000000006ebeaf8e8e946f0716e6533a6f2cefc83f60e8ab
Arg [3] : 00000000000000000000000091b9d2835ad914bc1dcfe09bd1816febd04fd689
Arg [4] : 000000000000000000000000657c8982d63f58ddd6a54c75591a572d4180cec8
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [6] : 000000000000000000000000e5dc9d1b58fd5a95fc20a6c6afaa76d44d70a7df
Arg [7] : 0000000000000000000000006e0051c750b81f583f42f93a48d56497779992d8


   Swarm Source:
bzzr://e3b2a3ffab668c5b4e2f1a0f6bbbe36547c93331b309a946a1f6fd0dc33f0ad5

 

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.