ETH Price: $2,438.10 (+5.51%)

Token

brETH Token (brETH)
 

Overview

Max Total Supply

7.579902650863118179 brETH

Holders

5

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
0.0997 brETH

Value
$0.00
0x4CB939550280914C2378BB91229145b44284E874
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
brETHVault

Compiler Version
v0.8.24+commit.e11b9ed9

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2024-03-07
*/

// File: @openzeppelin/contracts/security/ReentrancyGuard.sol


// OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        // On the first call to nonReentrant, _status will be _NOT_ENTERED
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;
    }

    function _nonReentrantAfter() private {
        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
     * `nonReentrant` function in the call stack.
     */
    function _reentrancyGuardEntered() internal view returns (bool) {
        return _status == _ENTERED;
    }
}

// File: @openzeppelin/contracts/interfaces/draft-IERC6093.sol


// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC6093.sol)
pragma solidity ^0.8.20;

/**
 * @dev Standard ERC20 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC20 tokens.
 */
interface IERC20Errors {
    /**
     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param balance Current balance for the interacting account.
     * @param needed Minimum amount required to perform a transfer.
     */
    error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC20InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC20InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers.
     * @param spender Address that may be allowed to operate on tokens without being their owner.
     * @param allowance Amount of tokens a `spender` is allowed to operate with.
     * @param needed Minimum amount required to perform a transfer.
     */
    error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC20InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `spender` to be approved. Used in approvals.
     * @param spender Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC20InvalidSpender(address spender);
}

/**
 * @dev Standard ERC721 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC721 tokens.
 */
interface IERC721Errors {
    /**
     * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in EIP-20.
     * Used in balance queries.
     * @param owner Address of the current owner of a token.
     */
    error ERC721InvalidOwner(address owner);

    /**
     * @dev Indicates a `tokenId` whose `owner` is the zero address.
     * @param tokenId Identifier number of a token.
     */
    error ERC721NonexistentToken(uint256 tokenId);

    /**
     * @dev Indicates an error related to the ownership over a particular token. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param tokenId Identifier number of a token.
     * @param owner Address of the current owner of a token.
     */
    error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC721InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC721InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `operator`’s approval. Used in transfers.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     * @param tokenId Identifier number of a token.
     */
    error ERC721InsufficientApproval(address operator, uint256 tokenId);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC721InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `operator` to be approved. Used in approvals.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC721InvalidOperator(address operator);
}

/**
 * @dev Standard ERC1155 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC1155 tokens.
 */
interface IERC1155Errors {
    /**
     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param balance Current balance for the interacting account.
     * @param needed Minimum amount required to perform a transfer.
     * @param tokenId Identifier number of a token.
     */
    error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC1155InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC1155InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `operator`’s approval. Used in transfers.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     * @param owner Address of the current owner of a token.
     */
    error ERC1155MissingApprovalForAll(address operator, address owner);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC1155InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `operator` to be approved. Used in approvals.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC1155InvalidOperator(address operator);

    /**
     * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.
     * Used in batch transfers.
     * @param idsLength Length of the array of token identifiers
     * @param valuesLength Length of the array of token amounts
     */
    error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);
}

// File: @openzeppelin/contracts/utils/Context.sol


// OpenZeppelin Contracts (last updated v5.0.0) (utils/Context.sol)

pragma solidity ^0.8.20;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

// File: @openzeppelin/contracts/access/Ownable.sol


// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)

pragma solidity ^0.8.20;


/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * The initial owner is set to the address provided by the deployer. This can
 * later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    /**
     * @dev The caller account is not authorized to perform an operation.
     */
    error OwnableUnauthorizedAccount(address account);

    /**
     * @dev The owner is not a valid owner account. (eg. `address(0)`)
     */
    error OwnableInvalidOwner(address owner);

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

    /**
     * @dev Initializes the contract setting the address provided by the deployer as the initial owner.
     */
    constructor(address initialOwner) {
        if (initialOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(initialOwner);
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        if (owner() != _msgSender()) {
            revert OwnableUnauthorizedAccount(_msgSender());
        }
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby disabling any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        if (newOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol


// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.20;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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

    /**
     * @dev Returns the value of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the value of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves a `value` amount of tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 value) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets a `value` amount of tokens 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 value) external returns (bool);

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to` using the
     * allowance mechanism. `value` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address from, address to, uint256 value) external returns (bool);
}

// File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol


// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.20;


/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

// File: @openzeppelin/contracts/token/ERC20/ERC20.sol


// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.20;





/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * The default value of {decimals} is 18. To change this, you should override
 * this function so it returns a different value.
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 */
abstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors {
    mapping(address account => uint256) private _balances;

    mapping(address account => mapping(address spender => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the default value returned by this function, unless
     * it's overridden.
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `value`.
     */
    function transfer(address to, uint256 value) public virtual returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, value);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `value` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 value) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, value);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `value`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `value`.
     */
    function transferFrom(address from, address to, uint256 value) public virtual returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, value);
        _transfer(from, to, value);
        return true;
    }

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead.
     */
    function _transfer(address from, address to, uint256 value) internal {
        if (from == address(0)) {
            revert ERC20InvalidSender(address(0));
        }
        if (to == address(0)) {
            revert ERC20InvalidReceiver(address(0));
        }
        _update(from, to, value);
    }

    /**
     * @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from`
     * (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding
     * this function.
     *
     * Emits a {Transfer} event.
     */
    function _update(address from, address to, uint256 value) internal virtual {
        if (from == address(0)) {
            // Overflow check required: The rest of the code assumes that totalSupply never overflows
            _totalSupply += value;
        } else {
            uint256 fromBalance = _balances[from];
            if (fromBalance < value) {
                revert ERC20InsufficientBalance(from, fromBalance, value);
            }
            unchecked {
                // Overflow not possible: value <= fromBalance <= totalSupply.
                _balances[from] = fromBalance - value;
            }
        }

        if (to == address(0)) {
            unchecked {
                // Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply.
                _totalSupply -= value;
            }
        } else {
            unchecked {
                // Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256.
                _balances[to] += value;
            }
        }

        emit Transfer(from, to, value);
    }

    /**
     * @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0).
     * Relies on the `_update` mechanism
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead.
     */
    function _mint(address account, uint256 value) internal {
        if (account == address(0)) {
            revert ERC20InvalidReceiver(address(0));
        }
        _update(address(0), account, value);
    }

    /**
     * @dev Destroys a `value` amount of tokens from `account`, lowering the total supply.
     * Relies on the `_update` mechanism.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead
     */
    function _burn(address account, uint256 value) internal {
        if (account == address(0)) {
            revert ERC20InvalidSender(address(0));
        }
        _update(account, address(0), value);
    }

    /**
     * @dev Sets `value` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     *
     * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.
     */
    function _approve(address owner, address spender, uint256 value) internal {
        _approve(owner, spender, value, true);
    }

    /**
     * @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event.
     *
     * By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by
     * `_spendAllowance` during the `transferFrom` operation set the flag to false. This saves gas by not emitting any
     * `Approval` event during `transferFrom` operations.
     *
     * Anyone who wishes to continue emitting `Approval` events on the`transferFrom` operation can force the flag to
     * true using the following override:
     * ```
     * function _approve(address owner, address spender, uint256 value, bool) internal virtual override {
     *     super._approve(owner, spender, value, true);
     * }
     * ```
     *
     * Requirements are the same as {_approve}.
     */
    function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual {
        if (owner == address(0)) {
            revert ERC20InvalidApprover(address(0));
        }
        if (spender == address(0)) {
            revert ERC20InvalidSpender(address(0));
        }
        _allowances[owner][spender] = value;
        if (emitEvent) {
            emit Approval(owner, spender, value);
        }
    }

    /**
     * @dev Updates `owner` s allowance for `spender` based on spent `value`.
     *
     * Does not update the allowance value in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Does not emit an {Approval} event.
     */
    function _spendAllowance(address owner, address spender, uint256 value) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            if (currentAllowance < value) {
                revert ERC20InsufficientAllowance(spender, currentAllowance, value);
            }
            unchecked {
                _approve(owner, spender, currentAllowance - value, false);
            }
        }
    }
}

// File: breth.sol


pragma solidity ^0.8.0;





interface ILido {
    function submit(address _referral) external payable returns (uint256);
}

interface IstETH is IERC20 {
    // Add any specific functions you might need for stETH, if any, besides what's in IERC20
}


