Contract Overview |  GU_RarePackFour
Balance: 0.43056 Ether
Ether Value: $41.11 (@ $95.48/ETH)
Transactions: 93832 txns
 Latest 25 transactions from a total of 93832 transactions
(> More Than 25 PendingTxns)

TxHash Age From To Value [TxFee]
0xffe9983e0b8966d4b7301354029abf4b65bf14f4238838196d4836cf5abf8d15(pending)0xa3d7553397352efb84a0bc217a464e9e114207d6  IN  0x0777f76d195795268388789343068e4fcd2869190 Ether(Pending)
0xd61a9f553394f1b32cd7417456c7cc772dcb619c18322afe099cb6ea8b4c69b2(pending)0x7a3e24b9dbf6afed69b0bb6183505f70b371a68b  IN  0x0777f76d195795268388789343068e4fcd2869190 Ether(Pending)
0xb9f29ba983ce530972e4aa5047256ea37a5bd8031ed66417eb060955459e783d(pending)0x1ce768063be319e0a04417fcdb3b9cbdba35f46d  IN  0x0777f76d195795268388789343068e4fcd2869190 Ether(Pending)
0x2fc498a403e5e8d3d007545d68ce8ef032330b6aa45e23014e7e6ab6ba389def(pending)0xc46c53bdf756c33531744de27375be048337ca9d  IN  0x0777f76d195795268388789343068e4fcd2869190 Ether(Pending)
0xd630d2e7d89fe64241f41bf042d1d19c5e6fcd87023f0236669731e1d2f510e8(pending)0xc46c53bdf756c33531744de27375be048337ca9d  IN  0x0777f76d195795268388789343068e4fcd2869190 Ether(Pending)
0x2e31f680faf4918f9ee6ecf91f3329a03c6fda26fec11dc960b05d10e8f931e8(pending)0x6a6329c277587d3f677dc4693f38e3d46f647ce4  IN  0x0777f76d195795268388789343068e4fcd2869190 Ether(Pending)
0x29ec428c89d53439b16778de820b436bf72aa7f1e89c90fffb3fef8e7c83c820(pending)0xa3d7553397352efb84a0bc217a464e9e114207d6  IN  0x0777f76d195795268388789343068e4fcd2869190 Ether(Pending)
0x34b11e9a225fd9b518b3bafbb65fa0019bd61fbc77f7c37d1cca0583baaf1705(pending)0xa3d7553397352efb84a0bc217a464e9e114207d6  IN  0x0777f76d195795268388789343068e4fcd2869190 Ether(Pending)
0x730b1bfe1d0866c0d1ded36337c1fbb69f8726d7afed8f2345e6b337c8bd43da(pending)0xa3d7553397352efb84a0bc217a464e9e114207d6  IN  0x0777f76d195795268388789343068e4fcd2869190 Ether(Pending)
0x4f17a1bbd815ef656ca9e50090690a20802d31f1eadc0dc88246fd4d47d62bf8(pending)0xa3d7553397352efb84a0bc217a464e9e114207d6  IN  0x0777f76d195795268388789343068e4fcd2869190 Ether(Pending)
0x5c0b5e1478edbac04a04c8a5a66192229048f8e579356e9996d500bdc9207991(pending)0xd9d733f1f4344d187b4663396b3f182cc71827e9  IN  0x0777f76d195795268388789343068e4fcd2869190 Ether(Pending)
0x5075efed24912a4d874063277bb4f5d2535b5cbc2a6d33ac02de09bd896d45d2(pending)0x8e004e7079ea001ea302a4908fbe3ef956b9b572  IN  0x0777f76d195795268388789343068e4fcd2869190 Ether(Pending)
0xacee001d33d68c634d42418cd8fb5b051b34fcf0b11c5474ba8e5154404e3629(pending)0xc8fc84d8b5564bacffabdeae5643f06333bfd4c3  IN  0x0777f76d195795268388789343068e4fcd2869190 Ether(Pending)
0x9cbabebb78e774501c73fd635d1cea1c63b5932fb15a98a1c4f3998e5a9da8e1(pending)0x21625ec892e78171e6b072214362bbf4605f8fea  IN  0x0777f76d195795268388789343068e4fcd2869190 Ether(Pending)
0xca432352f480ea9a5999a894a183cf074e22ed4c66489fc7d59ba5252c9d663e(pending)0x7a3e24b9dbf6afed69b0bb6183505f70b371a68b  IN  0x0777f76d195795268388789343068e4fcd2869190 Ether(Pending)
0xc5fefab4835a467010a7173975260bbf57ea5e1b84499f9c4feffbe80b04fa72(pending)0xdf7a306f3bde0537223a6054b58ff84f38386439  IN  0x0777f76d195795268388789343068e4fcd2869190 Ether(Pending)
0xa2ca5ba76c2b24fda44ad4653c53f05910f3bb8432a1f21e48d6d9a5e1faf263(pending)0xf7f3b4e8f7813f57c80be4711d523f6432dd1389  IN  0x0777f76d195795268388789343068e4fcd2869190 Ether(Pending)
0x4ec872b5ac9cab7cf181df4f4bea342f935556f28fbe4c57129396ab9fb8cad8(pending)0xf7f3b4e8f7813f57c80be4711d523f6432dd1389  IN  0x0777f76d195795268388789343068e4fcd2869190 Ether(Pending)
0x3d578f443032ccee4cf30953907312f9453e7c37d5a8f6a7d755753258366bb3(pending)0x5561bb6de045c3acff0aa3620bbb018426a6d8ac  IN  0x0777f76d195795268388789343068e4fcd2869190 Ether(Pending)
0xf924d48fdcc06e5fb3f8a5450e7b81f33acadc956bc6465cce3eed5e8cecbe8e(pending)0xdf7a306f3bde0537223a6054b58ff84f38386439  IN  0x0777f76d195795268388789343068e4fcd2869190 Ether(Pending)
0x9bd6ea9d929fae6d8f0b43bae37004b44b5d0bdfd82b58c811c0de181a1344ff(pending)0xf7f3b4e8f7813f57c80be4711d523f6432dd1389  IN  0x0777f76d195795268388789343068e4fcd2869190 Ether(Pending)
0x96325f3afa6a33acd92621b3b78ceade008d4585a98bd12333d00b3bbb3ce9f3(pending)0xa5fc4c60ed819a730495602f9d9499497be1aa72  IN  0x0777f76d195795268388789343068e4fcd2869190 Ether(Pending)
0xe13981486104a845a80af2bde6b037395a315755df0900a3b6d604e97ee2848c(pending)0x674e5ef9baadb7149ef035ca0fb6351722359982  IN  0x0777f76d195795268388789343068e4fcd2869190 Ether(Pending)
0xb09ae193ace33b95ac868524469b28c9bc6e90a0f5d517ac3208fadd4f68b6f2(pending)0x409f29238cc6f2505cb7c8cf3f45728f060582d1  IN  0x0777f76d195795268388789343068e4fcd2869190 Ether(Pending)
0x1b4eac7b7a4a25c7eb0faf91757c76b0d1fae0e46b0515210f09cb1d9f8e553d(pending)0x6aa539b9ba244b2de23552ab51d419ba2957f94e  IN  0x0777f76d195795268388789343068e4fcd2869190 Ether(Pending)
 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
