frxETH Price: $3,459.11 (-0.02%)

Token

FXTL Points (FXTL)
 

Overview

Max Total Supply

21,511,974,007 FXTL

Holders

31,739 (0.00%)

Market

Price

$0.00 @ 0.000000 frxETH

Onchain Market Cap

$0.00

Circulating Supply Market Cap

$0.00

Other Info

Token Contract (WITH 0 Decimals)

Balance
101 FXTL

Value
$0.00
0xf9e1d1e9f22c96752356adfd377231528c7e851e
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

The Fraxtal Point System introduces FXTL, a unique ticker representing points within the Fraxtal ecosystem.

Contract Source Code Verified (Exact Match)

Contract Name:
FxtlPoints

Compiler Version
v0.8.23+commit.f704f362

Optimization Enabled:
Yes with 10000 runs

Other Settings:
paris EvmVersion
File 1 of 7 : FxtlPoints.sol
// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity >=0.8.0;

// ====================================================================
// |     ______                   _______                             |
// |    / _____________ __  __   / ____(_____  ____ _____  ________   |
// |   / /_  / ___/ __ `| |/_/  / /_  / / __ \/ __ `/ __ \/ ___/ _ \  |
// |  / __/ / /  / /_/ _>  <   / __/ / / / / / /_/ / / / / /__/  __/  |
// | /_/   /_/   \__,_/_/|_|  /_/   /_/_/ /_/\__,_/_/ /_/\___/\___/   |
// |                                                                  |
// ====================================================================
// =========================== Fxtl Points ============================
// ====================================================================

import { OwnedV2 } from "src/contracts/VestedFXS-and-Flox/VestedFXS/OwnedV2.sol";
import { IFxtlPointsEvents } from "./IFxtlPointsEvents.sol";
import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol";

/**
 * @title FxtlPoints
 * @author Frax Finance
 * @notice A simple Fxtl point tracking smart contract.
 */
