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
- Token tracker
- Self-Backing Staircase (STAIR)
- 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
| Transaction | Block | From | To | Value (wei) |
|---|---|---|---|---|
| 0x697087fa…36d5e274 | #28548391 | 0x2e1c4bd1…822329b8 | 0x9545ea53…fbba4da2 | 0 |
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);
}
}