Robinhood MainnetChain ID: 4663
Contract detail

ELEToken

ELEToken is a verified Robinhood Chain smart contract at 0x9545ea53…fbba4da2 with 1 indexed transactions.

Address type
Smart contract
Transactions
1
First indexed block
#28547932
Latest indexed block
#28548391
Emitted events
22
Verification
Verified
Compiler
v0.8.26+commit.8a97fa7a
Verification match
partial
Creation transaction
0xd9c0beb6…41ee261d
Created at block
#28547932
Language
solidity
EVM version
cancun
License
none
Compiler optimization
Enabled · 10000 runs
Related activity

Transactions

Verified contract

Contract source code

// SPDX-License-Identifier: MIT
pragma solidity 0.8.26;

import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import {ERC20Permit} from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol";
import {OneTimeConfig} from "./base/OneTimeConfig.sol";

/// @title Self-Backing Stair Token
/// @notice Standard non-rebasing token with an immutable supply ceiling and one-time monetary authorities.
contract ELEToken is ERC20, ERC20Permit, OneTimeConfig {
    error Unauthorized();
    error SupplyCapExceeded();
    error InvalidSupplyConfiguration();

    uint256 public immutable maxSupply;
    address public monetaryController;
    address public reserveVault;

    event MonetaryAuthorityConfigured(address indexed controller, address indexed reserveVault);

    constructor(
        address bootstrapAuthority_,
        address genesisRecipient,
        uint256 genesisSupply,
        uint256 maxSupply_
    )
        ERC20("Self-Backing Staircase", "STAIR")
        ERC20Permit("Self-Backing Staircase")
        OneTimeConfig(bootstrapAuthority_)
    {
        if (genesisRecipient == address(0)) {
            revert ZeroAddress();
        }
        if (genesisSupply == 0 || maxSupply_ < genesisSupply) revert InvalidSupplyConfiguration();
        maxSupply = maxSupply_;
        _mint(genesisRecipient, genesisSupply);
    }

    function configureMonetaryAuthority(address controller, address reserve)
        external
        onlyBootstrap
    {
        if (controller == address(0) || reserve == address(0)) revert ZeroAddress();
        monetaryController = controller;
        reserveVault = reserve;
        _finishConfiguration();
        emit MonetaryAuthorityConfigured(controller, reserve);
    }

    function mint(address to, uint256 amount) external {
        if (msg.sender != monetaryController) revert Unauthorized();
        if (to == address(0)) revert ZeroAddress();
        if (totalSupply() + amount > maxSupply) revert SupplyCapExceeded();
        _mint(to, amount);
    }

    function burnReserve(uint256 amount) external {
        if (msg.sender != reserveVault) revert Unauthorized();
        _burn(msg.sender, amount);
    }
}