ETH Price: $3,482.37 (+3.58%)
Gas: 2 Gwei

Contract

0x3b259dfEB348a8aF4ca75a5110B7782F33BD866C
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Value
0x60806040181880382023-09-22 1:11:23283 days ago1695345083IN
 Create: EtherOrcsAllies
0 ETH0.016141668.59431873

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
EtherOrcsAllies

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 4 : EtherOrcsAllies.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.7;

import "../ERC20.sol";
import "./ERC721.sol"; 
import "../interfaces/Interfaces.sol";

contract EtherOrcsAllies is ERC721 {

    uint256 constant startId = 5050;

    mapping(uint256 => Ally) public allies;
    mapping(address => bool) public auth;

    uint16 public shSupply;
    uint16 public ogSupply;
    uint16 public mgSupply;
    uint16 public rgSupply;

    ERC20 boneShards;

    MetadataHandlerAllies metadaHandler;

    address public castle;
    bool    public openForMint;
    
    bytes32 internal entropySauce;

    struct Ally {uint8 class; uint16 level; uint32 lvlProgress; uint16 modF; uint8 skillCredits; bytes22 details;}

    struct Shaman {uint8 body; uint8 featA; uint8 featB; uint8 helm; uint8 mainhand; uint8 offhand;}
    struct Ogre   {uint8 body; uint8 mouth; uint8 nose;  uint8 eyes; uint8 armor; uint8 mainhand; uint8 offhand;}
    struct Rogue  {uint8 body; uint8 face; uint8 boots; uint8 pants; uint8 shirt; uint8 hair; uint8 armor; uint8 mainhand; uint8 offhand;}

    modifier noCheaters() {
        uint256 size = 0;
        address acc = msg.sender;
        assembly { size := extcodesize(acc)}

        require(auth[msg.sender] || (msg.sender == tx.origin && size == 0), "you're trying to cheat!");
        _;

        // We'll use the last caller hash to add entropy to next caller
        entropySauce = keccak256(abi.encodePacked(acc, block.coinbase));
    }

    function initialize(address ct, address bs, address meta) external {
        require(msg.sender == admin);

        castle = ct;
        boneShards = ERC20(bs);
        metadaHandler = MetadataHandlerAllies(meta);
    }

    function setAdmin(address admin_) external {
        require(msg.sender == admin);
        admin = admin_;
        auth[admin_] = true;
    }

    function setAuth(address add_, bool status) external {
        require(msg.sender == admin);
        auth[add_] = status;
    }

    function setMintOpen(bool open_) external {
        require(msg.sender == admin);
        openForMint = open_;
    }

    function tokenURI(uint256 id) external view returns(string memory) {
        Ally memory ally = allies[id];
        return metadaHandler.getTokenURI(id, ally.class, ally.level, ally.modF, ally.skillCredits, ally.details);
    }

    function mintRogues(uint256 amount) external {
        for (uint256 i = 0; i < amount; i++) {
            mintRogue();
        }
    }

    function mintRogue() public noCheaters {
        require(openForMint || auth[msg.sender], "not open for mint");
        boneShards.burn(msg.sender, 60 ether);

        _mintRogue(_rand());
    } 

    // function mintOgres(uint256 amount) external {
    //     for (uint256 i = 0; i < amount; i++) {
    //         mintOgre();
    //     }
    // }

    // function mintOgre() public noCheaters {
    //     require(openForMint || auth[msg.sender], "not open for mint");
    //     boneShards.burn(msg.sender, 60 ether);

    //     _mintOgre(_rand());
    // } 

    function pull(address owner_, uint256[] calldata ids) external {
        require (auth[msg.sender], "not auth");
        for (uint256 index = 0; index < ids.length; index++) {
            _transfer(owner_, msg.sender, ids[index]);
        }
        CastleLike(msg.sender).pullCallback(owner_, ids);
    }

    function adjustAlly(uint256 id, uint8 class_, uint16 level_, uint32 lvlProgress_, uint16 modF_, uint8 skillCredits_, bytes22 details_) external {
        require(auth[msg.sender], "not authorized");

        allies[id] = Ally({class: class_, level: level_, lvlProgress: lvlProgress_, modF: modF_, skillCredits: skillCredits_, details: details_});
    }

    function shaman(bytes22 details) external pure returns(Shaman memory sh) {
        uint8 body     = uint8(bytes1(details));
        uint8 featA    = uint8(bytes1(details << 8));
        uint8 featB    = uint8(bytes1(details << 16));
        uint8 helm     = uint8(bytes1(details << 24));
        uint8 mainhand = uint8(bytes1(details << 32));
        uint8 offhand  = uint8(bytes1(details << 40));

        sh.body     = body;
        sh.featA    = featA;
        sh.featB    = featB;
        sh.helm     = helm;
        sh.mainhand = mainhand;
        sh.offhand  = offhand;
    }

    function ogre(bytes22 details) external pure returns(Ogre memory og) {
        uint8 body     = uint8(bytes1(details));
        uint8 mouth    = uint8(bytes1(details << 8));
        uint8 nose     = uint8(bytes1(details << 16));
        uint8 eye      = uint8(bytes1(details << 24));
        uint8 armor    = uint8(bytes1(details << 32));
        uint8 mainhand = uint8(bytes1(details << 40));
        uint8 offhand  = uint8(bytes1(details << 48));

        og.body     = body;
        og.mouth    = mouth;
        og.nose     = nose;
        og.eyes     = eye;
        og.armor    = armor;
        og.mainhand = mainhand;
        og.offhand  = offhand;
    }

    function rogue(bytes22 details) external pure returns(Rogue memory rg) {
        uint8 body     = uint8(bytes1(details));
        uint8 face     = uint8(bytes1(details << 8));
        uint8 boots    = uint8(bytes1(details << 16));
        uint8 pants    = uint8(bytes1(details << 24));
        uint8 shirt    = uint8(bytes1(details << 32));
        uint8 hair     = uint8(bytes1(details << 40));
        uint8 armor    = uint8(bytes1(details << 48));
        uint8 mainhand = uint8(bytes1(details << 56));
        uint8 offhand  = uint8(bytes1(details << 64));

        rg.body     = body;
        rg.face     = face;
        rg.armor    = armor;
        rg.mainhand = mainhand;
        rg.offhand  = offhand;
        rg.boots    = boots;
        rg.pants    = pants;
        rg.shirt    = shirt;
        rg.hair     = hair;
    }

    function _mintOgre(uint256 rand) internal returns (uint16 id) {
        id = uint16(ogSupply + 3001 + startId); //check that supply is less than 3000
        require(ogSupply++ <= 3000, "max supply reached");

        // Getting Random traits
        uint8 body = uint8(_randomize(rand, "BODY", id) % 8) + 1; 

        uint8 mouth    = uint8(_randomize(rand, "MOUTH",    id) % 3) + 1 + ((body - 1) * 3); 
        uint8 nose     = uint8(_randomize(rand, "NOSE",     id) % 3) + 1 + ((body - 1) * 3); 
        uint8 eyes     = uint8(_randomize(rand, "EYES",     id) % 3) + 1 + ((body - 1) * 3); 
        uint8 armor    = uint8(_randomize(rand, "ARMOR",    id) % 6) + 1;
        uint8 mainhand = uint8(_randomize(rand, "MAINHAND", id) % 6) + 1; 
        uint8 offhand  = uint8(_randomize(rand, "OFFHAND",  id) % 6) + 1;

        _mint(msg.sender, id);

        allies[id] = Ally({class: 2, level: 30, lvlProgress: 30000, modF: 0, skillCredits: 100, details: bytes22(abi.encodePacked(body, mouth, nose, eyes, armor, mainhand, offhand))});
    }

    function _mintRogue(uint256 rand) internal returns (uint16 id) {
        id = uint16(rgSupply + 6001 + startId); //check that supply is less than 3000
        require(rgSupply++ <= 3000, "max supply reached");

        // Getting Random traits
        uint8 body = uint8(_randomize(rand, "BODY", id) % 2) + 1; 

        uint8 face     = uint8(_randomize(rand, "FACE",     id) % 10) + 1 + ((body - 1) * 10); 
        uint8 boots    = uint8(_randomize(rand, "BOOTS",    id) % 25) + 1;
        uint8 pants    = uint8(_randomize(rand, "PANTS",    id) % 21) + 1;
        uint8 shirt    = uint8(_randomize(rand, "SHIRT",    id) % 19) + 1;
        uint8 hair     = uint8(_randomize(rand, "HAIR",     id) % 21) + 1;

        _mint(msg.sender, id);

        allies[id] = Ally({class: 3, level: 30, lvlProgress: 30000, modF: 0, skillCredits: 100, details: bytes22(abi.encodePacked(body, face, boots, pants, shirt, hair, uint8(0), uint8(0), uint8(0)))});
    }

    /// @dev Create a bit more of randomness
    function _randomize(uint256 rand, string memory val, uint256 spicy) internal pure returns (uint256) {
        return uint256(keccak256(abi.encode(rand, val, spicy)));
    }

    function _rand() internal view returns (uint256) {
        return uint256(keccak256(abi.encodePacked(msg.sender, block.timestamp, block.basefee, block.timestamp, entropySauce)));
    }
}

