Contract 0x7745c2e1a84ae770c08badabc1b2a4e55a7894dc 3

 

Contract Overview

Balance:
0 MATIC

MATIC Value:
$0.00

Token:
 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0xd61f4bd3e6926738b2c8e85c9f66efc330cc230495ee352d8beeab79f8e17c97Claim285490852022-05-20 12:59:5511 hrs 46 mins ago0x0e3536bbd878fa2f6fe4fd9c62904cd293269e01 IN  0x7745c2e1a84ae770c08badabc1b2a4e55a7894dc0 MATIC0.053505979411 30.118218761
0x1ff373610fe4c4b65f936991bec45908b9864aa6ddd29e24d63e9823c0e24b43Transfer285490192022-05-20 12:57:3911 hrs 48 mins ago0x149a83c9a1d34a9b6df9c84bef3c4e72f93f4acd IN  0x7745c2e1a84ae770c08badabc1b2a4e55a7894dc3.1 MATIC0.000751545367 35.787874665
0x887d2324bc50a9b72eac2997edd4cd940d69ea22492ef1c293a2bad76d394d2aClaim285183012022-05-19 18:39:111 day 6 hrs ago0x4d357ca42f48c895d4cd3d761fd6e25124832f72 IN  0x7745c2e1a84ae770c08badabc1b2a4e55a7894dc0 MATIC0.00887768 10
0x49f832834c99d80b73c5a41dff5190e5df568286a220a56591a765e97d9bf05dClaim285060712022-05-19 11:25:061 day 13 hrs ago0xa8d878b15010a419d4eb3959894c8515da7aacbd IN  0x7745c2e1a84ae770c08badabc1b2a4e55a7894dc0 MATIC0.231392567322 109.883292655
0x24ddf8df073f9c11fd772a3c4f76046a068398cf9ba14dd648d4deaa99340fd7Claim285060682022-05-19 11:24:541 day 13 hrs ago0x1bc1145952b1f57f163dbb67782ed383231224c3 IN  0x7745c2e1a84ae770c08badabc1b2a4e55a7894dc0 MATIC0.194989514984 106.70353973
0xcf2b65afc728c1592dd07237f60bda6a122685d4ccc919a8682011974a86897aClaim285052292022-05-19 10:55:071 day 13 hrs ago0xdcf61c97f5e18a34617f477b77702b5a5ccb42c1 IN  0x7745c2e1a84ae770c08badabc1b2a4e55a7894dc0 MATIC0.069391267871 31.057288157
0x7ac466281189c7ae8a7054321c9e37939a24bf03eb8359f4d3dcfec09c8ac8a7Claim285020532022-05-19 8:54:531 day 15 hrs ago0xe7259db99674f1af4b0f3eec7194c828d516a0f6 IN  0x7745c2e1a84ae770c08badabc1b2a4e55a7894dc0 MATIC0.01817698296 39.562655536
0xb9a556832258edd0df60a6512da0a9d758e5b12fc2aaf0f77645c8ef51ed4832Claim284925182022-05-19 3:09:291 day 21 hrs ago0x5459848a2d1a5547ad75b8e8e695d6d93c7bbcc9 IN  0x7745c2e1a84ae770c08badabc1b2a4e55a7894dc0 MATIC0.10507598634 53.069108811
0x8641477eaa159adeab09f2af22a3421fb311cf0df34fa59bf989592ddd8bcf58Claim284710112022-05-18 14:14:122 days 10 hrs ago0x8b67d6eae09185d2f17d47fc1426eaff3e5c8411 IN  0x7745c2e1a84ae770c08badabc1b2a4e55a7894dc0 MATIC0.368482020606 503.434754687
0xe53c8d6ca4de0543a12af6b92782c817326c407e87b9485e86eae35277ee03aeClaim284573932022-05-18 5:47:352 days 18 hrs ago0xfa3c0576b5f7c1f9d856b8615ced3befd74abba1 IN  0x7745c2e1a84ae770c08badabc1b2a4e55a7894dc0 MATIC0.013410092477 32.820814463
0x3c8c867937dc7d5e9e7615fe039d0b6dc7a65ea8aa2a3b9fe1661f023a8779c0Claim284386882022-05-17 18:25:283 days 6 hrs ago0xbee6735efbf796405c2420cc342c7a9df008f9f2 IN  0x7745c2e1a84ae770c08badabc1b2a4e55a7894dc0 MATIC0.052052905323 30.736062711
0x6193a5ae4be576cb69941759d94c4dc2172a4784b4bd631bba61cf1a305bf8beClaim284366382022-05-17 17:12:443 days 7 hrs ago0x37b5fc13f71d83773893c6fa9714d982cc7624fa IN  0x7745c2e1a84ae770c08badabc1b2a4e55a7894dc0 MATIC0.002078366924 72.253326064
0xe12cc6d4f847390c650957a14cbedd5b69f4049561caa3e61d2b30f3b9de0991Claim284366382022-05-17 17:12:443 days 7 hrs ago0x37b5fc13f71d83773893c6fa9714d982cc7624fa IN  0x7745c2e1a84ae770c08badabc1b2a4e55a7894dc0 MATIC0.136032913905 71.810947414
0xcb064030561677835c2075410accecc578023786918a40a472a17f1d9af7523eClaim284353952022-05-17 16:23:463 days 8 hrs ago0x2114e6cd556bbd0e5ebbdbb8bbb9c99f4ff75d55 IN  0x7745c2e1a84ae770c08badabc1b2a4e55a7894dc0 MATIC0.195542343913 106.073721228
0xeffabb94db4190832c6305410579cc8ed26e65a64890968b2c3eb2b0a7550215Claim284353872022-05-17 16:23:183 days 8 hrs ago0x2114e6cd556bbd0e5ebbdbb8bbb9c99f4ff75d55 IN  0x7745c2e1a84ae770c08badabc1b2a4e55a7894dc0 MATIC0.002219194866 105.354864515
0xd552c07b3453585d9591631dd6fc5b3e5937f11d70a9b56005fc45634b8f3b8fClaim284335522022-05-17 15:13:513 days 9 hrs ago0x1b0261c3dbfe2cdcfa2c092355b4cc450eacefec IN  0x7745c2e1a84ae770c08badabc1b2a4e55a7894dc0 MATIC0.082098416448 45.257973467
0x5b638262b07a7e5ccdc0e9e42ea9dfdd47bab511c8aaf79e9585781281f63021Claim284301292022-05-17 13:07:283 days 11 hrs ago0x2807078cbe74338a787cb8a501feecd3c4390f6e IN  0x7745c2e1a84ae770c08badabc1b2a4e55a7894dc0 MATIC0.089044936288 47.955042103
0x60230ad1e38662082c9dd500614fdeec8188c61579716298605d2cf6fafaf237Claim284290572022-05-17 12:26:253 days 12 hrs ago0xbdbf66f54eb6f5d54d16a7ab1ec1e96430dd9ca7 IN  0x7745c2e1a84ae770c08badabc1b2a4e55a7894dc0 MATIC0.018212768056 31.40603514
0x83c17c7df6626f41586b8ecb5872ff1fb42d9ad5173edc243ea66be5c9880090Claim284264142022-05-17 10:53:073 days 13 hrs ago0x5ffdfd16fd554a9da00e9a1969692b64083bff39 IN  0x7745c2e1a84ae770c08badabc1b2a4e55a7894dc0 MATIC0.053830871676 31.039999998
0x395bb6c93b6ac7ba7bcec26e3878cfd87d24a35c051e19fcca4bf9efddfcabcbClaim284195652022-05-17 6:46:393 days 17 hrs ago0xf592ace1fdbf9d140a1d93eae3d0843a2602737f IN  0x7745c2e1a84ae770c08badabc1b2a4e55a7894dc0 MATIC0.051407882478 30.069999993
0xe6a973eaa0661faee22920fb1d03d6219835ed312de9bcb0cbec5ed793052a64Claim284187792022-05-17 6:19:393 days 18 hrs ago0xa8d878b15010a419d4eb3959894c8515da7aacbd IN  0x7745c2e1a84ae770c08badabc1b2a4e55a7894dc0 MATIC0.000637467835 30.263379938
0xe62fc17c97171a476ae2812583864775e33a8f56ab856b2320e414b5417b5743Claim284138392022-05-17 3:21:083 days 21 hrs ago0xb6dbfeb7a010f10badd5be9f0b6779d3749ab071 IN  0x7745c2e1a84ae770c08badabc1b2a4e55a7894dc0 MATIC0.067234296318 31.369800002
0xe6acd9698bca16c19c99506eb1cd906e7fdd7758771311a308fdee2ea1707dbaClaim284138142022-05-17 3:20:143 days 21 hrs ago0xb6dbfeb7a010f10badd5be9f0b6779d3749ab071 IN  0x7745c2e1a84ae770c08badabc1b2a4e55a7894dc0 MATIC0.000636193674 30.202889998
0x057af46f28f98aa2f7b1b3ea3272c6db3ee3edea635b6981a72da504e56b6112Claim284101312022-05-17 1:09:043 days 23 hrs ago0xb6dbfeb7a010f10badd5be9f0b6779d3749ab071 IN  0x7745c2e1a84ae770c08badabc1b2a4e55a7894dc0 MATIC0.000644855175 30.614089233
0x5c699e684da0e47113785bce24c7fb882a1f388841912762c676d72dd1f6fde6Claim284016172022-05-16 20:12:074 days 4 hrs ago0xd2f9c4da133483c954db9e537aba9073f47ec956 IN  0x7745c2e1a84ae770c08badabc1b2a4e55a7894dc0 MATIC0.115847919962 67.762895193
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
NftDistribution

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity Standard Json-Input format)

