ETH Price: $2,952.61 (-0.41%)
 

Overview

ETH Balance

Scroll LogoScroll LogoScroll Logo0 ETH

ETH Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To

There are no matching entries

Please try again later

Advanced mode:
Parent Transaction Hash Block From To
View All Internal Transactions
Cross-Chain Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
BatchSignedERC721OrdersCheckerFeature

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion
/// SPDX-License-Identifier: MIT

pragma solidity ^0.8.15;

import "./IBatchSignedERC721OrdersCheckerFeature.sol";
import "../../libs/LibAssetHelper.sol";

interface IElement {
    function getERC721OrderStatusBitVector(address maker, uint248 nonceRange) external view returns (uint256);
    function getHashNonce(address maker) external view returns (uint256);
}

contract BatchSignedERC721OrdersCheckerFeature is IBatchSignedERC721OrdersCheckerFeature, LibAssetHelper {

    uint256 internal constant MASK_96 = (1 << 96) - 1;
    uint256 internal constant MASK_160 = (1 << 160) - 1;
    uint256 internal constant MASK_224 = (1 << 224) - 1;

    bytes32 public immutable EIP712_DOMAIN_SEPARATOR;
    address public immutable ELEMENT;

    constructor(address element) {
        ELEMENT = element;
        EIP712_DOMAIN_SEPARATOR = keccak256(abi.encode(
            keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
            keccak256("ElementEx"),
            keccak256("1.0.0"),
            block.chainid,
            element
        ));
    }

    function checkBSERC721Orders(BSERC721Orders calldata order) external view override returns (BSERC721OrdersCheckResult memory r) {
        uint256 nonce;
        (r.basicCollections, nonce) = _checkBasicCollections(order, true);
        r.collections = _checkCollections(order, nonce, true);
        r.hashNonce = _getHashNonce(order.maker);
        r.orderHash = _getOrderHash(order, r.hashNonce);
        r.validSignature = _validateSignature(order, r.orderHash, 0);
        return r;
    }

    function checkBSERC721OrdersV2(BSERC721Orders calldata order, uint8 signatureType) external view returns (BSERC721OrdersCheckResult memory r) {
        uint256 nonce;
        (r.basicCollections, nonce) = _checkBasicCollections(order, true);
        r.collections = _checkCollections(order, nonce, true);
        r.hashNonce = _getHashNonce(order.maker);
        r.orderHash = _getOrderHash(order, r.hashNonce);
        r.validSignature = _validateSignature(order, r.orderHash, signatureType);
        return r;
    }

    function checkBSERC721OrdersV3(BSERC721Orders calldata order, uint8 signatureType, bool isGetOwnerOf) external view returns (BSERC721OrdersCheckResult memory r) {
        uint256 nonce;
        (r.basicCollections, nonce) = _checkBasicCollections(order, isGetOwnerOf);
        r.collections = _checkCollections(order, nonce, isGetOwnerOf);
        r.hashNonce = _getHashNonce(order.maker);
        r.orderHash = _getOrderHash(order, r.hashNonce);
        r.validSignature = _validateSignature(order, r.orderHash, signatureType);
        return r;
    }

    function _checkBasicCollections(BSERC721Orders calldata order, bool isGetOwnerOf) internal view returns (BSCollectionCheckResult[] memory basicCollections, uint256 nonce) {
        nonce = order.startNonce;
        basicCollections = new BSCollectionCheckResult[](order.basicCollections.length);

        for (uint256 i; i < basicCollections.length; ) {
            address nftAddress = order.basicCollections[i].nftAddress;
            basicCollections[i].isApprovedForAll = _isApprovedForAll(nftAddress, true, order.maker, ELEMENT) > 0;

            BSOrderItemCheckResult[] memory items = new BSOrderItemCheckResult[](order.basicCollections[i].items.length);
            basicCollections[i].items = items;

            for (uint256 j; j < items.length; ) {
                items[j].isNonceValid = _isNonceValid(order.maker, nonce);
                unchecked { ++nonce; }

                items[j].isERC20AmountValid = order.basicCollections[i].items[j].erc20TokenAmount <= MASK_96;
                uint256 nftId = order.basicCollections[i].items[j].nftId;
                if (nftId <= MASK_160) {
                    if (isGetOwnerOf) {
                        items[j].ownerOfNftId = _erc721OwnerOf(nftAddress, nftId);
                        items[j].approvedAccountOfNftId = _erc721GetApproved(nftAddress, nftId);
                    }
                } else {
                    items[j].ownerOfNftId = address(0);
                    items[j].approvedAccountOfNftId = address(0);
                }
                unchecked { ++j; }
            }
            unchecked { ++i; }
        }
    }

    function _checkCollections(BSERC721Orders calldata order, uint256 nonce, bool isGetOwnerOf) internal view returns (BSCollectionCheckResult[] memory collections) {
        collections = new BSCollectionCheckResult[](order.collections.length);
        for (uint256 i; i < collections.length; ) {
            address nftAddress = order.collections[i].nftAddress;
            collections[i].isApprovedForAll = _isApprovedForAll(nftAddress, true, order.maker, ELEMENT) > 0;

            BSOrderItemCheckResult[] memory items = new BSOrderItemCheckResult[](order.collections[i].items.length);
            collections[i].items = items;

            for (uint256 j; j < items.length; ) {
                items[j].isNonceValid = _isNonceValid(order.maker, nonce);
                unchecked { ++nonce; }

                items[j].isERC20AmountValid = order.collections[i].items[j].erc20TokenAmount <= MASK_224;

                uint256 nftId = order.collections[i].items[j].nftId;
                if (isGetOwnerOf) {
                    items[j].ownerOfNftId = _erc721OwnerOf(nftAddress, nftId);
                    items[j].approvedAccountOfNftId = _erc721GetApproved(nftAddress, nftId);
                }

                unchecked { ++j; }
            }
            unchecked { ++i; }
        }
    }

    function _validateSignature(
        BSERC721Orders calldata order,
        bytes32 hash,
        uint8 signatureType
    ) internal view returns (bool)  {
        address maker = order.maker;
        if (maker == address(0)) {
            return false;
        }

        uint8 v = order.v;
        bytes32 r = order.r;
        bytes32 s = order.s;
        if (signatureType == 0) {
            return order.maker == ecrecover(hash, v, r, s);
        } else if (signatureType == 3) {
            return isValidSignature1271(order.maker, hash, v, r, s);
        } else if (signatureType == 5) {
            uint256 personalSignState = _getPersonalSignState();
            if ((personalSignState & 0x1) == 0) {
               return false;
            }
            bytes32 validateHash = toEthereumPersonalSignHash(hash);
            return isValidSignature1271(order.maker, validateHash, v, r, s);
        } else if (signatureType == 7) {
            uint256 personalSignState = _getPersonalSignState();
            if ((personalSignState & 0x2) == 0) {
                return false;
            }
            bytes32 validateHash = toBitcoinPersonalSignHash(hash);
            return isValidSignature1271(order.maker, validateHash, v, r, s);
        } else if (signatureType == 9) {
            uint256 personalSignState = _getPersonalSignState();
            if ((personalSignState & 0x4) == 0) {
                return false;
            }
            bytes32 validateHash = toBitcoinPersonalSignHash(hash);
            return isValidSignature173(order.maker, validateHash, v, r, s);
        } else {
            return false;
        }
    }

    function _getPersonalSignState() internal view returns (uint256 state) {
        address element = ELEMENT;
        assembly {
            let ptr := mload(0x40) // free memory pointer

            // selector for getPersonalSignState
            mstore(ptr, 0x3cdad7ce)

            let success := staticcall(gas(), element, ptr, 0x4, ptr, 32)
            if success {
                if eq(returndatasize(), 32) {
                    state := mload(ptr)
                }
            }
        }
    }

    function _isNonceValid(address account, uint256 nonce) internal view returns (bool filled) {
        uint256 bitVector = IElement(ELEMENT).getERC721OrderStatusBitVector(account, uint248(nonce >> 8));
        uint256 flag = 1 << (nonce & 0xff);
        return (bitVector & flag) == 0;
    }

    function _getHashNonce(address maker) internal view returns (uint256) {
        return IElement(ELEMENT).getHashNonce(maker);
    }

    // keccak256(""));
    bytes32 internal constant _EMPTY_ARRAY_KECCAK256 = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;

    // keccak256(abi.encodePacked(
    //    "BatchSignedERC721Orders(address maker,uint256 listingTime,uint256 expiryTime,uint256 startNonce,address erc20Token,address platformFeeRecipient,BasicCollection[] basicCollections,Collection[] collections,uint256 hashNonce)",
    //    "BasicCollection(address nftAddress,bytes32 fee,bytes32[] items)",
    //    "Collection(address nftAddress,bytes32 fee,OrderItem[] items)",
    //    "OrderItem(uint256 erc20TokenAmount,uint256 nftId)"
    // ))
    bytes32 internal constant _BATCH_SIGNED_ERC721_ORDERS_TYPE_HASH = 0x2d8cbbbc696e7292c3b5beb38e1363d34ff11beb8c3456c14cb938854597b9ed;
    // keccak256("BasicCollection(address nftAddress,bytes32 fee,bytes32[] items)")
    bytes32 internal constant _BASIC_COLLECTION_TYPE_HASH = 0x12ad29288fd70022f26997a9958d9eceb6e840ceaa79b72ea5945ba87e4d33b0;
    // keccak256(abi.encodePacked(
    //    "Collection(address nftAddress,bytes32 fee,OrderItem[] items)",
    //    "OrderItem(uint256 erc20TokenAmount,uint256 nftId)"
    // ))
    bytes32 internal constant _COLLECTION_TYPE_HASH = 0xb9f488d48cec782be9ecdb74330c9c6a33c236a8022d8a91a4e4df4e81b51620;
    // keccak256("OrderItem(uint256 erc20TokenAmount,uint256 nftId)")
    bytes32 internal constant _ORDER_ITEM_TYPE_HASH = 0x5f93394997caa49a9382d44a75e3ce6a460f32b39870464866ac994f8be97afe;

    function _getOrderHash(BSERC721Orders calldata order, uint256 hashNonce) internal view returns (bytes32) {
        bytes32 basicCollectionsHash = _getBasicCollectionsHash(order.basicCollections);
        bytes32 collectionsHash = _getCollectionsHash(order.collections);
        address paymentToken = order.paymentToken;
        if (paymentToken == address(0)) {
            paymentToken = NATIVE_TOKEN_ADDRESS;
        }
        bytes32 structHash = keccak256(abi.encode(
            _BATCH_SIGNED_ERC721_ORDERS_TYPE_HASH,
            order.maker,
            order.listingTime,
            order.expirationTime,
            order.startNonce,
            paymentToken,
            order.platformFeeRecipient,
            basicCollectionsHash,
            collectionsHash,
            hashNonce
        ));
        return keccak256(abi.encodePacked(hex"1901", EIP712_DOMAIN_SEPARATOR, structHash));
    }

    function _getBasicCollectionsHash(BSCollection[] calldata basicCollections) internal pure returns (bytes32 hash) {
        if (basicCollections.length == 0) {
            hash = _EMPTY_ARRAY_KECCAK256;
        } else {
            uint256 num = basicCollections.length;
            bytes32[] memory structHashArray = new bytes32[](num);
            for (uint256 i = 0; i < num; ) {
                structHashArray[i] = _getBasicCollectionHash(basicCollections[i]);
                unchecked { i++; }
            }
            assembly {
                hash := keccak256(add(structHashArray, 0x20), mul(num, 0x20))
            }
        }
    }

    function _getBasicCollectionHash(BSCollection calldata basicCollection) internal pure returns (bytes32) {
        bytes32 itemsHash;
        if (basicCollection.items.length == 0) {
            itemsHash = _EMPTY_ARRAY_KECCAK256;
        } else {
            uint256 num = basicCollection.items.length;
            uint256[] memory structHashArray = new uint256[](num);
            for (uint256 i = 0; i < num; ) {
                uint256 erc20TokenAmount = basicCollection.items[i].erc20TokenAmount;
                uint256 nftId = basicCollection.items[i].nftId;
                if (erc20TokenAmount > MASK_96 || nftId > MASK_160) {
                    structHashArray[i] = 0;
                } else {
                    structHashArray[i] = (erc20TokenAmount << 160) | nftId;
                }
                unchecked { i++; }
            }
            assembly {
                itemsHash := keccak256(add(structHashArray, 0x20), mul(num, 0x20))
            }
        }

        uint256 fee = (basicCollection.platformFee << 176) | (basicCollection.royaltyFee << 160) | uint256(uint160(basicCollection.royaltyFeeRecipient));
        return keccak256(abi.encode(
            _BASIC_COLLECTION_TYPE_HASH,
            basicCollection.nftAddress,
            fee,
            itemsHash
        ));
    }

    function _getCollectionsHash(BSCollection[] calldata collections) internal pure returns (bytes32 hash) {
        if (collections.length == 0) {
            hash = _EMPTY_ARRAY_KECCAK256;
        } else {
            uint256 num = collections.length;
            bytes32[] memory structHashArray = new bytes32[](num);
            for (uint256 i = 0; i < num; ) {
                structHashArray[i] = _getCollectionHash(collections[i]);
                unchecked { i++; }
            }
            assembly {
                hash := keccak256(add(structHashArray, 0x20), mul(num, 0x20))
            }
        }
    }

    function _getCollectionHash(BSCollection calldata collection) internal pure returns (bytes32) {
        bytes32 itemsHash;
        if (collection.items.length == 0) {
            itemsHash = _EMPTY_ARRAY_KECCAK256;
        } else {
            uint256 num = collection.items.length;
            bytes32[] memory structHashArray = new bytes32[](num);
            for (uint256 i = 0; i < num; ) {
                uint256 erc20TokenAmount = collection.items[i].erc20TokenAmount;
                uint256 nftId = collection.items[i].nftId;
                if (erc20TokenAmount > MASK_224) {
                    structHashArray[i] = 0;
                } else {
                    structHashArray[i] = keccak256(abi.encode(_ORDER_ITEM_TYPE_HASH, erc20TokenAmount, nftId));
                }
                unchecked { i++; }
            }
            assembly {
                itemsHash := keccak256(add(structHashArray, 0x20), mul(num, 0x20))
            }
        }

        uint256 fee = (collection.platformFee << 176) | (collection.royaltyFee << 160) | uint256(uint160(collection.royaltyFeeRecipient));
        return keccak256(abi.encode(
            _COLLECTION_TYPE_HASH,
            collection.nftAddress,
            fee,
            itemsHash
        ));
    }

    bytes16 private constant HEX_DIGITS = "0123456789abcdef";

    function bytes32ToHexBuffer(bytes32 data) internal pure returns(bytes memory buffer) {
        uint256 localValue = uint256(data);
        buffer = new bytes(66);
        buffer[0] = "0";
        buffer[1] = "x";
        unchecked {
            for (uint256 i = 65; i > 1; --i) {
                buffer[i] = HEX_DIGITS[localValue & 0xf];
                localValue >>= 4;
            }
        }
        return buffer;
    }

    function toEthereumPersonalSignHash(bytes32 hash) internal pure returns(bytes32) {
        return keccak256(
            bytes.concat(
                "\x19Ethereum Signed Message:\n101Element.market listing/offer hash:\n",
                bytes32ToHexBuffer(hash)
            )
        );
    }

    function toBitcoinPersonalSignHash(bytes32 hash) internal pure returns(bytes32) {
        bytes32 tempHash = sha256(
            bytes.concat(
                "\x18Bitcoin Signed Message:\n\x65Element.market listing/offer hash:\n",
                bytes32ToHexBuffer(hash)
            )
        );
        // Convert bytes32 to bytes.
        bytes memory buffer = new bytes(32);
        assembly {
            mstore(add(buffer, 32), tempHash)
        }
        return sha256(buffer);
    }

    function isValidSignature1271(
        address aa,
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal view returns(bool) {
        bool isValid;
        assembly {
            if extcodesize(aa) {
                let ptr := mload(0x40) // free memory pointer

                // selector for `isValidSignature(bytes32,bytes)`
                mstore(ptr, 0x1626ba7e)
                mstore(add(ptr, 0x20), hash)
                mstore(add(ptr, 0x40), 0x40)
                mstore(add(ptr, 0x60), 0x41)
                mstore(add(ptr, 0x80), r)
                mstore(add(ptr, 0xa0), s)
                mstore(add(ptr, 0xc0), shl(248, v))

                if staticcall(gas(), aa, add(ptr, 0x1c), 0xa5, ptr, 0x20) {
                    if eq(mload(ptr), 0x1626ba7e00000000000000000000000000000000000000000000000000000000) {
                        isValid := 1
                    }
                }
            }
        }
        return isValid;
    }

    uint256 constant private ADDRESS_LIMIT = 1 << 160;

    function isValidSignature173(
        address aa,
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal view returns(bool) {
        address owner;
        assembly {
            if extcodesize(aa) {
                let ptr := mload(0x40) // free memory pointer

                // selector for `owner()`
                mstore(ptr, 0x8da5cb5b)

                if staticcall(gas(), aa, add(ptr, 0x1c), 0x4, ptr, 0x20) {
                    if lt(mload(ptr), ADDRESS_LIMIT) {
                        owner := mload(ptr)
                    }
                }
            }
        }
        return owner != address(0) && owner == ecrecover(hash, v, r, s);
    }
}

/// SPDX-License-Identifier: MIT

pragma solidity ^0.8.15;


interface IBatchSignedERC721OrdersCheckerFeature {

    struct BSOrderItem {
        uint256 erc20TokenAmount;
        uint256 nftId;
    }

    struct BSCollection {
        address nftAddress;
        uint256 platformFee;
        uint256 royaltyFee;
        address royaltyFeeRecipient;
        BSOrderItem[] items;
    }

    struct BSERC721Orders {
        address maker;
        uint256 listingTime;
        uint256 expirationTime;
        uint256 startNonce;
        address paymentToken;
        address platformFeeRecipient;
        BSCollection[] basicCollections;
        BSCollection[] collections;
        uint8 v;
        bytes32 r;
        bytes32 s;
    }

    struct BSOrderItemCheckResult {
        bool isNonceValid;
        bool isERC20AmountValid;
        address ownerOfNftId;
        address approvedAccountOfNftId;
    }

    struct BSCollectionCheckResult {
        bool isApprovedForAll;
        BSOrderItemCheckResult[] items;
    }

    struct BSERC721OrdersCheckResult {
        bytes32 orderHash;
        uint256 hashNonce;
        bool validSignature;
        BSCollectionCheckResult[] basicCollections;
        BSCollectionCheckResult[] collections;
    }

    function checkBSERC721Orders(BSERC721Orders calldata order) external view returns (BSERC721OrdersCheckResult memory r);
    function checkBSERC721OrdersV2(BSERC721Orders calldata order, uint8 signatureType) external view returns (BSERC721OrdersCheckResult memory r);
    function checkBSERC721OrdersV3(BSERC721Orders calldata order, uint8 signatureType, bool isGetOwnerOf) external view returns (BSERC721OrdersCheckResult memory r);
}

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.15;


abstract contract LibAssetHelper {

    address internal constant NATIVE_TOKEN_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
    uint256 internal constant ERC404_APPROVAL = 1 << 126;

    function _isApprovedForAll(
        address token,
        bool isERC721,
        address owner,
        address operator
    ) internal view returns(uint256 approval) {
        (approval, ) = _isApprovedForAllV2(token, isERC721, owner, operator);
    }

    function _isApprovedForAllV2(
        address token,
        bool isERC721,
        address owner,
        address operator
    ) internal view returns(uint256 approval, bool isERC404) {
        if (token == address(0) || token == NATIVE_TOKEN_ADDRESS) {
            return (0, false);
        }

        bool isApprovedForAll;
        assembly {
            let ptr := mload(0x40) // free memory pointer

            // selector for `isApprovedForAll(address,address)`
            mstore(ptr, 0xe985e9c500000000000000000000000000000000000000000000000000000000)
            mstore(add(ptr, 0x4), owner)
            mstore(add(ptr, 0x24), operator)

            if staticcall(gas(), token, ptr, 0x44, ptr, 0x20) {
                if gt(mload(ptr), 0) {
                    isApprovedForAll := 1
                }
            }
        }
        if (isApprovedForAll) {
            return (1, false);
        }
//        if (isERC721) {
//            if (_erc20Decimals(token) == 0) {
//                return (0, false);
//            }
//            (uint256 allowance, bool success) = _erc20AllowanceV2(token, owner, operator);
//            approval = allowance > ERC404_APPROVAL ? 1 : 0;
//            isERC404 = success;
//            return (approval, isERC404);
//        } else {
//            return (0, false);
//        }
        return (0, false);
    }

    function _erc721OwnerOf(
        address token, uint256 tokenId
    ) internal view returns (address owner) {
        assembly {
            let ptr := mload(0x40) // free memory pointer

            // selector for `ownerOf(uint256)`
            mstore(ptr, 0x6352211e00000000000000000000000000000000000000000000000000000000)
            mstore(add(ptr, 0x4), tokenId)

            if staticcall(gas(), token, ptr, 0x24, ptr, 0x20) {
                if lt(mload(ptr), shl(160, 1)) {
                    owner := mload(ptr)
                }
            }
        }
        return owner;
    }

    function _erc721GetApproved(
        address token, uint256 tokenId
    ) internal view returns (address operator) {
        assembly {
            let ptr := mload(0x40) // free memory pointer

            // selector for `getApproved(uint256)`
            mstore(ptr, 0x081812fc00000000000000000000000000000000000000000000000000000000)
            mstore(add(ptr, 0x4), tokenId)

            if staticcall(gas(), token, ptr, 0x24, ptr, 0x20) {
                if lt(mload(ptr), shl(160, 1)) {
                    operator := mload(ptr)
                }
            }
        }
        return operator;
    }

    function _erc1155BalanceOf(
        address token,
        address account,
        uint256 tokenId
    ) internal view returns (uint256 _balance) {
        assembly {
            let ptr := mload(0x40) // free memory pointer

            // selector for `balanceOf(address,uint256)`
            mstore(ptr, 0x00fdd58e00000000000000000000000000000000000000000000000000000000)
            mstore(add(ptr, 0x4), account)
            mstore(add(ptr, 0x24), tokenId)

            if staticcall(gas(), token, ptr, 0x44, ptr, 0x20) {
                _balance := mload(ptr)
            }
        }
        return _balance;
    }

    function _erc20BalanceOf(
        address token, address account
    ) internal view returns (uint256 _balance) {
        if (token == address(0) || token == NATIVE_TOKEN_ADDRESS) {
            return account.balance;
        }
        assembly {
            let ptr := mload(0x40) // free memory pointer

            // selector for `balanceOf(address)`
            mstore(ptr, 0x70a0823100000000000000000000000000000000000000000000000000000000)
            mstore(add(ptr, 0x4), account)

            if staticcall(gas(), token, ptr, 0x24, ptr, 0x20) {
                _balance := mload(ptr)
            }
        }
        return _balance;
    }

    function _erc20Allowance(
        address token,
        address owner,
        address spender
    ) internal view returns (uint256 allowance) {
        (allowance, ) = _erc20AllowanceV2(token, owner, spender);
    }

    function _erc20AllowanceV2(
        address token,
        address owner,
        address spender
    ) internal view returns (uint256 allowance, bool callSuccess) {
        if (token == address(0) || token == NATIVE_TOKEN_ADDRESS) {
            return (type(uint256).max, false);
        }
        assembly {
            let ptr := mload(0x40) // free memory pointer

            // selector for `allowance(address,address)`
            mstore(ptr, 0xdd62ed3e00000000000000000000000000000000000000000000000000000000)
            mstore(add(ptr, 0x4), owner)
            mstore(add(ptr, 0x24), spender)

            if staticcall(gas(), token, ptr, 0x44, ptr, 0x20) {
                allowance := mload(ptr)
                callSuccess := 1
            }
        }
        return (allowance, callSuccess);
    }

    function _erc20Decimals(address token) internal view returns (uint8 decimals) {
        if (token == address(0) || token == NATIVE_TOKEN_ADDRESS) {
            return 18;
        }
        assembly {
            let ptr := mload(0x40) // free memory pointer

            // selector for `decimals()`
            mstore(ptr, 0x313ce56700000000000000000000000000000000000000000000000000000000)

            if staticcall(gas(), token, ptr, 0x4, ptr, 0x20) {
                if lt(mload(ptr), 48) {
                    decimals := mload(ptr)
                }
            }
        }
        return decimals;
    }
}

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

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"element","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"EIP712_DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ELEMENT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"maker","type":"address"},{"internalType":"uint256","name":"listingTime","type":"uint256"},{"internalType":"uint256","name":"expirationTime","type":"uint256"},{"internalType":"uint256","name":"startNonce","type":"uint256"},{"internalType":"address","name":"paymentToken","type":"address"},{"internalType":"address","name":"platformFeeRecipient","type":"address"},{"components":[{"internalType":"address","name":"nftAddress","type":"address"},{"internalType":"uint256","name":"platformFee","type":"uint256"},{"internalType":"uint256","name":"royaltyFee","type":"uint256"},{"internalType":"address","name":"royaltyFeeRecipient","type":"address"},{"components":[{"internalType":"uint256","name":"erc20TokenAmount","type":"uint256"},{"internalType":"uint256","name":"nftId","type":"uint256"}],"internalType":"struct IBatchSignedERC721OrdersCheckerFeature.BSOrderItem[]","name":"items","type":"tuple[]"}],"internalType":"struct IBatchSignedERC721OrdersCheckerFeature.BSCollection[]","name":"basicCollections","type":"tuple[]"},{"components":[{"internalType":"address","name":"nftAddress","type":"address"},{"internalType":"uint256","name":"platformFee","type":"uint256"},{"internalType":"uint256","name":"royaltyFee","type":"uint256"},{"internalType":"address","name":"royaltyFeeRecipient","type":"address"},{"components":[{"internalType":"uint256","name":"erc20TokenAmount","type":"uint256"},{"internalType":"uint256","name":"nftId","type":"uint256"}],"internalType":"struct IBatchSignedERC721OrdersCheckerFeature.BSOrderItem[]","name":"items","type":"tuple[]"}],"internalType":"struct IBatchSignedERC721OrdersCheckerFeature.BSCollection[]","name":"collections","type":"tuple[]"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"internalType":"struct IBatchSignedERC721OrdersCheckerFeature.BSERC721Orders","name":"order","type":"tuple"}],"name":"checkBSERC721Orders","outputs":[{"components":[{"internalType":"bytes32","name":"orderHash","type":"bytes32"},{"internalType":"uint256","name":"hashNonce","type":"uint256"},{"internalType":"bool","name":"validSignature","type":"bool"},{"components":[{"internalType":"bool","name":"isApprovedForAll","type":"bool"},{"components":[{"internalType":"bool","name":"isNonceValid","type":"bool"},{"internalType":"bool","name":"isERC20AmountValid","type":"bool"},{"internalType":"address","name":"ownerOfNftId","type":"address"},{"internalType":"address","name":"approvedAccountOfNftId","type":"address"}],"internalType":"struct IBatchSignedERC721OrdersCheckerFeature.BSOrderItemCheckResult[]","name":"items","type":"tuple[]"}],"internalType":"struct IBatchSignedERC721OrdersCheckerFeature.BSCollectionCheckResult[]","name":"basicCollections","type":"tuple[]"},{"components":[{"internalType":"bool","name":"isApprovedForAll","type":"bool"},{"components":[{"internalType":"bool","name":"isNonceValid","type":"bool"},{"internalType":"bool","name":"isERC20AmountValid","type":"bool"},{"internalType":"address","name":"ownerOfNftId","type":"address"},{"internalType":"address","name":"approvedAccountOfNftId","type":"address"}],"internalType":"struct IBatchSignedERC721OrdersCheckerFeature.BSOrderItemCheckResult[]","name":"items","type":"tuple[]"}],"internalType":"struct IBatchSignedERC721OrdersCheckerFeature.BSCollectionCheckResult[]","name":"collections","type":"tuple[]"}],"internalType":"struct IBatchSignedERC721OrdersCheckerFeature.BSERC721OrdersCheckResult","name":"r","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"maker","type":"address"},{"internalType":"uint256","name":"listingTime","type":"uint256"},{"internalType":"uint256","name":"expirationTime","type":"uint256"},{"internalType":"uint256","name":"startNonce","type":"uint256"},{"internalType":"address","name":"paymentToken","type":"address"},{"internalType":"address","name":"platformFeeRecipient","type":"address"},{"components":[{"internalType":"address","name":"nftAddress","type":"address"},{"internalType":"uint256","name":"platformFee","type":"uint256"},{"internalType":"uint256","name":"royaltyFee","type":"uint256"},{"internalType":"address","name":"royaltyFeeRecipient","type":"address"},{"components":[{"internalType":"uint256","name":"erc20TokenAmount","type":"uint256"},{"internalType":"uint256","name":"nftId","type":"uint256"}],"internalType":"struct IBatchSignedERC721OrdersCheckerFeature.BSOrderItem[]","name":"items","type":"tuple[]"}],"internalType":"struct IBatchSignedERC721OrdersCheckerFeature.BSCollection[]","name":"basicCollections","type":"tuple[]"},{"components":[{"internalType":"address","name":"nftAddress","type":"address"},{"internalType":"uint256","name":"platformFee","type":"uint256"},{"internalType":"uint256","name":"royaltyFee","type":"uint256"},{"internalType":"address","name":"royaltyFeeRecipient","type":"address"},{"components":[{"internalType":"uint256","name":"erc20TokenAmount","type":"uint256"},{"internalType":"uint256","name":"nftId","type":"uint256"}],"internalType":"struct IBatchSignedERC721OrdersCheckerFeature.BSOrderItem[]","name":"items","type":"tuple[]"}],"internalType":"struct IBatchSignedERC721OrdersCheckerFeature.BSCollection[]","name":"collections","type":"tuple[]"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"internalType":"struct IBatchSignedERC721OrdersCheckerFeature.BSERC721Orders","name":"order","type":"tuple"},{"internalType":"uint8","name":"signatureType","type":"uint8"}],"name":"checkBSERC721OrdersV2","outputs":[{"components":[{"internalType":"bytes32","name":"orderHash","type":"bytes32"},{"internalType":"uint256","name":"hashNonce","type":"uint256"},{"internalType":"bool","name":"validSignature","type":"bool"},{"components":[{"internalType":"bool","name":"isApprovedForAll","type":"bool"},{"components":[{"internalType":"bool","name":"isNonceValid","type":"bool"},{"internalType":"bool","name":"isERC20AmountValid","type":"bool"},{"internalType":"address","name":"ownerOfNftId","type":"address"},{"internalType":"address","name":"approvedAccountOfNftId","type":"address"}],"internalType":"struct IBatchSignedERC721OrdersCheckerFeature.BSOrderItemCheckResult[]","name":"items","type":"tuple[]"}],"internalType":"struct IBatchSignedERC721OrdersCheckerFeature.BSCollectionCheckResult[]","name":"basicCollections","type":"tuple[]"},{"components":[{"internalType":"bool","name":"isApprovedForAll","type":"bool"},{"components":[{"internalType":"bool","name":"isNonceValid","type":"bool"},{"internalType":"bool","name":"isERC20AmountValid","type":"bool"},{"internalType":"address","name":"ownerOfNftId","type":"address"},{"internalType":"address","name":"approvedAccountOfNftId","type":"address"}],"internalType":"struct IBatchSignedERC721OrdersCheckerFeature.BSOrderItemCheckResult[]","name":"items","type":"tuple[]"}],"internalType":"struct IBatchSignedERC721OrdersCheckerFeature.BSCollectionCheckResult[]","name":"collections","type":"tuple[]"}],"internalType":"struct IBatchSignedERC721OrdersCheckerFeature.BSERC721OrdersCheckResult","name":"r","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"maker","type":"address"},{"internalType":"uint256","name":"listingTime","type":"uint256"},{"internalType":"uint256","name":"expirationTime","type":"uint256"},{"internalType":"uint256","name":"startNonce","type":"uint256"},{"internalType":"address","name":"paymentToken","type":"address"},{"internalType":"address","name":"platformFeeRecipient","type":"address"},{"components":[{"internalType":"address","name":"nftAddress","type":"address"},{"internalType":"uint256","name":"platformFee","type":"uint256"},{"internalType":"uint256","name":"royaltyFee","type":"uint256"},{"internalType":"address","name":"royaltyFeeRecipient","type":"address"},{"components":[{"internalType":"uint256","name":"erc20TokenAmount","type":"uint256"},{"internalType":"uint256","name":"nftId","type":"uint256"}],"internalType":"struct IBatchSignedERC721OrdersCheckerFeature.BSOrderItem[]","name":"items","type":"tuple[]"}],"internalType":"struct IBatchSignedERC721OrdersCheckerFeature.BSCollection[]","name":"basicCollections","type":"tuple[]"},{"components":[{"internalType":"address","name":"nftAddress","type":"address"},{"internalType":"uint256","name":"platformFee","type":"uint256"},{"internalType":"uint256","name":"royaltyFee","type":"uint256"},{"internalType":"address","name":"royaltyFeeRecipient","type":"address"},{"components":[{"internalType":"uint256","name":"erc20TokenAmount","type":"uint256"},{"internalType":"uint256","name":"nftId","type":"uint256"}],"internalType":"struct IBatchSignedERC721OrdersCheckerFeature.BSOrderItem[]","name":"items","type":"tuple[]"}],"internalType":"struct IBatchSignedERC721OrdersCheckerFeature.BSCollection[]","name":"collections","type":"tuple[]"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"internalType":"struct IBatchSignedERC721OrdersCheckerFeature.BSERC721Orders","name":"order","type":"tuple"},{"internalType":"uint8","name":"signatureType","type":"uint8"},{"internalType":"bool","name":"isGetOwnerOf","type":"bool"}],"name":"checkBSERC721OrdersV3","outputs":[{"components":[{"internalType":"bytes32","name":"orderHash","type":"bytes32"},{"internalType":"uint256","name":"hashNonce","type":"uint256"},{"internalType":"bool","name":"validSignature","type":"bool"},{"components":[{"internalType":"bool","name":"isApprovedForAll","type":"bool"},{"components":[{"internalType":"bool","name":"isNonceValid","type":"bool"},{"internalType":"bool","name":"isERC20AmountValid","type":"bool"},{"internalType":"address","name":"ownerOfNftId","type":"address"},{"internalType":"address","name":"approvedAccountOfNftId","type":"address"}],"internalType":"struct IBatchSignedERC721OrdersCheckerFeature.BSOrderItemCheckResult[]","name":"items","type":"tuple[]"}],"internalType":"struct IBatchSignedERC721OrdersCheckerFeature.BSCollectionCheckResult[]","name":"basicCollections","type":"tuple[]"},{"components":[{"internalType":"bool","name":"isApprovedForAll","type":"bool"},{"components":[{"internalType":"bool","name":"isNonceValid","type":"bool"},{"internalType":"bool","name":"isERC20AmountValid","type":"bool"},{"internalType":"address","name":"ownerOfNftId","type":"address"},{"internalType":"address","name":"approvedAccountOfNftId","type":"address"}],"internalType":"struct IBatchSignedERC721OrdersCheckerFeature.BSOrderItemCheckResult[]","name":"items","type":"tuple[]"}],"internalType":"struct IBatchSignedERC721OrdersCheckerFeature.BSCollectionCheckResult[]","name":"collections","type":"tuple[]"}],"internalType":"struct IBatchSignedERC721OrdersCheckerFeature.BSERC721OrdersCheckResult","name":"r","type":"tuple"}],"stateMutability":"view","type":"function"}]

