Contract 0x260b3e40c714ce8196465ec824cd8bb915081812

Txn Hash Method
Block
From
To
Value [Txn Fee]
0x3efac90ed566e33bd3e5a8b573d03c43a171cd3eec42e823fb90042fde691518Approve199001442021-10-23 23:15:0742 mins ago0x5d092b0cfe728b586fd507fa6821208caf5284f0 IN  0x260b3e40c714ce8196465ec824cd8bb9150818120 FTM0.009352154114
0x857dcf3be0b257ef4b33c4237a62049f23aa146eb8b629b5fd5116cfb28f4c06Approve198865982021-10-23 20:09:023 hrs 48 mins ago0xba1912f6714b74ce15599bc3560c0addbbfe7e2d IN  0x260b3e40c714ce8196465ec824cd8bb9150818120 FTM0.008163042501
0x0ea0c4adac3570403ff65133bf03f244a9f329c599fe22ea492587acf3861584Approve198865902021-10-23 20:08:533 hrs 48 mins ago0xba1912f6714b74ce15599bc3560c0addbbfe7e2d IN  0x260b3e40c714ce8196465ec824cd8bb9150818120 FTM0.013264390533
0xf9d8ce6717f71bde307f136ef1927128530439335f98dc20568f3231a02cdca3Approve198684742021-10-23 15:58:267 hrs 58 mins ago0xe0c15e9fe90d56472d8a43da5d3ef34ae955583c IN  0x260b3e40c714ce8196465ec824cd8bb9150818120 FTM0.012273702421
0x3d15aa950119526f8dfd67893c92b5ae00c227b7634def262251d347fe908418Approve198523462021-10-23 12:04:4211 hrs 52 mins ago0x22170ba0236933c1eec6dc543a2fbf2407ccae53 IN  0x260b3e40c714ce8196465ec824cd8bb9150818120 FTM0.009048887731
0x8a9408f09cb64fffa00edcf94dfcd32bc517eda55e83e46e45c3d2c41d4d4e69Approve198520982021-10-23 12:01:2511 hrs 55 mins ago0xb056c48b9d28c304e0b6345d3de7103bb05cde27 IN  0x260b3e40c714ce8196465ec824cd8bb9150818120 FTM0.008821074081
0x557c231e776eaa3fe87cc4c32615ed53edc720b1fc6c21859f5c2581e4de9b63Approve198275392021-10-23 5:59:1317 hrs 58 mins ago0xdf065464c26124ca2113d1dff700c89178a3759f IN  0x260b3e40c714ce8196465ec824cd8bb9150818120 FTM0.009507156972
0x4a5e36f30c01f080fc1add85fe6b91bf9c1d32456a4728572c2be415a98aed20Approve198066462021-10-23 0:55:2623 hrs 1 min ago0x38476bc1deb12f317cabc3f49fbbb80fbab6f3ec IN  0x260b3e40c714ce8196465ec824cd8bb9150818120 FTM0.011671654214
0x90b70467d3af8acf252a48c17e2536b78b21d608b8fe3c06fda12ee2907b862eApprove197548152021-10-22 11:18:481 day 12 hrs ago0x8500eda7591abd2ee46fa256b69aba0bfd5d6201 IN  0x260b3e40c714ce8196465ec824cd8bb9150818120 FTM0.008659440568
0xb8e8a24dab973748e358506b7000fc1e5711eb9c9d2f3185ed76084f615e53f6Approve196899552021-10-21 17:04:242 days 6 hrs ago0x329b0f4597b15cd81d6f62dcf2ad6b3fe1d74d87 IN  0x260b3e40c714ce8196465ec824cd8bb9150818120 FTM0.009636558708
0xec1bf34abaeecf8bb4c7f63ce0970832901624676053dc1d5c43f0ce9719f030Approve196740792021-10-21 12:13:022 days 11 hrs ago0xf1bb5643d0795d34ea10a8f212aa9aca8252ea7a IN  0x260b3e40c714ce8196465ec824cd8bb9150818120 FTM0.011749708113
0xb3a2ec3c726f74d44b4cbfa5a746bd967f077954f684706dc9172695efea9f1aApprove196686152021-10-21 10:40:132 days 13 hrs ago0x6d1e0084a6910a8803ab7c22483a1a2db3f1001a IN  0x260b3e40c714ce8196465ec824cd8bb9150818120 FTM0.006871765112
0x453fc1135778cce1b4ff69342446cc2950ef5a8decee3bde6f4d95ebdfcf22b5Approve196656772021-10-21 9:52:272 days 14 hrs ago0xa64c06bca1046bcd3591f95f893980c721f4fa54 IN  0x260b3e40c714ce8196465ec824cd8bb9150818120 FTM0.016736482983
0xfe36354277f8b65a7ddf731a81692d85c5cf16609906ac7f22e44f870556da25Approve196626832021-10-21 9:03:142 days 14 hrs ago0x6776da34fd214e16b4eef795116cf355ad2d4c67 IN  0x260b3e40c714ce8196465ec824cd8bb9150818120 FTM0.008037481935
0x59531dba0b721575516235ff2dc39712a45f04e69cc1cac9bc6a5c0f996b99e2Approve196547212021-10-21 6:35:252 days 17 hrs ago0x2b04c52baf77e38f12fc5aed5fb5910e3bd02c40 IN  0x260b3e40c714ce8196465ec824cd8bb9150818120 FTM0.007564008043
0x0a0cbe34e332857b250b1d5744a708dba329bedc280febfd6de597f2b8473662Approve196538032021-10-21 6:20:112 days 17 hrs ago0x021221f892e62491ba30898eb0c385277bf76a89 IN  0x260b3e40c714ce8196465ec824cd8bb9150818120 FTM0.008338002928
0x98cb285f1a06c34a8c5705fe962af332d9733eccd780a5e305085f6d7496f5aeApprove196526672021-10-21 5:59:552 days 17 hrs ago0x57a99f34721418e3c4a054e0f7356a1bc712b8e9 IN  0x260b3e40c714ce8196465ec824cd8bb9150818120 FTM0.002581708522
0x51e0bef4240818ca72ee516f90da16945b11e76bfc962b59fbe595ba6898c3afApprove196263742021-10-20 22:40:363 days 1 hr ago0xd3f4129336be7e26180c7c0093602fae3b9c88ca IN  0x260b3e40c714ce8196465ec824cd8bb9150818120 FTM0.0044931
0xa3aa6408f43a5cabaa6004f1f4b87316f5425fed0ed57e85a921e881b25f2f29Approve196239022021-10-20 22:03:083 days 1 hr ago0x8365eef117d8b60b11e4696f54b5b7becccab1e1 IN  0x260b3e40c714ce8196465ec824cd8bb9150818120 FTM0.006246716492
0x5b64a0fe31339bdab3e77b54fc9cda7d949284626abf8f0e57d3a8fcd5856d99Approve196212552021-10-20 21:22:033 days 2 hrs ago0x86e34dccd60e2e8d200f4e0b2e750bd86a4a1484 IN  0x260b3e40c714ce8196465ec824cd8bb9150818120 FTM0.006080020495
0xe107f39ca3eb0849bcbb4ec61bd1b7292eb31a67dff769130cca88235ba5211cApprove196122602021-10-20 19:09:223 days 4 hrs ago0xf4dbc65fe5f265b0a4284cc51925952f637c6e51 IN  0x260b3e40c714ce8196465ec824cd8bb9150818120 FTM0.002209315345
0x92a21d71085ce4714d68b43b0ea60fa0348ebfa9345adb0eac02b9e1424ac7a8Approve196117502021-10-20 19:02:323 days 4 hrs ago0xf4dbc65fe5f265b0a4284cc51925952f637c6e51 IN  0x260b3e40c714ce8196465ec824cd8bb9150818120 FTM0.002398419724
0x929ecd93840924658512a119804ac637e7668069d13694f30251d983c571c7cdApprove195945612021-10-20 14:20:403 days 9 hrs ago0xf09f25c212fa580c530d7d08099a039f136cb58e IN  0x260b3e40c714ce8196465ec824cd8bb9150818120 FTM0.016571096091
0x53671ca56530141523cfa8f10605c2af9cfe6d0ec1dec849280e3e70b756200aApprove195772802021-10-20 9:28:023 days 14 hrs ago0x3696692a85804afcb8d2576d5cd6c39c226fd828 IN  0x260b3e40c714ce8196465ec824cd8bb9150818120 FTM0.002104242483
0x9493aa8c9924518232e9b16a963a26348d0761560f046562f68b2bdb857ad543Approve195701742021-10-20 7:39:093 days 16 hrs ago0xdf2b6abfce6d8509b031caf2fd7b1f4cb4e493fb IN  0x260b3e40c714ce8196465ec824cd8bb9150818120 FTM0.0070401227
[ Download CSV Export 
Latest 1 internal transaction
Parent Txn Hash Block From To Value
0x63038db0efbce44b0ada9eb87aedd062b38f7fb4bfe546a93c3077e802d75ed4168359332021-09-10 18:22:4843 days 5 hrs ago 0x5aebde597752d689132dc64d093ff4b09067e9e6  Contract Creation0 FTM
[ Download CSV Export 
Loading

Contract Source Code Verified (Similar Match)
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0xa6DC20e3503301CE2B449418B83407beB3D610EE

Contract Name:
Ice

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity Standard Json-Input format)

File 1 of 9 : Ice.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.4;

import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol";
import "@openzeppelin/contracts/proxy/utils/Initializable.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/math/SafeMath.sol";

contract Ice is Ownable, Initializable, ERC20Burnable {
    using SafeMath for uint256;

    uint256 public  MAX_TOTAL_SUPPLY = 10_000_000_000 ether; // 10 billions

    mapping(address => uint256) public minters; // minter's address => minter's max cap
    mapping(address => uint256) public minters_minted;

    /* ========== EVENTS ========== */
    event MinterUpdate(address indexed account, uint256 cap);
    event MaxTotalSupplyUpdated(uint256 _newCap);

    /* ========== Modifiers =============== */

    modifier onlyMinter() {
        require(minters[msg.sender] > 0, "Only minter can interact");
        _;
    }

    constructor(
        string memory name,
        string memory symbol
    ) ERC20(name, symbol) {
    }

    function initialize(uint256 _initial) public initializer {
        super._mint(_msgSender(), _initial); // mint initial supply to add liquidity
    }

    /* ========== MUTATIVE FUNCTIONS ========== */

    function mint(address _recipient, uint256 _amount) public onlyMinter {
        minters_minted[_msgSender()] = minters_minted[_msgSender()].add(_amount);
        require(minters[_msgSender()] >= minters_minted[_msgSender()], "Minting amount exceeds minter cap");
        _mint(_recipient, _amount);
    }

    function _beforeTokenTransfer(address _from, address _to, uint256 _amount) internal override {
        super._beforeTokenTransfer(_from, _to, _amount);
        if (_from == address(0)) {
            // When minting tokens
            require(totalSupply().add(_amount) <= MAX_TOTAL_SUPPLY, "Max total supply exceeded");
        }
        if (_to == address(0)) {
            // When burning tokens
            MAX_TOTAL_SUPPLY = MAX_TOTAL_SUPPLY.sub(_amount, "Burn amount exceeds max total supply");
        }
    }

    /* ========== OWNER FUNCTIONS ========== */

    function setMinter(address _account, uint256 _minterCap) external onlyOwner {
        require(_account != address(0), "invalid address");
        require(minters_minted[_account] <= _minterCap, "Minter already minted a larger amount than new cap");
        minters[_account] = _minterCap;
        emit MinterUpdate(_account, _minterCap);
    }

    function resetMaxTotalSupply(uint256 _newCap) external onlyOwner {
        require(_newCap >= totalSupply(), "_newCap is below current total supply");
        MAX_TOTAL_SUPPLY = _newCap;
        emit MaxTotalSupplyUpdated(_newCap);
    }
}

File 2 of 9 : ERC20Burnable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "../ERC20.sol";
import "../../../utils/Context.sol";

/**
 * @dev Extension of {ERC20} that allows token holders to destroy both their own
 * tokens and those that they have an allowance for, in a way that can be
 * recognized off-chain (via event analysis).
 */
abstract contract ERC20Burnable is Context, ERC20 {
    /**
     * @dev Destroys `amount` tokens from the caller.
     *
     * See {ERC20-_burn}.
     */
    function burn(uint256 amount) public virtual {
        _burn(_msgSender(), amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, deducting from the caller's
     * allowance.
     *
     * See {ERC20-_burn} and {ERC20-allowance}.
     *
     * Requirements:
     *
     * - the caller must have allowance for ``accounts``'s tokens of at least
     * `amount`.
     */
    function burnFrom(address account, uint256 amount) public virtual {
        uint256 currentAllowance = allowance(account, _msgSender());
        require(currentAllowance >= amount, "ERC20: burn amount exceeds allowance");
        _approve(account, _msgSender(), currentAllowance - amount);
        _burn(account, amount);
    }
}

File 3 of 9 : Initializable.sol
// SPDX-License-Identifier: MIT

// solhint-disable-next-line compiler-version
pragma solidity ^0.8.0;

/**
 * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed
 * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an
 * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer
 * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.
 *
 * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as
 * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.
 *
 * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure
 * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.
 */
abstract contract Initializable {

    /**
     * @dev Indicates that the contract has been initialized.
     */
    bool private _initialized;

    /**
     * @dev Indicates that the contract is in the process of being initialized.
     */
    bool private _initializing;

    /**
     * @dev Modifier to protect an initializer function from being invoked twice.
     */
    modifier initializer() {
        require(_initializing || !_initialized, "Initializable: contract is already initialized");

        bool isTopLevelCall = !_initializing;
        if (isTopLevelCall) {
            _initializing = true;
            _initialized = true;
        }

        _;

        if (isTopLevelCall) {
            _initializing = false;
        }
    }
}

File 4 of 9 : Ownable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "../utils/Context.sol";
/**
 * @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.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: 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 {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

File 5 of 9 : SafeMath.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

File 6 of 9 : ERC20.sol
// SPDX-License-Identifier: MIT

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 guidelines: functions revert instead
 * of 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 defaut 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:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, 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}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), 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}.
     *
     * Requirements:
     *
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
        _approve(sender, _msgSender(), currentAllowance - 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) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][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) {
        uint256 currentAllowance = _allowances[_msgSender()][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        _approve(_msgSender(), spender, currentAllowance - subtractedValue);

        return true;
    }

    /**
     * @dev Moves tokens `amount` from `sender` to `recipient`.
     *
     * This is 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:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(address sender, address recipient, uint256 amount) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
        _balances[sender] = senderBalance - amount;
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, 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:
     *
     * - `to` 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);
    }

    /**
     * @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");
        _balances[account] = accountBalance - amount;
        _totalSupply -= amount;

        emit Transfer(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 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 to 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 { }
}

File 7 of 9 : Context.sol
// SPDX-License-Identifier: MIT

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) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

File 8 of 9 : IERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @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 `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, 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 `sender` to `recipient` 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 sender, address recipient, uint256 amount) external returns (bool);

    /**
     * @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);
}

File 9 of 9 : IERC20Metadata.sol
// SPDX-License-Identifier: MIT

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);
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  },
  "metadata": {
    "useLiteralContent": true
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"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":"_newCap","type":"uint256"}],"name":"MaxTotalSupplyUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"cap","type":"uint256"}],"name":"MinterUpdate","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":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_TOTAL_SUPPLY","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":"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":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","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":"uint256","name":"_initial","type":"uint256"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"minters","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"minters_minted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCap","type":"uint256"}],"name":"resetMaxTotalSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_minterCap","type":"uint256"}],"name":"setMinter","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"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526b204fce5e3e250261100000006006553480156200002157600080fd5b50604051620016dc380380620016dc833981016040819052620000449162000218565b600080546001600160a01b03191633908117825560405184928492918291907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35081516200009e906004906020850190620000bf565b508051620000b4906005906020840190620000bf565b5050505050620002d2565b828054620000cd906200027f565b90600052602060002090601f016020900481019282620000f157600085556200013c565b82601f106200010c57805160ff19168380011785556200013c565b828001600101855582156200013c579182015b828111156200013c5782518255916020019190600101906200011f565b506200014a9291506200014e565b5090565b5b808211156200014a57600081556001016200014f565b600082601f83011262000176578081fd5b81516001600160401b0380821115620001935762000193620002bc565b604051601f8301601f19908116603f01168101908282118183101715620001be57620001be620002bc565b81604052838152602092508683858801011115620001da578485fd5b8491505b83821015620001fd5785820183015181830184015290820190620001de565b838211156200020e57848385830101525b9695505050505050565b600080604083850312156200022b578182fd5b82516001600160401b038082111562000242578384fd5b620002508683870162000165565b9350602085015191508082111562000266578283fd5b50620002758582860162000165565b9150509250929050565b600181811c908216806200029457607f821691505b60208210811415620002b657634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b6113fa80620002e26000396000f3fe608060405234801561001057600080fd5b506004361061014d5760003560e01c8063715018a6116100c3578063a457c2d71161007c578063a457c2d7146102b8578063a9059cbb146102cb578063dd62ed3e146102de578063f2fde38b14610317578063f46eccc41461032a578063fe4b84df1461034a57600080fd5b8063715018a61461024757806379cc67901461024f57806387de8498146102625780638da5cb5b1461028257806395d89b411461029d5780639ce38998146102a557600080fd5b806333039d3d1161011557806333039d3d146101c757806339509351146101d057806340c10f19146101e357806342966c68146101f857806360c918851461020b57806370a082311461021e57600080fd5b806306fdde0314610152578063095ea7b31461017057806318160ddd1461019357806323b872dd146101a5578063313ce567146101b8575b600080fd5b61015a61035d565b6040516101679190611298565b60405180910390f35b61018361017e366004611257565b6103ef565b6040519015158152602001610167565b6003545b604051908152602001610167565b6101836101b336600461121c565b610405565b60405160128152602001610167565b61019760065481565b6101836101de366004611257565b6104bb565b6101f66101f1366004611257565b6104f2565b005b6101f6610206366004611280565b6105eb565b6101f6610219366004611280565b6105f8565b61019761022c3660046111d0565b6001600160a01b031660009081526001602052604090205490565b6101f66106bd565b6101f661025d366004611257565b610731565b6101976102703660046111d0565b60086020526000908152604090205481565b6000546040516001600160a01b039091168152602001610167565b61015a6107b9565b6101f66102b3366004611257565b6107c8565b6101836102c6366004611257565b610916565b6101836102d9366004611257565b6109b1565b6101976102ec3660046111ea565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b6101f66103253660046111d0565b6109be565b6101976103383660046111d0565b60076020526000908152604090205481565b6101f6610358366004611280565b610aa8565b60606004805461036c9061134f565b80601f01602080910402602001604051908101604052809291908181526020018280546103989061134f565b80156103e55780601f106103ba576101008083540402835291602001916103e5565b820191906000526020600020905b8154815290600101906020018083116103c857829003601f168201915b5050505050905090565b60006103fc338484610b78565b50600192915050565b6000610412848484610c9d565b6001600160a01b03841660009081526002602090815260408083203384529091529020548281101561049c5760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084015b60405180910390fd5b6104b085336104ab8685611338565b610b78565b506001949350505050565b3360008181526002602090815260408083206001600160a01b038716845290915281205490916103fc9185906104ab908690611320565b3360009081526007602052604090205461054e5760405162461bcd60e51b815260206004820152601860248201527f4f6e6c79206d696e7465722063616e20696e74657261637400000000000000006044820152606401610493565b336000908152600860205260409020546105689082610e80565b336000908152600860209081526040808320849055600790915290205410156105dd5760405162461bcd60e51b815260206004820152602160248201527f4d696e74696e6720616d6f756e742065786365656473206d696e7465722063616044820152600760fc1b6064820152608401610493565b6105e78282610e93565b5050565b6105f53382610f7e565b50565b6000546001600160a01b031633146106225760405162461bcd60e51b8152600401610493906112eb565b6003548110156106825760405162461bcd60e51b815260206004820152602560248201527f5f6e65774361702069732062656c6f772063757272656e7420746f74616c20736044820152647570706c7960d81b6064820152608401610493565b60068190556040518181527ff2672935fc79f5237559e2e2999dbe743bf65430894ac2b37666890e7c69e1af9060200160405180910390a150565b6000546001600160a01b031633146106e75760405162461bcd60e51b8152600401610493906112eb565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b600061073d83336102ec565b90508181101561079b5760405162461bcd60e51b8152602060048201526024808201527f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f77604482015263616e636560e01b6064820152608401610493565b6107aa83336104ab8585611338565b6107b48383610f7e565b505050565b60606005805461036c9061134f565b6000546001600160a01b031633146107f25760405162461bcd60e51b8152600401610493906112eb565b6001600160a01b03821661083a5760405162461bcd60e51b815260206004820152600f60248201526e696e76616c6964206164647265737360881b6044820152606401610493565b6001600160a01b0382166000908152600860205260409020548110156108bd5760405162461bcd60e51b815260206004820152603260248201527f4d696e74657220616c7265616479206d696e7465642061206c6172676572206160448201527106d6f756e74207468616e206e6577206361760741b6064820152608401610493565b6001600160a01b03821660008181526007602052604090819020839055517f4806dc7228dc0d536104603610b1cf9b1c98f326289316cf3188bf1c6cf3ef5e9061090a9084815260200190565b60405180910390a25050565b3360009081526002602090815260408083206001600160a01b0386168452909152812054828110156109985760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610493565b6109a733856104ab8685611338565b5060019392505050565b60006103fc338484610c9d565b6000546001600160a01b031633146109e85760405162461bcd60e51b8152600401610493906112eb565b6001600160a01b038116610a4d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610493565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b600054600160a81b900460ff1680610aca5750600054600160a01b900460ff16155b610b2d5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610493565b600054600160a81b900460ff16158015610b57576000805461ffff60a01b191661010160a01b1790555b610b613383610e93565b80156105e7576000805460ff60a81b191690555050565b6001600160a01b038316610bda5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610493565b6001600160a01b038216610c3b5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610493565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b038316610d015760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610493565b6001600160a01b038216610d635760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610493565b610d6e8383836110d9565b6001600160a01b03831660009081526001602052604090205481811015610de65760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610493565b610df08282611338565b6001600160a01b038086166000908152600160205260408082209390935590851681529081208054849290610e26908490611320565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610e7291815260200190565b60405180910390a350505050565b6000610e8c8284611320565b9392505050565b6001600160a01b038216610ee95760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610493565b610ef5600083836110d9565b8060036000828254610f079190611320565b90915550506001600160a01b03821660009081526001602052604081208054839290610f34908490611320565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6001600160a01b038216610fde5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610493565b610fea826000836110d9565b6001600160a01b0382166000908152600160205260409020548181101561105e5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610493565b6110688282611338565b6001600160a01b03841660009081526001602052604081209190915560038054849290611096908490611338565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001610c90565b6001600160a01b03831661114b576006546110fd826110f760035490565b90610e80565b111561114b5760405162461bcd60e51b815260206004820152601960248201527f4d617820746f74616c20737570706c79206578636565646564000000000000006044820152606401610493565b6001600160a01b0382166107b457611180816040518060600160405280602481526020016113a1602491396006549190611188565b600655505050565b600081848411156111ac5760405162461bcd60e51b81526004016104939190611298565b505050900390565b80356001600160a01b03811681146111cb57600080fd5b919050565b6000602082840312156111e1578081fd5b610e8c826111b4565b600080604083850312156111fc578081fd5b611205836111b4565b9150611213602084016111b4565b90509250929050565b600080600060608486031215611230578081fd5b611239846111b4565b9250611247602085016111b4565b9150604084013590509250925092565b60008060408385031215611269578182fd5b611272836111b4565b946020939093013593505050565b600060208284031215611291578081fd5b5035919050565b6000602080835283518082850152825b818110156112c4578581018301518582016040015282016112a8565b818111156112d55783604083870101525b50601f01601f1916929092016040019392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600082198211156113335761133361138a565b500190565b60008282101561134a5761134a61138a565b500390565b600181811c9082168061136357607f821691505b6020821081141561138457634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fdfe4275726e20616d6f756e742065786365656473206d617820746f74616c20737570706c79a2646970667358221220d661b54dad930eba2ffb4eb9027c999f36e2851e863d4514ee982b1d9cdfeeac64736f6c6343000804003300000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000001649726f6e2046696e616e63652049434520546f6b656e0000000000000000000000000000000000000000000000000000000000000000000000000000000000034943450000000000000000000000000000000000000000000000000000000000

Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Validator ID :
0 FTM

Amount Staked
0

Amount Delegated
0

Staking Total
0

Staking Start Epoch
0

Staking Start Time
0

Proof of Importance
0

Origination Score
0

Validation Score
0

Active
0

Online
0

Downtime
0 s
Address Amount claimed Rewards Created On Epoch Created On
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.