ETH Price: $3,393.81 (-1.39%)
Gas: 3 Gwei

Token

BRRR Token (BRRR)
 

Overview

Max Total Supply

102,771,973.95833333332825 BRRR

Holders

146

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
fezbayc.eth
Balance
122,500 BRRR

Value
$0.00
0x59547d1673f04609dba8cb9d9d3102abec4317af
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
BRRRToken

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion
File 1 of 8 : RewardTokens.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "./NonTransferableToken.sol";
import "./BRRRToken.sol";
import "./sBRRRToken.sol";

contract BANKToken is NonTransferableToken {
    uint256 public constant MINT_COST_BRRR = 200_000 * (10 ** 18);
    uint256 public constant DAILY_AMOUNT = 50000 * (10 ** 18);
    uint256 public constant MAX_REWARDS = 395971 * (10 ** 18);

    BRRRToken private _brrrToken;
    sBRRRToken private _sBrrrToken;
    address private _w1;

    mapping(address => uint256[]) public _userStartTime;
    mapping(address => uint256) private _claimedRewards;

    constructor(BRRRToken brrrToken, sBRRRToken sBrrrToken, address w1) NonTransferableToken("BANK Token", "BANK") {
        _brrrToken = brrrToken;
        _sBrrrToken = sBrrrToken;
        _w1 = w1;
    }

    function mint() external {
        _brrrToken.transferFrom(msg.sender, _w1, MINT_COST_BRRR);
        _mint(msg.sender, 1);
        _userStartTime[msg.sender].push(block.timestamp);
    }

    function getUserStartTimes(address user) public view returns (uint256[] memory) {
        return _userStartTime[user];
    }


    function CalculateRewards(uint256 userStartTime) public view returns (uint256) {
        uint256 timePassed = block.timestamp - userStartTime;
        uint256 daysPassed = timePassed / 1 days;

        uint256 rewards = 0;
        uint256 dailyReward = DAILY_AMOUNT;

        for (uint256 i = 0; i < daysPassed; i++) {
            rewards += dailyReward;
            dailyReward = dailyReward * 9 / 10; // Decrease dailyReward by 10%
        }

        uint256 remainingSeconds = timePassed % 1 days;
        uint256 currentDayReward = dailyReward * remainingSeconds / 86400;
        rewards += currentDayReward;

        if (rewards > MAX_REWARDS) {
            rewards = MAX_REWARDS;
        }

        return rewards;
    }

    function calculateTotalRewards(address user) public view returns (uint256) {
        uint256[] memory userStartTimes = _userStartTime[user];
        uint256 totalRewards = 0;

        for (uint256 i = 0; i < userStartTimes.length; i++) {
            totalRewards += CalculateRewards(userStartTimes[i]);
        }

        return totalRewards;
    }

    function calculateUnclaimedRewards(address user) public view returns (uint256) {
        uint256 totalRewards = calculateTotalRewards(user);
        uint256 unclaimedRewards = totalRewards - _claimedRewards[user];

        return unclaimedRewards;
    }

    function claimRewards() external {
        uint256 unclaimedRewards = calculateUnclaimedRewards(msg.sender);
        require(unclaimedRewards > 0, "No rewards to claim");

        _claimedRewards[msg.sender] += unclaimedRewards;
        _sBrrrToken.mint(msg.sender, unclaimedRewards);
    }
}

