coop_membership.sol en Solidity
El padrón de la cooperativa: entrar, pagar cuotas, postularse.
// 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;
}
}
Cómo funciona
- Un struct
Memberregistra ingreso, cuotas y estado. onlyMembercierra las acciones tras un error tipado.- Postularse revisa las cuotas contra el reloj de la cadena.
Palabras clave y builtins usados aquí
addressboolconstructorcontractemiteventexternalfunctionifinternalmappingmemorymodifierpublicrequirestructtrueuint256uint64
El intento, en números
- Líneas
- 57
- Caracteres a escribir
- 1298
- Tokens
- 257
- Ritmo de tres estrellas
- 55 tpm
Al ritmo de tres estrellas de 55 tokens por minuto, este intento toma unos 280 segundos.
Paso 1 de 3 en Bis; paso 26 de 28 en Fundamentos del lenguaje.