contract brETHVault is ERC20, Ownable(msg.sender), ReentrancyGuard {
    ILido public lido;
    IstETH public stETH; // Add a state variable for the stETH token contract
    address public buybackWallet;
    uint256 public mintFeePercent = 30; // Basis points
    uint256 public redeemFeePercent = 70; // Basis points
    uint256 public totalFee;

    constructor(address _lidoAddress, address _stETHAddress, address _buybackWallet) ERC20("brETH Token", "brETH") {
        lido = ILido(_lidoAddress);
        stETH = IstETH(_stETHAddress); // Initialize the stETH token contract
        buybackWallet = _buybackWallet;
    }

    function mint() external payable nonReentrant{
        require(msg.value > 0, "Must send ETH to mint brETH");
        uint256 fee = calculateFee(msg.value, mintFeePercent);
        uint256 amountAfterFee = msg.value - fee;

        totalFee += fee;

        lido.submit{value: msg.value}(owner());
        stETH.transfer(buybackWallet, fee);
        _mint(msg.sender, amountAfterFee);
        
    }

    function redeem(uint256 brETHAmount) external nonReentrant {
        require(balanceOf(msg.sender) >= brETHAmount, "Insufficient brETH balance");
        uint256 profits = checkProtocolProfits();
        require(profits >= 0, "slash event occured, wait for sufficient supply");
        uint256 fee = calculateFee(brETHAmount, redeemFeePercent);
        uint256 amountAfterFee = brETHAmount - fee;
        totalFee += fee;
        _burn(msg.sender, brETHAmount);
        require(stETH.transfer(msg.sender, amountAfterFee), "stETH transfer failed");
        if (fee > 0) {
            stETH.transfer(buybackWallet, fee); // Consider how you handle the fee in stETH context
        }
    }

    function checkProtocolProfits() public view returns (uint256) {
        uint256 totalStETH = stETH.balanceOf(address(this)); // This should be the balance of stETH instead
        uint256 totalBrETHSupply = totalSupply();
        if (totalStETH > totalBrETHSupply) {
            return totalStETH - totalBrETHSupply;
        }
        return 0;
    }

    function claimProtocolProfits() external onlyOwner {
        uint256 profits = checkProtocolProfits();
        require(profits > 0, "No profits to claim");
        totalFee += profits;
        stETH.transfer(msg.sender, profits); 
    }

    function calculateFee(uint256 amount, uint256 feePercent) private pure returns (uint256) {
        return amount * feePercent / 10000; // Adjust calculation for basis points
    }

    function setMintFeePercent(uint256 _mintFeePercent) external onlyOwner {
        require(_mintFeePercent >= 0 && _mintFeePercent <= 1000, "Fee must be between 0% and 10%");
        mintFeePercent = _mintFeePercent;
    }

    function setRedeemFeePercent(uint256 _redeemFeePercent) external onlyOwner {
        require(_redeemFeePercent >= 0 && _redeemFeePercent <= 1000, "Fee must be between 0% and 10%");
        redeemFeePercent = _redeemFeePercent;
    }

    function setBuybackWallet(address _buybackWallet) external onlyOwner {
        buybackWallet = _buybackWallet;
    }

    // Fallback function to accept ETH
    receive() external payable {
        revert("Send ETH through mint function");
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_lidoAddress","type":"address"},{"internalType":"address","name":"_stETHAddress","type":"address"},{"internalType":"address","name":"_buybackWallet","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"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":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"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":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buybackWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"checkProtocolProfits","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimProtocolProfits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lido","outputs":[{"internalType":"contract ILido","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintFeePercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"brETHAmount","type":"uint256"}],"name":"redeem","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"redeemFeePercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_buybackWallet","type":"address"}],"name":"setBuybackWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintFeePercent","type":"uint256"}],"name":"setMintFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_redeemFeePercent","type":"uint256"}],"name":"setRedeemFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stETH","outputs":[{"internalType":"contract IstETH","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052601e600a556046600b553480156200001a575f80fd5b5060405162002a3b38038062002a3b833981810160405281019062000040919062000351565b336040518060400160405280600b81526020017f627245544820546f6b656e0000000000000000000000000000000000000000008152506040518060400160405280600581526020017f62724554480000000000000000000000000000000000000000000000000000008152508160039081620000be91906200060e565b508060049081620000d091906200060e565b5050505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160362000146575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016200013d919062000703565b60405180910390fd5b62000157816200022960201b60201c565b5060016006819055508260075f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508160085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060095f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050506200071e565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6200031b82620002f0565b9050919050565b6200032d816200030f565b811462000338575f80fd5b50565b5f815190506200034b8162000322565b92915050565b5f805f606084860312156200036b576200036a620002ec565b5b5f6200037a868287016200033b565b93505060206200038d868287016200033b565b9250506040620003a0868287016200033b565b9150509250925092565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806200042657607f821691505b6020821081036200043c576200043b620003e1565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302620004a07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000463565b620004ac868362000463565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f620004f6620004f0620004ea84620004c4565b620004cd565b620004c4565b9050919050565b5f819050919050565b6200051183620004d6565b620005296200052082620004fd565b8484546200046f565b825550505050565b5f90565b6200053f62000531565b6200054c81848462000506565b505050565b5b818110156200057357620005675f8262000535565b60018101905062000552565b5050565b601f821115620005c2576200058c8162000442565b620005978462000454565b81016020851015620005a7578190505b620005bf620005b68562000454565b83018262000551565b50505b505050565b5f82821c905092915050565b5f620005e45f1984600802620005c7565b1980831691505092915050565b5f620005fe8383620005d3565b9150826002028217905092915050565b6200061982620003aa565b67ffffffffffffffff811115620006355762000634620003b4565b5b6200064182546200040e565b6200064e82828562000577565b5f60209050601f83116001811462000684575f84156200066f578287015190505b6200067b8582620005f1565b865550620006ea565b601f198416620006948662000442565b5f5b82811015620006bd5784890151825560018201915060208501945060208101905062000696565b86831015620006dd5784890151620006d9601f891682620005d3565b8355505b6001600288020188555050505b505050505050565b620006fd816200030f565b82525050565b5f602082019050620007185f830184620006f2565b92915050565b61230f806200072c5f395ff3fe608060405260043610610169575f3560e01c8063313ce567116100d0578063a9059cbb11610089578063db006a7511610063578063db006a7514610519578063dd62ed3e14610541578063deab8aea1461057d578063f2fde38b146105a7576101a9565b8063a9059cbb1461049d578063c1d25ad4146104d9578063c1fe3e48146104ef576101a9565b8063313ce567146103a557806370a08231146103cf578063715018a61461040b578063756b2bdb146104215780638da5cb5b1461044957806395d89b4114610473576101a9565b80631d0adc07116101225780631d0adc07146102995780631df4ccfc146102c15780631fa555cd146102eb57806323509a2d1461031557806323b872dd1461033f5780632c2ee9c31461037b576101a9565b80630541d0b0146101ad57806306fdde03146101d7578063095ea7b3146102015780630d22a0b91461023d5780631249c58b1461026557806318160ddd1461026f576101a9565b366101a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101a09061198e565b60405180910390fd5b5f80fd5b3480156101b8575f80fd5b506101c16105cf565b6040516101ce91906119c4565b60405180910390f35b3480156101e2575f80fd5b506101eb6105d5565b6040516101f89190611a57565b60405180910390f35b34801561020c575f80fd5b5061022760048036038101906102229190611aff565b610665565b6040516102349190611b57565b60405180910390f35b348015610248575f80fd5b50610263600480360381019061025e9190611b70565b610687565b005b61026d6106ea565b005b34801561027a575f80fd5b506102836108e2565b60405161029091906119c4565b60405180910390f35b3480156102a4575f80fd5b506102bf60048036038101906102ba9190611b9b565b6108eb565b005b3480156102cc575f80fd5b506102d5610936565b6040516102e291906119c4565b60405180910390f35b3480156102f6575f80fd5b506102ff61093c565b60405161030c91906119c4565b60405180910390f35b348015610320575f80fd5b50610329610a0a565b6040516103369190611c21565b60405180910390f35b34801561034a575f80fd5b5061036560048036038101906103609190611c3a565b610a2f565b6040516103729190611b57565b60405180910390f35b348015610386575f80fd5b5061038f610a5d565b60405161039c91906119c4565b60405180910390f35b3480156103b0575f80fd5b506103b9610a63565b6040516103c69190611ca5565b60405180910390f35b3480156103da575f80fd5b506103f560048036038101906103f09190611b9b565b610a6b565b60405161040291906119c4565b60405180910390f35b348015610416575f80fd5b5061041f610ab0565b005b34801561042c575f80fd5b5061044760048036038101906104429190611b70565b610ac3565b005b348015610454575f80fd5b5061045d610b26565b60405161046a9190611ccd565b60405180910390f35b34801561047e575f80fd5b50610487610b4e565b6040516104949190611a57565b60405180910390f35b3480156104a8575f80fd5b506104c360048036038101906104be9190611aff565b610bde565b6040516104d09190611b57565b60405180910390f35b3480156104e4575f80fd5b506104ed610c00565b005b3480156104fa575f80fd5b50610503610d0d565b6040516105109190611d06565b60405180910390f35b348015610524575f80fd5b5061053f600480360381019061053a9190611b70565b610d32565b005b34801561054c575f80fd5b5061056760048036038101906105629190611d1f565b610fc3565b60405161057491906119c4565b60405180910390f35b348015610588575f80fd5b50610591611045565b60405161059e9190611ccd565b60405180910390f35b3480156105b2575f80fd5b506105cd60048036038101906105c89190611b9b565b61106a565b005b600a5481565b6060600380546105e490611d8a565b80601f016020809104026020016040519081016040528092919081815260200182805461061090611d8a565b801561065b5780601f106106325761010080835404028352916020019161065b565b820191905f5260205f20905b81548152906001019060200180831161063e57829003601f168201915b5050505050905090565b5f8061066f6110ee565b905061067c8185856110f5565b600191505092915050565b61068f611107565b5f81101580156106a157506103e88111155b6106e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106d790611e04565b60405180910390fd5b80600a8190555050565b6106f261118e565b5f3411610734576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161072b90611e6c565b60405180910390fd5b5f61074134600a546111dd565b90505f81346107509190611eb7565b905081600c5f8282546107639190611eea565b9250508190555060075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a1903eab346107b0610b26565b6040518363ffffffff1660e01b81526004016107cc9190611ccd565b60206040518083038185885af11580156107e8573d5f803e3d5ffd5b50505050506040513d601f19601f8201168201806040525081019061080d9190611f31565b5060085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b815260040161088b929190611f5c565b6020604051808303815f875af11580156108a7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108cb9190611fad565b506108d633826111ff565b50506108e061127e565b565b5f600254905090565b6108f3611107565b8060095f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600c5481565b5f8060085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016109989190611ccd565b602060405180830381865afa1580156109b3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109d79190611f31565b90505f6109e26108e2565b905080821115610a015780826109f89190611eb7565b92505050610a07565b5f925050505b90565b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f80610a396110ee565b9050610a46858285611288565b610a5185858561131a565b60019150509392505050565b600b5481565b5f6012905090565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b610ab8611107565b610ac15f61140a565b565b610acb611107565b5f8110158015610add57506103e88111155b610b1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1390611e04565b60405180910390fd5b80600b8190555050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054610b5d90611d8a565b80601f0160208091040260200160405190810160405280929190818152602001828054610b8990611d8a565b8015610bd45780601f10610bab57610100808354040283529160200191610bd4565b820191905f5260205f20905b815481529060010190602001808311610bb757829003601f168201915b5050505050905090565b5f80610be86110ee565b9050610bf581858561131a565b600191505092915050565b610c08611107565b5f610c1161093c565b90505f8111610c55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4c90612022565b60405180910390fd5b80600c5f828254610c669190611eea565b9250508190555060085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401610cc9929190611f5c565b6020604051808303815f875af1158015610ce5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d099190611fad565b5050565b60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610d3a61118e565b80610d4433610a6b565b1015610d85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7c9061208a565b60405180910390fd5b5f610d8e61093c565b90505f811015610dd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dca90612118565b60405180910390fd5b5f610de083600b546111dd565b90505f8184610def9190611eb7565b905081600c5f828254610e029190611eea565b92505081905550610e1333856114cd565b60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401610e6f929190611f5c565b6020604051808303815f875af1158015610e8b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610eaf9190611fad565b610eee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee590612180565b60405180910390fd5b5f821115610fb55760085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401610f73929190611f5c565b6020604051808303815f875af1158015610f8f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fb39190611fad565b505b505050610fc061127e565b50565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611072611107565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036110e2575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016110d99190611ccd565b60405180910390fd5b6110eb8161140a565b50565b5f33905090565b611102838383600161154c565b505050565b61110f6110ee565b73ffffffffffffffffffffffffffffffffffffffff1661112d610b26565b73ffffffffffffffffffffffffffffffffffffffff161461118c576111506110ee565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016111839190611ccd565b60405180910390fd5b565b6002600654036111d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ca906121e8565b60405180910390fd5b6002600681905550565b5f61271082846111ed9190612206565b6111f79190612274565b905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361126f575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016112669190611ccd565b60405180910390fd5b61127a5f838361171b565b5050565b6001600681905550565b5f6112938484610fc3565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146113145781811015611305578281836040517ffb8f41b20000000000000000000000000000000000000000000000000000000081526004016112fc939291906122a4565b60405180910390fd5b61131384848484035f61154c565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361138a575f6040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016113819190611ccd565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036113fa575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016113f19190611ccd565b60405180910390fd5b61140583838361171b565b505050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361153d575f6040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016115349190611ccd565b60405180910390fd5b611548825f8361171b565b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036115bc575f6040517fe602df050000000000000000000000000000000000000000000000000000000081526004016115b39190611ccd565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361162c575f6040517f94280d620000000000000000000000000000000000000000000000000000000081526004016116239190611ccd565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508015611715578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161170c91906119c4565b60405180910390a35b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361176b578060025f82825461175f9190611eea565b92505081905550611839565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050818110156117f4578381836040517fe450d38c0000000000000000000000000000000000000000000000000000000081526004016117eb939291906122a4565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611880578060025f82825403925050819055506118ca565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161192791906119c4565b60405180910390a3505050565b5f82825260208201905092915050565b7f53656e6420455448207468726f756768206d696e742066756e6374696f6e00005f82015250565b5f611978601e83611934565b915061198382611944565b602082019050919050565b5f6020820190508181035f8301526119a58161196c565b9050919050565b5f819050919050565b6119be816119ac565b82525050565b5f6020820190506119d75f8301846119b5565b92915050565b5f81519050919050565b5f5b83811015611a045780820151818401526020810190506119e9565b5f8484015250505050565b5f601f19601f8301169050919050565b5f611a29826119dd565b611a338185611934565b9350611a438185602086016119e7565b611a4c81611a0f565b840191505092915050565b5f6020820190508181035f830152611a6f8184611a1f565b905092915050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f611aa482611a7b565b9050919050565b611ab481611a9a565b8114611abe575f80fd5b50565b5f81359050611acf81611aab565b92915050565b611ade816119ac565b8114611ae8575f80fd5b50565b5f81359050611af981611ad5565b92915050565b5f8060408385031215611b1557611b14611a77565b5b5f611b2285828601611ac1565b9250506020611b3385828601611aeb565b9150509250929050565b5f8115159050919050565b611b5181611b3d565b82525050565b5f602082019050611b6a5f830184611b48565b92915050565b5f60208284031215611b8557611b84611a77565b5b5f611b9284828501611aeb565b91505092915050565b5f60208284031215611bb057611baf611a77565b5b5f611bbd84828501611ac1565b91505092915050565b5f819050919050565b5f611be9611be4611bdf84611a7b565b611bc6565b611a7b565b9050919050565b5f611bfa82611bcf565b9050919050565b5f611c0b82611bf0565b9050919050565b611c1b81611c01565b82525050565b5f602082019050611c345f830184611c12565b92915050565b5f805f60608486031215611c5157611c50611a77565b5b5f611c5e86828701611ac1565b9350506020611c6f86828701611ac1565b9250506040611c8086828701611aeb565b9150509250925092565b5f60ff82169050919050565b611c9f81611c8a565b82525050565b5f602082019050611cb85f830184611c96565b92915050565b611cc781611a9a565b82525050565b5f602082019050611ce05f830184611cbe565b92915050565b5f611cf082611bf0565b9050919050565b611d0081611ce6565b82525050565b5f602082019050611d195f830184611cf7565b92915050565b5f8060408385031215611d3557611d34611a77565b5b5f611d4285828601611ac1565b9250506020611d5385828601611ac1565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680611da157607f821691505b602082108103611db457611db3611d5d565b5b50919050565b7f466565206d757374206265206265747765656e20302520616e642031302500005f82015250565b5f611dee601e83611934565b9150611df982611dba565b602082019050919050565b5f6020820190508181035f830152611e1b81611de2565b9050919050565b7f4d7573742073656e642045544820746f206d696e7420627245544800000000005f82015250565b5f611e56601b83611934565b9150611e6182611e22565b602082019050919050565b5f6020820190508181035f830152611e8381611e4a565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611ec1826119ac565b9150611ecc836119ac565b9250828203905081811115611ee457611ee3611e8a565b5b92915050565b5f611ef4826119ac565b9150611eff836119ac565b9250828201905080821115611f1757611f16611e8a565b5b92915050565b5f81519050611f2b81611ad5565b92915050565b5f60208284031215611f4657611f45611a77565b5b5f611f5384828501611f1d565b91505092915050565b5f604082019050611f6f5f830185611cbe565b611f7c60208301846119b5565b9392505050565b611f8c81611b3d565b8114611f96575f80fd5b50565b5f81519050611fa781611f83565b92915050565b5f60208284031215611fc257611fc1611a77565b5b5f611fcf84828501611f99565b91505092915050565b7f4e6f2070726f6669747320746f20636c61696d000000000000000000000000005f82015250565b5f61200c601383611934565b915061201782611fd8565b602082019050919050565b5f6020820190508181035f83015261203981612000565b9050919050565b7f496e73756666696369656e742062724554482062616c616e63650000000000005f82015250565b5f612074601a83611934565b915061207f82612040565b602082019050919050565b5f6020820190508181035f8301526120a181612068565b9050919050565b7f736c617368206576656e74206f6363757265642c207761697420666f722073755f8201527f6666696369656e7420737570706c790000000000000000000000000000000000602082015250565b5f612102602f83611934565b915061210d826120a8565b604082019050919050565b5f6020820190508181035f83015261212f816120f6565b9050919050565b7f7374455448207472616e73666572206661696c656400000000000000000000005f82015250565b5f61216a601583611934565b915061217582612136565b602082019050919050565b5f6020820190508181035f8301526121978161215e565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c005f82015250565b5f6121d2601f83611934565b91506121dd8261219e565b602082019050919050565b5f6020820190508181035f8301526121ff816121c6565b9050919050565b5f612210826119ac565b915061221b836119ac565b9250828202612229816119ac565b915082820484148315176122405761223f611e8a565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61227e826119ac565b9150612289836119ac565b92508261229957612298612247565b5b828204905092915050565b5f6060820190506122b75f830186611cbe565b6122c460208301856119b5565b6122d160408301846119b5565b94935050505056fea2646970667358221220f2d4e14541a021c871c87ddb927ed03c34c95ad0f89731a6dbfc47e041ff1aac64736f6c63430008180033000000000000000000000000ae7ab96520de3a18e5e111b5eaab095312d7fe84000000000000000000000000ae7ab96520de3a18e5e111b5eaab095312d7fe84000000000000000000000000ee4daac843bc54a23c80f5176882e7eeacde0371

Deployed Bytecode

0x608060405260043610610169575f3560e01c8063313ce567116100d0578063a9059cbb11610089578063db006a7511610063578063db006a7514610519578063dd62ed3e14610541578063deab8aea1461057d578063f2fde38b146105a7576101a9565b8063a9059cbb1461049d578063c1d25ad4146104d9578063c1fe3e48146104ef576101a9565b8063313ce567146103a557806370a08231146103cf578063715018a61461040b578063756b2bdb146104215780638da5cb5b1461044957806395d89b4114610473576101a9565b80631d0adc07116101225780631d0adc07146102995780631df4ccfc146102c15780631fa555cd146102eb57806323509a2d1461031557806323b872dd1461033f5780632c2ee9c31461037b576101a9565b80630541d0b0146101ad57806306fdde03146101d7578063095ea7b3146102015780630d22a0b91461023d5780631249c58b1461026557806318160ddd1461026f576101a9565b366101a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101a09061198e565b60405180910390fd5b5f80fd5b3480156101b8575f80fd5b506101c16105cf565b6040516101ce91906119c4565b60405180910390f35b3480156101e2575f80fd5b506101eb6105d5565b6040516101f89190611a57565b60405180910390f35b34801561020c575f80fd5b5061022760048036038101906102229190611aff565b610665565b6040516102349190611b57565b60405180910390f35b348015610248575f80fd5b50610263600480360381019061025e9190611b70565b610687565b005b61026d6106ea565b005b34801561027a575f80fd5b506102836108e2565b60405161029091906119c4565b60405180910390f35b3480156102a4575f80fd5b506102bf60048036038101906102ba9190611b9b565b6108eb565b005b3480156102cc575f80fd5b506102d5610936565b6040516102e291906119c4565b60405180910390f35b3480156102f6575f80fd5b506102ff61093c565b60405161030c91906119c4565b60405180910390f35b348015610320575f80fd5b50610329610a0a565b6040516103369190611c21565b60405180910390f35b34801561034a575f80fd5b5061036560048036038101906103609190611c3a565b610a2f565b6040516103729190611b57565b60405180910390f35b348015610386575f80fd5b5061038f610a5d565b60405161039c91906119c4565b60405180910390f35b3480156103b0575f80fd5b506103b9610a63565b6040516103c69190611ca5565b60405180910390f35b3480156103da575f80fd5b506103f560048036038101906103f09190611b9b565b610a6b565b60405161040291906119c4565b60405180910390f35b348015610416575f80fd5b5061041f610ab0565b005b34801561042c575f80fd5b5061044760048036038101906104429190611b70565b610ac3565b005b348015610454575f80fd5b5061045d610b26565b60405161046a9190611ccd565b60405180910390f35b34801561047e575f80fd5b50610487610b4e565b6040516104949190611a57565b60405180910390f35b3480156104a8575f80fd5b506104c360048036038101906104be9190611aff565b610bde565b6040516104d09190611b57565b60405180910390f35b3480156104e4575f80fd5b506104ed610c00565b005b3480156104fa575f80fd5b50610503610d0d565b6040516105109190611d06565b60405180910390f35b348015610524575f80fd5b5061053f600480360381019061053a9190611b70565b610d32565b005b34801561054c575f80fd5b5061056760048036038101906105629190611d1f565b610fc3565b60405161057491906119c4565b60405180910390f35b348015610588575f80fd5b50610591611045565b60405161059e9190611ccd565b60405180910390f35b3480156105b2575f80fd5b506105cd60048036038101906105c89190611b9b565b61106a565b005b600a5481565b6060600380546105e490611d8a565b80601f016020809104026020016040519081016040528092919081815260200182805461061090611d8a565b801561065b5780601f106106325761010080835404028352916020019161065b565b820191905f5260205f20905b81548152906001019060200180831161063e57829003601f168201915b5050505050905090565b5f8061066f6110ee565b905061067c8185856110f5565b600191505092915050565b61068f611107565b5f81101580156106a157506103e88111155b6106e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106d790611e04565b60405180910390fd5b80600a8190555050565b6106f261118e565b5f3411610734576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161072b90611e6c565b60405180910390fd5b5f61074134600a546111dd565b90505f81346107509190611eb7565b905081600c5f8282546107639190611eea565b9250508190555060075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a1903eab346107b0610b26565b6040518363ffffffff1660e01b81526004016107cc9190611ccd565b60206040518083038185885af11580156107e8573d5f803e3d5ffd5b50505050506040513d601f19601f8201168201806040525081019061080d9190611f31565b5060085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b815260040161088b929190611f5c565b6020604051808303815f875af11580156108a7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108cb9190611fad565b506108d633826111ff565b50506108e061127e565b565b5f600254905090565b6108f3611107565b8060095f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600c5481565b5f8060085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016109989190611ccd565b602060405180830381865afa1580156109b3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109d79190611f31565b90505f6109e26108e2565b905080821115610a015780826109f89190611eb7565b92505050610a07565b5f925050505b90565b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f80610a396110ee565b9050610a46858285611288565b610a5185858561131a565b60019150509392505050565b600b5481565b5f6012905090565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b610ab8611107565b610ac15f61140a565b565b610acb611107565b5f8110158015610add57506103e88111155b610b1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1390611e04565b60405180910390fd5b80600b8190555050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054610b5d90611d8a565b80601f0160208091040260200160405190810160405280929190818152602001828054610b8990611d8a565b8015610bd45780601f10610bab57610100808354040283529160200191610bd4565b820191905f5260205f20905b815481529060010190602001808311610bb757829003601f168201915b5050505050905090565b5f80610be86110ee565b9050610bf581858561131a565b600191505092915050565b610c08611107565b5f610c1161093c565b90505f8111610c55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4c90612022565b60405180910390fd5b80600c5f828254610c669190611eea565b9250508190555060085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401610cc9929190611f5c565b6020604051808303815f875af1158015610ce5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d099190611fad565b5050565b60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610d3a61118e565b80610d4433610a6b565b1015610d85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7c9061208a565b60405180910390fd5b5f610d8e61093c565b90505f811015610dd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dca90612118565b60405180910390fd5b5f610de083600b546111dd565b90505f8184610def9190611eb7565b905081600c5f828254610e029190611eea565b92505081905550610e1333856114cd565b60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401610e6f929190611f5c565b6020604051808303815f875af1158015610e8b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610eaf9190611fad565b610eee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee590612180565b60405180910390fd5b5f821115610fb55760085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401610f73929190611f5c565b6020604051808303815f875af1158015610f8f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fb39190611fad565b505b505050610fc061127e565b50565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611072611107565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036110e2575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016110d99190611ccd565b60405180910390fd5b6110eb8161140a565b50565b5f33905090565b611102838383600161154c565b505050565b61110f6110ee565b73ffffffffffffffffffffffffffffffffffffffff1661112d610b26565b73ffffffffffffffffffffffffffffffffffffffff161461118c576111506110ee565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016111839190611ccd565b60405180910390fd5b565b6002600654036111d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ca906121e8565b60405180910390fd5b6002600681905550565b5f61271082846111ed9190612206565b6111f79190612274565b905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361126f575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016112669190611ccd565b60405180910390fd5b61127a5f838361171b565b5050565b6001600681905550565b5f6112938484610fc3565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146113145781811015611305578281836040517ffb8f41b20000000000000000000000000000000000000000000000000000000081526004016112fc939291906122a4565b60405180910390fd5b61131384848484035f61154c565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361138a575f6040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016113819190611ccd565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036113fa575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016113f19190611ccd565b60405180910390fd5b61140583838361171b565b505050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361153d575f6040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016115349190611ccd565b60405180910390fd5b611548825f8361171b565b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036115bc575f6040517fe602df050000000000000000000000000000000000000000000000000000000081526004016115b39190611ccd565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361162c575f6040517f94280d620000000000000000000000000000000000000000000000000000000081526004016116239190611ccd565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508015611715578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161170c91906119c4565b60405180910390a35b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361176b578060025f82825461175f9190611eea565b92505081905550611839565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050818110156117f4578381836040517fe450d38c0000000000000000000000000000000000000000000000000000000081526004016117eb939291906122a4565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611880578060025f82825403925050819055506118ca565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161192791906119c4565b60405180910390a3505050565b5f82825260208201905092915050565b7f53656e6420455448207468726f756768206d696e742066756e6374696f6e00005f82015250565b5f611978601e83611934565b915061198382611944565b602082019050919050565b5f6020820190508181035f8301526119a58161196c565b9050919050565b5f819050919050565b6119be816119ac565b82525050565b5f6020820190506119d75f8301846119b5565b92915050565b5f81519050919050565b5f5b83811015611a045780820151818401526020810190506119e9565b5f8484015250505050565b5f601f19601f8301169050919050565b5f611a29826119dd565b611a338185611934565b9350611a438185602086016119e7565b611a4c81611a0f565b840191505092915050565b5f6020820190508181035f830152611a6f8184611a1f565b905092915050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f611aa482611a7b565b9050919050565b611ab481611a9a565b8114611abe575f80fd5b50565b5f81359050611acf81611aab565b92915050565b611ade816119ac565b8114611ae8575f80fd5b50565b5f81359050611af981611ad5565b92915050565b5f8060408385031215611b1557611b14611a77565b5b5f611b2285828601611ac1565b9250506020611b3385828601611aeb565b9150509250929050565b5f8115159050919050565b611b5181611b3d565b82525050565b5f602082019050611b6a5f830184611b48565b92915050565b5f60208284031215611b8557611b84611a77565b5b5f611b9284828501611aeb565b91505092915050565b5f60208284031215611bb057611baf611a77565b5b5f611bbd84828501611ac1565b91505092915050565b5f819050919050565b5f611be9611be4611bdf84611a7b565b611bc6565b611a7b565b9050919050565b5f611bfa82611bcf565b9050919050565b5f611c0b82611bf0565b9050919050565b611c1b81611c01565b82525050565b5f602082019050611c345f830184611c12565b92915050565b5f805f60608486031215611c5157611c50611a77565b5b5f611c5e86828701611ac1565b9350506020611c6f86828701611ac1565b9250506040611c8086828701611aeb565b9150509250925092565b5f60ff82169050919050565b611c9f81611c8a565b82525050565b5f602082019050611cb85f830184611c96565b92915050565b611cc781611a9a565b82525050565b5f602082019050611ce05f830184611cbe565b92915050565b5f611cf082611bf0565b9050919050565b611d0081611ce6565b82525050565b5f602082019050611d195f830184611cf7565b92915050565b5f8060408385031215611d3557611d34611a77565b5b5f611d4285828601611ac1565b9250506020611d5385828601611ac1565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680611da157607f821691505b602082108103611db457611db3611d5d565b5b50919050565b7f466565206d757374206265206265747765656e20302520616e642031302500005f82015250565b5f611dee601e83611934565b9150611df982611dba565b602082019050919050565b5f6020820190508181035f830152611e1b81611de2565b9050919050565b7f4d7573742073656e642045544820746f206d696e7420627245544800000000005f82015250565b5f611e56601b83611934565b9150611e6182611e22565b602082019050919050565b5f6020820190508181035f830152611e8381611e4a565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611ec1826119ac565b9150611ecc836119ac565b9250828203905081811115611ee457611ee3611e8a565b5b92915050565b5f611ef4826119ac565b9150611eff836119ac565b9250828201905080821115611f1757611f16611e8a565b5b92915050565b5f81519050611f2b81611ad5565b92915050565b5f60208284031215611f4657611f45611a77565b5b5f611f5384828501611f1d565b91505092915050565b5f604082019050611f6f5f830185611cbe565b611f7c60208301846119b5565b9392505050565b611f8c81611b3d565b8114611f96575f80fd5b50565b5f81519050611fa781611f83565b92915050565b5f60208284031215611fc257611fc1611a77565b5b5f611fcf84828501611f99565b91505092915050565b7f4e6f2070726f6669747320746f20636c61696d000000000000000000000000005f82015250565b5f61200c601383611934565b915061201782611fd8565b602082019050919050565b5f6020820190508181035f83015261203981612000565b9050919050565b7f496e73756666696369656e742062724554482062616c616e63650000000000005f82015250565b5f612074601a83611934565b915061207f82612040565b602082019050919050565b5f6020820190508181035f8301526120a181612068565b9050919050565b7f736c617368206576656e74206f6363757265642c207761697420666f722073755f8201527f6666696369656e7420737570706c790000000000000000000000000000000000602082015250565b5f612102602f83611934565b915061210d826120a8565b604082019050919050565b5f6020820190508181035f83015261212f816120f6565b9050919050565b7f7374455448207472616e73666572206661696c656400000000000000000000005f82015250565b5f61216a601583611934565b915061217582612136565b602082019050919050565b5f6020820190508181035f8301526121978161215e565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c005f82015250565b5f6121d2601f83611934565b91506121dd8261219e565b602082019050919050565b5f6020820190508181035f8301526121ff816121c6565b9050919050565b5f612210826119ac565b915061221b836119ac565b9250828202612229816119ac565b915082820484148315176122405761223f611e8a565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61227e826119ac565b9150612289836119ac565b92508261229957612298612247565b5b828204905092915050565b5f6060820190506122b75f830186611cbe565b6122c460208301856119b5565b6122d160408301846119b5565b94935050505056fea2646970667358221220f2d4e14541a021c871c87ddb927ed03c34c95ad0f89731a6dbfc47e041ff1aac64736f6c63430008180033

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

000000000000000000000000ae7ab96520de3a18e5e111b5eaab095312d7fe84000000000000000000000000ae7ab96520de3a18e5e111b5eaab095312d7fe84000000000000000000000000ee4daac843bc54a23c80f5176882e7eeacde0371

-----Decoded View---------------
Arg [0] : _lidoAddress (address): 0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84
Arg [1] : _stETHAddress (address): 0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84
Arg [2] : _buybackWallet (address): 0xEE4daaC843Bc54a23C80f5176882e7EEacDe0371

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000ae7ab96520de3a18e5e111b5eaab095312d7fe84
Arg [1] : 000000000000000000000000ae7ab96520de3a18e5e111b5eaab095312d7fe84
Arg [2] : 000000000000000000000000ee4daac843bc54a23c80f5176882e7eeacde0371


Deployed Bytecode Sourcemap

29231:3300:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32480:40;;;;;;;;;;:::i;:::-;;;;;;;;29231:3300;;;;29443:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19611:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21904:190;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31802:223;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29875:410;;;:::i;:::-;;20713:99;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32276:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29559:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30999:357;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29305:17;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22672:249;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29500:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20564:84;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20875:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13224:103;;;;;;;;;;;;;:::i;:::-;;32033:235;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12549:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19821:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21198:182;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31364:241;;;;;;;;;;;;;:::i;:::-;;29329:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30293:698;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21443:142;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29408:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13482:220;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29443:34;;;;:::o;19611:91::-;19656:13;19689:5;19682:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19611:91;:::o;21904:190::-;21977:4;21994:13;22010:12;:10;:12::i;:::-;21994:28;;22033:31;22042:5;22049:7;22058:5;22033:8;:31::i;:::-;22082:4;22075:11;;;21904:190;;;;:::o;31802:223::-;12435:13;:11;:13::i;:::-;31911:1:::1;31892:15;:20;;:47;;;;;31935:4;31916:15;:23;;31892:47;31884:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;32002:15;31985:14;:32;;;;31802:223:::0;:::o;29875:410::-;2345:21;:19;:21::i;:::-;29951:1:::1;29939:9;:13;29931:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;29995:11;30009:39;30022:9;30033:14;;30009:12;:39::i;:::-;29995:53;;30059:22;30096:3;30084:9;:15;;;;:::i;:::-;30059:40;;30124:3;30112:8;;:15;;;;;;;:::i;:::-;;;;;;;;30140:4;;;;;;;;;;;:11;;;30159:9;30170:7;:5;:7::i;:::-;30140:38;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;30189:5;;;;;;;;;;;:14;;;30204:13;;;;;;;;;;;30219:3;30189:34;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;30234:33;30240:10;30252:14;30234:5;:33::i;:::-;29920:365;;2389:20:::0;:18;:20::i;:::-;29875:410::o;20713:99::-;20765:7;20792:12;;20785:19;;20713:99;:::o;32276:118::-;12435:13;:11;:13::i;:::-;32372:14:::1;32356:13;;:30;;;;;;;;;;;;;;;;;;32276:118:::0;:::o;29559:23::-;;;;:::o;30999:357::-;31052:7;31072:18;31093:5;;;;;;;;;;;:15;;;31117:4;31093:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31072:51;;31181:24;31208:13;:11;:13::i;:::-;31181:40;;31249:16;31236:10;:29;31232:98;;;31302:16;31289:10;:29;;;;:::i;:::-;31282:36;;;;;;31232:98;31347:1;31340:8;;;;30999:357;;:::o;29305:17::-;;;;;;;;;;;;;:::o;22672:249::-;22759:4;22776:15;22794:12;:10;:12::i;:::-;22776:30;;22817:37;22833:4;22839:7;22848:5;22817:15;:37::i;:::-;22865:26;22875:4;22881:2;22885:5;22865:9;:26::i;:::-;22909:4;22902:11;;;22672:249;;;;;:::o;29500:36::-;;;;:::o;20564:84::-;20613:5;20638:2;20631:9;;20564:84;:::o;20875:118::-;20940:7;20967:9;:18;20977:7;20967:18;;;;;;;;;;;;;;;;20960:25;;20875:118;;;:::o;13224:103::-;12435:13;:11;:13::i;:::-;13289:30:::1;13316:1;13289:18;:30::i;:::-;13224:103::o:0;32033:235::-;12435:13;:11;:13::i;:::-;32148:1:::1;32127:17;:22;;:51;;;;;32174:4;32153:17;:25;;32127:51;32119:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;32243:17;32224:16;:36;;;;32033:235:::0;:::o;12549:87::-;12595:7;12622:6;;;;;;;;;;;12615:13;;12549:87;:::o;19821:95::-;19868:13;19901:7;19894:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19821:95;:::o;21198:182::-;21267:4;21284:13;21300:12;:10;:12::i;:::-;21284:28;;21323:27;21333:5;21340:2;21344:5;21323:9;:27::i;:::-;21368:4;21361:11;;;21198:182;;;;:::o;31364:241::-;12435:13;:11;:13::i;:::-;31426:15:::1;31444:22;:20;:22::i;:::-;31426:40;;31495:1;31485:7;:11;31477:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;31543:7;31531:8;;:19;;;;;;;:::i;:::-;;;;;;;;31561:5;;;;;;;;;;;:14;;;31576:10;31588:7;31561:35;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;31415:190;31364:241::o:0;29329:19::-;;;;;;;;;;;;;:::o;30293:698::-;2345:21;:19;:21::i;:::-;30396:11:::1;30371:21;30381:10;30371:9;:21::i;:::-;:36;;30363:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;30449:15;30467:22;:20;:22::i;:::-;30449:40;;30519:1;30508:7;:12;;30500:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;30583:11;30597:43;30610:11;30623:16;;30597:12;:43::i;:::-;30583:57;;30651:22;30690:3;30676:11;:17;;;;:::i;:::-;30651:42;;30716:3;30704:8;;:15;;;;;;;:::i;:::-;;;;;;;;30730:30;30736:10;30748:11;30730:5;:30::i;:::-;30779:5;;;;;;;;;;;:14;;;30794:10;30806:14;30779:42;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30771:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;30868:1;30862:3;:7;30858:126;;;30886:5;;;;;;;;;;;:14;;;30901:13;;;;;;;;;;;30916:3;30886:34;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;30858:126;30352:639;;;2389:20:::0;:18;:20::i;:::-;30293:698;:::o;21443:142::-;21523:7;21550:11;:18;21562:5;21550:18;;;;;;;;;;;;;;;:27;21569:7;21550:27;;;;;;;;;;;;;;;;21543:34;;21443:142;;;;:::o;29408:28::-;;;;;;;;;;;;;:::o;13482:220::-;12435:13;:11;:13::i;:::-;13587:1:::1;13567:22;;:8;:22;;::::0;13563:93:::1;;13641:1;13613:31;;;;;;;;;;;:::i;:::-;;;;;;;;13563:93;13666:28;13685:8;13666:18;:28::i;:::-;13482:220:::0;:::o;10665:98::-;10718:7;10745:10;10738:17;;10665:98;:::o;26731:130::-;26816:37;26825:5;26832:7;26841:5;26848:4;26816:8;:37::i;:::-;26731:130;;;:::o;12714:166::-;12785:12;:10;:12::i;:::-;12774:23;;:7;:5;:7::i;:::-;:23;;;12770:103;;12848:12;:10;:12::i;:::-;12821:40;;;;;;;;;;;:::i;:::-;;;;;;;;12770:103;12714:166::o;2425:293::-;1827:1;2559:7;;:19;2551:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1827:1;2692:7;:18;;;;2425:293::o;31613:181::-;31693:7;31742:5;31729:10;31720:6;:19;;;;:::i;:::-;:27;;;;:::i;:::-;31713:34;;31613:181;;;;:::o;25426:213::-;25516:1;25497:21;;:7;:21;;;25493:93;;25571:1;25542:32;;;;;;;;;;;:::i;:::-;;;;;;;;25493:93;25596:35;25612:1;25616:7;25625:5;25596:7;:35::i;:::-;25426:213;;:::o;2726:::-;1783:1;2909:7;:22;;;;2726:213::o;28447:487::-;28547:24;28574:25;28584:5;28591:7;28574:9;:25::i;:::-;28547:52;;28634:17;28614:16;:37;28610:317;;28691:5;28672:16;:24;28668:132;;;28751:7;28760:16;28778:5;28724:60;;;;;;;;;;;;;:::i;:::-;;;;;;;;28668:132;28843:57;28852:5;28859:7;28887:5;28868:16;:24;28894:5;28843:8;:57::i;:::-;28610:317;28536:398;28447:487;;;:::o;23306:308::-;23406:1;23390:18;;:4;:18;;;23386:88;;23459:1;23432:30;;;;;;;;;;;:::i;:::-;;;;;;;;23386:88;23502:1;23488:16;;:2;:16;;;23484:88;;23557:1;23528:32;;;;;;;;;;;:::i;:::-;;;;;;;;23484:88;23582:24;23590:4;23596:2;23600:5;23582:7;:24::i;:::-;23306:308;;;:::o;13862:191::-;13936:16;13955:6;;;;;;;;;;;13936:25;;13981:8;13972:6;;:17;;;;;;;;;;;;;;;;;;14036:8;14005:40;;14026:8;14005:40;;;;;;;;;;;;13925:128;13862:191;:::o;25967:211::-;26057:1;26038:21;;:7;:21;;;26034:91;;26110:1;26083:30;;;;;;;;;;;:::i;:::-;;;;;;;;26034:91;26135:35;26143:7;26160:1;26164:5;26135:7;:35::i;:::-;25967:211;;:::o;27712:443::-;27842:1;27825:19;;:5;:19;;;27821:91;;27897:1;27868:32;;;;;;;;;;;:::i;:::-;;;;;;;;27821:91;27945:1;27926:21;;:7;:21;;;27922:92;;27999:1;27971:31;;;;;;;;;;;:::i;:::-;;;;;;;;27922:92;28054:5;28024:11;:18;28036:5;28024:18;;;;;;;;;;;;;;;:27;28043:7;28024:27;;;;;;;;;;;;;;;:35;;;;28074:9;28070:78;;;28121:7;28105:31;;28114:5;28105:31;;;28130:5;28105:31;;;;;;:::i;:::-;;;;;;;;28070:78;27712:443;;;;:::o;23938:1135::-;24044:1;24028:18;;:4;:18;;;24024:552;;24182:5;24166:12;;:21;;;;;;;:::i;:::-;;;;;;;;24024:552;;;24220:19;24242:9;:15;24252:4;24242:15;;;;;;;;;;;;;;;;24220:37;;24290:5;24276:11;:19;24272:117;;;24348:4;24354:11;24367:5;24323:50;;;;;;;;;;;;;:::i;:::-;;;;;;;;24272:117;24544:5;24530:11;:19;24512:9;:15;24522:4;24512:15;;;;;;;;;;;;;;;:37;;;;24205:371;24024:552;24606:1;24592:16;;:2;:16;;;24588:435;;24774:5;24758:12;;:21;;;;;;;;;;;24588:435;;;24991:5;24974:9;:13;24984:2;24974:13;;;;;;;;;;;;;;;;:22;;;;;;;;;;;24588:435;25055:2;25040:25;;25049:4;25040:25;;;25059:5;25040:25;;;;;;:::i;:::-;;;;;;;;23938:1135;;;:::o;7:169:1:-;91:11;125:6;120:3;113:19;165:4;160:3;156:14;141:29;;7:169;;;;:::o;182:180::-;322:32;318:1;310:6;306:14;299:56;182:180;:::o;368:366::-;510:3;531:67;595:2;590:3;531:67;:::i;:::-;524:74;;607:93;696:3;607:93;:::i;:::-;725:2;720:3;716:12;709:19;;368:366;;;:::o;740:419::-;906:4;944:2;933:9;929:18;921:26;;993:9;987:4;983:20;979:1;968:9;964:17;957:47;1021:131;1147:4;1021:131;:::i;:::-;1013:139;;740:419;;;:::o;1165:77::-;1202:7;1231:5;1220:16;;1165:77;;;:::o;1248:118::-;1335:24;1353:5;1335:24;:::i;:::-;1330:3;1323:37;1248:118;;:::o;1372:222::-;1465:4;1503:2;1492:9;1488:18;1480:26;;1516:71;1584:1;1573:9;1569:17;1560:6;1516:71;:::i;:::-;1372:222;;;;:::o;1600:99::-;1652:6;1686:5;1680:12;1670:22;;1600:99;;;:::o;1705:246::-;1786:1;1796:113;1810:6;1807:1;1804:13;1796:113;;;1895:1;1890:3;1886:11;1880:18;1876:1;1871:3;1867:11;1860:39;1832:2;1829:1;1825:10;1820:15;;1796:113;;;1943:1;1934:6;1929:3;1925:16;1918:27;1767:184;1705:246;;;:::o;1957:102::-;1998:6;2049:2;2045:7;2040:2;2033:5;2029:14;2025:28;2015:38;;1957:102;;;:::o;2065:377::-;2153:3;2181:39;2214:5;2181:39;:::i;:::-;2236:71;2300:6;2295:3;2236:71;:::i;:::-;2229:78;;2316:65;2374:6;2369:3;2362:4;2355:5;2351:16;2316:65;:::i;:::-;2406:29;2428:6;2406:29;:::i;:::-;2401:3;2397:39;2390:46;;2157:285;2065:377;;;;:::o;2448:313::-;2561:4;2599:2;2588:9;2584:18;2576:26;;2648:9;2642:4;2638:20;2634:1;2623:9;2619:17;2612:47;2676:78;2749:4;2740:6;2676:78;:::i;:::-;2668:86;;2448:313;;;;:::o;2848:117::-;2957:1;2954;2947:12;3094:126;3131:7;3171:42;3164:5;3160:54;3149:65;;3094:126;;;:::o;3226:96::-;3263:7;3292:24;3310:5;3292:24;:::i;:::-;3281:35;;3226:96;;;:::o;3328:122::-;3401:24;3419:5;3401:24;:::i;:::-;3394:5;3391:35;3381:63;;3440:1;3437;3430:12;3381:63;3328:122;:::o;3456:139::-;3502:5;3540:6;3527:20;3518:29;;3556:33;3583:5;3556:33;:::i;:::-;3456:139;;;;:::o;3601:122::-;3674:24;3692:5;3674:24;:::i;:::-;3667:5;3664:35;3654:63;;3713:1;3710;3703:12;3654:63;3601:122;:::o;3729:139::-;3775:5;3813:6;3800:20;3791:29;;3829:33;3856:5;3829:33;:::i;:::-;3729:139;;;;:::o;3874:474::-;3942:6;3950;3999:2;3987:9;3978:7;3974:23;3970:32;3967:119;;;4005:79;;:::i;:::-;3967:119;4125:1;4150:53;4195:7;4186:6;4175:9;4171:22;4150:53;:::i;:::-;4140:63;;4096:117;4252:2;4278:53;4323:7;4314:6;4303:9;4299:22;4278:53;:::i;:::-;4268:63;;4223:118;3874:474;;;;;:::o;4354:90::-;4388:7;4431:5;4424:13;4417:21;4406:32;;4354:90;;;:::o;4450:109::-;4531:21;4546:5;4531:21;:::i;:::-;4526:3;4519:34;4450:109;;:::o;4565:210::-;4652:4;4690:2;4679:9;4675:18;4667:26;;4703:65;4765:1;4754:9;4750:17;4741:6;4703:65;:::i;:::-;4565:210;;;;:::o;4781:329::-;4840:6;4889:2;4877:9;4868:7;4864:23;4860:32;4857:119;;;4895:79;;:::i;:::-;4857:119;5015:1;5040:53;5085:7;5076:6;5065:9;5061:22;5040:53;:::i;:::-;5030:63;;4986:117;4781:329;;;;:::o;5116:::-;5175:6;5224:2;5212:9;5203:7;5199:23;5195:32;5192:119;;;5230:79;;:::i;:::-;5192:119;5350:1;5375:53;5420:7;5411:6;5400:9;5396:22;5375:53;:::i;:::-;5365:63;;5321:117;5116:329;;;;:::o;5451:60::-;5479:3;5500:5;5493:12;;5451:60;;;:::o;5517:142::-;5567:9;5600:53;5618:34;5627:24;5645:5;5627:24;:::i;:::-;5618:34;:::i;:::-;5600:53;:::i;:::-;5587:66;;5517:142;;;:::o;5665:126::-;5715:9;5748:37;5779:5;5748:37;:::i;:::-;5735:50;;5665:126;;;:::o;5797:139::-;5860:9;5893:37;5924:5;5893:37;:::i;:::-;5880:50;;5797:139;;;:::o;5942:157::-;6042:50;6086:5;6042:50;:::i;:::-;6037:3;6030:63;5942:157;;:::o;6105:248::-;6211:4;6249:2;6238:9;6234:18;6226:26;;6262:84;6343:1;6332:9;6328:17;6319:6;6262:84;:::i;:::-;6105:248;;;;:::o;6359:619::-;6436:6;6444;6452;6501:2;6489:9;6480:7;6476:23;6472:32;6469:119;;;6507:79;;:::i;:::-;6469:119;6627:1;6652:53;6697:7;6688:6;6677:9;6673:22;6652:53;:::i;:::-;6642:63;;6598:117;6754:2;6780:53;6825:7;6816:6;6805:9;6801:22;6780:53;:::i;:::-;6770:63;;6725:118;6882:2;6908:53;6953:7;6944:6;6933:9;6929:22;6908:53;:::i;:::-;6898:63;;6853:118;6359:619;;;;;:::o;6984:86::-;7019:7;7059:4;7052:5;7048:16;7037:27;;6984:86;;;:::o;7076:112::-;7159:22;7175:5;7159:22;:::i;:::-;7154:3;7147:35;7076:112;;:::o;7194:214::-;7283:4;7321:2;7310:9;7306:18;7298:26;;7334:67;7398:1;7387:9;7383:17;7374:6;7334:67;:::i;:::-;7194:214;;;;:::o;7414:118::-;7501:24;7519:5;7501:24;:::i;:::-;7496:3;7489:37;7414:118;;:::o;7538:222::-;7631:4;7669:2;7658:9;7654:18;7646:26;;7682:71;7750:1;7739:9;7735:17;7726:6;7682:71;:::i;:::-;7538:222;;;;:::o;7766:140::-;7830:9;7863:37;7894:5;7863:37;:::i;:::-;7850:50;;7766:140;;;:::o;7912:159::-;8013:51;8058:5;8013:51;:::i;:::-;8008:3;8001:64;7912:159;;:::o;8077:250::-;8184:4;8222:2;8211:9;8207:18;8199:26;;8235:85;8317:1;8306:9;8302:17;8293:6;8235:85;:::i;:::-;8077:250;;;;:::o;8333:474::-;8401:6;8409;8458:2;8446:9;8437:7;8433:23;8429:32;8426:119;;;8464:79;;:::i;:::-;8426:119;8584:1;8609:53;8654:7;8645:6;8634:9;8630:22;8609:53;:::i;:::-;8599:63;;8555:117;8711:2;8737:53;8782:7;8773:6;8762:9;8758:22;8737:53;:::i;:::-;8727:63;;8682:118;8333:474;;;;;:::o;8813:180::-;8861:77;8858:1;8851:88;8958:4;8955:1;8948:15;8982:4;8979:1;8972:15;8999:320;9043:6;9080:1;9074:4;9070:12;9060:22;;9127:1;9121:4;9117:12;9148:18;9138:81;;9204:4;9196:6;9192:17;9182:27;;9138:81;9266:2;9258:6;9255:14;9235:18;9232:38;9229:84;;9285:18;;:::i;:::-;9229:84;9050:269;8999:320;;;:::o;9325:180::-;9465:32;9461:1;9453:6;9449:14;9442:56;9325:180;:::o;9511:366::-;9653:3;9674:67;9738:2;9733:3;9674:67;:::i;:::-;9667:74;;9750:93;9839:3;9750:93;:::i;:::-;9868:2;9863:3;9859:12;9852:19;;9511:366;;;:::o;9883:419::-;10049:4;10087:2;10076:9;10072:18;10064:26;;10136:9;10130:4;10126:20;10122:1;10111:9;10107:17;10100:47;10164:131;10290:4;10164:131;:::i;:::-;10156:139;;9883:419;;;:::o;10308:177::-;10448:29;10444:1;10436:6;10432:14;10425:53;10308:177;:::o;10491:366::-;10633:3;10654:67;10718:2;10713:3;10654:67;:::i;:::-;10647:74;;10730:93;10819:3;10730:93;:::i;:::-;10848:2;10843:3;10839:12;10832:19;;10491:366;;;:::o;10863:419::-;11029:4;11067:2;11056:9;11052:18;11044:26;;11116:9;11110:4;11106:20;11102:1;11091:9;11087:17;11080:47;11144:131;11270:4;11144:131;:::i;:::-;11136:139;;10863:419;;;:::o;11288:180::-;11336:77;11333:1;11326:88;11433:4;11430:1;11423:15;11457:4;11454:1;11447:15;11474:194;11514:4;11534:20;11552:1;11534:20;:::i;:::-;11529:25;;11568:20;11586:1;11568:20;:::i;:::-;11563:25;;11612:1;11609;11605:9;11597:17;;11636:1;11630:4;11627:11;11624:37;;;11641:18;;:::i;:::-;11624:37;11474:194;;;;:::o;11674:191::-;11714:3;11733:20;11751:1;11733:20;:::i;:::-;11728:25;;11767:20;11785:1;11767:20;:::i;:::-;11762:25;;11810:1;11807;11803:9;11796:16;;11831:3;11828:1;11825:10;11822:36;;;11838:18;;:::i;:::-;11822:36;11674:191;;;;:::o;11871:143::-;11928:5;11959:6;11953:13;11944:22;;11975:33;12002:5;11975:33;:::i;:::-;11871:143;;;;:::o;12020:351::-;12090:6;12139:2;12127:9;12118:7;12114:23;12110:32;12107:119;;;12145:79;;:::i;:::-;12107:119;12265:1;12290:64;12346:7;12337:6;12326:9;12322:22;12290:64;:::i;:::-;12280:74;;12236:128;12020:351;;;;:::o;12377:332::-;12498:4;12536:2;12525:9;12521:18;12513:26;;12549:71;12617:1;12606:9;12602:17;12593:6;12549:71;:::i;:::-;12630:72;12698:2;12687:9;12683:18;12674:6;12630:72;:::i;:::-;12377:332;;;;;:::o;12715:116::-;12785:21;12800:5;12785:21;:::i;:::-;12778:5;12775:32;12765:60;;12821:1;12818;12811:12;12765:60;12715:116;:::o;12837:137::-;12891:5;12922:6;12916:13;12907:22;;12938:30;12962:5;12938:30;:::i;:::-;12837:137;;;;:::o;12980:345::-;13047:6;13096:2;13084:9;13075:7;13071:23;13067:32;13064:119;;;13102:79;;:::i;:::-;13064:119;13222:1;13247:61;13300:7;13291:6;13280:9;13276:22;13247:61;:::i;:::-;13237:71;;13193:125;12980:345;;;;:::o;13331:169::-;13471:21;13467:1;13459:6;13455:14;13448:45;13331:169;:::o;13506:366::-;13648:3;13669:67;13733:2;13728:3;13669:67;:::i;:::-;13662:74;;13745:93;13834:3;13745:93;:::i;:::-;13863:2;13858:3;13854:12;13847:19;;13506:366;;;:::o;13878:419::-;14044:4;14082:2;14071:9;14067:18;14059:26;;14131:9;14125:4;14121:20;14117:1;14106:9;14102:17;14095:47;14159:131;14285:4;14159:131;:::i;:::-;14151:139;;13878:419;;;:::o;14303:176::-;14443:28;14439:1;14431:6;14427:14;14420:52;14303:176;:::o;14485:366::-;14627:3;14648:67;14712:2;14707:3;14648:67;:::i;:::-;14641:74;;14724:93;14813:3;14724:93;:::i;:::-;14842:2;14837:3;14833:12;14826:19;;14485:366;;;:::o;14857:419::-;15023:4;15061:2;15050:9;15046:18;15038:26;;15110:9;15104:4;15100:20;15096:1;15085:9;15081:17;15074:47;15138:131;15264:4;15138:131;:::i;:::-;15130:139;;14857:419;;;:::o;15282:234::-;15422:34;15418:1;15410:6;15406:14;15399:58;15491:17;15486:2;15478:6;15474:15;15467:42;15282:234;:::o;15522:366::-;15664:3;15685:67;15749:2;15744:3;15685:67;:::i;:::-;15678:74;;15761:93;15850:3;15761:93;:::i;:::-;15879:2;15874:3;15870:12;15863:19;;15522:366;;;:::o;15894:419::-;16060:4;16098:2;16087:9;16083:18;16075:26;;16147:9;16141:4;16137:20;16133:1;16122:9;16118:17;16111:47;16175:131;16301:4;16175:131;:::i;:::-;16167:139;;15894:419;;;:::o;16319:171::-;16459:23;16455:1;16447:6;16443:14;16436:47;16319:171;:::o;16496:366::-;16638:3;16659:67;16723:2;16718:3;16659:67;:::i;:::-;16652:74;;16735:93;16824:3;16735:93;:::i;:::-;16853:2;16848:3;16844:12;16837:19;;16496:366;;;:::o;16868:419::-;17034:4;17072:2;17061:9;17057:18;17049:26;;17121:9;17115:4;17111:20;17107:1;17096:9;17092:17;17085:47;17149:131;17275:4;17149:131;:::i;:::-;17141:139;;16868:419;;;:::o;17293:181::-;17433:33;17429:1;17421:6;17417:14;17410:57;17293:181;:::o;17480:366::-;17622:3;17643:67;17707:2;17702:3;17643:67;:::i;:::-;17636:74;;17719:93;17808:3;17719:93;:::i;:::-;17837:2;17832:3;17828:12;17821:19;;17480:366;;;:::o;17852:419::-;18018:4;18056:2;18045:9;18041:18;18033:26;;18105:9;18099:4;18095:20;18091:1;18080:9;18076:17;18069:47;18133:131;18259:4;18133:131;:::i;:::-;18125:139;;17852:419;;;:::o;18277:410::-;18317:7;18340:20;18358:1;18340:20;:::i;:::-;18335:25;;18374:20;18392:1;18374:20;:::i;:::-;18369:25;;18429:1;18426;18422:9;18451:30;18469:11;18451:30;:::i;:::-;18440:41;;18630:1;18621:7;18617:15;18614:1;18611:22;18591:1;18584:9;18564:83;18541:139;;18660:18;;:::i;:::-;18541:139;18325:362;18277:410;;;;:::o;18693:180::-;18741:77;18738:1;18731:88;18838:4;18835:1;18828:15;18862:4;18859:1;18852:15;18879:185;18919:1;18936:20;18954:1;18936:20;:::i;:::-;18931:25;;18970:20;18988:1;18970:20;:::i;:::-;18965:25;;19009:1;18999:35;;19014:18;;:::i;:::-;18999:35;19056:1;19053;19049:9;19044:14;;18879:185;;;;:::o;19070:442::-;19219:4;19257:2;19246:9;19242:18;19234:26;;19270:71;19338:1;19327:9;19323:17;19314:6;19270:71;:::i;:::-;19351:72;19419:2;19408:9;19404:18;19395:6;19351:72;:::i;:::-;19433;19501:2;19490:9;19486:18;19477:6;19433:72;:::i;:::-;19070:442;;;;;;:::o

Swarm Source

ipfs://f2d4e14541a021c871c87ddb927ed03c34c95ad0f89731a6dbfc47e041ff1aac
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.