DevStation / LaunchKit / Templates / Membership Pass

Membership Pass

A time-limited membership pass. The owner issues passes that expire, and expiry extends rather than resets when renewed early.

Deploy This Template
MembershipPass.sol
solidity
1// SPDX-License-Identifier: MIT
2pragma solidity ^0.8.20;
3 
4contract MembershipPass {
5 string public name;
6 string public symbol;
7 address public owner;
8 uint256 public durationSeconds;
9 
10 mapping(address => uint256) public expiresAt;
11 
12 event PassIssued(address indexed holder, uint256 expiresAt);
13 event PassRevoked(address indexed holder);
14 event OwnerChanged(address indexed newOwner);
15 
16 constructor(string memory name_, string memory symbol_, uint256 durationSeconds_, address initialOwner_) {
17 require(initialOwner_ != address(0), "ZERO_OWNER");
18 require(durationSeconds_ > 0, "ZERO_DURATION");
19 name = name_;
20 symbol = symbol_;
21 durationSeconds = durationSeconds_;
22 owner = initialOwner_;
23 }
24 
25 modifier onlyOwner() {
26 require(msg.sender == owner, "NOT_OWNER");
27 _;
28 }
29 
30 function issue(address holder) external onlyOwner returns (uint256) {
31 require(holder != address(0), "ZERO_HOLDER");
32 uint256 base = expiresAt[holder] > block.timestamp ? expiresAt[holder] : block.timestamp;
33 uint256 newExpiry = base + durationSeconds;
34 expiresAt[holder] = newExpiry;
35 emit PassIssued(holder, newExpiry);
36 return newExpiry;
37 }
38 
39 function revoke(address holder) external onlyOwner {
40 expiresAt[holder] = 0;
41 emit PassRevoked(holder);
42 }
43 
44 function isValid(address holder) external view returns (bool) {
45 return expiresAt[holder] > block.timestamp;
46 }
47 
48 function transferOwnership(address newOwner) external onlyOwner {
49 require(newOwner != address(0), "ZERO_OWNER");
50 owner = newOwner;
51 emit OwnerChanged(newOwner);
52 }
53}
54 
DevStation
Loading console…