ETH Price: $3,465.31 (+1.59%)

Contract

0x99f790AdA7FA1BDC2a6B976293273EE51f10a10e
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To

There are no matching entries

Please try again later

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
CDSTemplate

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 10 : CDSTemplate.sol
pragma solidity 0.8.10;

/**
 * @author InsureDAO
 * @title InsureDAO CDS template contract
 * SPDX-License-Identifier: GPL-3.0
 */

import "./interfaces/IUniversalMarket.sol";
import "./InsureDAOERC20.sol";
import "./interfaces/IVault.sol";
import "./interfaces/IRegistry.sol";
import "./interfaces/IParameters.sol";
import "./interfaces/ICDSTemplate.sol";

contract CDSTemplate is InsureDAOERC20, ICDSTemplate, IUniversalMarket {
    /**
     * EVENTS
     */
    event Deposit(address indexed depositor, uint256 amount, uint256 mint);
    event Fund(address indexed depositor, uint256 amount, uint256 attribution);
    event Defund(
        address indexed depositor,
        uint256 amount,
        uint256 attribution
    );

    event WithdrawRequested(
        address indexed withdrawer,
        uint256 amount,
        uint256 unlockTime
    );
    event Withdraw(address indexed withdrawer, uint256 amount, uint256 retVal);
    event Compensated(address indexed index, uint256 amount);
    event Paused(bool paused);
    event MetadataChanged(string metadata);

    /**
     * Storage
     */
    /// @notice Market setting
    bool public initialized;
    bool public paused;
    string public metadata;

    /// @notice External contract call addresses
    IParameters public parameters;
    IRegistry public registry;
    IVault public vault;
    uint256 public surplusPool;
    uint256 public crowdPool;
    uint256 private constant MAGIC_SCALE_1E6 = 1e6; //internal multiplication scale 1e6 to reduce decimal truncation

    ///@notice user status management
    struct Withdrawal {
        uint256 timestamp;
        uint256 amount;
    }
    mapping(address => Withdrawal) public withdrawalReq;

    /**
     * @notice Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(
            msg.sender == parameters.getOwner(),
            "ERROR: ONLY_OWNER"
        );
        _;
    }

    constructor() {
        initialized = true;
    }

    /**
     * Initialize interaction
     */

    /**
     * @notice Initialize market
     * This function registers market conditions.
     * references[0] = underlying token address
     * references[1] = registry
     * references[2] = parameter
     * @param _metaData arbitrary string to store market information
     * @param _conditions array of conditions
     * @param _references array of references
     */
    function initialize(
        address _depositor,
        string calldata _metaData,
        uint256[] calldata _conditions,
        address[] calldata _references
    ) external override{
        require(
            !initialized &&
                bytes(_metaData).length != 0 &&
                _references[0] != address(0) &&
                _references[1] != address(0) &&
                _references[2] != address(0),
            "INITIALIZATION_BAD_CONDITIONS"
        );

        initialized = true;

        initializeToken("InsureDAO-Reserve", "iReserve", IERC20Metadata(_references[0]).decimals());

        parameters = IParameters(_references[2]);
        vault = IVault(parameters.getVault(_references[0]));
        registry = IRegistry(_references[1]);

        metadata = _metaData;
    }

    /**
     * Pool initeractions
     */

    /**
     * @notice A liquidity provider supplies collatral to the pool and receives iTokens
     * @param _amount amount of token to deposit
     */
    function deposit(uint256 _amount) external returns (uint256 _mintAmount) {
        require(!paused, "ERROR: PAUSED");
        require(_amount != 0, "ERROR: DEPOSIT_ZERO");

        //deposit and pay fees
        uint256 _liquidity = vault.attributionValue(crowdPool); //get USDC balance with crowdPool's attribution
        uint256 _supply = totalSupply();

        crowdPool += vault.addValue(_amount, msg.sender, address(this)); //increase attribution

        if (_supply != 0) {
            _mintAmount = _liquidity == 0 ? _amount * _supply : (_amount * _supply) / _liquidity;
        } else {
            _mintAmount = _amount;
        }

        emit Deposit(msg.sender, _amount, _mintAmount);

        //mint iToken
        _mint(msg.sender, _mintAmount);
    }

    /**
     * @notice A depositor supplies fund to the pool without receiving iTokens
     * @param _amount amount of token to deposit
     */
    function fund(uint256 _amount) external {
        require(!paused, "ERROR: PAUSED");

        //deposit and pay fees
        uint256 _attribution = vault.addValue(
            _amount,
            msg.sender,
            address(this)
        );

        surplusPool += _attribution;

        emit Fund(msg.sender, _amount, _attribution);
    }

    function defund(address _to, uint256 _amount) external override onlyOwner {
        require(!paused, "ERROR: PAUSED");

        uint256 _attribution = vault.withdrawValue(_amount, _to);
        surplusPool -= _attribution;

        emit Defund(_to, _amount, _attribution);
    }

    /**
     * @notice A liquidity provider request withdrawal of collateral
     * @param _amount amount of iToken to burn
     */
    function requestWithdraw(uint256 _amount) external {
        require(_amount != 0, "ERROR: REQUEST_ZERO");
        require(balanceOf(msg.sender) >= _amount, "ERROR: REQUEST_EXCEED_BALANCE");

        uint256 _unlocksAt = block.timestamp + parameters.getLockup(address(this));

        withdrawalReq[msg.sender].timestamp = _unlocksAt;
        withdrawalReq[msg.sender].amount = _amount;

        emit WithdrawRequested(msg.sender, _amount, _unlocksAt);
    }

    /**
     * @notice A liquidity provider burns iToken and receives collatral from the pool
     * @param _amount amount of iToken to burn
     * @return _retVal the amount underlying token returned
     */
    function withdraw(uint256 _amount) external returns (uint256 _retVal) {
        require(!paused, "ERROR: PAUSED");
        require(_amount != 0, "ERROR: WITHDRAWAL_ZERO");
        
        Withdrawal memory request = withdrawalReq[msg.sender];
        
        require(
            request.timestamp <
                block.timestamp,
            "ERROR: WITHDRAWAL_QUEUE"
        );
        require(
            request.timestamp +
                parameters.getWithdrawable(address(this)) >
                block.timestamp,
            "WITHDRAWAL_NO_ACTIVE_REQUEST"
        );
        require(
            request.amount >= _amount,
            "WITHDRAWAL_EXCEEDED_REQUEST"
        );

        //Calculate underlying value
        uint256 _totalSupply = totalSupply();
        if (_totalSupply != 0) {
            _retVal = (vault.attributionValue(crowdPool) * _amount) / _totalSupply;
        }


        //reduce requested amount
        withdrawalReq[msg.sender].amount -= _amount;

        //Burn iToken
        _burn(msg.sender, _amount);

        //Withdraw liquidity
        crowdPool -= vault.withdrawValue(_retVal, msg.sender);
        emit Withdraw(msg.sender, _amount, _retVal);
    }

    /**
     * Insurance interactions
     */

    /**
     * @notice Compensate the shortage if an index is insolvent
     * @param _amount amount of underlier token to compensate shortage within index
     */
    function compensate(uint256 _amount)
        external
        override
        returns (uint256 _compensated)
    {
        require(registry.isListed(msg.sender), "ERROR:UNREGISTERED");
        
        uint256 _available = vault.underlyingValue(address(this));
        uint256 _crowdAttribution = crowdPool;
        uint256 _attributionLoss;

        //when CDS cannot afford, pay as much as possible
        _compensated = _available >= _amount ? _amount : _available;
        _attributionLoss = vault.transferValue(_compensated, msg.sender);
        emit Compensated(msg.sender, _compensated);

        uint256 _crowdPoolLoss =
            (_crowdAttribution * _attributionLoss) /
            (_crowdAttribution + surplusPool);

        crowdPool -= _crowdPoolLoss;
        surplusPool -= (_attributionLoss - _crowdPoolLoss);
    }

    /**
     * Utilities
     */

    /**
     * @notice total Liquidity of the pool (how much can the pool sell cover)
     * @return available liquidity of this pool
     */
    function totalLiquidity() external view returns (uint256) {
        return vault.underlyingValue(address(this));
    }

    /**
     * @notice Get the exchange rate of LP token against underlying asset(scaled by MAGIC_SCALE_1E6, if MAGIC_SCALE_1E6, the value of iToken vs underlier is 1:1)
     * @return The value against the underlying token balance.
     */
    function rate() external view returns (uint256) {
        uint256 _totalSupply = totalSupply();
        if (_totalSupply != 0) {
            return
                (vault.attributionValue(crowdPool) * MAGIC_SCALE_1E6) / _totalSupply;
        }
    }

    /**
     * @notice Get the underlying balance of the `owner`
     * @param _owner the target address to look up value
     * @return The balance of underlying token for the specified address
     */
    function valueOfUnderlying(address _owner) external view returns (uint256) {
        uint256 _balance = balanceOf(_owner);
        uint256 _totalSupply = totalSupply();
        
        if (_balance != 0 || _totalSupply != 0) {
            return _balance * vault.attributionValue(crowdPool) / _totalSupply;
        }
    }

    /**
     * Admin functions
     */

    /**
     * @notice Change metadata string
     * @param _metadata new metadata string
     */
    function changeMetadata(string calldata _metadata)
        external
        override
        onlyOwner
    {
        metadata = _metadata;
        emit MetadataChanged(_metadata);
    }

    /**
     * @notice Used for changing settlementFeeRecipient
     * @param _state true to set paused and vice versa
     */
    function setPaused(bool _state) external override onlyOwner {
        if (paused != _state) {
            paused = _state;
            emit Paused(_state);
        }
    }

    /**
     * Internal functions
     */

    /**
     * @notice Internal function to offset withdraw request and latest balance
     * @param from the account who send
     * @param to a
     * @param amount the amount of token to offset
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, amount);

        if (from != address(0)) {
            uint256 _after = balanceOf(from) - amount;
            if (_after < withdrawalReq[from].amount) {
                withdrawalReq[from].amount = _after;
            }
        }
    }
}

File 2 of 10 : IUniversalMarket.sol
pragma solidity 0.8.10;

interface IUniversalMarket {
    function initialize(
        address _depositor,
        string calldata _metaData,
        uint256[] calldata _conditions,
        address[] calldata _references
    ) external;

    //onlyOwner
    function setPaused(bool state) external;
    function changeMetadata(string calldata _metadata) external;
}

File 3 of 10 : InsureDAOERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.10;

import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";
import "@openzeppelin/contracts/utils/Context.sol";

contract InsureDAOERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    bool tokenInitialized;
    string private _name = "InsureDAO LP Token";
    string private _symbol = "iLP";
    uint8 private _decimals = 18;

    function initializeToken(
        string memory name_,
        string memory symbol_,
        uint8 decimals_
    ) internal {
        /***
         *@notice initialize token. Only called internally.
         *
         */
        require(!tokenInitialized, "Token is already initialized");
        tokenInitialized = true;
        _name = name_;
        _symbol = symbol_;
        _decimals = decimals_;
    }

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

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

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless this function is
     * 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() external view virtual override returns (uint8) {
        return _decimals;
    }

    /**
     * @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:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount)
        external
        virtual
        override
        returns (bool)
    {
        _transfer(msg.sender, recipient, amount);
        return true;
    }

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

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount)
        external
        virtual
        override
        returns (bool)
    {
        _approve(msg.sender, spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * Requirements:
     *
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external virtual override returns (bool) {
        if (amount != 0) {
            uint256 currentAllowance = _allowances[sender][msg.sender];
            if (currentAllowance != type(uint256).max) {
                require(
                    currentAllowance >= amount,
                    "Transfer amount > allowance"
                );
                unchecked {
                    _approve(sender, msg.sender, currentAllowance - amount);
                }
            }
            
            _transfer(sender, recipient, 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)
        external
        virtual
        returns (bool)
    {
        if (addedValue != 0) {
            _approve(
                msg.sender,
                spender,
                _allowances[msg.sender][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)
        external
        virtual
        returns (bool)
    {
        if (subtractedValue != 0) {
            uint256 currentAllowance = _allowances[msg.sender][spender];
            require(
                currentAllowance >= subtractedValue,
                "Decreased allowance below zero"
            );

            _approve(msg.sender, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `sender` to `recipient`.
     *
     * 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:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal virtual {
        if (amount != 0) {
            require(sender != address(0), "Transfer from the zero address");
            require(recipient != address(0), "Transfer to the zero address");

            _beforeTokenTransfer(sender, recipient, amount);

            uint256 senderBalance = _balances[sender];
            require(
                senderBalance >= amount,
                "Transfer amount exceeds balance"
            );

            unchecked {
                _balances[sender] = senderBalance - amount;
            }

            _balances[recipient] += amount;

            emit Transfer(sender, recipient, amount);

            _afterTokenTransfer(sender, recipient, amount);
        }
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        if (amount != 0) {
            require(account != address(0), "Mint to the zero address");

            _beforeTokenTransfer(address(0), account, amount);

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

            _afterTokenTransfer(address(0), account, amount);
        }
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        if (amount != 0) {
            require(account != address(0), "Burn from the zero address");

            _beforeTokenTransfer(account, address(0), amount);

            uint256 accountBalance = _balances[account];
            require(accountBalance >= amount, "Burn amount exceeds balance");
            unchecked {
                _balances[account] = accountBalance - amount;
            }

            _totalSupply -= amount;

            emit Transfer(account, address(0), amount);

            _afterTokenTransfer(account, address(0), amount);
        }
    }

    /**
     * @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), "Approve from the zero address");
        require(spender != address(0), "Approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, 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].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

File 4 of 10 : IVault.sol
pragma solidity 0.8.10;

interface IVault {
    function addValueBatch(
        uint256 _amount,
        address _from,
        address[2] memory _beneficiaries,
        uint256[2] memory _shares
    ) external returns (uint256[2] memory _allocations);

    function addValue(
        uint256 _amount,
        address _from,
        address _attribution
    ) external returns (uint256 _attributions);

    function withdrawValue(uint256 _amount, address _to)
        external
        returns (uint256 _attributions);

    function transferValue(uint256 _amount, address _destination)
        external
        returns (uint256 _attributions);

    function withdrawAttribution(uint256 _attribution, address _to)
        external
        returns (uint256 _retVal);

    function withdrawAllAttribution(address _to)
        external
        returns (uint256 _retVal);

    function transferAttribution(uint256 _amount, address _destination)
        external;

    function attributionOf(address _target) external view returns (uint256);

    function underlyingValue(address _target) external view returns (uint256);

    function attributionValue(uint256 _attribution)
        external
        view
        returns (uint256);

    function utilize() external returns (uint256 _amount);
    function valueAll() external view returns (uint256);


    function token() external returns (address);

    function borrowValue(uint256 _amount, address _to) external;

    /*
    function borrowAndTransfer(uint256 _amount, address _to)
        external
        returns (uint256 _attributions);
    */

    function offsetDebt(uint256 _amount, address _target)
        external
        returns (uint256 _attributions);

    function repayDebt(uint256 _amount, address _target) external;

    function debts(address _debtor) external view returns (uint256);

    function transferDebt(uint256 _amount) external;

    //onlyOwner
    function withdrawRedundant(address _token, address _to) external;

    function setController(address _controller) external;

    function setKeeper(address _keeper) external;
}