contract CBANKToken is NonTransferableToken {
    uint256 public constant MINT_COST_BRRR = 1_000_000 * (10 ** 18);
    uint256 public constant MINT_COST_SBRRR = 1_000_000 * (10 ** 18);
    uint256 public constant DAILY_AMOUNT = 500_000 * (10 ** 18);
    uint256 public constant MAX_REWARDS = 7_563_386 * (10 ** 18);

    BRRRToken private _brrrToken;
    sBRRRToken private _sBrrrToken;
    address private _w1;

    mapping(address => uint256[]) public _userStartTime;
    mapping(address => uint256) private _claimedRewards;

    constructor(BRRRToken brrrToken, sBRRRToken sBrrrToken, address w1) NonTransferableToken("BANK Token", "BANK") {
        _brrrToken = brrrToken;
        _sBrrrToken = sBrrrToken;
        _w1 = w1;
    }

    function mint() external {
        _brrrToken.transferFrom(msg.sender, _w1, MINT_COST_BRRR);
        _sBrrrToken.transferFrom(msg.sender, _w1, MINT_COST_SBRRR);
        _mint(msg.sender, 1);
        _userStartTime[msg.sender].push(block.timestamp);
    }

    function getUserStartTimes(address user) public view returns (uint256[] memory) {
        return _userStartTime[user];
    }

    function CalculateRewards(uint256 userStartTime) public view returns (uint256) {
        uint256 timePassed = block.timestamp - userStartTime;
        uint256 daysPassed = timePassed / 1 days;

        uint256 rewards = 0;
        uint256 dailyReward = DAILY_AMOUNT;

        for (uint256 i = 0; i < daysPassed; i++) {
            rewards += dailyReward;
            dailyReward = dailyReward * 95 / 100; // Decrease dailyReward by 5%
        }

        uint256 remainingSeconds = timePassed % 1 days;
        uint256 currentDayReward = dailyReward * remainingSeconds / 86400;
        rewards += currentDayReward;

        if (rewards > MAX_REWARDS) {
            rewards = MAX_REWARDS;
        }

        return rewards;
    }

    function calculateTotalRewards(address user) public view returns (uint256) {
        uint256[] memory userStartTimes = _userStartTime[user];
        uint256 totalRewards = 0;

        for (uint256 i = 0; i < userStartTimes.length; i++) {
            totalRewards += CalculateRewards(userStartTimes[i]);
        }

        return totalRewards;
    }

    function calculateUnclaimedRewards(address user) public view returns (uint256) {
        uint256 totalRewards = calculateTotalRewards(user);
        uint256 unclaimedRewards = totalRewards - _claimedRewards[user];

        return unclaimedRewards;
    }

    function claimRewards() external {
        uint256 unclaimedRewards = calculateUnclaimedRewards(msg.sender);
        require(unclaimedRewards > 0, "No rewards to claim");

        _claimedRewards[msg.sender] += unclaimedRewards;
        _sBrrrToken.mint(msg.sender, unclaimedRewards);
    }
}

contract PRINTERToken is NonTransferableToken {
    uint256 public constant MINT_COST_BRRR = 10_000_000 * (10 ** 18);
    uint256 public constant MINT_COST_SBRRR = 10_000_000 * (10 ** 18);
    uint256 public constant DAILY_AMOUNT = 1_111_111 * (10 ** 18);
    uint256 public constant MAX_REWARDS = 100_000_000 * (10 ** 18);
    uint256 public constant MAX_TOKENS_PER_WALLET = 1;

    BRRRToken private _brrrToken;
    sBRRRToken private _sBrrrToken;
    address private _w1;

    mapping(address => uint256[]) public _userStartTime;
    mapping(address => uint256) private _claimedRewards;
    mapping(address => uint256) private _tokensMinted;

    constructor(BRRRToken brrrToken, sBRRRToken sBrrrToken, address w1) NonTransferableToken("BANK Token", "BANK") {
        _brrrToken = brrrToken;
        _sBrrrToken = sBrrrToken;
        _w1 = w1;
    }

    function mint() external {
        require(_tokensMinted[msg.sender] < MAX_TOKENS_PER_WALLET, "Max tokens per wallet reached");
        _brrrToken.transferFrom(msg.sender, _w1, MINT_COST_BRRR);
        _sBrrrToken.transferFrom(msg.sender, _w1, MINT_COST_SBRRR);
        _mint(msg.sender, 1);
        _userStartTime[msg.sender].push(block.timestamp);
        _tokensMinted[msg.sender] += 1;
    }

    function getUserStartTimes(address user) public view returns (uint256[] memory) {
        return _userStartTime[user];
    }

    function CalculateRewards(uint256 userStartTime) public view returns (uint256) {
        uint256 timePassed = block.timestamp - userStartTime;
        uint256 daysPassed = timePassed / 1 days;

        uint256 rewards = 0;
        uint256 dailyReward = DAILY_AMOUNT;

        for (uint256 i = 0; i < daysPassed; i++) {
            rewards += dailyReward;
        }

        uint256 remainingSeconds = timePassed % 1 days;
        uint256 currentDayReward = dailyReward * remainingSeconds / 86400;
        rewards += currentDayReward;

        if (rewards > MAX_REWARDS) {
            rewards = MAX_REWARDS;
        }

        return rewards;
    }

    function calculateTotalRewards(address user) public view returns (uint256) {
        uint256[] memory userStartTimes = _userStartTime[user];
        uint256 totalRewards = 0;

        for (uint256 i = 0; i < userStartTimes.length; i++) {
            totalRewards += CalculateRewards(userStartTimes[i]);
        }

        return totalRewards;
    }

    function calculateUnclaimedRewards(address user) public view returns (uint256) {
        uint256 totalRewards = calculateTotalRewards(user);
        uint256 unclaimedRewards = totalRewards - _claimedRewards[user];

        return unclaimedRewards;
    }

    function claimRewards() external {
        uint256 unclaimedRewards = calculateUnclaimedRewards(msg.sender);
        require(unclaimedRewards > 0, "No rewards to claim");

        _claimedRewards[msg.sender] += unclaimedRewards;
        _sBrrrToken.mint(msg.sender, unclaimedRewards);
    }
}

