账户
0xa3...b492
0xa3...B492

0xa3...B492

$500
此合同的源代码已经过验证!
合同元数据
编译器
0.8.22+commit.4fc1097e
语言
Solidity
合同源代码
文件 1 的 1:DRBT_Membership.sol
// SPDX-License-Identifier: MIT

//Contract to manage DRBT Memberships

pragma solidity 0.8.22;

contract DRBT_Membership {
    address public owner;
    struct MembershipOption {
        uint256 ethAmount;
        uint256 validityPeriod;
    }
    mapping(uint256 => MembershipOption) public membershipOptions; // Option ID to MembershipOption
    mapping(address => mapping(uint256 => uint256)) public userExpirations; // User address to (Option ID to Expiration Timestamp)
    uint256 public numberOfOptions;

    constructor() {
        owner = msg.sender;
        // Initialize with default options
        membershipOptions[1] = MembershipOption(0.15 ether, 31 days);
        membershipOptions[2] = MembershipOption(0.05 ether, 31 days);
        membershipOptions[3] = MembershipOption(0.2 ether, 31 days);
        membershipOptions[4] = MembershipOption(0.07 ether, 31 days);
        membershipOptions[5] = MembershipOption(0.05 ether, 3 days);
        numberOfOptions = 5;
    }

    modifier onlyOwner() {
        require(msg.sender == owner, "Only the owner can perform this action");
        _;
    }

    // Function buy a membership
    function buyMembership(uint256 optionId) external payable {
        require(optionId > 0 && optionId <= numberOfOptions, "Invalid option ID");
        MembershipOption memory option = membershipOptions[optionId];
        require(msg.value == option.ethAmount, "Incorrect ETH amount sent");

        uint256 expiration = userExpirations[msg.sender][optionId];
        if (expiration == 0 || expiration < block.timestamp) {
            userExpirations[msg.sender][optionId] = block.timestamp + option.validityPeriod;
        } else {
            userExpirations[msg.sender][optionId] += option.validityPeriod;
        }
    }

    // Function to check memberships for a wallet
    function checkMembership(address userAddress)
        external
        view
        returns (uint256[] memory, uint256[] memory)
    {
        uint256[] memory activeOptionIds = new uint256[](numberOfOptions);
        uint256[] memory expirationTimestamps = new uint256[](numberOfOptions);
        uint256 count = 0;

        for (uint256 i = 1; i <= numberOfOptions; i++) {
            if (userExpirations[userAddress][i] > block.timestamp) {
                activeOptionIds[count] = i;
                expirationTimestamps[count] = userExpirations[userAddress][i];
                count++;
            }
        }

        uint256[] memory validOptionIds = new uint256[](count);
        uint256[] memory validExpirations = new uint256[](count);
        for (uint256 j = 0; j < count; j++) {
            validOptionIds[j] = activeOptionIds[j];
            validExpirations[j] = expirationTimestamps[j];
        }

        return (validOptionIds, validExpirations);
    }

    // Function to set a membership option
    function setMembershipOption(uint256 optionId, uint256 ethAmount, uint256 validityPeriod) external onlyOwner {
        require(optionId > 0, "Invalid option ID");
        membershipOptions[optionId] = MembershipOption(ethAmount, validityPeriod);
        if (optionId > numberOfOptions) {
            numberOfOptions = optionId;
        }
    }

    // Function to manually add time to an option for a given wallet
    function addTimeToMembership(address userAddress, uint256 optionId, uint256 additionalTime) external onlyOwner {
        require(membershipOptions[optionId].validityPeriod > 0, "Option does not exist");

        uint256 currentExpiration = userExpirations[userAddress][optionId];
        if (currentExpiration == 0 || currentExpiration < block.timestamp) {
            userExpirations[userAddress][optionId] = block.timestamp + additionalTime;
        } else {
            userExpirations[userAddress][optionId] += additionalTime;
        }
    }

    function withdraw() external onlyOwner {
        payable(owner).transfer(address(this).balance);
    }
}
设置
{
  "compilationTarget": {
    "DRBT_Membership.sol": "DRBT_Membership"
  },
  "evmVersion": "shanghai",
  "libraries": {},
  "metadata": {
    "bytecodeHash": "ipfs"
  },
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "remappings": []
}
ABI
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"uint256","name":"optionId","type":"uint256"},{"internalType":"uint256","name":"additionalTime","type":"uint256"}],"name":"addTimeToMembership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"optionId","type":"uint256"}],"name":"buyMembership","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"}],"name":"checkMembership","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"membershipOptions","outputs":[{"internalType":"uint256","name":"ethAmount","type":"uint256"},{"internalType":"uint256","name":"validityPeriod","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numberOfOptions","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"optionId","type":"uint256"},{"internalType":"uint256","name":"ethAmount","type":"uint256"},{"internalType":"uint256","name":"validityPeriod","type":"uint256"}],"name":"setMembershipOption","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"userExpirations","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]