File 5 of 10 : IRegistry.sol
pragma solidity 0.8.10;

interface IRegistry {
    function isListed(address _market) external view returns (bool);

    function getCDS(address _address) external view returns (address);

    function confirmExistence(address _template, address _target)
        external
        view
        returns (bool);

    //onlyOwner
    function setFactory(address _factory) external;

    function supportMarket(address _market) external;

    function setExistence(address _template, address _target) external;

    function setCDS(address _address, address _cds) external;
}

File 6 of 10 : IParameters.sol
pragma solidity 0.8.10;

abstract contract IParameters {
    function setVault(address _token, address _vault) external virtual;

    function setLockup(address _address, uint256 _target) external virtual;

    function setGrace(address _address, uint256 _target) external virtual;

    function setMinDate(address _address, uint256 _target) external virtual;

    function setUpperSlack(address _address, uint256 _target) external virtual;

    function setLowerSlack(address _address, uint256 _target) external virtual;

    function setWithdrawable(address _address, uint256 _target)
        external
        virtual;

    function setPremiumModel(address _address, address _target)
        external
        virtual;

    function setFeeRate(address _address, uint256 _target) external virtual;

    function setMaxList(address _address, uint256 _target) external virtual;

    function setCondition(bytes32 _reference, bytes32 _target) external virtual;

    function getOwner() external view virtual returns (address);

    function getVault(address _token) external view virtual returns (address);

    function getPremium(
        uint256 _amount,
        uint256 _term,
        uint256 _totalLiquidity,
        uint256 _lockedAmount,
        address _target
    ) external view virtual returns (uint256);

    function getFeeRate(address _target) external view virtual returns (uint256);

    function getUpperSlack(address _target)
        external
        view
        virtual
        returns (uint256);

    function getLowerSlack(address _target)
        external
        view
        virtual
        returns (uint256);

    function getLockup(address _target) external view virtual returns (uint256);

    function getWithdrawable(address _target)
        external
        view
        virtual
        returns (uint256);

    function getGrace(address _target) external view virtual returns (uint256);

    function getMinDate(address _target) external view virtual returns (uint256);

    function getMaxList(address _target)
        external
        view
        virtual
        returns (uint256);

    function getCondition(bytes32 _reference)
        external
        view
        virtual
        returns (bytes32);
}