File 2 of 8 : sBRRRToken.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "./BRRRToken.sol";

contract sBRRRToken is ERC20 {
    uint256 private constant BURN_RATE = 25; // 25% burn rate
    uint256 private constant CONVERSION_MAX_PERIOD = 24 * 60 * 60; // 24 hours in seconds

    BRRRToken private _brrrToken;
    mapping(address => bool) private _minters;

    address private _bankAddress;
    address private _cbankAddress;
    address private _printerAddress;

    struct Conversion {
        uint256 amount;
        uint256 timestamp;
    }

    mapping(address => Conversion[]) public conversionRecords;

    constructor(BRRRToken brrrToken) ERC20("Staked BRRR Token", "sBRRR") { //TEMPORARY PARAM ADDRESS
        _brrrToken = brrrToken;
        _minters[msg.sender] = true; // Grant minting permission to the contract deployer
    }

    function setTokenAddresses(address bankAddress, address cbankAddress, address printerAddress) external onlyMinter {
        _bankAddress = bankAddress;
        _cbankAddress = cbankAddress;
        _printerAddress = printerAddress;
        _minters[bankAddress] = true;
        _minters[cbankAddress] = true;
        _minters[printerAddress] = true;
    }

    modifier onlyMinter() {
        require(_minters[msg.sender], "Only minters can call this function");
        _;
    }

    function _transfer(address sender, address recipient, uint256 amount) internal virtual override {
        uint256 burnAmount = (amount * BURN_RATE) / 100;
        uint256 transferAmount = amount - burnAmount;

        super._transfer(sender, recipient, transferAmount);
        super._burn(sender, burnAmount);
    }

    function _eraseExpiredConversions(address account) private {
        uint256 i = 0;
        while (i < conversionRecords[account].length) {
            if (block.timestamp - conversionRecords[account][i].timestamp > CONVERSION_MAX_PERIOD) {
                // Remove expired conversion record by shifting all elements to the left
                for (uint256 j = i; j < conversionRecords[account].length - 1; j++) {
                    conversionRecords[account][j] = conversionRecords[account][j + 1];
                }
                conversionRecords[account].pop(); // Remove last element after shifting
            } else {
                i++; // Only increment if the current record is not expired
            }
        }
    }

    function convertToBRRR(uint256 sBRRRAmount) external {
        require(sBRRRAmount <= getCurrentConversionMax(msg.sender), "Conversion exceeds maximum allowed in 24-hour period");

        uint256 brrrAmount = (sBRRRAmount * (100 - BURN_RATE)) / 100;
        _burn(msg.sender, sBRRRAmount);
        _brrrToken.mint(msg.sender, brrrAmount);

        Conversion memory newConversion = Conversion({
            amount: sBRRRAmount,
            timestamp: block.timestamp
        });

        conversionRecords[msg.sender].push(newConversion);
        _eraseExpiredConversions(msg.sender); // Erase expired conversions for the user
    }

    function getConversionMax(address account) public view returns (uint256) {
        uint256 bankBalance = ERC20(_bankAddress).balanceOf(account);
        uint256 cbankBalance = ERC20(_cbankAddress).balanceOf(account);
        uint256 printerBalance = ERC20(_printerAddress).balanceOf(account);
        return (50000 * 10**18 * bankBalance) + (500000 * 10**18 * cbankBalance) + (1000000 * 10**18 * printerBalance);
    }

    function getCurrentConversionMax(address account) public view returns (uint256) {
        uint256 conversionMax = getConversionMax(account);
        uint256 sumOfConversions = 0;

        for (uint256 i = 0; i < conversionRecords[account].length; i++) {
            if ((block.timestamp - conversionRecords[account][i].timestamp) <= CONVERSION_MAX_PERIOD) {
                sumOfConversions += conversionRecords[account][i].amount;
            }
        }
        if (sumOfConversions >= conversionMax) {
            return 0;
        } else {
            return conversionMax - sumOfConversions;
        }
    }

    function mint(address account, uint256 amount) external onlyMinter {
        _mint(account, amount);
    }
}

