ETH Price: $2,398.86 (-2.05%)
 

Overview

Max Total Supply

2,914 GMLING

Holders

2,914

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
0x971c7753Cc0976b5cBe83a6A2b2b9183727849C8
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:
MoonlingsSBT

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 8 : MoonlingsSBT.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.19;

import "./Minimal1155SBT.sol";
import "@openzeppelin/contracts/access/Ownable.sol";

/**
 * @author SanLeo461, on behalf of Moonlings
 */
contract MoonlingsSBT is Minimal1155SBT, Ownable {
    bool public canAirdrop = true;
    uint256 public supply = 0;

    string public name = "GMoonling to You - Moonpass";
    string public symbol = "GMLING";

    uint256 private _storageCounter = START_BALANCES_SLOT;
    uint256 private _storageUpto = 0;

    constructor(string memory uri_) Minimal1155SBT(uri_) {}

    function airdrop(bytes calldata addresses) external onlyOwner {
        require(canAirdrop, "Airdrop has been disabled");
        require(addresses.length % 20 == 0, "Invalid addresses length");

        uint256 _storageCounterVal = _storageCounter;
        uint256  _storageUptoVal = _storageUpto;
        supply += addresses.length / 20;
        

        assembly {
            let sz := div(addresses.length, 20)
            let storageCounter := _storageCounterVal
            let currentStoreAcc := sload(_storageCounterVal)
            let upto := _storageUptoVal
            let operator := caller()
            let zeroAddress := 0
            let signature := 0xc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62
            mstore(0x40, 1)
            mstore(0x60, 1)
            for {
                let i := 0
            } lt(i, sz) {
                i := add(i, 1)
            } {
                let offset := mul(i, 20)
                let toAirdropTo := shr(96, calldataload(add(addresses.offset, offset)))
                log4(0x40, 0x40, signature, operator, zeroAddress, toAirdropTo)
                
                switch gt(upto, 11)
                case 0 {
                    currentStoreAcc := or(currentStoreAcc, shl(sub(96, mul(upto, 8)), toAirdropTo))
                    upto := add(upto, 20)
                }
                default {
                    let overlap := sub(upto, 12)
                    let toStore := or(currentStoreAcc, shr(mul(overlap, 8), toAirdropTo))

                    sstore(storageCounter, toStore)
                    storageCounter := add(storageCounter, 1)
                    currentStoreAcc := shl(sub(256, mul(overlap, 8)), toAirdropTo)
                    upto := overlap
                }
            }
            if gt(upto, 0) {
                sstore(storageCounter, currentStoreAcc)
            }
            _storageCounterVal := storageCounter
            _storageUptoVal := upto
        }
        _storageCounter = _storageCounterVal;
        _storageUpto = _storageUptoVal;
    }

    function getAddressIndexed(uint256 index) public view returns (address toReturn) {
        uint256 startBalancesSlot = START_BALANCES_SLOT;

        assembly {
            toReturn := 0
            let storageCounter := startBalancesSlot
            let slotIn := div(mul(20, index), 32)
            let indexIn := mod(mul(20, index), 32)
            let slot := sload(add(storageCounter, slotIn))
            toReturn := shl(mul(indexIn, 8), slot)
            switch gt(indexIn, 12)
            case 0 {
                toReturn := shr(96, toReturn)
            }
            default {
                let overlap := sub(indexIn, 12)
                toReturn := shl(mul(overlap, 8), shr(add(96, mul(overlap, 8)), toReturn))
                let slot2 := sload(add(storageCounter, add(slotIn, 1)))
                toReturn := or(toReturn, shr(sub(256, mul(overlap, 8)), slot2))
            }
        }
    }

    function _isAddressIncluded(address toFind, uint256 begin, uint256 end) internal view returns (bool ret) {
        uint160 toFindInt = uint160(toFind);
        uint256 len = end - begin;
        if (len == 0) {
            return false;
        } else if (len == 1) {
            return toFind == getAddressIndexed(begin);
        }

        uint256 mid = begin + len / 2;
        uint160 midAddr = uint160(getAddressIndexed(mid));
        if (uint160(midAddr) > toFindInt) {
            return _isAddressIncluded(toFind, begin, mid);
        } else if (uint160(midAddr) < toFindInt) {
            return _isAddressIncluded(toFind, mid, end);
        }
        return true;
    }

    function balanceOf(address account, uint256 id) public view override returns (uint256) {
        require(account != address(0), "ERC1155: address zero is not a valid owner");
        require(id == TOKEN_ID, "ERC1155: invalid token ID");
        return _isAddressIncluded(account, 0, supply) ? 1 : 0;
    }

    function setURI(string memory uri_) external onlyOwner {
        _setURI(uri_);
    }

    function renounceAirdropRights() external onlyOwner {
        canAirdrop = false;
    }
}