File 7 of 10 : ICDSTemplate.sol
pragma solidity 0.8.10;

interface ICDSTemplate {
    function compensate(uint256) external returns (uint256 _compensated);

    //onlyOwner
    function defund(address _to, uint256 _amount) external;
}

File 8 of 10 : IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

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

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

File 9 of 10 : IERC20Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;

import "../IERC20.sol";

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
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 10 of 10 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"index","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Compensated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"depositor","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"attribution","type":"uint256"}],"name":"Defund","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"depositor","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"mint","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"depositor","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"attribution","type":"uint256"}],"name":"Fund","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"metadata","type":"string"}],"name":"MetadataChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"paused","type":"bool"}],"name":"Paused","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"withdrawer","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"retVal","type":"uint256"}],"name":"Withdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"withdrawer","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"unlockTime","type":"uint256"}],"name":"WithdrawRequested","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":"string","name":"_metadata","type":"string"}],"name":"changeMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"compensate","outputs":[{"internalType":"uint256","name":"_compensated","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"crowdPool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"defund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"fund","outputs":[],"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":"address","name":"_depositor","type":"address"},{"internalType":"string","name":"_metaData","type":"string"},{"internalType":"uint256[]","name":"_conditions","type":"uint256[]"},{"internalType":"address[]","name":"_references","type":"address[]"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"metadata","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"parameters","outputs":[{"internalType":"contract IParameters","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"registry","outputs":[{"internalType":"contract IRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"requestWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"surplusPool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalLiquidity","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":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"valueOfUnderlying","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vault","outputs":[{"internalType":"contract IVault","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"_retVal","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"withdrawalReq","outputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"}]

60c0604052601260808190527124b739bab932a220a7902628102a37b5b2b760711b60a090815262000035916004919062000093565b50604080518082019091526003808252620694c560ec1b6020909201918252620000629160059162000093565b506006805460ff191660121790553480156200007d57600080fd5b506006805461ff00191661010017905562000176565b828054620000a19062000139565b90600052602060002090601f016020900481019282620000c5576000855562000110565b82601f10620000e057805160ff191683800117855562000110565b8280016001018555821562000110579182015b8281111562000110578251825591602001919060010190620000f3565b506200011e92915062000122565b5090565b5b808211156200011e576000815560010162000123565b600181811c908216806200014e57607f821691505b602082108114156200017057634e487b7160e01b600052602260045260246000fd5b50919050565b61270380620001866000396000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c806376c5c7e41161010f578063ac738742116100a2578063d9b6225e11610071578063d9b6225e14610441578063dd62ed3e14610454578063f46c0f291461048d578063fbfa77cf146104a057600080fd5b8063ac738742146103f5578063b3c6326b14610408578063b6b55f251461041b578063ca1d209d1461042e57600080fd5b806395d89b41116100de57806395d89b41146103be5780639f4eeb86146103c6578063a457c2d7146103cf578063a9059cbb146103e257600080fd5b806376c5c7e4146103645780637b1039991461036d578063890357301461039857806395b23d86146103ab57600080fd5b80632e1a7d4d11610187578063395093511161015657806339509351146103025780635c975abb1461031557806370a0823114610328578063745400c91461035157600080fd5b80632e1a7d4d14610296578063313ce567146102a957806335c84548146102be578063392f37e9146102fa57600080fd5b806316c38b3c116101c357806316c38b3c1461025e57806318160ddd1461027357806323b872dd1461027b5780632c4e722e1461028e57600080fd5b806306fdde03146101f5578063095ea7b31461021357806315770f9214610236578063158ef93e1461024c575b600080fd5b6101fd6104b3565b60405161020a919061220a565b60405180910390f35b610226610221366004612274565b610545565b604051901515815260200161020a565b61023e61055b565b60405190815260200161020a565b60065461022690610100900460ff1681565b61027161026c3660046122ae565b6105cd565b005b60025461023e565b6102266102893660046122d2565b6106eb565b61023e610794565b61023e6102a4366004612313565b610843565b60065460405160ff909116815260200161020a565b6102e56102cc36600461232c565b600d602052600090815260409020805460019091015482565b6040805192835260208301919091520161020a565b6101fd610bec565b610226610310366004612274565b610c7a565b6006546102269062010000900460ff1681565b61023e61033636600461232c565b6001600160a01b031660009081526020819052604090205490565b61027161035f366004612313565b610cbd565b61023e600c5481565b600954610380906001600160a01b031681565b6040516001600160a01b03909116815260200161020a565b600854610380906001600160a01b031681565b6102716103b93660046123d7565b610e32565b6101fd611187565b61023e600b5481565b6102266103dd366004612274565b611196565b6102266103f0366004612274565b61122b565b61023e61040336600461232c565b611238565b610271610416366004612274565b611304565b61023e610429366004612313565b6114ae565b61027161043c366004612313565b6116ae565b61027161044f366004612484565b6117a4565b61023e6104623660046124c6565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b61023e61049b366004612313565b611895565b600a54610380906001600160a01b031681565b6060600480546104c2906124ff565b80601f01602080910402602001604051908101604052809291908181526020018280546104ee906124ff565b801561053b5780601f106105105761010080835404028352916020019161053b565b820191906000526020600020905b81548152906001019060200180831161051e57829003601f168201915b5050505050905090565b6000610552338484611ade565b50600192915050565b600a546040516317cf780960e11b81523060048201526000916001600160a01b031690632f9ef01290602401602060405180830381865afa1580156105a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105c8919061253a565b905090565b600860009054906101000a90046001600160a01b03166001600160a01b031663893d20e86040518163ffffffff1660e01b8152600401602060405180830381865afa158015610620573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106449190612553565b6001600160a01b0316336001600160a01b03161461067d5760405162461bcd60e51b815260040161067490612570565b60405180910390fd5b60065460ff62010000909104161515811515146106e85760068054821515620100000262ff0000199091161790556040517f0e2fb031ee032dc02d8011dc50b816eb450cf856abd8261680dac74f72165bd2906106df90831515815260200190565b60405180910390a15b50565b6000811561078a576001600160a01b0384166000908152600160209081526040808320338452909152902054600019811461077d57828110156107705760405162461bcd60e51b815260206004820152601b60248201527f5472616e7366657220616d6f756e74203e20616c6c6f77616e636500000000006044820152606401610674565b61077d8533858403611ade565b610788858585611beb565b505b5060019392505050565b6000806107a060025490565b9050801561083f57600a54600c5460405163f8ba677f60e01b81528392620f4240926001600160a01b039091169163f8ba677f916107e49160040190815260200190565b602060405180830381865afa158015610801573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610825919061253a565b61082f91906125b1565b61083991906125d0565b91505090565b5090565b60065460009062010000900460ff161561086f5760405162461bcd60e51b8152600401610674906125f2565b816108b55760405162461bcd60e51b81526020600482015260166024820152754552524f523a205749544844524157414c5f5a45524f60501b6044820152606401610674565b336000908152600d6020908152604091829020825180840190935280548084526001909101549183019190915242116109305760405162461bcd60e51b815260206004820152601760248201527f4552524f523a205749544844524157414c5f51554555450000000000000000006044820152606401610674565b600854604051631966357360e11b815230600482015242916001600160a01b0316906332cc6ae690602401602060405180830381865afa158015610978573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061099c919061253a565b82516109a89190612619565b116109f55760405162461bcd60e51b815260206004820152601c60248201527f5749544844524157414c5f4e4f5f4143544956455f52455155455354000000006044820152606401610674565b8281602001511015610a495760405162461bcd60e51b815260206004820152601b60248201527f5749544844524157414c5f45584345454445445f5245515545535400000000006044820152606401610674565b6000610a5460025490565b90508015610aed57600a54600c5460405163f8ba677f60e01b8152839287926001600160a01b039091169163f8ba677f91610a959160040190815260200190565b602060405180830381865afa158015610ab2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ad6919061253a565b610ae091906125b1565b610aea91906125d0565b92505b336000908152600d602052604081206001018054869290610b0f908490612631565b90915550610b1f90503385611da4565b600a546040516308b67eeb60e41b8152600481018590523360248201526001600160a01b0390911690638b67eeb0906044016020604051808303816000875af1158015610b70573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b94919061253a565b600c6000828254610ba59190612631565b9091555050604080518581526020810185905233917ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b568910160405180910390a25050919050565b60078054610bf9906124ff565b80601f0160208091040260200160405190810160405280929190818152602001828054610c25906124ff565b8015610c725780601f10610c4757610100808354040283529160200191610c72565b820191906000526020600020905b815481529060010190602001808311610c5557829003601f168201915b505050505081565b60008115610552573360008181526001602090815260408083206001600160a01b038816845290915290205461055291908590610cb8908690612619565b611ade565b80610d005760405162461bcd60e51b81526020600482015260136024820152724552524f523a20524551554553545f5a45524f60681b6044820152606401610674565b33600090815260208190526040902054811115610d5f5760405162461bcd60e51b815260206004820152601d60248201527f4552524f523a20524551554553545f4558434545445f42414c414e43450000006044820152606401610674565b6008546040516319ebf47360e21b81523060048201526000916001600160a01b0316906367afd1cc90602401602060405180830381865afa158015610da8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dcc919061253a565b610dd69042612619565b336000818152600d6020908152604091829020848155600101869055815186815290810184905292935090917fd72eb5d043f24a0168ae744d5c44f9596fd673a26bf74d9646bff4b844882d1491015b60405180910390a25050565b600654610100900460ff16158015610e4957508415155b8015610e835750600082828281610e6257610e62612648565b9050602002016020810190610e77919061232c565b6001600160a01b031614155b8015610ec05750600082826001818110610e9f57610e9f612648565b9050602002016020810190610eb4919061232c565b6001600160a01b031614155b8015610efd5750600082826002818110610edc57610edc612648565b9050602002016020810190610ef1919061232c565b6001600160a01b031614155b610f495760405162461bcd60e51b815260206004820152601d60248201527f494e495449414c495a4154494f4e5f4241445f434f4e444954494f4e530000006044820152606401610674565b6006805461ff0019166101001790556040805180820182526011815270496e7375726544414f2d5265736572766560781b60208083019190915282518084019093526008835267695265736572766560c01b9083015261102f918484600081610fb457610fb4612648565b9050602002016020810190610fc9919061232c565b6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015611006573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061102a919061265e565b611ef3565b8181600281811061104257611042612648565b9050602002016020810190611057919061232c565b600880546001600160a01b0319166001600160a01b03929092169182179055630eb9af38838360008161108c5761108c612648565b90506020020160208101906110a1919061232c565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa1580156110e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111099190612553565b600a80546001600160a01b0319166001600160a01b03929092169190911790558181600181811061113c5761113c612648565b9050602002016020810190611151919061232c565b600980546001600160a01b0319166001600160a01b039290921691909117905561117d60078787612101565b5050505050505050565b6060600580546104c2906124ff565b60008115610552573360009081526001602090815260408083206001600160a01b0387168452909152902054828110156112125760405162461bcd60e51b815260206004820152601e60248201527f44656372656173656420616c6c6f77616e63652062656c6f77207a65726f00006044820152606401610674565b6112213385610cb88685612631565b5050600192915050565b6000610552338484611beb565b6001600160a01b038116600090815260208190526040812054600061125c60025490565b90508115158061126b57508015155b156112fd57600a54600c5460405163f8ba677f60e01b8152600481019190915282916001600160a01b03169063f8ba677f90602401602060405180830381865afa1580156112bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112e1919061253a565b6112eb90846125b1565b6112f591906125d0565b949350505050565b5050919050565b600860009054906101000a90046001600160a01b03166001600160a01b031663893d20e86040518163ffffffff1660e01b8152600401602060405180830381865afa158015611357573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061137b9190612553565b6001600160a01b0316336001600160a01b0316146113ab5760405162461bcd60e51b815260040161067490612570565b60065462010000900460ff16156113d45760405162461bcd60e51b8152600401610674906125f2565b600a546040516308b67eeb60e41b8152600481018390526001600160a01b0384811660248301526000921690638b67eeb0906044016020604051808303816000875af1158015611428573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061144c919061253a565b905080600b60008282546114609190612631565b909155505060408051838152602081018390526001600160a01b038516917fe9e9312f917b35fb7a78a82a542d590fce99674a477a735962ea84c05738d2cb910160405180910390a2505050565b60065460009062010000900460ff16156114da5760405162461bcd60e51b8152600401610674906125f2565b8161151d5760405162461bcd60e51b81526020600482015260136024820152724552524f523a204445504f5349545f5a45524f60681b6044820152606401610674565b600a54600c5460405163f8ba677f60e01b815260048101919091526000916001600160a01b03169063f8ba677f90602401602060405180830381865afa15801561156b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061158f919061253a565b9050600061159c60025490565b600a54604051635547056160e11b8152600481018790523360248201523060448201529192506001600160a01b03169063aa8e0ac2906064016020604051808303816000875af11580156115f4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611618919061253a565b600c60008282546116299190612619565b90915550508015611665578115611654578161164582866125b1565b61164f91906125d0565b61165e565b61165e81856125b1565b9250611669565b8392505b604080518581526020810185905233917f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15910160405180910390a26112fd3384611f93565b60065462010000900460ff16156116d75760405162461bcd60e51b8152600401610674906125f2565b600a54604051635547056160e11b8152600481018390523360248201523060448201526000916001600160a01b03169063aa8e0ac2906064016020604051808303816000875af115801561172f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611753919061253a565b905080600b60008282546117679190612619565b9091555050604080518381526020810183905233917fd5321498ebef1d048889992d8457d0f50576d300db1fd93488480c1f57a656019101610e26565b600860009054906101000a90046001600160a01b03166001600160a01b031663893d20e86040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061181b9190612553565b6001600160a01b0316336001600160a01b03161461184b5760405162461bcd60e51b815260040161067490612570565b61185760078383612101565b507fc5e8f06e682be1cb96bb6e6f0b17a64299e4f96d2e3d04003c3d9c3a8de22f3d8282604051611889929190612681565b60405180910390a15050565b600954604051637bca031760e11b81523360048201526000916001600160a01b03169063f794062e90602401602060405180830381865afa1580156118de573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061190291906126b0565b6119435760405162461bcd60e51b815260206004820152601260248201527111549493d48e9553949151d254d51154915160721b6044820152606401610674565b600a546040516317cf780960e11b81523060048201526000916001600160a01b031690632f9ef01290602401602060405180830381865afa15801561198c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119b0919061253a565b600c549091506000848310156119c657826119c8565b845b600a54604051636f25f1ad60e11b8152600481018390523360248201529195506001600160a01b03169063de4be35a906044016020604051808303816000875af1158015611a1a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a3e919061253a565b60405185815290915033907f3fc2682c72ca4b385712df78cbb3df71f24e438d7bec95d338a1ddf28b410f549060200160405180910390a26000600b5483611a869190612619565b611a9083856125b1565b611a9a91906125d0565b905080600c6000828254611aae9190612631565b90915550611abe90508183612631565b600b6000828254611acf9190612631565b90915550949695505050505050565b6001600160a01b038316611b345760405162461bcd60e51b815260206004820152601d60248201527f417070726f76652066726f6d20746865207a65726f20616464726573730000006044820152606401610674565b6001600160a01b038216611b8a5760405162461bcd60e51b815260206004820152601b60248201527f417070726f766520746f20746865207a65726f206164647265737300000000006044820152606401610674565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b8015611d9f576001600160a01b038316611c475760405162461bcd60e51b815260206004820152601e60248201527f5472616e736665722066726f6d20746865207a65726f206164647265737300006044820152606401610674565b6001600160a01b038216611c9d5760405162461bcd60e51b815260206004820152601c60248201527f5472616e7366657220746f20746865207a65726f2061646472657373000000006044820152606401610674565b611ca8838383612084565b6001600160a01b03831660009081526020819052604090205481811015611d115760405162461bcd60e51b815260206004820152601f60248201527f5472616e7366657220616d6f756e7420657863656564732062616c616e6365006044820152606401610674565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290611d48908490612619565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611d9491815260200190565b60405180910390a35b505b505050565b8015611eef576001600160a01b038216611e005760405162461bcd60e51b815260206004820152601a60248201527f4275726e2066726f6d20746865207a65726f20616464726573730000000000006044820152606401610674565b611e0c82600083612084565b6001600160a01b03821660009081526020819052604090205481811015611e755760405162461bcd60e51b815260206004820152601b60248201527f4275726e20616d6f756e7420657863656564732062616c616e636500000000006044820152606401610674565b6001600160a01b0383166000908152602081905260408120838303905560028054849290611ea4908490612631565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b5050565b60035460ff1615611f465760405162461bcd60e51b815260206004820152601c60248201527f546f6b656e20697320616c726561647920696e697469616c697a6564000000006044820152606401610674565b6003805460ff191660011790558251611f66906004906020860190612181565b508151611f7a906005906020850190612181565b506006805460ff191660ff929092169190911790555050565b8015611eef576001600160a01b038216611fef5760405162461bcd60e51b815260206004820152601860248201527f4d696e7420746f20746865207a65726f206164647265737300000000000000006044820152606401610674565b611ffb60008383612084565b806002600082825461200d9190612619565b90915550506001600160a01b0382166000908152602081905260408120805483929061203a908490612619565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6001600160a01b03831615611d9f576001600160a01b0383166000908152602081905260408120546120b7908390612631565b6001600160a01b0385166000908152600d6020526040902060010154909150811015611d9d576001600160a01b0384166000908152600d6020526040902060010181905550505050565b82805461210d906124ff565b90600052602060002090601f01602090048101928261212f5760008555612175565b82601f106121485782800160ff19823516178555612175565b82800160010185558215612175579182015b8281111561217557823582559160200191906001019061215a565b5061083f9291506121f5565b82805461218d906124ff565b90600052602060002090601f0160209004810192826121af5760008555612175565b82601f106121c857805160ff1916838001178555612175565b82800160010185558215612175579182015b828111156121755782518255916020019190600101906121da565b5b8082111561083f57600081556001016121f6565b600060208083528351808285015260005b818110156122375785810183015185820160400152820161221b565b81811115612249576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b03811681146106e857600080fd5b6000806040838503121561228757600080fd5b82356122928161225f565b946020939093013593505050565b80151581146106e857600080fd5b6000602082840312156122c057600080fd5b81356122cb816122a0565b9392505050565b6000806000606084860312156122e757600080fd5b83356122f28161225f565b925060208401356123028161225f565b929592945050506040919091013590565b60006020828403121561232557600080fd5b5035919050565b60006020828403121561233e57600080fd5b81356122cb8161225f565b60008083601f84011261235b57600080fd5b50813567ffffffffffffffff81111561237357600080fd5b60208301915083602082850101111561238b57600080fd5b9250929050565b60008083601f8401126123a457600080fd5b50813567ffffffffffffffff8111156123bc57600080fd5b6020830191508360208260051b850101111561238b57600080fd5b60008060008060008060006080888a0312156123f257600080fd5b87356123fd8161225f565b9650602088013567ffffffffffffffff8082111561241a57600080fd5b6124268b838c01612349565b909850965060408a013591508082111561243f57600080fd5b61244b8b838c01612392565b909650945060608a013591508082111561246457600080fd5b506124718a828b01612392565b989b979a50959850939692959293505050565b6000806020838503121561249757600080fd5b823567ffffffffffffffff8111156124ae57600080fd5b6124ba85828601612349565b90969095509350505050565b600080604083850312156124d957600080fd5b82356124e48161225f565b915060208301356124f48161225f565b809150509250929050565b600181811c9082168061251357607f821691505b6020821081141561253457634e487b7160e01b600052602260045260246000fd5b50919050565b60006020828403121561254c57600080fd5b5051919050565b60006020828403121561256557600080fd5b81516122cb8161225f565b60208082526011908201527022a92927a91d1027a7262cafa7aba722a960791b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60008160001904831182151516156125cb576125cb61259b565b500290565b6000826125ed57634e487b7160e01b600052601260045260246000fd5b500490565b6020808252600d908201526c11549493d48e8814105554d151609a1b604082015260600190565b6000821982111561262c5761262c61259b565b500190565b6000828210156126435761264361259b565b500390565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561267057600080fd5b815160ff811681146122cb57600080fd5b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b6000602082840312156126c257600080fd5b81516122cb816122a056fea26469706673582212202d4ad8b8f59382448eeadeb6532d129fe996082b668197c321c78c2f728216a964736f6c634300080a0033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101f05760003560e01c806376c5c7e41161010f578063ac738742116100a2578063d9b6225e11610071578063d9b6225e14610441578063dd62ed3e14610454578063f46c0f291461048d578063fbfa77cf146104a057600080fd5b8063ac738742146103f5578063b3c6326b14610408578063b6b55f251461041b578063ca1d209d1461042e57600080fd5b806395d89b41116100de57806395d89b41146103be5780639f4eeb86146103c6578063a457c2d7146103cf578063a9059cbb146103e257600080fd5b806376c5c7e4146103645780637b1039991461036d578063890357301461039857806395b23d86146103ab57600080fd5b80632e1a7d4d11610187578063395093511161015657806339509351146103025780635c975abb1461031557806370a0823114610328578063745400c91461035157600080fd5b80632e1a7d4d14610296578063313ce567146102a957806335c84548146102be578063392f37e9146102fa57600080fd5b806316c38b3c116101c357806316c38b3c1461025e57806318160ddd1461027357806323b872dd1461027b5780632c4e722e1461028e57600080fd5b806306fdde03146101f5578063095ea7b31461021357806315770f9214610236578063158ef93e1461024c575b600080fd5b6101fd6104b3565b60405161020a919061220a565b60405180910390f35b610226610221366004612274565b610545565b604051901515815260200161020a565b61023e61055b565b60405190815260200161020a565b60065461022690610100900460ff1681565b61027161026c3660046122ae565b6105cd565b005b60025461023e565b6102266102893660046122d2565b6106eb565b61023e610794565b61023e6102a4366004612313565b610843565b60065460405160ff909116815260200161020a565b6102e56102cc36600461232c565b600d602052600090815260409020805460019091015482565b6040805192835260208301919091520161020a565b6101fd610bec565b610226610310366004612274565b610c7a565b6006546102269062010000900460ff1681565b61023e61033636600461232c565b6001600160a01b031660009081526020819052604090205490565b61027161035f366004612313565b610cbd565b61023e600c5481565b600954610380906001600160a01b031681565b6040516001600160a01b03909116815260200161020a565b600854610380906001600160a01b031681565b6102716103b93660046123d7565b610e32565b6101fd611187565b61023e600b5481565b6102266103dd366004612274565b611196565b6102266103f0366004612274565b61122b565b61023e61040336600461232c565b611238565b610271610416366004612274565b611304565b61023e610429366004612313565b6114ae565b61027161043c366004612313565b6116ae565b61027161044f366004612484565b6117a4565b61023e6104623660046124c6565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b61023e61049b366004612313565b611895565b600a54610380906001600160a01b031681565b6060600480546104c2906124ff565b80601f01602080910402602001604051908101604052809291908181526020018280546104ee906124ff565b801561053b5780601f106105105761010080835404028352916020019161053b565b820191906000526020600020905b81548152906001019060200180831161051e57829003601f168201915b5050505050905090565b6000610552338484611ade565b50600192915050565b600a546040516317cf780960e11b81523060048201526000916001600160a01b031690632f9ef01290602401602060405180830381865afa1580156105a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105c8919061253a565b905090565b600860009054906101000a90046001600160a01b03166001600160a01b031663893d20e86040518163ffffffff1660e01b8152600401602060405180830381865afa158015610620573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106449190612553565b6001600160a01b0316336001600160a01b03161461067d5760405162461bcd60e51b815260040161067490612570565b60405180910390fd5b60065460ff62010000909104161515811515146106e85760068054821515620100000262ff0000199091161790556040517f0e2fb031ee032dc02d8011dc50b816eb450cf856abd8261680dac74f72165bd2906106df90831515815260200190565b60405180910390a15b50565b6000811561078a576001600160a01b0384166000908152600160209081526040808320338452909152902054600019811461077d57828110156107705760405162461bcd60e51b815260206004820152601b60248201527f5472616e7366657220616d6f756e74203e20616c6c6f77616e636500000000006044820152606401610674565b61077d8533858403611ade565b610788858585611beb565b505b5060019392505050565b6000806107a060025490565b9050801561083f57600a54600c5460405163f8ba677f60e01b81528392620f4240926001600160a01b039091169163f8ba677f916107e49160040190815260200190565b602060405180830381865afa158015610801573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610825919061253a565b61082f91906125b1565b61083991906125d0565b91505090565b5090565b60065460009062010000900460ff161561086f5760405162461bcd60e51b8152600401610674906125f2565b816108b55760405162461bcd60e51b81526020600482015260166024820152754552524f523a205749544844524157414c5f5a45524f60501b6044820152606401610674565b336000908152600d6020908152604091829020825180840190935280548084526001909101549183019190915242116109305760405162461bcd60e51b815260206004820152601760248201527f4552524f523a205749544844524157414c5f51554555450000000000000000006044820152606401610674565b600854604051631966357360e11b815230600482015242916001600160a01b0316906332cc6ae690602401602060405180830381865afa158015610978573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061099c919061253a565b82516109a89190612619565b116109f55760405162461bcd60e51b815260206004820152601c60248201527f5749544844524157414c5f4e4f5f4143544956455f52455155455354000000006044820152606401610674565b8281602001511015610a495760405162461bcd60e51b815260206004820152601b60248201527f5749544844524157414c5f45584345454445445f5245515545535400000000006044820152606401610674565b6000610a5460025490565b90508015610aed57600a54600c5460405163f8ba677f60e01b8152839287926001600160a01b039091169163f8ba677f91610a959160040190815260200190565b602060405180830381865afa158015610ab2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ad6919061253a565b610ae091906125b1565b610aea91906125d0565b92505b336000908152600d602052604081206001018054869290610b0f908490612631565b90915550610b1f90503385611da4565b600a546040516308b67eeb60e41b8152600481018590523360248201526001600160a01b0390911690638b67eeb0906044016020604051808303816000875af1158015610b70573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b94919061253a565b600c6000828254610ba59190612631565b9091555050604080518581526020810185905233917ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b568910160405180910390a25050919050565b60078054610bf9906124ff565b80601f0160208091040260200160405190810160405280929190818152602001828054610c25906124ff565b8015610c725780601f10610c4757610100808354040283529160200191610c72565b820191906000526020600020905b815481529060010190602001808311610c5557829003601f168201915b505050505081565b60008115610552573360008181526001602090815260408083206001600160a01b038816845290915290205461055291908590610cb8908690612619565b611ade565b80610d005760405162461bcd60e51b81526020600482015260136024820152724552524f523a20524551554553545f5a45524f60681b6044820152606401610674565b33600090815260208190526040902054811115610d5f5760405162461bcd60e51b815260206004820152601d60248201527f4552524f523a20524551554553545f4558434545445f42414c414e43450000006044820152606401610674565b6008546040516319ebf47360e21b81523060048201526000916001600160a01b0316906367afd1cc90602401602060405180830381865afa158015610da8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dcc919061253a565b610dd69042612619565b336000818152600d6020908152604091829020848155600101869055815186815290810184905292935090917fd72eb5d043f24a0168ae744d5c44f9596fd673a26bf74d9646bff4b844882d1491015b60405180910390a25050565b600654610100900460ff16158015610e4957508415155b8015610e835750600082828281610e6257610e62612648565b9050602002016020810190610e77919061232c565b6001600160a01b031614155b8015610ec05750600082826001818110610e9f57610e9f612648565b9050602002016020810190610eb4919061232c565b6001600160a01b031614155b8015610efd5750600082826002818110610edc57610edc612648565b9050602002016020810190610ef1919061232c565b6001600160a01b031614155b610f495760405162461bcd60e51b815260206004820152601d60248201527f494e495449414c495a4154494f4e5f4241445f434f4e444954494f4e530000006044820152606401610674565b6006805461ff0019166101001790556040805180820182526011815270496e7375726544414f2d5265736572766560781b60208083019190915282518084019093526008835267695265736572766560c01b9083015261102f918484600081610fb457610fb4612648565b9050602002016020810190610fc9919061232c565b6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015611006573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061102a919061265e565b611ef3565b8181600281811061104257611042612648565b9050602002016020810190611057919061232c565b600880546001600160a01b0319166001600160a01b03929092169182179055630eb9af38838360008161108c5761108c612648565b90506020020160208101906110a1919061232c565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa1580156110e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111099190612553565b600a80546001600160a01b0319166001600160a01b03929092169190911790558181600181811061113c5761113c612648565b9050602002016020810190611151919061232c565b600980546001600160a01b0319166001600160a01b039290921691909117905561117d60078787612101565b5050505050505050565b6060600580546104c2906124ff565b60008115610552573360009081526001602090815260408083206001600160a01b0387168452909152902054828110156112125760405162461bcd60e51b815260206004820152601e60248201527f44656372656173656420616c6c6f77616e63652062656c6f77207a65726f00006044820152606401610674565b6112213385610cb88685612631565b5050600192915050565b6000610552338484611beb565b6001600160a01b038116600090815260208190526040812054600061125c60025490565b90508115158061126b57508015155b156112fd57600a54600c5460405163f8ba677f60e01b8152600481019190915282916001600160a01b03169063f8ba677f90602401602060405180830381865afa1580156112bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112e1919061253a565b6112eb90846125b1565b6112f591906125d0565b949350505050565b5050919050565b600860009054906101000a90046001600160a01b03166001600160a01b031663893d20e86040518163ffffffff1660e01b8152600401602060405180830381865afa158015611357573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061137b9190612553565b6001600160a01b0316336001600160a01b0316146113ab5760405162461bcd60e51b815260040161067490612570565b60065462010000900460ff16156113d45760405162461bcd60e51b8152600401610674906125f2565b600a546040516308b67eeb60e41b8152600481018390526001600160a01b0384811660248301526000921690638b67eeb0906044016020604051808303816000875af1158015611428573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061144c919061253a565b905080600b60008282546114609190612631565b909155505060408051838152602081018390526001600160a01b038516917fe9e9312f917b35fb7a78a82a542d590fce99674a477a735962ea84c05738d2cb910160405180910390a2505050565b60065460009062010000900460ff16156114da5760405162461bcd60e51b8152600401610674906125f2565b8161151d5760405162461bcd60e51b81526020600482015260136024820152724552524f523a204445504f5349545f5a45524f60681b6044820152606401610674565b600a54600c5460405163f8ba677f60e01b815260048101919091526000916001600160a01b03169063f8ba677f90602401602060405180830381865afa15801561156b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061158f919061253a565b9050600061159c60025490565b600a54604051635547056160e11b8152600481018790523360248201523060448201529192506001600160a01b03169063aa8e0ac2906064016020604051808303816000875af11580156115f4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611618919061253a565b600c60008282546116299190612619565b90915550508015611665578115611654578161164582866125b1565b61164f91906125d0565b61165e565b61165e81856125b1565b9250611669565b8392505b604080518581526020810185905233917f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15910160405180910390a26112fd3384611f93565b60065462010000900460ff16156116d75760405162461bcd60e51b8152600401610674906125f2565b600a54604051635547056160e11b8152600481018390523360248201523060448201526000916001600160a01b03169063aa8e0ac2906064016020604051808303816000875af115801561172f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611753919061253a565b905080600b60008282546117679190612619565b9091555050604080518381526020810183905233917fd5321498ebef1d048889992d8457d0f50576d300db1fd93488480c1f57a656019101610e26565b600860009054906101000a90046001600160a01b03166001600160a01b031663893d20e86040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061181b9190612553565b6001600160a01b0316336001600160a01b03161461184b5760405162461bcd60e51b815260040161067490612570565b61185760078383612101565b507fc5e8f06e682be1cb96bb6e6f0b17a64299e4f96d2e3d04003c3d9c3a8de22f3d8282604051611889929190612681565b60405180910390a15050565b600954604051637bca031760e11b81523360048201526000916001600160a01b03169063f794062e90602401602060405180830381865afa1580156118de573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061190291906126b0565b6119435760405162461bcd60e51b815260206004820152601260248201527111549493d48e9553949151d254d51154915160721b6044820152606401610674565b600a546040516317cf780960e11b81523060048201526000916001600160a01b031690632f9ef01290602401602060405180830381865afa15801561198c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119b0919061253a565b600c549091506000848310156119c657826119c8565b845b600a54604051636f25f1ad60e11b8152600481018390523360248201529195506001600160a01b03169063de4be35a906044016020604051808303816000875af1158015611a1a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a3e919061253a565b60405185815290915033907f3fc2682c72ca4b385712df78cbb3df71f24e438d7bec95d338a1ddf28b410f549060200160405180910390a26000600b5483611a869190612619565b611a9083856125b1565b611a9a91906125d0565b905080600c6000828254611aae9190612631565b90915550611abe90508183612631565b600b6000828254611acf9190612631565b90915550949695505050505050565b6001600160a01b038316611b345760405162461bcd60e51b815260206004820152601d60248201527f417070726f76652066726f6d20746865207a65726f20616464726573730000006044820152606401610674565b6001600160a01b038216611b8a5760405162461bcd60e51b815260206004820152601b60248201527f417070726f766520746f20746865207a65726f206164647265737300000000006044820152606401610674565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b8015611d9f576001600160a01b038316611c475760405162461bcd60e51b815260206004820152601e60248201527f5472616e736665722066726f6d20746865207a65726f206164647265737300006044820152606401610674565b6001600160a01b038216611c9d5760405162461bcd60e51b815260206004820152601c60248201527f5472616e7366657220746f20746865207a65726f2061646472657373000000006044820152606401610674565b611ca8838383612084565b6001600160a01b03831660009081526020819052604090205481811015611d115760405162461bcd60e51b815260206004820152601f60248201527f5472616e7366657220616d6f756e7420657863656564732062616c616e6365006044820152606401610674565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290611d48908490612619565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611d9491815260200190565b60405180910390a35b505b505050565b8015611eef576001600160a01b038216611e005760405162461bcd60e51b815260206004820152601a60248201527f4275726e2066726f6d20746865207a65726f20616464726573730000000000006044820152606401610674565b611e0c82600083612084565b6001600160a01b03821660009081526020819052604090205481811015611e755760405162461bcd60e51b815260206004820152601b60248201527f4275726e20616d6f756e7420657863656564732062616c616e636500000000006044820152606401610674565b6001600160a01b0383166000908152602081905260408120838303905560028054849290611ea4908490612631565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b5050565b60035460ff1615611f465760405162461bcd60e51b815260206004820152601c60248201527f546f6b656e20697320616c726561647920696e697469616c697a6564000000006044820152606401610674565b6003805460ff191660011790558251611f66906004906020860190612181565b508151611f7a906005906020850190612181565b506006805460ff191660ff929092169190911790555050565b8015611eef576001600160a01b038216611fef5760405162461bcd60e51b815260206004820152601860248201527f4d696e7420746f20746865207a65726f206164647265737300000000000000006044820152606401610674565b611ffb60008383612084565b806002600082825461200d9190612619565b90915550506001600160a01b0382166000908152602081905260408120805483929061203a908490612619565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6001600160a01b03831615611d9f576001600160a01b0383166000908152602081905260408120546120b7908390612631565b6001600160a01b0385166000908152600d6020526040902060010154909150811015611d9d576001600160a01b0384166000908152600d6020526040902060010181905550505050565b82805461210d906124ff565b90600052602060002090601f01602090048101928261212f5760008555612175565b82601f106121485782800160ff19823516178555612175565b82800160010185558215612175579182015b8281111561217557823582559160200191906001019061215a565b5061083f9291506121f5565b82805461218d906124ff565b90600052602060002090601f0160209004810192826121af5760008555612175565b82601f106121c857805160ff1916838001178555612175565b82800160010185558215612175579182015b828111156121755782518255916020019190600101906121da565b5b8082111561083f57600081556001016121f6565b600060208083528351808285015260005b818110156122375785810183015185820160400152820161221b565b81811115612249576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b03811681146106e857600080fd5b6000806040838503121561228757600080fd5b82356122928161225f565b946020939093013593505050565b80151581146106e857600080fd5b6000602082840312156122c057600080fd5b81356122cb816122a0565b9392505050565b6000806000606084860312156122e757600080fd5b83356122f28161225f565b925060208401356123028161225f565b929592945050506040919091013590565b60006020828403121561232557600080fd5b5035919050565b60006020828403121561233e57600080fd5b81356122cb8161225f565b60008083601f84011261235b57600080fd5b50813567ffffffffffffffff81111561237357600080fd5b60208301915083602082850101111561238b57600080fd5b9250929050565b60008083601f8401126123a457600080fd5b50813567ffffffffffffffff8111156123bc57600080fd5b6020830191508360208260051b850101111561238b57600080fd5b60008060008060008060006080888a0312156123f257600080fd5b87356123fd8161225f565b9650602088013567ffffffffffffffff8082111561241a57600080fd5b6124268b838c01612349565b909850965060408a013591508082111561243f57600080fd5b61244b8b838c01612392565b909650945060608a013591508082111561246457600080fd5b506124718a828b01612392565b989b979a50959850939692959293505050565b6000806020838503121561249757600080fd5b823567ffffffffffffffff8111156124ae57600080fd5b6124ba85828601612349565b90969095509350505050565b600080604083850312156124d957600080fd5b82356124e48161225f565b915060208301356124f48161225f565b809150509250929050565b600181811c9082168061251357607f821691505b6020821081141561253457634e487b7160e01b600052602260045260246000fd5b50919050565b60006020828403121561254c57600080fd5b5051919050565b60006020828403121561256557600080fd5b81516122cb8161225f565b60208082526011908201527022a92927a91d1027a7262cafa7aba722a960791b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60008160001904831182151516156125cb576125cb61259b565b500290565b6000826125ed57634e487b7160e01b600052601260045260246000fd5b500490565b6020808252600d908201526c11549493d48e8814105554d151609a1b604082015260600190565b6000821982111561262c5761262c61259b565b500190565b6000828210156126435761264361259b565b500390565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561267057600080fd5b815160ff811681146122cb57600080fd5b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b6000602082840312156126c257600080fd5b81516122cb816122a056fea26469706673582212202d4ad8b8f59382448eeadeb6532d129fe996082b668197c321c78c2f728216a964736f6c634300080a0033

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

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.