ETH Price: $2,067.84 (+2.22%)

Contract

0x2B1fD79d8A76AdD79A8401B6d33cD2d672fA836F
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

More Info

Private Name Tags

TokenTracker

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Burn168398462023-03-16 10:34:111092 days ago1678962851IN
0x2B1fD79d...672fA836F
0 ETH0.00566446.58088106
Mint168398092023-03-16 10:26:351092 days ago1678962395IN
0x2B1fD79d...672fA836F
0 ETH0.002675840.50133148
Burn168397682023-03-16 10:18:111092 days ago1678961891IN
0x2B1fD79d...672fA836F
0 ETH0.0017170724.38371719
Mint168397522023-03-16 10:14:591092 days ago1678961699IN
0x2B1fD79d...672fA836F
0 ETH0.0028259133.9837286
Burn168397122023-03-16 10:06:591092 days ago1678961219IN
0x2B1fD79d...672fA836F
0 ETH0.002293217.12691007
Mint168396922023-03-16 10:02:591092 days ago1678960979IN
0x2B1fD79d...672fA836F
0 ETH0.0022109722.0508602
Mint168352912023-03-15 19:11:471092 days ago1678907507IN
0x2B1fD79d...672fA836F
0 ETH0.0046597435.23862926
Mint168352442023-03-15 19:02:231092 days ago1678906943IN
0x2B1fD79d...672fA836F
0 ETH0.0036093826.34164684
Mint168335952023-03-15 13:29:351092 days ago1678886975IN
0x2B1fD79d...672fA836F
0 ETH0.0058123233.95090039
Burn168315552023-03-15 6:34:351093 days ago1678862075IN
0x2B1fD79d...672fA836F
0 ETH0.0019599618.29028021
Mint168315492023-03-15 6:33:231093 days ago1678862003IN
0x2B1fD79d...672fA836F
0 ETH0.0037217521.73945935

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
LSDTokenVELSD

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, Unlicense license
/**
 *Submitted for verification at Etherscan.io on 2023-03-15
*/

// SPDX-License-Identifier: UNLICENSED

pragma solidity ^0.8.9;

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

/**
 * @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.
 *
 * By default, the owner account will be the one that deploys the contract. 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;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @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 {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing 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 {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _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);
    }
}

interface ILSDStorage {
    // Depoly status
    function getDeployedStatus() external view returns (bool);

    // Guardian
    function getGuardian() external view returns (address);

    function setGuardian(address _newAddress) external;

    function confirmGuardian() external;

    // Getters
    function getAddress(bytes32 _key) external view returns (address);

    function getUint(bytes32 _key) external view returns (uint256);

    function getString(bytes32 _key) external view returns (string memory);

    function getBytes(bytes32 _key) external view returns (bytes memory);

    function getBool(bytes32 _key) external view returns (bool);

    function getInt(bytes32 _key) external view returns (int256);

    function getBytes32(bytes32 _key) external view returns (bytes32);

    // Setters
    function setAddress(bytes32 _key, address _value) external;

    function setUint(bytes32 _key, uint256 _value) external;

    function setString(bytes32 _key, string calldata _value) external;

    function setBytes(bytes32 _key, bytes calldata _value) external;

    function setBool(bytes32 _key, bool _value) external;

    function setInt(bytes32 _key, int256 _value) external;

    function setBytes32(bytes32 _key, bytes32 _value) external;

    // Deleters
    function deleteAddress(bytes32 _key) external;

    function deleteUint(bytes32 _key) external;

    function deleteString(bytes32 _key) external;

    function deleteBytes(bytes32 _key) external;

    function deleteBool(bytes32 _key) external;

    function deleteInt(bytes32 _key) external;

    function deleteBytes32(bytes32 _key) external;

    // Arithmetic
    function addUint(bytes32 _key, uint256 _amount) external;

    function subUint(bytes32 _key, uint256 _amount) external;
}

/// @title Base settings / modifiers for each contract in LSD

abstract contract LSDBase {
    // Calculate using this as the base
    uint256 constant calcBase = 1 ether;

    // Version of the contract
    uint8 public version;

    // The main storage contact where primary persistant storage is maintained
    ILSDStorage lsdStorage;

    /*** Modifiers ***********************************************************/

    /**
     * @dev Throws if called by any sender that doesn't match a LSD network contract
     */
    modifier onlyLSDNetworkContract() {
        require(
            getBool(
                keccak256(abi.encodePacked("contract.exists", msg.sender))
            ),
            "Invalid contract"
        );
        _;
    }

    /**
     * @dev Throws if called by any sender that doesn't match one of the supplied contract
     */
    modifier onlyLSDContract(
        string memory _contractName,
        address _contractAddress
    ) {
        require(
            _contractAddress ==
                getAddress(
                    keccak256(
                        abi.encodePacked("contract.address", _contractName)
                    )
                ),
            "Invalid contract"
        );
        _;
    }

    /*** Methods **********************************************************************/

    /// @dev Set the main LSD storage address
    constructor(ILSDStorage _lsdStorageAddress) {
        // Update the contract address
        lsdStorage = ILSDStorage(_lsdStorageAddress);
    }

    /// @dev Get the address of a network contract by name
    function getContractAddress(string memory _contractName)
        internal
        view
        returns (address)
    {
        // Get the current contract address
        address contractAddress = getAddress(
            keccak256(abi.encodePacked("contract.address", _contractName))
        );
        // Check it
        require(contractAddress != address(0x0), "Contract not found");
        return contractAddress;
    }

    /// @dev Get the name of a network contract by address
    function getContractName(address _contractAddress)
        internal
        view
        returns (string memory)
    {
        // Get the contract name
        string memory contractName = getString(
            keccak256(abi.encodePacked("contract.name", _contractAddress))
        );
        // Check it
        require(bytes(contractName).length > 0, "Contract not found");
        // Return
        return contractName;
    }

    /// @dev Get revert error message from a .call method
    function getRevertMsg(bytes memory _returnData)
        internal
        pure
        returns (string memory)
    {
        // If the _res length is less than 68, then the transaction failed silently (without a revert message)
        if (_returnData.length < 68) return "Transaction reverted silently";
        assembly {
            // Slice the sighash
            _returnData := add(_returnData, 0x04)
        }
        return abi.decode(_returnData, (string)); // All that remains is the revert string
    }

    /*** LSD Storage Methods ********************************************************/

    // Note: Uused helpers have been removed to keep contract sizes down

    /// @dev Storage get methods
    function getAddress(bytes32 _key) internal view returns (address) {
        return lsdStorage.getAddress(_key);
    }

    function getUint(bytes32 _key) internal view returns (uint256) {
        return lsdStorage.getUint(_key);
    }

    function getString(bytes32 _key) internal view returns (string memory) {
        return lsdStorage.getString(_key);
    }

    function getBytes(bytes32 _key) internal view returns (bytes memory) {
        return lsdStorage.getBytes(_key);
    }

    function getBool(bytes32 _key) internal view returns (bool) {
        return lsdStorage.getBool(_key);
    }

    function getInt(bytes32 _key) internal view returns (int256) {
        return lsdStorage.getInt(_key);
    }

    function getBytes32(bytes32 _key) internal view returns (bytes32) {
        return lsdStorage.getBytes32(_key);
    }

    /// @dev Storage set methods
    function setAddress(bytes32 _key, address _value) internal {
        lsdStorage.setAddress(_key, _value);
    }

    function setUint(bytes32 _key, uint256 _value) internal {
        lsdStorage.setUint(_key, _value);
    }

    function setString(bytes32 _key, string memory _value) internal {
        lsdStorage.setString(_key, _value);
    }

    function setBytes(bytes32 _key, bytes memory _value) internal {
        lsdStorage.setBytes(_key, _value);
    }

    function setBool(bytes32 _key, bool _value) internal {
        lsdStorage.setBool(_key, _value);
    }

    function setInt(bytes32 _key, int256 _value) internal {
        lsdStorage.setInt(_key, _value);
    }

    function setBytes32(bytes32 _key, bytes32 _value) internal {
        lsdStorage.setBytes32(_key, _value);
    }

    /// @dev Storage delete methods
    function deleteAddress(bytes32 _key) internal {
        lsdStorage.deleteAddress(_key);
    }

    function deleteUint(bytes32 _key) internal {
        lsdStorage.deleteUint(_key);
    }

    function deleteString(bytes32 _key) internal {
        lsdStorage.deleteString(_key);
    }

    function deleteBytes(bytes32 _key) internal {
        lsdStorage.deleteBytes(_key);
    }

    function deleteBool(bytes32 _key) internal {
        lsdStorage.deleteBool(_key);
    }

    function deleteInt(bytes32 _key) internal {
        lsdStorage.deleteInt(_key);
    }

    function deleteBytes32(bytes32 _key) internal {
        lsdStorage.deleteBytes32(_key);
    }

    /// @dev Storage arithmetic methods
    function addUint(bytes32 _key, uint256 _amount) internal {
        lsdStorage.addUint(_key, _amount);
    }

    function subUint(bytes32 _key, uint256 _amount) internal {
        lsdStorage.subUint(_key, _amount);
    }
}