File 2 of 4 : ERC20.sol
// SPDX-License-Identifier: Unlicense
pragma solidity 0.8.7;

/// @notice Modern and gas efficient ERC20 + EIP-2612 implementation.
/// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol)
/// Taken from Solmate: https://github.com/Rari-Capital/solmate

abstract contract ERC20 {
    /*///////////////////////////////////////////////////////////////
                                  EVENTS
    //////////////////////////////////////////////////////////////*/

    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /*///////////////////////////////////////////////////////////////
                             METADATA STORAGE
    //////////////////////////////////////////////////////////////*/

    function name() external view virtual returns (string memory);
    function symbol() external view virtual returns (string memory);
    function decimals() external view virtual returns (uint8);

    // string public constant name     = "ZUG";
    // string public constant symbol   = "ZUG";
    // uint8  public constant decimals = 18;

    /*///////////////////////////////////////////////////////////////
                             ERC20 STORAGE
    //////////////////////////////////////////////////////////////*/

    uint256 public totalSupply;

    mapping(address => uint256) public balanceOf;

    mapping(address => mapping(address => uint256)) public allowance;

    mapping(address => bool) public isMinter;

    address public ruler;

    /*///////////////////////////////////////////////////////////////
                              ERC20 LOGIC
    //////////////////////////////////////////////////////////////*/

    constructor() { ruler = msg.sender;}

    function approve(address spender, uint256 value) external returns (bool) {
        allowance[msg.sender][spender] = value;

        emit Approval(msg.sender, spender, value);

        return true;
    }

    function transfer(address to, uint256 value) external returns (bool) {
        balanceOf[msg.sender] -= value;

        // This is safe because the sum of all user
        // balances can't exceed type(uint256).max!
        unchecked {
            balanceOf[to] += value;
        }

        emit Transfer(msg.sender, to, value);

        return true;
    }

    function transferFrom(
        address from,
        address to,
        uint256 value
    ) external returns (bool) {
        if (allowance[from][msg.sender] != type(uint256).max) {
            allowance[from][msg.sender] -= value;
        }

        balanceOf[from] -= value;

        // This is safe because the sum of all user
        // balances can't exceed type(uint256).max!
        unchecked {
            balanceOf[to] += value;
        }

        emit Transfer(from, to, value);

        return true;
    }

    /*///////////////////////////////////////////////////////////////
                             ORC PRIVILEGE
    //////////////////////////////////////////////////////////////*/

    function mint(address to, uint256 value) external {
        require(isMinter[msg.sender], "FORBIDDEN TO MINT");
        _mint(to, value);
    }

    function burn(address from, uint256 value) external {
        require(isMinter[msg.sender], "FORBIDDEN TO BURN");
        _burn(from, value);
    }

    /*///////////////////////////////////////////////////////////////
                         Ruler Function
    //////////////////////////////////////////////////////////////*/

    function setMinter(address minter, bool status) external {
        require(msg.sender == ruler, "NOT ALLOWED TO RULE");

        isMinter[minter] = status;
    }

    function setRuler(address ruler_) external {
        require(msg.sender == ruler ||ruler == address(0), "NOT ALLOWED TO RULE");

        ruler = ruler_;
    }


    /*///////////////////////////////////////////////////////////////
                          INTERNAL UTILS
    //////////////////////////////////////////////////////////////*/

    function _mint(address to, uint256 value) internal {
        totalSupply += value;

        // This is safe because the sum of all user
        // balances can't exceed type(uint256).max!
        unchecked {
            balanceOf[to] += value;
        }

        emit Transfer(address(0), to, value);
    }

    function _burn(address from, uint256 value) internal {
        balanceOf[from] -= value;

        // This is safe because a user won't ever
        // have a balance larger than totalSupply!
        unchecked {
            totalSupply -= value;
        }

        emit Transfer(from, address(0), value);
    }
}

File 3 of 4 : ERC721.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity 0.8.7;