0x865409bffcdc91ba52b8ff664c69cd671ba771f620b986a196cd760151c405a0691077031 mins ago0x0777f76d195795268388789343068e4fcd2869190x91b9d2835ad914bc1dcfe09bd1816febd04fd6890.216 Ether
0x9caab80b0d777dbe42d234f7f5a36279c8122f491ddc26f0e887c89d83d38be0691074338 mins ago0x0777f76d195795268388789343068e4fcd2869190x91b9d2835ad914bc1dcfe09bd1816febd04fd6890.012 Ether
0x26ea6139797277b76118ab2f6216ea06ef9b58ca3148fc8174e36e3321481778691066056 mins ago0x0777f76d195795268388789343068e4fcd2869190x91b9d2835ad914bc1dcfe09bd1816febd04fd6890.0108 Ether
0x26ea6139797277b76118ab2f6216ea06ef9b58ca3148fc8174e36e3321481778691066056 mins ago0x0777f76d195795268388789343068e4fcd2869190x9e65a68b05d06a054e07dc7060ec2bb8bc2b93130.0012 Ether
0xbe6d7cfec712cd3f691f6f826277b4137cc8dbfecd1b8b4bdafc2b13cc6487b869106371 hr 1 min ago0x0777f76d195795268388789343068e4fcd2869190x91b9d2835ad914bc1dcfe09bd1816febd04fd6890.0648 Ether
0xbe6d7cfec712cd3f691f6f826277b4137cc8dbfecd1b8b4bdafc2b13cc6487b869106371 hr 1 min ago0x0777f76d195795268388789343068e4fcd2869190x4dd41f6fbf74b1d20b1cde8858d6f2ac3ace6dd00.0072 Ether
0x2305a6da7b73e3572326b090611db626b13e58b277908d959ab32a0abf2f56a469106271 hr 4 mins ago0x0777f76d195795268388789343068e4fcd2869190x91b9d2835ad914bc1dcfe09bd1816febd04fd6890.012 Ether
0x29e58940e2136320f0996b6925e414b89c7d5f22509834b3fb56c40c44feb7d569106041 hr 9 mins ago0x0777f76d195795268388789343068e4fcd2869190x91b9d2835ad914bc1dcfe09bd1816febd04fd6890.012 Ether
0x980f16e3d7a936f72109f2c3f4a24356eab9307652c79ea1dc45b9359687618369105811 hr 14 mins ago0x0777f76d195795268388789343068e4fcd2869190x91b9d2835ad914bc1dcfe09bd1816febd04fd6890.012 Ether
0xedc2c0a35b022349e80279b36c712998cbac8480075b6d1aafeaa15c24d005d569105501 hr 22 mins ago0x0777f76d195795268388789343068e4fcd2869190x91b9d2835ad914bc1dcfe09bd1816febd04fd6891.2 Ether
0xa29429fb40475eeeb86c153d597578649d533019d54207080d4ca8bbe5fa691069105501 hr 22 mins ago0x0777f76d195795268388789343068e4fcd2869190x91b9d2835ad914bc1dcfe09bd1816febd04fd6890.012 Ether
0x4ef0cb1b4efb3ee3e3d9c745d5d48caaa49eb99ee9708eab87abb9a3ef9a26d369105081 hr 31 mins ago0x0777f76d195795268388789343068e4fcd2869190x91b9d2835ad914bc1dcfe09bd1816febd04fd6890.072 Ether
0x82903aa5c3bbeaff95ff7606928e2adb4dbb93cab5eded26a9fcf141ca7075a369104931 hr 35 mins ago0x0777f76d195795268388789343068e4fcd2869190x91b9d2835ad914bc1dcfe09bd1816febd04fd6890.012 Ether
0xd398ef590001e9f83d22d20eab6bc01321b392831865d026fe91309c0bcb352569104761 hr 38 mins ago0x0777f76d195795268388789343068e4fcd2869190x91b9d2835ad914bc1dcfe09bd1816febd04fd6890.012 Ether
0x9e7e37e58dfaea6fd038583cc538be439508f0943abca03f7cf8737c660d773e69104661 hr 40 mins ago0x0777f76d195795268388789343068e4fcd2869190x91b9d2835ad914bc1dcfe09bd1816febd04fd6890.0648 Ether
0x9e7e37e58dfaea6fd038583cc538be439508f0943abca03f7cf8737c660d773e69104661 hr 40 mins ago0x0777f76d195795268388789343068e4fcd2869190x9e65a68b05d06a054e07dc7060ec2bb8bc2b93130.0072 Ether
0xb47424121722ab27df86cf40bae067f6f48b461a1b1a3e6a9d3f698283f8b8f169104641 hr 41 mins ago0x0777f76d195795268388789343068e4fcd2869190x91b9d2835ad914bc1dcfe09bd1816febd04fd6890.6 Ether
0x6a60ee69591452e46fa23c0c2821fa205d1f5704973b5df7f285a5ebad9ef33469104581 hr 42 mins ago0x0777f76d195795268388789343068e4fcd2869190x91b9d2835ad914bc1dcfe09bd1816febd04fd6890.0648 Ether
0x6a60ee69591452e46fa23c0c2821fa205d1f5704973b5df7f285a5ebad9ef33469104581 hr 42 mins ago0x0777f76d195795268388789343068e4fcd2869190x9e65a68b05d06a054e07dc7060ec2bb8bc2b93130.0072 Ether
0xc88104900b7fdff67759c06b96e5c882a16bf35b631e417fdd641168e0ebf88369104441 hr 46 mins ago0x0777f76d195795268388789343068e4fcd2869190x91b9d2835ad914bc1dcfe09bd1816febd04fd6890.012 Ether
0xb9730d56cf5617060614f81ce1b044dbec780104609f6ba743cea115807a8dd369104001 hr 56 mins ago0x0777f76d195795268388789343068e4fcd2869190x91b9d2835ad914bc1dcfe09bd1816febd04fd6890.216 Ether
0x6ddd5e2854f5d6d888287fce2c8355957706410cfc7d484e2abd266a2f36515169103891 hr 59 mins ago0x0777f76d195795268388789343068e4fcd2869190x91b9d2835ad914bc1dcfe09bd1816febd04fd6890.072 Ether
0xc30d372e465dc4015405b1168797d15cd3d432c3195f72c9de956de9f55a830269103882 hrs ago0x0777f76d195795268388789343068e4fcd2869190x91b9d2835ad914bc1dcfe09bd1816febd04fd6890.012 Ether
0xe17950f03db73cee6f2d7ba1910bf72524dd35daf255686fcea27f4c2ed7860d69103872 hrs ago0x0777f76d195795268388789343068e4fcd2869190x91b9d2835ad914bc1dcfe09bd1816febd04fd6890.216 Ether
0x6b80e62b57488e8f371b396ba6e01f5b0f94a7dc963b4213eed4a83d0abded7969103462 hrs 9 mins ago0x0777f76d195795268388789343068e4fcd2869190x91b9d2835ad914bc1dcfe09bd1816febd04fd6890.072 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: RarePackFour
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 RarePackFour is PackFourMultiplier {
    
    function basePrice() public returns (uint) {
        return 12 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 = _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":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
60806040526002805460a060020a60ff02191690556005805462ff00001961ffff19918216600f17166201000017909155600780549091166003179055600880547405000000000000000000000000000000000000000060a060020a61ffff02199091161790553480156200007357600080fd5b5060405162001ff538038062001ff58339810160409081528151602080840151928401516060850151608086015160008054600160a060020a03808616600160a060020a031992831617909255625aa7456001556002805482163317905560038054928516929091169190911790559490950180519395909491939092869186918691869186916200010c916006919087019062000158565b50600780546201000060b060020a03191662010000600160a060020a039384160217905560088054600160a060020a031916959091169490941790935550620001ec9650505050505050565b828054828255906000526020600020908101928215620001b0579160200282015b82811115620001b05782518254600160a060020a031916600160a060020a0390911617825560209092019160019091019062000179565b50620001be929150620001c2565b5090565b620001e991905b80821115620001be578054600160a060020a0319168155600101620001c9565b90565b611df980620001fc6000396000f30060806040526004361061017c5763ffffffff60e060020a60003504166306a628d4811461018157806313af4035146101ac5780631705a3bd146101cf57806317634514146102005780631b3ed72214610227578063379607f514610253578063396c82281461026b5780633ccfd60b146102865780633f4ba83a1461029b57806345d63b66146102b05780635c975abb146102c85780635f9602e8146102f15780636bc3e4a8146103065780636dc7a627146103505780638392fe31146103655780638456cb59146103c15780638be4339b146103d65780638da5cb5b146103eb5780639a1f6a0f14610400578063b01d5b631461041c578063b84c13921461043e578063bd6cac4f14610456578063becd283f14610477578063c2f0bb291461048c578063c503101e146104d2578063c7876ea4146104ec578063ca2bf04714610501578063d42a5011146105b2578063e3f7faaf146105ce578063eb1098b8146105ed578063fbfa77cf14610602578063ff585caf14610617575b600080fd5b34801561018d57600080fd5b5061019661062f565b6040805160ff9092168252519081900360200190f35b3480156101b857600080fd5b506101cd600160a060020a0360043516610634565b005b3480156101db57600080fd5b506101e461067a565b60408051600160a060020a039092168252519081900360200190f35b34801561020c57600080fd5b50610215610689565b60408051918252519081900360200190f35b34801561023357600080fd5b5061023c61068f565b6040805161ffff9092168252519081900360200190f35b34801561025f57600080fd5b506101cd600435610699565b6101cd61ffff60043516600160a060020a036024351661098b565b34801561029257600080fd5b506101cd6109b1565b3480156102a757600080fd5b506101cd610a05565b3480156102bc57600080fd5b506101cd600435610a7d565b3480156102d457600080fd5b506102dd610b21565b604080519115158252519081900360200190f35b3480156102fd57600080fd5b5061023c610b31565b34801561031257600080fd5b5061032a600160a060020a0360043516602435610b3b565b6040805161ffff9093168352600160a060020a0390911660208301528051918290030190f35b34801561035c57600080fd5b506102dd610fc2565b34801561037157600080fd5b5061037d600435610fd1565b6040805161ffff9687168152949095166020850152600160a060020a0390921683850152606083015267ffffffffffffffff16608082015290519081900360a00190f35b3480156103cd57600080fd5b506101cd61102d565b3480156103e257600080fd5b5061023c6110aa565b3480156103f757600080fd5b506101e46110b4565b34801561040c57600080fd5b506101cd61ffff600435166110c3565b6101cd600160a060020a0360043581169061ffff6024351690604435166110f2565b34801561044a57600080fd5b506101e4600435611119565b34801561046257600080fd5b506102dd600160a060020a0360043516611141565b34801561048357600080fd5b5061021561119f565b34801561049857600080fd5b506104b161ffff6004351660ff602435166044356111a5565b6040805161ffff938416815291909216602082015281519081900390910190f35b3480156104de57600080fd5b506101cd60043515156112bf565b3480156104f857600080fd5b506102156112f2565b34801561050d57600080fd5b506105196004356112fd565b604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561055d578181015183820152602001610545565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561059c578181015183820152602001610584565b5050505090500194505050505060405180910390f35b3480156105be57600080fd5b506101cd61ffff600435166114c2565b3480156105da57600080fd5b5061021560043561ffff6024351661150c565b3480156105f957600080fd5b5061023c61154d565b34801561060e57600080fd5b506101e461155e565b34801561062357600080fd5b506101cd60043561156d565b600590565b600254600160a060020a0316331461064b57600080fd5b6002805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600054600160a060020a031681565b60015481565b60075461ffff1681565b6000806000806000806000806060600080600060048d8154811015156106bb57fe5b90600052602060002090600302019b50600560029054906101000a900460ff1615156106e657600080fd5b8b5460018d01546201000090910461ffff169950975061070461062f565b8c54909750600160a060020a03640100000000820416965061ffff16945087151561072e57600080fd5b600061ffff8a161161073f57600080fd5b8660ff1660405190808252806020026020018201604052801561076c578160200160208202803883390190505b5093508861ffff1661077c6110aa565b860161ffff16116107965761078f6110aa565b8501610798565b885b925061ffff808616908416116107ad57600080fd5b8491505b8261ffff168261ffff161015610964575060005b8660ff168160ff1610156108c4576107de82828a6111a5565b809b50819c5050506000809054906101000a9004600160a060020a0316600160a060020a031663fb36eba1878d8d6040518463ffffffff1660e060020a0281526004018084600160a060020a0316600160a060020a031681526020018361ffff1661ffff1681526020018261ffff1661ffff1681526020019350505050602060405180830381600087803b15801561087557600080fd5b505af1158015610889573d6000803e3d6000fd5b505050506040513d602081101561089f57600080fd5b50518451859060ff84169081106108b257fe5b602090810290910101526001016107c5565b85600160a060020a03168d7f69ac64af86d3ef40c9def928534f6a6a9e12d85ec3af2948bd66b802afcc10468960ff16850287604051808361ffff1661ffff16815260200180602001828103825283818151815260200191508051906020019060200280838360005b8381101561094557818101518382015260200161092d565b50505050905001935050505060405180910390a36001909101906107b1565b5050895461ffff1981169390910361ffff9182160116919091179097555050505050505050565b60025460a060020a900460ff16156109a257600080fd5b6109ad338383611742565b5050565b600254600160a060020a031633146109c857600080fd5b600254604051600160a060020a0390911690303180156108fc02916000818181858888f19350505050158015610a02573d6000803e3d6000fd5b50565b600254600160a060020a03163314610a1c57600080fd5b60025460a060020a900460ff161515610a3457600080fd5b6002805474ff0000000000000000000000000000000000000000191690556040517f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3390600090a1565b6000600482815481101515610a8e57fe5b9060005260206000209060030201905080600101546000141515610ab157600080fd5b600281015467ffffffffffffffff9081166101000116431015610ad357600080fd5b60028101805467ffffffffffffffff19164367ffffffffffffffff1617905560405182907f29ef13d2827ff333d3fde4646988c3a7db16de1210f0c0b613fd0ac9773e4e7b90600090a25050565b60025460a060020a900460ff1681565b60055461ffff1681565b600080600080600080600080610b4f611d9f565b600080610b5b8d611141565b1515610b6657600080fd5b610b6e6119e9565b98508c600160a060020a031663379607f58d6040518263ffffffff1660e060020a02815260040180828152602001915050600060405180830381600087803b158015610bb957600080fd5b505af1158015610bcd573d6000803e3d6000fd5b50505050610bd96119e9565b9750888811610be757600080fd5b8888039650600561ffff88160661ffff1615610c0257600080fd5b600561ffff8816600754600854604080517f6352211e0000000000000000000000000000000000000000000000000000000081526000198e016004820152905194909304995061ffff90911689029750600160a060020a031691636352211e916024808201926020929091908290030181600087803b158015610c8457600080fd5b505af1158015610c98573d6000803e3d6000fd5b505050506040513d6020811015610cae57600080fd5b50516040805160a081018252600080825261ffff8981166020848101828152600160a060020a038089168789018181526060890188815267ffffffffffffffff43811660808c01908152600480546001810182559b528b5160038c027f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b81018054995196519098166401000000000277ffffffffffffffffffffffffffffffffffffffff0000000019968d16620100000263ffff00001993909d1661ffff19909a1699909917919091169a909a17939093169590951790935591517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19c87015590517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19d90950180549590921667ffffffffffffffff19909516949094179055855191825294519599509297509095509285927f861fd6f8fe14603acc05fa404f8cca86371619cac8a65a92edf687f81b9bafbd928290030190a3600754604080517ff88218e0000000000000000000000000000000000000000000000000000000008152600160a060020a0387811660048301529151620100009093049091169163f88218e0916024808201926020929091908290030181600087803b158015610e9657600080fd5b505af1158015610eaa573d6000803e3d6000fd5b505050506040513d6020811015610ec057600080fd5b5050604080518a8152602081018a905281517f31a1adb447f9b6b89f24bf104f0b7a06975ad9f35670dbfaf7ce29190ec54762929181900390910190a160085461ffff60a060020a909104811690871611610faf575060005b8661ffff16811015610faf5760008054604080517f454b0608000000000000000000000000000000000000000000000000000000008152848c036000190160048201529051600160a060020a039092169263454b06089260248084019382900301818387803b158015610f8b57600080fd5b505af1158015610f9f573d6000803e3d6000fd5b505060019092019150610f199050565b50929b919a509098505050505050505050565b60055462010000900460ff1681565b6004805482908110610fdf57fe5b600091825260209091206003909102018054600182015460029092015461ffff80831694506201000083041692640100000000909204600160a060020a0316919067ffffffffffffffff1685565b600254600160a060020a0316331461104457600080fd5b60025460a060020a900460ff161561105b57600080fd5b6002805474ff0000000000000000000000000000000000000000191660a060020a1790556040517f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62590600090a1565b60055461ffff1690565b600254600160a060020a031681565b600254600160a060020a031633146110da57600080fd5b6005805461ffff191661ffff92909216919091179055565b60025460a060020a900460ff161561110957600080fd5b611114838383611742565b505050565b600680548290811061112757fe5b600091825260209091200154600160a060020a0316905081565b6000805b6006548110156111945782600160a060020a031660068281548110151561116857fe5b600091825260209091200154600160a060020a0316141561118c5760019150611199565b600101611145565b600091505b50919050565b60045490565b6000806000806000806000806111bc8b8b8b611b06565b9399509197509195509093509150600460ff8b1614156111e6576111df85611c6d565b90506111f2565b6111ef85611cc1565b90505b6111fc8383611d2c565b6000546040517fcaa19168000000000000000000000000000000000000000000000000000000008152919850600160a060020a03169063caa1916890839087906004908101908190849081111561124f57fe5b60ff1681526020018261ffff1661ffff16815260200192505050602060405180830381600087803b15801561128357600080fd5b505af1158015611297573d6000803e3d6000fd5b505050506040513d60208110156112ad57600080fd5b50519750505050505050935093915050565b600254600160a060020a031633146112d657600080fd5b60058054911515620100000262ff000019909216919091179055565b662aa1efb94e000090565b606080611308611d9f565b600080600080600080600060048b81548110151561132257fe5b60009182526020918290206040805160a0810182526003909302909101805461ffff808216855262010000820416948401859052600160a060020a03640100000000909104169183019190915260018101546060830181905260029091015467ffffffffffffffff16608083015290995090955093506113a061062f565b9250848360ff160261ffff166040519080825280602002602001820160405280156113d5578160200160208202803883390190505b509850848360ff160261ffff1660405190808252806020026020018201604052801561140b578160200160208202803883390190505b509950600091505b8461ffff168261ffff1610156114b5575060005b8260ff168160ff1610156114aa576114408282866111a5565b8a51919850965086908a9061ffff60ff8781168702908616011690811061146357fe5b61ffff928316602091820290920101528a5188918c9160ff87811687029086160190911690811061149057fe5b61ffff909216602092830290910190910152600101611427565b600190910190611413565b5050505050505050915091565b600254600160a060020a031633146114d957600080fd5b6008805461ffff90921660a060020a0275ffff000000000000000000000000000000000000000019909216919091179055565b60015460009043036117708104601481101561153b5761ffff8416606460148390038702048603029250611545565b8361ffff16850292505b505092915050565b60085460a060020a900461ffff1681565b600354600160a060020a031681565b600080600060048481548110151561158157fe5b90600052602060002090600302019250826001015460001415156115a457600080fd5b600283015467ffffffffffffffff1660ff194301106115c257600080fd5b60028301544367ffffffffffffffff908116911614156115e157600080fd5b600283015483546040805167ffffffffffffffff9093164060208085018290526401000000008404600160a060020a03166c0100000000000000000000000090810286850152300260548601526201000090930461ffff167e010000000000000000000000000000000000000000000000000000000000000260688501528151808503604a018152606a90940191829052835190955090918291908401908083835b602083106116a25780518252601f199092019160209182019101611683565b5181516020939093036101000a600019018019909116921691909117905260405192018290039091209350505082151590506116dd57600080fd5b6001830181905582546040805162010000830461ffff168152602081018490528151640100000000909304600160a060020a03169287927fedb5ce4012b6e9c5904afa2ffad9811d5c2e91e6bca8914cf7e3ffc28e630c57928290030190a350505050565b600061174c611d9f565b60008061ffff8616811061175f57600080fd5b600160a060020a03858116908816141561177857600080fd5b6117896117836112f2565b8761150c565b93503484111561179857600080fd5b6040805160a081018252600080825261ffff8981166020808501828152600160a060020a03808f168789018181526060890188815267ffffffffffffffff43811660808c01908152600480546001810182559b528b5160038c027f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b81018054995196519098166401000000000277ffffffffffffffffffffffffffffffffffffffff0000000019968d16620100000263ffff00001993909d1661ffff19909a1699909917919091169a909a17939093169590951790935591517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19c87015590517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19d90950180549590921667ffffffffffffffff19909516949094179055855191825294519397509195509285927f861fd6f8fe14603acc05fa404f8cca86371619cac8a65a92edf687f81b9bafbd9281900390910190a3600160a060020a038516156119a55750604051600a840490600160a060020a0386169082156108fc029083906000818181858888f19350505050158015611959573d6000803e3d6000fd5b5060408051828152600160a060020a03898116602083015282519684900396908816927f13aa7090696e2a1d666cfc6046f2f72f1c4e0290649b47bab28d1b370ad73783928290030190a25b600354604051600160a060020a039091169085156108fc029086906000818181858888f193505050501580156119df573d6000803e3d6000fd5b5050505050505050565b600854604080517f524773ce0000000000000000000000000000000000000000000000000000000081529051600092600160a060020a03169163524773ce91600480830192602092919082900301818787803b158015611a4857600080fd5b505af1158015611a5c573d6000803e3d6000fd5b505050506040513d6020811015611a7257600080fd5b5051600854604080517f18160ddd0000000000000000000000000000000000000000000000000000000081529051600160a060020a03909216916318160ddd916004808201926020929091908290030181600087803b158015611ad457600080fd5b505af1158015611ae8573d6000803e3d6000fd5b505050506040513d6020811015611afe57600080fd5b505101905090565b6000806000806000878688604051602001808461ffff1661ffff167e010000000000000000000000000000000000000000000000000000000000000281526002018381526020018260ff1660ff167f010000000000000000000000000000000000000000000000000000000000000002815260010193505050506040516020818303038152906040526040518082805190602001908083835b60208310611bbe5780518252601f199092019160209182019101611b9f565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020600190049450620f4240611c02866004600a611d7f565b811515611c0b57fe5b0693506103e8611c1e8660026004611d7f565b811515611c2757fe5b0692506103e8611c3a8660026006611d7f565b811515611c4357fe5b06915061ffff611c568660026008611d7f565b811515611c5f57fe5b069050939792965093509350565b60008163ffffffff16620f423f1415611c8857506004611cbc565b620efa6f63ffffffff831610611ca057506003611cbc565b620d03cc63ffffffff831610611cb857506002611cbc565b5060015b919050565b60008163ffffffff16620f423f1415611cdc57506004611cbc565b620f3bc963ffffffff831610611cf457506003611cbc565b620f0e8d63ffffffff831610611d0c57506002611cbc565b620e1cda63ffffffff831610611d2457506001611cbc565b506000611cbc565b60006103e661ffff841610611d465750610bb88101611d79565b6103dc61ffff841610611d5e57506107d08101611d79565b6103aa61ffff841610611d7657506103e88101611d79565b50805b92915050565b6008828102600290810a60001990810192840201900a8404169392505050565b6040805160a081018252600080825260208201819052918101829052606081018290526080810191909152905600a165627a7a72305820cd3d156a4f468bfe311e1c27db19b3b7e56d9e1fdcb58e4252e6ff088537c5a80029000000000000000000000000512fbd15bde6570ff09e4438af27ede60402451500000000000000000000000000000000000000000000000000000000000000a00000000000000000000000006ebeaf8e8e946f0716e6533a6f2cefc83f60e8ab00000000000000000000000091b9d2835ad914bc1dcfe09bd1816febd04fd689000000000000000000000000657c8982d63f58ddd6a54c75591a572d4180cec80000000000000000000000000000000000000000000000000000000000000002000000000000000000000000ca6746f65d53d2df5022b5d775817e62e8462690000000000000000000000000015531a044bae03bf4dab1ceabfc232a969b7175

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

-----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] : 000000000000000000000000ca6746f65d53d2df5022b5d775817e62e8462690
Arg [7] : 000000000000000000000000015531a044bae03bf4dab1ceabfc232a969b7175


   Swarm Source:
bzzr://cd3d156a4f468bfe311e1c27db19b3b7e56d9e1fdcb58e4252e6ff088537c5a8

 

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.