Sepolia Testnet

Contract

0xa78F78Aba222d20cE82eA4868a9E00c954e469c0

Overview

ETH Balance

0 ETH

Multichain Info

N/A
Transaction Hash
Method
Block
From
To
Value
Approve56366482024-04-05 20:49:3652 days ago1712350176IN
0xa78F78Ab...954e469c0
0 ETH0.000069931.50052652
Transfer56353812024-04-05 16:23:1252 days ago1712334192IN
0xa78F78Ab...954e469c0
0 ETH0.000078121.50699969
Approve56223822024-04-03 18:41:1254 days ago1712169672IN
0xa78F78Ab...954e469c0
0 ETH0.000049571.69703256
Approve56081702024-04-01 19:15:4856 days ago1711998948IN
0xa78F78Ab...954e469c0
0 ETH0.000069461.50000002
Approve56078852024-04-01 18:18:2456 days ago1711995504IN
0xa78F78Ab...954e469c0
0 ETH0.000043811.500002
Approve56078592024-04-01 18:13:1256 days ago1711995192IN
0xa78F78Ab...954e469c0
0 ETH0.000039611.50000237
Approve55594192024-03-25 17:58:0063 days ago1711389480IN
0xa78F78Ab...954e469c0
0 ETH0.000101262.18671554
Approve55590712024-03-25 16:45:3663 days ago1711385136IN
0xa78F78Ab...954e469c0
0 ETH0.000115052.48447389
Approve55545332024-03-25 0:41:3664 days ago1711327296IN
0xa78F78Ab...954e469c0
0 ETH0.000074151.60172408

Latest 1 internal transaction

Advanced mode:
Parent Transaction Hash Block From To Value
54660252024-03-11 21:08:4877 days ago1710191328  Contract Creation0 ETH
Loading...
Loading

Similar Match Source Code
This contract matches the deployed Bytecode of the Source Code for Contract 0xeA2D83AA...1318DDd86
The constructor portion of the code might be different and could alter the actual behaviour of the contract

Contract Name:
EBTCToken

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity Standard Json-Input format)

File 1 of 8 : EBTCToken.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.17;

import "./Interfaces/IEBTCToken.sol";

import "./Dependencies/AuthNoOwner.sol";
import "./Dependencies/PermitNonce.sol";

/*
 *
 * Based upon OpenZeppelin's ERC20 contract:
 * https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol
 *
 * and their EIP2612 (ERC20Permit / ERC712) functionality:
 * https://github.com/OpenZeppelin/openzeppelin-contracts/blob/53516bc555a454862470e7860a9b5254db4d00f5/contracts/token/ERC20/ERC20Permit.sol
 *
 *
 * --- Functionality added specific to the EBTCToken ---
 *
 * 1) Transfer protection: blocklist of addresses that are invalid recipients (i.e. core Ebtc contracts) in external transfer() and transferFrom() calls.
 * The purpose is to protect users from losing tokens by mistakenly sending EBTC directly to a Liquity.
 * core contract, when they should rather call the right function.
 */