/// @notice Modern and gas efficient ERC-721 + ERC-20/EIP-2612-like implementation,
/// including the MetaData, and partially, Enumerable extensions.
contract ERC721 {
    /*///////////////////////////////////////////////////////////////
                                  EVENTS
    //////////////////////////////////////////////////////////////*/
    
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
    
    event Approval(address indexed owner, address indexed spender, uint256 indexed tokenId);
    
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
    
    /*///////////////////////////////////////////////////////////////
                             METADATA STORAGE
    //////////////////////////////////////////////////////////////*/
    
    address        implementation_;
    address public admin; //Lame requirement from opensea
    
    /*///////////////////////////////////////////////////////////////
                             ERC-721 STORAGE
    //////////////////////////////////////////////////////////////*/

    uint256 public totalSupply;
    
    mapping(address => uint256) public balanceOf;
    
    mapping(uint256 => address) public ownerOf;
        
    mapping(uint256 => address) public getApproved;
 
    mapping(address => mapping(address => bool)) public isApprovedForAll;

    /*///////////////////////////////////////////////////////////////
                             VIEW FUNCTION
    //////////////////////////////////////////////////////////////*/

    function owner() external view returns (address) {
        return admin;
    }
    
    /*///////////////////////////////////////////////////////////////
                              ERC-20-LIKE LOGIC
    //////////////////////////////////////////////////////////////*/
    
    function transfer(address to, uint256 tokenId) external {
        require(msg.sender == ownerOf[tokenId], "NOT_OWNER");
        
        _transfer(msg.sender, to, tokenId);
        
    }
    
    /*///////////////////////////////////////////////////////////////
                              ERC-721 LOGIC
    //////////////////////////////////////////////////////////////*/
    
    function supportsInterface(bytes4 interfaceId) external pure returns (bool supported) {
        supported = interfaceId == 0x80ac58cd || interfaceId == 0x5b5e139f;
    }
    
    function approve(address spender, uint256 tokenId) external {
        address owner_ = ownerOf[tokenId];
        
        require(msg.sender == owner_ || isApprovedForAll[owner_][msg.sender], "NOT_APPROVED");
        
        getApproved[tokenId] = spender;
        
        emit Approval(owner_, spender, tokenId); 
    }
    
    function setApprovalForAll(address operator, bool approved) external {
        isApprovedForAll[msg.sender][operator] = approved;
        
        emit ApprovalForAll(msg.sender, operator, approved);
    }

    function transferFrom(address from, address to, uint256 tokenId) public {        
        require(
            msg.sender == from 
            || msg.sender == getApproved[tokenId]
            || isApprovedForAll[from][msg.sender], 
            "NOT_APPROVED"
        );
        
        _transfer(from, to, tokenId);
        
    }
    
    function safeTransferFrom(address from, address to, uint256 tokenId) external {
        safeTransferFrom(from, to, tokenId, "");
    }
    
    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public {
        transferFrom(from, to, tokenId); 
        
        if (to.code.length != 0) {
            // selector = `onERC721Received(address,address,uint,bytes)`
            (, bytes memory returned) = to.staticcall(abi.encodeWithSelector(0x150b7a02,
                msg.sender, address(0), tokenId, data));
                
            bytes4 selector = abi.decode(returned, (bytes4));
            
            require(selector == 0x150b7a02, "NOT_ERC721_RECEIVER");
        }
    }
    
    /*///////////////////////////////////////////////////////////////
                          INTERNAL UTILS
    //////////////////////////////////////////////////////////////*/

    function _transfer(address from, address to, uint256 tokenId) internal {
        require(ownerOf[tokenId] == from, "not owner");

        balanceOf[from]--; 
        balanceOf[to]++;
        
        delete getApproved[tokenId];
        
        ownerOf[tokenId] = to;
        emit Transfer(from, to, tokenId); 

    }

    function _mint(address to, uint256 tokenId) internal { 
        require(ownerOf[tokenId] == address(0), "ALREADY_MINTED");

        totalSupply++;
        
        // This is safe because the sum of all user
        // balances can't exceed type(uint256).max!
        unchecked {
            balanceOf[to]++;
        }
        
        ownerOf[tokenId] = to;
                
        emit Transfer(address(0), to, tokenId); 
    }
    
    function _burn(uint256 tokenId) internal { 
        address owner_ = ownerOf[tokenId];
        
        require(ownerOf[tokenId] != address(0), "NOT_MINTED");
        
        totalSupply--;
        balanceOf[owner_]--;
        
        delete ownerOf[tokenId];
                
        emit Transfer(owner_, address(0), tokenId); 
    }
}

File 4 of 4 : Interfaces.sol
// SPDX-License-Identifier: Unlicense
pragma solidity 0.8.7;

interface OrcishLike {
    function pull(address owner, uint256[] calldata ids) external;
    function manuallyAdjustOrc(uint256 id, uint8 body, uint8 helm, uint8 mainhand, uint8 offhand, uint16 level, uint16 zugModifier, uint32 lvlProgress) external;
    function transfer(address to, uint256 tokenId) external;
    function orcs(uint256 id) external view returns(uint8 body, uint8 helm, uint8 mainhand, uint8 offhand, uint16 level, uint16 zugModifier, uint32 lvlProgress);
    function allies(uint256 id) external view returns (uint8 class, uint16 level, uint32 lvlProgress, uint16 modF, uint8 skillCredits, bytes22 details);
    function adjustAlly(uint256 id, uint8 class_, uint16 level_, uint32 lvlProgress_, uint16 modF_, uint8 skillCredits_, bytes22 details_) external;
    function ogres(uint256 id) external view returns(uint16 level, uint32 lvlProgress, uint16 modF, uint8 skillCredits, uint8 body, uint8 mouth, uint8 nose, uint8 eyes, uint8 armor, uint8 mainhand, uint8 offhand);
    function claim(uint256[] calldata ids) external;
    function rogue(bytes22 details) external pure returns(uint8 body, uint8 face, uint8 boots, uint8 pants,uint8 shirt,uint8 hair ,uint8 armor ,uint8 mainhand,uint8 offhand);
}


        

interface PortalLike {
    function sendMessage(bytes calldata message_) external;
}

interface OracleLike {
    function request() external returns (uint64 key);
    function getRandom(uint64 id) external view returns(uint256 rand);
}

interface MetadataHandlerLike {
    function getTokenURI(uint16 id, uint8 body, uint8 helm, uint8 mainhand, uint8 offhand, uint16 level, uint16 zugModifier) external view returns (string memory);
}

interface MetadataHandlerAllies {
    function getTokenURI(uint256 id_, uint256 class_, uint256 level_, uint256 modF_, uint256 skillCredits_, bytes22 details_) external view returns (string memory);
}

interface RaidsLike {
    function stakeManyAndStartCampaign(uint256[] calldata ids_, address owner_, uint256 location_, bool double_) external;
    function startCampaignWithMany(uint256[] calldata ids, uint256 location_, bool double_) external;
    function commanders(uint256 id) external returns(address);
    function unstake(uint256 id) external;
}

interface RaidsLikePoly {
    function stakeManyAndStartCampaign(uint256[] calldata ids_, address owner_, uint256 location_, bool double_, uint256[] calldata potions_, uint256[] calldata runes_) external;
    function startCampaignWithMany(uint256[] calldata ids, uint256 location_, bool double_,  uint256[] calldata potions_, uint256[] calldata runes_) external;
    function commanders(uint256 id) external returns(address);
    function unstake(uint256 id) external;
}

interface CastleLike {
    function pullCallback(address owner, uint256[] calldata ids) external;
}

interface EtherOrcsLike {
    function ownerOf(uint256 id) external view returns (address owner_);
    function activities(uint256 id) external view returns (address owner, uint88 timestamp, uint8 action);
    function orcs(uint256 orcId) external view returns (uint8 body, uint8 helm, uint8 mainhand, uint8 offhand, uint16 level, uint16 zugModifier, uint32 lvlProgress);
}

interface ERC20Like {
    function balanceOf(address from) external view returns(uint256 balance);
    function burn(address from, uint256 amount) external;
    function mint(address from, uint256 amount) external;
    function transfer(address to, uint256 amount) external;
}

interface ERC1155Like {
    function balanceOf(address _owner, uint256 _id) external view returns (uint256);
    function mint(address to, uint256 id, uint256 amount) external;
    function burn(address from, uint256 id, uint256 amount) external;
    function safeTransferFrom(address _from, address _to, uint256 _id, uint256 _amount, bytes memory _data) external;
}

interface ERC721Like {
    function transferFrom(address from, address to, uint256 id) external;   
    function transfer(address to, uint256 id) external;
    function ownerOf(uint256 id) external returns (address owner);
    function mint(address to, uint256 tokenid) external;
}

interface HallOfChampionsLike {
    function joined(uint256 orcId) external view returns (uint256 joinDate);
} 

