S Price: $0.601414 (-19.58%)

Token

Stout (STTX)

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)

Balance
0 STTX

Value
$0.00
0x6e8e930525d80196187705b0bf43fa1802c91788
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information

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
File 1 of 6 : STTX.sol
// 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();
        }
    }
}

File 2 of 6 : Context.sol
// 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;
    }
}

File 3 of 6 : Ownable.sol
// 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());
        }
    }
}

File 4 of 6 : IERC20Custom.sol
// 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);
}

File 5 of 6 : IERC20Errors.sol
// 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);
}

File 6 of 6 : IERC20TokenRebase.sol
// 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);
}

Settings
{
  "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

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"}]

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.