ETH Price: $3,093.78 (+0.34%)
Gas: 10 Gwei

Contract

0x93aF13825f0C7D73A2658B779F591e1FFef4f6ea
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Value
0x60806040153587882022-08-17 12:41:36692 days ago1660740096IN
 Create: EthernalElvesV7
0 ETH0.018086468.12701882

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
EthernalElvesV7

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 6 : EthernalElvesV7.sol
// SPDX-License-Identifier: Unlicense
pragma solidity 0.8.7;

import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol";
import "./ERC721.sol"; 
import "./DataStructures.sol";
import "./Interfaces.sol";
import "@openzeppelin/contracts/utils/Strings.sol";
//import "hardhat/console.sol"; 

// We are the Ethernal. The Ethernal Elves         
// Written by 0xHusky & Beff Jezos. 
// Version 7.0.0


contract EthernalElvesV7 is ERC721 {

    function name() external pure returns (string memory) { return "Ethernal Elves"; }
    function symbol() external pure returns (string memory) { return "ELV"; }
       
    using DataStructures for DataStructures.ActionVariables;
    using DataStructures for DataStructures.Elf;
    using DataStructures for DataStructures.Token; 

    IElfMetaDataHandler elfmetaDataHandler;
    ICampaigns campaigns;
    IERC20Lite public ren;
    
    using ECDSA for bytes32;
    
//STATE   

    bool public isGameActive;
    bool public isMintOpen;
    bool public isWlOpen;
    bool private initialized;

    address dev1Address;
    address dev2Address;
    address terminus;
    address public validator;
   
    uint256 public INIT_SUPPLY; 
    uint256 public price;
    bytes32 internal ketchup;
    
    uint256[] public _remaining; 
    mapping(uint256 => uint256) public sentinels; //memory slot for Elfs
    mapping(address => uint256) public bankBalances; //memory slot for bank balances
    mapping(address => bool)    public auth;
    mapping(address => uint16)  public whitelist; 


    bool public isTerminalOpen;

    mapping(bytes => uint16)  public usedRenSignatures; 
    mapping(bytes => uint16)  public usedSentinelSignatures; 
/////NEW STORAGE FROM THIS LINE V5///////////////////////////////////////////////////////
    
   
    function setBridge(address _bridge)  public {
       onlyOwner();     
       terminus             = _bridge;       
    }    
    
    function setAuth(address[] calldata adds_, bool status) public {
       onlyOwner();
       
        for (uint256 index = 0; index < adds_.length; index++) {
            auth[adds_[index]] = status;
        }
    }

    function setValidator(address _validator) public {
       onlyOwner();
       validator = _validator;
    }

//EVENTS

    event Action(address indexed from, uint256 indexed action, uint256 indexed tokenId);         

 
   
//GAMEPLAY//
 function stake(uint256[] calldata _id) external {

         isPlayer();
          
         for(uint256 i = 0; i < _id.length; i++) {
         isSentinelOwner(_id[i]);
         require(ownerOf[_id[i]] != address(this));

        DataStructures.Elf memory elf = DataStructures.getElf(sentinels[_id[i]]);
        DataStructures.ActionVariables memory actions;
        elf.owner = msg.sender;

        actions.traits   = DataStructures.packAttributes(elf.hair, elf.race, elf.accessories);
        actions.class    = DataStructures.packAttributes(elf.sentinelClass, elf.weaponTier, elf.inventory);
        
        sentinels[_id[i]] = DataStructures._setElf(elf.owner, elf.timestamp, elf.action, elf.healthPoints, elf.attackPoints, elf.primaryWeapon, elf.level, actions.traits, actions.class);
        
        _transfer(msg.sender, address(this), _id[i]);      
         
        }                    
    }

     function unstake(uint256[] calldata _id, uint256[] calldata sentinel, bytes[] memory signatures, bytes[] memory authCodes) external {

         isPlayer();
         address owner = msg.sender;
         uint256 action = 0;

          for (uint256 index = 0; index < _id.length; index++) {  
            isSentinelOwner(_id[index]);
            require(ownerOf[_id[index]] == address(this), "Elf not owned by this contract");
            require(usedSentinelSignatures[signatures[index]] == 0, "Signature already used");   
            require(_isSignedByValidator(encodeSentinelForSignature(_id[index], owner, sentinel[index], authCodes[index]),signatures[index]), "incorrect signature");
            usedSentinelSignatures[signatures[index]] = 1;

            DataStructures.Elf memory elf = DataStructures.getElf(sentinel[index]);
            DataStructures.ActionVariables memory actions;
            //check if owners are the same. Check is owner is sender.
            
            elf.owner = address(0);    //Nuke current holder
           
            actions.traits = DataStructures.packAttributes(elf.hair, elf.race, elf.accessories);
            actions.class =  DataStructures.packAttributes(elf.sentinelClass, elf.weaponTier, elf.inventory);

            sentinels[_id[index]] = DataStructures._setElf(elf.owner, elf.timestamp, action, elf.healthPoints, elf.attackPoints, elf.primaryWeapon, elf.level, actions.traits, actions.class);

            
            _transfer(address(this), owner, _id[index]);      

            }
                    
    }


        //////////FOR OFFCHAIN USE ONLY/////////////
    function generateSentinelDna(
                address owner, uint256 timestamp, uint256 action, uint256 healthPoints, 
                uint256 attackPoints, uint256 primaryWeapon, uint256 level, 
                uint256 traits, uint256 class)

    external pure returns (uint256 sentinel) {

     sentinel = DataStructures._setElf(owner, timestamp, action, healthPoints, attackPoints, primaryWeapon, level, traits, class);
    
    return sentinel;
}


function decodeSentinelDna(uint256 character) external view returns(DataStructures.Elf memory elf) {
      elf = DataStructures.getElf(character);
} 

  
//PUBLIC VIEWS
    function tokenURI(uint256 _id) external view returns(string memory) {

       string memory tokenURI = 'https://api.ethernalelves.com/api/sentinels/';
      return string(abi.encodePacked(tokenURI, Strings.toString(_id)));

    
    }


function getSentinel(uint256 _id) external view returns(uint256 sentinel){
    return sentinel = sentinels[_id];
}


function getToken(uint256 _id) external view returns(DataStructures.Token memory token){
   
    return DataStructures.getToken(sentinels[_id]);
}

function elves(uint256 _id) external view returns(address owner, uint timestamp, uint action, uint healthPoints, uint attackPoints, uint primaryWeapon, uint level) {

    uint256 character = sentinels[_id];

    owner =          address(uint160(uint256(character)));
    timestamp =      uint(uint40(character>>160));
    action =         uint(uint8(character>>200));
    healthPoints =   uint(uint8(character>>208));
    attackPoints =   uint(uint8(character>>216));
    primaryWeapon =  uint(uint8(character>>224));
    level =          uint(uint8(character>>232));   

}

//Modifiers but as functions. Less Gas
    function isPlayer() internal {    
        uint256 size = 0;
        address acc = msg.sender;
        assembly { size := extcodesize(acc)}
        require((msg.sender == tx.origin && size == 0));
        ketchup = keccak256(abi.encodePacked(acc, block.coinbase));
    }


    function onlyOwner() internal view {    
        require(admin == msg.sender || auth[msg.sender] == true || dev1Address == msg.sender || dev2Address == msg.sender);
    }

    function isSentinelOwner(uint256 id) internal view {  

        DataStructures.Elf memory elf = DataStructures.getElf(sentinels[id]);
        require(ownerOf[id] == msg.sender || elf.owner == msg.sender, "NotYourElf");
    }

//ADMIN Only
    function withdrawAll() public {
        onlyOwner();
        uint256 balance = address(this).balance;
        
        uint256 devShare = balance/2;      

        require(balance > 0);
        _withdraw(dev1Address, devShare);
        _withdraw(dev2Address, devShare);
    }

    //Internal withdraw
    function _withdraw(address _address, uint256 _amount) private {

        (bool success, ) = _address.call{value: _amount}("");
        require(success);
    }

    function flipActiveStatus() external {
        onlyOwner();
        isGameActive = !isGameActive;
    }

     function encodeSentinelForSignature(uint256 id, address owner, uint256 sentinel, bytes memory authCode) public pure returns (bytes32) {
        return keccak256(
                abi.encodePacked("\x19Ethereum Signed Message:\n32", 
                    keccak256(
                            abi.encodePacked(id, owner, sentinel, authCode))
                            )
                        );
    } 


    function _isSignedByValidator(bytes32 _hash, bytes memory _signature) private view returns (bool) {
                
                bytes32 r;
                bytes32 s;
                uint8 v;
                    assembly {
                            r := mload(add(_signature, 0x20))
                            s := mload(add(_signature, 0x40))
                            v := byte(0, mload(add(_signature, 0x60)))
                        }
                    
                        address signer = ecrecover(_hash, v, r, s);
                        return signer == validator;
  
            }
  

}

