ETH Price: $3,319.38 (+2.45%)
Gas: 3 Gwei

Token

Ethernal Elves (ELV)
 

Overview

Max Total Supply

0 ELV

Holders

0

Total Transfers

-

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

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

Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.