File 2 of 8 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby disabling any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 3 of 8 : IERC1155MetadataURI.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol)

pragma solidity ^0.8.0;

import "../IERC1155.sol";

/**
 * @dev Interface of the optional ERC1155MetadataExtension interface, as defined
 * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155MetadataURI is IERC1155 {
    /**
     * @dev Returns the URI for token type `id`.
     *
     * If the `\{id\}` substring is present in the URI, it must be replaced by
     * clients with the actual token type ID.
     */
    function uri(uint256 id) external view returns (string memory);
}

File 4 of 8 : IERC1155.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC1155/IERC1155.sol)

pragma solidity ^0.8.0;

import "../../utils/introspection/IERC165.sol";

/**
 * @dev Required interface of an ERC1155 compliant contract, as defined in the
 * https://eips.ethereum.org/EIPS/eip-1155[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155 is IERC165 {
    /**
     * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
     */
    event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);

    /**
     * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
     * transfers.
     */
    event TransferBatch(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256[] ids,
        uint256[] values
    );

    /**
     * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
     * `approved`.
     */
    event ApprovalForAll(address indexed account, address indexed operator, bool approved);

    /**
     * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
     *
     * If an {URI} event was emitted for `id`, the standard
     * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
     * returned by {IERC1155MetadataURI-uri}.
     */
    event URI(string value, uint256 indexed id);

    /**
     * @dev Returns the amount of tokens of token type `id` owned by `account`.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) external view returns (uint256);

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(
        address[] calldata accounts,
        uint256[] calldata ids
    ) external view returns (uint256[] memory);

    /**
     * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
     *
     * Emits an {ApprovalForAll} event.
     *
     * Requirements:
     *
     * - `operator` cannot be the caller.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address account, address operator) external view returns (bool);

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes calldata data) external;

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata amounts,
        bytes calldata data
    ) external;
}

File 5 of 8 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

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

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

File 7 of 8 : IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

File 8 of 8 : Minimal1155SBT.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.19;

import "@openzeppelin/contracts/utils/introspection/ERC165.sol";
import "@openzeppelin/contracts/utils/introspection/IERC165.sol";
import "@openzeppelin/contracts/token/ERC1155/IERC1155.sol";
import "@openzeppelin/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol";

/**
 * @author SanLeo461, on behalf of Moonlings
 */