File 3 of 8 : BRRRToken.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";

contract BRRRToken is ERC20 {
    uint256 private constant INITIAL_SUPPLY = 100_000_000 * (10 ** 18); // 100 million tokens
    uint256 private constant SPECIAL_RULE_DURATION = 24 hours;
    uint256 private constant MAX_BALANCE_PERCENT = 5; // 0.5% of total supply
    uint256 private constant MAX_TX_AMOUNT_PERCENT = 1; // 0.1% of total supply

    uint256 private _deploymentTimestamp;
    address private _sBRRRContract;
    address private _w1;

    constructor(address wallet) ERC20("BRRR Token", "BRRR") {
        _deploymentTimestamp = block.timestamp;
        _w1 = wallet;
        _mint(wallet, INITIAL_SUPPLY);
    }

    modifier onlySBRRR() {
        require(msg.sender == _sBRRRContract, "Only the sBRRR contract can call this function");
        _;
    }

    function setSBRRRContract(address sBRRRContract) external {
        require(_sBRRRContract == address(0), "sBRRR contract address has already been set");
        _sBRRRContract = sBRRRContract;
    }

    function _transfer(address sender, address recipient, uint256 amount) internal virtual override {
        if (block.timestamp < _deploymentTimestamp + SPECIAL_RULE_DURATION && sender != _w1 && recipient != _w1) {
            require(
                balanceOf(recipient) + amount <= (INITIAL_SUPPLY * MAX_BALANCE_PERCENT) / 1000,
                "New balance cannot exceed 0.5% of the total supply during the first 24 hours"
            );

            require(
                amount <= (INITIAL_SUPPLY * MAX_TX_AMOUNT_PERCENT) / 1000,
                "Transaction amount cannot exceed 0.1% of the total supply during the first 24 hours"
            );
        }

        super._transfer(sender, recipient, amount);
    }

    function mint(address account, uint256 amount) external onlySBRRR {
        _mint(account, amount);
    }
}

File 4 of 8 : NonTransferableToken.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";

contract NonTransferableToken is ERC20 {
    constructor(string memory name, string memory symbol) ERC20(name, symbol) {}

    function transfer(address, uint256) public pure override returns (bool) {
        revert("NonTransferableToken: transfer not allowed");
    }

    function transferFrom(address, address, uint256) public pure override returns (bool) {
        revert("NonTransferableToken: transferFrom not allowed");
    }

    function approve(address, uint256) public pure override returns (bool) {
        revert("NonTransferableToken: approve not allowed");
    }
}

File 5 of 8 : ERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.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.openzeppelin.com/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;
            // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
            // decrementing then incrementing.
            _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;
        unchecked {
            // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
            _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;
            // Overflow not possible: amount <= accountBalance <= totalSupply.
            _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 6 of 8 : 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;
    }
}

File 7 of 8 : 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 8 of 8 : 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);
}

