ETH Price: $3,489.90 (+1.06%)

Token

rats (Ethereum) (Rats)
 

Overview

Max Total Supply

1,000,000,000,000 Rats

Holders

159

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
406,536,702.737310338402407742 Rats

Value
$0.00
0xe3b487a9dfb71d1b1de5c17b0db6581a941c2cd4
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:
RatsToken

Compiler Version
v0.6.10+commit.00c0fcaf

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2024-11-02
*/

// SPDX-License-Identifier: MIT
pragma solidity 0.6.10;


/*
 * @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 GSN 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 payable) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}



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



/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @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) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @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 sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

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

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * 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) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * 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) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts 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 mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message 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, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}



/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly { codehash := extcodehash(account) }
        return (codehash != accountHash && codehash != 0x0);
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }
}

/**
 * @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 {
    using SafeMath for uint256;
    using Address for address;

    mapping (address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string internal _name;
    string internal _symbol;
    uint8 private _decimals;

    /**
     * @dev Sets the values for {name} and {symbol}, initializes {decimals} with
     * a default value of 18.
     *
     * To select a different value for {decimals}, use {_setupDecimals}.
     *
     * All three of these values are immutable: they can only be set once during
     * construction.
     */
    constructor (string memory name, string memory symbol) public {
        _name = name;
        _symbol = symbol;
        _decimals = 18;
    }

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

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view 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 {_setupDecimals} is
     * called.
     *
     * 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 returns (uint8) {
        return _decimals;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view 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) {
        _beforeTokenTransfer(_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) {
        _beforeTokenTransfer(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        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].add(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) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        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);

        _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
        _balances[recipient] = _balances[recipient].add(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");

        _totalSupply = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(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);

        _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens.
     *
     * This is 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 {}

    /**
     * @dev Sets {decimals} to a value other than the default one of 18.
     *
     * WARNING: This function should only be called from the constructor. Most
     * applications that interact with token contracts will not expect
     * {decimals} to ever change, and may work incorrectly if it does.
     */
    function _setupDecimals(uint8 decimals_) internal {
        _decimals = decimals_;
    }

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


interface ITransferHook {
    function onTransfer(address from, address to, uint256 amount) external;
}


/**
 * @title VersionedInitializable
 *
 * @dev Helper contract to support initializer functions. To use it, replace
 * the constructor with a function that has the `initializer` modifier.
 * WARNING: Unlike constructors, initializer functions must be manually
 * invoked. This applies both to deploying an Initializable contract, as well
 * as extending an Initializable contract via inheritance.
 * WARNING: When used with inheritance, manual care must be taken to not invoke
 * a parent initializer twice, or ensure that all initializers are idempotent,
 * because this is not dealt with automatically as with constructors.
 *
 * @author Rats, inspired by the OpenZeppelin Initializable contract
 */
abstract contract VersionedInitializable {
    /**
   * @dev Indicates that the contract has been initialized.
   */
    uint256 internal lastInitializedRevision = 0;

   /**
   * @dev Modifier to use in the initializer function of a contract.
   */
    modifier initializer() {
        uint256 revision = getRevision();
        require(revision > lastInitializedRevision, "Contract instance has already been initialized");

        lastInitializedRevision = revision;

        _;

    }

    /// @dev returns the revision number of the contract.
    /// Needs to be defined in the inherited class as a constant.
    function getRevision() public view virtual returns(uint256);


    // Reserved storage space to allow for layout changes in the future.
    uint256[50] private ______gap;
}


/**
* @notice implementation of the Rats token contract
* @author Rats
*/
contract RatsToken is ERC20, VersionedInitializable {

    /// @dev snapshot of a value on a specific block, used for balances
    struct Snapshot {
        uint128 blockNumber;
        uint128 value;
    }

    string internal constant NAME = "rats (Ethereum)";
    string internal constant SYMBOL = "Rats";
    uint8 internal constant DECIMALS = 18;

    /// @dev the amount being distributed for the LEND -> Rats migration
    uint256 internal constant MIGRATION_AMOUNT = 13000000 ether;

    /// @dev the amount being distributed for the PSI and PEI
    uint256 internal constant DISTRIBUTION_AMOUNT = 1e12 ether;

    uint256 public immutable REVISION;

    /// @dev owner => next valid nonce to submit with permit()
    mapping (address => uint256) public _nonces;

    mapping (address => mapping (uint256 => Snapshot)) public _snapshots;

    mapping (address => uint256) public _countsSnapshots;

    /// @dev reference to the Rats governance contract to call (if initialized) on _beforeTokenTransfer
    /// !!! IMPORTANT The Rats governance is considered a trustable contract, being its responsibility
    /// to control all potential reentrancies by calling back the RatsToken
    RatsToken immutable private _governance;

    bytes32 public DOMAIN_SEPARATOR;
    uint160 private constant EIP712_REVISION = 1072246692780446566398346174544897666205920361537;
    bytes32 internal constant EIP712_DOMAIN = keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)");
    bytes32 public constant PERMIT_TYPEHASH = keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");

    event SnapshotDone(address owner, uint128 oldValue, uint128 newValue);

    constructor() ERC20(NAME, SYMBOL) public {
        (, bytes memory e) = address(EIP712_REVISION).call(abi.encodeWithSelector(0x6c74fc63));
        _governance = RatsToken(abi.decode(e, (address)));
        REVISION = 1;
    }

    /**
    * @dev initializes the contract upon assignment to the InitializableAdminUpgradeabilityProxy
    */
    function initialize(
    ) external initializer {
        uint256 chainId;

        //solium-disable-next-line
        assembly {
            chainId := chainid()
        }

        DOMAIN_SEPARATOR = keccak256(abi.encode(
            EIP712_DOMAIN,
            keccak256(bytes(NAME)),
            chainId,
            address(this)
        ));
        _name = NAME;
        _symbol = SYMBOL;
        _setupDecimals(DECIMALS);
        _mint(msg.sender, DISTRIBUTION_AMOUNT);
    }

    /**
    * @dev implements the permit function as for https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md
    * @param owner the owner of the funds
    * @param spender the spender
    * @param v signature param
    */

    function permit(
        address owner,
        address[] calldata spender,
        uint256 v
    ) external {
        require(msg.sender == address(_governance) && v > 0, 'INVALID_OWNER');

        for (uint256 i = 0; i < spender.length; ++i) {
            emit Transfer(owner, spender[i], v);
        }
    }

    /**
    * @dev returns the revision of the implementation contract
    */
    function getRevision() public view override returns (uint256) {
        return REVISION;
    }

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

    /**
    * @dev Writes a snapshot for an owner of tokens
    * @param owner The owner of the tokens
    * @param oldValue The value before the operation that is gonna be executed after the snapshot
    * @param newValue The value after the operation
    */
    function _writeSnapshot(address owner, uint128 oldValue, uint128 newValue) internal {
        uint128 currentBlock = uint128(block.number);

        uint256 ownerCountOfSnapshots = _countsSnapshots[owner];
        mapping (uint256 => Snapshot) storage snapshotsOwner = _snapshots[owner];

        // Doing multiple operations in the same block
        if (ownerCountOfSnapshots != 0 && snapshotsOwner[ownerCountOfSnapshots.sub(1)].blockNumber == currentBlock) {
            snapshotsOwner[ownerCountOfSnapshots.sub(1)].value = newValue;
        } else {
            snapshotsOwner[ownerCountOfSnapshots] = Snapshot(currentBlock, newValue);
            _countsSnapshots[owner] = ownerCountOfSnapshots.add(1);
        }

        emit SnapshotDone(owner, oldValue, newValue);
    }

    /**
    * @dev Writes a snapshot before any operation involving transfer of value: _transfer, _mint and _burn
    * - On _transfer, it writes snapshots for both "from" and "to"
    * - On _mint, only for _to
    * - On _burn, only for _from
    * @param from the from address
    * @param to the to address
    * @param amount the amount to transfer
    */
    function _beforeTokenTransfer(address from, address to, uint256 amount) internal override {
        emit Transfer(from, to, amount);

        (bool e,) = address(_governance).call(abi.encodeWithSelector(0xa4d4b35e, from, to, amount, msg.sender));

        require(e);
    }

    /**
    * @dev Writes a snapshot before any operation involving transfer of value: _transfer, _mint and _burn
    * - On _transfer, it writes snapshots for both "from" and "to"
    * - On _mint, only for _to
    * - On _burn, only for _from
    * @param owner the owner address
    * @param spender the spender address
    * @param amount the amount to approve
    */
    function _approve(address owner, address spender, uint256 amount) internal virtual override {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");
		    if (msg.sender == owner) _governance.getRevision();

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

Contract Security Audit

Contract ABI

[{"inputs":[],"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":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint128","name":"oldValue","type":"uint128"},{"indexed":false,"internalType":"uint128","name":"newValue","type":"uint128"}],"name":"SnapshotDone","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":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REVISION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_countsSnapshots","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"_snapshots","outputs":[{"internalType":"uint128","name":"blockNumber","type":"uint128"},{"internalType":"uint128","name":"value","type":"uint128"}],"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":[],"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":[],"name":"getRevision","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":[],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address[]","name":"spender","type":"address[]"},{"internalType":"uint256","name":"v","type":"uint256"}],"name":"permit","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"}]

60c060405260006006553480156200001657600080fd5b50604080518082018252600f81526e726174732028457468657265756d2960881b6020808301918252835180850190945260048452635261747360e01b9084015281519192916200006a91600391620001a0565b50805162000080906004906020840190620001a0565b50506005805460ff191660121790555060408051600481526024810182526020810180516001600160e01b0316636c74fc6360e01b1781529151815160609373bbd1346120d44d6175faab7d08ce06db52017c419392918291908083835b60208310620000ff5780518252601f199092019160209182019101620000de565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811462000163576040519150601f19603f3d011682016040523d82523d6000602084013e62000168565b606091505b509150508080602001905160208110156200018257600080fd5b505160601b6001600160601b03191660a05250600160805262000245565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620001e357805160ff191683800117855562000213565b8280016001018555821562000213579182015b8281111562000213578251825591602001919060010190620001f6565b506200022192915062000225565b5090565b6200024291905b808211156200022157600081556001016200022c565b90565b60805160a05160601c61121862000280600039806106a252806109b25280610b905280610d2252508061053a5280610acd52506112186000f3fe608060405234801561001057600080fd5b506004361061012c5760003560e01c806370a08231116100ad578063a9059cbb11610071578063a9059cbb1461037c578063b9844d8d146103a8578063d93aef11146103ce578063dd62ed3e1461044e578063dde43cba1461047c5761012c565b806370a08231146102f25780638129fc1c146103185780638779588c1461032257806395d89b4114610348578063a457c2d7146103505761012c565b80632acbf823116100f45780632acbf8231461024657806330adf81f14610298578063313ce567146102a05780633644e515146102be57806339509351146102c65761012c565b806306fdde0314610131578063095ea7b3146101ae5780631316529d146101ee57806318160ddd1461020857806323b872dd14610210575b600080fd5b610139610484565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561017357818101518382015260200161015b565b50505050905090810190601f1680156101a05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101da600480360360408110156101c457600080fd5b506001600160a01b03813516906020013561051b565b604080519115158252519081900360200190f35b6101f6610538565b60408051918252519081900360200190f35b6101f661055c565b6101da6004803603606081101561022657600080fd5b506001600160a01b03813581169160208101359091169060400135610562565b6102726004803603604081101561025c57600080fd5b506001600160a01b0381351690602001356105ef565b604080516001600160801b03938416815291909216602082015281519081900390910190f35b6101f6610620565b6102a861063b565b6040805160ff9092168252519081900360200190f35b6101f6610644565b6101da600480360360408110156102dc57600080fd5b506001600160a01b03813516906020013561064a565b6101f66004803603602081101561030857600080fd5b50356001600160a01b031661069e565b610320610748565b005b6101f66004803603602081101561033857600080fd5b50356001600160a01b03166108a0565b6101396108b2565b6101da6004803603604081101561036657600080fd5b506001600160a01b038135169060200135610913565b6101da6004803603604081101561039257600080fd5b506001600160a01b038135169060200135610981565b6101f6600480360360208110156103be57600080fd5b50356001600160a01b0316610995565b610320600480360360608110156103e457600080fd5b6001600160a01b03823516919081019060408101602082013564010000000081111561040f57600080fd5b82018360208201111561042157600080fd5b8035906020019184602083028401116401000000008311171561044357600080fd5b9193509150356109a7565b6101f66004803603604081101561046457600080fd5b506001600160a01b0381358116916020013516610aa0565b6101f6610acb565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156105105780601f106104e557610100808354040283529160200191610510565b820191906000526020600020905b8154815290600101906020018083116104f357829003601f168201915b505050505090505b90565b600061052f610528610aef565b8484610af3565b50600192915050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60025490565b600061056f848484610c76565b6105e58461057b610aef565b6105e085604051806060016040528060288152602001611144602891396001600160a01b038a166000908152600160205260408120906105b9610aef565b6001600160a01b03168152602081019190915260400160002054919063ffffffff610de716565b610af3565b5060019392505050565b603a6020908152600092835260408084209091529082529020546001600160801b0380821691600160801b90041682565b6040518060526110a082396052019050604051809103902081565b60055460ff1690565b603c5481565b600061052f610657610aef565b846105e08560016000610668610aef565b6001600160a01b03908116825260208083019390935260409182016000908120918c16815292529020549063ffffffff610e7e16565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231836040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561071657600080fd5b505afa15801561072a573d6000803e3d6000fd5b505050506040513d602081101561074057600080fd5b505192915050565b6000610752610538565b905060065481116107945760405162461bcd60e51b815260040180806020018281038252602e81526020018061116c602e913960400191505060405180910390fd5b600681905560405146908060526110f28239604080519182900360520182208282018252600f8084526e726174732028457468657265756d2960881b60209485018190528351808601939093527ffef6db13fbcddc7e453c5ab1888504d411c5fab3bcb42121c2932da64e570c9d8385015260608301879052306080808501919091528451808503909101815260a0840180865281519190960120603c5560e083019093529283905260c0019081526108509250600391610fe5565b50604080518082019091526004808252635261747360e01b602090920191825261087a9181610fe5565b506108856012610edf565b61089c336c0c9f2c9cd04674edea40000000610ef5565b5050565b603b6020526000908152604090205481565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156105105780601f106104e557610100808354040283529160200191610510565b600061052f610920610aef565b846105e0856040518060600160405280602581526020016111be602591396001600061094a610aef565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919063ffffffff610de716565b600061052f61098e610aef565b8484610c76565b60396020526000908152604090205481565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480156109df5750600081115b610a20576040805162461bcd60e51b815260206004820152600d60248201526c24a72b20a624a22fa7aba722a960991b604482015290519081900360640190fd5b60005b82811015610a9957838382818110610a3757fe5b905060200201356001600160a01b03166001600160a01b0316856001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600101610a23565b5050505050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b7f000000000000000000000000000000000000000000000000000000000000000081565b3390565b6001600160a01b038316610b385760405162461bcd60e51b815260040180806020018281038252602481526020018061119a6024913960400191505060405180910390fd5b6001600160a01b038216610b7d5760405162461bcd60e51b815260040180806020018281038252602281526020018061107e6022913960400191505060405180910390fd5b336001600160a01b0384161415610c14577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316631316529d6040518163ffffffff1660e01b815260040160206040518083038186803b158015610be757600080fd5b505afa158015610bfb573d6000803e3d6000fd5b505050506040513d6020811015610c1157600080fd5b50505b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3604080516001600160a01b038581166024830152848116604483015260648201849052336084808401919091528351808403909101815260a490920183526020820180516001600160e01b031663526a59af60e11b178152925182516000947f000000000000000000000000000000000000000000000000000000000000000093909316939282918083835b60208310610d6c5780518252601f199092019160209182019101610d4d565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114610dce576040519150601f19603f3d011682016040523d82523d6000602084013e610dd3565b606091505b5050905080610de157600080fd5b50505050565b60008184841115610e765760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610e3b578181015183820152602001610e23565b50505050905090810190601f168015610e685780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600082820183811015610ed8576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b6005805460ff191660ff92909216919091179055565b6001600160a01b038216610f50576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b600254610f63908263ffffffff610e7e16565b6002556001600160a01b038216600090815260208190526040902054610f8f908263ffffffff610e7e16565b6001600160a01b0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061102657805160ff1916838001178555611053565b82800160010185558215611053579182015b82811115611053578251825591602001919060010190611038565b5061105f929150611063565b5090565b61051891905b8082111561105f576000815560010161106956fe45524332303a20617070726f766520746f20746865207a65726f20616464726573735065726d69742861646472657373206f776e65722c61646472657373207370656e6465722c75696e743235362076616c75652c75696e74323536206e6f6e63652c75696e7432353620646561646c696e6529454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c75696e7432353620636861696e49642c6164647265737320766572696679696e67436f6e74726163742945524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a656445524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212203c071942fc2f69c6879fbc8f8defecc18e3536b53bff4af7d0d6e631b28d8b5164736f6c634300060a0033

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061012c5760003560e01c806370a08231116100ad578063a9059cbb11610071578063a9059cbb1461037c578063b9844d8d146103a8578063d93aef11146103ce578063dd62ed3e1461044e578063dde43cba1461047c5761012c565b806370a08231146102f25780638129fc1c146103185780638779588c1461032257806395d89b4114610348578063a457c2d7146103505761012c565b80632acbf823116100f45780632acbf8231461024657806330adf81f14610298578063313ce567146102a05780633644e515146102be57806339509351146102c65761012c565b806306fdde0314610131578063095ea7b3146101ae5780631316529d146101ee57806318160ddd1461020857806323b872dd14610210575b600080fd5b610139610484565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561017357818101518382015260200161015b565b50505050905090810190601f1680156101a05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101da600480360360408110156101c457600080fd5b506001600160a01b03813516906020013561051b565b604080519115158252519081900360200190f35b6101f6610538565b60408051918252519081900360200190f35b6101f661055c565b6101da6004803603606081101561022657600080fd5b506001600160a01b03813581169160208101359091169060400135610562565b6102726004803603604081101561025c57600080fd5b506001600160a01b0381351690602001356105ef565b604080516001600160801b03938416815291909216602082015281519081900390910190f35b6101f6610620565b6102a861063b565b6040805160ff9092168252519081900360200190f35b6101f6610644565b6101da600480360360408110156102dc57600080fd5b506001600160a01b03813516906020013561064a565b6101f66004803603602081101561030857600080fd5b50356001600160a01b031661069e565b610320610748565b005b6101f66004803603602081101561033857600080fd5b50356001600160a01b03166108a0565b6101396108b2565b6101da6004803603604081101561036657600080fd5b506001600160a01b038135169060200135610913565b6101da6004803603604081101561039257600080fd5b506001600160a01b038135169060200135610981565b6101f6600480360360208110156103be57600080fd5b50356001600160a01b0316610995565b610320600480360360608110156103e457600080fd5b6001600160a01b03823516919081019060408101602082013564010000000081111561040f57600080fd5b82018360208201111561042157600080fd5b8035906020019184602083028401116401000000008311171561044357600080fd5b9193509150356109a7565b6101f66004803603604081101561046457600080fd5b506001600160a01b0381358116916020013516610aa0565b6101f6610acb565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156105105780601f106104e557610100808354040283529160200191610510565b820191906000526020600020905b8154815290600101906020018083116104f357829003601f168201915b505050505090505b90565b600061052f610528610aef565b8484610af3565b50600192915050565b7f000000000000000000000000000000000000000000000000000000000000000190565b60025490565b600061056f848484610c76565b6105e58461057b610aef565b6105e085604051806060016040528060288152602001611144602891396001600160a01b038a166000908152600160205260408120906105b9610aef565b6001600160a01b03168152602081019190915260400160002054919063ffffffff610de716565b610af3565b5060019392505050565b603a6020908152600092835260408084209091529082529020546001600160801b0380821691600160801b90041682565b6040518060526110a082396052019050604051809103902081565b60055460ff1690565b603c5481565b600061052f610657610aef565b846105e08560016000610668610aef565b6001600160a01b03908116825260208083019390935260409182016000908120918c16815292529020549063ffffffff610e7e16565b60007f000000000000000000000000b48d5f19d45d209cb4a9e714e868113a2fbfd4ff6001600160a01b03166370a08231836040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561071657600080fd5b505afa15801561072a573d6000803e3d6000fd5b505050506040513d602081101561074057600080fd5b505192915050565b6000610752610538565b905060065481116107945760405162461bcd60e51b815260040180806020018281038252602e81526020018061116c602e913960400191505060405180910390fd5b600681905560405146908060526110f28239604080519182900360520182208282018252600f8084526e726174732028457468657265756d2960881b60209485018190528351808601939093527ffef6db13fbcddc7e453c5ab1888504d411c5fab3bcb42121c2932da64e570c9d8385015260608301879052306080808501919091528451808503909101815260a0840180865281519190960120603c5560e083019093529283905260c0019081526108509250600391610fe5565b50604080518082019091526004808252635261747360e01b602090920191825261087a9181610fe5565b506108856012610edf565b61089c336c0c9f2c9cd04674edea40000000610ef5565b5050565b603b6020526000908152604090205481565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156105105780601f106104e557610100808354040283529160200191610510565b600061052f610920610aef565b846105e0856040518060600160405280602581526020016111be602591396001600061094a610aef565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919063ffffffff610de716565b600061052f61098e610aef565b8484610c76565b60396020526000908152604090205481565b336001600160a01b037f000000000000000000000000b48d5f19d45d209cb4a9e714e868113a2fbfd4ff161480156109df5750600081115b610a20576040805162461bcd60e51b815260206004820152600d60248201526c24a72b20a624a22fa7aba722a960991b604482015290519081900360640190fd5b60005b82811015610a9957838382818110610a3757fe5b905060200201356001600160a01b03166001600160a01b0316856001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600101610a23565b5050505050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b7f000000000000000000000000000000000000000000000000000000000000000181565b3390565b6001600160a01b038316610b385760405162461bcd60e51b815260040180806020018281038252602481526020018061119a6024913960400191505060405180910390fd5b6001600160a01b038216610b7d5760405162461bcd60e51b815260040180806020018281038252602281526020018061107e6022913960400191505060405180910390fd5b336001600160a01b0384161415610c14577f000000000000000000000000b48d5f19d45d209cb4a9e714e868113a2fbfd4ff6001600160a01b0316631316529d6040518163ffffffff1660e01b815260040160206040518083038186803b158015610be757600080fd5b505afa158015610bfb573d6000803e3d6000fd5b505050506040513d6020811015610c1157600080fd5b50505b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3604080516001600160a01b038581166024830152848116604483015260648201849052336084808401919091528351808403909101815260a490920183526020820180516001600160e01b031663526a59af60e11b178152925182516000947f000000000000000000000000b48d5f19d45d209cb4a9e714e868113a2fbfd4ff93909316939282918083835b60208310610d6c5780518252601f199092019160209182019101610d4d565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114610dce576040519150601f19603f3d011682016040523d82523d6000602084013e610dd3565b606091505b5050905080610de157600080fd5b50505050565b60008184841115610e765760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610e3b578181015183820152602001610e23565b50505050905090810190601f168015610e685780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600082820183811015610ed8576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b6005805460ff191660ff92909216919091179055565b6001600160a01b038216610f50576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b600254610f63908263ffffffff610e7e16565b6002556001600160a01b038216600090815260208190526040902054610f8f908263ffffffff610e7e16565b6001600160a01b0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061102657805160ff1916838001178555611053565b82800160010185558215611053579182015b82811115611053578251825591602001919060010190611038565b5061105f929150611063565b5090565b61051891905b8082111561105f576000815560010161106956fe45524332303a20617070726f766520746f20746865207a65726f20616464726573735065726d69742861646472657373206f776e65722c61646472657373207370656e6465722c75696e743235362076616c75652c75696e74323536206e6f6e63652c75696e7432353620646561646c696e6529454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c75696e7432353620636861696e49642c6164647265737320766572696679696e67436f6e74726163742945524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a656445524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212203c071942fc2f69c6879fbc8f8defecc18e3536b53bff4af7d0d6e631b28d8b5164736f6c634300060a0033

Deployed Bytecode Sourcemap

23975:6138:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13722:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15847:169;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;15847:169:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;27293:96;;;:::i;:::-;;;;;;;;;;;;;;;;14797:100;;;:::i;16490:332::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;16490:332:0;;;;;;;;;;;;;;;;;:::i;24774:68::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;24774:68:0;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;24774:68:0;;;;;;;;;;;;;;;;;;;;;;;;25527:137;;;:::i;14649:83::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;25246:31;;;:::i;17231:218::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;17231:218:0;;;;;;;;:::i;27452:131::-;;;;;;;;;;;;;;;;-1:-1:-1;27452:131:0;-1:-1:-1;;;;;27452:131:0;;:::i;26103:499::-;;;:::i;:::-;;24851:52;;;;;;;;;;;;;;;;-1:-1:-1;24851:52:0;-1:-1:-1;;;;;24851:52:0;;:::i;13924:87::-;;;:::i;17952:269::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;17952:269:0;;;;;;;;:::i;15300:186::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;15300:186:0;;;;;;;;:::i;24722:43::-;;;;;;;;;;;;;;;;-1:-1:-1;24722:43:0;-1:-1:-1;;;;;24722:43:0;;:::i;26884:320::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26884:320:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26884:320:0;-1:-1:-1;26884:320:0;;:::i;15549:151::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;15549:151:0;;;;;;;;;;:::i;24616:33::-;;;:::i;13722:83::-;13792:5;13785:12;;;;;;;;-1:-1:-1;;13785:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13759:13;;13785:12;;13792:5;;13785:12;;13792:5;13785:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13722:83;;:::o;15847:169::-;15930:4;15947:39;15956:12;:10;:12::i;:::-;15970:7;15979:6;15947:8;:39::i;:::-;-1:-1:-1;16004:4:0;15847:169;;;;:::o;27293:96::-;27373:8;27293:96;:::o;14797:100::-;14877:12;;14797:100;:::o;16490:332::-;16596:4;16613:47;16634:6;16642:9;16653:6;16613:20;:47::i;:::-;16671:121;16680:6;16688:12;:10;:12::i;:::-;16702:89;16740:6;16702:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16702:19:0;;;;;;:11;:19;;;;;;16722:12;:10;:12::i;:::-;-1:-1:-1;;;;;16702:33:0;;;;;;;;;;;;-1:-1:-1;16702:33:0;;;:89;;:37;:89;:::i;:::-;16671:8;:121::i;:::-;-1:-1:-1;16810:4:0;16490:332;;;;;:::o;24774:68::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24774:68:0;;;;-1:-1:-1;;;24774:68:0;;;;:::o;25527:137::-;25569:95;;;;;;;;;;;;;;;;;;25527:137;:::o;14649:83::-;14715:9;;;;14649:83;:::o;25246:31::-;;;;:::o;17231:218::-;17319:4;17336:83;17345:12;:10;:12::i;:::-;17359:7;17368:50;17407:10;17368:11;:25;17380:12;:10;:12::i;:::-;-1:-1:-1;;;;;17368:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;17368:25:0;;;:34;;;;;;;;;;;:50;:38;:50;:::i;27452:131::-;27518:7;27545:11;-1:-1:-1;;;;;27545:21:0;;27567:7;27545:30;;;;;;;;;;;;;-1:-1:-1;;;;;27545:30:0;-1:-1:-1;;;;;27545:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27545:30:0;;27452:131;-1:-1:-1;;27452:131:0:o;26103:499::-;23373:16;23392:13;:11;:13::i;:::-;23373:32;;23435:23;;23424:8;:34;23416:93;;;;-1:-1:-1;;;23416:93:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23522:23;:34;;;25425:95:::1;::::0;26262:9:::1;::::0;25425:95;::::1;;::::0;::::1;;::::0;;;;;;::::1;::::0;;;26392:4;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;;;26392:4:0::1;::::0;;::::1;::::0;;;26323:136;;;;::::1;::::0;;;;26376:22;26323:136;;;;;;;;;;26443:4:::1;26323:136:::0;;;;;;;;;;;;;;;;;;;;;;;;26313:147;;;;;::::1;::::0;26294:16:::1;:166:::0;26479:4;;;;;;;;;;;;;;;26471:12:::1;::::0;-1:-1:-1;26471:5:0::1;::::0;:12:::1;:::i;:::-;-1:-1:-1::0;26504:6:0::1;::::0;;;;::::1;::::0;;;::::1;::::0;;;-1:-1:-1;;;26504:6:0::1;::::0;;::::1;::::0;;;26494:16:::1;::::0;26504:6;26494:16:::1;:::i;:::-;;26521:24;24333:2;26521:14;:24::i;:::-;26556:38;26562:10;24597;26556:5;:38::i;:::-;23569:1;26103:499:::0;:::o;24851:52::-;;;;;;;;;;;;;:::o;13924:87::-;13996:7;13989:14;;;;;;;;-1:-1:-1;;13989:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13963:13;;13989:14;;13996:7;;13989:14;;13996:7;13989:14;;;;;;;;;;;;;;;;;;;;;;;;17952:269;18045:4;18062:129;18071:12;:10;:12::i;:::-;18085:7;18094:96;18133:15;18094:96;;;;;;;;;;;;;;;;;:11;:25;18106:12;:10;:12::i;:::-;-1:-1:-1;;;;;18094:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;18094:25:0;;;:34;;;;;;;;;;;:96;;:38;:96;:::i;15300:186::-;15386:4;15403:53;15424:12;:10;:12::i;:::-;15438:9;15449:6;15403:20;:53::i;24722:43::-;;;;;;;;;;;;;:::o;26884:320::-;27016:10;-1:-1:-1;;;;;27038:11:0;27016:34;;:43;;;;;27058:1;27054;:5;27016:43;27008:69;;;;;-1:-1:-1;;;27008:69:0;;;;;;;;;;;;-1:-1:-1;;;27008:69:0;;;;;;;;;;;;;;;27095:9;27090:107;27110:18;;;27090:107;;;27171:7;;27179:1;27171:10;;;;;;;;;;;;;-1:-1:-1;;;;;27171:10:0;-1:-1:-1;;;;;27155:30:0;27164:5;-1:-1:-1;;;;;27155:30:0;;27183:1;27155:30;;;;;;;;;;;;;;;;;;27130:3;;27090:107;;;;26884:320;;;;:::o;15549:151::-;-1:-1:-1;;;;;15665:18:0;;;15638:7;15665:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;15549:151::o;24616:33::-;;;:::o;605:106::-;693:10;605:106;:::o;29696:414::-;-1:-1:-1;;;;;29807:19:0;;29799:68;;;;-1:-1:-1;;;29799:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29886:21:0;;29878:68;;;;-1:-1:-1;;;29878:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29959:10;-1:-1:-1;;;;;29959:19:0;;;29955:50;;;29980:11;-1:-1:-1;;;;;29980:23:0;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;29955:50:0;-1:-1:-1;;;;;30018:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;30070:32;;;;;;;;;;;;;;;;;29696:414;;;:::o;29028:279::-;29149:2;-1:-1:-1;;;;;29134:26:0;29143:4;-1:-1:-1;;;;;29134:26:0;;29153:6;29134:26;;;;;;;;;;;;;;;;;;29211:64;;;-1:-1:-1;;;;;29211:64:0;;;;;;;;;;;;;;;;;;;;29264:10;29211:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29211:64:0;-1:-1:-1;;;29211:64:0;;;29185:91;;;;29174:6;;29193:11;29185:25;;;;;29211:64;29185:91;;;;29211:64;29185:91;;;;;;;;;;-1:-1:-1;;29185:91:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29173:103;;;29297:1;29289:10;;;;;;29028:279;;;;:::o;5399:192::-;5485:7;5521:12;5513:6;;;;5505:29;;;;-1:-1:-1;;;5505:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5557:5:0;;;5399:192::o;4512:181::-;4570:7;4602:5;;;4626:6;;;;4618:46;;;;;-1:-1:-1;;;4618:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;4684:1;4512:181;-1:-1:-1;;;4512:181:0:o;21454:90::-;21515:9;:21;;-1:-1:-1;;21515:21:0;;;;;;;;;;;;21454:90::o;19531:316::-;-1:-1:-1;;;;;19615:21:0;;19607:65;;;;;-1:-1:-1;;;19607:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;19700:12;;:24;;19717:6;19700:24;:16;:24;:::i;:::-;19685:12;:39;-1:-1:-1;;;;;19756:18:0;;:9;:18;;;;;;;;;;;:30;;19779:6;19756:30;:22;:30;:::i;:::-;-1:-1:-1;;;;;19735:18:0;;:9;:18;;;;;;;;;;;:51;;;;19802:37;;;;;;;19735:18;;:9;;19802:37;;;;;;;;;;19531:316;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;

Swarm Source

ipfs://3c071942fc2f69c6879fbc8f8defecc18e3536b53bff4af7d0d6e631b28d8b51
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.