File 1 of 10 : distribution-claim.sol
//SPDX-License-Identifier: MIT

pragma solidity ^0.8.9;

import "@openzeppelin/contracts/token/ERC1155/IERC1155.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/token/ERC1155/utils/ERC1155Holder.sol";

 contract NftDistribution is Ownable, ReentrancyGuard, ERC1155Holder {

    address public admin;
    address public depositAddr;
    address public nftContract;

    struct Distribution {
        uint256 nftId;
        uint256 timestamp;
    }

    mapping(address => Distribution[]) public distributionHistory;
    address[] public receptors;
    uint256[] private idToClaim;
    uint256[] private idToBurn;

    event NftsAssigned ();
    event UserClaimed(address, uint256, uint256);
    event TransferNftsOutOfDate(uint256);

    modifier onlyAdmin () {
        require(msg.sender == admin, "Only admin can call this function");
        _;
    }

    constructor (address addr, address administrator, address depositAddress) {
        nftContract = addr;
        admin = administrator;
        depositAddr = depositAddress;
    }

    function makeDistribution (uint256 _nftId, address[] memory users) external onlyAdmin{
        require(IERC1155(nftContract).balanceOf(msg.sender, _nftId) >= users.length, "Admin does not have enough NFTs");

        for(uint256 i = 0; i < users.length; i++) {
            Distribution memory newDistribution = Distribution ({
                nftId: _nftId,
                timestamp: block.timestamp
            });
            bool inside = false;

            distributionHistory[users[i]].push(newDistribution);

            if(receptors.length > 0) {
                for(uint256 j = 0; j < receptors.length; j++) {
                    if(users[i] == receptors [j]) {
                        inside = true;
                    }
                }
                if(!inside) {
                    receptors.push(users[i]);
                }
            } else {
                receptors.push(users[i]);
            }
            
        }

        IERC1155(nftContract).safeTransferFrom(msg.sender, address(this), _nftId, users.length, "");

        emit NftsAssigned();        
    }

    
    function claim () external nonReentrant {
        Distribution[] memory myDistribution = distributionHistory[msg.sender];
        require(myDistribution.length > 0, "There is no distribution to claim");

        for (uint256 i = 0; i < myDistribution.length; i++) {
            if(myDistribution[i].timestamp + 90 days > block.timestamp) {
                idToClaim.push(myDistribution[i].nftId);
            } else {
                idToBurn.push(myDistribution[i].nftId);
            }
        }
    
        delete distributionHistory[msg.sender];

        uint256 burnt = 0;
        uint256 claimed = 0;

        for (uint256 i = 0; i < idToBurn.length; i++) {
            IERC1155(nftContract).safeTransferFrom(address(this), depositAddr, idToBurn[i], 1, "");
            burnt++;
        }

        for (uint256 i = 0; i < idToClaim.length; i++) {
            IERC1155(nftContract).safeTransferFrom(address(this), msg.sender, idToClaim[i], 1, "");
            claimed++;
        }

        while (idToBurn.length > 0) {
            idToBurn.pop();
        }

        while (idToClaim.length > 0) {
            idToClaim.pop();
        }

        
        uint256 j = 0;
        uint256 index = receptors.length;
        while((j < receptors.length) && (index == receptors.length)) {
            if(msg.sender == receptors[j]) {
                index = j;
            }
            j++;
        }

        if(index != receptors.length - 1) {
            receptors[index] = receptors[receptors.length - 1];
        }
        receptors.pop();

        emit UserClaimed(msg.sender, burnt, claimed);
    }

    function removeNftsOutOfDate () external onlyAdmin {
        require(receptors.length > 0, "There is no distribution to look for");
        bool canClaim;
        address user;
        uint256 burnt = 0;

        for (uint256 i = 0; i < receptors.length; i++) {
            canClaim = false;
            user = receptors[i];
            Distribution[] memory hisDistribution = distributionHistory[user];
            
            for(uint256 j = 0; j < hisDistribution.length; j++) {
                if(hisDistribution[j].timestamp + 90 days < block.timestamp) {
                    idToBurn.push(hisDistribution[j].nftId);
                } else {
                    canClaim = true;
                }
            }
            
            if(!canClaim) {
                delete distributionHistory[user];

                for(uint256 k = 0; k < idToBurn.length; k++) {
                    IERC1155(nftContract).safeTransferFrom(address(this), depositAddr, idToBurn[k], 1, "");
                    burnt++;
                }

                if(i != receptors.length - 1) {
                    receptors[i] = receptors[receptors.length - 1];
                }
                receptors.pop();
            }
            
            while (idToBurn.length > 0) {
                idToBurn.pop();
            }
        }
        emit TransferNftsOutOfDate (burnt);
    }
    
    
    function getReceptors () external view returns (address[] memory) {
        return receptors;
    }

    function getMyDistribution(address user) external view returns (Distribution[] memory) {
        return distributionHistory[user];
    }
}