File 2 of 6 : ECDSA.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/ECDSA.sol)

pragma solidity ^0.8.0;

import "../Strings.sol";

/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return tryRecover(hash, r, vs);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
        uint8 v = uint8((uint256(vs) >> 255) + 27);
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from `s`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}

File 3 of 6 : 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;

    /*///////////////////////////////////////////////////////////////
                             ERC-721 STORAGE
    //////////////////////////////////////////////////////////////*/

    uint256 public totalSupply;
    uint256 public maxSupply;

    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 {
        address owner_ = ownerOf[tokenId];

        require(
            msg.sender == owner_ ||
                msg.sender == getApproved[tokenId] ||
                isApprovedForAll[owner_][msg.sender],
            "NOT_APPROVED"
        );

        _transfer(from, to, tokenId);
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual {
        transferFrom(from, to, tokenId);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(msg.sender, from, tokenId, "") ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }


    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) public virtual {
        transferFrom(from, to, tokenId);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(msg.sender, from, tokenId, data) ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }
    /*
        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,
                    from, 
                    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);

        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");
        require(totalSupply++ <= maxSupply, "MAX SUPPLY REACHED");

        // 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);
    }
}


/// @notice A generic interface for a contract which properly accepts ERC721 tokens.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC721.sol)
abstract contract ERC721TokenReceiver {
    function onERC721Received(
        address,
        address,
        uint256,
        bytes calldata
    ) external virtual returns (bytes4) {
        return ERC721TokenReceiver.onERC721Received.selector;
    }
}

File 4 of 6 : DataStructures.sol
// SPDX-License-Identifier: Unlicense
pragma solidity 0.8.7;
//import "hardhat/console.sol"; ///REMOVE BEFORE DEPLOYMENT
//v 1.0.3

library DataStructures {

/////////////DATA STRUCTURES///////////////////////////////
    struct Elf {
            address owner;  
            uint256 timestamp; 
            uint256 action; 
            uint256 healthPoints;
            uint256 attackPoints; 
            uint256 primaryWeapon; 
            uint256 level;
            uint256 hair;
            uint256 race; 
            uint256 accessories; 
            uint256 sentinelClass; 
            uint256 weaponTier; 
            uint256 inventory; 
    }

    struct Token {
            address owner;  
            uint256 timestamp; 
            uint8 action; 
            uint8 healthPoints;
            uint8 attackPoints; 
            uint8 primaryWeapon; 
            uint8 level;
            uint8 hair;
            uint8 race; 
            uint8 accessories; 
            uint8 sentinelClass; 
            uint8 weaponTier; 
            uint8 inventory; 
    }

    struct ActionVariables {

            uint256 reward;
            uint256 timeDiff;
            uint256 traits; 
            uint256 class;  
    }

    struct Camps {
            uint32 baseRewards; 
            uint32 creatureCount; 
            uint32 creatureHealth; 
            uint32 expPoints; 
            uint32 minLevel;
            uint32 itemDrop;
            uint32 weaponDrop;
            uint32 spare;
    }

    /*Dont Delete, just keep it for reference

    struct Attributes { 
            uint256 hair; //MAX 3 3 hair traits
            uint256 race;  //MAX 6 Body 4 for body
            uint256 accessories; //MAX 7 4 
            uint256 sentinelClass; //MAX 3 3 in class
            uint256 weaponTier; //MAX 6 5 tiers
            uint256 inventory; //MAX 7 6 items
    }

    */

/////////////////////////////////////////////////////
function getElf(uint256 character) internal pure returns(Elf memory _elf) {
   
    _elf.owner =          address(uint160(uint256(character)));
    _elf.timestamp =      uint256(uint40(character>>160));
    _elf.action =         uint256(uint8(character>>200));
    _elf.healthPoints =       uint256(uint8(character>>208));
    _elf.attackPoints =   uint256(uint8(character>>216));
    _elf.primaryWeapon =  uint256(uint8(character>>224));
    _elf.level    =       uint256(uint8(character>>232));
    _elf.hair           = (uint256(uint8(character>>240)) / 100) % 10;
    _elf.race           = (uint256(uint8(character>>240)) / 10) % 10;
    _elf.accessories    = (uint256(uint8(character>>240))) % 10;
    _elf.sentinelClass  = (uint256(uint8(character>>248)) / 100) % 10;
    _elf.weaponTier     = (uint256(uint8(character>>248)) / 10) % 10;
    _elf.inventory      = (uint256(uint8(character>>248))) % 10; 

} 

function getToken(uint256 character) internal pure returns(Token memory token) {
   
    token.owner          = address(uint160(uint256(character)));
    token.timestamp      = uint256(uint40(character>>160));
    token.action         = (uint8(character>>200));
    token.healthPoints   = (uint8(character>>208));
    token.attackPoints   = (uint8(character>>216));
    token.primaryWeapon  = (uint8(character>>224));
    token.level          = (uint8(character>>232));
    token.hair           = ((uint8(character>>240)) / 100) % 10; //MAX 3
    token.race           = ((uint8(character>>240)) / 10) % 10; //Max6
    token.accessories    = ((uint8(character>>240))) % 10; //Max7
    token.sentinelClass  = ((uint8(character>>248)) / 100) % 10; //MAX 3
    token.weaponTier     = ((uint8(character>>248)) / 10) % 10; //MAX 6
    token.inventory      = ((uint8(character>>248))) % 10; //MAX 7

    token.hair = (token.sentinelClass * 3) + (token.hair + 1);
    token.race = (token.sentinelClass * 4) + (token.race + 1);
    token.primaryWeapon = token.primaryWeapon == 69 ? 69 : (token.sentinelClass * 15) + (token.primaryWeapon + 1);
    token.accessories = (token.sentinelClass * 7) + (token.accessories + 1);

}

function _setElf(
                address owner, uint256 timestamp, uint256 action, uint256 healthPoints, 
                uint256 attackPoints, uint256 primaryWeapon, 
                uint256 level, uint256 traits, uint256 class )

    internal pure returns (uint256 sentinel) {

    uint256 character = uint256(uint160(address(owner)));
    
    character |= timestamp<<160;
    character |= action<<200;
    character |= healthPoints<<208;
    character |= attackPoints<<216;
    character |= primaryWeapon<<224;
    character |= level<<232;
    character |= traits<<240;
    character |= class<<248;
    
    return character;
}

//////////////////////////////HELPERS/////////////////

function packAttributes(uint hundreds, uint tens, uint ones) internal pure returns (uint256 packedAttributes) {
    packedAttributes = uint256(hundreds*100 + tens*10 + ones);
    return packedAttributes;
}

function calcAttackPoints(uint256 sentinelClass, uint256 weaponTier) internal pure returns (uint256 attackPoints) {

        attackPoints = ((sentinelClass + 1) * 2) + (weaponTier * 2);
        
        return attackPoints;
}

function calcHealthPoints(uint256 sentinelClass, uint256 level) internal pure returns (uint256 healthPoints) {

        healthPoints = (level/(3) +2) + (20 - (sentinelClass * 4));
        
        return healthPoints;
}

function calcCreatureHealth(uint256 sector, uint256 baseCreatureHealth) internal pure returns (uint256 creatureHealth) {

        creatureHealth = ((sector - 1) * 12) + baseCreatureHealth; 
        
        return creatureHealth;
}