contract FxtlPoints is OwnedV2, ERC20, IFxtlPointsEvents {
    uint256 private _totalPointSupply;

    mapping(address => bool) public isFxtlContributor;
    mapping(address => uint256) private fxtlPointsBalances;

    /**
     * @notice Used to initialize the smart contract.
     * @dev The initial owner is set as the deployer of the smart contract.
     */
    constructor() OwnedV2(msg.sender) ERC20("FXTL Points", "FXTL") {}

    /**
     * @notice Retrieves the Fxtl points balances of multiple point owners at the same time.
     * @param _pointOwners An array of point owners
     * @return An array of Fxtl points balances
     */
    function bulkFxtlPointsBalances(address[] memory _pointOwners) external view returns (uint256[] memory) {
        uint256[] memory balances = new uint256[](_pointOwners.length);

        for (uint256 i; i < _pointOwners.length; ) {
            balances[i] = fxtlPointsBalances[_pointOwners[i]];

            unchecked {
                ++i;
            }
        }

        return balances;
    }

    /**
     * @notice Adds a Fxtl contributor.
     * @dev Can only be called by the owner.
     * @param _contributor The address of the Fxtl contributor to add
     */
    function addFxtlContributor(address _contributor) external {
        _onlyOwner();
        if (isFxtlContributor[_contributor]) revert AlreadyFxtlContributor();
        isFxtlContributor[_contributor] = true;
        emit FxtlContributorAdded(_contributor);
    }

    /**
     * @notice Removes a Fxtl contributor.
     * @dev Can only be called by the owner.
     * @param _contributor The address of the Fxtl contributor to remove
     */
    function removeFxtlContributor(address _contributor) external {
        _onlyOwner();
        if (!isFxtlContributor[_contributor]) revert NotFxtlContributor();
        isFxtlContributor[_contributor] = false;
        emit FxtlContributorRemoved(_contributor);
    }

    /**
     * @notice Adds Fxtl points to a recipient.
     * @dev Can only be called by a Fxtl contributor.
     * @param _recipient Recipient of the Fxtl points
     * @param _amount Amount of Fxtl points to add to the recipient
     */
    function addFxtlPoints(address _recipient, uint256 _amount) external {
        _onlyFxtlContributor();
        fxtlPointsBalances[_recipient] += _amount;
        _totalPointSupply += _amount;
        emit Transfer(address(0), _recipient, _amount);
    }

    /**
     * @notice Removes Fxtl points from a point owner.
     * @dev Can only be called by a Fxtl contributor.
     * @dev Can only remove the amount of Fxtl points that the point owner has.
     * @param _pointOwner Owner of the Fxtl points being removed
     * @param _amount Amount of Fxtl points to remove from the point owner
     */
    function removeFxtlPoints(address _pointOwner, uint256 _amount) external {
        _onlyFxtlContributor();
        if (fxtlPointsBalances[_pointOwner] < _amount) {
            revert InsufficientFxtlPoints(fxtlPointsBalances[_pointOwner], _amount);
        }
        fxtlPointsBalances[_pointOwner] -= _amount;
        _totalPointSupply -= _amount;
        emit Transfer(_pointOwner, address(0), _amount);
    }

    /**
     * @notice Adds Fxtl points to multiple recipients.
     * @dev Can only be called by a Fxtl contributor.
     * @dev If the arrays are different lengths, the operation will be reverted.
     * @param _recipients An array of recipients of the Fxtl points
     * @param _amounts An array of amounts of Fxtl points to add to the recipients
     */
    function bulkAddFxtlPoints(address[] memory _recipients, uint256[] memory _amounts) external {
        _onlyFxtlContributor();
        if (_recipients.length != _amounts.length) revert ArrayLengthMismatch();
        for (uint256 i; i < _recipients.length; ) {
            fxtlPointsBalances[_recipients[i]] += _amounts[i];
            _totalPointSupply += _amounts[i];
            emit Transfer(address(0), _recipients[i], _amounts[i]);

            unchecked {
                ++i;
            }
        }
    }

    /**
     * @notice Removes Fxtl points from multiple point owners.
     * @dev Can only be called by a Fxtl contributor.
     * @dev If the arrays are different lengths, the operation will be reverted.
     * @dev Can only remove the amount of Fxtl points that the point owner has.
     * @param _pointOwners An array of owners of the Fxtl points being removed
     * @param _amounts An array of amounts of Fxtl points to remove from the point owners
     */
    function bulkRemoveFxtlPoints(address[] memory _pointOwners, uint256[] memory _amounts) external {
        _onlyFxtlContributor();
        if (_pointOwners.length != _amounts.length) revert ArrayLengthMismatch();
        for (uint256 i; i < _pointOwners.length; ) {
            if (fxtlPointsBalances[_pointOwners[i]] < _amounts[i]) {
                revert InsufficientFxtlPoints(fxtlPointsBalances[_pointOwners[i]], _amounts[i]);
            }
            fxtlPointsBalances[_pointOwners[i]] -= _amounts[i];
            _totalPointSupply -= _amounts[i];
            emit Transfer(_pointOwners[i], address(0), _amounts[i]);

            unchecked {
                ++i;
            }
        }
    }

    /**
     * @notice Checks if an address is a Fxtl contributor.
     * @dev The operation will be reverted if the caller is not a Fxtlx contributor.
     */
    function _onlyFxtlContributor() internal view {
        if (!isFxtlContributor[msg.sender]) revert NotFxtlContributor();
    }

    // *************************************** ERC20 compatibility & overrides ***************************************

    /**
     * @notice Retrieves the number of decimals for the Fxtl points.
     * @dev This function is an override of the ERC20 function, so that we can pass the 0 value.
     */
    function decimals() public pure override returns (uint8) {
        return 0;
    }

    /**
     * @notice Retrieves the total supply of Fxtl points.
     * @dev This overrides the ERC20 function because we don't have access to `_totalSupply` and we aren't using the
     *  internal transfer method.
     */
    function totalSupply() public view override returns (uint256) {
        return _totalPointSupply;
    }

    /**
     * @notice Retrieves the Fxtl points balance of an account.
     * @dev This overrides the ERC20 function because we don't have access to `_totalSupply` and we aren't using the
     *  internal transfer method.
     * @param account The account to retrieve the FXTL points balance of
     * @return The FXLT points balance of the account
     */
    function balanceOf(address account) public view override returns (uint256) {
        return fxtlPointsBalances[account];
    }

    /**
     * @notice The override of the transfer method to prevent the FXTL token from being transferred.
     * @dev This function will always revert as we don't allow FXTL transfers.
     * @param recipient The recipient of the FXTL points
     * @param amount The amount of FXTL points to transfer
     * @return A boolean indicating if the transfer was successful
     */
    function transfer(address recipient, uint256 amount) public override returns (bool) {
        revert TransferNotAllowed();
    }

    /**
     * @notice The override of the transferFrom method to prevent the FXTL token from being transferred.
     * @dev This function will always revert as we don't allow FXTL transfers.
     * @param sender The sender of the FXTL points
     * @param recipient The recipient of the FXTL points
     * @param amount The amount of FXTL points to transfer
     * @return A boolean indicating if the transfer was successful
     */
    function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) {
        revert TransferNotAllowed();
    }

    /// @notice The address is already a Fxtl contributor
    error AlreadyFxtlContributor();
    /// @notice The array lengths are mismatched
    error ArrayLengthMismatch();
    /**
     * @notice The amount of Fxtl points is insufficient.
     * @param available The amount of Fxtl points available
     * @param attempted The amount of Fxtl points attempted to be removed
     */
    error InsufficientFxtlPoints(uint256 available, uint256 attempted);
    /// @notice Only Fxtl contributor is allowed to perform this call
    error NotFxtlContributor();
    /// @notice The FXTL token is not allowed to be transferred
    error TransferNotAllowed();
}