File 2 of 10 : IERC1155.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (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 be 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 3 of 10 : ReentrancyGuard.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

File 4 of 10 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (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 Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing 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 5 of 10 : ERC1155Holder.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/utils/ERC1155Holder.sol)

pragma solidity ^0.8.0;

import "./ERC1155Receiver.sol";

/**
 * Simple implementation of `ERC1155Receiver` that will allow a contract to hold ERC1155 tokens.
 *
 * IMPORTANT: When inheriting this contract, you must include a way to use the received tokens, otherwise they will be
 * stuck.
 *
 * @dev _Available since v3.1._
 */
contract ERC1155Holder is ERC1155Receiver {
    function onERC1155Received(
        address,
        address,
        uint256,
        uint256,
        bytes memory
    ) public virtual override returns (bytes4) {
        return this.onERC1155Received.selector;
    }

    function onERC1155BatchReceived(
        address,
        address,
        uint256[] memory,
        uint256[] memory,
        bytes memory
    ) public virtual override returns (bytes4) {
        return this.onERC1155BatchReceived.selector;
    }
}

File 6 of 10 : 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 7 of 10 : 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 8 of 10 : ERC1155Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC1155/utils/ERC1155Receiver.sol)

pragma solidity ^0.8.0;

import "../IERC1155Receiver.sol";
import "../../../utils/introspection/ERC165.sol";

