ETH Price: $3,110.37 (+5.42%)
Gas: 4 Gwei

Contract

0x661c70333AA1850CcDBAe82776Bb436A0fCfeEfB
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Value
Approve198785012024-05-15 22:55:112 days ago1715813711IN
0x661c7033...A0fCfeEfB
0 ETH0.000196364.21303478
Approve198537642024-05-12 11:52:595 days ago1715514779IN
0x661c7033...A0fCfeEfB
0 ETH0.000164833.54105837
Approve198462782024-05-11 10:45:116 days ago1715424311IN
0x661c7033...A0fCfeEfB
0 ETH0.000143824.92378823
Approve198453742024-05-11 7:43:116 days ago1715413391IN
0x661c7033...A0fCfeEfB
0 ETH0.000273885.91572186
Approve198453642024-05-11 7:40:596 days ago1715413259IN
0x661c7033...A0fCfeEfB
0 ETH0.000240485.19285004
Approve198389642024-05-10 10:13:357 days ago1715336015IN
0x661c7033...A0fCfeEfB
0 ETH0.000215574.65617042
Approve198389482024-05-10 10:10:117 days ago1715335811IN
0x661c7033...A0fCfeEfB
0 ETH0.000225624.87969871
Approve197762332024-05-01 15:39:5916 days ago1714577999IN
0x661c7033...A0fCfeEfB
0 ETH0.000421669.11714331
Approve197521382024-04-28 6:50:2319 days ago1714287023IN
0x661c7033...A0fCfeEfB
0 ETH0.000241975.1914746
Approve197514062024-04-28 4:23:1119 days ago1714278191IN
0x661c7033...A0fCfeEfB
0 ETH0.000215134.61570202
Approve197476932024-04-27 15:54:5920 days ago1714233299IN
0x661c7033...A0fCfeEfB
0 ETH0.000373868.02123309
Transfer197476732024-04-27 15:50:5920 days ago1714233059IN
0x661c7033...A0fCfeEfB
0 ETH0.000266458.89152361
Approve196968782024-04-20 13:19:2327 days ago1713619163IN
0x661c7033...A0fCfeEfB
0 ETH0.000372747.99719873
Approve196947552024-04-20 6:11:2327 days ago1713593483IN
0x661c7033...A0fCfeEfB
0 ETH0.000293016.28645168
Approve196915602024-04-19 19:27:3528 days ago1713554855IN
0x661c7033...A0fCfeEfB
0 ETH0.000461189.90733281
Approve196915432024-04-19 19:23:5928 days ago1713554639IN
0x661c7033...A0fCfeEfB
0 ETH0.000392528.42144796
Approve196915302024-04-19 19:21:2328 days ago1713554483IN
0x661c7033...A0fCfeEfB
0 ETH0.000399838.58927212
Approve196880722024-04-19 7:43:2328 days ago1713512603IN
0x661c7033...A0fCfeEfB
0 ETH0.0004862710.50053619
Approve196880402024-04-19 7:36:5928 days ago1713512219IN
0x661c7033...A0fCfeEfB
0 ETH0.000525111.35351623
Approve196857042024-04-18 23:45:2329 days ago1713483923IN
0x661c7033...A0fCfeEfB
0 ETH0.000355117.61875425
Approve196856772024-04-18 23:39:5929 days ago1713483599IN
0x661c7033...A0fCfeEfB
0 ETH0.000404668.68183318
Transfer From196767432024-04-17 17:39:4730 days ago1713375587IN
0x661c7033...A0fCfeEfB
0 ETH0.000979519.5494693
Approve196767332024-04-17 17:37:4730 days ago1713375467IN
0x661c7033...A0fCfeEfB
0 ETH0.0005490618.80471483
Approve196767102024-04-17 17:33:1130 days ago1713375191IN
0x661c7033...A0fCfeEfB
0 ETH0.0010551322.81968566
Approve196632472024-04-15 20:19:3532 days ago1713212375IN
0x661c7033...A0fCfeEfB
0 ETH0.0006270813.45383144
View all transactions