File 2 of 7 : OwnedV2.sol
// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity >=0.8.0;

// https://docs.synthetix.io/contracts/Owned
contract OwnedV2 {
    error OwnerCannotBeZero();
    error InvalidOwnershipAcceptance();
    error OnlyOwner();

    address public owner;
    address public nominatedOwner;

    constructor(address _owner) {
        // require(_owner != address(0), "Owner address cannot be 0");
        if (_owner == address(0)) revert OwnerCannotBeZero();
        owner = _owner;
        emit OwnerChanged(address(0), _owner);
    }

    function nominateNewOwner(address _owner) external onlyOwner {
        nominatedOwner = _owner;
        emit OwnerNominated(_owner);
    }

    function acceptOwnership() external {
        // require(msg.sender == nominatedOwner, "You must be nominated before you can accept ownership");
        if (msg.sender != nominatedOwner) revert InvalidOwnershipAcceptance();
        emit OwnerChanged(owner, nominatedOwner);
        owner = nominatedOwner;
        nominatedOwner = address(0);
    }

    modifier onlyOwner() {
        // require(msg.sender == owner, "Only the contract owner may perform this action");
        if (msg.sender != owner) revert OnlyOwner();
        _;
    }

    function _onlyOwner() internal view {
        if (msg.sender != owner) revert OnlyOwner();
    }

    event OwnerNominated(address newOwner);
    event OwnerChanged(address oldOwner, address newOwner);
}

File 3 of 7 : IFxtlPointsEvents.sol
// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity >=0.8.0;

// ====================================================================
// |     ______                   _______                             |
// |    / _____________ __  __   / ____(_____  ____ _____  ________   |
// |   / /_  / ___/ __ `| |/_/  / /_  / / __ \/ __ `/ __ \/ ___/ _ \  |
// |  / __/ / /  / /_/ _>  <   / __/ / / / / / /_/ / / / / /__/  __/  |
// | /_/   /_/   \__,_/_/|_|  /_/   /_/_/ /_/\__,_/_/ /_/\___/\___/   |
// |                                                                  |
// ====================================================================
// ======================== IFxtlPointsEvents =========================
// ====================================================================

/**
 * @title IFxtlPointsEvents
 * @author Frax Finance
 * @notice A collection of events used by the Flox FxtlPoints
 */
contract IFxtlPointsEvents {
    /**
     * @notice Emitted when a new address is added as a Fxtl Contributor.
     * @param contributor The address added as the contributor
     */
    event FxtlContributorAdded(address indexed contributor);

    /**
     * @notice Emitted when an address is removed as a Fxtl Contributor.
     * @param contributor The address removed as the contributor
     */
    event FxtlContributorRemoved(address indexed contributor);
}

File 4 of 7 : ERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.0;

import "./IERC20.sol";
import "./extensions/IERC20Metadata.sol";
import "../../utils/Context.sol";

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

    mapping(address => mapping(address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless this function is
     * overridden;
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address to, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, allowance(owner, spender) + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        address owner = _msgSender();
        uint256 currentAllowance = allowance(owner, spender);
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `from` to `to`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
        }
        _balances[to] += amount;

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Updates `owner` s allowance for `spender` based on spent `amount`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

File 5 of 7 : IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);
}