interface AlliesLike {
    function allies(uint256 id) external view returns (uint8 class, uint16 level, uint32 lvlProgress, uint16 modF, uint8 skillCredits, bytes22 details);
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint8","name":"class_","type":"uint8"},{"internalType":"uint16","name":"level_","type":"uint16"},{"internalType":"uint32","name":"lvlProgress_","type":"uint32"},{"internalType":"uint16","name":"modF_","type":"uint16"},{"internalType":"uint8","name":"skillCredits_","type":"uint8"},{"internalType":"bytes22","name":"details_","type":"bytes22"}],"name":"adjustAlly","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"allies","outputs":[{"internalType":"uint8","name":"class","type":"uint8"},{"internalType":"uint16","name":"level","type":"uint16"},{"internalType":"uint32","name":"lvlProgress","type":"uint32"},{"internalType":"uint16","name":"modF","type":"uint16"},{"internalType":"uint8","name":"skillCredits","type":"uint8"},{"internalType":"bytes22","name":"details","type":"bytes22"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"auth","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"castle","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"ct","type":"address"},{"internalType":"address","name":"bs","type":"address"},{"internalType":"address","name":"meta","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mgSupply","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintRogue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mintRogues","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"ogSupply","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes22","name":"details","type":"bytes22"}],"name":"ogre","outputs":[{"components":[{"internalType":"uint8","name":"body","type":"uint8"},{"internalType":"uint8","name":"mouth","type":"uint8"},{"internalType":"uint8","name":"nose","type":"uint8"},{"internalType":"uint8","name":"eyes","type":"uint8"},{"internalType":"uint8","name":"armor","type":"uint8"},{"internalType":"uint8","name":"mainhand","type":"uint8"},{"internalType":"uint8","name":"offhand","type":"uint8"}],"internalType":"struct EtherOrcsAllies.Ogre","name":"og","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"openForMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner_","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"pull","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rgSupply","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes22","name":"details","type":"bytes22"}],"name":"rogue","outputs":[{"components":[{"internalType":"uint8","name":"body","type":"uint8"},{"internalType":"uint8","name":"face","type":"uint8"},{"internalType":"uint8","name":"boots","type":"uint8"},{"internalType":"uint8","name":"pants","type":"uint8"},{"internalType":"uint8","name":"shirt","type":"uint8"},{"internalType":"uint8","name":"hair","type":"uint8"},{"internalType":"uint8","name":"armor","type":"uint8"},{"internalType":"uint8","name":"mainhand","type":"uint8"},{"internalType":"uint8","name":"offhand","type":"uint8"}],"internalType":"struct EtherOrcsAllies.Rogue","name":"rg","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"admin_","type":"address"}],"name":"setAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"add_","type":"address"},{"internalType":"bool","name":"status","type":"bool"}],"name":"setAuth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"open_","type":"bool"}],"name":"setMintOpen","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"shSupply","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes22","name":"details","type":"bytes22"}],"name":"shaman","outputs":[{"components":[{"internalType":"uint8","name":"body","type":"uint8"},{"internalType":"uint8","name":"featA","type":"uint8"},{"internalType":"uint8","name":"featB","type":"uint8"},{"internalType":"uint8","name":"helm","type":"uint8"},{"internalType":"uint8","name":"mainhand","type":"uint8"},{"internalType":"uint8","name":"offhand","type":"uint8"}],"internalType":"struct EtherOrcsAllies.Shaman","name":"sh","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"supported","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405234801561001057600080fd5b50612102806100206000396000f3fe608060405234801561001057600080fd5b50600436106102065760003560e01c80638fd54c241161011a578063c87b56dd116100ad578063e985e9c51161007c578063e985e9c51461068b578063f734d723146106b9578063f8004d311461078d578063f851a440146107a0578063f9915c52146107b357600080fd5b8063c87b56dd1461062d578063cd5d21181461064d578063d046182514610670578063d23d24341461067857600080fd5b8063a9059cbb116100e9578063a9059cbb146105e0578063ae5b7a7d146105f3578063b88d4fde14610607578063c0c53b8b1461061a57600080fd5b80638fd54c24146104e857806397ce6a64146104fd578063a22cb465146105ba578063a3e9ec29146105cd57600080fd5b80633f19ac881161019d57806367d974571161016c57806367d9745714610360578063704b6c021461040a57806370a082311461041d5780637b96af3e1461043d5780638da5cb5b146104d757600080fd5b80633f19ac88146102fd57806342842e0e146103105780634429eda7146103235780636352211e1461033757600080fd5b806318160ddd116101d957806318160ddd1461029c57806323b872dd146102b357806326712942146102c65780633ca80508146102ef57600080fd5b806301ffc9a71461020b578063081812fc14610233578063095ea7b3146102745780630b44a21814610289575b600080fd5b61021e610219366004611b81565b6107c6565b60405190151581526020015b60405180910390f35b61025c610241366004611c32565b6005602052600090815260409020546001600160a01b031681565b6040516001600160a01b03909116815260200161022a565b610287610282366004611b21565b6107fd565b005b610287610297366004611af7565b6108e2565b6102a560025481565b60405190815260200161022a565b6102876102c136600461198a565b610924565b6009546102dc90640100000000900461ffff1681565b60405161ffff909116815260200161022a565b6009546102dc9061ffff1681565b600b5461025c906001600160a01b031681565b61028761031e36600461198a565b6109ca565b600b5461021e90600160a01b900460ff1681565b61025c610345366004611c32565b6004602052600090815260409020546001600160a01b031681565b6103bf61036e366004611c32565b60076020526000908152604090205460ff8082169161ffff610100820481169263ffffffff630100000084041692600160381b810490921691600160481b810490911690600160501b900460501b86565b6040805160ff978816815261ffff968716602082015263ffffffff909516908501529390911660608301529290921660808301526001600160501b03191660a082015260c00161022a565b6102876104183660046118f9565b6109e5565b6102a561042b3660046118f9565b60036020526000908152604090205481565b6104ca61044b366004611b66565b604080516101208101825260f883901c815260ff60f084901c8116602083015260c884901c811660c08084019190915284901c811660e08084019190915260b885901c821661010084015260e885901c8216938301939093529183901c8216606082015260d883901c8216608082015260d09290921c1660a082015290565b60405161022a9190611dba565b6001546001600160a01b031661025c565b6009546102dc90600160301b900461ffff1681565b61055f61050b366004611b66565b6040805160c08101825260f883901c815260ff60f084901c8116602083015260e884901c81169282019290925260e083901c8216606082015260d883901c8216608082015260d09290921c1660a082015290565b60405161022a9190600060c08201905060ff8084511683528060208501511660208401528060408501511660408401528060608501511660608401528060808501511660808401528060a08501511660a08401525092915050565b6102876105c8366004611af7565b610a37565b6102876105db366004611c32565b610aa3565b6102876105ee366004611b21565b610acc565b6009546102dc9062010000900461ffff1681565b6102876106153660046119c6565b610b29565b610287610628366004611947565b610c61565b61064061063b366004611c32565b610cce565b60405161022a9190611da7565b61021e61065b3660046118f9565b60086020526000908152604090205460ff1681565b610287610e00565b610287610686366004611c4b565b611000565b61021e610699366004611914565b600660209081526000928352604080842090915290825290205460ff1681565b6107266106c7366004611b66565b6040805160e0808201835260f884901c825260ff60f085901c8116602084015260e885901c81169383019390935283901c8216606082015260d883901c8216608082015260d083901c821660a082015260c89290921c1660c082015290565b60405161022a9190600060e08201905060ff8084511683528060208501511660208401528060408501511660408401528060608501511660608401528060808501511660808401528060a08501511660a08401528060c08501511660c08401525092915050565b61028761079b366004611b4b565b611141565b60015461025c906001600160a01b031681565b6102876107c1366004611a71565b611176565b60006380ac58cd60e01b6001600160e01b0319831614806107f75750635b5e139f60e01b6001600160e01b03198316145b92915050565b6000818152600460205260409020546001600160a01b03163381148061084657506001600160a01b038116600090815260066020908152604080832033845290915290205460ff165b6108865760405162461bcd60e51b815260206004820152600c60248201526b1393d517d054141493d5915160a21b60448201526064015b60405180910390fd5b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6001546001600160a01b031633146108f957600080fd5b6001600160a01b03919091166000908152600860205260409020805460ff1916911515919091179055565b336001600160a01b038416148061095157506000818152600560205260409020546001600160a01b031633145b8061097f57506001600160a01b038316600090815260066020908152604080832033845290915290205460ff165b6109ba5760405162461bcd60e51b815260206004820152600c60248201526b1393d517d054141493d5915160a21b604482015260640161087d565b6109c583838361125f565b505050565b6109c583838360405180602001604052806000815250610b29565b6001546001600160a01b031633146109fc57600080fd5b600180546001600160a01b039092166001600160a01b031990921682178155600091825260086020526040909120805460ff19169091179055565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60005b81811015610ac857610ab6610e00565b80610ac081612034565b915050610aa6565b5050565b6000818152600460205260409020546001600160a01b03163314610b1e5760405162461bcd60e51b81526020600482015260096024820152682727aa2fa7aba722a960b91b604482015260640161087d565b610ac833838361125f565b610b34848484610924565b6001600160a01b0383163b15610c5b576000836001600160a01b031663150b7a023360008686604051602401610b6d9493929190611d1d565b6040516020818303038152906040529060e01b6020820180516001600160e01b038381831617835250505050604051610ba69190611d01565b600060405180830381855afa9150503d8060008114610be1576040519150601f19603f3d011682016040523d82523d6000602084013e610be6565b606091505b50915050600081806020019051810190610c009190611b9e565b9050630a85bd0160e11b6001600160e01b0319821614610c585760405162461bcd60e51b81526020600482015260136024820152722727aa2fa2a9219b9918afa922a1a2a4ab22a960691b604482015260640161087d565b50505b50505050565b6001546001600160a01b03163314610c7857600080fd5b600b80546001600160a01b039485166001600160a01b03199182161790915560098054938516600160401b0268010000000000000000600160e01b031990941693909317909255600a8054919093169116179055565b600081815260076020908152604091829020825160c081018452905460ff808216808452610100830461ffff9081169585018690526301000000840463ffffffff1685880152600160381b8404166060808601829052600160481b850490931660808601819052600160501b90940460501b6001600160501b03191660a08601819052600a549751636aacfbd160e01b8152600481018a9052602481019390935260448301969096526064820152608481019290925260a4820193909352919290916001600160a01b0390911690636aacfbd19060c40160006040518083038186803b158015610dbd57600080fd5b505afa158015610dd1573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610df99190810190611bbb565b9392505050565b33600081815260086020526040902054813b919060ff1680610e2a57503332148015610e2a575081155b610e765760405162461bcd60e51b815260206004820152601760248201527f796f7527726520747279696e6720746f20636865617421000000000000000000604482015260640161087d565b600b54600160a01b900460ff1680610e9d57503360009081526008602052604090205460ff165b610edd5760405162461bcd60e51b81526020600482015260116024820152701b9bdd081bdc195b88199bdc881b5a5b9d607a1b604482015260640161087d565b600954604051632770a7eb60e21b8152336004820152680340aad21b3b7000006024820152600160401b9091046001600160a01b031690639dc29fac90604401600060405180830381600087803b158015610f3757600080fd5b505af1158015610f4b573d6000803e3d6000fd5b50505050610fb7610fb2600c546040516bffffffffffffffffffffffff193360601b16602082015242603482018190524860548301526074820152609481019190915260009060b4016040516020818303038152906040528051906020012060001c905090565b611377565b506040516bffffffffffffffffffffffff19606083811b8216602084015241901b16603482015260480160408051601f198184030181529190528051602090910120600c555050565b3360009081526008602052604090205460ff166110505760405162461bcd60e51b815260206004820152600e60248201526d1b9bdd08185d5d1a1bdc9a5e995960921b604482015260640161087d565b6040805160c08101825260ff978816815261ffff968716602080830191825263ffffffff97881683850190815296891660608401908152958a16608084019081526001600160501b031990951660a0840190815260009b8c52600790915292909920905181549951955194519351925160501c600160501b02928916600160481b0269ffffffffffffffffffff1668ffffffffffffffffff948916600160381b0261ffff60381b19969098166301000000029590951668ffffffffffff00000019969098166101000262ffffff19909a16981697909717979097179290921693909317919091171617919091179055565b6001546001600160a01b0316331461115857600080fd5b600b8054911515600160a01b0260ff60a01b19909216919091179055565b3360009081526008602052604090205460ff166111c05760405162461bcd60e51b81526020600482015260086024820152670dcdee840c2eae8d60c31b604482015260640161087d565b60005b81811015611200576111ee84338585858181106111e2576111e2612087565b9050602002013561125f565b806111f881612034565b9150506111c3565b506040516397adec1160e01b815233906397adec119061122890869086908690600401611d5a565b600060405180830381600087803b15801561124257600080fd5b505af1158015611256573d6000803e3d6000fd5b50505050505050565b6000818152600460205260409020546001600160a01b038481169116146112b45760405162461bcd60e51b81526020600482015260096024820152683737ba1037bbb732b960b91b604482015260640161087d565b6001600160a01b03831660009081526003602052604081208054916112d883611ffb565b90915550506001600160a01b038216600090815260036020526040812080549161130183612034565b9091555050600081815260056020908152604080832080546001600160a01b0319908116909155600490925280832080546001600160a01b038781169190941681179091559051849391928716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6009546000906113ba9061139890600160301b900461ffff16611771611ee9565b61ffff166113a69190611f0f565b60098054919250610bb891600160301b900461ffff169060066113c883612012565b91906101000a81548161ffff021916908361ffff16021790555061ffff1611156114295760405162461bcd60e51b81526020600482015260126024820152711b585e081cdd5c1c1b1e481c995858da195960721b604482015260640161087d565b600060026114588460405180604001604052806004815260200163424f445960e01b8152508561ffff16611785565b611462919061204f565b61146d906001611f27565b9050600061147c600183611f75565b61148790600a611f4c565b600a6114b486604051806040016040528060048152602001634641434560e01b8152508761ffff16611785565b6114be919061204f565b6114c9906001611f27565b6114d39190611f27565b9050600060196115058660405180604001604052806005815260200164424f4f545360d81b8152508761ffff16611785565b61150f919061204f565b61151a906001611f27565b90506000601561154c876040518060400160405280600581526020016450414e545360d81b8152508861ffff16611785565b611556919061204f565b611561906001611f27565b905060006013611593886040518060400160405280600581526020016414d212549560da1b8152508961ffff16611785565b61159d919061204f565b6115a8906001611f27565b9050600060156115d989604051806040016040528060048152602001632420a4a960e11b8152508a61ffff16611785565b6115e3919061204f565b6115ee906001611f27565b90506115fe338861ffff166117bc565b6040805160c08101825260038152601e6020808301919091526175308284015260006060830181905260646080840152835160f88b811b6001600160f81b0319908116948301949094528a811b8416602183015289811b8416602283015288811b8416602383015287811b8416602483015286901b9092166025830152602682018190526027820181905260288201528251600981830301815260299091019092529060a08201906116af90611f98565b6001600160501b031916905261ffff8089166000908152600760209081526040918290208451815492860151938601516060870151608088015160a09098015160501c600160501b0260ff988916600160481b0269ffffffffffffffffffff1668ffffffffffffffffff928916600160381b0261ffff60381b1963ffffffff9095166301000000029490941668ffffffffffff00000019989099166101000262ffffff19909716999094169890981794909417949094169490941792909217169190911791909117905550949695505050505050565b600083838360405160200161179c93929190611e67565b60408051601f198184030181529190528051602090910120949350505050565b6000818152600460205260409020546001600160a01b0316156118125760405162461bcd60e51b815260206004820152600e60248201526d1053149150511657d3525395115160921b604482015260640161087d565b6002805490600061182283612034565b90915550506001600160a01b038216600081815260036020908152604080832080546001019055848352600490915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b80356001600160a01b03811681146118a957600080fd5b919050565b803580151581146118a957600080fd5b80356001600160501b0319811681146118a957600080fd5b803561ffff811681146118a957600080fd5b803560ff811681146118a957600080fd5b60006020828403121561190b57600080fd5b610df982611892565b6000806040838503121561192757600080fd5b61193083611892565b915061193e60208401611892565b90509250929050565b60008060006060848603121561195c57600080fd5b61196584611892565b925061197360208501611892565b915061198160408501611892565b90509250925092565b60008060006060848603121561199f57600080fd5b6119a884611892565b92506119b660208501611892565b9150604084013590509250925092565b600080600080608085870312156119dc57600080fd5b6119e585611892565b93506119f360208601611892565b925060408501359150606085013567ffffffffffffffff811115611a1657600080fd5b8501601f81018713611a2757600080fd5b8035611a3a611a3582611ec1565b611e90565b818152886020838501011115611a4f57600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b600080600060408486031215611a8657600080fd5b611a8f84611892565b9250602084013567ffffffffffffffff80821115611aac57600080fd5b818601915086601f830112611ac057600080fd5b813581811115611acf57600080fd5b8760208260051b8501011115611ae457600080fd5b6020830194508093505050509250925092565b60008060408385031215611b0a57600080fd5b611b1383611892565b915061193e602084016118ae565b60008060408385031215611b3457600080fd5b611b3d83611892565b946020939093013593505050565b600060208284031215611b5d57600080fd5b610df9826118ae565b600060208284031215611b7857600080fd5b610df9826118be565b600060208284031215611b9357600080fd5b8135610df9816120b3565b600060208284031215611bb057600080fd5b8151610df9816120b3565b600060208284031215611bcd57600080fd5b815167ffffffffffffffff811115611be457600080fd5b8201601f81018413611bf557600080fd5b8051611c03611a3582611ec1565b818152856020838501011115611c1857600080fd5b611c29826020830160208601611fcf565b95945050505050565b600060208284031215611c4457600080fd5b5035919050565b600080600080600080600060e0888a031215611c6657600080fd5b87359650611c76602089016118e8565b9550611c84604089016118d6565b9450606088013563ffffffff81168114611c9d57600080fd5b9350611cab608089016118d6565b9250611cb960a089016118e8565b9150611cc760c089016118be565b905092959891949750929550565b60008151808452611ced816020860160208601611fcf565b601f01601f19169290920160200192915050565b60008251611d13818460208701611fcf565b9190910192915050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611d5090830184611cd5565b9695505050505050565b6001600160a01b0384168152604060208201819052810182905260006001600160fb1b03831115611d8a57600080fd5b8260051b8085606085013760009201606001918252509392505050565b602081526000610df96020830184611cd5565b60006101208201905060ff835116825260ff60208401511660208301526040830151611deb604084018260ff169052565b506060830151611e00606084018260ff169052565b506080830151611e15608084018260ff169052565b5060a0830151611e2a60a084018260ff169052565b5060c0830151611e3f60c084018260ff169052565b5060e0830151611e5460e084018260ff169052565b506101009283015160ff16919092015290565b838152606060208201526000611e806060830185611cd5565b9050826040830152949350505050565b604051601f8201601f1916810167ffffffffffffffff81118282101715611eb957611eb961209d565b604052919050565b600067ffffffffffffffff821115611edb57611edb61209d565b50601f01601f191660200190565b600061ffff808316818516808303821115611f0657611f06612071565b01949350505050565b60008219821115611f2257611f22612071565b500190565b600060ff821660ff84168060ff03821115611f4457611f44612071565b019392505050565b600060ff821660ff84168160ff0481118215151615611f6d57611f6d612071565b029392505050565b600060ff821660ff841680821015611f8f57611f8f612071565b90039392505050565b805160208201516001600160501b03198082169291906016831015611fc75780818460160360031b1b83161693505b505050919050565b60005b83811015611fea578181015183820152602001611fd2565b83811115610c5b5750506000910152565b60008161200a5761200a612071565b506000190190565b600061ffff8083168181141561202a5761202a612071565b6001019392505050565b600060001982141561204857612048612071565b5060010190565b60008261206c57634e487b7160e01b600052601260045260246000fd5b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146120c957600080fd5b5056fea26469706673582212205bec24c482628ce8b7bfbc4c39460f225f9958335d0c19120ca0ad3cc3a7a92a64736f6c63430008070033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102065760003560e01c80638fd54c241161011a578063c87b56dd116100ad578063e985e9c51161007c578063e985e9c51461068b578063f734d723146106b9578063f8004d311461078d578063f851a440146107a0578063f9915c52146107b357600080fd5b8063c87b56dd1461062d578063cd5d21181461064d578063d046182514610670578063d23d24341461067857600080fd5b8063a9059cbb116100e9578063a9059cbb146105e0578063ae5b7a7d146105f3578063b88d4fde14610607578063c0c53b8b1461061a57600080fd5b80638fd54c24146104e857806397ce6a64146104fd578063a22cb465146105ba578063a3e9ec29146105cd57600080fd5b80633f19ac881161019d57806367d974571161016c57806367d9745714610360578063704b6c021461040a57806370a082311461041d5780637b96af3e1461043d5780638da5cb5b146104d757600080fd5b80633f19ac88146102fd57806342842e0e146103105780634429eda7146103235780636352211e1461033757600080fd5b806318160ddd116101d957806318160ddd1461029c57806323b872dd146102b357806326712942146102c65780633ca80508146102ef57600080fd5b806301ffc9a71461020b578063081812fc14610233578063095ea7b3146102745780630b44a21814610289575b600080fd5b61021e610219366004611b81565b6107c6565b60405190151581526020015b60405180910390f35b61025c610241366004611c32565b6005602052600090815260409020546001600160a01b031681565b6040516001600160a01b03909116815260200161022a565b610287610282366004611b21565b6107fd565b005b610287610297366004611af7565b6108e2565b6102a560025481565b60405190815260200161022a565b6102876102c136600461198a565b610924565b6009546102dc90640100000000900461ffff1681565b60405161ffff909116815260200161022a565b6009546102dc9061ffff1681565b600b5461025c906001600160a01b031681565b61028761031e36600461198a565b6109ca565b600b5461021e90600160a01b900460ff1681565b61025c610345366004611c32565b6004602052600090815260409020546001600160a01b031681565b6103bf61036e366004611c32565b60076020526000908152604090205460ff8082169161ffff610100820481169263ffffffff630100000084041692600160381b810490921691600160481b810490911690600160501b900460501b86565b6040805160ff978816815261ffff968716602082015263ffffffff909516908501529390911660608301529290921660808301526001600160501b03191660a082015260c00161022a565b6102876104183660046118f9565b6109e5565b6102a561042b3660046118f9565b60036020526000908152604090205481565b6104ca61044b366004611b66565b604080516101208101825260f883901c815260ff60f084901c8116602083015260c884901c811660c08084019190915284901c811660e08084019190915260b885901c821661010084015260e885901c8216938301939093529183901c8216606082015260d883901c8216608082015260d09290921c1660a082015290565b60405161022a9190611dba565b6001546001600160a01b031661025c565b6009546102dc90600160301b900461ffff1681565b61055f61050b366004611b66565b6040805160c08101825260f883901c815260ff60f084901c8116602083015260e884901c81169282019290925260e083901c8216606082015260d883901c8216608082015260d09290921c1660a082015290565b60405161022a9190600060c08201905060ff8084511683528060208501511660208401528060408501511660408401528060608501511660608401528060808501511660808401528060a08501511660a08401525092915050565b6102876105c8366004611af7565b610a37565b6102876105db366004611c32565b610aa3565b6102876105ee366004611b21565b610acc565b6009546102dc9062010000900461ffff1681565b6102876106153660046119c6565b610b29565b610287610628366004611947565b610c61565b61064061063b366004611c32565b610cce565b60405161022a9190611da7565b61021e61065b3660046118f9565b60086020526000908152604090205460ff1681565b610287610e00565b610287610686366004611c4b565b611000565b61021e610699366004611914565b600660209081526000928352604080842090915290825290205460ff1681565b6107266106c7366004611b66565b6040805160e0808201835260f884901c825260ff60f085901c8116602084015260e885901c81169383019390935283901c8216606082015260d883901c8216608082015260d083901c821660a082015260c89290921c1660c082015290565b60405161022a9190600060e08201905060ff8084511683528060208501511660208401528060408501511660408401528060608501511660608401528060808501511660808401528060a08501511660a08401528060c08501511660c08401525092915050565b61028761079b366004611b4b565b611141565b60015461025c906001600160a01b031681565b6102876107c1366004611a71565b611176565b60006380ac58cd60e01b6001600160e01b0319831614806107f75750635b5e139f60e01b6001600160e01b03198316145b92915050565b6000818152600460205260409020546001600160a01b03163381148061084657506001600160a01b038116600090815260066020908152604080832033845290915290205460ff165b6108865760405162461bcd60e51b815260206004820152600c60248201526b1393d517d054141493d5915160a21b60448201526064015b60405180910390fd5b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6001546001600160a01b031633146108f957600080fd5b6001600160a01b03919091166000908152600860205260409020805460ff1916911515919091179055565b336001600160a01b038416148061095157506000818152600560205260409020546001600160a01b031633145b8061097f57506001600160a01b038316600090815260066020908152604080832033845290915290205460ff165b6109ba5760405162461bcd60e51b815260206004820152600c60248201526b1393d517d054141493d5915160a21b604482015260640161087d565b6109c583838361125f565b505050565b6109c583838360405180602001604052806000815250610b29565b6001546001600160a01b031633146109fc57600080fd5b600180546001600160a01b039092166001600160a01b031990921682178155600091825260086020526040909120805460ff19169091179055565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60005b81811015610ac857610ab6610e00565b80610ac081612034565b915050610aa6565b5050565b6000818152600460205260409020546001600160a01b03163314610b1e5760405162461bcd60e51b81526020600482015260096024820152682727aa2fa7aba722a960b91b604482015260640161087d565b610ac833838361125f565b610b34848484610924565b6001600160a01b0383163b15610c5b576000836001600160a01b031663150b7a023360008686604051602401610b6d9493929190611d1d565b6040516020818303038152906040529060e01b6020820180516001600160e01b038381831617835250505050604051610ba69190611d01565b600060405180830381855afa9150503d8060008114610be1576040519150601f19603f3d011682016040523d82523d6000602084013e610be6565b606091505b50915050600081806020019051810190610c009190611b9e565b9050630a85bd0160e11b6001600160e01b0319821614610c585760405162461bcd60e51b81526020600482015260136024820152722727aa2fa2a9219b9918afa922a1a2a4ab22a960691b604482015260640161087d565b50505b50505050565b6001546001600160a01b03163314610c7857600080fd5b600b80546001600160a01b039485166001600160a01b03199182161790915560098054938516600160401b0268010000000000000000600160e01b031990941693909317909255600a8054919093169116179055565b600081815260076020908152604091829020825160c081018452905460ff808216808452610100830461ffff9081169585018690526301000000840463ffffffff1685880152600160381b8404166060808601829052600160481b850490931660808601819052600160501b90940460501b6001600160501b03191660a08601819052600a549751636aacfbd160e01b8152600481018a9052602481019390935260448301969096526064820152608481019290925260a4820193909352919290916001600160a01b0390911690636aacfbd19060c40160006040518083038186803b158015610dbd57600080fd5b505afa158015610dd1573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610df99190810190611bbb565b9392505050565b33600081815260086020526040902054813b919060ff1680610e2a57503332148015610e2a575081155b610e765760405162461bcd60e51b815260206004820152601760248201527f796f7527726520747279696e6720746f20636865617421000000000000000000604482015260640161087d565b600b54600160a01b900460ff1680610e9d57503360009081526008602052604090205460ff165b610edd5760405162461bcd60e51b81526020600482015260116024820152701b9bdd081bdc195b88199bdc881b5a5b9d607a1b604482015260640161087d565b600954604051632770a7eb60e21b8152336004820152680340aad21b3b7000006024820152600160401b9091046001600160a01b031690639dc29fac90604401600060405180830381600087803b158015610f3757600080fd5b505af1158015610f4b573d6000803e3d6000fd5b50505050610fb7610fb2600c546040516bffffffffffffffffffffffff193360601b16602082015242603482018190524860548301526074820152609481019190915260009060b4016040516020818303038152906040528051906020012060001c905090565b611377565b506040516bffffffffffffffffffffffff19606083811b8216602084015241901b16603482015260480160408051601f198184030181529190528051602090910120600c555050565b3360009081526008602052604090205460ff166110505760405162461bcd60e51b815260206004820152600e60248201526d1b9bdd08185d5d1a1bdc9a5e995960921b604482015260640161087d565b6040805160c08101825260ff978816815261ffff968716602080830191825263ffffffff97881683850190815296891660608401908152958a16608084019081526001600160501b031990951660a0840190815260009b8c52600790915292909920905181549951955194519351925160501c600160501b02928916600160481b0269ffffffffffffffffffff1668ffffffffffffffffff948916600160381b0261ffff60381b19969098166301000000029590951668ffffffffffff00000019969098166101000262ffffff19909a16981697909717979097179290921693909317919091171617919091179055565b6001546001600160a01b0316331461115857600080fd5b600b8054911515600160a01b0260ff60a01b19909216919091179055565b3360009081526008602052604090205460ff166111c05760405162461bcd60e51b81526020600482015260086024820152670dcdee840c2eae8d60c31b604482015260640161087d565b60005b81811015611200576111ee84338585858181106111e2576111e2612087565b9050602002013561125f565b806111f881612034565b9150506111c3565b506040516397adec1160e01b815233906397adec119061122890869086908690600401611d5a565b600060405180830381600087803b15801561124257600080fd5b505af1158015611256573d6000803e3d6000fd5b50505050505050565b6000818152600460205260409020546001600160a01b038481169116146112b45760405162461bcd60e51b81526020600482015260096024820152683737ba1037bbb732b960b91b604482015260640161087d565b6001600160a01b03831660009081526003602052604081208054916112d883611ffb565b90915550506001600160a01b038216600090815260036020526040812080549161130183612034565b9091555050600081815260056020908152604080832080546001600160a01b0319908116909155600490925280832080546001600160a01b038781169190941681179091559051849391928716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6009546000906113ba9061139890600160301b900461ffff16611771611ee9565b61ffff166113a69190611f0f565b60098054919250610bb891600160301b900461ffff169060066113c883612012565b91906101000a81548161ffff021916908361ffff16021790555061ffff1611156114295760405162461bcd60e51b81526020600482015260126024820152711b585e081cdd5c1c1b1e481c995858da195960721b604482015260640161087d565b600060026114588460405180604001604052806004815260200163424f445960e01b8152508561ffff16611785565b611462919061204f565b61146d906001611f27565b9050600061147c600183611f75565b61148790600a611f4c565b600a6114b486604051806040016040528060048152602001634641434560e01b8152508761ffff16611785565b6114be919061204f565b6114c9906001611f27565b6114d39190611f27565b9050600060196115058660405180604001604052806005815260200164424f4f545360d81b8152508761ffff16611785565b61150f919061204f565b61151a906001611f27565b90506000601561154c876040518060400160405280600581526020016450414e545360d81b8152508861ffff16611785565b611556919061204f565b611561906001611f27565b905060006013611593886040518060400160405280600581526020016414d212549560da1b8152508961ffff16611785565b61159d919061204f565b6115a8906001611f27565b9050600060156115d989604051806040016040528060048152602001632420a4a960e11b8152508a61ffff16611785565b6115e3919061204f565b6115ee906001611f27565b90506115fe338861ffff166117bc565b6040805160c08101825260038152601e6020808301919091526175308284015260006060830181905260646080840152835160f88b811b6001600160f81b0319908116948301949094528a811b8416602183015289811b8416602283015288811b8416602383015287811b8416602483015286901b9092166025830152602682018190526027820181905260288201528251600981830301815260299091019092529060a08201906116af90611f98565b6001600160501b031916905261ffff8089166000908152600760209081526040918290208451815492860151938601516060870151608088015160a09098015160501c600160501b0260ff988916600160481b0269ffffffffffffffffffff1668ffffffffffffffffff928916600160381b0261ffff60381b1963ffffffff9095166301000000029490941668ffffffffffff00000019989099166101000262ffffff19909716999094169890981794909417949094169490941792909217169190911791909117905550949695505050505050565b600083838360405160200161179c93929190611e67565b60408051601f198184030181529190528051602090910120949350505050565b6000818152600460205260409020546001600160a01b0316156118125760405162461bcd60e51b815260206004820152600e60248201526d1053149150511657d3525395115160921b604482015260640161087d565b6002805490600061182283612034565b90915550506001600160a01b038216600081815260036020908152604080832080546001019055848352600490915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b80356001600160a01b03811681146118a957600080fd5b919050565b803580151581146118a957600080fd5b80356001600160501b0319811681146118a957600080fd5b803561ffff811681146118a957600080fd5b803560ff811681146118a957600080fd5b60006020828403121561190b57600080fd5b610df982611892565b6000806040838503121561192757600080fd5b61193083611892565b915061193e60208401611892565b90509250929050565b60008060006060848603121561195c57600080fd5b61196584611892565b925061197360208501611892565b915061198160408501611892565b90509250925092565b60008060006060848603121561199f57600080fd5b6119a884611892565b92506119b660208501611892565b9150604084013590509250925092565b600080600080608085870312156119dc57600080fd5b6119e585611892565b93506119f360208601611892565b925060408501359150606085013567ffffffffffffffff811115611a1657600080fd5b8501601f81018713611a2757600080fd5b8035611a3a611a3582611ec1565b611e90565b818152886020838501011115611a4f57600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b600080600060408486031215611a8657600080fd5b611a8f84611892565b9250602084013567ffffffffffffffff80821115611aac57600080fd5b818601915086601f830112611ac057600080fd5b813581811115611acf57600080fd5b8760208260051b8501011115611ae457600080fd5b6020830194508093505050509250925092565b60008060408385031215611b0a57600080fd5b611b1383611892565b915061193e602084016118ae565b60008060408385031215611b3457600080fd5b611b3d83611892565b946020939093013593505050565b600060208284031215611b5d57600080fd5b610df9826118ae565b600060208284031215611b7857600080fd5b610df9826118be565b600060208284031215611b9357600080fd5b8135610df9816120b3565b600060208284031215611bb057600080fd5b8151610df9816120b3565b600060208284031215611bcd57600080fd5b815167ffffffffffffffff811115611be457600080fd5b8201601f81018413611bf557600080fd5b8051611c03611a3582611ec1565b818152856020838501011115611c1857600080fd5b611c29826020830160208601611fcf565b95945050505050565b600060208284031215611c4457600080fd5b5035919050565b600080600080600080600060e0888a031215611c6657600080fd5b87359650611c76602089016118e8565b9550611c84604089016118d6565b9450606088013563ffffffff81168114611c9d57600080fd5b9350611cab608089016118d6565b9250611cb960a089016118e8565b9150611cc760c089016118be565b905092959891949750929550565b60008151808452611ced816020860160208601611fcf565b601f01601f19169290920160200192915050565b60008251611d13818460208701611fcf565b9190910192915050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611d5090830184611cd5565b9695505050505050565b6001600160a01b0384168152604060208201819052810182905260006001600160fb1b03831115611d8a57600080fd5b8260051b8085606085013760009201606001918252509392505050565b602081526000610df96020830184611cd5565b60006101208201905060ff835116825260ff60208401511660208301526040830151611deb604084018260ff169052565b506060830151611e00606084018260ff169052565b506080830151611e15608084018260ff169052565b5060a0830151611e2a60a084018260ff169052565b5060c0830151611e3f60c084018260ff169052565b5060e0830151611e5460e084018260ff169052565b506101009283015160ff16919092015290565b838152606060208201526000611e806060830185611cd5565b9050826040830152949350505050565b604051601f8201601f1916810167ffffffffffffffff81118282101715611eb957611eb961209d565b604052919050565b600067ffffffffffffffff821115611edb57611edb61209d565b50601f01601f191660200190565b600061ffff808316818516808303821115611f0657611f06612071565b01949350505050565b60008219821115611f2257611f22612071565b500190565b600060ff821660ff84168060ff03821115611f4457611f44612071565b019392505050565b600060ff821660ff84168160ff0481118215151615611f6d57611f6d612071565b029392505050565b600060ff821660ff841680821015611f8f57611f8f612071565b90039392505050565b805160208201516001600160501b03198082169291906016831015611fc75780818460160360031b1b83161693505b505050919050565b60005b83811015611fea578181015183820152602001611fd2565b83811115610c5b5750506000910152565b60008161200a5761200a612071565b506000190190565b600061ffff8083168181141561202a5761202a612071565b6001019392505050565b600060001982141561204857612048612071565b5060010190565b60008261206c57634e487b7160e01b600052601260045260246000fd5b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146120c957600080fd5b5056fea26469706673582212205bec24c482628ce8b7bfbc4c39460f225f9958335d0c19120ca0ad3cc3a7a92a64736f6c63430008070033

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]

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