/**
 * @dev _Available since v3.1._
 */
abstract contract ERC1155Receiver is ERC165, IERC1155Receiver {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return interfaceId == type(IERC1155Receiver).interfaceId || super.supportsInterface(interfaceId);
    }
}

File 9 of 10 : IERC1155Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)

pragma solidity ^0.8.0;

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

/**
 * @dev _Available since v3.1._
 */
interface IERC1155Receiver is IERC165 {
    /**
     * @dev Handles the receipt of a single ERC1155 token type. This function is
     * called at the end of a `safeTransferFrom` after the balance has been updated.
     *
     * NOTE: To accept the transfer, this must return
     * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
     * (i.e. 0xf23a6e61, or its own function selector).
     *
     * @param operator The address which initiated the transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param id The ID of the token being transferred
     * @param value The amount of tokens being transferred
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
     */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external returns (bytes4);

    /**
     * @dev Handles the receipt of a multiple ERC1155 token types. This function
     * is called at the end of a `safeBatchTransferFrom` after the balances have
     * been updated.
     *
     * NOTE: To accept the transfer(s), this must return
     * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
     * (i.e. 0xbc197c81, or its own function selector).
     *
     * @param operator The address which initiated the batch transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param ids An array containing ids of each token being transferred (order and length must match values array)
     * @param values An array containing amounts of each token being transferred (order and length must match ids array)
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
     */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external returns (bytes4);
}

