typestar

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

  1. A Member struct tracks joining, dues, and standing.
  2. onlyMember gates the actions behind a custom error.
  3. Standing for steward checks dues against the chain clock.

Keywords and builtins used here

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.

Type this snippet

Step 1 of 3 in Encore, step 26 of 28 in Language basics.

← Previous Next →