Cycle

The Scriptorium

Smart Assembly code templates and tools for on-chain development in Eve Frontier.

← Back to Example Code

Tribe-Only Gate Access

Gate Mechanics

A Smart Gate that restricts passage to members of an allowlist. The owner can add or remove addresses. Useful for tribe-controlled gates where only known pilots should pass.

gateallowlisttribeaccess-control
tribe-only-gate-access.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;

import { SmartGateBase } from "@eveworld/smart-gate/SmartGateBase.sol";

/**
 * @title TribeGate
 * @notice Gate restricted to an allowlist of tribe member addresses.
 */
contract TribeGate is SmartGateBase {
    address public owner;
    mapping(address => bool) public allowed;
    uint256 public memberCount;

    event MemberAdded(address indexed member);
    event MemberRemoved(address indexed member);

    constructor() {
        owner = msg.sender;
        allowed[msg.sender] = true;
        memberCount = 1;
    }

    modifier onlyOwner() {
        require(msg.sender == owner, "Not gate owner");
        _;
    }

    function addMember(address _member) external onlyOwner {
        require(!allowed[_member], "Already a member");
        allowed[_member] = true;
        memberCount++;
        emit MemberAdded(_member);
    }

    function removeMember(address _member) external onlyOwner {
        require(_member != owner, "Cannot remove owner");
        require(allowed[_member], "Not a member");
        allowed[_member] = false;
        memberCount--;
        emit MemberRemoved(_member);
    }

    function addMembers(address[] calldata _members) external onlyOwner {
        for (uint256 i = 0; i < _members.length; i++) {
            if (!allowed[_members[i]]) {
                allowed[_members[i]] = true;
                memberCount++;
                emit MemberAdded(_members[i]);
            }
        }
    }

    function canJump(
        address caller,
        uint256 /* shipId */
    ) external view override returns (bool) {
        return allowed[caller];
    }
}