File 10 of 10 : 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;
    }
}

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"address","name":"administrator","type":"address"},{"internalType":"address","name":"depositAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[],"name":"NftsAssigned","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":false,"internalType":"uint256","name":"","type":"uint256"}],"name":"TransferNftsOutOfDate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"","type":"address"},{"indexed":false,"internalType":"uint256","name":"","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"","type":"uint256"}],"name":"UserClaimed","type":"event"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"depositAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"distributionHistory","outputs":[{"internalType":"uint256","name":"nftId","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getMyDistribution","outputs":[{"components":[{"internalType":"uint256","name":"nftId","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"internalType":"struct NftDistribution.Distribution[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReceptors","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nftId","type":"uint256"},{"internalType":"address[]","name":"users","type":"address[]"}],"name":"makeDistribution","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"nftContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"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":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"receptors","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeNftsOutOfDate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b5060405162001967380380620019678339810160408190526200003491620000f3565b6200003f3362000086565b60018055600480546001600160a01b039485166001600160a01b0319918216179091556002805493851693821693909317909255600380549190931691161790556200013d565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80516001600160a01b0381168114620000ee57600080fd5b919050565b6000806000606084860312156200010957600080fd5b6200011484620000d6565b92506200012460208501620000d6565b91506200013460408501620000d6565b90509250925092565b61181a806200014d6000396000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c8063a9ffb8f411610097578063f23a6e6111610066578063f23a6e611461023e578063f2fde38b1461025d578063f722eabd14610270578063f851a4401461028357600080fd5b8063a9ffb8f4146101d8578063bc197c81146101eb578063d56d229d14610223578063e187e7141461023657600080fd5b8063715018a6116100d3578063715018a61461016c57806383051de9146101745780638da5cb5b1461019f578063a396da68146101b057600080fd5b806301ffc9a714610105578063249d6bc31461012d5780634e71d92d146101425780634fb608331461014c575b600080fd5b610118610113366004611286565b610296565b60405190151581526020015b60405180910390f35b6101356102cd565b60405161012491906112b7565b61014a61032f565b005b61015f61015a366004611320565b610891565b604051610124919061133b565b61014a61091a565b61018761018236600461138a565b610980565b6040516001600160a01b039091168152602001610124565b6000546001600160a01b0316610187565b6101c36101be3660046113a3565b6109aa565b60408051928352602083019190915201610124565b61014a6101e6366004611438565b6109e6565b61020a6101f93660046115b7565b63bc197c8160e01b95945050505050565b6040516001600160e01b03199091168152602001610124565b600454610187906001600160a01b031681565b61014a610d3e565b61020a61024c366004611661565b63f23a6e6160e01b95945050505050565b61014a61026b366004611320565b611130565b600354610187906001600160a01b031681565b600254610187906001600160a01b031681565b60006001600160e01b03198216630271189760e51b14806102c757506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600680548060200260200160405190810160405280929190818152602001828054801561032557602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610307575b5050505050905090565b600260015414156103875760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064015b60405180910390fd5b600260015533600090815260056020908152604080832080548251818502810185019093528083529192909190849084015b828210156103ff578382906000526020600020906002020160405180604001604052908160008201548152602001600182015481525050815260200190600101906103b9565b50505050905060008151116104605760405162461bcd60e51b815260206004820152602160248201527f5468657265206973206e6f20646973747269627574696f6e20746f20636c61696044820152606d60f81b606482015260840161037e565b60005b815181101561051f574282828151811061047f5761047f6116c6565b6020026020010151602001516276a70061049991906116f2565b11156104d85760078282815181106104b3576104b36116c6565b602090810291909101810151518254600181018455600093845291909220015561050d565b60088282815181106104ec576104ec6116c6565b60209081029190910181015151825460018101845560009384529190922001555b806105178161170a565b915050610463565b503360009081526005602052604081206105389161124b565b60008060005b6008548110156105f857600454600354600880546001600160a01b039384169363f242432a93309391169186908110610579576105796116c6565b906000526020600020015460016040518563ffffffff1660e01b81526004016105a59493929190611725565b600060405180830381600087803b1580156105bf57600080fd5b505af11580156105d3573d6000803e3d6000fd5b5050505082806105e29061170a565b93505080806105f09061170a565b91505061053e565b5060005b6007548110156106b357600454600780546001600160a01b039092169163f242432a91309133919086908110610634576106346116c6565b906000526020600020015460016040518563ffffffff1660e01b81526004016106609493929190611725565b600060405180830381600087803b15801561067a57600080fd5b505af115801561068e573d6000803e3d6000fd5b50505050818061069d9061170a565b92505080806106ab9061170a565b9150506105fc565b505b600854156106e95760088054806106ce576106ce61175d565b600190038181906000526020600020016000905590556106b5565b6007541561071d5760078054806107025761070261175d565b600190038181906000526020600020016000905590556106e9565b6006546000905b60065482108015610736575060065481145b1561077f576006828154811061074e5761074e6116c6565b6000918252602090912001546001600160a01b031633141561076d5750805b816107778161170a565b925050610724565b60065461078e90600190611773565b811461080f57600680546107a490600190611773565b815481106107b4576107b46116c6565b600091825260209091200154600680546001600160a01b0390921691839081106107e0576107e06116c6565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b60068054806108205761082061175d565b6000828152602090819020600019908301810180546001600160a01b03191690559091019091556040805133815291820186905281018490527fad35c1096d3624ca3a1a01de0a7ff8ed832f8de3b2bd8a0a02cd8fe73aa2958f9060600160405180910390a1505060018055505050565b6001600160a01b0381166000908152600560209081526040808320805482518185028101850190935280835260609492939192909184015b8282101561090f578382906000526020600020906002020160405180604001604052908160008201548152602001600182015481525050815260200190600101906108c9565b505050509050919050565b6000546001600160a01b031633146109745760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161037e565b61097e60006111fb565b565b6006818154811061099057600080fd5b6000918252602090912001546001600160a01b0316905081565b600560205281600052604060002081815481106109c657600080fd5b600091825260209091206002909102018054600190910154909250905082565b6002546001600160a01b03163314610a105760405162461bcd60e51b815260040161037e9061178a565b805160048054604051627eeac760e11b81523392810192909252602482018590526001600160a01b03169062fdd58e9060440160206040518083038186803b158015610a5b57600080fd5b505afa158015610a6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a9391906117cb565b1015610ae15760405162461bcd60e51b815260206004820152601f60248201527f41646d696e20646f6573206e6f74206861766520656e6f756768204e46547300604482015260640161037e565b60005b8151811015610ca85760006040518060400160405280858152602001428152509050600060056000858581518110610b1e57610b1e6116c6565b6020908102919091018101516001600160a01b031682528181019290925260400160009081208054600181810183559183529183902085516002909302019182559184015191015560065415610c435760005b600654811015610be85760068181548110610b8e57610b8e6116c6565b60009182526020909120015485516001600160a01b0390911690869086908110610bba57610bba6116c6565b60200260200101516001600160a01b03161415610bd657600191505b80610be08161170a565b915050610b71565b5080610c3e576006848481518110610c0257610c026116c6565b60209081029190910181015182546001810184556000938452919092200180546001600160a01b0319166001600160a01b039092169190911790555b610c93565b6006848481518110610c5757610c576116c6565b60209081029190910181015182546001810184556000938452919092200180546001600160a01b0319166001600160a01b039092169190911790555b50508080610ca09061170a565b915050610ae4565b50600480548251604051637921219560e11b81526001600160a01b039092169263f242432a92610cdf923392309289929101611725565b600060405180830381600087803b158015610cf957600080fd5b505af1158015610d0d573d6000803e3d6000fd5b50506040517f1ed5ee34ba573d10e64e771d242d8d1860fb0a474796668556419b21aa3eef7a925060009150a15050565b6002546001600160a01b03163314610d685760405162461bcd60e51b815260040161037e9061178a565b600654610dc35760405162461bcd60e51b8152602060048201526024808201527f5468657265206973206e6f20646973747269627574696f6e20746f206c6f6f6b604482015263103337b960e11b606482015260840161037e565b6000806000805b6006548110156110f7576000935060068181548110610deb57610deb6116c6565b60009182526020808320909101546001600160a01b031680835260058252604080842080548251818602810186019093528083529297509092909190849084015b82821015610e7257838290600052602060002090600202016040518060400160405290816000820154815260200160018201548152505081526020019060010190610e2c565b50505050905060005b8151811015610f075742828281518110610e9757610e976116c6565b6020026020010151602001516276a700610eb191906116f2565b1015610ef0576008828281518110610ecb57610ecb6116c6565b6020908102919091018101515182546001810184556000938452919092200155610ef5565b600195505b80610eff8161170a565b915050610e7b565b50846110b0576001600160a01b0384166000908152600560205260408120610f2e9161124b565b60005b600854811015610feb57600454600354600880546001600160a01b039384169363f242432a93309391169186908110610f6c57610f6c6116c6565b906000526020600020015460016040518563ffffffff1660e01b8152600401610f989493929190611725565b600060405180830381600087803b158015610fb257600080fd5b505af1158015610fc6573d6000803e3d6000fd5b505050508380610fd59061170a565b9450508080610fe39061170a565b915050610f31565b50600654610ffb90600190611773565b821461107c576006805461101190600190611773565b81548110611021576110216116c6565b600091825260209091200154600680546001600160a01b03909216918490811061104d5761104d6116c6565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b600680548061108d5761108d61175d565b600082815260209020810160001990810180546001600160a01b03191690550190555b600854156110e45760088054806110c9576110c961175d565b600190038181906000526020600020016000905590556110b0565b50806110ef8161170a565b915050610dca565b506040518181527f05d098d6754a85892b1527032798bce42f830d139fa7d6b3842831fbbf7d709a9060200160405180910390a1505050565b6000546001600160a01b0316331461118a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161037e565b6001600160a01b0381166111ef5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161037e565b6111f8816111fb565b50565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b50805460008255600202906000526020600020908101906111f891905b808211156112825760008082556001820155600201611268565b5090565b60006020828403121561129857600080fd5b81356001600160e01b0319811681146112b057600080fd5b9392505050565b6020808252825182820181905260009190848201906040850190845b818110156112f85783516001600160a01b0316835292840192918401916001016112d3565b50909695505050505050565b80356001600160a01b038116811461131b57600080fd5b919050565b60006020828403121561133257600080fd5b6112b082611304565b602080825282518282018190526000919060409081850190868401855b8281101561137d57815180518552860151868501529284019290850190600101611358565b5091979650505050505050565b60006020828403121561139c57600080fd5b5035919050565b600080604083850312156113b657600080fd5b6113bf83611304565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561140c5761140c6113cd565b604052919050565b600067ffffffffffffffff82111561142e5761142e6113cd565b5060051b60200190565b6000806040838503121561144b57600080fd5b8235915060208084013567ffffffffffffffff81111561146a57600080fd5b8401601f8101861361147b57600080fd5b803561148e61148982611414565b6113e3565b81815260059190911b820183019083810190888311156114ad57600080fd5b928401925b828410156114d2576114c384611304565b825292840192908401906114b2565b80955050505050509250929050565b600082601f8301126114f257600080fd5b8135602061150261148983611414565b82815260059290921b8401810191818101908684111561152157600080fd5b8286015b8481101561153c5780358352918301918301611525565b509695505050505050565b600082601f83011261155857600080fd5b813567ffffffffffffffff811115611572576115726113cd565b611585601f8201601f19166020016113e3565b81815284602083860101111561159a57600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a086880312156115cf57600080fd5b6115d886611304565b94506115e660208701611304565b9350604086013567ffffffffffffffff8082111561160357600080fd5b61160f89838a016114e1565b9450606088013591508082111561162557600080fd5b61163189838a016114e1565b9350608088013591508082111561164757600080fd5b5061165488828901611547565b9150509295509295909350565b600080600080600060a0868803121561167957600080fd5b61168286611304565b945061169060208701611304565b93506040860135925060608601359150608086013567ffffffffffffffff8111156116ba57600080fd5b61165488828901611547565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60008219821115611705576117056116dc565b500190565b600060001982141561171e5761171e6116dc565b5060010190565b6001600160a01b0394851681529290931660208301526040820152606081019190915260a06080820181905260009082015260c00190565b634e487b7160e01b600052603160045260246000fd5b600082821015611785576117856116dc565b500390565b60208082526021908201527f4f6e6c792061646d696e2063616e2063616c6c20746869732066756e6374696f6040820152603760f91b606082015260800190565b6000602082840312156117dd57600080fd5b505191905056fea264697066735822122070c75d98ce4624a227742ed4f4a3db8d60318760e875f6039c3bda67c7dc8a7e64736f6c634300080900330000000000000000000000002953399124f0cbb46d2cbacd8a89cf05999749630000000000000000000000008c6c57ef002a25754b231ce0768399eee2e4cb0c000000000000000000000000034d0ae6dd05621f8e918a011f92f5535832971c

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

0000000000000000000000002953399124f0cbb46d2cbacd8a89cf05999749630000000000000000000000008c6c57ef002a25754b231ce0768399eee2e4cb0c000000000000000000000000034d0ae6dd05621f8e918a011f92f5535832971c

-----Decoded View---------------
Arg [0] : addr (address): 0x2953399124f0cbb46d2cbacd8a89cf0599974963
Arg [1] : administrator (address): 0x8c6c57ef002a25754b231ce0768399eee2e4cb0c
Arg [2] : depositAddress (address): 0x034d0ae6dd05621f8e918a011f92f5535832971c

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000002953399124f0cbb46d2cbacd8a89cf0599974963
Arg [1] : 0000000000000000000000008c6c57ef002a25754b231ce0768399eee2e4cb0c
Arg [2] : 000000000000000000000000034d0ae6dd05621f8e918a011f92f5535832971c


Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.