contract Minimal1155SBT is IERC1155, IERC1155MetadataURI, ERC165 {
    uint256 public constant TOKEN_ID = 1;
    uint256 public constant START_BALANCES_SLOT = uint256(keccak256('1155sbt.start_balances')) - 1;

    error TokenIsSoulbound();

    // Used as the URI for every token as there is only 1 token ID.
    string private _uri;

    /**
     * @dev See {_setURI}.
     */
    constructor(string memory uri_) {
        _setURI(uri_);
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return interfaceId == type(IERC1155).interfaceId || interfaceId == type(IERC1155MetadataURI).interfaceId
            || super.supportsInterface(interfaceId);
    }

    function uri(uint256) public view virtual override returns (string memory) {
        return _uri;
    }

    /**
     * @dev See {IERC1155-balanceOf}.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) public view virtual override returns (uint256) {
        require(account != address(0), "ERC1155: address zero is not a valid owner");
        require(id == TOKEN_ID, "ERC1155: invalid token ID");
        return 0;
    }

    /**
     * @dev See {IERC1155-balanceOfBatch}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] memory accounts, uint256[] memory ids)
        public
        view
        virtual
        override
        returns (uint256[] memory)
    {
        require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch");

        uint256[] memory batchBalances = new uint256[](accounts.length);

        for (uint256 i = 0; i < accounts.length; ++i) {
            batchBalances[i] = balanceOf(accounts[i], ids[i]);
        }

        return batchBalances;
    }

    /**
     * @dev See {IERC1155-setApprovalForAll}.
     */
    function setApprovalForAll(address, /* operator */ bool /* approved */ ) public pure override {
        revert TokenIsSoulbound();
    }

    /**
     * @dev See {IERC1155-isApprovedForAll}.
     */
    function isApprovedForAll(address, /* account */ address /* operator */ ) public pure override returns (bool) {
        return false;
    }

    /**
     * @dev See {IERC1155-safeTransferFrom}.
     */
    function safeTransferFrom(
        address, /* from */
        address, /* to */
        uint256, /* id */
        uint256, /* amount */
        bytes memory /* data */
    ) public virtual override {
        revert TokenIsSoulbound();
    }

    /**
     * @dev See {IERC1155-safeBatchTransferFrom}.
     */
    function safeBatchTransferFrom(
        address, /* from */
        address, /* to */
        uint256[] memory, /* ids */
        uint256[] memory, /* amounts */
        bytes memory /* data */
    ) public virtual override {
        revert TokenIsSoulbound();
    }

    function _setURI(string memory newuri) internal virtual {
        _uri = newuri;
        emit URI(newuri, TOKEN_ID);
    }
}

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"uri_","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"TokenIsSoulbound","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","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":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[],"name":"START_BALANCES_SLOT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOKEN_ID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"addresses","type":"bytes"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"canAirdrop","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getAddressIndexed","outputs":[{"internalType":"address","name":"toReturn","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceAirdropRights","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"bool","name":"","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"string","name":"uri_","type":"string"}],"name":"setURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"supply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]