Latest 1 internal transaction

Advanced mode:
Parent Transaction Hash Block From To Value
194371712024-03-15 1:46:2364 days ago1710467183  Contract Creation0 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
EBTCToken

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
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";
    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 Security Audit

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"}]

6101406040523480156200001257600080fd5b506040516200170538038062001705833981016040819052620000359162000272565b62000040816200013d565b506001600160a01b0391821661010052166101205260408051808201825260048152636542544360e01b6020918201528151808301835260018152603160f81b908201527f02f659af6b042fdf36c3ab7e538ab380cb5cbbeeaff551a20156873878a94eaf60c08181527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660e08190524660a081815286517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8188015280880195909552606085019290925260808085019190915230848301528551808503909201825292909101909352825192909101919091209052620002bc565b6000546001600160a01b0316156200019c5760405162461bcd60e51b815260206004820152601b60248201527f417574683a20617574686f72697479206973206e6f6e2d7a65726f000000000060448201526064015b60405180910390fd5b600054600160a01b900460ff1615620002045760405162461bcd60e51b815260206004820152602360248201527f417574683a20617574686f7269747920616c726561647920696e697469616c696044820152621e995960ea1b606482015260840162000193565b600080546001600160a81b0319166001600160a01b038316908117600160a01b178255604051909130917fa3396fd7f6e0a21b50e5089d2da70d5ac0a3bbbd1f617a93f134b763899801989190a350565b80516001600160a01b03811681146200026d57600080fd5b919050565b6000806000606084860312156200028857600080fd5b620002938462000255565b9250620002a36020850162000255565b9150620002b36040850162000255565b90509250925092565b60805160a05160c05160e05161010051610120516113dd620003286000396000818161038401528181610b3f0152610db701526000818161017d01528181610b020152610de9015260006108f4015260006108cf015260006108540152600061087c01526113dd6000f3fe608060405234801561001057600080fd5b50600436106101735760003560e01c806370a08231116100de578063a9059cbb11610097578063d505accf11610071578063d505accf146103b7578063dd62ed3e146103ca578063e344803514610403578063f698da251461040b57600080fd5b8063a9059cbb1461036c578063b7f8cf9b1461037f578063bf7e214f146103a657600080fd5b806370a08231146102c25780637ecebe00146102eb57806395d89b411461031457806397bc1e1b146103345780639dc29fac14610346578063a457c2d71461035957600080fd5b8063313ce56711610130578063313ce567146102535780633644e51514610262578063395093511461026a57806340c10f191461027d57806342966c681461029257806354fd4d50146102a557600080fd5b806302f6567f1461017857806306fdde03146101bc578063095ea7b3146101e557806310ce43bd1461020857806318160ddd1461023857806323b872dd14610240575b600080fd5b61019f7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b6040805180820190915260048152636542544360e01b60208201525b6040516101b3919061117f565b6101f86101f33660046111e9565b610413565b60405190151581526020016101b3565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c95b6040519081526020016101b3565b60025461022a565b6101f861024e366004611213565b61042a565b604051601281526020016101b3565b61022a6104eb565b6101f86102783660046111e9565b6104fa565b61029061028b3660046111e9565b610536565b005b6102906102a036600461124f565b61054c565b6040805180820190915260018152603160f81b60208201526101d8565b61022a6102d0366004611268565b6001600160a01b031660009081526003602052604090205490565b61022a6102f9366004611268565b6001600160a01b031660009081526001602052604090205490565b6040805180820190915260048152634542544360e01b60208201526101d8565b600054600160a01b900460ff166101f8565b6102906103543660046111e9565b610561565b6101f86103673660046111e9565b610573565b6101f861037a3660046111e9565b61060c565b61019f7f000000000000000000000000000000000000000000000000000000000000000081565b6000546001600160a01b031661019f565b6102906103c536600461128a565b610622565b61022a6103d83660046112fd565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205490565b61022a61082a565b61022a610850565b6000610420338484610942565b5060015b92915050565b600061043583610a50565b610440848484610bf5565b6001600160a01b038416600090815260046020908152604080832033845290915290205460001981146104e057828110156104d35760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084015b60405180910390fd5b6104e08533858403610942565b506001949350505050565b60006104f5610850565b905090565b3360008181526004602090815260408083206001600160a01b03871684529091528120549091610420918590610531908690611346565b610942565b61053e610dac565b6105488282610eac565b5050565b610554610dac565b61055e3382610f9f565b50565b610569610dac565b6105488282610f9f565b3360009081526004602090815260408083206001600160a01b0386168452909152812054828110156105f55760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016104ca565b6106023385858403610942565b5060019392505050565b600061061783610a50565b610420338484610bf5565b4284101561066b5760405162461bcd60e51b8152602060048201526016602482015275454254433a206578706972656420646561646c696e6560501b60448201526064016104ca565b6000610675610850565b6001600160a01b038916600090815260016020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9928c928c928c929091906106c383611359565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810187905260e0016040516020818303038152906040528051906020012060405160200161073c92919061190160f01b81526002810192909252602282015260420190565b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff88169284019290925260608301869052608083018590529092509060019060a0016020604051602081039080840390855afa1580156107a7573d6000803e3d6000fd5b505050602060405103519050886001600160a01b0316816001600160a01b0316146108145760405162461bcd60e51b815260206004820152601760248201527f454254433a20696e76616c6964207369676e617475726500000000000000000060448201526064016104ca565b61081f898989610942565b505050505050505050565b3360009081526001602052604081208054829061084690611359565b9182905550919050565b60007f0000000000000000000000000000000000000000000000000000000000000000460361089e57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6001600160a01b0383166109985760405162461bcd60e51b815260206004820152601e60248201527f45425443546f6b656e3a207a65726f20617070726f7665206f776e657221000060448201526064016104ca565b6001600160a01b0382166109ee5760405162461bcd60e51b815260206004820181905260248201527f45425443546f6b656e3a207a65726f20617070726f7665207370656e6465722160448201526064016104ca565b6001600160a01b0383811660008181526004602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b03811615801590610a7157506001600160a01b0381163014155b610b005760405162461bcd60e51b815260206004820152605460248201527f454254433a2043616e6e6f74207472616e7366657220746f6b656e732064697260448201527f6563746c7920746f20746865204542544320746f6b656e20636f6e7472616374606482015273206f7220746865207a65726f206164647265737360601b608482015260a4016104ca565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b031614158015610b7457507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b031614155b61055e5760405162461bcd60e51b815260206004820152604660248201527f454254433a2043616e6e6f74207472616e7366657220746f6b656e732064697260448201527f6563746c7920746f20746865204364704d616e61676572206f7220426f72726f6064820152657765724f707360d01b608482015260a4016104ca565b6001600160a01b038316610c4b5760405162461bcd60e51b815260206004820152601760248201527f45425443546f6b656e3a207a65726f2073656e6465722100000000000000000060448201526064016104ca565b6001600160a01b038216610ca15760405162461bcd60e51b815260206004820152601a60248201527f45425443546f6b656e3a207a65726f20726563697069656e742100000000000060448201526064016104ca565b6001600160a01b03831660009081526003602052604090205481811015610d195760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016104ca565b6001600160a01b03808516600090815260036020526040808220858503905591851681522054610d4a908390611346565b6001600160a01b0380851660008181526003602052604090819020939093559151908616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90610d9e9086815260200190565b60405180910390a350505050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480610e0b5750336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016145b80610e275750610e27336000356001600160e01b0319166110e0565b610eaa5760405162461bcd60e51b815260206004820152604860248201527f454254433a2043616c6c6572206973206e65697468657220426f72726f77657260448201527f4f7065726174696f6e73206e6f72204364704d616e61676572206e6f722061756064820152671d1a1bdc9a5e995960c21b608482015260a4016104ca565b565b6001600160a01b038216610f0d5760405162461bcd60e51b815260206004820152602260248201527f45425443546f6b656e3a206d696e7420746f207a65726f20726563697069656e604482015261742160f01b60648201526084016104ca565b80600254610f1b9190611346565b6002556001600160a01b038216600090815260036020526040902054610f42908290611346565b6001600160a01b0383166000818152600360205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90610f939085815260200190565b60405180910390a35050565b6001600160a01b0382166110005760405162461bcd60e51b815260206004820152602260248201527f45425443546f6b656e3a206275726e2066726f6d207a65726f206163636f756e604482015261742160f01b60648201526084016104ca565b6001600160a01b038216600090815260036020526040902054818110156110745760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016104ca565b6001600160a01b0383166000908152600360205260409020828203905560025461109f908390611372565b6002556040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001610a43565b600080546001600160a01b03168015801590611177575060405163b700961360e01b81526001600160a01b0385811660048301523060248301526001600160e01b03198516604483015282169063b700961390606401602060405180830381865afa158015611153573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111779190611385565b949350505050565b600060208083528351808285015260005b818110156111ac57858101830151858201604001528201611190565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b03811681146111e457600080fd5b919050565b600080604083850312156111fc57600080fd5b611205836111cd565b946020939093013593505050565b60008060006060848603121561122857600080fd5b611231846111cd565b925061123f602085016111cd565b9150604084013590509250925092565b60006020828403121561126157600080fd5b5035919050565b60006020828403121561127a57600080fd5b611283826111cd565b9392505050565b600080600080600080600060e0888a0312156112a557600080fd5b6112ae886111cd565b96506112bc602089016111cd565b95506040880135945060608801359350608088013560ff811681146112e057600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561131057600080fd5b611319836111cd565b9150611327602084016111cd565b90509250929050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561042457610424611330565b60006001820161136b5761136b611330565b5060010190565b8181038181111561042457610424611330565b60006020828403121561139757600080fd5b8151801515811461128357600080fdfea26469706673582212204ab3c29f13decc78b01e2fcbf503dc701631084a674e94bdd7685bce950c493764736f6c63430008110033000000000000000000000000c4cbae499bb4ca41e78f52f07f5d98c375711774000000000000000000000000d366e016ae0677cdce93472e603b75051e022ad00000000000000000000000002a095d44831c26cfb6acb806a6531ae3ca32dbc1

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101735760003560e01c806370a08231116100de578063a9059cbb11610097578063d505accf11610071578063d505accf146103b7578063dd62ed3e146103ca578063e344803514610403578063f698da251461040b57600080fd5b8063a9059cbb1461036c578063b7f8cf9b1461037f578063bf7e214f146103a657600080fd5b806370a08231146102c25780637ecebe00146102eb57806395d89b411461031457806397bc1e1b146103345780639dc29fac14610346578063a457c2d71461035957600080fd5b8063313ce56711610130578063313ce567146102535780633644e51514610262578063395093511461026a57806340c10f191461027d57806342966c681461029257806354fd4d50146102a557600080fd5b806302f6567f1461017857806306fdde03146101bc578063095ea7b3146101e557806310ce43bd1461020857806318160ddd1461023857806323b872dd14610240575b600080fd5b61019f7f000000000000000000000000c4cbae499bb4ca41e78f52f07f5d98c37571177481565b6040516001600160a01b0390911681526020015b60405180910390f35b6040805180820190915260048152636542544360e01b60208201525b6040516101b3919061117f565b6101f86101f33660046111e9565b610413565b60405190151581526020016101b3565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c95b6040519081526020016101b3565b60025461022a565b6101f861024e366004611213565b61042a565b604051601281526020016101b3565b61022a6104eb565b6101f86102783660046111e9565b6104fa565b61029061028b3660046111e9565b610536565b005b6102906102a036600461124f565b61054c565b6040805180820190915260018152603160f81b60208201526101d8565b61022a6102d0366004611268565b6001600160a01b031660009081526003602052604090205490565b61022a6102f9366004611268565b6001600160a01b031660009081526001602052604090205490565b6040805180820190915260048152634542544360e01b60208201526101d8565b600054600160a01b900460ff166101f8565b6102906103543660046111e9565b610561565b6101f86103673660046111e9565b610573565b6101f861037a3660046111e9565b61060c565b61019f7f000000000000000000000000d366e016ae0677cdce93472e603b75051e022ad081565b6000546001600160a01b031661019f565b6102906103c536600461128a565b610622565b61022a6103d83660046112fd565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205490565b61022a61082a565b61022a610850565b6000610420338484610942565b5060015b92915050565b600061043583610a50565b610440848484610bf5565b6001600160a01b038416600090815260046020908152604080832033845290915290205460001981146104e057828110156104d35760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084015b60405180910390fd5b6104e08533858403610942565b506001949350505050565b60006104f5610850565b905090565b3360008181526004602090815260408083206001600160a01b03871684529091528120549091610420918590610531908690611346565b610942565b61053e610dac565b6105488282610eac565b5050565b610554610dac565b61055e3382610f9f565b50565b610569610dac565b6105488282610f9f565b3360009081526004602090815260408083206001600160a01b0386168452909152812054828110156105f55760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016104ca565b6106023385858403610942565b5060019392505050565b600061061783610a50565b610420338484610bf5565b4284101561066b5760405162461bcd60e51b8152602060048201526016602482015275454254433a206578706972656420646561646c696e6560501b60448201526064016104ca565b6000610675610850565b6001600160a01b038916600090815260016020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9928c928c928c929091906106c383611359565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810187905260e0016040516020818303038152906040528051906020012060405160200161073c92919061190160f01b81526002810192909252602282015260420190565b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff88169284019290925260608301869052608083018590529092509060019060a0016020604051602081039080840390855afa1580156107a7573d6000803e3d6000fd5b505050602060405103519050886001600160a01b0316816001600160a01b0316146108145760405162461bcd60e51b815260206004820152601760248201527f454254433a20696e76616c6964207369676e617475726500000000000000000060448201526064016104ca565b61081f898989610942565b505050505050505050565b3360009081526001602052604081208054829061084690611359565b9182905550919050565b60007f0000000000000000000000000000000000000000000000000000000000000001460361089e57507f577053ccb0bebc14d391fe0a7e7b9013a18ad4d0ae12814c3b50c464b9a28b9790565b50604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6020808301919091527f02f659af6b042fdf36c3ab7e538ab380cb5cbbeeaff551a20156873878a94eaf828401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6001600160a01b0383166109985760405162461bcd60e51b815260206004820152601e60248201527f45425443546f6b656e3a207a65726f20617070726f7665206f776e657221000060448201526064016104ca565b6001600160a01b0382166109ee5760405162461bcd60e51b815260206004820181905260248201527f45425443546f6b656e3a207a65726f20617070726f7665207370656e6465722160448201526064016104ca565b6001600160a01b0383811660008181526004602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b03811615801590610a7157506001600160a01b0381163014155b610b005760405162461bcd60e51b815260206004820152605460248201527f454254433a2043616e6e6f74207472616e7366657220746f6b656e732064697260448201527f6563746c7920746f20746865204542544320746f6b656e20636f6e7472616374606482015273206f7220746865207a65726f206164647265737360601b608482015260a4016104ca565b7f000000000000000000000000c4cbae499bb4ca41e78f52f07f5d98c3757117746001600160a01b0316816001600160a01b031614158015610b7457507f000000000000000000000000d366e016ae0677cdce93472e603b75051e022ad06001600160a01b0316816001600160a01b031614155b61055e5760405162461bcd60e51b815260206004820152604660248201527f454254433a2043616e6e6f74207472616e7366657220746f6b656e732064697260448201527f6563746c7920746f20746865204364704d616e61676572206f7220426f72726f6064820152657765724f707360d01b608482015260a4016104ca565b6001600160a01b038316610c4b5760405162461bcd60e51b815260206004820152601760248201527f45425443546f6b656e3a207a65726f2073656e6465722100000000000000000060448201526064016104ca565b6001600160a01b038216610ca15760405162461bcd60e51b815260206004820152601a60248201527f45425443546f6b656e3a207a65726f20726563697069656e742100000000000060448201526064016104ca565b6001600160a01b03831660009081526003602052604090205481811015610d195760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016104ca565b6001600160a01b03808516600090815260036020526040808220858503905591851681522054610d4a908390611346565b6001600160a01b0380851660008181526003602052604090819020939093559151908616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90610d9e9086815260200190565b60405180910390a350505050565b336001600160a01b037f000000000000000000000000d366e016ae0677cdce93472e603b75051e022ad0161480610e0b5750336001600160a01b037f000000000000000000000000c4cbae499bb4ca41e78f52f07f5d98c37571177416145b80610e275750610e27336000356001600160e01b0319166110e0565b610eaa5760405162461bcd60e51b815260206004820152604860248201527f454254433a2043616c6c6572206973206e65697468657220426f72726f77657260448201527f4f7065726174696f6e73206e6f72204364704d616e61676572206e6f722061756064820152671d1a1bdc9a5e995960c21b608482015260a4016104ca565b565b6001600160a01b038216610f0d5760405162461bcd60e51b815260206004820152602260248201527f45425443546f6b656e3a206d696e7420746f207a65726f20726563697069656e604482015261742160f01b60648201526084016104ca565b80600254610f1b9190611346565b6002556001600160a01b038216600090815260036020526040902054610f42908290611346565b6001600160a01b0383166000818152600360205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90610f939085815260200190565b60405180910390a35050565b6001600160a01b0382166110005760405162461bcd60e51b815260206004820152602260248201527f45425443546f6b656e3a206275726e2066726f6d207a65726f206163636f756e604482015261742160f01b60648201526084016104ca565b6001600160a01b038216600090815260036020526040902054818110156110745760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016104ca565b6001600160a01b0383166000908152600360205260409020828203905560025461109f908390611372565b6002556040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001610a43565b600080546001600160a01b03168015801590611177575060405163b700961360e01b81526001600160a01b0385811660048301523060248301526001600160e01b03198516604483015282169063b700961390606401602060405180830381865afa158015611153573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111779190611385565b949350505050565b600060208083528351808285015260005b818110156111ac57858101830151858201604001528201611190565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b03811681146111e457600080fd5b919050565b600080604083850312156111fc57600080fd5b611205836111cd565b946020939093013593505050565b60008060006060848603121561122857600080fd5b611231846111cd565b925061123f602085016111cd565b9150604084013590509250925092565b60006020828403121561126157600080fd5b5035919050565b60006020828403121561127a57600080fd5b611283826111cd565b9392505050565b600080600080600080600060e0888a0312156112a557600080fd5b6112ae886111cd565b96506112bc602089016111cd565b95506040880135945060608801359350608088013560ff811681146112e057600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561131057600080fd5b611319836111cd565b9150611327602084016111cd565b90509250929050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561042457610424611330565b60006001820161136b5761136b611330565b5060010190565b8181038181111561042457610424611330565b60006020828403121561139757600080fd5b8151801515811461128357600080fdfea26469706673582212204ab3c29f13decc78b01e2fcbf503dc701631084a674e94bdd7685bce950c493764736f6c63430008110033

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

000000000000000000000000c4cbae499bb4ca41e78f52f07f5d98c375711774000000000000000000000000d366e016ae0677cdce93472e603b75051e022ad00000000000000000000000002a095d44831c26cfb6acb806a6531ae3ca32dbc1

-----Decoded View---------------
Arg [0] : _cdpManagerAddress (address): 0xc4cbaE499bb4Ca41E78f52F07f5d98c375711774
Arg [1] : _borrowerOperationsAddress (address): 0xd366e016Ae0677CdCE93472e603b75051E022AD0
Arg [2] : _authorityAddress (address): 0x2A095d44831C26cFB6aCb806A6531AE3CA32DBc1

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000c4cbae499bb4ca41e78f52f07f5d98c375711774
Arg [1] : 000000000000000000000000d366e016ae0677cdce93472e603b75051e022ad0
Arg [2] : 0000000000000000000000002a095d44831c26cfb6acb806a6531ae3ca32dbc1


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ 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.