function roll(uint256 id_, uint256 level_, uint256 rand, uint256 rollOption_, uint256 weaponTier_, uint256 primaryWeapon_, uint256 inventory_) 
internal pure 
returns (uint256 newWeaponTier, uint256 newWeapon, uint256 newInventory) {

   uint256 levelTier = level_ == 100 ? 5 : uint256((level_/20) + 1);

   newWeaponTier = weaponTier_;
   newWeapon     = primaryWeapon_;
   newInventory  = inventory_;


   if(rollOption_ == 1 || rollOption_ == 3){
       //Weapons
      
        uint16  chance = uint16(_randomize(rand, "Weapon", id_)) % 100;
       // console.log("chance: ", chance);
                if(chance > 10 && chance < 80){
        
                              newWeaponTier = levelTier;
        
                        }else if (chance > 80 ){
        
                              newWeaponTier = levelTier + 1 > 5 ? 5 : levelTier + 1;
        
                        }else{

                                newWeaponTier = levelTier - 1 < 1 ? 1 : levelTier - 1;          
                        }

                                         
        

        newWeapon = newWeaponTier == 0 ? 0 : ((newWeaponTier - 1) * 3) + (rand % 3);  
        

   }
   
   if(rollOption_ == 2 || rollOption_ == 3){//Items Loop
      
       
        uint16 morerand = uint16(_randomize(rand, "Inventory", id_));
        uint16 diceRoll = uint16(_randomize(rand, "Dice", id_));
        
        diceRoll = (diceRoll % 100);
        
        if(diceRoll <= 20){

            newInventory = levelTier > 3 ? morerand % 3 + 3: morerand % 6 + 1;
            //console.log("Token#: ", id_);
            //console.log("newITEM: ", newInventory);
        } 

   }
                      
              
}


function _randomize(uint256 ran, string memory dom, uint256 ness) internal pure returns (uint256) {
    return uint256(keccak256(abi.encode(ran,dom,ness)));}



}

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

interface IERC20Lite {
    
    function transfer(address to, uint256 value) external returns (bool);
    function burn(address from, uint256 value) external;
    function mint(address to, uint256 value) external; 
    function approve(address spender, uint256 value) external returns (bool); 
    function balanceOf(address account) external returns (uint256); 
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

}

interface IElfMetaDataHandler {    
function getTokenURI(uint16 id_, uint256 sentinel) external view returns (string memory);
}

interface ICampaigns {
function gameEngine(uint256 _campId, uint256 _sector, uint256 _level, uint256 _attackPoints, uint256 _healthPoints, uint256 _inventory, bool _useItem) external 
returns(uint256 level, uint256 rewards, uint256 timestamp, uint256 inventory);
}

interface IElves {    
    function prismBridge(uint256[] calldata id, uint256[] calldata sentinel, address owner) external;    
    function exitElf(uint256[] calldata ids, address owner) external;
    function setAccountBalance(address _owner, uint256 _amount, bool _subtract, uint256 _index) external;
}

interface IERC721Lite {
    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 IERC1155Lite {
    function burn(address from,uint256 id, uint256 value) external;
    function balanceOf(address _owner, uint256 _id) external returns (uint256); 
    function mint(address to, uint256 qty, uint256 tokenid) external;
}

 
//1155
interface IERC165 {
    function supportsInterface(bytes4 _interfaceId) external view returns (bool);
}

interface IERC1155 is IERC165 {
  event TransferSingle(address indexed _operator, address indexed _from, address indexed _to, uint256 _id, uint256 _amount);
  event TransferBatch(address indexed _operator, address indexed _from, address indexed _to, uint256[] _ids, uint256[] _amounts);
  event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);

  function safeTransferFrom(address _from, address _to, uint256 _id, uint256 _amount, bytes calldata _data) external;
  function safeBatchTransferFrom(address _from, address _to, uint256[] calldata _ids, uint256[] calldata _amounts, bytes calldata _data) external;
  function balanceOf(address _owner, uint256 _id) external view returns (uint256);
  function balanceOfBatch(address[] calldata _owners, uint256[] calldata _ids) external view returns (uint256[] memory);
  function setApprovalForAll(address _operator, bool _approved) external;
  function isApprovedForAll(address _owner, address _operator) external view returns (bool isOperator);
}

interface IERC1155Metadata {
  event URI(string _uri, uint256 indexed _id);
  function uri(uint256 _id) external view returns (string memory);
}

interface IERC1155TokenReceiver {
  function onERC1155Received(address _operator, address _from, uint256 _id, uint256 _amount, bytes calldata _data) external returns(bytes4);
  function onERC1155BatchReceived(address _operator, address _from, uint256[] calldata _ids, uint256[] calldata _amounts, bytes calldata _data) external returns(bytes4);
}