60c06040523480156200001157600080fd5b5060405162002f1638038062002f16833981810160405281019062000037919062000174565b8073ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff16815250507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f27b14c20196091d9cd90ca9c473d3ad1523b00ddf487a9b7452a8a119a16b98c7f06c015bd22b4c69690933c1058878ebdfef31f9aaae40bbe86d8a09fe1b2972c4684604051602001620000e6959493929190620001ed565b6040516020818303038152906040528051906020012060808181525050506200024a565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200013c826200010f565b9050919050565b6200014e816200012f565b81146200015a57600080fd5b50565b6000815190506200016e8162000143565b92915050565b6000602082840312156200018d576200018c6200010a565b5b60006200019d848285016200015d565b91505092915050565b6000819050919050565b620001bb81620001a6565b82525050565b6000819050919050565b620001d681620001c1565b82525050565b620001e7816200012f565b82525050565b600060a082019050620002046000830188620001b0565b620002136020830187620001b0565b620002226040830186620001b0565b620002316060830185620001cb565b620002406080830184620001dc565b9695505050505050565b60805160a051612c7c6200029a600039600081816101be01528181610412015281816108ec01528181610c380152818161111f015261152001526000818161030c0152610e050152612c7c6000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063338a84c01461005c5780638bea6a751461008c5780638cfa4e07146100aa578063d078beb5146100da578063dab400f31461010a575b600080fd5b610076600480360381019061007191906120ea565b610128565b604051610083919061245b565b60405180910390f35b6100946101bc565b6040516100a1919061248c565b60405180910390f35b6100c460048036038101906100bf91906124a7565b6101e0565b6040516100d1919061245b565b60405180910390f35b6100f460048036038101906100ef9190612503565b610275565b604051610101919061245b565b60405180910390f35b61011261030a565b60405161011f919061255b565b60405180910390f35b610130611fa2565b600061013c858461032e565b836060018193508290525050610153858285610811565b826080018190525061017685600001602081019061017191906125a2565b610c34565b82602001818152505061018d858360200151610cd7565b8260000181815250506101a585836000015186610e58565b826040019015159081151581525050509392505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6101e8611fa2565b60006101f584600161032e565b83606001819350829052505061020d84826001610811565b826080018190525061023084600001602081019061022b91906125a2565b610c34565b826020018181525050610247848360200151610cd7565b82600001818152505061025f84836000015185610e58565b8260400190151590811515815250505092915050565b61027d611fa2565b600061028a83600161032e565b8360600181935082905250506102a283826001610811565b82608001819052506102c58360000160208101906102c091906125a2565b610c34565b8260200181815250506102dc838360200151610cd7565b8260000181815250506102f58383600001516000610e58565b82604001901515908115158152505050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6060600083606001359050838060c0019061034991906125de565b905067ffffffffffffffff81111561036457610363612641565b5b60405190808252806020026020018201604052801561039d57816020015b61038a611fd6565b8152602001906001900390816103825790505b50915060005b8251811015610809576000858060c001906103be91906125de565b838181106103cf576103ce612670565b5b90506020028101906103e1919061269f565b60000160208101906103f391906125a2565b9050600061043682600189600001602081019061041091906125a2565b7f00000000000000000000000000000000000000000000000000000000000000006110ff565b1184838151811061044a57610449612670565b5b602002602001015160000190151590811515815250506000868060c0019061047291906125de565b8481811061048357610482612670565b5b9050602002810190610495919061269f565b80608001906104a491906126c7565b905067ffffffffffffffff8111156104bf576104be612641565b5b6040519080825280602002602001820160405280156104f857816020015b6104e5611ff2565b8152602001906001900390816104dd5790505b5090508085848151811061050f5761050e612670565b5b60200260200101516020018190525060005b81518110156107fb5761054688600001602081019061054091906125a2565b8661111a565b82828151811061055957610558612670565b5b602002602001015160000190151590811515815250508460010194506bffffffffffffffffffffffff888060c0019061059291906125de565b868181106105a3576105a2612670565b5b90506020028101906105b5919061269f565b80608001906105c491906126c7565b838181106105d5576105d4612670565b5b9050604002016000013511158282815181106105f4576105f3612670565b5b602002602001015160200190151590811515815250506000888060c0019061061c91906125de565b8681811061062d5761062c612670565b5b905060200281019061063f919061269f565b806080019061064e91906126c7565b8381811061065f5761065e612670565b5b90506040020160200135905073ffffffffffffffffffffffffffffffffffffffff81116107485787156107435761069684826111db565b8383815181106106a9576106a8612670565b5b60200260200101516040019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506106f18482611231565b83838151811061070457610703612670565b5b60200260200101516060019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505b6107ef565b600083838151811061075d5761075c612670565b5b60200260200101516040019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060008383815181106107b0576107af612670565b5b60200260200101516060019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505b81600101915050610521565b5082600101925050506103a3565b509250929050565b6060838060e0019061082391906125de565b905067ffffffffffffffff81111561083e5761083d612641565b5b60405190808252806020026020018201604052801561087757816020015b610864611fd6565b81526020019060019003908161085c5790505b50905060005b8151811015610c2c576000858060e0019061089891906125de565b838181106108a9576108a8612670565b5b90506020028101906108bb919061269f565b60000160208101906108cd91906125a2565b905060006109108260018960000160208101906108ea91906125a2565b7f00000000000000000000000000000000000000000000000000000000000000006110ff565b1183838151811061092457610923612670565b5b602002602001015160000190151590811515815250506000868060e0019061094c91906125de565b8481811061095d5761095c612670565b5b905060200281019061096f919061269f565b806080019061097e91906126c7565b905067ffffffffffffffff81111561099957610998612641565b5b6040519080825280602002602001820160405280156109d257816020015b6109bf611ff2565b8152602001906001900390816109b75790505b509050808484815181106109e9576109e8612670565b5b60200260200101516020018190525060005b8151811015610c1e57610a20886000016020810190610a1a91906125a2565b8861111a565b828281518110610a3357610a32612670565b5b602002602001015160000190151590811515815250508660010196507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff888060e00190610a7c91906125de565b86818110610a8d57610a8c612670565b5b9050602002810190610a9f919061269f565b8060800190610aae91906126c7565b83818110610abf57610abe612670565b5b905060400201600001351115828281518110610ade57610add612670565b5b602002602001015160200190151590811515815250506000888060e00190610b0691906125de565b86818110610b1757610b16612670565b5b9050602002810190610b29919061269f565b8060800190610b3891906126c7565b83818110610b4957610b48612670565b5b9050604002016020013590508615610c1257610b6584826111db565b838381518110610b7857610b77612670565b5b60200260200101516040019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050610bc08482611231565b838381518110610bd357610bd2612670565b5b60200260200101516060019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505b816001019150506109fb565b50826001019250505061087d565b509392505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635e725186836040518263ffffffff1660e01b8152600401610c8f919061248c565b602060405180830381865afa158015610cac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cd09190612756565b9050919050565b600080610cf2848060c00190610ced91906125de565b611287565b90506000610d0e858060e00190610d0991906125de565b61138c565b90506000856080016020810190610d2591906125a2565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610d735773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee90505b60007f2d8cbbbc696e7292c3b5beb38e1363d34ff11beb8c3456c14cb938854597b9ed60001b876000016020810190610dac91906125a2565b886020013589604001358a60600135868c60a0016020810190610dcf91906125a2565b8a8a8e604051602001610deb9a99989796959493929190612792565b6040516020818303038152906040528051906020012090507f000000000000000000000000000000000000000000000000000000000000000081604051602001610e369291906128a6565b6040516020818303038152906040528051906020012094505050505092915050565b600080846000016020810190610e6e91906125a2565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610eae5760009150506110f8565b600085610100016020810190610ec491906128dd565b9050600086610120013590506000876101400135905060008660ff1603610f7f5760018784848460405160008152602001604052604051610f089493929190612919565b6020604051602081039080840390855afa158015610f2a573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff16886000016020810190610f5d91906125a2565b73ffffffffffffffffffffffffffffffffffffffff16149450505050506110f8565b60038660ff1603610fb457610fa9886000016020810190610fa091906125a2565b88858585611491565b9450505050506110f8565b60058660ff160361101d576000610fc961151b565b905060006001821603610fe4576000955050505050506110f8565b6000610fef8961156e565b90506110108a600001602081019061100791906125a2565b82878787611491565b96505050505050506110f8565b60078660ff160361108657600061103261151b565b90506000600282160361104d576000955050505050506110f8565b6000611058896115a6565b90506110798a600001602081019061107091906125a2565b82878787611491565b96505050505050506110f8565b60098660ff16036110ef57600061109b61151b565b9050600060048216036110b6576000955050505050506110f8565b60006110c1896115a6565b90506110e28a60000160208101906110d991906125a2565b828787876116d3565b96505050505050506110f8565b60009450505050505b9392505050565b600061110d858585856117e0565b5080915050949350505050565b6000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663030b273085600886901c6040518363ffffffff1660e01b815260040161117c929190612998565b602060405180830381865afa158015611199573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111bd9190612756565b9050600060ff84166001901b90506000818316149250505092915050565b60006040517f6352211e000000000000000000000000000000000000000000000000000000008152826004820152602081602483875afa1561122a57600160a01b8151101561122957805191505b5b5092915050565b60006040517f081812fc000000000000000000000000000000000000000000000000000000008152826004820152602081602483875afa1561128057600160a01b8151101561127f57805191505b5b5092915050565b60008083839050036112be577fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050611386565b600083839050905060008167ffffffffffffffff8111156112e2576112e1612641565b5b6040519080825280602002602001820160405280156113105781602001602082028036833780820191505090505b50905060005b828110156113775761134b86868381811061133457611333612670565b5b9050602002810190611346919061269f565b6118e7565b82828151811061135e5761135d612670565b5b6020026020010181815250508080600101915050611316565b50602082026020820120925050505b92915050565b60008083839050036113c3577fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b905061148b565b600083839050905060008167ffffffffffffffff8111156113e7576113e6612641565b5b6040519080825280602002602001820160405280156114155781602001602082028036833780820191505090505b50905060005b8281101561147c5761145086868381811061143957611438612670565b5b905060200281019061144b919061269f565b611b43565b82828151811061146357611462612670565b5b602002602001018181525050808060010191505061141b565b50602082026020820120925050505b92915050565b600080863b1561150e57604051631626ba7e8152866020820152604080820152604160608201528460808201528360a08201528560f81b60c082015260208160a5601c84018b5afa1561150c577f1626ba7e0000000000000000000000000000000000000000000000000000000081510361150b57600191505b5b505b8091505095945050505050565b6000807f00000000000000000000000000000000000000000000000000000000000000009050604051633cdad7ce8152602081600483855afa80156115685760203d0361156757815193505b5b50505090565b600061157982611dda565b6040516020016115899190612aa4565b604051602081830303815290604052805190602001209050919050565b60008060026115b484611dda565b6040516020016115c49190612b38565b6040516020818303038152906040526040516115e09190612b5a565b602060405180830381855afa1580156115fd573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906116209190612b9d565b90506000602067ffffffffffffffff81111561163f5761163e612641565b5b6040519080825280601f01601f1916602001820160405280156116715781602001600182028036833780820191505090505b50905081602082015260028160405161168a9190612b5a565b602060405180830381855afa1580156116a7573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906116ca9190612b9d565b92505050919050565b600080863b1561171e57604051638da5cb5b81526020816004601c84018b5afa1561171c57740100000000000000000000000000000000000000008151101561171b57805191505b5b505b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156117d45750600186868686604051600081526020016040526040516117799493929190612919565b6020604051602081039080840390855afa15801561179b573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b91505095945050505050565b600080600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16148061185d575073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16145b1561186e57600080915091506118de565b60006040517fe985e9c50000000000000000000000000000000000000000000000000000000081528560048201528460248201526020816044838b5afa156118c0576000815111156118bf57600191505b5b5080156118d5576001600092509250506118de565b60008092509250505b94509492505050565b60008060008380608001906118fc91906126c7565b90500361192e577fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050611a97565b600083806080019061194091906126c7565b9050905060008167ffffffffffffffff8111156119605761195f612641565b5b60405190808252806020026020018201604052801561198e5781602001602082028036833780820191505090505b50905060005b82811015611a885760008680608001906119ae91906126c7565b838181106119bf576119be612670565b5b90506040020160000135905060008780608001906119dd91906126c7565b848181106119ee576119ed612670565b5b9050604002016020013590506bffffffffffffffffffffffff821180611a27575073ffffffffffffffffffffffffffffffffffffffff81115b15611a52576000848481518110611a4157611a40612670565b5b602002602001018181525050611a79565b8060a083901b17848481518110611a6c57611a6b612670565b5b6020026020010181815250505b82806001019350505050611994565b50602082026020820120925050505b6000836060016020810190611aac91906125a2565b73ffffffffffffffffffffffffffffffffffffffff1660a08560400135901b60b08660200135901b171790507f12ad29288fd70022f26997a9958d9eceb6e840ceaa79b72ea5945ba87e4d33b060001b846000016020810190611b0f91906125a2565b8284604051602001611b249493929190612bca565b6040516020818303038152906040528051906020012092505050919050565b6000806000838060800190611b5891906126c7565b905003611b8a577fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050611d2e565b6000838060800190611b9c91906126c7565b9050905060008167ffffffffffffffff811115611bbc57611bbb612641565b5b604051908082528060200260200182016040528015611bea5781602001602082028036833780820191505090505b50905060005b82811015611d1f576000868060800190611c0a91906126c7565b83818110611c1b57611c1a612670565b5b9050604002016000013590506000878060800190611c3991906126c7565b84818110611c4a57611c49612670565b5b9050604002016020013590507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff821115611ca2576000801b848481518110611c9157611c90612670565b5b602002602001018181525050611d10565b7f5f93394997caa49a9382d44a75e3ce6a460f32b39870464866ac994f8be97afe60001b8282604051602001611cda93929190612c0f565b60405160208183030381529060405280519060200120848481518110611d0357611d02612670565b5b6020026020010181815250505b82806001019350505050611bf0565b50602082026020820120925050505b6000836060016020810190611d4391906125a2565b73ffffffffffffffffffffffffffffffffffffffff1660a08560400135901b60b08660200135901b171790507fb9f488d48cec782be9ecdb74330c9c6a33c236a8022d8a91a4e4df4e81b5162060001b846000016020810190611da691906125a2565b8284604051602001611dbb9493929190612bca565b6040516020818303038152906040528051906020012092505050919050565b606060008260001c9050604267ffffffffffffffff811115611dff57611dfe612641565b5b6040519080825280601f01601f191660200182016040528015611e315781602001600182028036833780820191505090505b5091507f300000000000000000000000000000000000000000000000000000000000000082600081518110611e6957611e68612670565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000082600181518110611ecd57611ecc612670565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000604190505b6001811115611f9b577f3031323334353637383961626364656600000000000000000000000000000000600f831660108110611f4257611f41612670565b5b1a60f81b838281518110611f5957611f58612670565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600482901c915080600190039050611f03565b5050919050565b6040518060a00160405280600080191681526020016000815260200160001515815260200160608152602001606081525090565b6040518060400160405280600015158152602001606081525090565b6040518060800160405280600015158152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff1681525090565b600080fd5b600080fd5b600080fd5b600061016082840312156120705761206f612054565b5b81905092915050565b600060ff82169050919050565b61208f81612079565b811461209a57600080fd5b50565b6000813590506120ac81612086565b92915050565b60008115159050919050565b6120c7816120b2565b81146120d257600080fd5b50565b6000813590506120e4816120be565b92915050565b6000806000606084860312156121035761210261204a565b5b600084013567ffffffffffffffff8111156121215761212061204f565b5b61212d86828701612059565b935050602061213e8682870161209d565b925050604061214f868287016120d5565b9150509250925092565b6000819050919050565b61216c81612159565b82525050565b6000819050919050565b61218581612172565b82525050565b612194816120b2565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061221d826121f2565b9050919050565b61222d81612212565b82525050565b608082016000820151612249600085018261218b565b50602082015161225c602085018261218b565b50604082015161226f6040850182612224565b5060608201516122826060850182612224565b50505050565b60006122948383612233565b60808301905092915050565b6000602082019050919050565b60006122b8826121c6565b6122c281856121d1565b93506122cd836121e2565b8060005b838110156122fe5781516122e58882612288565b97506122f0836122a0565b9250506001810190506122d1565b5085935050505092915050565b6000604083016000830151612323600086018261218b565b506020830151848203602086015261233b82826122ad565b9150508091505092915050565b6000612354838361230b565b905092915050565b6000602082019050919050565b60006123748261219a565b61237e81856121a5565b935083602082028501612390856121b6565b8060005b858110156123cc57848403895281516123ad8582612348565b94506123b88361235c565b925060208a01995050600181019050612394565b50829750879550505050505092915050565b600060a0830160008301516123f66000860182612163565b506020830151612409602086018261217c565b50604083015161241c604086018261218b565b50606083015184820360608601526124348282612369565b9150506080830151848203608086015261244e8282612369565b9150508091505092915050565b6000602082019050818103600083015261247581846123de565b905092915050565b61248681612212565b82525050565b60006020820190506124a1600083018461247d565b92915050565b600080604083850312156124be576124bd61204a565b5b600083013567ffffffffffffffff8111156124dc576124db61204f565b5b6124e885828601612059565b92505060206124f98582860161209d565b9150509250929050565b6000602082840312156125195761251861204a565b5b600082013567ffffffffffffffff8111156125375761253661204f565b5b61254384828501612059565b91505092915050565b61255581612159565b82525050565b6000602082019050612570600083018461254c565b92915050565b61257f81612212565b811461258a57600080fd5b50565b60008135905061259c81612576565b92915050565b6000602082840312156125b8576125b761204a565b5b60006125c68482850161258d565b91505092915050565b600080fd5b600080fd5b600080fd5b600080833560016020038436030381126125fb576125fa6125cf565b5b80840192508235915067ffffffffffffffff82111561261d5761261c6125d4565b5b602083019250602082023603831315612639576126386125d9565b5b509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008235600160a0038336030381126126bb576126ba6125cf565b5b80830191505092915050565b600080833560016020038436030381126126e4576126e36125cf565b5b80840192508235915067ffffffffffffffff821115612706576127056125d4565b5b602083019250604082023603831315612722576127216125d9565b5b509250929050565b61273381612172565b811461273e57600080fd5b50565b6000815190506127508161272a565b92915050565b60006020828403121561276c5761276b61204a565b5b600061277a84828501612741565b91505092915050565b61278c81612172565b82525050565b6000610140820190506127a8600083018d61254c565b6127b5602083018c61247d565b6127c2604083018b612783565b6127cf606083018a612783565b6127dc6080830189612783565b6127e960a083018861247d565b6127f660c083018761247d565b61280360e083018661254c565b61281161010083018561254c565b61281f610120830184612783565b9b9a5050505050505050505050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b600061286f60028361282e565b915061287a82612839565b600282019050919050565b6000819050919050565b6128a061289b82612159565b612885565b82525050565b60006128b182612862565b91506128bd828561288f565b6020820191506128cd828461288f565b6020820191508190509392505050565b6000602082840312156128f3576128f261204a565b5b60006129018482850161209d565b91505092915050565b61291381612079565b82525050565b600060808201905061292e600083018761254c565b61293b602083018661290a565b612948604083018561254c565b612955606083018461254c565b95945050505050565b60007effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82169050919050565b6129928161295e565b82525050565b60006040820190506129ad600083018561247d565b6129ba6020830184612989565b9392505050565b600081905092915050565b7f19457468657265756d205369676e6564204d6573736167653a0a313031456c6560008201527f6d656e742e6d61726b6574206c697374696e672f6f6666657220686173683a0a602082015250565b6000612a286040836129c1565b9150612a33826129cc565b604082019050919050565b600081519050919050565b60005b83811015612a67578082015181840152602081019050612a4c565b60008484015250505050565b6000612a7e82612a3e565b612a8881856129c1565b9350612a98818560208601612a49565b80840191505092915050565b6000612aaf82612a1b565b9150612abb8284612a73565b915081905092915050565b7f18426974636f696e205369676e6564204d6573736167653a0a65456c656d656e60008201527f742e6d61726b6574206c697374696e672f6f6666657220686173683a0a000000602082015250565b6000612b22603d836129c1565b9150612b2d82612ac6565b603d82019050919050565b6000612b4382612b15565b9150612b4f8284612a73565b915081905092915050565b6000612b668284612a73565b915081905092915050565b612b7a81612159565b8114612b8557600080fd5b50565b600081519050612b9781612b71565b92915050565b600060208284031215612bb357612bb261204a565b5b6000612bc184828501612b88565b91505092915050565b6000608082019050612bdf600083018761254c565b612bec602083018661247d565b612bf96040830185612783565b612c06606083018461254c565b95945050505050565b6000606082019050612c24600083018661254c565b612c316020830185612783565b612c3e6040830184612783565b94935050505056fea264697066735822122061689401b1e95f1599e14e1954397d217c26657d5b5a7557e3a4c141e7076a9864736f6c634300081100330000000000000000000000000cab6977a9c70e04458b740476b498b214019641

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106100575760003560e01c8063338a84c01461005c5780638bea6a751461008c5780638cfa4e07146100aa578063d078beb5146100da578063dab400f31461010a575b600080fd5b610076600480360381019061007191906120ea565b610128565b604051610083919061245b565b60405180910390f35b6100946101bc565b6040516100a1919061248c565b60405180910390f35b6100c460048036038101906100bf91906124a7565b6101e0565b6040516100d1919061245b565b60405180910390f35b6100f460048036038101906100ef9190612503565b610275565b604051610101919061245b565b60405180910390f35b61011261030a565b60405161011f919061255b565b60405180910390f35b610130611fa2565b600061013c858461032e565b836060018193508290525050610153858285610811565b826080018190525061017685600001602081019061017191906125a2565b610c34565b82602001818152505061018d858360200151610cd7565b8260000181815250506101a585836000015186610e58565b826040019015159081151581525050509392505050565b7f0000000000000000000000000cab6977a9c70e04458b740476b498b21401964181565b6101e8611fa2565b60006101f584600161032e565b83606001819350829052505061020d84826001610811565b826080018190525061023084600001602081019061022b91906125a2565b610c34565b826020018181525050610247848360200151610cd7565b82600001818152505061025f84836000015185610e58565b8260400190151590811515815250505092915050565b61027d611fa2565b600061028a83600161032e565b8360600181935082905250506102a283826001610811565b82608001819052506102c58360000160208101906102c091906125a2565b610c34565b8260200181815250506102dc838360200151610cd7565b8260000181815250506102f58383600001516000610e58565b82604001901515908115158152505050919050565b7f4c311e4e8d77235d0d7a52b5016439338023822803714fd764efc226b958d4aa81565b6060600083606001359050838060c0019061034991906125de565b905067ffffffffffffffff81111561036457610363612641565b5b60405190808252806020026020018201604052801561039d57816020015b61038a611fd6565b8152602001906001900390816103825790505b50915060005b8251811015610809576000858060c001906103be91906125de565b838181106103cf576103ce612670565b5b90506020028101906103e1919061269f565b60000160208101906103f391906125a2565b9050600061043682600189600001602081019061041091906125a2565b7f0000000000000000000000000cab6977a9c70e04458b740476b498b2140196416110ff565b1184838151811061044a57610449612670565b5b602002602001015160000190151590811515815250506000868060c0019061047291906125de565b8481811061048357610482612670565b5b9050602002810190610495919061269f565b80608001906104a491906126c7565b905067ffffffffffffffff8111156104bf576104be612641565b5b6040519080825280602002602001820160405280156104f857816020015b6104e5611ff2565b8152602001906001900390816104dd5790505b5090508085848151811061050f5761050e612670565b5b60200260200101516020018190525060005b81518110156107fb5761054688600001602081019061054091906125a2565b8661111a565b82828151811061055957610558612670565b5b602002602001015160000190151590811515815250508460010194506bffffffffffffffffffffffff888060c0019061059291906125de565b868181106105a3576105a2612670565b5b90506020028101906105b5919061269f565b80608001906105c491906126c7565b838181106105d5576105d4612670565b5b9050604002016000013511158282815181106105f4576105f3612670565b5b602002602001015160200190151590811515815250506000888060c0019061061c91906125de565b8681811061062d5761062c612670565b5b905060200281019061063f919061269f565b806080019061064e91906126c7565b8381811061065f5761065e612670565b5b90506040020160200135905073ffffffffffffffffffffffffffffffffffffffff81116107485787156107435761069684826111db565b8383815181106106a9576106a8612670565b5b60200260200101516040019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506106f18482611231565b83838151811061070457610703612670565b5b60200260200101516060019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505b6107ef565b600083838151811061075d5761075c612670565b5b60200260200101516040019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060008383815181106107b0576107af612670565b5b60200260200101516060019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505b81600101915050610521565b5082600101925050506103a3565b509250929050565b6060838060e0019061082391906125de565b905067ffffffffffffffff81111561083e5761083d612641565b5b60405190808252806020026020018201604052801561087757816020015b610864611fd6565b81526020019060019003908161085c5790505b50905060005b8151811015610c2c576000858060e0019061089891906125de565b838181106108a9576108a8612670565b5b90506020028101906108bb919061269f565b60000160208101906108cd91906125a2565b905060006109108260018960000160208101906108ea91906125a2565b7f0000000000000000000000000cab6977a9c70e04458b740476b498b2140196416110ff565b1183838151811061092457610923612670565b5b602002602001015160000190151590811515815250506000868060e0019061094c91906125de565b8481811061095d5761095c612670565b5b905060200281019061096f919061269f565b806080019061097e91906126c7565b905067ffffffffffffffff81111561099957610998612641565b5b6040519080825280602002602001820160405280156109d257816020015b6109bf611ff2565b8152602001906001900390816109b75790505b509050808484815181106109e9576109e8612670565b5b60200260200101516020018190525060005b8151811015610c1e57610a20886000016020810190610a1a91906125a2565b8861111a565b828281518110610a3357610a32612670565b5b602002602001015160000190151590811515815250508660010196507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff888060e00190610a7c91906125de565b86818110610a8d57610a8c612670565b5b9050602002810190610a9f919061269f565b8060800190610aae91906126c7565b83818110610abf57610abe612670565b5b905060400201600001351115828281518110610ade57610add612670565b5b602002602001015160200190151590811515815250506000888060e00190610b0691906125de565b86818110610b1757610b16612670565b5b9050602002810190610b29919061269f565b8060800190610b3891906126c7565b83818110610b4957610b48612670565b5b9050604002016020013590508615610c1257610b6584826111db565b838381518110610b7857610b77612670565b5b60200260200101516040019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050610bc08482611231565b838381518110610bd357610bd2612670565b5b60200260200101516060019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505b816001019150506109fb565b50826001019250505061087d565b509392505050565b60007f0000000000000000000000000cab6977a9c70e04458b740476b498b21401964173ffffffffffffffffffffffffffffffffffffffff16635e725186836040518263ffffffff1660e01b8152600401610c8f919061248c565b602060405180830381865afa158015610cac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cd09190612756565b9050919050565b600080610cf2848060c00190610ced91906125de565b611287565b90506000610d0e858060e00190610d0991906125de565b61138c565b90506000856080016020810190610d2591906125a2565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610d735773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee90505b60007f2d8cbbbc696e7292c3b5beb38e1363d34ff11beb8c3456c14cb938854597b9ed60001b876000016020810190610dac91906125a2565b886020013589604001358a60600135868c60a0016020810190610dcf91906125a2565b8a8a8e604051602001610deb9a99989796959493929190612792565b6040516020818303038152906040528051906020012090507f4c311e4e8d77235d0d7a52b5016439338023822803714fd764efc226b958d4aa81604051602001610e369291906128a6565b6040516020818303038152906040528051906020012094505050505092915050565b600080846000016020810190610e6e91906125a2565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610eae5760009150506110f8565b600085610100016020810190610ec491906128dd565b9050600086610120013590506000876101400135905060008660ff1603610f7f5760018784848460405160008152602001604052604051610f089493929190612919565b6020604051602081039080840390855afa158015610f2a573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff16886000016020810190610f5d91906125a2565b73ffffffffffffffffffffffffffffffffffffffff16149450505050506110f8565b60038660ff1603610fb457610fa9886000016020810190610fa091906125a2565b88858585611491565b9450505050506110f8565b60058660ff160361101d576000610fc961151b565b905060006001821603610fe4576000955050505050506110f8565b6000610fef8961156e565b90506110108a600001602081019061100791906125a2565b82878787611491565b96505050505050506110f8565b60078660ff160361108657600061103261151b565b90506000600282160361104d576000955050505050506110f8565b6000611058896115a6565b90506110798a600001602081019061107091906125a2565b82878787611491565b96505050505050506110f8565b60098660ff16036110ef57600061109b61151b565b9050600060048216036110b6576000955050505050506110f8565b60006110c1896115a6565b90506110e28a60000160208101906110d991906125a2565b828787876116d3565b96505050505050506110f8565b60009450505050505b9392505050565b600061110d858585856117e0565b5080915050949350505050565b6000807f0000000000000000000000000cab6977a9c70e04458b740476b498b21401964173ffffffffffffffffffffffffffffffffffffffff1663030b273085600886901c6040518363ffffffff1660e01b815260040161117c929190612998565b602060405180830381865afa158015611199573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111bd9190612756565b9050600060ff84166001901b90506000818316149250505092915050565b60006040517f6352211e000000000000000000000000000000000000000000000000000000008152826004820152602081602483875afa1561122a57600160a01b8151101561122957805191505b5b5092915050565b60006040517f081812fc000000000000000000000000000000000000000000000000000000008152826004820152602081602483875afa1561128057600160a01b8151101561127f57805191505b5b5092915050565b60008083839050036112be577fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050611386565b600083839050905060008167ffffffffffffffff8111156112e2576112e1612641565b5b6040519080825280602002602001820160405280156113105781602001602082028036833780820191505090505b50905060005b828110156113775761134b86868381811061133457611333612670565b5b9050602002810190611346919061269f565b6118e7565b82828151811061135e5761135d612670565b5b6020026020010181815250508080600101915050611316565b50602082026020820120925050505b92915050565b60008083839050036113c3577fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b905061148b565b600083839050905060008167ffffffffffffffff8111156113e7576113e6612641565b5b6040519080825280602002602001820160405280156114155781602001602082028036833780820191505090505b50905060005b8281101561147c5761145086868381811061143957611438612670565b5b905060200281019061144b919061269f565b611b43565b82828151811061146357611462612670565b5b602002602001018181525050808060010191505061141b565b50602082026020820120925050505b92915050565b600080863b1561150e57604051631626ba7e8152866020820152604080820152604160608201528460808201528360a08201528560f81b60c082015260208160a5601c84018b5afa1561150c577f1626ba7e0000000000000000000000000000000000000000000000000000000081510361150b57600191505b5b505b8091505095945050505050565b6000807f0000000000000000000000000cab6977a9c70e04458b740476b498b2140196419050604051633cdad7ce8152602081600483855afa80156115685760203d0361156757815193505b5b50505090565b600061157982611dda565b6040516020016115899190612aa4565b604051602081830303815290604052805190602001209050919050565b60008060026115b484611dda565b6040516020016115c49190612b38565b6040516020818303038152906040526040516115e09190612b5a565b602060405180830381855afa1580156115fd573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906116209190612b9d565b90506000602067ffffffffffffffff81111561163f5761163e612641565b5b6040519080825280601f01601f1916602001820160405280156116715781602001600182028036833780820191505090505b50905081602082015260028160405161168a9190612b5a565b602060405180830381855afa1580156116a7573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906116ca9190612b9d565b92505050919050565b600080863b1561171e57604051638da5cb5b81526020816004601c84018b5afa1561171c57740100000000000000000000000000000000000000008151101561171b57805191505b5b505b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156117d45750600186868686604051600081526020016040526040516117799493929190612919565b6020604051602081039080840390855afa15801561179b573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b91505095945050505050565b600080600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16148061185d575073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16145b1561186e57600080915091506118de565b60006040517fe985e9c50000000000000000000000000000000000000000000000000000000081528560048201528460248201526020816044838b5afa156118c0576000815111156118bf57600191505b5b5080156118d5576001600092509250506118de565b60008092509250505b94509492505050565b60008060008380608001906118fc91906126c7565b90500361192e577fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050611a97565b600083806080019061194091906126c7565b9050905060008167ffffffffffffffff8111156119605761195f612641565b5b60405190808252806020026020018201604052801561198e5781602001602082028036833780820191505090505b50905060005b82811015611a885760008680608001906119ae91906126c7565b838181106119bf576119be612670565b5b90506040020160000135905060008780608001906119dd91906126c7565b848181106119ee576119ed612670565b5b9050604002016020013590506bffffffffffffffffffffffff821180611a27575073ffffffffffffffffffffffffffffffffffffffff81115b15611a52576000848481518110611a4157611a40612670565b5b602002602001018181525050611a79565b8060a083901b17848481518110611a6c57611a6b612670565b5b6020026020010181815250505b82806001019350505050611994565b50602082026020820120925050505b6000836060016020810190611aac91906125a2565b73ffffffffffffffffffffffffffffffffffffffff1660a08560400135901b60b08660200135901b171790507f12ad29288fd70022f26997a9958d9eceb6e840ceaa79b72ea5945ba87e4d33b060001b846000016020810190611b0f91906125a2565b8284604051602001611b249493929190612bca565b6040516020818303038152906040528051906020012092505050919050565b6000806000838060800190611b5891906126c7565b905003611b8a577fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050611d2e565b6000838060800190611b9c91906126c7565b9050905060008167ffffffffffffffff811115611bbc57611bbb612641565b5b604051908082528060200260200182016040528015611bea5781602001602082028036833780820191505090505b50905060005b82811015611d1f576000868060800190611c0a91906126c7565b83818110611c1b57611c1a612670565b5b9050604002016000013590506000878060800190611c3991906126c7565b84818110611c4a57611c49612670565b5b9050604002016020013590507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff821115611ca2576000801b848481518110611c9157611c90612670565b5b602002602001018181525050611d10565b7f5f93394997caa49a9382d44a75e3ce6a460f32b39870464866ac994f8be97afe60001b8282604051602001611cda93929190612c0f565b60405160208183030381529060405280519060200120848481518110611d0357611d02612670565b5b6020026020010181815250505b82806001019350505050611bf0565b50602082026020820120925050505b6000836060016020810190611d4391906125a2565b73ffffffffffffffffffffffffffffffffffffffff1660a08560400135901b60b08660200135901b171790507fb9f488d48cec782be9ecdb74330c9c6a33c236a8022d8a91a4e4df4e81b5162060001b846000016020810190611da691906125a2565b8284604051602001611dbb9493929190612bca565b6040516020818303038152906040528051906020012092505050919050565b606060008260001c9050604267ffffffffffffffff811115611dff57611dfe612641565b5b6040519080825280601f01601f191660200182016040528015611e315781602001600182028036833780820191505090505b5091507f300000000000000000000000000000000000000000000000000000000000000082600081518110611e6957611e68612670565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000082600181518110611ecd57611ecc612670565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000604190505b6001811115611f9b577f3031323334353637383961626364656600000000000000000000000000000000600f831660108110611f4257611f41612670565b5b1a60f81b838281518110611f5957611f58612670565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600482901c915080600190039050611f03565b5050919050565b6040518060a00160405280600080191681526020016000815260200160001515815260200160608152602001606081525090565b6040518060400160405280600015158152602001606081525090565b6040518060800160405280600015158152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff1681525090565b600080fd5b600080fd5b600080fd5b600061016082840312156120705761206f612054565b5b81905092915050565b600060ff82169050919050565b61208f81612079565b811461209a57600080fd5b50565b6000813590506120ac81612086565b92915050565b60008115159050919050565b6120c7816120b2565b81146120d257600080fd5b50565b6000813590506120e4816120be565b92915050565b6000806000606084860312156121035761210261204a565b5b600084013567ffffffffffffffff8111156121215761212061204f565b5b61212d86828701612059565b935050602061213e8682870161209d565b925050604061214f868287016120d5565b9150509250925092565b6000819050919050565b61216c81612159565b82525050565b6000819050919050565b61218581612172565b82525050565b612194816120b2565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061221d826121f2565b9050919050565b61222d81612212565b82525050565b608082016000820151612249600085018261218b565b50602082015161225c602085018261218b565b50604082015161226f6040850182612224565b5060608201516122826060850182612224565b50505050565b60006122948383612233565b60808301905092915050565b6000602082019050919050565b60006122b8826121c6565b6122c281856121d1565b93506122cd836121e2565b8060005b838110156122fe5781516122e58882612288565b97506122f0836122a0565b9250506001810190506122d1565b5085935050505092915050565b6000604083016000830151612323600086018261218b565b506020830151848203602086015261233b82826122ad565b9150508091505092915050565b6000612354838361230b565b905092915050565b6000602082019050919050565b60006123748261219a565b61237e81856121a5565b935083602082028501612390856121b6565b8060005b858110156123cc57848403895281516123ad8582612348565b94506123b88361235c565b925060208a01995050600181019050612394565b50829750879550505050505092915050565b600060a0830160008301516123f66000860182612163565b506020830151612409602086018261217c565b50604083015161241c604086018261218b565b50606083015184820360608601526124348282612369565b9150506080830151848203608086015261244e8282612369565b9150508091505092915050565b6000602082019050818103600083015261247581846123de565b905092915050565b61248681612212565b82525050565b60006020820190506124a1600083018461247d565b92915050565b600080604083850312156124be576124bd61204a565b5b600083013567ffffffffffffffff8111156124dc576124db61204f565b5b6124e885828601612059565b92505060206124f98582860161209d565b9150509250929050565b6000602082840312156125195761251861204a565b5b600082013567ffffffffffffffff8111156125375761253661204f565b5b61254384828501612059565b91505092915050565b61255581612159565b82525050565b6000602082019050612570600083018461254c565b92915050565b61257f81612212565b811461258a57600080fd5b50565b60008135905061259c81612576565b92915050565b6000602082840312156125b8576125b761204a565b5b60006125c68482850161258d565b91505092915050565b600080fd5b600080fd5b600080fd5b600080833560016020038436030381126125fb576125fa6125cf565b5b80840192508235915067ffffffffffffffff82111561261d5761261c6125d4565b5b602083019250602082023603831315612639576126386125d9565b5b509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008235600160a0038336030381126126bb576126ba6125cf565b5b80830191505092915050565b600080833560016020038436030381126126e4576126e36125cf565b5b80840192508235915067ffffffffffffffff821115612706576127056125d4565b5b602083019250604082023603831315612722576127216125d9565b5b509250929050565b61273381612172565b811461273e57600080fd5b50565b6000815190506127508161272a565b92915050565b60006020828403121561276c5761276b61204a565b5b600061277a84828501612741565b91505092915050565b61278c81612172565b82525050565b6000610140820190506127a8600083018d61254c565b6127b5602083018c61247d565b6127c2604083018b612783565b6127cf606083018a612783565b6127dc6080830189612783565b6127e960a083018861247d565b6127f660c083018761247d565b61280360e083018661254c565b61281161010083018561254c565b61281f610120830184612783565b9b9a5050505050505050505050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b600061286f60028361282e565b915061287a82612839565b600282019050919050565b6000819050919050565b6128a061289b82612159565b612885565b82525050565b60006128b182612862565b91506128bd828561288f565b6020820191506128cd828461288f565b6020820191508190509392505050565b6000602082840312156128f3576128f261204a565b5b60006129018482850161209d565b91505092915050565b61291381612079565b82525050565b600060808201905061292e600083018761254c565b61293b602083018661290a565b612948604083018561254c565b612955606083018461254c565b95945050505050565b60007effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82169050919050565b6129928161295e565b82525050565b60006040820190506129ad600083018561247d565b6129ba6020830184612989565b9392505050565b600081905092915050565b7f19457468657265756d205369676e6564204d6573736167653a0a313031456c6560008201527f6d656e742e6d61726b6574206c697374696e672f6f6666657220686173683a0a602082015250565b6000612a286040836129c1565b9150612a33826129cc565b604082019050919050565b600081519050919050565b60005b83811015612a67578082015181840152602081019050612a4c565b60008484015250505050565b6000612a7e82612a3e565b612a8881856129c1565b9350612a98818560208601612a49565b80840191505092915050565b6000612aaf82612a1b565b9150612abb8284612a73565b915081905092915050565b7f18426974636f696e205369676e6564204d6573736167653a0a65456c656d656e60008201527f742e6d61726b6574206c697374696e672f6f6666657220686173683a0a000000602082015250565b6000612b22603d836129c1565b9150612b2d82612ac6565b603d82019050919050565b6000612b4382612b15565b9150612b4f8284612a73565b915081905092915050565b6000612b668284612a73565b915081905092915050565b612b7a81612159565b8114612b8557600080fd5b50565b600081519050612b9781612b71565b92915050565b600060208284031215612bb357612bb261204a565b5b6000612bc184828501612b88565b91505092915050565b6000608082019050612bdf600083018761254c565b612bec602083018661247d565b612bf96040830185612783565b612c06606083018461254c565b95945050505050565b6000606082019050612c24600083018661254c565b612c316020830185612783565b612c3e6040830184612783565b94935050505056fea264697066735822122061689401b1e95f1599e14e1954397d217c26657d5b5a7557e3a4c141e7076a9864736f6c63430008110033

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

0000000000000000000000000cab6977a9c70e04458b740476b498b214019641

-----Decoded View---------------
Arg [0] : element (address): 0x0caB6977a9c70E04458b740476B498B214019641

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000000cab6977a9c70e04458b740476b498b214019641


Block Transaction Gas Used Reward
view all blocks sequenced

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

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.