File 6 of 7 : IERC20Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;

import "../IERC20.sol";

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

File 7 of 7 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @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, since 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).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

Settings
{
  "remappings": [
    "frax-std/=lib/frax-standard-solidity/src/",
    "@eth-optimism/=lib/optimism/packages/",
    "lib/optimism/packages/contracts-bedrock:src/=lib/optimism/packages/contracts-bedrock/src/",
    "src/=src/",
    "@openzeppelin-4/=node_modules/@openzeppelin-4/",
    "@openzeppelin-5/=node_modules/@openzeppelin-5/",
    "@openzeppelin/=node_modules/@openzeppelin/",
    "@rari-capital/=node_modules/@rari-capital/",
    "clones-with-immutable-args/=lib/optimism/packages/contracts-bedrock/lib/clones-with-immutable-args/src/",
    "ds-test/=lib/frax-standard-solidity/lib/forge-std/lib/ds-test/src/",
    "forge-std/=lib/frax-standard-solidity/lib/forge-std/src/",
    "frax-standard-solidity/=lib/frax-standard-solidity/src/",
    "kontrol-cheatcodes/=lib/optimism/packages/contracts-bedrock/lib/kontrol-cheatcodes/src/",
    "lib-keccak/=lib/optimism/packages/contracts-bedrock/lib/lib-keccak/contracts/",
    "openzeppelin-contracts-upgradeable/=lib/optimism/packages/contracts-bedrock/lib/openzeppelin-contracts-upgradeable/",
    "openzeppelin-contracts/=lib/optimism/packages/contracts-bedrock/lib/openzeppelin-contracts/",
    "optimism/=lib/optimism/",
    "safe-contracts/=lib/optimism/packages/contracts-bedrock/lib/safe-contracts/contracts/",
    "solady/=lib/optimism/packages/contracts-bedrock/lib/solady/",
    "solidity-bytes-utils/=lib/frax-standard-solidity/lib/solidity-bytes-utils/",
    "solmate/=lib/optimism/packages/contracts-bedrock/lib/solmate/src/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 10000
  },
  "metadata": {
    "useLiteralContent": false,
    "bytecodeHash": "ipfs",
    "appendCBOR": true
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "paris",
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AlreadyFxtlContributor","type":"error"},{"inputs":[],"name":"ArrayLengthMismatch","type":"error"},{"inputs":[{"internalType":"uint256","name":"available","type":"uint256"},{"internalType":"uint256","name":"attempted","type":"uint256"}],"name":"InsufficientFxtlPoints","type":"error"},{"inputs":[],"name":"InvalidOwnershipAcceptance","type":"error"},{"inputs":[],"name":"NotFxtlContributor","type":"error"},{"inputs":[],"name":"OnlyOwner","type":"error"},{"inputs":[],"name":"OwnerCannotBeZero","type":"error"},{"inputs":[],"name":"TransferNotAllowed","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":true,"internalType":"address","name":"contributor","type":"address"}],"name":"FxtlContributorAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"contributor","type":"address"}],"name":"FxtlContributorRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldOwner","type":"address"},{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerNominated","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":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contributor","type":"address"}],"name":"addFxtlContributor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"addFxtlPoints","outputs":[],"stateMutability":"nonpayable","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":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_recipients","type":"address[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"bulkAddFxtlPoints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_pointOwners","type":"address[]"}],"name":"bulkFxtlPointsBalances","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_pointOwners","type":"address[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"bulkRemoveFxtlPoints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isFxtlContributor","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"nominateNewOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"nominatedOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_contributor","type":"address"}],"name":"removeFxtlContributor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_pointOwner","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"removeFxtlPoints","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":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b50604080518082018252600b81526a4658544c20506f696e747360a81b602080830191909152825180840190935260048352631196151360e21b908301529033806200007057604051639b15e16f60e01b815260040160405180910390fd5b600080546001600160a01b0319166001600160a01b03831690811782556040805192835260208301919091527fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c910160405180910390a1506005620000d6838262000195565b506006620000e5828262000195565b50505062000261565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200011957607f821691505b6020821081036200013a57634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000190576000816000526020600020601f850160051c810160208610156200016b5750805b601f850160051c820191505b818110156200018c5782815560010162000177565b5050505b505050565b81516001600160401b03811115620001b157620001b1620000ee565b620001c981620001c2845462000104565b8462000140565b602080601f831160018114620002015760008415620001e85750858301515b600019600386901b1c1916600185901b1785556200018c565b600085815260208120601f198616915b82811015620002325788860151825594840194600190910190840162000211565b5085821015620002515787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6117bf80620002716000396000f3fe608060405234801561001057600080fd5b506004361061018d5760003560e01c806353a47bb7116100e3578063a457c2d71161008c578063d58fd49a11610066578063d58fd49a1461037a578063d614c58a1461038d578063dd62ed3e146103b057600080fd5b8063a457c2d714610346578063a9059cbb14610359578063c171c6551461036757600080fd5b806379ba5097116100bd57806379ba5097146103165780638da5cb5b1461031e57806395d89b411461033e57600080fd5b806353a47bb71461027b5780636112f9af146102c057806370a08231146102e057600080fd5b806323b872dd11610145578063313ce5671161011f578063313ce5671461024657806339509351146102555780634d0b54d81461026857600080fd5b806323b872dd1461020d57806325fda3d1146102205780632bbd3e841461023357600080fd5b80630f836e07116101765780630f836e07146101d35780631627540c146101e857806318160ddd146101fb57600080fd5b806306fdde0314610192578063095ea7b3146101b0575b600080fd5b61019a6103f6565b6040516101a7919061130d565b60405180910390f35b6101c36101be3660046113a3565b610488565b60405190151581526020016101a7565b6101e66101e13660046113a3565b6104a2565b005b6101e66101f63660046113cd565b610550565b6007545b6040519081526020016101a7565b6101c361021b3660046113ef565b61061a565b6101e661022e366004611543565b61064e565b6101e66102413660046113cd565b61091b565b604051600081526020016101a7565b6101c36102633660046113a3565b6109f6565b6101e6610276366004611543565b610a42565b60015461029b9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101a7565b6102d36102ce3660046115fe565b610bed565b6040516101a7919061163b565b6101ff6102ee3660046113cd565b73ffffffffffffffffffffffffffffffffffffffff1660009081526009602052604090205490565b6101e6610cc8565b60005461029b9073ffffffffffffffffffffffffffffffffffffffff1681565b61019a610dbd565b6101c36103543660046113a3565b610dcc565b6101c361021b3660046113a3565b6101e66103753660046113a3565b610ea8565b6101e66103883660046113cd565b610fdf565b6101c361039b3660046113cd565b60086020526000908152604090205460ff1681565b6101ff6103be36600461167f565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260036020908152604080832093909416825291909152205490565b606060058054610405906116b2565b80601f0160208091040260200160405190810160405280929190818152602001828054610431906116b2565b801561047e5780601f106104535761010080835404028352916020019161047e565b820191906000526020600020905b81548152906001019060200180831161046157829003601f168201915b5050505050905090565b6000336104968185856110be565b60019150505b92915050565b6104aa611271565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260096020526040812080548392906104df908490611734565b9250508190555080600760008282546104f89190611734565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a35050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146105a1576040517f5fc483c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f906a1c6bd7e3091ea86693dd029a831c19049ce77f1dce2ce0bab1cacbabce229060200160405180910390a150565b60006040517f8cd22d1900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610656611271565b8051825114610691576040517fa24a13a600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b8251811015610916578181815181106106af576106af611747565b6020026020010151600960008584815181106106cd576106cd611747565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156107cf576009600084838151811061072c5761072c611747565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482828151811061078157610781611747565b60200260200101516040517fd81a0a750000000000000000000000000000000000000000000000000000000081526004016107c6929190918252602082015260400190565b60405180910390fd5b8181815181106107e1576107e1611747565b6020026020010151600960008584815181106107ff576107ff611747565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546108509190611776565b9250508190555081818151811061086957610869611747565b6020026020010151600760008282546108829190611776565b9091555050825160009084908390811061089e5761089e611747565b602002602001015173ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8484815181106108ef576108ef611747565b602002602001015160405161090691815260200190565b60405180910390a3600101610694565b505050565b6109236112bc565b73ffffffffffffffffffffffffffffffffffffffff811660009081526008602052604090205460ff16610982576040517f8e6c615c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff811660008181526008602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055517fd12b6212ff135eb13602620025372b793c032c25d91b4626f5122dd6ddd3da7d9190a250565b33600081815260036020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104969082908690610a3d908790611734565b6110be565b610a4a611271565b8051825114610a85576040517fa24a13a600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b825181101561091657818181518110610aa357610aa3611747565b602002602001015160096000858481518110610ac157610ac1611747565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610b129190611734565b92505081905550818181518110610b2b57610b2b611747565b602002602001015160076000828254610b449190611734565b92505081905550828181518110610b5d57610b5d611747565b602002602001015173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef848481518110610bc657610bc6611747565b6020026020010151604051610bdd91815260200190565b60405180910390a3600101610a88565b60606000825167ffffffffffffffff811115610c0b57610c0b61142b565b604051908082528060200260200182016040528015610c34578160200160208202803683370190505b50905060005b8351811015610cc15760096000858381518110610c5957610c59611747565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054828281518110610cae57610cae611747565b6020908102919091010152600101610c3a565b5092915050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610d19576040517fd74b334e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000546001546040805173ffffffffffffffffffffffffffffffffffffffff93841681529290911660208301527fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c910160405180910390a160018054600080547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff841617909155169055565b606060068054610405906116b2565b33600081815260036020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610e90576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084016107c6565b610e9d82868684036110be565b506001949350505050565b610eb0611271565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260096020526040902054811115610f415773ffffffffffffffffffffffffffffffffffffffff8216600090815260096020526040908190205490517fd81a0a750000000000000000000000000000000000000000000000000000000081526004810191909152602481018290526044016107c6565b73ffffffffffffffffffffffffffffffffffffffff821660009081526009602052604081208054839290610f76908490611776565b925050819055508060076000828254610f8f9190611776565b909155505060405181815260009073ffffffffffffffffffffffffffffffffffffffff8416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001610544565b610fe76112bc565b73ffffffffffffffffffffffffffffffffffffffff811660009081526008602052604090205460ff1615611047576040517ffb3b211f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff811660008181526008602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055517fe65fe402339208383f5099232b75931c31cab59b26dc286ec0ab4de32d3dd0fa9190a250565b73ffffffffffffffffffffffffffffffffffffffff8316611160576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016107c6565b73ffffffffffffffffffffffffffffffffffffffff8216611203576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f737300000000000000000000000000000000000000000000000000000000000060648201526084016107c6565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526003602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b3360009081526008602052604090205460ff166112ba576040517f8e6c615c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b60005473ffffffffffffffffffffffffffffffffffffffff1633146112ba576040517f5fc483c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006020808352835180602085015260005b8181101561133b5785810183015185820160400152820161131f565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461139e57600080fd5b919050565b600080604083850312156113b657600080fd5b6113bf8361137a565b946020939093013593505050565b6000602082840312156113df57600080fd5b6113e88261137a565b9392505050565b60008060006060848603121561140457600080fd5b61140d8461137a565b925061141b6020850161137a565b9150604084013590509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156114a1576114a161142b565b604052919050565b600067ffffffffffffffff8211156114c3576114c361142b565b5060051b60200190565b600082601f8301126114de57600080fd5b813560206114f36114ee836114a9565b61145a565b8083825260208201915060208460051b87010193508684111561151557600080fd5b602086015b848110156115385761152b8161137a565b835291830191830161151a565b509695505050505050565b6000806040838503121561155657600080fd5b823567ffffffffffffffff8082111561156e57600080fd5b61157a868387016114cd565b935060209150818501358181111561159157600080fd5b85019050601f810186136115a457600080fd5b80356115b26114ee826114a9565b81815260059190911b820183019083810190888311156115d157600080fd5b928401925b828410156115ef578335825292840192908401906115d6565b80955050505050509250929050565b60006020828403121561161057600080fd5b813567ffffffffffffffff81111561162757600080fd5b611633848285016114cd565b949350505050565b6020808252825182820181905260009190848201906040850190845b8181101561167357835183529284019291840191600101611657565b50909695505050505050565b6000806040838503121561169257600080fd5b61169b8361137a565b91506116a96020840161137a565b90509250929050565b600181811c908216806116c657607f821691505b6020821081036116ff577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561049c5761049c611705565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b8181038181111561049c5761049c61170556fea264697066735822122003f2e4ae7b09639d06e0e3283b6380b00220cbb7fae2e7f52d4df7870fe7b2a364736f6c63430008170033

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061018d5760003560e01c806353a47bb7116100e3578063a457c2d71161008c578063d58fd49a11610066578063d58fd49a1461037a578063d614c58a1461038d578063dd62ed3e146103b057600080fd5b8063a457c2d714610346578063a9059cbb14610359578063c171c6551461036757600080fd5b806379ba5097116100bd57806379ba5097146103165780638da5cb5b1461031e57806395d89b411461033e57600080fd5b806353a47bb71461027b5780636112f9af146102c057806370a08231146102e057600080fd5b806323b872dd11610145578063313ce5671161011f578063313ce5671461024657806339509351146102555780634d0b54d81461026857600080fd5b806323b872dd1461020d57806325fda3d1146102205780632bbd3e841461023357600080fd5b80630f836e07116101765780630f836e07146101d35780631627540c146101e857806318160ddd146101fb57600080fd5b806306fdde0314610192578063095ea7b3146101b0575b600080fd5b61019a6103f6565b6040516101a7919061130d565b60405180910390f35b6101c36101be3660046113a3565b610488565b60405190151581526020016101a7565b6101e66101e13660046113a3565b6104a2565b005b6101e66101f63660046113cd565b610550565b6007545b6040519081526020016101a7565b6101c361021b3660046113ef565b61061a565b6101e661022e366004611543565b61064e565b6101e66102413660046113cd565b61091b565b604051600081526020016101a7565b6101c36102633660046113a3565b6109f6565b6101e6610276366004611543565b610a42565b60015461029b9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101a7565b6102d36102ce3660046115fe565b610bed565b6040516101a7919061163b565b6101ff6102ee3660046113cd565b73ffffffffffffffffffffffffffffffffffffffff1660009081526009602052604090205490565b6101e6610cc8565b60005461029b9073ffffffffffffffffffffffffffffffffffffffff1681565b61019a610dbd565b6101c36103543660046113a3565b610dcc565b6101c361021b3660046113a3565b6101e66103753660046113a3565b610ea8565b6101e66103883660046113cd565b610fdf565b6101c361039b3660046113cd565b60086020526000908152604090205460ff1681565b6101ff6103be36600461167f565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260036020908152604080832093909416825291909152205490565b606060058054610405906116b2565b80601f0160208091040260200160405190810160405280929190818152602001828054610431906116b2565b801561047e5780601f106104535761010080835404028352916020019161047e565b820191906000526020600020905b81548152906001019060200180831161046157829003601f168201915b5050505050905090565b6000336104968185856110be565b60019150505b92915050565b6104aa611271565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260096020526040812080548392906104df908490611734565b9250508190555080600760008282546104f89190611734565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a35050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146105a1576040517f5fc483c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f906a1c6bd7e3091ea86693dd029a831c19049ce77f1dce2ce0bab1cacbabce229060200160405180910390a150565b60006040517f8cd22d1900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610656611271565b8051825114610691576040517fa24a13a600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b8251811015610916578181815181106106af576106af611747565b6020026020010151600960008584815181106106cd576106cd611747565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156107cf576009600084838151811061072c5761072c611747565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482828151811061078157610781611747565b60200260200101516040517fd81a0a750000000000000000000000000000000000000000000000000000000081526004016107c6929190918252602082015260400190565b60405180910390fd5b8181815181106107e1576107e1611747565b6020026020010151600960008584815181106107ff576107ff611747565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546108509190611776565b9250508190555081818151811061086957610869611747565b6020026020010151600760008282546108829190611776565b9091555050825160009084908390811061089e5761089e611747565b602002602001015173ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8484815181106108ef576108ef611747565b602002602001015160405161090691815260200190565b60405180910390a3600101610694565b505050565b6109236112bc565b73ffffffffffffffffffffffffffffffffffffffff811660009081526008602052604090205460ff16610982576040517f8e6c615c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff811660008181526008602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055517fd12b6212ff135eb13602620025372b793c032c25d91b4626f5122dd6ddd3da7d9190a250565b33600081815260036020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104969082908690610a3d908790611734565b6110be565b610a4a611271565b8051825114610a85576040517fa24a13a600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b825181101561091657818181518110610aa357610aa3611747565b602002602001015160096000858481518110610ac157610ac1611747565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610b129190611734565b92505081905550818181518110610b2b57610b2b611747565b602002602001015160076000828254610b449190611734565b92505081905550828181518110610b5d57610b5d611747565b602002602001015173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef848481518110610bc657610bc6611747565b6020026020010151604051610bdd91815260200190565b60405180910390a3600101610a88565b60606000825167ffffffffffffffff811115610c0b57610c0b61142b565b604051908082528060200260200182016040528015610c34578160200160208202803683370190505b50905060005b8351811015610cc15760096000858381518110610c5957610c59611747565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054828281518110610cae57610cae611747565b6020908102919091010152600101610c3a565b5092915050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610d19576040517fd74b334e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000546001546040805173ffffffffffffffffffffffffffffffffffffffff93841681529290911660208301527fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c910160405180910390a160018054600080547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff841617909155169055565b606060068054610405906116b2565b33600081815260036020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610e90576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084016107c6565b610e9d82868684036110be565b506001949350505050565b610eb0611271565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260096020526040902054811115610f415773ffffffffffffffffffffffffffffffffffffffff8216600090815260096020526040908190205490517fd81a0a750000000000000000000000000000000000000000000000000000000081526004810191909152602481018290526044016107c6565b73ffffffffffffffffffffffffffffffffffffffff821660009081526009602052604081208054839290610f76908490611776565b925050819055508060076000828254610f8f9190611776565b909155505060405181815260009073ffffffffffffffffffffffffffffffffffffffff8416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001610544565b610fe76112bc565b73ffffffffffffffffffffffffffffffffffffffff811660009081526008602052604090205460ff1615611047576040517ffb3b211f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff811660008181526008602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055517fe65fe402339208383f5099232b75931c31cab59b26dc286ec0ab4de32d3dd0fa9190a250565b73ffffffffffffffffffffffffffffffffffffffff8316611160576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016107c6565b73ffffffffffffffffffffffffffffffffffffffff8216611203576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f737300000000000000000000000000000000000000000000000000000000000060648201526084016107c6565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526003602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b3360009081526008602052604090205460ff166112ba576040517f8e6c615c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b60005473ffffffffffffffffffffffffffffffffffffffff1633146112ba576040517f5fc483c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006020808352835180602085015260005b8181101561133b5785810183015185820160400152820161131f565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461139e57600080fd5b919050565b600080604083850312156113b657600080fd5b6113bf8361137a565b946020939093013593505050565b6000602082840312156113df57600080fd5b6113e88261137a565b9392505050565b60008060006060848603121561140457600080fd5b61140d8461137a565b925061141b6020850161137a565b9150604084013590509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156114a1576114a161142b565b604052919050565b600067ffffffffffffffff8211156114c3576114c361142b565b5060051b60200190565b600082601f8301126114de57600080fd5b813560206114f36114ee836114a9565b61145a565b8083825260208201915060208460051b87010193508684111561151557600080fd5b602086015b848110156115385761152b8161137a565b835291830191830161151a565b509695505050505050565b6000806040838503121561155657600080fd5b823567ffffffffffffffff8082111561156e57600080fd5b61157a868387016114cd565b935060209150818501358181111561159157600080fd5b85019050601f810186136115a457600080fd5b80356115b26114ee826114a9565b81815260059190911b820183019083810190888311156115d157600080fd5b928401925b828410156115ef578335825292840192908401906115d6565b80955050505050509250929050565b60006020828403121561161057600080fd5b813567ffffffffffffffff81111561162757600080fd5b611633848285016114cd565b949350505050565b6020808252825182820181905260009190848201906040850190845b8181101561167357835183529284019291840191600101611657565b50909695505050505050565b6000806040838503121561169257600080fd5b61169b8361137a565b91506116a96020840161137a565b90509250929050565b600181811c908216806116c657607f821691505b6020821081036116ff577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561049c5761049c611705565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b8181038181111561049c5761049c61170556fea264697066735822122003f2e4ae7b09639d06e0e3283b6380b00220cbb7fae2e7f52d4df7870fe7b2a364736f6c63430008170033

[ 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.