interface ILSDOwner {
    function getDepositEnabled() external view returns (bool);

    function getIsLock() external view returns (bool);

    function getApy() external view returns (uint256);

    function getMultiplier() external view returns (uint256);

    function getMultiplierUnit() external view returns (uint256);

    function getApyUnit() external view returns (uint256);

    function getLIDOApy() external view returns (uint256);

    function getRPApy() external view returns (uint256);

    function getSWISEApy() external view returns (uint256);

    function getProtocolFee() external view returns (uint256);

    function getMinimumDepositAmount() external view returns (uint256);

    function setDepositEnabled(bool _depositEnabled) external;

    function setIsLock(bool _isLock) external;

    function setApy(uint256 _apy) external;

    function setApyUnit(uint256 _apyUnit) external;

    function setMultiplier(uint256 _multiplier) external;

    function setMultiplierUnit(uint256 _multiplierUnit) external;

    function setRPApy(uint256 _rpApy) external;

    function setLIDOApy(uint256 _lidoApy) external;

    function setSWISEApy(uint256 _swiseApy) external;

    function setProtocolFee(uint256 _protocalFee) external;

    function setMinimumDepositAmount(uint256 _minimumDepositAmount) external;

    function upgrade(string memory _type, string memory _name, string memory _contractAbi, address _contractAddress) external;
}

interface ILSDToken {
    function totalSupply() external view returns (uint256);

    function balanceOf(address account) external view returns (uint256);

    function transfer(
        address recipient,
        uint256 amount
    ) external returns (bool);

    function allowance(
        address owner,
        address spender
    ) external view returns (uint256);

    function approve(address spender, uint256 amount) external returns (bool);

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
}

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

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

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

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

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

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

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

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

interface ILSDTokenVELSD is IERC20 {
    function name() external view returns (string memory);

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

    function decimals() external view returns (uint8);

    function totalSupply() external view returns (uint256);

    function balanceOf(address account) external view returns (uint256);

    function transfer(address to, uint256 amount) external returns (bool);

    function allowance(address owner, address spender)
        external
        view
        returns (uint256);

    function approve(address spender, uint256 amount) external returns (bool);

    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);

    function mint(uint256 _lsETHAmount) external;

    function burn(uint256 _veLSDAmount) external;
}