6001805460ff60a01b1916600160a01b179055600060025560c0604052601b60809081527f474d6f6f6e6c696e6720746f20596f75202d204d6f6f6e70617373000000000060a0526003906200005690826200024c565b50604080518082019091526006815265474d4c494e4760d01b60208201526004906200008390826200024c565b50620000b160017f2f2d49a864067bf224884f35cb3a1b5a61c91f0dbeccd1edd8aa755c2bc29b6662000318565b6005556000600655348015620000c657600080fd5b506040516200177938038062001779833981016040819052620000e99162000366565b80620000f58162000108565b50620001013362000155565b5062000453565b60006200011682826200024c565b5060017f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b826040516200014a91906200041e565b60405180910390a250565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620001d257607f821691505b602082108103620001f357634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200024757600081815260208120601f850160051c81016020861015620002225750805b601f850160051c820191505b8181101562000243578281556001016200022e565b5050505b505050565b81516001600160401b03811115620002685762000268620001a7565b6200028081620002798454620001bd565b84620001f9565b602080601f831160018114620002b857600084156200029f5750858301515b600019600386901b1c1916600185901b17855562000243565b600085815260208120601f198616915b82811015620002e957888601518255948401946001909101908401620002c8565b5085821015620003085787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b818103818111156200033a57634e487b7160e01b600052601160045260246000fd5b92915050565b60005b838110156200035d57818101518382015260200162000343565b50506000910152565b6000602082840312156200037957600080fd5b81516001600160401b03808211156200039157600080fd5b818401915084601f830112620003a657600080fd5b815181811115620003bb57620003bb620001a7565b604051601f8201601f19908116603f01168101908382118183101715620003e657620003e6620001a7565b816040528281528760208487010111156200040057600080fd5b6200041383602083016020880162000340565b979650505050505050565b60208152600082518060208401526200043f81604085016020870162000340565b601f01601f19169190910160400192915050565b61131680620004636000396000f3fe608060405234801561001057600080fd5b50600436106101365760003560e01c80634e1273f4116100b85780638da5cb5b1161007c5780638da5cb5b1461026f57806395d89b4114610280578063a22cb46514610288578063e985e9c514610296578063f242432a146102ac578063f2fde38b146102ba57600080fd5b80634e1273f41461022f578063514fd4a31461024f578063715018a6146102575780637d0907af1461025f57806389a890021461026757600080fd5b80630e89341c116100ff5780630e89341c146101b757806325319135146101ca5780632785bf16146101de5780632eb2c2d6146101f15780633270353b1461020457600080fd5b8062fdd58e1461013b57806301ffc9a71461016157806302fe530514610184578063047fc9aa1461019957806306fdde03146101a2575b600080fd5b61014e610149366004610b85565b6102cd565b6040519081526020015b60405180910390f35b61017461016f366004610baf565b6103b5565b6040519015158152602001610158565b610197610192366004610c78565b610405565b005b61014e60025481565b6101aa610419565b6040516101589190610cc9565b6101aa6101c5366004610d17565b6104a7565b60015461017490600160a01b900460ff1681565b6101976101ec366004610d30565b61053b565b6101976101ff366004610e51565b6106e4565b610217610212366004610d17565b6106fd565b6040516001600160a01b039091168152602001610158565b61024261023d366004610efb565b610792565b6040516101589190610fbb565b61014e6108bc565b6101976108ea565b6101976108fe565b61014e600181565b6001546001600160a01b0316610217565b6101aa610915565b6101976101ff366004610fff565b6101746102a436600461103b565b600092915050565b6101976101ff36600461106e565b6101976102c83660046110d3565b610922565b60006001600160a01b03831661033d5760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201526930b634b21037bbb732b960b11b60648201526084015b60405180910390fd5b6001821461038d5760405162461bcd60e51b815260206004820152601960248201527f455243313135353a20696e76616c696420746f6b656e204944000000000000006044820152606401610334565b61039b836000600254610998565b6103a65760006103a9565b60015b60ff1690505b92915050565b60006001600160e01b03198216636cdb3d1360e11b14806103e657506001600160e01b031982166303a24d0760e21b145b806103af57506301ffc9a760e01b6001600160e01b03198316146103af565b61040d610a74565b61041681610ace565b50565b60038054610426906110ee565b80601f0160208091040260200160405190810160405280929190818152602001828054610452906110ee565b801561049f5780601f106104745761010080835404028352916020019161049f565b820191906000526020600020905b81548152906001019060200180831161048257829003601f168201915b505050505081565b6060600080546104b6906110ee565b80601f01602080910402602001604051908101604052809291908181526020018280546104e2906110ee565b801561052f5780601f106105045761010080835404028352916020019161052f565b820191906000526020600020905b81548152906001019060200180831161051257829003601f168201915b50505050509050919050565b610543610a74565b600154600160a01b900460ff1661059c5760405162461bcd60e51b815260206004820152601960248201527f41697264726f7020686173206265656e2064697361626c6564000000000000006044820152606401610334565b6105a760148261113e565b156105f45760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420616464726573736573206c656e67746800000000000000006044820152606401610334565b600554600654610605601484611168565b60026000828254610616919061117c565b9250508190555060148304828354833360007fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f626001604052600160605260005b878110156106c257601481028c013560601c80848685604080a4600b861180156106a4576008600b1990970196870282811c9890981789556001909801976101009790970381901b966106b8565b81600888026060031b881797506014870196505b5050600101610656565b5050505060008111156106d3578183555b600592909255506006555050505050565b6040516358b2164f60e11b815260040160405180910390fd5b60008061072b60017f2f2d49a864067bf224884f35cb3a1b5a61c91f0dbeccd1edd8aa755c2bc29b6661118f565b602060148502908104808301546008601f9093169283021b9450919250829190600c8111801561078157600183850101546060600b1984016008029081019790971c871b610100979097031c9590951794610788565b8560601c95505b5050505050919050565b606081518351146107f75760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610334565b6000835167ffffffffffffffff81111561081357610813610bd9565b60405190808252806020026020018201604052801561083c578160200160208202803683370190505b50905060005b84518110156108b457610887858281518110610860576108606111a2565b602002602001015185838151811061087a5761087a6111a2565b60200260200101516102cd565b828281518110610899576108996111a2565b60209081029190910101526108ad816111b8565b9050610842565b509392505050565b6108e760017f2f2d49a864067bf224884f35cb3a1b5a61c91f0dbeccd1edd8aa755c2bc29b6661118f565b81565b6108f2610a74565b6108fc6000610b17565b565b610906610a74565b6001805460ff60a01b19169055565b60048054610426906110ee565b61092a610a74565b6001600160a01b03811661098f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610334565b61041681610b17565b600083816109a6858561118f565b9050806000036109bb57600092505050610a6d565b806001036109e9576109cc856106fd565b6001600160a01b0316866001600160a01b03161492505050610a6d565b60006109f6600283611168565b610a00908761117c565b90506000610a0d826106fd565b9050836001600160a01b0316816001600160a01b03161115610a3f57610a34888884610998565b945050505050610a6d565b836001600160a01b0316816001600160a01b03161015610a6457610a34888388610998565b60019450505050505b9392505050565b6001546001600160a01b031633146108fc5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610334565b6000610ada8282611220565b5060017f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b82604051610b0c9190610cc9565b60405180910390a250565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b80356001600160a01b0381168114610b8057600080fd5b919050565b60008060408385031215610b9857600080fd5b610ba183610b69565b946020939093013593505050565b600060208284031215610bc157600080fd5b81356001600160e01b031981168114610a6d57600080fd5b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715610c1857610c18610bd9565b604052919050565b600067ffffffffffffffff831115610c3a57610c3a610bd9565b610c4d601f8401601f1916602001610bef565b9050828152838383011115610c6157600080fd5b828260208301376000602084830101529392505050565b600060208284031215610c8a57600080fd5b813567ffffffffffffffff811115610ca157600080fd5b8201601f81018413610cb257600080fd5b610cc184823560208401610c20565b949350505050565b600060208083528351808285015260005b81811015610cf657858101830151858201604001528201610cda565b506000604082860101526040601f19601f8301168501019250505092915050565b600060208284031215610d2957600080fd5b5035919050565b60008060208385031215610d4357600080fd5b823567ffffffffffffffff80821115610d5b57600080fd5b818501915085601f830112610d6f57600080fd5b813581811115610d7e57600080fd5b866020828501011115610d9057600080fd5b60209290920196919550909350505050565b600067ffffffffffffffff821115610dbc57610dbc610bd9565b5060051b60200190565b600082601f830112610dd757600080fd5b81356020610dec610de783610da2565b610bef565b82815260059290921b84018101918181019086841115610e0b57600080fd5b8286015b84811015610e265780358352918301918301610e0f565b509695505050505050565b600082601f830112610e4257600080fd5b610a6d83833560208501610c20565b600080600080600060a08688031215610e6957600080fd5b610e7286610b69565b9450610e8060208701610b69565b9350604086013567ffffffffffffffff80821115610e9d57600080fd5b610ea989838a01610dc6565b94506060880135915080821115610ebf57600080fd5b610ecb89838a01610dc6565b93506080880135915080821115610ee157600080fd5b50610eee88828901610e31565b9150509295509295909350565b60008060408385031215610f0e57600080fd5b823567ffffffffffffffff80821115610f2657600080fd5b818501915085601f830112610f3a57600080fd5b81356020610f4a610de783610da2565b82815260059290921b84018101918181019089841115610f6957600080fd5b948201945b83861015610f8e57610f7f86610b69565b82529482019490820190610f6e565b96505086013592505080821115610fa457600080fd5b50610fb185828601610dc6565b9150509250929050565b6020808252825182820181905260009190848201906040850190845b81811015610ff357835183529284019291840191600101610fd7565b50909695505050505050565b6000806040838503121561101257600080fd5b61101b83610b69565b91506020830135801515811461103057600080fd5b809150509250929050565b6000806040838503121561104e57600080fd5b61105783610b69565b915061106560208401610b69565b90509250929050565b600080600080600060a0868803121561108657600080fd5b61108f86610b69565b945061109d60208701610b69565b93506040860135925060608601359150608086013567ffffffffffffffff8111156110c757600080fd5b610eee88828901610e31565b6000602082840312156110e557600080fd5b610a6d82610b69565b600181811c9082168061110257607f821691505b60208210810361112257634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601260045260246000fd5b60008261114d5761114d611128565b500690565b634e487b7160e01b600052601160045260246000fd5b60008261117757611177611128565b500490565b808201808211156103af576103af611152565b818103818111156103af576103af611152565b634e487b7160e01b600052603260045260246000fd5b6000600182016111ca576111ca611152565b5060010190565b601f82111561121b57600081815260208120601f850160051c810160208610156111f85750805b601f850160051c820191505b8181101561121757828155600101611204565b5050505b505050565b815167ffffffffffffffff81111561123a5761123a610bd9565b61124e8161124884546110ee565b846111d1565b602080601f831160018114611283576000841561126b5750858301515b600019600386901b1c1916600185901b178555611217565b600085815260208120601f198616915b828110156112b257888601518255948401946001909101908401611293565b50858210156112d05787850151600019600388901b60f8161c191681555b5050505050600190811b0190555056fea2646970667358221220a1fd79486077cd2d189521dfff0694a4f5b437be76ff1840c9f5deee9ce3a90564736f6c634300081300330000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002b68747470733a2f2f6d6f6f6e6c696e67736d657461646174612e73616e6c656f2e6465762f312e6a736f6e000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101365760003560e01c80634e1273f4116100b85780638da5cb5b1161007c5780638da5cb5b1461026f57806395d89b4114610280578063a22cb46514610288578063e985e9c514610296578063f242432a146102ac578063f2fde38b146102ba57600080fd5b80634e1273f41461022f578063514fd4a31461024f578063715018a6146102575780637d0907af1461025f57806389a890021461026757600080fd5b80630e89341c116100ff5780630e89341c146101b757806325319135146101ca5780632785bf16146101de5780632eb2c2d6146101f15780633270353b1461020457600080fd5b8062fdd58e1461013b57806301ffc9a71461016157806302fe530514610184578063047fc9aa1461019957806306fdde03146101a2575b600080fd5b61014e610149366004610b85565b6102cd565b6040519081526020015b60405180910390f35b61017461016f366004610baf565b6103b5565b6040519015158152602001610158565b610197610192366004610c78565b610405565b005b61014e60025481565b6101aa610419565b6040516101589190610cc9565b6101aa6101c5366004610d17565b6104a7565b60015461017490600160a01b900460ff1681565b6101976101ec366004610d30565b61053b565b6101976101ff366004610e51565b6106e4565b610217610212366004610d17565b6106fd565b6040516001600160a01b039091168152602001610158565b61024261023d366004610efb565b610792565b6040516101589190610fbb565b61014e6108bc565b6101976108ea565b6101976108fe565b61014e600181565b6001546001600160a01b0316610217565b6101aa610915565b6101976101ff366004610fff565b6101746102a436600461103b565b600092915050565b6101976101ff36600461106e565b6101976102c83660046110d3565b610922565b60006001600160a01b03831661033d5760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201526930b634b21037bbb732b960b11b60648201526084015b60405180910390fd5b6001821461038d5760405162461bcd60e51b815260206004820152601960248201527f455243313135353a20696e76616c696420746f6b656e204944000000000000006044820152606401610334565b61039b836000600254610998565b6103a65760006103a9565b60015b60ff1690505b92915050565b60006001600160e01b03198216636cdb3d1360e11b14806103e657506001600160e01b031982166303a24d0760e21b145b806103af57506301ffc9a760e01b6001600160e01b03198316146103af565b61040d610a74565b61041681610ace565b50565b60038054610426906110ee565b80601f0160208091040260200160405190810160405280929190818152602001828054610452906110ee565b801561049f5780601f106104745761010080835404028352916020019161049f565b820191906000526020600020905b81548152906001019060200180831161048257829003601f168201915b505050505081565b6060600080546104b6906110ee565b80601f01602080910402602001604051908101604052809291908181526020018280546104e2906110ee565b801561052f5780601f106105045761010080835404028352916020019161052f565b820191906000526020600020905b81548152906001019060200180831161051257829003601f168201915b50505050509050919050565b610543610a74565b600154600160a01b900460ff1661059c5760405162461bcd60e51b815260206004820152601960248201527f41697264726f7020686173206265656e2064697361626c6564000000000000006044820152606401610334565b6105a760148261113e565b156105f45760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420616464726573736573206c656e67746800000000000000006044820152606401610334565b600554600654610605601484611168565b60026000828254610616919061117c565b9250508190555060148304828354833360007fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f626001604052600160605260005b878110156106c257601481028c013560601c80848685604080a4600b861180156106a4576008600b1990970196870282811c9890981789556001909801976101009790970381901b966106b8565b81600888026060031b881797506014870196505b5050600101610656565b5050505060008111156106d3578183555b600592909255506006555050505050565b6040516358b2164f60e11b815260040160405180910390fd5b60008061072b60017f2f2d49a864067bf224884f35cb3a1b5a61c91f0dbeccd1edd8aa755c2bc29b6661118f565b602060148502908104808301546008601f9093169283021b9450919250829190600c8111801561078157600183850101546060600b1984016008029081019790971c871b610100979097031c9590951794610788565b8560601c95505b5050505050919050565b606081518351146107f75760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610334565b6000835167ffffffffffffffff81111561081357610813610bd9565b60405190808252806020026020018201604052801561083c578160200160208202803683370190505b50905060005b84518110156108b457610887858281518110610860576108606111a2565b602002602001015185838151811061087a5761087a6111a2565b60200260200101516102cd565b828281518110610899576108996111a2565b60209081029190910101526108ad816111b8565b9050610842565b509392505050565b6108e760017f2f2d49a864067bf224884f35cb3a1b5a61c91f0dbeccd1edd8aa755c2bc29b6661118f565b81565b6108f2610a74565b6108fc6000610b17565b565b610906610a74565b6001805460ff60a01b19169055565b60048054610426906110ee565b61092a610a74565b6001600160a01b03811661098f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610334565b61041681610b17565b600083816109a6858561118f565b9050806000036109bb57600092505050610a6d565b806001036109e9576109cc856106fd565b6001600160a01b0316866001600160a01b03161492505050610a6d565b60006109f6600283611168565b610a00908761117c565b90506000610a0d826106fd565b9050836001600160a01b0316816001600160a01b03161115610a3f57610a34888884610998565b945050505050610a6d565b836001600160a01b0316816001600160a01b03161015610a6457610a34888388610998565b60019450505050505b9392505050565b6001546001600160a01b031633146108fc5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610334565b6000610ada8282611220565b5060017f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b82604051610b0c9190610cc9565b60405180910390a250565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b80356001600160a01b0381168114610b8057600080fd5b919050565b60008060408385031215610b9857600080fd5b610ba183610b69565b946020939093013593505050565b600060208284031215610bc157600080fd5b81356001600160e01b031981168114610a6d57600080fd5b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715610c1857610c18610bd9565b604052919050565b600067ffffffffffffffff831115610c3a57610c3a610bd9565b610c4d601f8401601f1916602001610bef565b9050828152838383011115610c6157600080fd5b828260208301376000602084830101529392505050565b600060208284031215610c8a57600080fd5b813567ffffffffffffffff811115610ca157600080fd5b8201601f81018413610cb257600080fd5b610cc184823560208401610c20565b949350505050565b600060208083528351808285015260005b81811015610cf657858101830151858201604001528201610cda565b506000604082860101526040601f19601f8301168501019250505092915050565b600060208284031215610d2957600080fd5b5035919050565b60008060208385031215610d4357600080fd5b823567ffffffffffffffff80821115610d5b57600080fd5b818501915085601f830112610d6f57600080fd5b813581811115610d7e57600080fd5b866020828501011115610d9057600080fd5b60209290920196919550909350505050565b600067ffffffffffffffff821115610dbc57610dbc610bd9565b5060051b60200190565b600082601f830112610dd757600080fd5b81356020610dec610de783610da2565b610bef565b82815260059290921b84018101918181019086841115610e0b57600080fd5b8286015b84811015610e265780358352918301918301610e0f565b509695505050505050565b600082601f830112610e4257600080fd5b610a6d83833560208501610c20565b600080600080600060a08688031215610e6957600080fd5b610e7286610b69565b9450610e8060208701610b69565b9350604086013567ffffffffffffffff80821115610e9d57600080fd5b610ea989838a01610dc6565b94506060880135915080821115610ebf57600080fd5b610ecb89838a01610dc6565b93506080880135915080821115610ee157600080fd5b50610eee88828901610e31565b9150509295509295909350565b60008060408385031215610f0e57600080fd5b823567ffffffffffffffff80821115610f2657600080fd5b818501915085601f830112610f3a57600080fd5b81356020610f4a610de783610da2565b82815260059290921b84018101918181019089841115610f6957600080fd5b948201945b83861015610f8e57610f7f86610b69565b82529482019490820190610f6e565b96505086013592505080821115610fa457600080fd5b50610fb185828601610dc6565b9150509250929050565b6020808252825182820181905260009190848201906040850190845b81811015610ff357835183529284019291840191600101610fd7565b50909695505050505050565b6000806040838503121561101257600080fd5b61101b83610b69565b91506020830135801515811461103057600080fd5b809150509250929050565b6000806040838503121561104e57600080fd5b61105783610b69565b915061106560208401610b69565b90509250929050565b600080600080600060a0868803121561108657600080fd5b61108f86610b69565b945061109d60208701610b69565b93506040860135925060608601359150608086013567ffffffffffffffff8111156110c757600080fd5b610eee88828901610e31565b6000602082840312156110e557600080fd5b610a6d82610b69565b600181811c9082168061110257607f821691505b60208210810361112257634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601260045260246000fd5b60008261114d5761114d611128565b500690565b634e487b7160e01b600052601160045260246000fd5b60008261117757611177611128565b500490565b808201808211156103af576103af611152565b818103818111156103af576103af611152565b634e487b7160e01b600052603260045260246000fd5b6000600182016111ca576111ca611152565b5060010190565b601f82111561121b57600081815260208120601f850160051c810160208610156111f85750805b601f850160051c820191505b8181101561121757828155600101611204565b5050505b505050565b815167ffffffffffffffff81111561123a5761123a610bd9565b61124e8161124884546110ee565b846111d1565b602080601f831160018114611283576000841561126b5750858301515b600019600386901b1c1916600185901b178555611217565b600085815260208120601f198616915b828110156112b257888601518255948401946001909101908401611293565b50858210156112d05787850151600019600388901b60f8161c191681555b5050505050600190811b0190555056fea2646970667358221220a1fd79486077cd2d189521dfff0694a4f5b437be76ff1840c9f5deee9ce3a90564736f6c63430008130033

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

0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002b68747470733a2f2f6d6f6f6e6c696e67736d657461646174612e73616e6c656f2e6465762f312e6a736f6e000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : uri_ (string): https://moonlingsmetadata.sanleo.dev/1.json

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 000000000000000000000000000000000000000000000000000000000000002b
Arg [2] : 68747470733a2f2f6d6f6f6e6c696e67736d657461646174612e73616e6c656f
Arg [3] : 2e6465762f312e6a736f6e000000000000000000000000000000000000000000


Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ 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.