File 6 of 6 : Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

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":"from","type":"address"},{"indexed":true,"internalType":"uint256","name":"action","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Action","type":"event"},{"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":[],"name":"INIT_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_remaining","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"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":[{"internalType":"address","name":"","type":"address"}],"name":"bankBalances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"character","type":"uint256"}],"name":"decodeSentinelDna","outputs":[{"components":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"action","type":"uint256"},{"internalType":"uint256","name":"healthPoints","type":"uint256"},{"internalType":"uint256","name":"attackPoints","type":"uint256"},{"internalType":"uint256","name":"primaryWeapon","type":"uint256"},{"internalType":"uint256","name":"level","type":"uint256"},{"internalType":"uint256","name":"hair","type":"uint256"},{"internalType":"uint256","name":"race","type":"uint256"},{"internalType":"uint256","name":"accessories","type":"uint256"},{"internalType":"uint256","name":"sentinelClass","type":"uint256"},{"internalType":"uint256","name":"weaponTier","type":"uint256"},{"internalType":"uint256","name":"inventory","type":"uint256"}],"internalType":"struct DataStructures.Elf","name":"elf","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"elves","outputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"action","type":"uint256"},{"internalType":"uint256","name":"healthPoints","type":"uint256"},{"internalType":"uint256","name":"attackPoints","type":"uint256"},{"internalType":"uint256","name":"primaryWeapon","type":"uint256"},{"internalType":"uint256","name":"level","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"sentinel","type":"uint256"},{"internalType":"bytes","name":"authCode","type":"bytes"}],"name":"encodeSentinelForSignature","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"flipActiveStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"action","type":"uint256"},{"internalType":"uint256","name":"healthPoints","type":"uint256"},{"internalType":"uint256","name":"attackPoints","type":"uint256"},{"internalType":"uint256","name":"primaryWeapon","type":"uint256"},{"internalType":"uint256","name":"level","type":"uint256"},{"internalType":"uint256","name":"traits","type":"uint256"},{"internalType":"uint256","name":"class","type":"uint256"}],"name":"generateSentinelDna","outputs":[{"internalType":"uint256","name":"sentinel","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"getSentinel","outputs":[{"internalType":"uint256","name":"sentinel","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"getToken","outputs":[{"components":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint8","name":"action","type":"uint8"},{"internalType":"uint8","name":"healthPoints","type":"uint8"},{"internalType":"uint8","name":"attackPoints","type":"uint8"},{"internalType":"uint8","name":"primaryWeapon","type":"uint8"},{"internalType":"uint8","name":"level","type":"uint8"},{"internalType":"uint8","name":"hair","type":"uint8"},{"internalType":"uint8","name":"race","type":"uint8"},{"internalType":"uint8","name":"accessories","type":"uint8"},{"internalType":"uint8","name":"sentinelClass","type":"uint8"},{"internalType":"uint8","name":"weaponTier","type":"uint8"},{"internalType":"uint8","name":"inventory","type":"uint8"}],"internalType":"struct DataStructures.Token","name":"token","type":"tuple"}],"stateMutability":"view","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":"isGameActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isMintOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isTerminalOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isWlOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","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":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ren","outputs":[{"internalType":"contract IERC20Lite","name":"","type":"address"}],"stateMutability":"view","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":"uint256","name":"","type":"uint256"}],"name":"sentinels","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"adds_","type":"address[]"},{"internalType":"bool","name":"status","type":"bool"}],"name":"setAuth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_bridge","type":"address"}],"name":"setBridge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_validator","type":"address"}],"name":"setValidator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_id","type":"uint256[]"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"supported","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"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"},{"inputs":[{"internalType":"uint256[]","name":"_id","type":"uint256[]"},{"internalType":"uint256[]","name":"sentinel","type":"uint256[]"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"},{"internalType":"bytes[]","name":"authCodes","type":"bytes[]"}],"name":"unstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"name":"usedRenSignatures","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"name":"usedSentinelSignatures","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"validator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405234801561001057600080fd5b5061274b806100206000396000f3fe608060405234801561001057600080fd5b506004361061028a5760003560e01c80638b1681a61161015c578063b4eada88116100ce578063d5abeb0111610087578063d5abeb0114610709578063d5f1842914610712578063e4b50cb814610741578063e985e9c514610761578063f851a4401461078f578063f93c50ac146107a257600080fd5b8063b4eada8814610698578063b88d4fde146106a5578063baf82b2b146106b8578063c092b13e146106cb578063c87b56dd146106d3578063cd5d2118146106e657600080fd5b806395d89b411161012057806395d89b41146106065780639b19251a14610625578063a035b1fe14610649578063a22cb46514610652578063a59d168614610665578063a9059cbb1461068557600080fd5b80638b1681a6146105045780638da5cb5b146105245780638dd1480214610535578063918e145714610548578063956cc859146105fd57600080fd5b806319908016116102005780636352211e116101b95780636352211e1461046d57806370a08231146104965780638299b166146104b657806384f57d02146104d6578063853828b6146104e95780638a9b4067146104f157600080fd5b806319908016146103f957806323b872dd1461040d57806338b3ccc8146104205780633a5381b51461043457806342842e0e146104475780634576da471461045a57600080fd5b8063095ea7b311610252578063095ea7b3146103825780630c0ef2b0146103955780630fbf0a93146103a95780631327d3d8146103bc5780631637bbdf146103cf57806318160ddd146103f057600080fd5b806301a85d3b1461028f57806301ffc9a7146102a457806304217c87146102cc57806306fdde031461030e578063081812fc14610341575b600080fd5b6102a261029d366004612142565b610837565b005b6102b76102b23660046121f9565b610bc3565b60405190151581526020015b60405180910390f35b6102fb6102da366004612233565b805160208183018101805160198252928201919093012091525461ffff1681565b60405161ffff90911681526020016102c3565b60408051808201909152600e81526d45746865726e616c20456c76657360901b60208201525b6040516102c391906123c7565b61036a61034f366004612268565b6006602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016102c3565b6102a261039036600461201c565b610bfa565b600a546102b790600160a01b900460ff1681565b6102a26103b7366004612100565b610cda565b6102a26103ca366004611ec6565b610e89565b6103e26103dd366004612268565b610eb3565b6040519081526020016102c3565b6103e260025481565b600a546102b790600160a81b900460ff1681565b6102a261041b366004611f1b565b610ed4565b600a546102b790600160b01b900460ff1681565b600e5461036a906001600160a01b031681565b6102a2610455366004611f1b565b610f8a565b6102a26104683660046120ac565b61108c565b61036a61047b366004612268565b6005602052600090815260409020546001600160a01b031681565b6103e26104a4366004611ec6565b60046020526000908152604090205481565b6103e26104c4366004612268565b60136020526000908152604090205481565b6103e26104e4366004612046565b611105565b6102a2611126565b600a5461036a906001600160a01b031681565b6103e2610512366004611ec6565b60146020526000908152604090205481565b6001546001600160a01b031661036a565b6102a2610543366004611ec6565b61117b565b61055b610556366004612268565b6111a5565b6040516102c3919081516001600160a01b031681526101a081016020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015160c083015260e083015160e083015261010080840151818401525061012080840151818401525061014080840151818401525061016080840151818401525061018080840151818401525092915050565b6103e2600f5481565b60408051808201909152600381526222a62b60e91b6020820152610334565b6102fb610633366004611ec6565b60166020526000908152604090205461ffff1681565b6103e260105481565b6102a2610660366004611ff2565b6111b6565b6103e2610673366004612268565b60009081526013602052604090205490565b6102a261069336600461201c565b611222565b6017546102b79060ff1681565b6102a26106b3366004611f57565b61127f565b6103e26106c6366004612281565b611376565b6102a26113f8565b6103346106e1366004612268565b611421565b6102b76106f4366004611ec6565b60156020526000908152604090205460ff1681565b6103e260035481565b6102fb610720366004612233565b805160208183018101805160188252928201919093012091525461ffff1681565b61075461074f366004612268565b611472565b6040516102c391906123fa565b6102b761076f366004611ee8565b600760209081526000928352604080842090915290825290205460ff1681565b60015461036a906001600160a01b031681565b6107f86107b0366004612268565b6000908152601360205260409020549064ffffffffff60a083901c169060ff60c884901c81169160d085901c82169160d886901c81169160e087901c82169160e888901c1690565b604080516001600160a01b0390981688526020880196909652948601939093526060850191909152608084015260a083015260c082015260e0016102c3565b61083f611492565b336000805b87811015610bb85761086d898983818110610861576108616126a4565b905060200201356114f4565b30600560008b8b85818110610884576108846126a4565b60209081029290920135835250810191909152604001600020546001600160a01b0316146108f95760405162461bcd60e51b815260206004820152601e60248201527f456c66206e6f74206f776e6564206279207468697320636f6e7472616374000060448201526064015b60405180910390fd5b601985828151811061090d5761090d6126a4565b602002602001015160405161092291906122e2565b9081526040519081900360200190205461ffff161561097c5760405162461bcd60e51b815260206004820152601660248201527514da59db985d1d5c9948185b1c9958591e481d5cd95960521b60448201526064016108f0565b6109f36109d48a8a84818110610994576109946126a4565b90506020020135858a8a868181106109ae576109ae6126a4565b905060200201358886815181106109c7576109c76126a4565b6020026020010151611376565b8683815181106109e6576109e66126a4565b6020026020010151611576565b610a355760405162461bcd60e51b8152602060048201526013602482015272696e636f7272656374207369676e617475726560681b60448201526064016108f0565b60016019868381518110610a4b57610a4b6126a4565b6020026020010151604051610a6091906122e2565b908152604051908190036020019020805461ffff9290921661ffff199092169190911790556000610aa8888884818110610a9c57610a9c6126a4565b90506020020135611602565b9050610ad56040518060800160405280600081526020016000815260200160008152602001600081525090565b6000825260e0820151610100830151610120840151610af5929190611722565b6040820152610140820151610160830151610180840151610b17929190611722565b816060018181525050610b518260000151836020015186856060015186608001518760a001518860c0015188604001518960600151611757565b601360008d8d87818110610b6757610b676126a4565b90506020020135815260200190815260200160002081905550610ba330868d8d87818110610b9757610b976126a4565b905060200201356117a6565b50508080610bb090612627565b915050610844565b505050505050505050565b60006380ac58cd60e01b6001600160e01b031983161480610bf45750635b5e139f60e01b6001600160e01b03198316145b92915050565b6000818152600560205260409020546001600160a01b031633811480610c4357506001600160a01b038116600090815260076020908152604080832033845290915290205460ff165b610c7e5760405162461bcd60e51b815260206004820152600c60248201526b1393d517d054141493d5915160a21b60448201526064016108f0565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b610ce2611492565b60005b81811015610e8457610d02838383818110610861576108616126a4565b3060056000858585818110610d1957610d196126a4565b60209081029290920135835250810191909152604001600020546001600160a01b03161415610d4757600080fd5b6000610d7d60136000868686818110610d6257610d626126a4565b90506020020135815260200190815260200160002054611602565b9050610daa6040518060800160405280600081526020016000815260200160008152602001600081525090565b33825260e0820151610100830151610120840151610dc9929190611722565b6040820152610140820151610160830151610180840151610deb929190611722565b816060018181525050610e29826000015183602001518460400151856060015186608001518760a001518860c0015188604001518960600151611757565b60136000878787818110610e3f57610e3f6126a4565b90506020020135815260200190815260200160002081905550610e6f3330878787818110610b9757610b976126a4565b50508080610e7c90612627565b915050610ce5565b505050565b610e9161188f565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b60128181548110610ec357600080fd5b600091825260209091200154905081565b6000818152600560205260409020546001600160a01b031633811480610f1057506000828152600660205260409020546001600160a01b031633145b80610f3e57506001600160a01b038116600090815260076020908152604080832033845290915290205460ff165b610f795760405162461bcd60e51b815260206004820152600c60248201526b1393d517d054141493d5915160a21b60448201526064016108f0565b610f848484846117a6565b50505050565b610f95838383610ed4565b6001600160a01b0382163b158061104d5750604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401526000608484015290919084169063150b7a029060a401602060405180830381600087803b15801561100957600080fd5b505af115801561101d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110419190612216565b6001600160e01b031916145b610e845760405162461bcd60e51b815260206004820152601060248201526f155394d0519157d49150d2541251539560821b60448201526064016108f0565b61109461188f565b60005b82811015610f845781601560008686858181106110b6576110b66126a4565b90506020020160208101906110cb9190611ec6565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055806110fd81612627565b915050611097565b60006111188a8a8a8a8a8a8a8a8a611757565b9a9950505050505050505050565b61112e61188f565b47600061113c60028361254f565b90506000821161114b57600080fd5b600b54611161906001600160a01b0316826118f1565b600c54611177906001600160a01b0316826118f1565b5050565b61118361188f565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b6111ad611c5d565b610bf482611602565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000818152600560205260409020546001600160a01b031633146112745760405162461bcd60e51b81526020600482015260096024820152682727aa2fa7aba722a960b91b60448201526064016108f0565b6111773383836117a6565b61128a858585610ed4565b6001600160a01b0384163b15806113305750604051630a85bd0160e11b808252906001600160a01b0386169063150b7a02906112d29033908a90899089908990600401612373565b602060405180830381600087803b1580156112ec57600080fd5b505af1158015611300573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113249190612216565b6001600160e01b031916145b61136f5760405162461bcd60e51b815260206004820152601060248201526f155394d0519157d49150d2541251539560821b60448201526064016108f0565b5050505050565b60008484848460405160200161138f949392919061232d565b60408051601f198184030181529082905280516020918201207f19457468657265756d205369676e6564204d6573736167653a0a33320000000091830191909152603c820152605c01604051602081830303815290604052805190602001209050949350505050565b61140061188f565b600a805460ff60a01b198116600160a01b9182900460ff1615909102179055565b606060006040518060600160405280602c81526020016126ea602c913990508061144a84611951565b60405160200161145b9291906122fe565b604051602081830303815290604052915050919050565b61147a611cce565b600082815260136020526040902054610bf490611a4f565b33803b9032811480156114a3575081155b6114ac57600080fd5b6040516bffffffffffffffffffffffff19606083811b8216602084015241901b16603482015260480160408051601f1981840301815291905280516020909101206011555050565b60008181526013602052604081205461150c90611602565b6000838152600560205260409020549091506001600160a01b031633148061153d575080516001600160a01b031633145b6111775760405162461bcd60e51b815260206004820152600a6024820152692737ba2cb7bab922b63360b11b60448201526064016108f0565b6020818101516040808401516060808601518351600080825296810180865289905290861a93810184905290810184905260808101829052909190849060019060a0016020604051602081039080840390855afa1580156115db573d6000803e3d6000fd5b5050604051601f190151600e546001600160a01b0390811691161498975050505050505050565b61160a611c5d565b6001600160a01b038216815260a082811c64ffffffffff16602083015260c883901c60ff908116604084015260d084901c8116606084015260d884901c8116608084015260e084901c81169183019190915260e883901c811660c0830152600a9061167d9060649060f086901c1661254f565b6116879190612642565b60e0820152600a61169f8160ff60f086901c1661254f565b6116a99190612642565b6101008201526116c1600a60ff60f085901c16612642565b610120820152600a6116d8606460f885901c61254f565b6116e29190612642565b610140820152600a6116f88160f885901c61254f565b6117029190612642565b610160820152611717600a60f884901c612642565b610180820152919050565b60008161173084600a612585565b61173b866064612585565b6117459190612512565b61174f9190612512565b949350505050565b60f81b60f09190911b60e89290921b60e09390931b60d89490941b60d09590951b60c89690961b60a09790971b6001600160a01b03909816979097179590951793909317919091171717171790565b6000818152600560205260409020546001600160a01b038481169116146117cc57600080fd5b6001600160a01b03831660009081526004602052604081208054916117f083612610565b90915550506001600160a01b038216600090815260046020526040812080549161181983612627565b9091555050600081815260066020908152604080832080546001600160a01b0319908116909155600590925280832080546001600160a01b038781169190941681179091559051849391928716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6001546001600160a01b03163314806118bc57503360009081526015602052604090205460ff1615156001145b806118d15750600b546001600160a01b031633145b806118e65750600c546001600160a01b031633145b6118ef57600080fd5b565b6000826001600160a01b03168260405160006040518083038185875af1925050503d806000811461193e576040519150601f19603f3d011682016040523d82523d6000602084013e611943565b606091505b5050905080610e8457600080fd5b6060816119755750506040805180820190915260018152600360fc1b602082015290565b8160005b811561199f578061198981612627565b91506119989050600a8361254f565b9150611979565b60008167ffffffffffffffff8111156119ba576119ba6126ba565b6040519080825280601f01601f1916602001820160405280156119e4576020820181803683370190505b5090505b841561174f576119f96001836125cd565b9150611a06600a86612642565b611a11906030612512565b60f81b818381518110611a2657611a266126a4565b60200101906001600160f81b031916908160001a905350611a48600a8661254f565b94506119e8565b611a57611cce565b6001600160a01b038216815260a082811c64ffffffffff16602083015260c883901c60ff908116604084015260d084901c8116606084015260d884901c8116608084015260e084901c81169183019190915260e883901c1660c0820152600a611ac5606460f085901c612563565b611acf9190612656565b60ff1660e0820152600a611ae78160f085901c612563565b611af19190612656565b60ff16610100820152611b09600a60f084901c612656565b60ff16610120820152600a611b23606460f885901c612563565b611b2d9190612656565b60ff16610140820152600a611b468160f885901c612563565b611b509190612656565b60ff16610160820152611b68600a60f884901c612656565b60ff1661018082015260e0810151611b8190600161252a565b610140820151611b929060036125a4565b611b9c919061252a565b60ff1660e0820152610100810151611bb590600161252a565b610140820151611bc69060046125a4565b611bd0919061252a565b60ff90811661010083015260a082015116604514611c185760a0810151611bf890600161252a565b610140820151611c0990600f6125a4565b611c13919061252a565b611c1b565b60455b60ff1660a0820152610120810151611c3490600161252a565b610140820151611c459060076125a4565b611c4f919061252a565b60ff16610120820152919050565b604051806101a0016040528060006001600160a01b031681526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b604080516101a081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081019190915290565b80356001600160a01b0381168114611d5157600080fd5b919050565b60008083601f840112611d6857600080fd5b50813567ffffffffffffffff811115611d8057600080fd5b6020830191508360208260051b8501011115611d9b57600080fd5b9250929050565b600082601f830112611db357600080fd5b8135602067ffffffffffffffff80831115611dd057611dd06126ba565b8260051b611ddf8382016124e1565b8481528381019087850183890186018a1015611dfa57600080fd5b60009350835b87811015611e3757813586811115611e16578586fd5b611e248c89838e0101611e56565b8552509286019290860190600101611e00565b50909998505050505050505050565b80358015158114611d5157600080fd5b600082601f830112611e6757600080fd5b813567ffffffffffffffff811115611e8157611e816126ba565b611e94601f8201601f19166020016124e1565b818152846020838601011115611ea957600080fd5b816020850160208301376000918101602001919091529392505050565b600060208284031215611ed857600080fd5b611ee182611d3a565b9392505050565b60008060408385031215611efb57600080fd5b611f0483611d3a565b9150611f1260208401611d3a565b90509250929050565b600080600060608486031215611f3057600080fd5b611f3984611d3a565b9250611f4760208501611d3a565b9150604084013590509250925092565b600080600080600060808688031215611f6f57600080fd5b611f7886611d3a565b9450611f8660208701611d3a565b935060408601359250606086013567ffffffffffffffff80821115611faa57600080fd5b818801915088601f830112611fbe57600080fd5b813581811115611fcd57600080fd5b896020828501011115611fdf57600080fd5b9699959850939650602001949392505050565b6000806040838503121561200557600080fd5b61200e83611d3a565b9150611f1260208401611e46565b6000806040838503121561202f57600080fd5b61203883611d3a565b946020939093013593505050565b60008060008060008060008060006101208a8c03121561206557600080fd5b61206e8a611d3a565b9b60208b01359b5060408b01359a60608101359a506080810135995060a0810135985060c0810135975060e081013596506101000135945092505050565b6000806000604084860312156120c157600080fd5b833567ffffffffffffffff8111156120d857600080fd5b6120e486828701611d56565b90945092506120f7905060208501611e46565b90509250925092565b6000806020838503121561211357600080fd5b823567ffffffffffffffff81111561212a57600080fd5b61213685828601611d56565b90969095509350505050565b6000806000806000806080878903121561215b57600080fd5b863567ffffffffffffffff8082111561217357600080fd5b61217f8a838b01611d56565b9098509650602089013591508082111561219857600080fd5b6121a48a838b01611d56565b909650945060408901359150808211156121bd57600080fd5b6121c98a838b01611da2565b935060608901359150808211156121df57600080fd5b506121ec89828a01611da2565b9150509295509295509295565b60006020828403121561220b57600080fd5b8135611ee1816126d0565b60006020828403121561222857600080fd5b8151611ee1816126d0565b60006020828403121561224557600080fd5b813567ffffffffffffffff81111561225c57600080fd5b61174f84828501611e56565b60006020828403121561227a57600080fd5b5035919050565b6000806000806080858703121561229757600080fd5b843593506122a760208601611d3a565b925060408501359150606085013567ffffffffffffffff8111156122ca57600080fd5b6122d687828801611e56565b91505092959194509250565b600082516122f48184602087016125e4565b9190910192915050565b600083516123108184602088016125e4565b8351908301906123248183602088016125e4565b01949350505050565b8481526bffffffffffffffffffffffff198460601b166020820152826034820152600082516123638160548501602087016125e4565b9190910160540195945050505050565b6001600160a01b038681168252851660208201526040810184905260806060820181905281018290526000828460a0840137600060a0848401015260a0601f19601f85011683010190509695505050505050565b60208152600082518060208401526123e68160408501602087016125e4565b601f01601f19169190910160400192915050565b81516001600160a01b031681526101a0810160208301516020830152604083015161242a604084018260ff169052565b50606083015161243f606084018260ff169052565b506080830151612454608084018260ff169052565b5060a083015161246960a084018260ff169052565b5060c083015161247e60c084018260ff169052565b5060e083015161249360e084018260ff169052565b506101008381015160ff908116918401919091526101208085015182169084015261014080850151821690840152610160808501518216908401526101809384015116929091019190915290565b604051601f8201601f1916810167ffffffffffffffff8111828210171561250a5761250a6126ba565b604052919050565b6000821982111561252557612525612678565b500190565b600060ff821660ff84168060ff0382111561254757612547612678565b019392505050565b60008261255e5761255e61268e565b500490565b600060ff8316806125765761257661268e565b8060ff84160491505092915050565b600081600019048311821515161561259f5761259f612678565b500290565b600060ff821660ff84168160ff04811182151516156125c5576125c5612678565b029392505050565b6000828210156125df576125df612678565b500390565b60005b838110156125ff5781810151838201526020016125e7565b83811115610f845750506000910152565b60008161261f5761261f612678565b506000190190565b600060001982141561263b5761263b612678565b5060010190565b6000826126515761265161268e565b500690565b600060ff8316806126695761266961268e565b8060ff84160691505092915050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146126e657600080fd5b5056fe68747470733a2f2f6170692e65746865726e616c656c7665732e636f6d2f6170692f73656e74696e656c732fa26469706673582212206d6fb437837f4d7ac76c0a564860fdd603f7bfc459c4ba17c1150cbd3d970eb964736f6c63430008070033

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061028a5760003560e01c80638b1681a61161015c578063b4eada88116100ce578063d5abeb0111610087578063d5abeb0114610709578063d5f1842914610712578063e4b50cb814610741578063e985e9c514610761578063f851a4401461078f578063f93c50ac146107a257600080fd5b8063b4eada8814610698578063b88d4fde146106a5578063baf82b2b146106b8578063c092b13e146106cb578063c87b56dd146106d3578063cd5d2118146106e657600080fd5b806395d89b411161012057806395d89b41146106065780639b19251a14610625578063a035b1fe14610649578063a22cb46514610652578063a59d168614610665578063a9059cbb1461068557600080fd5b80638b1681a6146105045780638da5cb5b146105245780638dd1480214610535578063918e145714610548578063956cc859146105fd57600080fd5b806319908016116102005780636352211e116101b95780636352211e1461046d57806370a08231146104965780638299b166146104b657806384f57d02146104d6578063853828b6146104e95780638a9b4067146104f157600080fd5b806319908016146103f957806323b872dd1461040d57806338b3ccc8146104205780633a5381b51461043457806342842e0e146104475780634576da471461045a57600080fd5b8063095ea7b311610252578063095ea7b3146103825780630c0ef2b0146103955780630fbf0a93146103a95780631327d3d8146103bc5780631637bbdf146103cf57806318160ddd146103f057600080fd5b806301a85d3b1461028f57806301ffc9a7146102a457806304217c87146102cc57806306fdde031461030e578063081812fc14610341575b600080fd5b6102a261029d366004612142565b610837565b005b6102b76102b23660046121f9565b610bc3565b60405190151581526020015b60405180910390f35b6102fb6102da366004612233565b805160208183018101805160198252928201919093012091525461ffff1681565b60405161ffff90911681526020016102c3565b60408051808201909152600e81526d45746865726e616c20456c76657360901b60208201525b6040516102c391906123c7565b61036a61034f366004612268565b6006602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016102c3565b6102a261039036600461201c565b610bfa565b600a546102b790600160a01b900460ff1681565b6102a26103b7366004612100565b610cda565b6102a26103ca366004611ec6565b610e89565b6103e26103dd366004612268565b610eb3565b6040519081526020016102c3565b6103e260025481565b600a546102b790600160a81b900460ff1681565b6102a261041b366004611f1b565b610ed4565b600a546102b790600160b01b900460ff1681565b600e5461036a906001600160a01b031681565b6102a2610455366004611f1b565b610f8a565b6102a26104683660046120ac565b61108c565b61036a61047b366004612268565b6005602052600090815260409020546001600160a01b031681565b6103e26104a4366004611ec6565b60046020526000908152604090205481565b6103e26104c4366004612268565b60136020526000908152604090205481565b6103e26104e4366004612046565b611105565b6102a2611126565b600a5461036a906001600160a01b031681565b6103e2610512366004611ec6565b60146020526000908152604090205481565b6001546001600160a01b031661036a565b6102a2610543366004611ec6565b61117b565b61055b610556366004612268565b6111a5565b6040516102c3919081516001600160a01b031681526101a081016020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015160c083015260e083015160e083015261010080840151818401525061012080840151818401525061014080840151818401525061016080840151818401525061018080840151818401525092915050565b6103e2600f5481565b60408051808201909152600381526222a62b60e91b6020820152610334565b6102fb610633366004611ec6565b60166020526000908152604090205461ffff1681565b6103e260105481565b6102a2610660366004611ff2565b6111b6565b6103e2610673366004612268565b60009081526013602052604090205490565b6102a261069336600461201c565b611222565b6017546102b79060ff1681565b6102a26106b3366004611f57565b61127f565b6103e26106c6366004612281565b611376565b6102a26113f8565b6103346106e1366004612268565b611421565b6102b76106f4366004611ec6565b60156020526000908152604090205460ff1681565b6103e260035481565b6102fb610720366004612233565b805160208183018101805160188252928201919093012091525461ffff1681565b61075461074f366004612268565b611472565b6040516102c391906123fa565b6102b761076f366004611ee8565b600760209081526000928352604080842090915290825290205460ff1681565b60015461036a906001600160a01b031681565b6107f86107b0366004612268565b6000908152601360205260409020549064ffffffffff60a083901c169060ff60c884901c81169160d085901c82169160d886901c81169160e087901c82169160e888901c1690565b604080516001600160a01b0390981688526020880196909652948601939093526060850191909152608084015260a083015260c082015260e0016102c3565b61083f611492565b336000805b87811015610bb85761086d898983818110610861576108616126a4565b905060200201356114f4565b30600560008b8b85818110610884576108846126a4565b60209081029290920135835250810191909152604001600020546001600160a01b0316146108f95760405162461bcd60e51b815260206004820152601e60248201527f456c66206e6f74206f776e6564206279207468697320636f6e7472616374000060448201526064015b60405180910390fd5b601985828151811061090d5761090d6126a4565b602002602001015160405161092291906122e2565b9081526040519081900360200190205461ffff161561097c5760405162461bcd60e51b815260206004820152601660248201527514da59db985d1d5c9948185b1c9958591e481d5cd95960521b60448201526064016108f0565b6109f36109d48a8a84818110610994576109946126a4565b90506020020135858a8a868181106109ae576109ae6126a4565b905060200201358886815181106109c7576109c76126a4565b6020026020010151611376565b8683815181106109e6576109e66126a4565b6020026020010151611576565b610a355760405162461bcd60e51b8152602060048201526013602482015272696e636f7272656374207369676e617475726560681b60448201526064016108f0565b60016019868381518110610a4b57610a4b6126a4565b6020026020010151604051610a6091906122e2565b908152604051908190036020019020805461ffff9290921661ffff199092169190911790556000610aa8888884818110610a9c57610a9c6126a4565b90506020020135611602565b9050610ad56040518060800160405280600081526020016000815260200160008152602001600081525090565b6000825260e0820151610100830151610120840151610af5929190611722565b6040820152610140820151610160830151610180840151610b17929190611722565b816060018181525050610b518260000151836020015186856060015186608001518760a001518860c0015188604001518960600151611757565b601360008d8d87818110610b6757610b676126a4565b90506020020135815260200190815260200160002081905550610ba330868d8d87818110610b9757610b976126a4565b905060200201356117a6565b50508080610bb090612627565b915050610844565b505050505050505050565b60006380ac58cd60e01b6001600160e01b031983161480610bf45750635b5e139f60e01b6001600160e01b03198316145b92915050565b6000818152600560205260409020546001600160a01b031633811480610c4357506001600160a01b038116600090815260076020908152604080832033845290915290205460ff165b610c7e5760405162461bcd60e51b815260206004820152600c60248201526b1393d517d054141493d5915160a21b60448201526064016108f0565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b610ce2611492565b60005b81811015610e8457610d02838383818110610861576108616126a4565b3060056000858585818110610d1957610d196126a4565b60209081029290920135835250810191909152604001600020546001600160a01b03161415610d4757600080fd5b6000610d7d60136000868686818110610d6257610d626126a4565b90506020020135815260200190815260200160002054611602565b9050610daa6040518060800160405280600081526020016000815260200160008152602001600081525090565b33825260e0820151610100830151610120840151610dc9929190611722565b6040820152610140820151610160830151610180840151610deb929190611722565b816060018181525050610e29826000015183602001518460400151856060015186608001518760a001518860c0015188604001518960600151611757565b60136000878787818110610e3f57610e3f6126a4565b90506020020135815260200190815260200160002081905550610e6f3330878787818110610b9757610b976126a4565b50508080610e7c90612627565b915050610ce5565b505050565b610e9161188f565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b60128181548110610ec357600080fd5b600091825260209091200154905081565b6000818152600560205260409020546001600160a01b031633811480610f1057506000828152600660205260409020546001600160a01b031633145b80610f3e57506001600160a01b038116600090815260076020908152604080832033845290915290205460ff165b610f795760405162461bcd60e51b815260206004820152600c60248201526b1393d517d054141493d5915160a21b60448201526064016108f0565b610f848484846117a6565b50505050565b610f95838383610ed4565b6001600160a01b0382163b158061104d5750604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401526000608484015290919084169063150b7a029060a401602060405180830381600087803b15801561100957600080fd5b505af115801561101d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110419190612216565b6001600160e01b031916145b610e845760405162461bcd60e51b815260206004820152601060248201526f155394d0519157d49150d2541251539560821b60448201526064016108f0565b61109461188f565b60005b82811015610f845781601560008686858181106110b6576110b66126a4565b90506020020160208101906110cb9190611ec6565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055806110fd81612627565b915050611097565b60006111188a8a8a8a8a8a8a8a8a611757565b9a9950505050505050505050565b61112e61188f565b47600061113c60028361254f565b90506000821161114b57600080fd5b600b54611161906001600160a01b0316826118f1565b600c54611177906001600160a01b0316826118f1565b5050565b61118361188f565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b6111ad611c5d565b610bf482611602565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000818152600560205260409020546001600160a01b031633146112745760405162461bcd60e51b81526020600482015260096024820152682727aa2fa7aba722a960b91b60448201526064016108f0565b6111773383836117a6565b61128a858585610ed4565b6001600160a01b0384163b15806113305750604051630a85bd0160e11b808252906001600160a01b0386169063150b7a02906112d29033908a90899089908990600401612373565b602060405180830381600087803b1580156112ec57600080fd5b505af1158015611300573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113249190612216565b6001600160e01b031916145b61136f5760405162461bcd60e51b815260206004820152601060248201526f155394d0519157d49150d2541251539560821b60448201526064016108f0565b5050505050565b60008484848460405160200161138f949392919061232d565b60408051601f198184030181529082905280516020918201207f19457468657265756d205369676e6564204d6573736167653a0a33320000000091830191909152603c820152605c01604051602081830303815290604052805190602001209050949350505050565b61140061188f565b600a805460ff60a01b198116600160a01b9182900460ff1615909102179055565b606060006040518060600160405280602c81526020016126ea602c913990508061144a84611951565b60405160200161145b9291906122fe565b604051602081830303815290604052915050919050565b61147a611cce565b600082815260136020526040902054610bf490611a4f565b33803b9032811480156114a3575081155b6114ac57600080fd5b6040516bffffffffffffffffffffffff19606083811b8216602084015241901b16603482015260480160408051601f1981840301815291905280516020909101206011555050565b60008181526013602052604081205461150c90611602565b6000838152600560205260409020549091506001600160a01b031633148061153d575080516001600160a01b031633145b6111775760405162461bcd60e51b815260206004820152600a6024820152692737ba2cb7bab922b63360b11b60448201526064016108f0565b6020818101516040808401516060808601518351600080825296810180865289905290861a93810184905290810184905260808101829052909190849060019060a0016020604051602081039080840390855afa1580156115db573d6000803e3d6000fd5b5050604051601f190151600e546001600160a01b0390811691161498975050505050505050565b61160a611c5d565b6001600160a01b038216815260a082811c64ffffffffff16602083015260c883901c60ff908116604084015260d084901c8116606084015260d884901c8116608084015260e084901c81169183019190915260e883901c811660c0830152600a9061167d9060649060f086901c1661254f565b6116879190612642565b60e0820152600a61169f8160ff60f086901c1661254f565b6116a99190612642565b6101008201526116c1600a60ff60f085901c16612642565b610120820152600a6116d8606460f885901c61254f565b6116e29190612642565b610140820152600a6116f88160f885901c61254f565b6117029190612642565b610160820152611717600a60f884901c612642565b610180820152919050565b60008161173084600a612585565b61173b866064612585565b6117459190612512565b61174f9190612512565b949350505050565b60f81b60f09190911b60e89290921b60e09390931b60d89490941b60d09590951b60c89690961b60a09790971b6001600160a01b03909816979097179590951793909317919091171717171790565b6000818152600560205260409020546001600160a01b038481169116146117cc57600080fd5b6001600160a01b03831660009081526004602052604081208054916117f083612610565b90915550506001600160a01b038216600090815260046020526040812080549161181983612627565b9091555050600081815260066020908152604080832080546001600160a01b0319908116909155600590925280832080546001600160a01b038781169190941681179091559051849391928716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6001546001600160a01b03163314806118bc57503360009081526015602052604090205460ff1615156001145b806118d15750600b546001600160a01b031633145b806118e65750600c546001600160a01b031633145b6118ef57600080fd5b565b6000826001600160a01b03168260405160006040518083038185875af1925050503d806000811461193e576040519150601f19603f3d011682016040523d82523d6000602084013e611943565b606091505b5050905080610e8457600080fd5b6060816119755750506040805180820190915260018152600360fc1b602082015290565b8160005b811561199f578061198981612627565b91506119989050600a8361254f565b9150611979565b60008167ffffffffffffffff8111156119ba576119ba6126ba565b6040519080825280601f01601f1916602001820160405280156119e4576020820181803683370190505b5090505b841561174f576119f96001836125cd565b9150611a06600a86612642565b611a11906030612512565b60f81b818381518110611a2657611a266126a4565b60200101906001600160f81b031916908160001a905350611a48600a8661254f565b94506119e8565b611a57611cce565b6001600160a01b038216815260a082811c64ffffffffff16602083015260c883901c60ff908116604084015260d084901c8116606084015260d884901c8116608084015260e084901c81169183019190915260e883901c1660c0820152600a611ac5606460f085901c612563565b611acf9190612656565b60ff1660e0820152600a611ae78160f085901c612563565b611af19190612656565b60ff16610100820152611b09600a60f084901c612656565b60ff16610120820152600a611b23606460f885901c612563565b611b2d9190612656565b60ff16610140820152600a611b468160f885901c612563565b611b509190612656565b60ff16610160820152611b68600a60f884901c612656565b60ff1661018082015260e0810151611b8190600161252a565b610140820151611b929060036125a4565b611b9c919061252a565b60ff1660e0820152610100810151611bb590600161252a565b610140820151611bc69060046125a4565b611bd0919061252a565b60ff90811661010083015260a082015116604514611c185760a0810151611bf890600161252a565b610140820151611c0990600f6125a4565b611c13919061252a565b611c1b565b60455b60ff1660a0820152610120810151611c3490600161252a565b610140820151611c459060076125a4565b611c4f919061252a565b60ff16610120820152919050565b604051806101a0016040528060006001600160a01b031681526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b604080516101a081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081019190915290565b80356001600160a01b0381168114611d5157600080fd5b919050565b60008083601f840112611d6857600080fd5b50813567ffffffffffffffff811115611d8057600080fd5b6020830191508360208260051b8501011115611d9b57600080fd5b9250929050565b600082601f830112611db357600080fd5b8135602067ffffffffffffffff80831115611dd057611dd06126ba565b8260051b611ddf8382016124e1565b8481528381019087850183890186018a1015611dfa57600080fd5b60009350835b87811015611e3757813586811115611e16578586fd5b611e248c89838e0101611e56565b8552509286019290860190600101611e00565b50909998505050505050505050565b80358015158114611d5157600080fd5b600082601f830112611e6757600080fd5b813567ffffffffffffffff811115611e8157611e816126ba565b611e94601f8201601f19166020016124e1565b818152846020838601011115611ea957600080fd5b816020850160208301376000918101602001919091529392505050565b600060208284031215611ed857600080fd5b611ee182611d3a565b9392505050565b60008060408385031215611efb57600080fd5b611f0483611d3a565b9150611f1260208401611d3a565b90509250929050565b600080600060608486031215611f3057600080fd5b611f3984611d3a565b9250611f4760208501611d3a565b9150604084013590509250925092565b600080600080600060808688031215611f6f57600080fd5b611f7886611d3a565b9450611f8660208701611d3a565b935060408601359250606086013567ffffffffffffffff80821115611faa57600080fd5b818801915088601f830112611fbe57600080fd5b813581811115611fcd57600080fd5b896020828501011115611fdf57600080fd5b9699959850939650602001949392505050565b6000806040838503121561200557600080fd5b61200e83611d3a565b9150611f1260208401611e46565b6000806040838503121561202f57600080fd5b61203883611d3a565b946020939093013593505050565b60008060008060008060008060006101208a8c03121561206557600080fd5b61206e8a611d3a565b9b60208b01359b5060408b01359a60608101359a506080810135995060a0810135985060c0810135975060e081013596506101000135945092505050565b6000806000604084860312156120c157600080fd5b833567ffffffffffffffff8111156120d857600080fd5b6120e486828701611d56565b90945092506120f7905060208501611e46565b90509250925092565b6000806020838503121561211357600080fd5b823567ffffffffffffffff81111561212a57600080fd5b61213685828601611d56565b90969095509350505050565b6000806000806000806080878903121561215b57600080fd5b863567ffffffffffffffff8082111561217357600080fd5b61217f8a838b01611d56565b9098509650602089013591508082111561219857600080fd5b6121a48a838b01611d56565b909650945060408901359150808211156121bd57600080fd5b6121c98a838b01611da2565b935060608901359150808211156121df57600080fd5b506121ec89828a01611da2565b9150509295509295509295565b60006020828403121561220b57600080fd5b8135611ee1816126d0565b60006020828403121561222857600080fd5b8151611ee1816126d0565b60006020828403121561224557600080fd5b813567ffffffffffffffff81111561225c57600080fd5b61174f84828501611e56565b60006020828403121561227a57600080fd5b5035919050565b6000806000806080858703121561229757600080fd5b843593506122a760208601611d3a565b925060408501359150606085013567ffffffffffffffff8111156122ca57600080fd5b6122d687828801611e56565b91505092959194509250565b600082516122f48184602087016125e4565b9190910192915050565b600083516123108184602088016125e4565b8351908301906123248183602088016125e4565b01949350505050565b8481526bffffffffffffffffffffffff198460601b166020820152826034820152600082516123638160548501602087016125e4565b9190910160540195945050505050565b6001600160a01b038681168252851660208201526040810184905260806060820181905281018290526000828460a0840137600060a0848401015260a0601f19601f85011683010190509695505050505050565b60208152600082518060208401526123e68160408501602087016125e4565b601f01601f19169190910160400192915050565b81516001600160a01b031681526101a0810160208301516020830152604083015161242a604084018260ff169052565b50606083015161243f606084018260ff169052565b506080830151612454608084018260ff169052565b5060a083015161246960a084018260ff169052565b5060c083015161247e60c084018260ff169052565b5060e083015161249360e084018260ff169052565b506101008381015160ff908116918401919091526101208085015182169084015261014080850151821690840152610160808501518216908401526101809384015116929091019190915290565b604051601f8201601f1916810167ffffffffffffffff8111828210171561250a5761250a6126ba565b604052919050565b6000821982111561252557612525612678565b500190565b600060ff821660ff84168060ff0382111561254757612547612678565b019392505050565b60008261255e5761255e61268e565b500490565b600060ff8316806125765761257661268e565b8060ff84160491505092915050565b600081600019048311821515161561259f5761259f612678565b500290565b600060ff821660ff84168160ff04811182151516156125c5576125c5612678565b029392505050565b6000828210156125df576125df612678565b500390565b60005b838110156125ff5781810151838201526020016125e7565b83811115610f845750506000910152565b60008161261f5761261f612678565b506000190190565b600060001982141561263b5761263b612678565b5060010190565b6000826126515761265161268e565b500690565b600060ff8316806126695761266961268e565b8060ff84160691505092915050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146126e657600080fd5b5056fe68747470733a2f2f6170692e65746865726e616c656c7665732e636f6d2f6170692f73656e74696e656c732fa26469706673582212206d6fb437837f4d7ac76c0a564860fdd603f7bfc459c4ba17c1150cbd3d970eb964736f6c63430008070033

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.