contract LSDTokenVELSD is LSDBase, Ownable, ILSDTokenVELSD {
    // Events
    event TokenMinted(address indexed to, uint256 amount, uint256 time);
    event TokenBurned(address indexed from, uint256 amount, uint256 time);

    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    // Construct with veLSD Token
    constructor(
        ILSDStorage _lsdStorageAddress,
        string memory name_,
        string memory symbol_
    ) LSDBase(_lsdStorageAddress) {
        // Version
        version = 1;
        _name = name_;
        _symbol = symbol_;
    }

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

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

    function decimals() public view virtual override returns (uint8) {
        return 9;
    }

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

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

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

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

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

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

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(
        address spender,
        uint256 addedValue
    ) public virtual returns (bool) {
        address owner = msg.sender;
        _approve(owner, spender, allowance(owner, spender) + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(
        address spender,
        uint256 subtractedValue
    ) public virtual returns (bool) {
        address owner = msg.sender;
        uint256 currentAllowance = allowance(owner, spender);
        require(
            currentAllowance >= subtractedValue,
            "ERC20: decreased allowance below zero"
        );
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `from` to `to`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

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

        unchecked {
            _balances[from] = fromBalance - amount;
            // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
            // decrementing then incrementing.
            _balances[to] += amount;
        }

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

    // Mint veLSD
    // Only mint 1:1 ratio with the lsd Token
    function mint(uint256 _lsdTokenAmount) external override {
        // Check lsd balance
        ILSDToken lsdToken = ILSDToken(getContractAddress("lsdToken"));
        require(
            lsdToken.balanceOf(msg.sender) >= _lsdTokenAmount,
            "ERC20: transfer amount exceeds balance"
        );
        lsdToken.transferFrom(msg.sender, address(this), _lsdTokenAmount);

        // Mint veLSD Token
        require(msg.sender != address(0), "ERC20: mint to the zero address");
        _totalSupply += _lsdTokenAmount;
        unchecked {
            // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
            _balances[msg.sender] += _lsdTokenAmount;
        }

        // Emit token minted event
        emit TokenMinted(msg.sender, _lsdTokenAmount, block.timestamp);
    }

    // Burn veLSD
    function burn(uint256 _veLSDAmount) external override {
        ILSDOwner lsdOwner = ILSDOwner(getContractAddress("lsdOwner"));

        require(!lsdOwner.getIsLock(), "Token is locked by the owner");
        // Check veLSD balance
        require(
            balanceOf(msg.sender) >= _veLSDAmount,
            "ERC20: transfer amount exceeds balance"
        );

        uint256 accountBalance = _balances[msg.sender];
        unchecked {
            _balances[msg.sender] = accountBalance - _veLSDAmount;
            // Overflow not possible: amount <= accountBalance <= totalSupply.
            _totalSupply -= _veLSDAmount;
        }

        ILSDToken lsdToken = ILSDToken(getContractAddress("lsdToken"));
        lsdToken.transfer(msg.sender, _veLSDAmount);
        // Emit token burn event
        emit TokenBurned(msg.sender, _veLSDAmount, block.timestamp);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

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

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

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */

    // This is called by the ERC20 contract before all transfer, mint, and burns
    function _beforeTokenTransfer(
        address from,
        address,
        uint256
    ) internal view {
        if (from != address(0)) {
            ILSDOwner lsdOwner = ILSDOwner(getContractAddress("lsdOwner"));

            require(!lsdOwner.getIsLock(), "Token is locked by the owner");
        }
    }

    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"contract ILSDStorage","name":"_lsdStorageAddress","type":"address"},{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"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":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"}],"name":"TokenBurned","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"}],"name":"TokenMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_veLSDAmount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lsdTokenAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","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":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b50604051620014be380380620014be83398101604081905262000034916200026d565b60008054610100600160a81b0319166101006001600160a01b0386160217905562000066620000603390565b620000a8565b6000805460ff19166001179055815162000088906005906020850190620000fa565b5080516200009e906006906020840190620000fa565b5050505062000334565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200010890620002f7565b90600052602060002090601f0160209004810192826200012c576000855562000177565b82601f106200014757805160ff191683800117855562000177565b8280016001018555821562000177579182015b82811115620001775782518255916020019190600101906200015a565b506200018592915062000189565b5090565b5b808211156200018557600081556001016200018a565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001c857600080fd5b81516001600160401b0380821115620001e557620001e5620001a0565b604051601f8301601f19908116603f01168101908282118183101715620002105762000210620001a0565b816040528381526020925086838588010111156200022d57600080fd5b600091505b8382101562000251578582018301518183018401529082019062000232565b83821115620002635760008385830101525b9695505050505050565b6000806000606084860312156200028357600080fd5b83516001600160a01b03811681146200029b57600080fd5b60208501519093506001600160401b0380821115620002b957600080fd5b620002c787838801620001b6565b93506040860151915080821115620002de57600080fd5b50620002ed86828701620001b6565b9150509250925092565b600181811c908216806200030c57607f821691505b602082108114156200032e57634e487b7160e01b600052602260045260246000fd5b50919050565b61117a80620003446000396000f3fe608060405234801561001057600080fd5b506004361061010b5760003560e01c806370a08231116100a2578063a0712d6811610071578063a0712d6814610214578063a457c2d714610227578063a9059cbb1461023a578063dd62ed3e1461024d578063f2fde38b1461026057600080fd5b806370a08231146101c0578063715018a6146101e95780638da5cb5b146101f157806395d89b411461020c57600080fd5b8063313ce567116100de578063313ce56714610176578063395093511461018b57806342966c681461019e57806354fd4d50146101b357600080fd5b806306fdde0314610110578063095ea7b31461012e57806318160ddd1461015157806323b872dd14610163575b600080fd5b610118610273565b6040516101259190610ee2565b60405180910390f35b61014161013c366004610f2a565b610305565b6040519015158152602001610125565b6004545b604051908152602001610125565b610141610171366004610f56565b61031d565b60095b60405160ff9091168152602001610125565b610141610199366004610f2a565b610341565b6101b16101ac366004610f97565b610363565b005b6000546101799060ff1681565b6101556101ce366004610fb0565b6001600160a01b031660009081526002602052604090205490565b6101b1610594565b6001546040516001600160a01b039091168152602001610125565b6101186105a8565b6101b1610222366004610f97565b6105b7565b610141610235366004610f2a565b6107c3565b610141610248366004610f2a565b61083e565b61015561025b366004610fd4565b61084c565b6101b161026e366004610fb0565b610877565b6060600580546102829061100d565b80601f01602080910402602001604051908101604052809291908181526020018280546102ae9061100d565b80156102fb5780601f106102d0576101008083540402835291602001916102fb565b820191906000526020600020905b8154815290600101906020018083116102de57829003601f168201915b5050505050905090565b6000336103138185856108f0565b5060019392505050565b60003361032b858285610a14565b610336858585610a8e565b506001949350505050565b600033610313818585610354838361084c565b61035e9190611048565b6108f0565b600061038e604051806040016040528060088152602001673639b227bbb732b960c11b815250610c05565b9050806001600160a01b031663a94659ea6040518163ffffffff1660e01b815260040160206040518083038186803b1580156103c957600080fd5b505afa1580156103dd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610401919061106e565b156104535760405162461bcd60e51b815260206004820152601c60248201527f546f6b656e206973206c6f636b656420627920746865206f776e65720000000060448201526064015b60405180910390fd5b336000908152600260205260409020548211156104825760405162461bcd60e51b815260040161044a90611090565b3360009081526002602090815260408083208054868103909155600480548790039055815180830190925260088252673639b22a37b5b2b760c11b928201929092529091906104d090610c05565b60405163a9059cbb60e01b8152336004820152602481018690529091506001600160a01b0382169063a9059cbb90604401602060405180830381600087803b15801561051b57600080fd5b505af115801561052f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610553919061106e565b506040805185815242602082015233917fde3ca466246b0da455138dbea78dacd91d3c40dc98d5846ff0193bf67c24b0e7910160405180910390a250505050565b61059c610c8a565b6105a66000610ce4565b565b6060600680546102829061100d565b60006105e2604051806040016040528060088152602001673639b22a37b5b2b760c11b815250610c05565b6040516370a0823160e01b815233600482015290915082906001600160a01b038316906370a082319060240160206040518083038186803b15801561062657600080fd5b505afa15801561063a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061065e91906110d6565b101561067c5760405162461bcd60e51b815260040161044a90611090565b6040516323b872dd60e01b8152336004820152306024820152604481018390526001600160a01b038216906323b872dd90606401602060405180830381600087803b1580156106ca57600080fd5b505af11580156106de573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610702919061106e565b50336107505760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161044a565b81600460008282546107629190611048565b90915550503360008181526002602052604090819020805485019055517f96234cb3d6c373a1aaa06497a540bc166d4b0359243a088eaf95e21d7253d0be906107b79085904290918252602082015260400190565b60405180910390a25050565b600033816107d1828661084c565b9050838110156108315760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b606482015260840161044a565b61033682868684036108f0565b600033610313818585610a8e565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b61087f610c8a565b6001600160a01b0381166108e45760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161044a565b6108ed81610ce4565b50565b6001600160a01b0383166109525760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161044a565b6001600160a01b0382166109b35760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161044a565b6001600160a01b0383811660008181526003602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000610a20848461084c565b90506000198114610a885781811015610a7b5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161044a565b610a8884848484036108f0565b50505050565b6001600160a01b038316610af25760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161044a565b6001600160a01b038216610b545760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840161044a565b610b5f838383610d36565b6001600160a01b03831660009081526002602052604090205481811015610b985760405162461bcd60e51b815260040161044a90611090565b6001600160a01b0380851660008181526002602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90610bf89086815260200190565b60405180910390a3610a88565b600080610c3783604051602001610c1c91906110ef565b60405160208183030381529060405280519060200120610e35565b90506001600160a01b038116610c845760405162461bcd60e51b815260206004820152601260248201527110dbdb9d1c9858dd081b9bdd08199bdd5b9960721b604482015260640161044a565b92915050565b6001546001600160a01b031633146105a65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161044a565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b03831615610e30576000610d70604051806040016040528060088152602001673639b227bbb732b960c11b815250610c05565b9050806001600160a01b031663a94659ea6040518163ffffffff1660e01b815260040160206040518083038186803b158015610dab57600080fd5b505afa158015610dbf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610de3919061106e565b15610a885760405162461bcd60e51b815260206004820152601c60248201527f546f6b656e206973206c6f636b656420627920746865206f776e657200000000604482015260640161044a565b505050565b600080546040516321f8a72160e01b8152600481018490526101009091046001600160a01b0316906321f8a7219060240160206040518083038186803b158015610e7e57600080fd5b505afa158015610e92573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c849190611127565b60005b83811015610ed1578181015183820152602001610eb9565b83811115610a885750506000910152565b6020815260008251806020840152610f01816040850160208701610eb6565b601f01601f19169190910160400192915050565b6001600160a01b03811681146108ed57600080fd5b60008060408385031215610f3d57600080fd5b8235610f4881610f15565b946020939093013593505050565b600080600060608486031215610f6b57600080fd5b8335610f7681610f15565b92506020840135610f8681610f15565b929592945050506040919091013590565b600060208284031215610fa957600080fd5b5035919050565b600060208284031215610fc257600080fd5b8135610fcd81610f15565b9392505050565b60008060408385031215610fe757600080fd5b8235610ff281610f15565b9150602083013561100281610f15565b809150509250929050565b600181811c9082168061102157607f821691505b6020821081141561104257634e487b7160e01b600052602260045260246000fd5b50919050565b6000821982111561106957634e487b7160e01b600052601160045260246000fd5b500190565b60006020828403121561108057600080fd5b81518015158114610fcd57600080fd5b60208082526026908201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604082015265616c616e636560d01b606082015260800190565b6000602082840312156110e857600080fd5b5051919050565b6f636f6e74726163742e6164647265737360801b81526000825161111a816010850160208701610eb6565b9190910160100192915050565b60006020828403121561113957600080fd5b8151610fcd81610f1556fea26469706673582212208b4cd38cfce5300cdf805c32974f56dc906f92f258d1c6c81f2b0ece0f8d686864736f6c634300080900330000000000000000000000006e537840ed1320ef1693386961eb5bda8c2a0cf9000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000656452d4c53440000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000576654c5344000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061010b5760003560e01c806370a08231116100a2578063a0712d6811610071578063a0712d6814610214578063a457c2d714610227578063a9059cbb1461023a578063dd62ed3e1461024d578063f2fde38b1461026057600080fd5b806370a08231146101c0578063715018a6146101e95780638da5cb5b146101f157806395d89b411461020c57600080fd5b8063313ce567116100de578063313ce56714610176578063395093511461018b57806342966c681461019e57806354fd4d50146101b357600080fd5b806306fdde0314610110578063095ea7b31461012e57806318160ddd1461015157806323b872dd14610163575b600080fd5b610118610273565b6040516101259190610ee2565b60405180910390f35b61014161013c366004610f2a565b610305565b6040519015158152602001610125565b6004545b604051908152602001610125565b610141610171366004610f56565b61031d565b60095b60405160ff9091168152602001610125565b610141610199366004610f2a565b610341565b6101b16101ac366004610f97565b610363565b005b6000546101799060ff1681565b6101556101ce366004610fb0565b6001600160a01b031660009081526002602052604090205490565b6101b1610594565b6001546040516001600160a01b039091168152602001610125565b6101186105a8565b6101b1610222366004610f97565b6105b7565b610141610235366004610f2a565b6107c3565b610141610248366004610f2a565b61083e565b61015561025b366004610fd4565b61084c565b6101b161026e366004610fb0565b610877565b6060600580546102829061100d565b80601f01602080910402602001604051908101604052809291908181526020018280546102ae9061100d565b80156102fb5780601f106102d0576101008083540402835291602001916102fb565b820191906000526020600020905b8154815290600101906020018083116102de57829003601f168201915b5050505050905090565b6000336103138185856108f0565b5060019392505050565b60003361032b858285610a14565b610336858585610a8e565b506001949350505050565b600033610313818585610354838361084c565b61035e9190611048565b6108f0565b600061038e604051806040016040528060088152602001673639b227bbb732b960c11b815250610c05565b9050806001600160a01b031663a94659ea6040518163ffffffff1660e01b815260040160206040518083038186803b1580156103c957600080fd5b505afa1580156103dd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610401919061106e565b156104535760405162461bcd60e51b815260206004820152601c60248201527f546f6b656e206973206c6f636b656420627920746865206f776e65720000000060448201526064015b60405180910390fd5b336000908152600260205260409020548211156104825760405162461bcd60e51b815260040161044a90611090565b3360009081526002602090815260408083208054868103909155600480548790039055815180830190925260088252673639b22a37b5b2b760c11b928201929092529091906104d090610c05565b60405163a9059cbb60e01b8152336004820152602481018690529091506001600160a01b0382169063a9059cbb90604401602060405180830381600087803b15801561051b57600080fd5b505af115801561052f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610553919061106e565b506040805185815242602082015233917fde3ca466246b0da455138dbea78dacd91d3c40dc98d5846ff0193bf67c24b0e7910160405180910390a250505050565b61059c610c8a565b6105a66000610ce4565b565b6060600680546102829061100d565b60006105e2604051806040016040528060088152602001673639b22a37b5b2b760c11b815250610c05565b6040516370a0823160e01b815233600482015290915082906001600160a01b038316906370a082319060240160206040518083038186803b15801561062657600080fd5b505afa15801561063a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061065e91906110d6565b101561067c5760405162461bcd60e51b815260040161044a90611090565b6040516323b872dd60e01b8152336004820152306024820152604481018390526001600160a01b038216906323b872dd90606401602060405180830381600087803b1580156106ca57600080fd5b505af11580156106de573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610702919061106e565b50336107505760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161044a565b81600460008282546107629190611048565b90915550503360008181526002602052604090819020805485019055517f96234cb3d6c373a1aaa06497a540bc166d4b0359243a088eaf95e21d7253d0be906107b79085904290918252602082015260400190565b60405180910390a25050565b600033816107d1828661084c565b9050838110156108315760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b606482015260840161044a565b61033682868684036108f0565b600033610313818585610a8e565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b61087f610c8a565b6001600160a01b0381166108e45760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161044a565b6108ed81610ce4565b50565b6001600160a01b0383166109525760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161044a565b6001600160a01b0382166109b35760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161044a565b6001600160a01b0383811660008181526003602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000610a20848461084c565b90506000198114610a885781811015610a7b5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161044a565b610a8884848484036108f0565b50505050565b6001600160a01b038316610af25760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161044a565b6001600160a01b038216610b545760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840161044a565b610b5f838383610d36565b6001600160a01b03831660009081526002602052604090205481811015610b985760405162461bcd60e51b815260040161044a90611090565b6001600160a01b0380851660008181526002602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90610bf89086815260200190565b60405180910390a3610a88565b600080610c3783604051602001610c1c91906110ef565b60405160208183030381529060405280519060200120610e35565b90506001600160a01b038116610c845760405162461bcd60e51b815260206004820152601260248201527110dbdb9d1c9858dd081b9bdd08199bdd5b9960721b604482015260640161044a565b92915050565b6001546001600160a01b031633146105a65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161044a565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b03831615610e30576000610d70604051806040016040528060088152602001673639b227bbb732b960c11b815250610c05565b9050806001600160a01b031663a94659ea6040518163ffffffff1660e01b815260040160206040518083038186803b158015610dab57600080fd5b505afa158015610dbf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610de3919061106e565b15610a885760405162461bcd60e51b815260206004820152601c60248201527f546f6b656e206973206c6f636b656420627920746865206f776e657200000000604482015260640161044a565b505050565b600080546040516321f8a72160e01b8152600481018490526101009091046001600160a01b0316906321f8a7219060240160206040518083038186803b158015610e7e57600080fd5b505afa158015610e92573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c849190611127565b60005b83811015610ed1578181015183820152602001610eb9565b83811115610a885750506000910152565b6020815260008251806020840152610f01816040850160208701610eb6565b601f01601f19169190910160400192915050565b6001600160a01b03811681146108ed57600080fd5b60008060408385031215610f3d57600080fd5b8235610f4881610f15565b946020939093013593505050565b600080600060608486031215610f6b57600080fd5b8335610f7681610f15565b92506020840135610f8681610f15565b929592945050506040919091013590565b600060208284031215610fa957600080fd5b5035919050565b600060208284031215610fc257600080fd5b8135610fcd81610f15565b9392505050565b60008060408385031215610fe757600080fd5b8235610ff281610f15565b9150602083013561100281610f15565b809150509250929050565b600181811c9082168061102157607f821691505b6020821081141561104257634e487b7160e01b600052602260045260246000fd5b50919050565b6000821982111561106957634e487b7160e01b600052601160045260246000fd5b500190565b60006020828403121561108057600080fd5b81518015158114610fcd57600080fd5b60208082526026908201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604082015265616c616e636560d01b606082015260800190565b6000602082840312156110e857600080fd5b5051919050565b6f636f6e74726163742e6164647265737360801b81526000825161111a816010850160208701610eb6565b9190910160100192915050565b60006020828403121561113957600080fd5b8151610fcd81610f1556fea26469706673582212208b4cd38cfce5300cdf805c32974f56dc906f92f258d1c6c81f2b0ece0f8d686864736f6c63430008090033

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

0000000000000000000000006e537840ed1320ef1693386961eb5bda8c2a0cf9000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000656452d4c53440000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000576654c5344000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _lsdStorageAddress (address): 0x6E537840ED1320ef1693386961eB5BdA8C2a0CF9
Arg [1] : name_ (string): VE-LSD
Arg [2] : symbol_ (string): veLSD

-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000006e537840ed1320ef1693386961eb5bda8c2a0cf9
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [4] : 56452d4c53440000000000000000000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [6] : 76654c5344000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

17260:11312:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18075:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19858:224;;;;;;:::i;:::-;;:::i;:::-;;;1286:14:1;;1279:22;1261:41;;1249:2;1234:18;19858:224:0;1121:187:1;18563:108:0;18651:12;;18563:108;;;1459:25:1;;;1447:2;1432:18;18563:108:0;1313:177:1;20662:293:0;;;;;;:::i;:::-;;:::i;18406:92::-;18489:1;18406:92;;;2128:4:1;2116:17;;;2098:36;;2086:2;2071:18;18406:92:0;1956:184:1;21364:261:0;;;;;;:::i;:::-;;:::i;24929:893::-;;;;;;:::i;:::-;;:::i;:::-;;5421:20;;;;;;;;;18734:143;;;;;;:::i;:::-;-1:-1:-1;;;;;18851:18:0;18824:7;18851:18;;;:9;:18;;;;;;;18734:143;2548:103;;;:::i;1900:87::-;1973:6;;1900:87;;-1:-1:-1;;;;;1973:6:0;;;2728:51:1;;2716:2;2701:18;1900:87:0;2582:203:1;18294:104:0;;;:::i;24047:855::-;;;;;;:::i;:::-;;:::i;22128:496::-;;;;;;:::i;:::-;;:::i;19083:216::-;;;;;;:::i;:::-;;:::i;19362:176::-;;;;;;:::i;:::-;;:::i;2806:201::-;;;;;;:::i;:::-;;:::i;18075:100::-;18129:13;18162:5;18155:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18075:100;:::o;19858:224::-;19966:4;19999:10;20020:32;19999:10;20036:7;20045:6;20020:8;:32::i;:::-;-1:-1:-1;20070:4:0;;19858:224;-1:-1:-1;;;19858:224:0:o;20662:293::-;20793:4;20828:10;20849:38;20865:4;20828:10;20880:6;20849:15;:38::i;:::-;20898:27;20908:4;20914:2;20918:6;20898:9;:27::i;:::-;-1:-1:-1;20943:4:0;;20662:293;-1:-1:-1;;;;20662:293:0:o;21364:261::-;21477:4;21510:10;21531:64;21510:10;21547:7;21584:10;21556:25;21510:10;21547:7;21556:9;:25::i;:::-;:38;;;;:::i;:::-;21531:8;:64::i;24929:893::-;24994:18;25025:30;;;;;;;;;;;;;;-1:-1:-1;;;25025:30:0;;;:18;:30::i;:::-;24994:62;;25078:8;-1:-1:-1;;;;;25078:18:0;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25077:21;25069:62;;;;-1:-1:-1;;;25069:62:0;;4282:2:1;25069:62:0;;;4264:21:1;4321:2;4301:18;;;4294:30;4360;4340:18;;;4333:58;4408:18;;25069:62:0;;;;;;;;;25206:10;18824:7;18851:18;;;:9;:18;;;;;;25221:12;-1:-1:-1;25196:37:0;25174:125;;;;-1:-1:-1;;;25174:125:0;;;;;;;:::i;:::-;25347:10;25312:22;25337:21;;;:9;:21;;;;;;;;;;25418:29;;;25394:53;;;25542:12;:28;;;;;;;25625:30;;;;;;;;;;;-1:-1:-1;;;25625:30:0;;;;;;;25337:21;;25312:22;25625:30;;:18;:30::i;:::-;25667:43;;-1:-1:-1;;;25667:43:0;;25685:10;25667:43;;;5018:51:1;5085:18;;;5078:34;;;25594:62:0;;-1:-1:-1;;;;;;25667:17:0;;;;;4991:18:1;;25667:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;25760:54:0;;;5297:25:1;;;25798:15:0;5353:2:1;5338:18;;5331:34;25772:10:0;;25760:54;;5270:18:1;25760:54:0;;;;;;;24983:839;;;24929:893;:::o;2548:103::-;1786:13;:11;:13::i;:::-;2613:30:::1;2640:1;2613:18;:30::i;:::-;2548:103::o:0;18294:104::-;18350:13;18383:7;18376:14;;;;;:::i;24047:855::-;24145:18;24176:30;;;;;;;;;;;;;;-1:-1:-1;;;24176:30:0;;;:18;:30::i;:::-;24240;;-1:-1:-1;;;24240:30:0;;24259:10;24240:30;;;2728:51:1;24145:62:0;;-1:-1:-1;24274:15:0;;-1:-1:-1;;;;;24240:18:0;;;;;2701::1;;24240:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:49;;24218:137;;;;-1:-1:-1;;;24218:137:0;;;;;;;:::i;:::-;24366:65;;-1:-1:-1;;;24366:65:0;;24388:10;24366:65;;;5805:34:1;24408:4:0;5855:18:1;;;5848:43;5907:18;;;5900:34;;;-1:-1:-1;;;;;24366:21:0;;;;;5740:18:1;;24366:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;24481:10:0;24473:68;;;;-1:-1:-1;;;24473:68:0;;6147:2:1;24473:68:0;;;6129:21:1;6186:2;6166:18;;;6159:30;6225:33;6205:18;;;6198:61;6276:18;;24473:68:0;5945:355:1;24473:68:0;24568:15;24552:12;;:31;;;;;;;:::i;:::-;;;;-1:-1:-1;;24742:10:0;24732:21;;;;:9;:21;;;;;;;:40;;;;;;24837:57;;;;;24757:15;;24878;;5297:25:1;;;5353:2;5338:18;;5331:34;5285:2;5270:18;;5123:248;24837:57:0;;;;;;;;24104:798;24047:855;:::o;22128:496::-;22246:4;22279:10;22246:4;22327:25;22279:10;22344:7;22327:9;:25::i;:::-;22300:52;;22405:15;22385:16;:35;;22363:122;;;;-1:-1:-1;;;22363:122:0;;6507:2:1;22363:122:0;;;6489:21:1;6546:2;6526:18;;;6519:30;6585:34;6565:18;;;6558:62;-1:-1:-1;;;6636:18:1;;;6629:35;6681:19;;22363:122:0;6305:401:1;22363:122:0;22521:60;22530:5;22537:7;22565:15;22546:16;:34;22521:8;:60::i;19083:216::-;19187:4;19220:10;19241:28;19220:10;19258:2;19262:6;19241:9;:28::i;19362:176::-;-1:-1:-1;;;;;19503:18:0;;;19476:7;19503:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;19362:176::o;2806:201::-;1786:13;:11;:13::i;:::-;-1:-1:-1;;;;;2895:22:0;::::1;2887:73;;;::::0;-1:-1:-1;;;2887:73:0;;6913:2:1;2887:73:0::1;::::0;::::1;6895:21:1::0;6952:2;6932:18;;;6925:30;6991:34;6971:18;;;6964:62;-1:-1:-1;;;7042:18:1;;;7035:36;7088:19;;2887:73:0::1;6711:402:1::0;2887:73:0::1;2971:28;2990:8;2971:18;:28::i;:::-;2806:201:::0;:::o;26260:380::-;-1:-1:-1;;;;;26396:19:0;;26388:68;;;;-1:-1:-1;;;26388:68:0;;7320:2:1;26388:68:0;;;7302:21:1;7359:2;7339:18;;;7332:30;7398:34;7378:18;;;7371:62;-1:-1:-1;;;7449:18:1;;;7442:34;7493:19;;26388:68:0;7118:400:1;26388:68:0;-1:-1:-1;;;;;26475:21:0;;26467:68;;;;-1:-1:-1;;;26467:68:0;;7725:2:1;26467:68:0;;;7707:21:1;7764:2;7744:18;;;7737:30;7803:34;7783:18;;;7776:62;-1:-1:-1;;;7854:18:1;;;7847:32;7896:19;;26467:68:0;7523:398:1;26467:68:0;-1:-1:-1;;;;;26548:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;26600:32;;1459:25:1;;;26600:32:0;;1432:18:1;26600:32:0;;;;;;;26260:380;;;:::o;26931:502::-;27066:24;27093:25;27103:5;27110:7;27093:9;:25::i;:::-;27066:52;;-1:-1:-1;;27133:16:0;:37;27129:297;;27233:6;27213:16;:26;;27187:117;;;;-1:-1:-1;;;27187:117:0;;8128:2:1;27187:117:0;;;8110:21:1;8167:2;8147:18;;;8140:30;8206:31;8186:18;;;8179:59;8255:18;;27187:117:0;7926:353:1;27187:117:0;27348:51;27357:5;27364:7;27392:6;27373:16;:25;27348:8;:51::i;:::-;27055:378;26931:502;;;:::o;23094:879::-;-1:-1:-1;;;;;23225:18:0;;23217:68;;;;-1:-1:-1;;;23217:68:0;;8486:2:1;23217:68:0;;;8468:21:1;8525:2;8505:18;;;8498:30;8564:34;8544:18;;;8537:62;-1:-1:-1;;;8615:18:1;;;8608:35;8660:19;;23217:68:0;8284:401:1;23217:68:0;-1:-1:-1;;;;;23304:16:0;;23296:64;;;;-1:-1:-1;;;23296:64:0;;8892:2:1;23296:64:0;;;8874:21:1;8931:2;8911:18;;;8904:30;8970:34;8950:18;;;8943:62;-1:-1:-1;;;9021:18:1;;;9014:33;9064:19;;23296:64:0;8690:399:1;23296:64:0;23373:38;23394:4;23400:2;23404:6;23373:20;:38::i;:::-;-1:-1:-1;;;;;23446:15:0;;23424:19;23446:15;;;:9;:15;;;;;;23494:21;;;;23472:109;;;;-1:-1:-1;;;23472:109:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;23619:15:0;;;;;;;:9;:15;;;;;;23637:20;;;23619:38;;23837:13;;;;;;;;;;:23;;;;;;23889:26;;;;;;23651:6;1459:25:1;;1447:2;1432:18;;1313:177;23889:26:0;;;;;;;;23928:37;28117:320;6859:436;6966:7;7036:23;7062:98;7134:13;7097:51;;;;;;;;:::i;:::-;;;;;;;;;;;;;7087:62;;;;;;7062:10;:98::i;:::-;7036:124;-1:-1:-1;;;;;;7200:31:0;;7192:62;;;;-1:-1:-1;;;7192:62:0;;9736:2:1;7192:62:0;;;9718:21:1;9775:2;9755:18;;;9748:30;-1:-1:-1;;;9794:18:1;;;9787:48;9852:18;;7192:62:0;9534:342:1;7192:62:0;7272:15;6859:436;-1:-1:-1;;6859:436:0:o;2065:132::-;1973:6;;-1:-1:-1;;;;;1973:6:0;689:10;2129:23;2121:68;;;;-1:-1:-1;;;2121:68:0;;10083:2:1;2121:68:0;;;10065:21:1;;;10102:18;;;10095:30;10161:34;10141:18;;;10134:62;10213:18;;2121:68:0;9881:356:1;3167:191:0;3260:6;;;-1:-1:-1;;;;;3277:17:0;;;-1:-1:-1;;;;;;3277:17:0;;;;;;;3310:40;;3260:6;;;3277:17;3260:6;;3310:40;;3241:16;;3310:40;3230:128;3167:191;:::o;28117:320::-;-1:-1:-1;;;;;28242:18:0;;;28238:192;;28277:18;28308:30;;;;;;;;;;;;;;-1:-1:-1;;;28308:30:0;;;:18;:30::i;:::-;28277:62;;28365:8;-1:-1:-1;;;;;28365:18:0;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28364:21;28356:62;;;;-1:-1:-1;;;28356:62:0;;4282:2:1;28356:62:0;;;4264:21:1;4321:2;4301:18;;;4294:30;4360;4340:18;;;4333:58;4408:18;;28356:62:0;4080:352:1;28238:192:0;28117:320;;;:::o;8604:119::-;8661:7;8688:10;;:27;;-1:-1:-1;;;8688:27:0;;;;;1459:25:1;;;8688:10:0;;;;-1:-1:-1;;;;;8688:10:0;;:21;;1432:18:1;;8688:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;14:258:1:-;86:1;96:113;110:6;107:1;104:13;96:113;;;186:11;;;180:18;167:11;;;160:39;132:2;125:10;96:113;;;227:6;224:1;221:13;218:48;;;-1:-1:-1;;262:1:1;244:16;;237:27;14:258::o;277:383::-;426:2;415:9;408:21;389:4;458:6;452:13;501:6;496:2;485:9;481:18;474:34;517:66;576:6;571:2;560:9;556:18;551:2;543:6;539:15;517:66;:::i;:::-;644:2;623:15;-1:-1:-1;;619:29:1;604:45;;;;651:2;600:54;;277:383;-1:-1:-1;;277:383:1:o;665:131::-;-1:-1:-1;;;;;740:31:1;;730:42;;720:70;;786:1;783;776:12;801:315;869:6;877;930:2;918:9;909:7;905:23;901:32;898:52;;;946:1;943;936:12;898:52;985:9;972:23;1004:31;1029:5;1004:31;:::i;:::-;1054:5;1106:2;1091:18;;;;1078:32;;-1:-1:-1;;;801:315:1:o;1495:456::-;1572:6;1580;1588;1641:2;1629:9;1620:7;1616:23;1612:32;1609:52;;;1657:1;1654;1647:12;1609:52;1696:9;1683:23;1715:31;1740:5;1715:31;:::i;:::-;1765:5;-1:-1:-1;1822:2:1;1807:18;;1794:32;1835:33;1794:32;1835:33;:::i;:::-;1495:456;;1887:7;;-1:-1:-1;;;1941:2:1;1926:18;;;;1913:32;;1495:456::o;2145:180::-;2204:6;2257:2;2245:9;2236:7;2232:23;2228:32;2225:52;;;2273:1;2270;2263:12;2225:52;-1:-1:-1;2296:23:1;;2145:180;-1:-1:-1;2145:180:1:o;2330:247::-;2389:6;2442:2;2430:9;2421:7;2417:23;2413:32;2410:52;;;2458:1;2455;2448:12;2410:52;2497:9;2484:23;2516:31;2541:5;2516:31;:::i;:::-;2566:5;2330:247;-1:-1:-1;;;2330:247:1:o;2790:388::-;2858:6;2866;2919:2;2907:9;2898:7;2894:23;2890:32;2887:52;;;2935:1;2932;2925:12;2887:52;2974:9;2961:23;2993:31;3018:5;2993:31;:::i;:::-;3043:5;-1:-1:-1;3100:2:1;3085:18;;3072:32;3113:33;3072:32;3113:33;:::i;:::-;3165:7;3155:17;;;2790:388;;;;;:::o;3183:380::-;3262:1;3258:12;;;;3305;;;3326:61;;3380:4;3372:6;3368:17;3358:27;;3326:61;3433:2;3425:6;3422:14;3402:18;3399:38;3396:161;;;3479:10;3474:3;3470:20;3467:1;3460:31;3514:4;3511:1;3504:15;3542:4;3539:1;3532:15;3396:161;;3183:380;;;:::o;3568:225::-;3608:3;3639:1;3635:6;3632:1;3629:13;3626:136;;;3684:10;3679:3;3675:20;3672:1;3665:31;3719:4;3716:1;3709:15;3747:4;3744:1;3737:15;3626:136;-1:-1:-1;3778:9:1;;3568:225::o;3798:277::-;3865:6;3918:2;3906:9;3897:7;3893:23;3889:32;3886:52;;;3934:1;3931;3924:12;3886:52;3966:9;3960:16;4019:5;4012:13;4005:21;3998:5;3995:32;3985:60;;4041:1;4038;4031:12;4437:402;4639:2;4621:21;;;4678:2;4658:18;;;4651:30;4717:34;4712:2;4697:18;;4690:62;-1:-1:-1;;;4783:2:1;4768:18;;4761:36;4829:3;4814:19;;4437:402::o;5376:184::-;5446:6;5499:2;5487:9;5478:7;5474:23;5470:32;5467:52;;;5515:1;5512;5505:12;5467:52;-1:-1:-1;5538:16:1;;5376:184;-1:-1:-1;5376:184:1:o;9094:435::-;-1:-1:-1;;;9351:3:1;9344:31;9326:3;9404:6;9398:13;9420:62;9475:6;9470:2;9465:3;9461:12;9454:4;9446:6;9442:17;9420:62;:::i;:::-;9502:16;;;;9520:2;9498:25;;9094:435;-1:-1:-1;;9094:435:1:o;10424:251::-;10494:6;10547:2;10535:9;10526:7;10522:23;10518:32;10515:52;;;10563:1;10560;10553:12;10515:52;10595:9;10589:16;10614:31;10639:5;10614:31;:::i

Swarm Source

ipfs://8b4cd38cfce5300cdf805c32974f56dc906f92f258d1c6c81f2b0ece0f8d6868

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]

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