coop_membership.sol in Solidity
The cooperative roll: join, pay dues, stand for steward.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;
// The cooperative roll: join, pay dues, stand for steward.
contract CoopMembership {
struct Member {
uint64 joinedAt;
uint64 duesPaidThrough;
bool active;
}
address public steward;
uint256 public memberCount;
mapping(address => Member) public members;
event Joined(address indexed who);
event DuesPaid(address indexed who, uint64 paidThrough);
event StewardChanged(address indexed from, address indexed to);
error NotMember();
error DuesLapsed(uint64 paidThrough);
modifier onlyMember() {
if (!members[msg.sender].active) revert NotMember();
_;
}
constructor() {
steward = msg.sender;
_join(msg.sender);
}
function join() external {
require(!members[msg.sender].active, "already in");
_join(msg.sender);
}
function _join(address who) internal {
members[who] = Member(uint64(block.timestamp), 0, true);
memberCount += 1;
emit Joined(who);
}
function payDues(uint64 throughDate) external onlyMember {
members[msg.sender].duesPaidThrough = throughDate;
emit DuesPaid(msg.sender, throughDate);
}
function standForSteward() external onlyMember {
Member memory m = members[msg.sender];
if (m.duesPaidThrough < block.timestamp) {
revert DuesLapsed(m.duesPaidThrough);
}
emit StewardChanged(steward, msg.sender);
steward = msg.sender;
}
}
How it works
- A
Memberstruct tracks joining, dues, and standing. onlyMembergates the actions behind a custom error.- Standing for steward checks dues against the chain clock.
Keywords and builtins used here
addressboolconstructorcontractemiteventexternalfunctionifinternalmappingmemorymodifierpublicrequirestructtrueuint256uint64
The run, in numbers
- Lines
- 57
- Characters to type
- 1298
- Tokens
- 257
- Three-star pace
- 55 tpm
At the three-star pace of 55 tokens a minute, this run takes about 280 seconds.
Step 1 of 3 in Encore, step 26 of 28 in Language basics.