Settings
{
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"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":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":[{"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":[],"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":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sBRRRContract","type":"address"}],"name":"setSBRRRContract","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":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b506040516200228a3803806200228a833981810160405281019062000037919062000316565b6040518060400160405280600a81526020017f4252525220546f6b656e000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f42525252000000000000000000000000000000000000000000000000000000008152508160039081620000b49190620005c2565b508060049081620000c69190620005c2565b5050504260058190555080600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200012e816a52b7d2dcc80cd2e40000006200013560201b60201c565b50620007c4565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603620001a7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200019e906200070a565b60405180910390fd5b620001bb60008383620002a260201b60201c565b8060026000828254620001cf91906200075b565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051620002829190620007a7565b60405180910390a36200029e60008383620002a760201b60201c565b5050565b505050565b505050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620002de82620002b1565b9050919050565b620002f081620002d1565b8114620002fc57600080fd5b50565b6000815190506200031081620002e5565b92915050565b6000602082840312156200032f576200032e620002ac565b5b60006200033f84828501620002ff565b91505092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620003ca57607f821691505b602082108103620003e057620003df62000382565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200044a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200040b565b6200045686836200040b565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620004a36200049d62000497846200046e565b62000478565b6200046e565b9050919050565b6000819050919050565b620004bf8362000482565b620004d7620004ce82620004aa565b84845462000418565b825550505050565b600090565b620004ee620004df565b620004fb818484620004b4565b505050565b5b81811015620005235762000517600082620004e4565b60018101905062000501565b5050565b601f82111562000572576200053c81620003e6565b6200054784620003fb565b8101602085101562000557578190505b6200056f6200056685620003fb565b83018262000500565b50505b505050565b600082821c905092915050565b6000620005976000198460080262000577565b1980831691505092915050565b6000620005b2838362000584565b9150826002028217905092915050565b620005cd8262000348565b67ffffffffffffffff811115620005e957620005e862000353565b5b620005f58254620003b1565b6200060282828562000527565b600060209050601f8311600181146200063a576000841562000625578287015190505b620006318582620005a4565b865550620006a1565b601f1984166200064a86620003e6565b60005b8281101562000674578489015182556001820191506020850194506020810190506200064d565b8683101562000694578489015162000690601f89168262000584565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000620006f2601f83620006a9565b9150620006ff82620006ba565b602082019050919050565b600060208201905081810360008301526200072581620006e3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000768826200046e565b915062000775836200046e565b925082820190508082111562000790576200078f6200072c565b5b92915050565b620007a1816200046e565b82525050565b6000602082019050620007be600083018462000796565b92915050565b611ab680620007d46000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c806340c10f191161008c57806395d89b411161006657806395d89b4114610226578063a457c2d714610244578063a9059cbb14610274578063dd62ed3e146102a4576100cf565b806340c10f19146101be578063637ef154146101da57806370a08231146101f6576100cf565b806306fdde03146100d4578063095ea7b3146100f257806318160ddd1461012257806323b872dd14610140578063313ce56714610170578063395093511461018e575b600080fd5b6100dc6102d4565b6040516100e99190610ff1565b60405180910390f35b61010c600480360381019061010791906110ac565b610366565b6040516101199190611107565b60405180910390f35b61012a610389565b6040516101379190611131565b60405180910390f35b61015a6004803603810190610155919061114c565b610393565b6040516101679190611107565b60405180910390f35b6101786103c2565b60405161018591906111bb565b60405180910390f35b6101a860048036038101906101a391906110ac565b6103cb565b6040516101b59190611107565b60405180910390f35b6101d860048036038101906101d391906110ac565b610402565b005b6101f460048036038101906101ef91906111d6565b6104a0565b005b610210600480360381019061020b91906111d6565b610575565b60405161021d9190611131565b60405180910390f35b61022e6105bd565b60405161023b9190610ff1565b60405180910390f35b61025e600480360381019061025991906110ac565b61064f565b60405161026b9190611107565b60405180910390f35b61028e600480360381019061028991906110ac565b6106c6565b60405161029b9190611107565b60405180910390f35b6102be60048036038101906102b99190611203565b6106e9565b6040516102cb9190611131565b60405180910390f35b6060600380546102e390611272565b80601f016020809104026020016040519081016040528092919081815260200182805461030f90611272565b801561035c5780601f106103315761010080835404028352916020019161035c565b820191906000526020600020905b81548152906001019060200180831161033f57829003601f168201915b5050505050905090565b600080610371610770565b905061037e818585610778565b600191505092915050565b6000600254905090565b60008061039e610770565b90506103ab858285610941565b6103b68585856109cd565b60019150509392505050565b60006012905090565b6000806103d6610770565b90506103f78185856103e885896106e9565b6103f291906112d2565b610778565b600191505092915050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610492576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161048990611378565b60405180910390fd5b61049c8282610b8b565b5050565b600073ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610531576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105289061140a565b60405180910390fd5b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6060600480546105cc90611272565b80601f01602080910402602001604051908101604052809291908181526020018280546105f890611272565b80156106455780601f1061061a57610100808354040283529160200191610645565b820191906000526020600020905b81548152906001019060200180831161062857829003601f168201915b5050505050905090565b60008061065a610770565b9050600061066882866106e9565b9050838110156106ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106a49061149c565b60405180910390fd5b6106ba8286868403610778565b60019250505092915050565b6000806106d1610770565b90506106de8185856109cd565b600191505092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036107e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107de9061152e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610856576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161084d906115c0565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516109349190611131565b60405180910390a3505050565b600061094d84846106e9565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146109c757818110156109b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b09061162c565b60405180910390fd5b6109c68484848403610778565b5b50505050565b620151806005546109de91906112d2565b42108015610a3a5750600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b8015610a945750600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b15610b7b576103e860056a52b7d2dcc80cd2e4000000610ab4919061164c565b610abe91906116bd565b81610ac884610575565b610ad291906112d2565b1115610b13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0a90611786565b60405180910390fd5b6103e860016a52b7d2dcc80cd2e4000000610b2e919061164c565b610b3891906116bd565b811115610b7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b719061183e565b60405180910390fd5b5b610b86838383610ce1565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610bfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf1906118aa565b60405180910390fd5b610c0660008383610f57565b8060026000828254610c1891906112d2565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610cc99190611131565b60405180910390a3610cdd60008383610f5c565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610d50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d479061193c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610dbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db6906119ce565b60405180910390fd5b610dca838383610f57565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015610e50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4790611a60565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610f3e9190611131565b60405180910390a3610f51848484610f5c565b50505050565b505050565b505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610f9b578082015181840152602081019050610f80565b60008484015250505050565b6000601f19601f8301169050919050565b6000610fc382610f61565b610fcd8185610f6c565b9350610fdd818560208601610f7d565b610fe681610fa7565b840191505092915050565b6000602082019050818103600083015261100b8184610fb8565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061104382611018565b9050919050565b61105381611038565b811461105e57600080fd5b50565b6000813590506110708161104a565b92915050565b6000819050919050565b61108981611076565b811461109457600080fd5b50565b6000813590506110a681611080565b92915050565b600080604083850312156110c3576110c2611013565b5b60006110d185828601611061565b92505060206110e285828601611097565b9150509250929050565b60008115159050919050565b611101816110ec565b82525050565b600060208201905061111c60008301846110f8565b92915050565b61112b81611076565b82525050565b60006020820190506111466000830184611122565b92915050565b60008060006060848603121561116557611164611013565b5b600061117386828701611061565b935050602061118486828701611061565b925050604061119586828701611097565b9150509250925092565b600060ff82169050919050565b6111b58161119f565b82525050565b60006020820190506111d060008301846111ac565b92915050565b6000602082840312156111ec576111eb611013565b5b60006111fa84828501611061565b91505092915050565b6000806040838503121561121a57611219611013565b5b600061122885828601611061565b925050602061123985828601611061565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061128a57607f821691505b60208210810361129d5761129c611243565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006112dd82611076565b91506112e883611076565b9250828201905080821115611300576112ff6112a3565b5b92915050565b7f4f6e6c792074686520734252525220636f6e74726163742063616e2063616c6c60008201527f20746869732066756e6374696f6e000000000000000000000000000000000000602082015250565b6000611362602e83610f6c565b915061136d82611306565b604082019050919050565b6000602082019050818103600083015261139181611355565b9050919050565b7f734252525220636f6e747261637420616464726573732068617320616c72656160008201527f6479206265656e20736574000000000000000000000000000000000000000000602082015250565b60006113f4602b83610f6c565b91506113ff82611398565b604082019050919050565b60006020820190508181036000830152611423816113e7565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000611486602583610f6c565b91506114918261142a565b604082019050919050565b600060208201905081810360008301526114b581611479565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000611518602483610f6c565b9150611523826114bc565b604082019050919050565b600060208201905081810360008301526115478161150b565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006115aa602283610f6c565b91506115b58261154e565b604082019050919050565b600060208201905081810360008301526115d98161159d565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000611616601d83610f6c565b9150611621826115e0565b602082019050919050565b6000602082019050818103600083015261164581611609565b9050919050565b600061165782611076565b915061166283611076565b925082820261167081611076565b91508282048414831517611687576116866112a3565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006116c882611076565b91506116d383611076565b9250826116e3576116e261168e565b5b828204905092915050565b7f4e65772062616c616e63652063616e6e6f742065786365656420302e3525206f60008201527f662074686520746f74616c20737570706c7920647572696e672074686520666960208201527f72737420323420686f7572730000000000000000000000000000000000000000604082015250565b6000611770604c83610f6c565b915061177b826116ee565b606082019050919050565b6000602082019050818103600083015261179f81611763565b9050919050565b7f5472616e73616374696f6e20616d6f756e742063616e6e6f742065786365656460008201527f20302e3125206f662074686520746f74616c20737570706c7920647572696e6760208201527f2074686520666972737420323420686f75727300000000000000000000000000604082015250565b6000611828605383610f6c565b9150611833826117a6565b606082019050919050565b600060208201905081810360008301526118578161181b565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000611894601f83610f6c565b915061189f8261185e565b602082019050919050565b600060208201905081810360008301526118c381611887565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000611926602583610f6c565b9150611931826118ca565b604082019050919050565b6000602082019050818103600083015261195581611919565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006119b8602383610f6c565b91506119c38261195c565b604082019050919050565b600060208201905081810360008301526119e7816119ab565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000611a4a602683610f6c565b9150611a55826119ee565b604082019050919050565b60006020820190508181036000830152611a7981611a3d565b905091905056fea264697066735822122069f210df5c4d80f6484fe49bdf452d428ad1232e88225102b179e55ca8a147b864736f6c63430008120033000000000000000000000000899f2b1f9935e6f220fdb2a2b0d9660dbbd9ed0f

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106100cf5760003560e01c806340c10f191161008c57806395d89b411161006657806395d89b4114610226578063a457c2d714610244578063a9059cbb14610274578063dd62ed3e146102a4576100cf565b806340c10f19146101be578063637ef154146101da57806370a08231146101f6576100cf565b806306fdde03146100d4578063095ea7b3146100f257806318160ddd1461012257806323b872dd14610140578063313ce56714610170578063395093511461018e575b600080fd5b6100dc6102d4565b6040516100e99190610ff1565b60405180910390f35b61010c600480360381019061010791906110ac565b610366565b6040516101199190611107565b60405180910390f35b61012a610389565b6040516101379190611131565b60405180910390f35b61015a6004803603810190610155919061114c565b610393565b6040516101679190611107565b60405180910390f35b6101786103c2565b60405161018591906111bb565b60405180910390f35b6101a860048036038101906101a391906110ac565b6103cb565b6040516101b59190611107565b60405180910390f35b6101d860048036038101906101d391906110ac565b610402565b005b6101f460048036038101906101ef91906111d6565b6104a0565b005b610210600480360381019061020b91906111d6565b610575565b60405161021d9190611131565b60405180910390f35b61022e6105bd565b60405161023b9190610ff1565b60405180910390f35b61025e600480360381019061025991906110ac565b61064f565b60405161026b9190611107565b60405180910390f35b61028e600480360381019061028991906110ac565b6106c6565b60405161029b9190611107565b60405180910390f35b6102be60048036038101906102b99190611203565b6106e9565b6040516102cb9190611131565b60405180910390f35b6060600380546102e390611272565b80601f016020809104026020016040519081016040528092919081815260200182805461030f90611272565b801561035c5780601f106103315761010080835404028352916020019161035c565b820191906000526020600020905b81548152906001019060200180831161033f57829003601f168201915b5050505050905090565b600080610371610770565b905061037e818585610778565b600191505092915050565b6000600254905090565b60008061039e610770565b90506103ab858285610941565b6103b68585856109cd565b60019150509392505050565b60006012905090565b6000806103d6610770565b90506103f78185856103e885896106e9565b6103f291906112d2565b610778565b600191505092915050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610492576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161048990611378565b60405180910390fd5b61049c8282610b8b565b5050565b600073ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610531576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105289061140a565b60405180910390fd5b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6060600480546105cc90611272565b80601f01602080910402602001604051908101604052809291908181526020018280546105f890611272565b80156106455780601f1061061a57610100808354040283529160200191610645565b820191906000526020600020905b81548152906001019060200180831161062857829003601f168201915b5050505050905090565b60008061065a610770565b9050600061066882866106e9565b9050838110156106ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106a49061149c565b60405180910390fd5b6106ba8286868403610778565b60019250505092915050565b6000806106d1610770565b90506106de8185856109cd565b600191505092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036107e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107de9061152e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610856576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161084d906115c0565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516109349190611131565b60405180910390a3505050565b600061094d84846106e9565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146109c757818110156109b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b09061162c565b60405180910390fd5b6109c68484848403610778565b5b50505050565b620151806005546109de91906112d2565b42108015610a3a5750600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b8015610a945750600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b15610b7b576103e860056a52b7d2dcc80cd2e4000000610ab4919061164c565b610abe91906116bd565b81610ac884610575565b610ad291906112d2565b1115610b13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0a90611786565b60405180910390fd5b6103e860016a52b7d2dcc80cd2e4000000610b2e919061164c565b610b3891906116bd565b811115610b7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b719061183e565b60405180910390fd5b5b610b86838383610ce1565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610bfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf1906118aa565b60405180910390fd5b610c0660008383610f57565b8060026000828254610c1891906112d2565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610cc99190611131565b60405180910390a3610cdd60008383610f5c565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610d50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d479061193c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610dbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db6906119ce565b60405180910390fd5b610dca838383610f57565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015610e50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4790611a60565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610f3e9190611131565b60405180910390a3610f51848484610f5c565b50505050565b505050565b505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610f9b578082015181840152602081019050610f80565b60008484015250505050565b6000601f19601f8301169050919050565b6000610fc382610f61565b610fcd8185610f6c565b9350610fdd818560208601610f7d565b610fe681610fa7565b840191505092915050565b6000602082019050818103600083015261100b8184610fb8565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061104382611018565b9050919050565b61105381611038565b811461105e57600080fd5b50565b6000813590506110708161104a565b92915050565b6000819050919050565b61108981611076565b811461109457600080fd5b50565b6000813590506110a681611080565b92915050565b600080604083850312156110c3576110c2611013565b5b60006110d185828601611061565b92505060206110e285828601611097565b9150509250929050565b60008115159050919050565b611101816110ec565b82525050565b600060208201905061111c60008301846110f8565b92915050565b61112b81611076565b82525050565b60006020820190506111466000830184611122565b92915050565b60008060006060848603121561116557611164611013565b5b600061117386828701611061565b935050602061118486828701611061565b925050604061119586828701611097565b9150509250925092565b600060ff82169050919050565b6111b58161119f565b82525050565b60006020820190506111d060008301846111ac565b92915050565b6000602082840312156111ec576111eb611013565b5b60006111fa84828501611061565b91505092915050565b6000806040838503121561121a57611219611013565b5b600061122885828601611061565b925050602061123985828601611061565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061128a57607f821691505b60208210810361129d5761129c611243565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006112dd82611076565b91506112e883611076565b9250828201905080821115611300576112ff6112a3565b5b92915050565b7f4f6e6c792074686520734252525220636f6e74726163742063616e2063616c6c60008201527f20746869732066756e6374696f6e000000000000000000000000000000000000602082015250565b6000611362602e83610f6c565b915061136d82611306565b604082019050919050565b6000602082019050818103600083015261139181611355565b9050919050565b7f734252525220636f6e747261637420616464726573732068617320616c72656160008201527f6479206265656e20736574000000000000000000000000000000000000000000602082015250565b60006113f4602b83610f6c565b91506113ff82611398565b604082019050919050565b60006020820190508181036000830152611423816113e7565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000611486602583610f6c565b91506114918261142a565b604082019050919050565b600060208201905081810360008301526114b581611479565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000611518602483610f6c565b9150611523826114bc565b604082019050919050565b600060208201905081810360008301526115478161150b565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006115aa602283610f6c565b91506115b58261154e565b604082019050919050565b600060208201905081810360008301526115d98161159d565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000611616601d83610f6c565b9150611621826115e0565b602082019050919050565b6000602082019050818103600083015261164581611609565b9050919050565b600061165782611076565b915061166283611076565b925082820261167081611076565b91508282048414831517611687576116866112a3565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006116c882611076565b91506116d383611076565b9250826116e3576116e261168e565b5b828204905092915050565b7f4e65772062616c616e63652063616e6e6f742065786365656420302e3525206f60008201527f662074686520746f74616c20737570706c7920647572696e672074686520666960208201527f72737420323420686f7572730000000000000000000000000000000000000000604082015250565b6000611770604c83610f6c565b915061177b826116ee565b606082019050919050565b6000602082019050818103600083015261179f81611763565b9050919050565b7f5472616e73616374696f6e20616d6f756e742063616e6e6f742065786365656460008201527f20302e3125206f662074686520746f74616c20737570706c7920647572696e6760208201527f2074686520666972737420323420686f75727300000000000000000000000000604082015250565b6000611828605383610f6c565b9150611833826117a6565b606082019050919050565b600060208201905081810360008301526118578161181b565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000611894601f83610f6c565b915061189f8261185e565b602082019050919050565b600060208201905081810360008301526118c381611887565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000611926602583610f6c565b9150611931826118ca565b604082019050919050565b6000602082019050818103600083015261195581611919565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006119b8602383610f6c565b91506119c38261195c565b604082019050919050565b600060208201905081810360008301526119e7816119ab565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000611a4a602683610f6c565b9150611a55826119ee565b604082019050919050565b60006020820190508181036000830152611a7981611a3d565b905091905056fea264697066735822122069f210df5c4d80f6484fe49bdf452d428ad1232e88225102b179e55ca8a147b864736f6c63430008120033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000899f2b1f9935e6f220fdb2a2b0d9660dbbd9ed0f

-----Decoded View---------------
Arg [0] : wallet (address): 0x899F2B1f9935e6F220fdB2a2b0D9660DBBD9ed0f

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000899f2b1f9935e6f220fdb2a2b0d9660dbbd9ed0f


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