contract EBTCToken is IEBTCToken, AuthNoOwner, PermitNonce {
    uint256 private _totalSupply;
    string internal constant _NAME = "EBTC Stablecoin";
    string internal constant _SYMBOL = "EBTC";
    string internal constant _VERSION = "1";
    uint8 internal constant _DECIMALS = 18;

    // --- Data for EIP2612 ---

    // keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");
    bytes32 private constant _PERMIT_TYPEHASH =
        0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;
    // keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)");
    bytes32 private constant _TYPE_HASH =
        0x8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f;

    // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to
    // invalidate the cached domain separator if the chain id changes.
    bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;
    uint256 private immutable _CACHED_CHAIN_ID;

    bytes32 private immutable _HASHED_NAME;
    bytes32 private immutable _HASHED_VERSION;

    // User data for EBTC token
    mapping(address => uint256) private _balances;
    mapping(address => mapping(address => uint256)) private _allowances;

    // --- Addresses ---
    address public immutable cdpManagerAddress;
    address public immutable borrowerOperationsAddress;

    /// @param _cdpManagerAddress Address of the CDP Manager
    /// @param _borrowerOperationsAddress Address of the Borrower Operations
    /// @param _authorityAddress Address of the authority for the contract
    constructor(
        address _cdpManagerAddress,
        address _borrowerOperationsAddress,
        address _authorityAddress
    ) {
        _initializeAuthority(_authorityAddress);

        cdpManagerAddress = _cdpManagerAddress;
        borrowerOperationsAddress = _borrowerOperationsAddress;

        bytes32 hashedName = keccak256(bytes(_NAME));
        bytes32 hashedVersion = keccak256(bytes(_VERSION));

        _HASHED_NAME = hashedName;
        _HASHED_VERSION = hashedVersion;
        _CACHED_CHAIN_ID = _chainID();
        _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(_TYPE_HASH, hashedName, hashedVersion);
    }

    /// @notice Mint new tokens
    /// @dev Internal system function - only callable by BorrowerOperations or CDPManager
    /// @dev Governance can also expand the list of approved minters to enable other systems to mint tokens
    /// @param _account The address to receive the newly minted tokens
    /// @param _amount The amount of tokens to mint
    function mint(address _account, uint256 _amount) external override {
        _requireCallerIsBOorCdpMOrAuth();
        _mint(_account, _amount);
    }

    /// @notice Burn existing tokens
    /// @dev Internal system function - only callable by BorrowerOperations or CDPManager
    /// @dev Governance can also expand the list of approved burners to enable other systems to burn tokens
    /// @param _account The address to burn tokens from
    /// @param _amount The amount of tokens to burn
    function burn(address _account, uint256 _amount) external override {
        _requireCallerIsBOorCdpMOrAuth();
        _burn(_account, _amount);
    }

    /// @notice Burn existing tokens from caller
    /// @dev Internal system function - only callable by BorrowerOperations or CDPManager
    /// @dev Governance can also expand the list of approved burners to enable other systems to burn tokens
    /// @param _amount The amount of tokens to burn
    function burn(uint256 _amount) external {
        _requireCallerIsBOorCdpMOrAuth();
        _burn(msg.sender, _amount);
    }

    // --- External functions ---

    function totalSupply() external view override returns (uint256) {
        return _totalSupply;
    }

    function balanceOf(address account) external view override returns (uint256) {
        return _balances[account];
    }

    function transfer(address recipient, uint256 amount) external override returns (bool) {
        _requireValidRecipient(recipient);
        _transfer(msg.sender, recipient, amount);
        return true;
    }

    function allowance(address owner, address spender) external view override returns (uint256) {
        return _allowances[owner][spender];
    }

    function approve(address spender, uint256 amount) external override returns (bool) {
        _approve(msg.sender, spender, amount);
        return true;
    }

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external override returns (bool) {
        _requireValidRecipient(recipient);
        _transfer(sender, recipient, amount);

        uint256 cachedAllowance = _allowances[sender][msg.sender];
        if (cachedAllowance != type(uint256).max) {
            require(cachedAllowance >= amount, "ERC20: transfer amount exceeds allowance");
            unchecked {
                _approve(sender, msg.sender, cachedAllowance - amount);
            }
        }
        return true;
    }

    function increaseAllowance(
        address spender,
        uint256 addedValue
    ) external override returns (bool) {
        _approve(msg.sender, spender, _allowances[msg.sender][spender] + addedValue);
        return true;
    }

    function decreaseAllowance(
        address spender,
        uint256 subtractedValue
    ) external override returns (bool) {
        uint256 cachedAllowances = _allowances[msg.sender][spender];
        require(cachedAllowances >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(msg.sender, spender, cachedAllowances - subtractedValue);
        }
        return true;
    }

    // --- EIP 2612 Functionality (https://eips.ethereum.org/EIPS/eip-2612) ---

    /// @notice This function returns the domain separator for current chain
    /// @return EIP712 compatible Domain definition
    function DOMAIN_SEPARATOR() external view returns (bytes32) {
        return domainSeparator();
    }

    /// @notice This function returns the domain separator for current chain
    /// @return EIP712 compatible Domain definition
    function domainSeparator() public view override returns (bytes32) {
        if (_chainID() == _CACHED_CHAIN_ID) {
            return _CACHED_DOMAIN_SEPARATOR;
        } else {
            return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);
        }
    }

    /// @notice This function approve given amount for specified owner and spender
    /// @notice by verifying the validity of given deadline and signature parameters (v, r, s).
    /// @param owner The token owner
    /// @param spender The consumer to which owner want to grant approval
    /// @param amount The token expenditure budget to be set
    /// @param deadline The permit valid deadline
    /// @param v The v part of signature from owner
    /// @param r The r part of signature from owner
    /// @param s The s part of signature from owner
    function permit(
        address owner,
        address spender,
        uint256 amount,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external override {
        require(deadline >= block.timestamp, "EBTC: expired deadline");
        bytes32 digest = keccak256(
            abi.encodePacked(
                "\x19\x01",
                domainSeparator(),
                keccak256(
                    abi.encode(_PERMIT_TYPEHASH, owner, spender, amount, _nonces[owner]++, deadline)
                )
            )
        );
        address recoveredAddress = ecrecover(digest, v, r, s);
        require(recoveredAddress == owner, "EBTC: invalid signature");
        _approve(owner, spender, amount);
    }

    /// @dev Return current nonce for specified owner fOR EIP-2612 compatibility
    /// @param owner The address whose nonce to be queried
    function nonces(address owner) external view override(IERC2612, PermitNonce) returns (uint256) {
        return _nonces[owner];
    }

    // --- Internal operations ---

    function _chainID() private view returns (uint256) {
        return block.chainid;
    }

    function _buildDomainSeparator(
        bytes32 typeHash,
        bytes32 name,
        bytes32 version
    ) private view returns (bytes32) {
        return keccak256(abi.encode(typeHash, name, version, _chainID(), address(this)));
    }

    // --- Internal operations ---
    // Warning: sanity checks (for sender and recipient) should have been done before calling these internal functions

    function _transfer(address sender, address recipient, uint256 amount) internal {
        require(sender != address(0), "EBTCToken: zero sender!");
        require(recipient != address(0), "EBTCToken: zero recipient!");

        uint256 cachedSenderBalances = _balances[sender];
        require(cachedSenderBalances >= amount, "ERC20: transfer amount exceeds balance");

        unchecked {
            // Safe because of the check above
            _balances[sender] = cachedSenderBalances - amount;
        }

        _balances[recipient] = _balances[recipient] + amount;
        emit Transfer(sender, recipient, amount);
    }

    function _mint(address account, uint256 amount) internal {
        require(account != address(0), "EBTCToken: mint to zero recipient!");

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

    function _burn(address account, uint256 amount) internal {
        require(account != address(0), "EBTCToken: burn from zero account!");

        uint256 cachedBalance = _balances[account];
        require(cachedBalance >= amount, "ERC20: burn amount exceeds balance");

        unchecked {
            // Safe because of the check above
            _balances[account] = cachedBalance - amount;
        }

        _totalSupply = _totalSupply - amount;
        emit Transfer(account, address(0), amount);
    }

    function _approve(address owner, address spender, uint256 amount) internal {
        require(owner != address(0), "EBTCToken: zero approve owner!");
        require(spender != address(0), "EBTCToken: zero approve spender!");

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

    // --- 'require' functions ---

    function _requireValidRecipient(address _recipient) internal view {
        require(
            _recipient != address(0) && _recipient != address(this),
            "EBTC: Cannot transfer tokens directly to the EBTC token contract or the zero address"
        );
        require(
            _recipient != cdpManagerAddress && _recipient != borrowerOperationsAddress,
            "EBTC: Cannot transfer tokens directly to the CdpManager or BorrowerOps"
        );
    }

    function _requireCallerIsBorrowerOperations() internal view {
        require(
            msg.sender == borrowerOperationsAddress,
            "EBTCToken: Caller is not BorrowerOperations"
        );
    }

    /// @dev authority check last to short-circuit in the case of use by usual immutable addresses
    function _requireCallerIsBOorCdpMOrAuth() internal view {
        require(
            msg.sender == borrowerOperationsAddress ||
                msg.sender == cdpManagerAddress ||
                isAuthorized(msg.sender, msg.sig),
            "EBTC: Caller is neither BorrowerOperations nor CdpManager nor authorized"
        );
    }

    function _requireCallerIsCdpM() internal view {
        require(msg.sender == cdpManagerAddress, "EBTC: Caller is not CdpManager");
    }

    // --- Optional functions ---

    /// @notice Returns the name of the token
    /// @return Name of the token
    function name() external pure override returns (string memory) {
        return _NAME;
    }

    /// @notice Returns the symbol of the token
    /// @return Symbol of the token
    function symbol() external pure override returns (string memory) {
        return _SYMBOL;
    }

    /// @notice Returns the number of decimals used to represent token amounts
    /// @return Number of decimals used by the token
    function decimals() external pure override returns (uint8) {
        return _DECIMALS;
    }

    /// @notice Returns the version of the token
    /// @return Version of the token
    function version() external pure override returns (string memory) {
        return _VERSION;
    }

    /// @notice Returns the type hash used for permit() function as per EIP-2612
    /// @return EIP-2612 permit type hash
    function permitTypeHash() external pure override returns (bytes32) {
        return _PERMIT_TYPEHASH;
    }
}

File 2 of 8 : AuthNoOwner.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity 0.8.17;

import {Authority} from "./Authority.sol";

/// @notice Provides a flexible and updatable auth pattern which is completely separate from application logic.
/// @author Modified by BadgerDAO to remove owner
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/auth/Auth.sol)
/// @author Modified from Dappsys (https://github.com/dapphub/ds-auth/blob/master/src/auth.sol)
contract AuthNoOwner {
    event AuthorityUpdated(address indexed user, Authority indexed newAuthority);

    Authority private _authority;
    bool private _authorityInitialized;

    modifier requiresAuth() virtual {
        require(isAuthorized(msg.sender, msg.sig), "Auth: UNAUTHORIZED");

        _;
    }

    function authority() public view returns (Authority) {
        return _authority;
    }

    function authorityInitialized() public view returns (bool) {
        return _authorityInitialized;
    }

    function isAuthorized(address user, bytes4 functionSig) internal view virtual returns (bool) {
        Authority auth = _authority; // Memoizing authority saves us a warm SLOAD, around 100 gas.

        // Checking if the caller is the owner only after calling the authority saves gas in most cases, but be
        // aware that this makes protected functions uncallable even to the owner if the authority is out of order.
        return (address(auth) != address(0) && auth.canCall(user, address(this), functionSig));
    }

    /// @notice Changed constructor to initialize to allow flexiblity of constructor vs initializer use
    /// @notice sets authorityInitiailzed flag to ensure only one use of
    function _initializeAuthority(address newAuthority) internal {
        require(address(_authority) == address(0), "Auth: authority is non-zero");
        require(!_authorityInitialized, "Auth: authority already initialized");

        _authority = Authority(newAuthority);
        _authorityInitialized = true;

        emit AuthorityUpdated(address(this), Authority(newAuthority));
    }
}

File 3 of 8 : Authority.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity 0.8.17;

/// @notice A generic interface for a contract which provides authorization data to an Auth instance.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/auth/Auth.sol)
/// @author Modified from Dappsys (https://github.com/dapphub/ds-auth/blob/master/src/auth.sol)
interface Authority {
    function canCall(address user, address target, bytes4 functionSig) external view returns (bool);
}

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

pragma solidity 0.8.17;

/**
 * Based on the OpenZeppelin IER20 interface:
 * https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol
 *
 * @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);

    function increaseAllowance(address spender, uint256 addedValue) external returns (bool);

    function decreaseAllowance(address spender, uint256 subtractedValue) external returns (bool);

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

    function name() external view returns (string memory);

    function symbol() external view returns (string memory);

    function decimals() external view returns (uint8);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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

File 5 of 8 : IERC2612.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.17;

/**
 * @dev Interface of the ERC2612 standard as defined in the EIP.
 *
 * Adds the {permit} method, which can be used to change one's
 * {IERC20-allowance} without having to send a transaction, by signing a
 * message. This allows users to spend tokens without having to hold Ether.
 *
 * See https://eips.ethereum.org/EIPS/eip-2612.
 *
 * Code adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2237/
 */
interface IERC2612 {
    /**
     * @dev Sets `amount` as the allowance of `spender` over `owner`'s tokens,
     * given `owner`'s signed approval.
     *
     * IMPORTANT: The same issues {IERC20-approve} has related to transaction
     * ordering also apply here.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     * - `deadline` must be a timestamp in the future.
     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
     * over the EIP712-formatted function arguments.
     * - the signature must use ``owner``'s current nonce (see {nonces}).
     *
     * For more information on the signature format, see the
     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
     * section].
     */
    function permit(
        address owner,
        address spender,
        uint256 amount,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    /**
     * @dev Returns the current ERC2612 nonce for `owner`. This value must be
     * included whenever a signature is generated for {permit}.
     *
     * Every successful call to {permit} increases `owner`'s nonce by one. This
     * prevents a signature from being used multiple times.
     *
     * `owner` can limit the time a Permit is valid for by setting `deadline` to
     * a value in the near future. The deadline argument can be set to uint256(-1) to
     * create Permits that effectively never expire.
     */
    function nonces(address owner) external view returns (uint256);

    function version() external view returns (string memory);

    function permitTypeHash() external view returns (bytes32);

    function domainSeparator() external view returns (bytes32);
}

File 6 of 8 : PermitNonce.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.17;
import "../Interfaces/IPermitNonce.sol";

/**
 * @dev This abstract contract provides a mapping from address to nonce (uint256) used for permit signature
 */
contract PermitNonce is IPermitNonce {
    mapping(address => uint256) internal _nonces;

    /// @dev Increase current nonce for msg.sender by one.
    /// @notice This function could be used to invalidate any signed permit out there
    function increasePermitNonce() external returns (uint256) {
        return ++_nonces[msg.sender];
    }

    /// @dev Return current nonce for msg.sender fOR EIP-2612 compatibility
    function nonces(address owner) external view virtual returns (uint256) {
        return _nonces[owner];
    }
}

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

pragma solidity 0.8.17;

import "../Dependencies/IERC20.sol";
import "../Dependencies/IERC2612.sol";

interface IEBTCToken is IERC20, IERC2612 {
    // --- Functions ---

    function mint(address _account, uint256 _amount) external;

    function burn(address _account, uint256 _amount) external;
}

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

pragma solidity 0.8.17;

interface IPermitNonce {
    // --- Functions ---
    function increasePermitNonce() external returns (uint256);

    function nonces(address owner) external view returns (uint256);
}

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

Contract ABI

[{"inputs":[{"internalType":"address","name":"_cdpManagerAddress","type":"address"},{"internalType":"address","name":"_borrowerOperationsAddress","type":"address"},{"internalType":"address","name":"_authorityAddress","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":"user","type":"address"},{"indexed":true,"internalType":"contract Authority","name":"newAuthority","type":"address"}],"name":"AuthorityUpdated","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":[{"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":[],"name":"authority","outputs":[{"internalType":"contract Authority","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"authorityInitialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"borrowerOperationsAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cdpManagerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"domainSeparator","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"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":"increasePermitNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"permitTypeHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"}]

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101735760003560e01c806370a08231116100de578063a9059cbb11610097578063d505accf11610071578063d505accf146103c2578063dd62ed3e146103d5578063e34480351461040e578063f698da251461041657600080fd5b8063a9059cbb14610377578063b7f8cf9b1461038a578063bf7e214f146103b157600080fd5b806370a08231146102cd5780637ecebe00146102f657806395d89b411461031f57806397bc1e1b1461033f5780639dc29fac14610351578063a457c2d71461036457600080fd5b8063313ce56711610130578063313ce5671461025e5780633644e5151461026d578063395093511461027557806340c10f191461028857806342966c681461029d57806354fd4d50146102b057600080fd5b806302f6567f1461017857806306fdde03146101bc578063095ea7b3146101f057806310ce43bd1461021357806318160ddd1461024357806323b872dd1461024b575b600080fd5b61019f7f000000000000000000000000e89a0378237c21b94126f77ed5fa0fdd2ede2b3681565b6040516001600160a01b0390911681526020015b60405180910390f35b60408051808201909152600f81526e22a12a219029ba30b13632b1b7b4b760891b60208201525b6040516101b3919061118a565b6102036101fe3660046111f4565b61041e565b60405190151581526020016101b3565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c95b6040519081526020016101b3565b600254610235565b61020361025936600461121e565b610435565b604051601281526020016101b3565b6102356104f6565b6102036102833660046111f4565b610505565b61029b6102963660046111f4565b610541565b005b61029b6102ab36600461125a565b610557565b6040805180820190915260018152603160f81b60208201526101e3565b6102356102db366004611273565b6001600160a01b031660009081526003602052604090205490565b610235610304366004611273565b6001600160a01b031660009081526001602052604090205490565b6040805180820190915260048152634542544360e01b60208201526101e3565b600054600160a01b900460ff16610203565b61029b61035f3660046111f4565b61056c565b6102036103723660046111f4565b61057e565b6102036103853660046111f4565b610617565b61019f7f00000000000000000000000058aa3de50cfef7450657c52766dd43da8747285e81565b6000546001600160a01b031661019f565b61029b6103d0366004611295565b61062d565b6102356103e3366004611308565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205490565b610235610835565b61023561085b565b600061042b33848461094d565b5060015b92915050565b600061044083610a5b565b61044b848484610c00565b6001600160a01b038416600090815260046020908152604080832033845290915290205460001981146104eb57828110156104de5760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084015b60405180910390fd5b6104eb853385840361094d565b506001949350505050565b600061050061085b565b905090565b3360008181526004602090815260408083206001600160a01b0387168452909152812054909161042b91859061053c908690611351565b61094d565b610549610db7565b6105538282610eb7565b5050565b61055f610db7565b6105693382610faa565b50565b610574610db7565b6105538282610faa565b3360009081526004602090815260408083206001600160a01b0386168452909152812054828110156106005760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016104d5565b61060d338585840361094d565b5060019392505050565b600061062283610a5b565b61042b338484610c00565b428410156106765760405162461bcd60e51b8152602060048201526016602482015275454254433a206578706972656420646561646c696e6560501b60448201526064016104d5565b600061068061085b565b6001600160a01b038916600090815260016020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9928c928c928c929091906106ce83611364565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810187905260e0016040516020818303038152906040528051906020012060405160200161074792919061190160f01b81526002810192909252602282015260420190565b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff88169284019290925260608301869052608083018590529092509060019060a0016020604051602081039080840390855afa1580156107b2573d6000803e3d6000fd5b505050602060405103519050886001600160a01b0316816001600160a01b03161461081f5760405162461bcd60e51b815260206004820152601760248201527f454254433a20696e76616c6964207369676e617475726500000000000000000060448201526064016104d5565b61082a89898961094d565b505050505050505050565b3360009081526001602052604081208054829061085190611364565b9182905550919050565b60007f0000000000000000000000000000000000000000000000000000000000aa36a746036108a957507fb0db8da539b18d706c1704299f9ce8eb505a33868de8d8fca0d0ffe07741aa0c90565b50604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6020808301919091527f6618e91f35938a4168d57b3e4a4f691dfa5fa30bba4b3e0d5ae7a93726e869ad828401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6001600160a01b0383166109a35760405162461bcd60e51b815260206004820152601e60248201527f45425443546f6b656e3a207a65726f20617070726f7665206f776e657221000060448201526064016104d5565b6001600160a01b0382166109f95760405162461bcd60e51b815260206004820181905260248201527f45425443546f6b656e3a207a65726f20617070726f7665207370656e6465722160448201526064016104d5565b6001600160a01b0383811660008181526004602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b03811615801590610a7c57506001600160a01b0381163014155b610b0b5760405162461bcd60e51b815260206004820152605460248201527f454254433a2043616e6e6f74207472616e7366657220746f6b656e732064697260448201527f6563746c7920746f20746865204542544320746f6b656e20636f6e7472616374606482015273206f7220746865207a65726f206164647265737360601b608482015260a4016104d5565b7f000000000000000000000000e89a0378237c21b94126f77ed5fa0fdd2ede2b366001600160a01b0316816001600160a01b031614158015610b7f57507f00000000000000000000000058aa3de50cfef7450657c52766dd43da8747285e6001600160a01b0316816001600160a01b031614155b6105695760405162461bcd60e51b815260206004820152604660248201527f454254433a2043616e6e6f74207472616e7366657220746f6b656e732064697260448201527f6563746c7920746f20746865204364704d616e61676572206f7220426f72726f6064820152657765724f707360d01b608482015260a4016104d5565b6001600160a01b038316610c565760405162461bcd60e51b815260206004820152601760248201527f45425443546f6b656e3a207a65726f2073656e6465722100000000000000000060448201526064016104d5565b6001600160a01b038216610cac5760405162461bcd60e51b815260206004820152601a60248201527f45425443546f6b656e3a207a65726f20726563697069656e742100000000000060448201526064016104d5565b6001600160a01b03831660009081526003602052604090205481811015610d245760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016104d5565b6001600160a01b03808516600090815260036020526040808220858503905591851681522054610d55908390611351565b6001600160a01b0380851660008181526003602052604090819020939093559151908616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90610da99086815260200190565b60405180910390a350505050565b336001600160a01b037f00000000000000000000000058aa3de50cfef7450657c52766dd43da8747285e161480610e165750336001600160a01b037f000000000000000000000000e89a0378237c21b94126f77ed5fa0fdd2ede2b3616145b80610e325750610e32336000356001600160e01b0319166110eb565b610eb55760405162461bcd60e51b815260206004820152604860248201527f454254433a2043616c6c6572206973206e65697468657220426f72726f77657260448201527f4f7065726174696f6e73206e6f72204364704d616e61676572206e6f722061756064820152671d1a1bdc9a5e995960c21b608482015260a4016104d5565b565b6001600160a01b038216610f185760405162461bcd60e51b815260206004820152602260248201527f45425443546f6b656e3a206d696e7420746f207a65726f20726563697069656e604482015261742160f01b60648201526084016104d5565b80600254610f269190611351565b6002556001600160a01b038216600090815260036020526040902054610f4d908290611351565b6001600160a01b0383166000818152600360205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90610f9e9085815260200190565b60405180910390a35050565b6001600160a01b03821661100b5760405162461bcd60e51b815260206004820152602260248201527f45425443546f6b656e3a206275726e2066726f6d207a65726f206163636f756e604482015261742160f01b60648201526084016104d5565b6001600160a01b0382166000908152600360205260409020548181101561107f5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016104d5565b6001600160a01b038316600090815260036020526040902082820390556002546110aa90839061137d565b6002556040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001610a4e565b600080546001600160a01b03168015801590611182575060405163b700961360e01b81526001600160a01b0385811660048301523060248301526001600160e01b03198516604483015282169063b700961390606401602060405180830381865afa15801561115e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111829190611390565b949350505050565b600060208083528351808285015260005b818110156111b75785810183015185820160400152820161119b565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b03811681146111ef57600080fd5b919050565b6000806040838503121561120757600080fd5b611210836111d8565b946020939093013593505050565b60008060006060848603121561123357600080fd5b61123c846111d8565b925061124a602085016111d8565b9150604084013590509250925092565b60006020828403121561126c57600080fd5b5035919050565b60006020828403121561128557600080fd5b61128e826111d8565b9392505050565b600080600080600080600060e0888a0312156112b057600080fd5b6112b9886111d8565b96506112c7602089016111d8565b95506040880135945060608801359350608088013560ff811681146112eb57600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561131b57600080fd5b611324836111d8565b9150611332602084016111d8565b90509250929050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561042f5761042f61133b565b6000600182016113765761137661133b565b5060010190565b8181038181111561042f5761042f61133b565b6000602082840312156113a257600080fd5b8151801515811461128e57600080fdfea26469706673582212207a805ba1b7c4dddec06f3a51a6c040d6070cef8552423e03c4b79fafc0dba6dd64736f6c63430008110033

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.