ERC-20
Overview
Max Total Supply
15,541,102,236.829831109223792711 STTX
Holders
76
Market
Price
$0.00 @ 0.000000 S
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Loading...
Loading
Loading...
Loading
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
STTX
Compiler Version
v0.8.24+commit.e11b9ed9
Optimization Enabled:
No with 200 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT /* ___________________________________ ___ / _____/\__ ___/\__ ___/\ \/ / \_____ \ | | | | \ / / \ | | | | / \ /_______ / |____| |____| /___/\ \ \/ \_/ */ pragma solidity >=0.8.24 <0.9.0; import {Context} from "./abstract/Context.sol"; import {Ownable} from "./abstract/Ownable.sol"; import {IERC20Errors} from "./interface/IERC20Errors.sol"; import {IERC20TokenRebase} from "./interface/IERC20TokenRebase.sol"; /** * @title STTX Token * @dev Advanced rebase token with dynamic supply management * @notice Elastic supply token with configurable rebase mechanics */ contract STTX is Context, Ownable, IERC20TokenRebase, IERC20Errors { /*////////////////////////////////////////////////////////////// TOKEN METADATA //////////////////////////////////////////////////////////////*/ /// @notice Token name string private _name; /// @notice Token symbol string private _symbol; /// @notice Token decimal places uint8 private immutable _decimals; /*////////////////////////////////////////////////////////////// SUPPLY MANAGEMENT //////////////////////////////////////////////////////////////*/ /// @notice Maximum possible token supply /// @dev Prevents unlimited token creation uint256 private immutable _maxSupply; /// @notice Current total token supply uint256 private _totalSupply; /// @notice Total supply in normal mode /// @dev Scaled by normalDivisor uint256 private _normalSupply; /// @notice Total supply in safe mode /// @dev Scaled by SAFE_DIVISOR uint256 private _safeSupply; /// @notice Remaining supply that can be burned uint256 public maxSupplyBurned; /// @notice Maximum rebased supply uint256 public maxSupplyRebased; /// @notice Next scheduled rebase timestamp uint256 public nextRebaseTime; /// @notice Divisor for normal balance calculations uint256 public normalDivisor = 1e8; /// @notice Rebase percentage in basis points uint256 public rebaseBasisPoints = 21; /// @notice Interval between rebase operations uint256 public rebaseInterval = 21 minutes; /*////////////////////////////////////////////////////////////// REBASE CONSTANTS //////////////////////////////////////////////////////////////*/ /// @notice Minimum allowed rebase interval uint256 public constant MIN_REBASE_INTERVAL = 21 minutes; /// @notice Maximum allowed rebase interval uint256 public constant MAX_REBASE_INTERVAL = 21 days; /// @notice Maximum number of intervals processed in a single rebase uint256 public constant MAX_INTERVALS_PER_REBASE = 7; /// @notice Maximum allowed rebase basis points uint256 public constant MAX_REBASE_BASIS_POINTS = 21; /// @notice Maximum allowed normal divisor uint256 public constant MAX_NORMAL_DIVISOR = 1e42; /// @notice Fixed divisor for safe mode balances uint256 public constant SAFE_DIVISOR = 1e8; /// @notice Precision constant for calculations with 10,000 as the base unit uint256 public constant TENK_PRECISION = 10_000; /*////////////////////////////////////////////////////////////// PROTOCOL ADDRESSES //////////////////////////////////////////////////////////////*/ /// @notice Address responsible for floor price operations address public floor; /// @notice Address authorized to mint tokens address public minter; /*////////////////////////////////////////////////////////////// USER STATE TRACKING //////////////////////////////////////////////////////////////*/ /// @notice User token balances /// @dev Balances are scaled based on mode (normal/safe) mapping(address => uint256) private _balances; /// @notice Token spending allowances /// @dev Nested mapping of owner → spender → allowance mapping(address => mapping(address spender => uint256)) private _allowances; /// @notice Tracks addresses in safe mode mapping(address => bool) private _safes; /*////////////////////////////////////////////////////////////// EVENTS //////////////////////////////////////////////////////////////*/ /// @notice Emitted when rebase basis points are changed event RebaseBasisPointsChanged(uint256 rebaseBasisPoints); /// @notice Emitted when rebase interval is modified event RebaseIntervalChanged(uint256 rebaseInterval); /// @notice Emitted when tokens are toasted (burned) event Toast(address indexed toaster, uint256 value, uint256 maxSupply); /// @notice Emitted when a safe is created for an address event SafeCreated(address indexed safe); /// @notice Emitted when a safe is destroyed event SafeDestroyed(address indexed safe); /// @notice Emitted when the divisor is updated during rebase event DivisorUpdated(uint256 newDivisor); /*////////////////////////////////////////////////////////////// CUSTOM ERRORS //////////////////////////////////////////////////////////////*/ /// @notice Thrown when a zero address is provided error ZeroAddress(); /// @notice Thrown when an operation is attempted on a non-safe address error NotASafe(); /// @notice Thrown when attempting to create a safe for an existing safe error AlreadyASafe(); /// @notice Thrown when rebase interval is below minimum error RebaseIntervalBelowLimit(); /// @notice Thrown when rebase interval exceeds maximum error RebaseIntervalAboveLimit(); /// @notice Thrown when rebase basis points exceed maximum error RebaseBasisPointsAboveLimit(); /// @notice Thrown when max supply would be exceeded error MaxSupplyReached(); /// @notice Thrown when minter is already set error MinterAlreadySet(); /// @notice Thrown when floor address is already set error FloorAlreadySet(); /** * @notice Access control modifier */ modifier onlyMinter() { if (address(minter) != _msgSender()) { revert UnauthorizedAccount(_msgSender()); } _; } /** * @notice Access control modifier */ modifier onlyFloor() { if (address(floor) != _msgSender()) { revert UnauthorizedAccount(_msgSender()); } _; } /*////////////////////////////////////////////////////////////// CONSTRUCTOR //////////////////////////////////////////////////////////////*/ /** * @notice Initializes the STTX token * @param name_ Token name * @param symbol_ Token symbol * @param decimals_ Token decimal places * @param maxSupply_ Maximum token supply * * @dev Sets initial token configuration and prepares first rebase * * Requirements: * · Non-zero token metadata * * Effects: * · Sets token metadata * · Initializes supply tracking * · Sets first rebase time */ constructor( string memory name_, string memory symbol_, uint8 decimals_, uint256 maxSupply_ ) { _name = name_; _symbol = symbol_; _decimals = decimals_; _maxSupply = maxSupply_; maxSupplyBurned = maxSupply_; maxSupplyRebased = maxSupply_; _setNextRebaseTime(); } /*////////////////////////////////////////////////////////////// CONFIGURATION FUNCTIONS //////////////////////////////////////////////////////////////*/ /** * @notice Sets the minter address * @param minter_ Address authorized to mint tokens * * Requirements: * · Only callable by owner * · Non-zero address * · Minter not previously set * * Effects: * · Sets minter address */ function setMinter(address minter_) external onlyOwner { if (minter != address(0)) revert MinterAlreadySet(); _ensureNonzeroAddress(minter_); minter = minter_; } /** * @notice Sets the floor address * @param floor_ Address responsible for floor operations * * Requirements: * · Only callable by owner * · Non-zero address * · Floor not previously set * * Effects: * · Sets floor address */ function setFloor(address floor_) external onlyOwner { if (floor != address(0)) revert FloorAlreadySet(); _ensureNonzeroAddress(floor_); floor = floor_; } /*////////////////////////////////////////////////////////////// CORE TOKEN OPERATIONS //////////////////////////////////////////////////////////////*/ /** * @notice Mints new tokens * @param to Recipient address * @param value Amount of tokens to mint * * Requirements: * · Only callable by minter * · Within max supply limit * * Effects: * · Increases total supply * · Increases recipient balance */ function mint(address to, uint256 value) external onlyMinter { if (_maxSupply != 0 && _totalSupply + value > _maxSupply) { revert MaxSupplyReached(); } if (to == address(0)) revert ERC20InvalidReceiver(address(0)); _update(address(0), to, value); } /** * @notice Burns tokens * @param from Address to burn tokens from * @param value Amount of tokens to burn * * Requirements: * · Only callable by floor address * * Effects: * · Decreases total supply * · Decreases sender balance * · Updates max supply burned */ function burn(address from, uint256 value) external onlyFloor { maxSupplyBurned -= value; emit Toast(_msgSender(), value, maxSupplyBurned); if (from == address(0)) revert ERC20InvalidSender(address(0)); _update(from, address(0), value); } /** * @notice Triggers a token rebase * @dev Adjusts token supply based on configured parameters */ function rebase() external { _rebase(); } // Safe management functions function createSafe(address addr) external onlyOwner { if (_safes[addr]) revert AlreadyASafe(); _safes[addr] = true; uint256 balance = _balances[addr]; _normalSupply -= balance; uint256 safeBalance = (balance * SAFE_DIVISOR) / normalDivisor; _balances[addr] = safeBalance; _safeSupply += safeBalance; emit SafeCreated(addr); } function destroySafe(address addr) external onlyOwner { if (!_safes[addr]) revert NotASafe(); _safes[addr] = false; uint256 balance = _balances[addr]; _safeSupply -= balance; uint256 normalBalance = (balance * normalDivisor) / SAFE_DIVISOR; _balances[addr] = normalBalance; _normalSupply += normalBalance; emit SafeDestroyed(addr); } // Configuration functions function setRebaseConfig( uint256 rebaseInterval_, uint256 rebaseBasisPoints_ ) external onlyOwner { if (rebaseInterval_ < MIN_REBASE_INTERVAL) revert RebaseIntervalBelowLimit(); if (rebaseInterval_ > MAX_REBASE_INTERVAL) revert RebaseIntervalAboveLimit(); if (rebaseBasisPoints_ > MAX_REBASE_BASIS_POINTS) revert RebaseBasisPointsAboveLimit(); rebaseInterval = rebaseInterval_; rebaseBasisPoints = rebaseBasisPoints_; emit RebaseIntervalChanged(rebaseInterval); emit RebaseBasisPointsChanged(rebaseBasisPoints); } // Standard ERC20 functions function transfer(address to, uint256 value) external returns (bool) { address owner = _msgSender(); _transfer(owner, to, value); return true; } function approve(address spender, uint256 value) external returns (bool) { address owner = _msgSender(); _approve(owner, spender, value); return true; } function transferFrom( address from, address to, uint256 value ) external returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, value); _transfer(from, to, value); return true; } // View functions function name() external view returns (string memory) { return _name; } function symbol() external view returns (string memory) { return _symbol; } function decimals() external view returns (uint8) { return _decimals; } function balanceOf(address addr) external view returns (uint256) { if (_safes[addr]) { return _balances[addr] / SAFE_DIVISOR; } return _balances[addr] / normalDivisor; } function isSafe(address addr) external view returns (bool) { return _safes[addr]; } function maxSupply() external view returns (uint256) { return _maxSupply; } function totalSupply() external view returns (uint256) { return _totalSupply; } function normalSupply() public view returns (uint256) { return _normalSupply / normalDivisor; } function safeSupply() public view returns (uint256) { return _safeSupply / SAFE_DIVISOR; } function totalSupplyRebased() public view returns (uint256) { return normalSupply() + safeSupply(); } function allowance( address owner, address spender ) public view returns (uint256) { return _allowances[owner][spender]; } // Private functions function _transfer(address from, address to, uint256 value) private { if (from == address(0)) revert ERC20InvalidSender(address(0)); if (to == address(0)) revert ERC20InvalidReceiver(address(0)); _update(from, to, value); _rebase(); } function _increaseBalance(address to, uint256 value) private { if (_safes[to]) { uint256 safeValue = value * SAFE_DIVISOR; _balances[to] += safeValue; _safeSupply += safeValue; } else { uint256 normalValue = value * normalDivisor; _balances[to] += normalValue; _normalSupply += normalValue; } } function _update(address from, address to, uint256 value) private { if (from == address(0)) { _totalSupply += value; } else { uint256 fromBalance = _balances[from]; uint256 normalizedValue; if (_safes[from]) { normalizedValue = value * SAFE_DIVISOR; if (fromBalance < normalizedValue) { revert ERC20InsufficientBalance( from, fromBalance / SAFE_DIVISOR, value ); } _safeSupply -= normalizedValue; } else { normalizedValue = value * normalDivisor; if (fromBalance < normalizedValue) { revert ERC20InsufficientBalance( from, fromBalance / normalDivisor, value ); } _normalSupply -= normalizedValue; } unchecked { _balances[from] = fromBalance - normalizedValue; } } if (to == address(0)) { unchecked { _totalSupply -= value; } } else { unchecked { _increaseBalance(to, value); } } emit Transfer(from, to, value); } function _approve(address owner, address spender, uint256 value) private { _approve(owner, spender, value, true); } function _approve( address owner, address spender, uint256 value, bool emitEvent ) private { if (owner == address(0)) revert ERC20InvalidApprover(address(0)); if (spender == address(0)) revert ERC20InvalidSpender(address(0)); _allowances[owner][spender] = value; if (emitEvent) { emit Approval(owner, spender, value); } } function _spendAllowance( address owner, address spender, uint256 value ) private { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { if (currentAllowance < value) { revert ERC20InsufficientAllowance( spender, currentAllowance, value ); } unchecked { _approve(owner, spender, currentAllowance - value, false); } } } function _rebase() private { if (block.timestamp < nextRebaseTime) return; uint256 intervals = (block.timestamp - nextRebaseTime) / rebaseInterval + 1; if (intervals > MAX_INTERVALS_PER_REBASE) { intervals = MAX_INTERVALS_PER_REBASE; } if (rebaseBasisPoints == 0) return; uint256 multiplier = (TENK_PRECISION + rebaseBasisPoints) ** intervals; uint256 divider = TENK_PRECISION ** intervals; uint256 nextDivisor = (normalDivisor * multiplier) / divider; if (nextDivisor > MAX_NORMAL_DIVISOR) return; _setNextRebaseTime(); normalDivisor = nextDivisor; maxSupplyRebased = maxSupplyBurned - (_totalSupply - totalSupplyRebased()); emit DivisorUpdated(nextDivisor); } function _setNextRebaseTime() private { uint256 roundedTime = (block.timestamp / rebaseInterval) * rebaseInterval; nextRebaseTime = roundedTime + rebaseInterval; } // Validates that an address is not zero function _ensureNonzeroAddress(address addr) private pure { if (addr == address(0)) { revert ZeroAddress(); } } }
// SPDX-License-Identifier: MIT pragma solidity >=0.8.24 <0.9.0; /** * @title Context * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, as when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * @notice This contract is used through inheritance. It will make available the * modifier `_msgSender()`, which can be used to reference the account that * called a function within an implementing contract. */ abstract contract Context { /*////////////////////////////////////////////////////////////// INTERNAL FUNCTIONS //////////////////////////////////////////////////////////////*/ /** * @notice Gets the sender of the current call * @dev Provides a way to retrieve the message sender that supports meta-transactions * @return Sender address (msg.sender in the base implementation) */ function _msgSender() internal view virtual returns (address) { return msg.sender; } /** * @notice Gets the complete calldata of the current call * @dev Provides a way to retrieve the message data that supports meta-transactions * @return Complete calldata bytes */ function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } /** * @notice Gets the length of any context-specific suffix in the message data * @dev Used in meta-transaction implementations to account for additional data * @return Length of the context suffix (0 in the base implementation) */ function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } }
// SPDX-License-Identifier: MIT pragma solidity >=0.8.24 <0.9.0; import {Context} from "./Context.sol"; /** * @title Ownable * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * @notice By default, the owner account will be the one that deploys the contract. * This can later be changed with {transferOwnership} and {renounceOwnership}. */ abstract contract Ownable is Context { /*////////////////////////////////////////////////////////////// STATE VARIABLES //////////////////////////////////////////////////////////////*/ /// @notice Address of the current owner address private _owner; /*////////////////////////////////////////////////////////////// EVENTS //////////////////////////////////////////////////////////////*/ /// @notice Emitted when ownership is transferred event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); /*////////////////////////////////////////////////////////////// CUSTOM ERRORS //////////////////////////////////////////////////////////////*/ /// @notice Thrown when non-owner tries to call owner-only function error UnauthorizedAccount(address account); /// @notice Thrown when trying to transfer ownership to invalid address error InvalidOwner(address owner); /*////////////////////////////////////////////////////////////// MODIFIERS //////////////////////////////////////////////////////////////*/ /** * @dev Throws if called by any account other than the owner */ modifier onlyOwner() { _checkOwner(); _; } /*////////////////////////////////////////////////////////////// CONSTRUCTOR //////////////////////////////////////////////////////////////*/ /** * @dev Initializes the contract setting the deployer as the initial owner */ constructor() { _transferOwnership(_msgSender()); } /*////////////////////////////////////////////////////////////// PUBLIC FUNCTIONS //////////////////////////////////////////////////////////////*/ /** * @notice Leaves the contract without owner * @dev Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @notice Transfers ownership of the contract to a new account * @dev The new owner cannot be the zero address * @param newOwner The address that will become the new owner */ function transferOwnership(address newOwner) public virtual onlyOwner { if (newOwner == address(0)) { revert InvalidOwner(address(0)); } _transferOwnership(newOwner); } /*////////////////////////////////////////////////////////////// VIEW FUNCTIONS //////////////////////////////////////////////////////////////*/ /** * @notice Returns the address of the current owner * @return Current owner address */ function owner() public view virtual returns (address) { return _owner; } /*////////////////////////////////////////////////////////////// INTERNAL FUNCTIONS //////////////////////////////////////////////////////////////*/ /** * @dev Transfers ownership of the contract to a new account (`newOwner`) * Internal function without access restriction */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } /** * @dev Throws if the sender is not the owner */ function _checkOwner() internal view virtual { if (owner() != _msgSender()) { revert UnauthorizedAccount(_msgSender()); } } }
// SPDX-License-Identifier: MIT pragma solidity >=0.8.24 <0.9.0; /** * @title IERC20Custom * @dev Interface for the ERC20 fungible token standard (EIP-20) * @notice Defines functionality for: * 1. Token transfers * 2. Allowance management * 3. Balance tracking * 4. Token metadata */ interface IERC20Custom { /*////////////////////////////////////////////////////////////// EVENTS //////////////////////////////////////////////////////////////*/ /** * @dev Emitted on token transfer between addresses * @param from Source address (0x0 for mints) * @param to Destination address (0x0 for burns) * @param value Amount of tokens transferred * @notice Tracks: * · Regular transfers * · Minting operations * · Burning operations */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when spending allowance is granted * @param owner Address granting permission * @param spender Address receiving permission * @param value Amount of tokens approved * @notice Records: * · New approvals * · Updated allowances * · Revoked permissions */ event Approval( address indexed owner, address indexed spender, uint256 value ); /*////////////////////////////////////////////////////////////// TRANSFER OPERATIONS //////////////////////////////////////////////////////////////*/ /** * @notice Transfers tokens to specified recipient * @param to Recipient address * @param value Amount to transfer in base units * @return bool True if transfer succeeds * @dev Requirements: * · Caller has sufficient balance * · Recipient is valid * · Amount > 0 * * Effects: * · Decreases caller balance * · Increases recipient balance * · Emits Transfer event */ function transfer(address to, uint256 value) external returns (bool); /** * @notice Executes transfer on behalf of token owner * @param from Source address * @param to Destination address * @param value Amount to transfer in base units * @return bool True if transfer succeeds * @dev Requirements: * · Caller has sufficient allowance * · Source has sufficient balance * · Valid addresses * * Effects: * · Decreases allowance * · Updates balances * · Emits Transfer event */ function transferFrom( address from, address to, uint256 value ) external returns (bool); /*////////////////////////////////////////////////////////////// APPROVAL OPERATIONS //////////////////////////////////////////////////////////////*/ /** * @notice Authorizes address to spend tokens * @param spender Address to authorize * @param value Amount to authorize in base units * @return bool True if approval succeeds * @dev Controls: * · Spending permissions * · Delegation limits * · Authorization levels * * Security: * · Overwrites previous allowance * · Requires explicit value * · Emits Approval event */ function approve(address spender, uint256 value) external returns (bool); /*////////////////////////////////////////////////////////////// TOKEN METADATA //////////////////////////////////////////////////////////////*/ /** * @notice Retrieves human-readable token name * @return string Full token name */ function name() external view returns (string memory); /** * @notice Retrieves token trading symbol * @return string Short token identifier */ function symbol() external view returns (string memory); /** * @notice Retrieves token decimal precision * @return uint8 Number of decimal places * @dev Standard: * · 18 for most tokens * · Used for display formatting */ function decimals() external view returns (uint8); /*////////////////////////////////////////////////////////////// BALANCE QUERIES //////////////////////////////////////////////////////////////*/ /** * @notice Retrieves total token supply * @return uint256 Current total supply * @dev Reflects: * · All minted tokens * · Minus burned tokens * · In base units */ function totalSupply() external view returns (uint256); /** * @notice Retrieves account token balance * @param account Address to query * @return uint256 Current balance in base units * @dev Returns: * · Available balance * · Includes pending rewards * · Excludes locked tokens */ function balanceOf(address account) external view returns (uint256); /** * @notice Retrieves remaining spending allowance * @param owner Token owner address * @param spender Authorized spender address * @return uint256 Current allowance in base units * @dev Shows: * · Approved amount * · Remaining limit * · Delegation status */ function allowance( address owner, address spender ) external view returns (uint256); }
// SPDX-License-Identifier: MIT pragma solidity >=0.8.24 <0.9.0; /** * @title IERC20Errors * @dev Standardized error interface for ERC20 token operations * @notice Defines functionality for: * 1. Balance validation errors * 2. Address validation errors * 3. Allowance validation errors */ interface IERC20Errors { /*////////////////////////////////////////////////////////////// BALANCE ERRORS //////////////////////////////////////////////////////////////*/ /** * @dev Error for insufficient token balance * @param sender Address attempting the transfer * @param balance Current balance of sender * @param needed Amount attempting to transfer * @notice Triggered when: * · Transfer amount > balance * · Burn amount > balance * · Withdrawal > available */ error ERC20InsufficientBalance( address sender, uint256 balance, uint256 needed ); /*////////////////////////////////////////////////////////////// ADDRESS VALIDATION ERRORS //////////////////////////////////////////////////////////////*/ /** * @dev Error for invalid sending address * @param sender Address that failed validation * @notice Triggered when: * · Sender is zero address * · Sender is blacklisted * · Sender lacks permissions */ error ERC20InvalidSender(address sender); /** * @dev Error for invalid receiving address * @param receiver Address that failed validation * @notice Triggered when: * · Receiver is zero address * · Receiver is blacklisted * · Receiver is contract without implementation */ error ERC20InvalidReceiver(address receiver); /*////////////////////////////////////////////////////////////// ALLOWANCE ERRORS //////////////////////////////////////////////////////////////*/ /** * @dev Error for insufficient spending allowance * @param spender Address attempting to spend * @param allowance Current approved amount * @param needed Amount attempting to spend * @notice Triggered when: * · Spend amount > allowance * · Transfer amount > approved * · Delegation exceeds limits */ error ERC20InsufficientAllowance( address spender, uint256 allowance, uint256 needed ); /** * @dev Error for invalid approving address * @param approver Address that failed validation * @notice Triggered when: * · Approver is zero address * · Approver lacks permissions * · Approver is invalid state */ error ERC20InvalidApprover(address approver); /** * @dev Error for invalid spending address * @param spender Address that failed validation * @notice Triggered when: * · Spender is zero address * · Spender is blacklisted * · Spender lacks permissions */ error ERC20InvalidSpender(address spender); }
// SPDX-License-Identifier: MIT pragma solidity >=0.8.24 <0.9.0; import {IERC20Custom} from "./IERC20Custom.sol"; /** * @title IERC20TokenRebase * @dev Extended interface for ERC20 tokens with elastic supply and safe management * @notice Defines functionality for: * 1. Supply elasticity (rebasing) * 2. Safe-based token management * 3. Supply control mechanisms * 4. Configuration management */ interface IERC20TokenRebase is IERC20Custom { /*////////////////////////////////////////////////////////////// SUPPLY MANAGEMENT //////////////////////////////////////////////////////////////*/ /** * @notice Mints new tokens to specified account * @param account Address to receive minted tokens * @param amount Quantity of tokens to mint in base units * @dev Requires: * · Caller is authorized minter * · Within maxSupply limits * · Valid recipient */ function mint(address account, uint256 amount) external; /** * @notice Burns tokens from specified account * @param account Address to burn tokens from * @param amount Quantity of tokens to burn in base units * @dev Requires: * · Caller is authorized * · Account has sufficient balance * · Amount > 0 */ function burn(address account, uint256 amount) external; /*////////////////////////////////////////////////////////////// REBASE OPERATIONS //////////////////////////////////////////////////////////////*/ /** * @notice Executes supply rebase based on current parameters * @dev Triggers: * · Supply adjustment * · Balance recalculation * · Event emission * * Considers: * · Rebase interval * · Basis points * · Supply limits */ function rebase() external; /** * @notice Configures rebase parameters * @param rebaseInterval Time period between rebases (in seconds) * @param rebaseBasisPoints Scale factor for rebase (in basis points) * @dev Controls: * · Rebase frequency * · Rebase magnitude * · Supply elasticity */ function setRebaseConfig( uint256 rebaseInterval, uint256 rebaseBasisPoints ) external; /*////////////////////////////////////////////////////////////// SAFE MANAGEMENT //////////////////////////////////////////////////////////////*/ /** * @notice Initializes new token management safe * @param safe Address of safe to create * @dev Establishes: * · Safe permissions * · Access controls * · Management capabilities */ function createSafe(address safe) external; /** * @notice Removes existing token management safe * @param safe Address of safe to remove * @dev Handles: * · Permission revocation * · State cleanup * · Access termination */ function destroySafe(address safe) external; /*////////////////////////////////////////////////////////////// VIEW FUNCTIONS //////////////////////////////////////////////////////////////*/ /** * @notice Retrieves floor contract address * @return address Active floor contract * @dev Used for: * · Price stability * · Supply control */ function floor() external view returns (address); /** * @notice Retrieves authorized minter address * @return address Active minter contract * @dev Controls: * · Mint permissions * · Supply expansion */ function minter() external view returns (address); /** * @notice Returns absolute maximum token supply * @return uint256 Maximum supply cap in base units * @dev Enforces: * · Hard supply limit * · Mint restrictions */ function maxSupply() external view returns (uint256); /** * @notice Calculates maximum supply after rebase * @return uint256 Post-rebase maximum supply in base units * @dev Considers: * · Current max supply * · Rebase parameters * · Supply caps */ function maxSupplyRebased() external view returns (uint256); /** * @notice Calculates total supply after rebase * @return uint256 Post-rebase total supply in base units * @dev Reflects: * · Current supply * · Rebase effects * · Supply limits */ function totalSupplyRebased() external view returns (uint256); }
{ "viaIR": true, "evmVersion": "paris", "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "metadata": { "useLiteralContent": true }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"uint8","name":"decimals_","type":"uint8"},{"internalType":"uint256","name":"maxSupply_","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AlreadyASafe","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[],"name":"FloorAlreadySet","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"InvalidOwner","type":"error"},{"inputs":[],"name":"MaxSupplyReached","type":"error"},{"inputs":[],"name":"MinterAlreadySet","type":"error"},{"inputs":[],"name":"NotASafe","type":"error"},{"inputs":[],"name":"RebaseBasisPointsAboveLimit","type":"error"},{"inputs":[],"name":"RebaseIntervalAboveLimit","type":"error"},{"inputs":[],"name":"RebaseIntervalBelowLimit","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"UnauthorizedAccount","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newDivisor","type":"uint256"}],"name":"DivisorUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"rebaseBasisPoints","type":"uint256"}],"name":"RebaseBasisPointsChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"rebaseInterval","type":"uint256"}],"name":"RebaseIntervalChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"safe","type":"address"}],"name":"SafeCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"safe","type":"address"}],"name":"SafeDestroyed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"toaster","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"maxSupply","type":"uint256"}],"name":"Toast","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_INTERVALS_PER_REBASE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_NORMAL_DIVISOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_REBASE_BASIS_POINTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_REBASE_INTERVAL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_REBASE_INTERVAL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SAFE_DIVISOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TENK_PRECISION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"createSafe","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"destroySafe","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"floor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isSafe","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupplyBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupplyRebased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"minter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextRebaseTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"normalDivisor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"normalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rebase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rebaseBasisPoints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rebaseInterval","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"safeSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"floor_","type":"address"}],"name":"setFloor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"minter_","type":"address"}],"name":"setMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"rebaseInterval_","type":"uint256"},{"internalType":"uint256","name":"rebaseBasisPoints_","type":"uint256"}],"name":"setRebaseConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupplyRebased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60c0604052346200005b57620000226200001862000271565b9291909162000663565b6200002c62000061565b612980620009a682396080518161134b015260a0518181816114270152818161150d0152611dab015261298090f35b62000067565b60405190565b600080fd5b601f801991011690565b634e487b7160e01b600052604160045260246000fd5b9062000098906200006c565b810190811060018060401b03821117620000b157604052565b62000076565b90620000ce620000c662000061565b92836200008c565b565b600080fd5b600080fd5b600080fd5b600080fd5b60018060401b0381116200010357620000ff6020916200006c565b0190565b62000076565b60005b8381106200011e575050906000910152565b8060209183015181850152016200010c565b90929192620001496200014382620000e4565b620000b7565b938185526020850190828401116200016857620001669262000109565b565b620000df565b9080601f830112156200018f578160206200018c9351910162000130565b90565b620000da565b60ff1690565b620001a68162000195565b03620001ae57565b600080fd5b90505190620001c2826200019b565b565b90565b620001d281620001c4565b03620001da57565b600080fd5b90505190620001ee82620001c7565b565b6080818303126200026b57600081015160018060401b0381116200026557826200021c9183016200016e565b92602082015160018060401b0381116200025f5762000242846200025c9285016200016e565b93620002528160408601620001b3565b93606001620001df565b90565b620000d5565b620000d5565b620000d0565b6200029462003326803803806200028881620000b7565b928339810190620001f0565b90919293565b60001b90565b90620002af600019916200029a565b9181191691161790565b90565b90565b620002d8620002d2620002de92620002b9565b620002bc565b620001c4565b90565b90565b90620002fe620002f86200030692620002bf565b620002e1565b8254620002a0565b9055565b90565b62000326620003206200032c926200030a565b620002bc565b620001c4565b90565b90620003496200034362000351926200030d565b620002e1565b8254620002a0565b9055565b90565b620003716200036b620003779262000355565b620002bc565b620001c4565b90565b90620003946200038e6200039c9262000358565b620002e1565b8254620002a0565b9055565b5190565b634e487b7160e01b600052602260045260246000fd5b9060016002830492168015620003dd575b6020831014620003d757565b620003a4565b91607f1691620003cb565b600052602060002090565b601f602091010490565b1b90565b91906008620004219102916200041a60001984620003fd565b92620003fd565b9181191691161790565b620004446200043e6200044a92620001c4565b620002bc565b620001c4565b90565b9190620004686200046262000471936200042b565b620002e1565b90835462000401565b9055565b600090565b62000490916200048962000475565b916200044d565b565b5b8181106200049f575050565b80620004af60006001936200047a565b0162000493565b9190601f8111620004c7575b505050565b620004d66200050193620003e8565b906020620004e484620003f3565b830193106200050a575b620004f990620003f3565b019062000492565b388080620004c2565b9150620004f981929050620004ee565b1c90565b906200053190600019906008026200051a565b191690565b8162000542916200051e565b906002021790565b906200055681620003a0565b9060018060401b03821162000629576200057d82620005768554620003ba565b85620004b6565b602090601f8311600114620005b757918091620005a593600092620005aa575b505062000536565b90555b565b909150015138806200059d565b601f19831691620005c885620003e8565b9260005b8181106200061057509160029391856001969410620005f3575b50505002019055620005a8565b62000605910151601f8416906200051e565b9055388080620005e6565b91936020600181928787015181550195019201620005cc565b62000076565b906200063b916200054a565b565b9062000657620006516200065f926200042b565b620002e1565b8254620002a0565b9055565b620006d7939291620006b3620006bb926200067d620006e3565b6200068e6305f5e1006009620002e4565b6200069c6015600a6200032f565b620006ab6104ec600b6200037a565b60016200062f565b60026200062f565b6080528060a052620006cf8160066200063d565b60076200063d565b620006e162000809565b565b620006ed620006ef565b565b620006f9620006fb565b565b6200070562000707565b565b6200071b6200071562000862565b62000938565b565b60001c90565b90565b620007356200073b916200071d565b62000723565b90565b6200074a905462000726565b90565b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b620007886200078f91620001c4565b91620001c4565b9081156200079b570490565b6200074d565b620007b3620007ba91939293620001c4565b92620001c4565b91620007c8838202620001c4565b928184041490151715620007d857565b62000763565b620007f0620007f791939293620001c4565b92620001c4565b82018092116200080357565b62000763565b6200085b62000853620008406200082d4262000826600b6200073e565b9062000779565b62000839600b6200073e565b90620007a1565b6200084c600b6200073e565b90620007de565b60086200063d565b565b600090565b6200086c6200085d565b503390565b60018060a01b031690565b6200088b62000891916200071d565b62000871565b90565b620008a090546200087c565b90565b90620008b660018060a01b03916200029a565b9181191691161790565b60018060a01b031690565b620008e4620008de620008ea92620008c0565b620002bc565b620008c0565b90565b620008f890620008cb565b90565b6200090690620008ed565b90565b90565b9062000926620009206200092e92620008fb565b62000909565b8254620008a3565b9055565b60000190565b62000944600062000894565b620009518260006200090c565b9062000989620009827f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e093620008fb565b91620008fb565b916200099462000061565b80620009a08162000932565b0390a356fe60806040526004361015610013575b610fe1565b61001e60003561029d565b806306fdde03146102985780630754617214610293578063095ea7b31461028e57806318160ddd1461028957806323b872dd146102845780632585892e1461027f578063295fe56f1461027a578063313ce5671461027557806338938d9e1461027057806340062af41461026b578063406953631461026657806340c10f191461026157806348b5f2bc1461025c578063610df721146102575780636a70229f146102525780636bf34d601461024d57806370a0823114610248578063715018a614610243578063769a28ac1461023e57806389adbf661461023957806389edeb74146102345780638b02358f1461022f5780638da5cb5b1461022a57806395d89b41146102255780639860a44e146102205780639ca303fc1461021b5780639dc29fac14610216578063a291eeda14610211578063a366b7f01461020c578063a9059cbb14610207578063af14052c14610202578063b3ed30b6146101fd578063bc75350f146101f8578063c57f9c08146101f3578063d5abeb01146101ee578063d6338ecb146101e9578063dd62ed3e146101e4578063f2fde38b146101df578063f59a4708146101da5763fca3b5aa0361000e57610fae565b610f79565b610f0c565b610ed6565b610e73565b610e3e565b610e09565b610d9d565b610d58565b610cee565b610cb8565b610c85565b610c50565b610c1c565b610be7565b610ba2565b610b35565b610b00565b610acc565b610a69565b610a26565b6109f1565b6109be565b610989565b610954565b61090f565b6108a1565b610824565b6107f0565b6107bb565b610776565b610731565b6106c3565b610665565b6105f7565b61059c565b61052c565b6104d3565b6103fd565b610349565b60e01c90565b60405190565b600080fd5b600080fd5b60009103126102be57565b6102ae565b5190565b60209181520190565b60005b8381106102e4575050906000910152565b8060209183015181850152016102d3565b601f801991011690565b61031e61032760209361032c93610315816102c3565b938480936102c7565b958691016102d0565b6102f5565b0190565b61034691602082019160008184039101526102ff565b90565b34610379576103593660046102b3565b610375610364611148565b61036c6102a3565b91829182610330565b0390f35b6102a9565b1c90565b60018060a01b031690565b61039d9060086103a2930261037e565b610382565b90565b906103b0915461038d565b90565b6103c0600d6000906103a5565b90565b60018060a01b031690565b6103d7906103c3565b90565b6103e3906103ce565b9052565b91906103fb906000602085019401906103da565b565b3461042d5761040d3660046102b3565b6104296104186103b3565b6104206102a3565b918291826103e7565b0390f35b6102a9565b61043b816103ce565b0361044257565b600080fd5b9050359061045482610432565b565b90565b61046281610456565b0361046957565b600080fd5b9050359061047b82610459565b565b91906040838203126104a6578061049a6104a39260008601610447565b9360200161046e565b90565b6102ae565b151590565b6104b9906104ab565b9052565b91906104d1906000602085019401906104b0565b565b34610504576105006104ef6104e936600461047d565b90611163565b6104f76102a3565b918291826104bd565b0390f35b6102a9565b61051290610456565b9052565b919061052a90600060208501940190610509565b565b3461055c5761053c3660046102b3565b6105586105476111b1565b61054f6102a3565b91829182610516565b0390f35b6102a9565b90916060828403126105975761059461057d8460008501610447565b9361058b8160208601610447565b9360400161046e565b90565b6102ae565b346105cd576105c96105b86105b2366004610561565b916111c7565b6105c06102a3565b918291826104bd565b0390f35b6102a9565b906020828203126105ec576105e991600001610447565b90565b6102ae565b60000190565b346106255761060f61060a3660046105d2565b611330565b6106176102a3565b80610621816105f1565b0390f35b6102a9565b90565b90565b61064461063f6106499261062a565b61062d565b610456565b90565b6106576104ec610630565b90565b61066261064c565b90565b34610695576106753660046102b3565b61069161068061065a565b6106886102a3565b91829182610516565b0390f35b6102a9565b60ff1690565b6106a99061069a565b9052565b91906106c1906000602085019401906106a0565b565b346106f3576106d33660046102b3565b6106ef6106de611340565b6106e66102a3565b918291826106ad565b0390f35b6102a9565b90565b61070b906008610710930261037e565b6106f8565b90565b9061071e91546106fb565b90565b61072e6007600090610713565b90565b34610761576107413660046102b3565b61075d61074c610721565b6107546102a3565b91829182610516565b0390f35b6102a9565b6107736009600090610713565b90565b346107a6576107863660046102b3565b6107a2610791610766565b6107996102a3565b91829182610516565b0390f35b6102a9565b6107b8600c6000906103a5565b90565b346107eb576107cb3660046102b3565b6107e76107d66107ab565b6107de6102a3565b918291826103e7565b0390f35b6102a9565b3461081f5761080961080336600461047d565b9061153d565b6108116102a3565b8061081b816105f1565b0390f35b6102a9565b34610854576108343660046102b3565b61085061083f611581565b6108476102a3565b91829182610516565b0390f35b6102a9565b90565b61087061086b61087592610859565b61062d565b610456565b90565b610893710b7abc627050305adf14a3d9e4000000000061085c565b90565b61089e610878565b90565b346108d1576108b13660046102b3565b6108cd6108bc610896565b6108c46102a3565b91829182610516565b0390f35b6102a9565b90565b6108ed6108e86108f2926108d6565b61062d565b610456565b90565b610901621baf806108d9565b90565b61090c6108f5565b90565b3461093f5761091f3660046102b3565b61093b61092a610904565b6109326102a3565b91829182610516565b0390f35b6102a9565b6109516008600090610713565b90565b34610984576109643660046102b3565b61098061096f610944565b6109776102a3565b91829182610516565b0390f35b6102a9565b346109b9576109b56109a461099f3660046105d2565b611601565b6109ac6102a3565b91829182610516565b0390f35b6102a9565b346109ec576109ce3660046102b3565b6109d6611698565b6109de6102a3565b806109e8816105f1565b0390f35b6102a9565b34610a2157610a1d610a0c610a073660046105d2565b6116a2565b610a146102a3565b918291826104bd565b0390f35b6102a9565b34610a5457610a3e610a393660046105d2565b6118e2565b610a466102a3565b80610a50816105f1565b0390f35b6102a9565b610a66600b600090610713565b90565b34610a9957610a793660046102b3565b610a95610a84610a59565b610a8c6102a3565b91829182610516565b0390f35b6102a9565b9190604083820312610ac75780610abb610ac4926000860161046e565b9360200161046e565b90565b6102ae565b34610afb57610ae5610adf366004610a9e565b90611a65565b610aed6102a3565b80610af7816105f1565b0390f35b6102a9565b34610b3057610b103660046102b3565b610b2c610b1b611a76565b610b236102a3565b918291826103e7565b0390f35b6102a9565b34610b6557610b453660046102b3565b610b61610b50611a8c565b610b586102a3565b91829182610330565b0390f35b6102a9565b90565b610b81610b7c610b8692610b6a565b61062d565b610456565b90565b610b94612710610b6d565b90565b610b9f610b89565b90565b34610bd257610bb23660046102b3565b610bce610bbd610b97565b610bc56102a3565b91829182610516565b0390f35b6102a9565b610be46006600090610713565b90565b34610c1757610bf73660046102b3565b610c13610c02610bd7565b610c0a6102a3565b91829182610516565b0390f35b6102a9565b34610c4b57610c35610c2f36600461047d565b90611c03565b610c3d6102a3565b80610c47816105f1565b0390f35b6102a9565b34610c8057610c603660046102b3565b610c7c610c6b611c0f565b610c736102a3565b91829182610516565b0390f35b6102a9565b34610cb357610c9d610c983660046105d2565b611d69565b610ca56102a3565b80610caf816105f1565b0390f35b6102a9565b34610ce957610ce5610cd4610cce36600461047d565b90611d74565b610cdc6102a3565b918291826104bd565b0390f35b6102a9565b34610d1c57610cfe3660046102b3565b610d06611d96565b610d0e6102a3565b80610d18816105f1565b0390f35b6102a9565b90565b610d38610d33610d3d92610d21565b61062d565b610456565b90565b610d4a6007610d24565b90565b610d55610d40565b90565b34610d8857610d683660046102b3565b610d84610d73610d4d565b610d7b6102a3565b91829182610516565b0390f35b6102a9565b610d9a600a600090610713565b90565b34610dcd57610dad3660046102b3565b610dc9610db8610d8d565b610dc06102a3565b91829182610516565b0390f35b6102a9565b90565b610de9610de4610dee92610dd2565b61062d565b610456565b90565b610dfb6015610dd5565b90565b610e06610df1565b90565b34610e3957610e193660046102b3565b610e35610e24610dfe565b610e2c6102a3565b91829182610516565b0390f35b6102a9565b34610e6e57610e4e3660046102b3565b610e6a610e59611da0565b610e616102a3565b91829182610516565b0390f35b6102a9565b34610ea357610e833660046102b3565b610e9f610e8e611dcd565b610e966102a3565b91829182610516565b0390f35b6102a9565b9190604083820312610ed15780610ec5610ece9260008601610447565b93602001610447565b90565b6102ae565b34610f0757610f03610ef2610eec366004610ea8565b90611e0c565b610efa6102a3565b91829182610516565b0390f35b6102a9565b34610f3a57610f24610f1f3660046105d2565b611ea2565b610f2c6102a3565b80610f36816105f1565b0390f35b6102a9565b90565b610f56610f51610f5b92610f3f565b61062d565b610456565b90565b610f6b6305f5e100610f42565b90565b610f76610f5e565b90565b34610fa957610f893660046102b3565b610fa5610f94610f6e565b610f9c6102a3565b91829182610516565b0390f35b6102a9565b34610fdc57610fc6610fc13660046105d2565b611f23565b610fce6102a3565b80610fd8816105f1565b0390f35b6102a9565b600080fd5b606090565b634e487b7160e01b600052602260045260246000fd5b9060016002830492168015611021575b602083101461101c57565b610feb565b91607f1691611011565b60209181520190565b600052602060002090565b906000929180549061105a61105383611001565b809461102b565b916001811690816000146110b35750600114611076575b505050565b6110839192939450611034565b916000925b81841061109b5750500190388080611071565b60018160209295939554848601520191019290611088565b92949550505060ff1916825215156020020190388080611071565b906110d89161103f565b90565b634e487b7160e01b600052604160045260246000fd5b906110fb906102f5565b810190811067ffffffffffffffff82111761111557604052565b6110db565b9061113a6111339261112a6102a3565b938480926110ce565b03836110f1565b565b6111459061111a565b90565b611150610fe6565b5061115b600161113c565b90565b600090565b6111809161116f61115e565b50611178611f2e565b919091611f3b565b600190565b600090565b60001c90565b61119c6111a19161118a565b6106f8565b90565b6111ae9054611190565b90565b6111b9611185565b506111c460036111a4565b90565b916111f1926111d461115e565b506111e96111e0611f2e565b82908491611f8c565b919091612021565b600190565b611207906112026120d8565b6112cd565b565b61121561121a9161118a565b610382565b90565b6112279054611209565b90565b90565b61124161123c6112469261122a565b61062d565b6103c3565b90565b6112529061122d565b90565b60001b90565b9061126c60018060a01b0391611255565b9181191691161790565b61128a61128561128f926103c3565b61062d565b6103c3565b90565b61129b90611276565b90565b6112a790611292565b90565b90565b906112c26112bd6112c99261129e565b6112aa565b825461125b565b9055565b6112d7600c61121d565b6112f26112ec6112e76000611249565b6103ce565b916103ce565b0361130d578061130461130b9261212d565b600c6112ad565b565b6113156102a3565b6324f44ddb60e01b81528061132c600482016105f1565b0390fd5b611339906111f6565b565b600090565b61134861133b565b507f000000000000000000000000000000000000000000000000000000000000000090565b90611378600d61121d565b61139161138b611386611f2e565b6103ce565b916103ce565b036113a15761139f91611425565b565b6113ca6113ac611f2e565b6113b46102a3565b9182916332b2baa360e01b8352600483016103e7565b0390fd5b6113e26113dd6113e79261122a565b61062d565b610456565b90565b634e487b7160e01b600052601160045260246000fd5b61140f61141591939293610456565b92610456565b820180921161142057565b6113ea565b7f000000000000000000000000000000000000000000000000000000000000000061145961145360006113ce565b91610456565b1415806114f0575b6114cd578061148161147b6114766000611249565b6103ce565b916103ce565b1461149e5761149c916114946000611249565b919091612172565b565b6114c96114ab6000611249565b6114b36102a3565b91829163ec442f0560e01b8352600483016103e7565b0390fd5b6114d56102a3565b63d05cb60960e01b8152806114ec600482016105f1565b0390fd5b506115056114fe60036111a4565b8390611400565b6115376115317f0000000000000000000000000000000000000000000000000000000000000000610456565b91610456565b11611461565b906115479161136d565b565b634e487b7160e01b600052601260045260246000fd5b61156b61157191610456565b91610456565b90811561157c570490565b611549565b611589611185565b506115a761159760046111a4565b6115a160096111a4565b9061155f565b90565b906115b49061129e565b600052602052604060002090565b60ff1690565b6115d46115d99161118a565b6115c2565b90565b6115e690546115c8565b90565b906115f39061129e565b600052602052604060002090565b611609611185565b5061161e611619601083906115aa565b6115dc565b61164b5761163861163361164892600e6115e9565b6111a4565b61164260096111a4565b9061155f565b90565b61166161165c61166f92600e6115e9565b6111a4565b611669610f5e565b9061155f565b90565b61167a6120d8565b611682611684565b565b6116966116916000611249565b6123cc565b565b6116a0611672565b565b6116b96116be916116b161115e565b5060106115aa565b6115dc565b90565b6116d2906116cd6120d8565b6117c9565b565b906116e060ff91611255565b9181191691161790565b6116f3906104ab565b90565b90565b9061170e611709611715926116ea565b6116f6565b82546116d4565b9055565b61172861172e91939293610456565b92610456565b820391821161173957565b6113ea565b9061174b60001991611255565b9181191691161790565b61176961176461176e92610456565b61062d565b610456565b90565b90565b9061178961178461179092611755565b611771565b825461173e565b9055565b6117a36117a991939293610456565b92610456565b916117b5838202610456565b9281840414901517156117c457565b6113ea565b6117dd6117d8601083906115aa565b6115dc565b6118bf576117f760016117f2601084906115aa565b6116f9565b61187d611876611852611842611817611812600e87906115e9565b6111a4565b61183461182d8261182860046111a4565b611719565b6004611774565b61183c610f5e565b90611794565b61184c60096111a4565b9061155f565b61186781611862600e87906115e9565b611774565b61187160056111a4565b611400565b6005611774565b6118a77f9cebc3415f29f3a72d88a3509a7de71248d7362a11a5a188c070be993cc1d7c19161129e565b906118b06102a3565b806118ba816105f1565b0390a2565b6118c76102a3565b6377e63f1f60e11b8152806118de600482016105f1565b0390fd5b6118eb906116c1565b565b906118ff916118fa6120d8565b611901565b565b908161191c61191661191161064c565b610456565b91610456565b10611a42578161193b6119356119306108f5565b610456565b91610456565b11611a1f578061195a61195461194f610df1565b610456565b91610456565b116119fc5761196d61197492600b611774565b600a611774565b61197e600b6111a4565b6119b47f46b0a99fa4799189e0af4d080d5a9185083eef96b02557c64fa811984f4b5c25916119ab6102a3565b91829182610516565b0390a16119c1600a6111a4565b6119f77f30950c5e459448c67a27b95b972d10595000175c14cbac7e0d91ec8d0911e7b4916119ee6102a3565b91829182610516565b0390a1565b611a046102a3565b63193a01fb60e01b815280611a1b600482016105f1565b0390fd5b611a276102a3565b630f86871760e11b815280611a3e600482016105f1565b0390fd5b611a4a6102a3565b63b95df78760e01b815280611a61600482016105f1565b0390fd5b90611a6f916118ed565b565b600090565b611a7e611a71565b50611a89600061121d565b90565b611a94610fe6565b50611a9f600261113c565b90565b90611aad600c61121d565b611ac6611ac0611abb611f2e565b6103ce565b916103ce565b03611ad657611ad491611b27565b565b611aff611ae1611f2e565b611ae96102a3565b9182916332b2baa360e01b8352600483016103e7565b0390fd5b916020611b25929493611b1e60408201966000830190610509565b0190610509565b565b90611b45611b3e82611b3960066111a4565b611719565b6006611774565b611b4d611f2e565b8190611b5960066111a4565b611b837f330cb712f04961497080da66a1f756f88bc9a4846dce611f510ab4108c3236019261129e565b92611b98611b8f6102a3565b92839283611b03565b0390a281611bb7611bb1611bac6000611249565b6103ce565b916103ce565b14611bd457611bd29190611bcb6000611249565b9091612172565b565b611bff611be16000611249565b611be96102a3565b918291634b637e8f60e11b8352600483016103e7565b0390fd5b90611c0d91611aa2565b565b611c17611185565b50611c31611c23611581565b611c2b611dcd565b90611400565b90565b611c4590611c406120d8565b611c47565b565b611c64611c5e611c59601084906115aa565b6115dc565b156104ab565b611d4657611c7e6000611c79601084906115aa565b6116f9565b611d04611cfd611cd9611ccb611c9e611c99600e87906115e9565b6111a4565b611cbb611cb482611caf60056111a4565b611719565b6005611774565b611cc560096111a4565b90611794565b611cd3610f5e565b9061155f565b611cee81611ce9600e87906115e9565b611774565b611cf860046111a4565b611400565b6004611774565b611d2e7f7a2494cd48659935b016226d48d4e071295f9c61797e2b884b416faf71ce00339161129e565b90611d376102a3565b80611d41816105f1565b0390a2565b611d4e6102a3565b635c68a36560e01b815280611d65600482016105f1565b0390fd5b611d7290611c34565b565b611d9191611d8061115e565b50611d89611f2e565b919091612021565b600190565b611d9e612565565b565b611da8611185565b507f000000000000000000000000000000000000000000000000000000000000000090565b611dd5611185565b50611df1611de360056111a4565b611deb610f5e565b9061155f565b90565b90611dfe9061129e565b600052602052604060002090565b611e3191611e27611e2c92611e1f611185565b50600f611df4565b6115e9565b6111a4565b90565b611e4590611e406120d8565b611e47565b565b80611e63611e5d611e586000611249565b6103ce565b916103ce565b14611e7357611e71906123cc565b565b611e9e611e806000611249565b611e886102a3565b91829163b20f76e360e01b8352600483016103e7565b0390fd5b611eab90611e34565b565b611ebe90611eb96120d8565b611ec0565b565b611eca600d61121d565b611ee5611edf611eda6000611249565b6103ce565b916103ce565b03611f005780611ef7611efe9261212d565b600d6112ad565b565b611f086102a3565b63f119708d60e01b815280611f1f600482016105f1565b0390fd5b611f2c90611ead565b565b611f36611a71565b503390565b91611f49929160019261270f565b565b604090611f75611f7c9496959396611f6b606084019860008501906103da565b6020830190610509565b0190610509565b565b90611f899103610456565b90565b929192611f9a818390611e0c565b9081611fb0611faa600019610456565b91610456565b03611fbd575b5050509050565b81611fd0611fca87610456565b91610456565b10611ff757611fee9394611fe5919392611f7e565b9060009261270f565b80388080611fb6565b5061201d849291926120076102a3565b938493637dc7a0d960e11b855260048501611f4b565b0390fd5b918261203e6120386120336000611249565b6103ce565b916103ce565b146120a9578161205f6120596120546000611249565b6103ce565b916103ce565b1461207a5761207092919091612172565b612078612565565b565b6120a56120876000611249565b61208f6102a3565b91829163ec442f0560e01b8352600483016103e7565b0390fd5b6120d46120b66000611249565b6120be6102a3565b918291634b637e8f60e11b8352600483016103e7565b0390fd5b6120e0611a76565b6120f96120f36120ee611f2e565b6103ce565b916103ce565b0361210057565b61212961210b611f2e565b6121136102a3565b9182916332b2baa360e01b8352600483016103e7565b0390fd5b61214861214261213d6000611249565b6103ce565b916103ce565b1461214f57565b6121576102a3565b63d92e233d60e01b81528061216e600482016105f1565b0390fd5b9190918061219161218b6121866000611249565b6103ce565b916103ce565b14600014612259576121b66121af836121aa60036111a4565b611400565b6003611774565b5b826121d36121cd6121c86000611249565b6103ce565b916103ce565b14600014612249576121f86121f1836121ec60036111a4565b611f7e565b6003611774565b5b91909161224461223261222c7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9361129e565b9361129e565b9361223b6102a3565b91829182610516565b0390a3565b612254838390612830565b6121f9565b61226d612268600e83906115e9565b6111a4565b612275611185565b5061228a612285601084906115aa565b6115dc565b600014612338576122a38361229d610f5e565b90611794565b90806122b76122b184610456565b91610456565b106122fd57816122e7916122e16122da6122f8956122d560056111a4565b611719565b6005611774565b5b611f7e565b6122f3600e84906115e9565b611774565b6121b7565b8390612334612315859261230f610f5e565b9061155f565b9261231e6102a3565b93849363391434e360e21b855260048501611f4b565b0390fd5b61234c8361234660096111a4565b90611794565b908061236061235a84610456565b91610456565b1061238f57816122e79161238a6123836122f89561237e60046111a4565b611719565b6004611774565b6122e2565b83906123c86123a985926123a360096111a4565b9061155f565b926123b26102a3565b93849363391434e360e21b855260048501611f4b565b0390fd5b6123d6600061121d565b6123e18260006112ad565b9061241561240f7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09361129e565b9161129e565b9161241e6102a3565b80612428816105f1565b0390a3565b90565b61244461243f6124499261242d565b61062d565b610456565b90565b60011c90565b939190925b60018211612463575050565b909192808204811161249c576001831661248d575b8061248491029261244c565b90929192612457565b93846124849102949050612478565b6113ea565b929192811561253a578015612531578080600114612527576002146125085760208210610133821016604e8310600b831016176124f957926124e7918193946001612452565b80920481116124f4570290565b6113ea565b0a91821161250357565b6113ea565b5060ff81116125225760020a91821161251d57565b6113ea565b6113ea565b5050509050600190565b50509050600090565b50509050600190565b9061255961255361256293610456565b91610456565b600019916124a1565b90565b4261258161257b61257660086111a4565b610456565b91610456565b1061270d576125c06125b06125a04261259a60086111a4565b90611719565b6125aa600b6111a4565b9061155f565b6125ba6001612430565b90611400565b806125da6125d46125cf610d40565b610456565b91610456565b116126ff575b6125ea600a6111a4565b6125fd6125f760006113ce565b91610456565b146126fc576126549061264f61263f61263161262a61261a610b89565b612624600a6111a4565b90611400565b8490612543565b9261263a610b89565b612543565b9161264a60096111a4565b611794565b61155f565b8061266e612668612663610878565b610456565b91610456565b116126f95761267b612904565b612686816009611774565b6126be6126b761269660066111a4565b6126b16126a360036111a4565b6126ab611c0f565b90611719565b90611719565b6007611774565b6126f47fc1c07021cd444bdc21076f63018ccc10a6498d200ab3d95ef513c3fcb7f8033a916126eb6102a3565b91829182610516565b0390a1565b50565b50565b50612708610d40565b6125e0565b565b90928161272d6127276127226000611249565b6103ce565b916103ce565b14612801578361274e6127486127436000611249565b6103ce565b916103ce565b146127d2576127728361276d612766600f8690611df4565b87906115e9565b611774565b61277c575b505050565b9190916127c76127b56127af7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259361129e565b9361129e565b936127be6102a3565b91829182610516565b0390a3388080612777565b6127fd6127df6000611249565b6127e76102a3565b918291634a1406b160e11b8352600483016103e7565b0390fd5b61282c61280e6000611249565b6128166102a3565b91829163e602df0560e01b8352600483016103e7565b0390fd5b90612845612840601084906115aa565b6115dc565b6000146128a6576128a39161288d61286861289c93612862610f5e565b90611794565b916128876128788492600e6115e9565b91612882836111a4565b611400565b90611774565b61289760056111a4565b611400565b6005611774565b5b565b6128ff916128e96128c46128f8936128be60096111a4565b90611794565b916128e36128d48492600e6115e9565b916128de836111a4565b611400565b90611774565b6128f360046111a4565b611400565b6004611774565b6128a4565b6129486129416129316129214261291b600b6111a4565b9061155f565b61292b600b6111a4565b90611794565b61293b600b6111a4565b90611400565b6008611774565b56fea26469706673582212208881b635118b756a2c12675fe702d72ce09727d88de845bae1414e762a6ba08064736f6c63430008180033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000ec58f3fd6e6570e3fa000000000000000000000000000000000000000000000000000000000000000000000553746f757400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045354545800000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x60806040526004361015610013575b610fe1565b61001e60003561029d565b806306fdde03146102985780630754617214610293578063095ea7b31461028e57806318160ddd1461028957806323b872dd146102845780632585892e1461027f578063295fe56f1461027a578063313ce5671461027557806338938d9e1461027057806340062af41461026b578063406953631461026657806340c10f191461026157806348b5f2bc1461025c578063610df721146102575780636a70229f146102525780636bf34d601461024d57806370a0823114610248578063715018a614610243578063769a28ac1461023e57806389adbf661461023957806389edeb74146102345780638b02358f1461022f5780638da5cb5b1461022a57806395d89b41146102255780639860a44e146102205780639ca303fc1461021b5780639dc29fac14610216578063a291eeda14610211578063a366b7f01461020c578063a9059cbb14610207578063af14052c14610202578063b3ed30b6146101fd578063bc75350f146101f8578063c57f9c08146101f3578063d5abeb01146101ee578063d6338ecb146101e9578063dd62ed3e146101e4578063f2fde38b146101df578063f59a4708146101da5763fca3b5aa0361000e57610fae565b610f79565b610f0c565b610ed6565b610e73565b610e3e565b610e09565b610d9d565b610d58565b610cee565b610cb8565b610c85565b610c50565b610c1c565b610be7565b610ba2565b610b35565b610b00565b610acc565b610a69565b610a26565b6109f1565b6109be565b610989565b610954565b61090f565b6108a1565b610824565b6107f0565b6107bb565b610776565b610731565b6106c3565b610665565b6105f7565b61059c565b61052c565b6104d3565b6103fd565b610349565b60e01c90565b60405190565b600080fd5b600080fd5b60009103126102be57565b6102ae565b5190565b60209181520190565b60005b8381106102e4575050906000910152565b8060209183015181850152016102d3565b601f801991011690565b61031e61032760209361032c93610315816102c3565b938480936102c7565b958691016102d0565b6102f5565b0190565b61034691602082019160008184039101526102ff565b90565b34610379576103593660046102b3565b610375610364611148565b61036c6102a3565b91829182610330565b0390f35b6102a9565b1c90565b60018060a01b031690565b61039d9060086103a2930261037e565b610382565b90565b906103b0915461038d565b90565b6103c0600d6000906103a5565b90565b60018060a01b031690565b6103d7906103c3565b90565b6103e3906103ce565b9052565b91906103fb906000602085019401906103da565b565b3461042d5761040d3660046102b3565b6104296104186103b3565b6104206102a3565b918291826103e7565b0390f35b6102a9565b61043b816103ce565b0361044257565b600080fd5b9050359061045482610432565b565b90565b61046281610456565b0361046957565b600080fd5b9050359061047b82610459565b565b91906040838203126104a6578061049a6104a39260008601610447565b9360200161046e565b90565b6102ae565b151590565b6104b9906104ab565b9052565b91906104d1906000602085019401906104b0565b565b34610504576105006104ef6104e936600461047d565b90611163565b6104f76102a3565b918291826104bd565b0390f35b6102a9565b61051290610456565b9052565b919061052a90600060208501940190610509565b565b3461055c5761053c3660046102b3565b6105586105476111b1565b61054f6102a3565b91829182610516565b0390f35b6102a9565b90916060828403126105975761059461057d8460008501610447565b9361058b8160208601610447565b9360400161046e565b90565b6102ae565b346105cd576105c96105b86105b2366004610561565b916111c7565b6105c06102a3565b918291826104bd565b0390f35b6102a9565b906020828203126105ec576105e991600001610447565b90565b6102ae565b60000190565b346106255761060f61060a3660046105d2565b611330565b6106176102a3565b80610621816105f1565b0390f35b6102a9565b90565b90565b61064461063f6106499261062a565b61062d565b610456565b90565b6106576104ec610630565b90565b61066261064c565b90565b34610695576106753660046102b3565b61069161068061065a565b6106886102a3565b91829182610516565b0390f35b6102a9565b60ff1690565b6106a99061069a565b9052565b91906106c1906000602085019401906106a0565b565b346106f3576106d33660046102b3565b6106ef6106de611340565b6106e66102a3565b918291826106ad565b0390f35b6102a9565b90565b61070b906008610710930261037e565b6106f8565b90565b9061071e91546106fb565b90565b61072e6007600090610713565b90565b34610761576107413660046102b3565b61075d61074c610721565b6107546102a3565b91829182610516565b0390f35b6102a9565b6107736009600090610713565b90565b346107a6576107863660046102b3565b6107a2610791610766565b6107996102a3565b91829182610516565b0390f35b6102a9565b6107b8600c6000906103a5565b90565b346107eb576107cb3660046102b3565b6107e76107d66107ab565b6107de6102a3565b918291826103e7565b0390f35b6102a9565b3461081f5761080961080336600461047d565b9061153d565b6108116102a3565b8061081b816105f1565b0390f35b6102a9565b34610854576108343660046102b3565b61085061083f611581565b6108476102a3565b91829182610516565b0390f35b6102a9565b90565b61087061086b61087592610859565b61062d565b610456565b90565b610893710b7abc627050305adf14a3d9e4000000000061085c565b90565b61089e610878565b90565b346108d1576108b13660046102b3565b6108cd6108bc610896565b6108c46102a3565b91829182610516565b0390f35b6102a9565b90565b6108ed6108e86108f2926108d6565b61062d565b610456565b90565b610901621baf806108d9565b90565b61090c6108f5565b90565b3461093f5761091f3660046102b3565b61093b61092a610904565b6109326102a3565b91829182610516565b0390f35b6102a9565b6109516008600090610713565b90565b34610984576109643660046102b3565b61098061096f610944565b6109776102a3565b91829182610516565b0390f35b6102a9565b346109b9576109b56109a461099f3660046105d2565b611601565b6109ac6102a3565b91829182610516565b0390f35b6102a9565b346109ec576109ce3660046102b3565b6109d6611698565b6109de6102a3565b806109e8816105f1565b0390f35b6102a9565b34610a2157610a1d610a0c610a073660046105d2565b6116a2565b610a146102a3565b918291826104bd565b0390f35b6102a9565b34610a5457610a3e610a393660046105d2565b6118e2565b610a466102a3565b80610a50816105f1565b0390f35b6102a9565b610a66600b600090610713565b90565b34610a9957610a793660046102b3565b610a95610a84610a59565b610a8c6102a3565b91829182610516565b0390f35b6102a9565b9190604083820312610ac75780610abb610ac4926000860161046e565b9360200161046e565b90565b6102ae565b34610afb57610ae5610adf366004610a9e565b90611a65565b610aed6102a3565b80610af7816105f1565b0390f35b6102a9565b34610b3057610b103660046102b3565b610b2c610b1b611a76565b610b236102a3565b918291826103e7565b0390f35b6102a9565b34610b6557610b453660046102b3565b610b61610b50611a8c565b610b586102a3565b91829182610330565b0390f35b6102a9565b90565b610b81610b7c610b8692610b6a565b61062d565b610456565b90565b610b94612710610b6d565b90565b610b9f610b89565b90565b34610bd257610bb23660046102b3565b610bce610bbd610b97565b610bc56102a3565b91829182610516565b0390f35b6102a9565b610be46006600090610713565b90565b34610c1757610bf73660046102b3565b610c13610c02610bd7565b610c0a6102a3565b91829182610516565b0390f35b6102a9565b34610c4b57610c35610c2f36600461047d565b90611c03565b610c3d6102a3565b80610c47816105f1565b0390f35b6102a9565b34610c8057610c603660046102b3565b610c7c610c6b611c0f565b610c736102a3565b91829182610516565b0390f35b6102a9565b34610cb357610c9d610c983660046105d2565b611d69565b610ca56102a3565b80610caf816105f1565b0390f35b6102a9565b34610ce957610ce5610cd4610cce36600461047d565b90611d74565b610cdc6102a3565b918291826104bd565b0390f35b6102a9565b34610d1c57610cfe3660046102b3565b610d06611d96565b610d0e6102a3565b80610d18816105f1565b0390f35b6102a9565b90565b610d38610d33610d3d92610d21565b61062d565b610456565b90565b610d4a6007610d24565b90565b610d55610d40565b90565b34610d8857610d683660046102b3565b610d84610d73610d4d565b610d7b6102a3565b91829182610516565b0390f35b6102a9565b610d9a600a600090610713565b90565b34610dcd57610dad3660046102b3565b610dc9610db8610d8d565b610dc06102a3565b91829182610516565b0390f35b6102a9565b90565b610de9610de4610dee92610dd2565b61062d565b610456565b90565b610dfb6015610dd5565b90565b610e06610df1565b90565b34610e3957610e193660046102b3565b610e35610e24610dfe565b610e2c6102a3565b91829182610516565b0390f35b6102a9565b34610e6e57610e4e3660046102b3565b610e6a610e59611da0565b610e616102a3565b91829182610516565b0390f35b6102a9565b34610ea357610e833660046102b3565b610e9f610e8e611dcd565b610e966102a3565b91829182610516565b0390f35b6102a9565b9190604083820312610ed15780610ec5610ece9260008601610447565b93602001610447565b90565b6102ae565b34610f0757610f03610ef2610eec366004610ea8565b90611e0c565b610efa6102a3565b91829182610516565b0390f35b6102a9565b34610f3a57610f24610f1f3660046105d2565b611ea2565b610f2c6102a3565b80610f36816105f1565b0390f35b6102a9565b90565b610f56610f51610f5b92610f3f565b61062d565b610456565b90565b610f6b6305f5e100610f42565b90565b610f76610f5e565b90565b34610fa957610f893660046102b3565b610fa5610f94610f6e565b610f9c6102a3565b91829182610516565b0390f35b6102a9565b34610fdc57610fc6610fc13660046105d2565b611f23565b610fce6102a3565b80610fd8816105f1565b0390f35b6102a9565b600080fd5b606090565b634e487b7160e01b600052602260045260246000fd5b9060016002830492168015611021575b602083101461101c57565b610feb565b91607f1691611011565b60209181520190565b600052602060002090565b906000929180549061105a61105383611001565b809461102b565b916001811690816000146110b35750600114611076575b505050565b6110839192939450611034565b916000925b81841061109b5750500190388080611071565b60018160209295939554848601520191019290611088565b92949550505060ff1916825215156020020190388080611071565b906110d89161103f565b90565b634e487b7160e01b600052604160045260246000fd5b906110fb906102f5565b810190811067ffffffffffffffff82111761111557604052565b6110db565b9061113a6111339261112a6102a3565b938480926110ce565b03836110f1565b565b6111459061111a565b90565b611150610fe6565b5061115b600161113c565b90565b600090565b6111809161116f61115e565b50611178611f2e565b919091611f3b565b600190565b600090565b60001c90565b61119c6111a19161118a565b6106f8565b90565b6111ae9054611190565b90565b6111b9611185565b506111c460036111a4565b90565b916111f1926111d461115e565b506111e96111e0611f2e565b82908491611f8c565b919091612021565b600190565b611207906112026120d8565b6112cd565b565b61121561121a9161118a565b610382565b90565b6112279054611209565b90565b90565b61124161123c6112469261122a565b61062d565b6103c3565b90565b6112529061122d565b90565b60001b90565b9061126c60018060a01b0391611255565b9181191691161790565b61128a61128561128f926103c3565b61062d565b6103c3565b90565b61129b90611276565b90565b6112a790611292565b90565b90565b906112c26112bd6112c99261129e565b6112aa565b825461125b565b9055565b6112d7600c61121d565b6112f26112ec6112e76000611249565b6103ce565b916103ce565b0361130d578061130461130b9261212d565b600c6112ad565b565b6113156102a3565b6324f44ddb60e01b81528061132c600482016105f1565b0390fd5b611339906111f6565b565b600090565b61134861133b565b507f000000000000000000000000000000000000000000000000000000000000001290565b90611378600d61121d565b61139161138b611386611f2e565b6103ce565b916103ce565b036113a15761139f91611425565b565b6113ca6113ac611f2e565b6113b46102a3565b9182916332b2baa360e01b8352600483016103e7565b0390fd5b6113e26113dd6113e79261122a565b61062d565b610456565b90565b634e487b7160e01b600052601160045260246000fd5b61140f61141591939293610456565b92610456565b820180921161142057565b6113ea565b7f0000000000000000000000000000000000000000ec58f3fd6e6570e3fa00000061145961145360006113ce565b91610456565b1415806114f0575b6114cd578061148161147b6114766000611249565b6103ce565b916103ce565b1461149e5761149c916114946000611249565b919091612172565b565b6114c96114ab6000611249565b6114b36102a3565b91829163ec442f0560e01b8352600483016103e7565b0390fd5b6114d56102a3565b63d05cb60960e01b8152806114ec600482016105f1565b0390fd5b506115056114fe60036111a4565b8390611400565b6115376115317f0000000000000000000000000000000000000000ec58f3fd6e6570e3fa000000610456565b91610456565b11611461565b906115479161136d565b565b634e487b7160e01b600052601260045260246000fd5b61156b61157191610456565b91610456565b90811561157c570490565b611549565b611589611185565b506115a761159760046111a4565b6115a160096111a4565b9061155f565b90565b906115b49061129e565b600052602052604060002090565b60ff1690565b6115d46115d99161118a565b6115c2565b90565b6115e690546115c8565b90565b906115f39061129e565b600052602052604060002090565b611609611185565b5061161e611619601083906115aa565b6115dc565b61164b5761163861163361164892600e6115e9565b6111a4565b61164260096111a4565b9061155f565b90565b61166161165c61166f92600e6115e9565b6111a4565b611669610f5e565b9061155f565b90565b61167a6120d8565b611682611684565b565b6116966116916000611249565b6123cc565b565b6116a0611672565b565b6116b96116be916116b161115e565b5060106115aa565b6115dc565b90565b6116d2906116cd6120d8565b6117c9565b565b906116e060ff91611255565b9181191691161790565b6116f3906104ab565b90565b90565b9061170e611709611715926116ea565b6116f6565b82546116d4565b9055565b61172861172e91939293610456565b92610456565b820391821161173957565b6113ea565b9061174b60001991611255565b9181191691161790565b61176961176461176e92610456565b61062d565b610456565b90565b90565b9061178961178461179092611755565b611771565b825461173e565b9055565b6117a36117a991939293610456565b92610456565b916117b5838202610456565b9281840414901517156117c457565b6113ea565b6117dd6117d8601083906115aa565b6115dc565b6118bf576117f760016117f2601084906115aa565b6116f9565b61187d611876611852611842611817611812600e87906115e9565b6111a4565b61183461182d8261182860046111a4565b611719565b6004611774565b61183c610f5e565b90611794565b61184c60096111a4565b9061155f565b61186781611862600e87906115e9565b611774565b61187160056111a4565b611400565b6005611774565b6118a77f9cebc3415f29f3a72d88a3509a7de71248d7362a11a5a188c070be993cc1d7c19161129e565b906118b06102a3565b806118ba816105f1565b0390a2565b6118c76102a3565b6377e63f1f60e11b8152806118de600482016105f1565b0390fd5b6118eb906116c1565b565b906118ff916118fa6120d8565b611901565b565b908161191c61191661191161064c565b610456565b91610456565b10611a42578161193b6119356119306108f5565b610456565b91610456565b11611a1f578061195a61195461194f610df1565b610456565b91610456565b116119fc5761196d61197492600b611774565b600a611774565b61197e600b6111a4565b6119b47f46b0a99fa4799189e0af4d080d5a9185083eef96b02557c64fa811984f4b5c25916119ab6102a3565b91829182610516565b0390a16119c1600a6111a4565b6119f77f30950c5e459448c67a27b95b972d10595000175c14cbac7e0d91ec8d0911e7b4916119ee6102a3565b91829182610516565b0390a1565b611a046102a3565b63193a01fb60e01b815280611a1b600482016105f1565b0390fd5b611a276102a3565b630f86871760e11b815280611a3e600482016105f1565b0390fd5b611a4a6102a3565b63b95df78760e01b815280611a61600482016105f1565b0390fd5b90611a6f916118ed565b565b600090565b611a7e611a71565b50611a89600061121d565b90565b611a94610fe6565b50611a9f600261113c565b90565b90611aad600c61121d565b611ac6611ac0611abb611f2e565b6103ce565b916103ce565b03611ad657611ad491611b27565b565b611aff611ae1611f2e565b611ae96102a3565b9182916332b2baa360e01b8352600483016103e7565b0390fd5b916020611b25929493611b1e60408201966000830190610509565b0190610509565b565b90611b45611b3e82611b3960066111a4565b611719565b6006611774565b611b4d611f2e565b8190611b5960066111a4565b611b837f330cb712f04961497080da66a1f756f88bc9a4846dce611f510ab4108c3236019261129e565b92611b98611b8f6102a3565b92839283611b03565b0390a281611bb7611bb1611bac6000611249565b6103ce565b916103ce565b14611bd457611bd29190611bcb6000611249565b9091612172565b565b611bff611be16000611249565b611be96102a3565b918291634b637e8f60e11b8352600483016103e7565b0390fd5b90611c0d91611aa2565b565b611c17611185565b50611c31611c23611581565b611c2b611dcd565b90611400565b90565b611c4590611c406120d8565b611c47565b565b611c64611c5e611c59601084906115aa565b6115dc565b156104ab565b611d4657611c7e6000611c79601084906115aa565b6116f9565b611d04611cfd611cd9611ccb611c9e611c99600e87906115e9565b6111a4565b611cbb611cb482611caf60056111a4565b611719565b6005611774565b611cc560096111a4565b90611794565b611cd3610f5e565b9061155f565b611cee81611ce9600e87906115e9565b611774565b611cf860046111a4565b611400565b6004611774565b611d2e7f7a2494cd48659935b016226d48d4e071295f9c61797e2b884b416faf71ce00339161129e565b90611d376102a3565b80611d41816105f1565b0390a2565b611d4e6102a3565b635c68a36560e01b815280611d65600482016105f1565b0390fd5b611d7290611c34565b565b611d9191611d8061115e565b50611d89611f2e565b919091612021565b600190565b611d9e612565565b565b611da8611185565b507f0000000000000000000000000000000000000000ec58f3fd6e6570e3fa00000090565b611dd5611185565b50611df1611de360056111a4565b611deb610f5e565b9061155f565b90565b90611dfe9061129e565b600052602052604060002090565b611e3191611e27611e2c92611e1f611185565b50600f611df4565b6115e9565b6111a4565b90565b611e4590611e406120d8565b611e47565b565b80611e63611e5d611e586000611249565b6103ce565b916103ce565b14611e7357611e71906123cc565b565b611e9e611e806000611249565b611e886102a3565b91829163b20f76e360e01b8352600483016103e7565b0390fd5b611eab90611e34565b565b611ebe90611eb96120d8565b611ec0565b565b611eca600d61121d565b611ee5611edf611eda6000611249565b6103ce565b916103ce565b03611f005780611ef7611efe9261212d565b600d6112ad565b565b611f086102a3565b63f119708d60e01b815280611f1f600482016105f1565b0390fd5b611f2c90611ead565b565b611f36611a71565b503390565b91611f49929160019261270f565b565b604090611f75611f7c9496959396611f6b606084019860008501906103da565b6020830190610509565b0190610509565b565b90611f899103610456565b90565b929192611f9a818390611e0c565b9081611fb0611faa600019610456565b91610456565b03611fbd575b5050509050565b81611fd0611fca87610456565b91610456565b10611ff757611fee9394611fe5919392611f7e565b9060009261270f565b80388080611fb6565b5061201d849291926120076102a3565b938493637dc7a0d960e11b855260048501611f4b565b0390fd5b918261203e6120386120336000611249565b6103ce565b916103ce565b146120a9578161205f6120596120546000611249565b6103ce565b916103ce565b1461207a5761207092919091612172565b612078612565565b565b6120a56120876000611249565b61208f6102a3565b91829163ec442f0560e01b8352600483016103e7565b0390fd5b6120d46120b66000611249565b6120be6102a3565b918291634b637e8f60e11b8352600483016103e7565b0390fd5b6120e0611a76565b6120f96120f36120ee611f2e565b6103ce565b916103ce565b0361210057565b61212961210b611f2e565b6121136102a3565b9182916332b2baa360e01b8352600483016103e7565b0390fd5b61214861214261213d6000611249565b6103ce565b916103ce565b1461214f57565b6121576102a3565b63d92e233d60e01b81528061216e600482016105f1565b0390fd5b9190918061219161218b6121866000611249565b6103ce565b916103ce565b14600014612259576121b66121af836121aa60036111a4565b611400565b6003611774565b5b826121d36121cd6121c86000611249565b6103ce565b916103ce565b14600014612249576121f86121f1836121ec60036111a4565b611f7e565b6003611774565b5b91909161224461223261222c7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9361129e565b9361129e565b9361223b6102a3565b91829182610516565b0390a3565b612254838390612830565b6121f9565b61226d612268600e83906115e9565b6111a4565b612275611185565b5061228a612285601084906115aa565b6115dc565b600014612338576122a38361229d610f5e565b90611794565b90806122b76122b184610456565b91610456565b106122fd57816122e7916122e16122da6122f8956122d560056111a4565b611719565b6005611774565b5b611f7e565b6122f3600e84906115e9565b611774565b6121b7565b8390612334612315859261230f610f5e565b9061155f565b9261231e6102a3565b93849363391434e360e21b855260048501611f4b565b0390fd5b61234c8361234660096111a4565b90611794565b908061236061235a84610456565b91610456565b1061238f57816122e79161238a6123836122f89561237e60046111a4565b611719565b6004611774565b6122e2565b83906123c86123a985926123a360096111a4565b9061155f565b926123b26102a3565b93849363391434e360e21b855260048501611f4b565b0390fd5b6123d6600061121d565b6123e18260006112ad565b9061241561240f7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09361129e565b9161129e565b9161241e6102a3565b80612428816105f1565b0390a3565b90565b61244461243f6124499261242d565b61062d565b610456565b90565b60011c90565b939190925b60018211612463575050565b909192808204811161249c576001831661248d575b8061248491029261244c565b90929192612457565b93846124849102949050612478565b6113ea565b929192811561253a578015612531578080600114612527576002146125085760208210610133821016604e8310600b831016176124f957926124e7918193946001612452565b80920481116124f4570290565b6113ea565b0a91821161250357565b6113ea565b5060ff81116125225760020a91821161251d57565b6113ea565b6113ea565b5050509050600190565b50509050600090565b50509050600190565b9061255961255361256293610456565b91610456565b600019916124a1565b90565b4261258161257b61257660086111a4565b610456565b91610456565b1061270d576125c06125b06125a04261259a60086111a4565b90611719565b6125aa600b6111a4565b9061155f565b6125ba6001612430565b90611400565b806125da6125d46125cf610d40565b610456565b91610456565b116126ff575b6125ea600a6111a4565b6125fd6125f760006113ce565b91610456565b146126fc576126549061264f61263f61263161262a61261a610b89565b612624600a6111a4565b90611400565b8490612543565b9261263a610b89565b612543565b9161264a60096111a4565b611794565b61155f565b8061266e612668612663610878565b610456565b91610456565b116126f95761267b612904565b612686816009611774565b6126be6126b761269660066111a4565b6126b16126a360036111a4565b6126ab611c0f565b90611719565b90611719565b6007611774565b6126f47fc1c07021cd444bdc21076f63018ccc10a6498d200ab3d95ef513c3fcb7f8033a916126eb6102a3565b91829182610516565b0390a1565b50565b50565b50612708610d40565b6125e0565b565b90928161272d6127276127226000611249565b6103ce565b916103ce565b14612801578361274e6127486127436000611249565b6103ce565b916103ce565b146127d2576127728361276d612766600f8690611df4565b87906115e9565b611774565b61277c575b505050565b9190916127c76127b56127af7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259361129e565b9361129e565b936127be6102a3565b91829182610516565b0390a3388080612777565b6127fd6127df6000611249565b6127e76102a3565b918291634a1406b160e11b8352600483016103e7565b0390fd5b61282c61280e6000611249565b6128166102a3565b91829163e602df0560e01b8352600483016103e7565b0390fd5b90612845612840601084906115aa565b6115dc565b6000146128a6576128a39161288d61286861289c93612862610f5e565b90611794565b916128876128788492600e6115e9565b91612882836111a4565b611400565b90611774565b61289760056111a4565b611400565b6005611774565b5b565b6128ff916128e96128c46128f8936128be60096111a4565b90611794565b916128e36128d48492600e6115e9565b916128de836111a4565b611400565b90611774565b6128f360046111a4565b611400565b6004611774565b6128a4565b6129486129416129316129214261291b600b6111a4565b9061155f565b61292b600b6111a4565b90611794565b61293b600b6111a4565b90611400565b6008611774565b56fea26469706673582212208881b635118b756a2c12675fe702d72ce09727d88de845bae1414e762a6ba08064736f6c63430008180033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000ec58f3fd6e6570e3fa000000000000000000000000000000000000000000000000000000000000000000000553746f757400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045354545800000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : name_ (string): Stout
Arg [1] : symbol_ (string): STTX
Arg [2] : decimals_ (uint8): 18
Arg [3] : maxSupply_ (uint256): 73146000000000000000000000000
-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000012
Arg [3] : 0000000000000000000000000000000000000000ec58f3fd6e6570e3fa000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [5] : 53746f7574000000000000000000000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [7] : 5354545800000000000000000000000000000000000000000000000000000000
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.