S Price: $0.5555 (-6.21%)

Contract

0x74B8902DBf07bB74969FF97543Ded5a831981029

Overview

S Balance

Sonic LogoSonic LogoSonic Logo0 S

S Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Set Aggregator C...110340792025-03-01 19:02:154 days ago1740855735IN
0x74B8902D...831981029
0 S0.002393350

Parent Transaction Hash Block From To
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
DLOFactory

Compiler Version
v0.8.20+commit.a1b79de6

Optimization Enabled:
Yes with 200 runs

Other Settings:
shanghai EvmVersion
File 1 of 9 : DebitaLendOfferFactory.sol
pragma solidity ^0.8.0;

import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import "@contracts/DebitaProxyContract.sol";

interface DLOImplementation {
    struct LendInfo {
        address lendOrderAddress;
        bool perpetual;
        bool lonelyLender;
        bool[] oraclesPerPairActivated;
        uint[] maxLTVs;
        uint apr;
        uint maxDuration;
        uint minDuration;
        address owner;
        address principle;
        address[] acceptedCollaterals;
        address[] oracle_Collaterals;
        uint[] maxRatio;
        address oracle_Principle;
        uint startedLendingAmount;
        uint availableAmount;
    }

    function getLendInfo() external view returns (LendInfo memory);
    function isActive() external view returns (bool);

    function initialize(
        address _aggregatorContract,
        bool _perpetual,
        bool[] memory _oraclesActivated,
        bool _lonelyLender,
        uint[] memory _LTVs,
        uint _apr,
        uint _maxDuration,
        uint _minDuration,
        address _owner,
        address _principle,
        address[] memory _acceptedCollaterals,
        address[] memory _oracles_Collateral,
        uint[] memory _ratio,
        address _oracleID_Principle,
        uint _startedLendingAmount
    ) external;
}

contract DLOFactory {
    event LendOrderCreated(
        address indexed lendOrder,
        address indexed owner,
        uint apr,
        uint maxDuration,
        uint minDuration,
        uint[] LTVs,
        uint[] Ratios,
        uint availableAmount,
        bool isActive,
        bool perpetual
    );
    event LendOrderUpdated(
        address indexed lendOrder,
        address indexed owner,
        uint apr,
        uint maxDuration,
        uint minDuration,
        uint[] LTVs,
        uint[] Ratios,
        uint availableAmount,
        bool isActive,
        bool perpetual
    );
    event LendOrderDeleted(
        address indexed lendOrder,
        address indexed owner,
        uint apr,
        uint maxDuration,
        uint minDuration,
        uint[] LTVs,
        uint[] Ratios,
        uint availableAmount,
        bool isActive,
        bool perpetual
    );

    mapping(address => bool) public isLendOrderLegit; // is lend order a legit order from the factory
    mapping(address => uint) public LendOrderIndex; // index of the lend order in the allActiveLendOrders array
    mapping(uint => address) public allActiveLendOrders; // all active lend orders

    uint public activeOrdersCount;
    address aggregatorContract;
    address public implementationContract;
    address public owner;

    constructor(address _implementationContract) {
        owner = msg.sender;

        implementationContract = _implementationContract;
    }

    modifier onlyLendOrder() {
        require(isLendOrderLegit[msg.sender], "Only lend order");
        _;
    }
    /**
     * @dev Create a new lend order
        * @param _perpetual is the lend order perpetual (compunding interest, every time the borrower pays the interest, the tokens come back to the order so the lender can lend it again)
        * @param _oraclesActivated array of booleans to activate oracles for each pair with collateral
        * @param _lonelyLender if true, the lend order is only for one lender
        * @param _LTVs array of max LTVs for each collateral
        * @param _apr annual percentage rate you want to lend the tokens for
        * @param _maxDuration max duration of the loan
        * @param _minDuration min duration of the loan
        * @param _acceptedCollaterals array of accepted collaterals
        * @param _principle address of the principle token
        * @param _oracles_Collateral array of oracles for each collateral
        * @param _ratio array of max ratios for each collateral
        * @param _oracleID_Principle address of the oracle for the principle token
        * @param _startedLendingAmount initial amount of the principle token that is available for lending
        * @return address of the new lend order

     */
    function createLendOrder(
        bool _perpetual,
        bool[] memory _oraclesActivated,
        bool _lonelyLender,
        uint[] memory _LTVs,
        uint _apr,
        uint _maxDuration,
        uint _minDuration,
        address[] memory _acceptedCollaterals,
        address _principle,
        address[] memory _oracles_Collateral,
        uint[] memory _ratio,
        address _oracleID_Principle,
        uint _startedLendingAmount
    ) external returns (address) {
        require(_minDuration <= _maxDuration, "Invalid duration");
        require(_LTVs.length == _acceptedCollaterals.length, "Invalid LTVs");
        require(
            _oracles_Collateral.length == _acceptedCollaterals.length,
            "Invalid length"
        );
        require(
            _oraclesActivated.length == _acceptedCollaterals.length,
            "Invalid oracles"
        );
        require(_ratio.length == _acceptedCollaterals.length, "Invalid ratio");

        DebitaProxyContract lendOfferProxy = new DebitaProxyContract(
            implementationContract
        );

        DLOImplementation lendOffer = DLOImplementation(
            address(lendOfferProxy)
        );

        lendOffer.initialize(
            aggregatorContract,
            _perpetual,
            _oraclesActivated,
            _lonelyLender,
            _LTVs,
            _apr,
            _maxDuration,
            _minDuration,
            msg.sender,
            _principle,
            _acceptedCollaterals,
            _oracles_Collateral,
            _ratio,
            _oracleID_Principle,
            _startedLendingAmount
        );

        SafeERC20.safeTransferFrom(
            IERC20(_principle),
            msg.sender,
            address(lendOffer),
            _startedLendingAmount
        );

        uint balance = IERC20(_principle).balanceOf(address(lendOffer));
        require(balance >= _startedLendingAmount, "Transfer failed");
        isLendOrderLegit[address(lendOffer)] = true;
        LendOrderIndex[address(lendOffer)] = activeOrdersCount;
        allActiveLendOrders[activeOrdersCount] = address(lendOffer);
        activeOrdersCount++;
        emit LendOrderCreated(
            address(lendOffer),
            msg.sender,
            _apr,
            _maxDuration,
            _minDuration,
            _LTVs,
            _ratio,
            _startedLendingAmount,
            true,
            _perpetual
        );
        return address(lendOffer);
    }

    // function to delete a lend order from index
    // only lend order can call this function
    function deleteOrder(address _lendOrder) external onlyLendOrder {
        uint index = LendOrderIndex[_lendOrder];
        LendOrderIndex[_lendOrder] = 0;

        // switch index of the last borrow order to the deleted borrow order
        allActiveLendOrders[index] = allActiveLendOrders[activeOrdersCount - 1];
        LendOrderIndex[allActiveLendOrders[activeOrdersCount - 1]] = index;

        // take out last borrow order

        allActiveLendOrders[activeOrdersCount - 1] = address(0);

        activeOrdersCount--;
    }

    function getActiveOrders(
        uint offset,
        uint limit
    ) public returns (DLOImplementation.LendInfo[] memory) {
        uint length = limit;
        if (length > activeOrdersCount) {
            length = activeOrdersCount;
        }

        DLOImplementation.LendInfo[]
            memory result = new DLOImplementation.LendInfo[](length - offset);

        for (uint i = 0; (i + offset) < limit; i++) {
            if ((i + offset) > (activeOrdersCount) - 1) {
                break;
            }
            result[i] = DLOImplementation(allActiveLendOrders[offset + i])
                .getLendInfo();
        }

        return result;
    }

    function setAggregatorContract(address _aggregatorContract) external {
        require(msg.sender == owner, "Only owner can set aggregator contract");
        require(aggregatorContract == address(0), "Already set");
        aggregatorContract = _aggregatorContract;
    }

    function emitUpdate(address _lendOrder) external onlyLendOrder {
        DLOImplementation lendOrder = DLOImplementation(_lendOrder);
        DLOImplementation.LendInfo memory lendInfo = lendOrder.getLendInfo();
        emit LendOrderUpdated(
            _lendOrder,
            lendInfo.owner,
            lendInfo.apr,
            lendInfo.maxDuration,
            lendInfo.minDuration,
            lendInfo.maxLTVs,
            lendInfo.maxRatio,
            lendInfo.availableAmount,
            lendOrder.isActive(),
            lendInfo.perpetual
        );
    }
    function emitDelete(address _lendOrder) external onlyLendOrder {
        DLOImplementation lendOrder = DLOImplementation(_lendOrder);
        DLOImplementation.LendInfo memory lendInfo = lendOrder.getLendInfo();
        emit LendOrderDeleted(
            _lendOrder,
            lendInfo.owner,
            lendInfo.apr,
            lendInfo.maxDuration,
            lendInfo.minDuration,
            lendInfo.maxLTVs,
            lendInfo.maxRatio,
            lendInfo.availableAmount,
            lendOrder.isActive(),
            lendInfo.perpetual
        );
    }
}

File 2 of 9 : IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.20;

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

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

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

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

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

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

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

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

File 3 of 9 : SafeERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.2.0) (token/ERC20/utils/SafeERC20.sol)

pragma solidity ^0.8.20;

import {IERC20} from "../IERC20.sol";
import {IERC1363} from "../../../interfaces/IERC1363.sol";

/**
 * @title SafeERC20
 * @dev Wrappers around ERC-20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    /**
     * @dev An operation with an ERC-20 token failed.
     */
    error SafeERC20FailedOperation(address token);

    /**
     * @dev Indicates a failed `decreaseAllowance` request.
     */
    error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);

    /**
     * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,
     * non-reverting calls are assumed to be successful.
     */
    function safeTransfer(IERC20 token, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));
    }

    /**
     * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the
     * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.
     */
    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));
    }

    /**
     * @dev Variant of {safeTransfer} that returns a bool instead of reverting if the operation is not successful.
     */
    function trySafeTransfer(IERC20 token, address to, uint256 value) internal returns (bool) {
        return _callOptionalReturnBool(token, abi.encodeCall(token.transfer, (to, value)));
    }

    /**
     * @dev Variant of {safeTransferFrom} that returns a bool instead of reverting if the operation is not successful.
     */
    function trySafeTransferFrom(IERC20 token, address from, address to, uint256 value) internal returns (bool) {
        return _callOptionalReturnBool(token, abi.encodeCall(token.transferFrom, (from, to, value)));
    }

    /**
     * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,
     * non-reverting calls are assumed to be successful.
     *
     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the "client"
     * smart contract uses ERC-7674 to set temporary allowances, then the "client" smart contract should avoid using
     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract
     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.
     */
    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 oldAllowance = token.allowance(address(this), spender);
        forceApprove(token, spender, oldAllowance + value);
    }

    /**
     * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no
     * value, non-reverting calls are assumed to be successful.
     *
     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the "client"
     * smart contract uses ERC-7674 to set temporary allowances, then the "client" smart contract should avoid using
     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract
     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.
     */
    function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {
        unchecked {
            uint256 currentAllowance = token.allowance(address(this), spender);
            if (currentAllowance < requestedDecrease) {
                revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);
            }
            forceApprove(token, spender, currentAllowance - requestedDecrease);
        }
    }

    /**
     * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,
     * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval
     * to be set to zero before setting it to a non-zero value, such as USDT.
     *
     * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function
     * only sets the "standard" allowance. Any temporary allowance will remain active, in addition to the value being
     * set here.
     */
    function forceApprove(IERC20 token, address spender, uint256 value) internal {
        bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));

        if (!_callOptionalReturnBool(token, approvalCall)) {
            _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));
            _callOptionalReturn(token, approvalCall);
        }
    }

    /**
     * @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no
     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when
     * targeting contracts.
     *
     * Reverts if the returned value is other than `true`.
     */
    function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {
        if (to.code.length == 0) {
            safeTransfer(token, to, value);
        } else if (!token.transferAndCall(to, value, data)) {
            revert SafeERC20FailedOperation(address(token));
        }
    }

    /**
     * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target
     * has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when
     * targeting contracts.
     *
     * Reverts if the returned value is other than `true`.
     */
    function transferFromAndCallRelaxed(
        IERC1363 token,
        address from,
        address to,
        uint256 value,
        bytes memory data
    ) internal {
        if (to.code.length == 0) {
            safeTransferFrom(token, from, to, value);
        } else if (!token.transferFromAndCall(from, to, value, data)) {
            revert SafeERC20FailedOperation(address(token));
        }
    }

    /**
     * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no
     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when
     * targeting contracts.
     *
     * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}.
     * Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall}
     * once without retrying, and relies on the returned value to be true.
     *
     * Reverts if the returned value is other than `true`.
     */
    function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {
        if (to.code.length == 0) {
            forceApprove(token, to, value);
        } else if (!token.approveAndCall(to, value, data)) {
            revert SafeERC20FailedOperation(address(token));
        }
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     *
     * This is a variant of {_callOptionalReturnBool} that reverts if call fails to meet the requirements.
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        uint256 returnSize;
        uint256 returnValue;
        assembly ("memory-safe") {
            let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)
            // bubble errors
            if iszero(success) {
                let ptr := mload(0x40)
                returndatacopy(ptr, 0, returndatasize())
                revert(ptr, returndatasize())
            }
            returnSize := returndatasize()
            returnValue := mload(0)
        }

        if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) {
            revert SafeERC20FailedOperation(address(token));
        }
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     *
     * This is a variant of {_callOptionalReturn} that silently catches all reverts and returns a bool instead.
     */
    function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {
        bool success;
        uint256 returnSize;
        uint256 returnValue;
        assembly ("memory-safe") {
            success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)
            returnSize := returndatasize()
            returnValue := mload(0)
        }
        return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1);
    }
}

File 4 of 9 : DebitaProxyContract.sol
pragma solidity ^0.8.0;

import "@openzeppelin/contracts/proxy/Proxy.sol";
contract DebitaProxyContract is Proxy {
    constructor(address _logic) {
        bytes32 implementationPosition = bytes32(
            uint256(keccak256("eip1967.implementationSlot")) - 1
        );
        assembly {
            sstore(implementationPosition, _logic)
        }
    }
    function _implementation() internal view override returns (address) {
        bytes32 implementationPosition = bytes32(
            uint256(keccak256("eip1967.implementationSlot")) - 1
        );
        address implementationAddress;
        // sload and return implementationPosition
        assembly {
            implementationAddress := sload(implementationPosition)
        }
        return implementationAddress;
    }
}

File 5 of 9 : IERC1363.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (interfaces/IERC1363.sol)

pragma solidity ^0.8.20;

import {IERC20} from "./IERC20.sol";
import {IERC165} from "./IERC165.sol";

/**
 * @title IERC1363
 * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].
 *
 * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract
 * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.
 */
interface IERC1363 is IERC20, IERC165 {
    /*
     * Note: the ERC-165 identifier for this interface is 0xb0202a11.
     * 0xb0202a11 ===
     *   bytes4(keccak256('transferAndCall(address,uint256)')) ^
     *   bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^
     *   bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^
     *   bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^
     *   bytes4(keccak256('approveAndCall(address,uint256)')) ^
     *   bytes4(keccak256('approveAndCall(address,uint256,bytes)'))
     */

    /**
     * @dev Moves a `value` amount of tokens from the caller's account to `to`
     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.
     * @param to The address which you want to transfer to.
     * @param value The amount of tokens to be transferred.
     * @return A boolean value indicating whether the operation succeeded unless throwing.
     */
    function transferAndCall(address to, uint256 value) external returns (bool);

    /**
     * @dev Moves a `value` amount of tokens from the caller's account to `to`
     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.
     * @param to The address which you want to transfer to.
     * @param value The amount of tokens to be transferred.
     * @param data Additional data with no specified format, sent in call to `to`.
     * @return A boolean value indicating whether the operation succeeded unless throwing.
     */
    function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism
     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.
     * @param from The address which you want to send tokens from.
     * @param to The address which you want to transfer to.
     * @param value The amount of tokens to be transferred.
     * @return A boolean value indicating whether the operation succeeded unless throwing.
     */
    function transferFromAndCall(address from, address to, uint256 value) external returns (bool);

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism
     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.
     * @param from The address which you want to send tokens from.
     * @param to The address which you want to transfer to.
     * @param value The amount of tokens to be transferred.
     * @param data Additional data with no specified format, sent in call to `to`.
     * @return A boolean value indicating whether the operation succeeded unless throwing.
     */
    function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);

    /**
     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the
     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.
     * @param spender The address which will spend the funds.
     * @param value The amount of tokens to be spent.
     * @return A boolean value indicating whether the operation succeeded unless throwing.
     */
    function approveAndCall(address spender, uint256 value) external returns (bool);

    /**
     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the
     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.
     * @param spender The address which will spend the funds.
     * @param value The amount of tokens to be spent.
     * @param data Additional data with no specified format, sent in call to `spender`.
     * @return A boolean value indicating whether the operation succeeded unless throwing.
     */
    function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);
}

File 6 of 9 : Proxy.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (proxy/Proxy.sol)

pragma solidity ^0.8.20;

/**
 * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM
 * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to
 * be specified by overriding the virtual {_implementation} function.
 *
 * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a
 * different contract through the {_delegate} function.
 *
 * The success and return data of the delegated call will be returned back to the caller of the proxy.
 */
abstract contract Proxy {
    /**
     * @dev Delegates the current call to `implementation`.
     *
     * This function does not return to its internal call site, it will return directly to the external caller.
     */
    function _delegate(address implementation) internal virtual {
        assembly {
            // Copy msg.data. We take full control of memory in this inline assembly
            // block because it will not return to Solidity code. We overwrite the
            // Solidity scratch pad at memory position 0.
            calldatacopy(0, 0, calldatasize())

            // Call the implementation.
            // out and outsize are 0 because we don't know the size yet.
            let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)

            // Copy the returned data.
            returndatacopy(0, 0, returndatasize())

            switch result
            // delegatecall returns 0 on error.
            case 0 {
                revert(0, returndatasize())
            }
            default {
                return(0, returndatasize())
            }
        }
    }

    /**
     * @dev This is a virtual function that should be overridden so it returns the address to which the fallback
     * function and {_fallback} should delegate.
     */
    function _implementation() internal view virtual returns (address);

    /**
     * @dev Delegates the current call to the address returned by `_implementation()`.
     *
     * This function does not return to its internal call site, it will return directly to the external caller.
     */
    function _fallback() internal virtual {
        _delegate(_implementation());
    }

    /**
     * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other
     * function in the contract matches the call data.
     */
    fallback() external payable virtual {
        _fallback();
    }
}

File 7 of 9 : IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC20.sol)

pragma solidity ^0.8.20;

import {IERC20} from "../token/ERC20/IERC20.sol";

File 8 of 9 : IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC165.sol)

pragma solidity ^0.8.20;

import {IERC165} from "../utils/introspection/IERC165.sol";

File 9 of 9 : IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/IERC165.sol)

pragma solidity ^0.8.20;

/**
 * @dev Interface of the ERC-165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[ERC].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

Settings
{
  "remappings": [
    "@pythnetwork/pyth-sdk-solidity/=node_modules/@pythnetwork/pyth-sdk-solidity/",
    "@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/",
    "@contracts/=contracts/",
    "@aerodrome/=lib/contracts/contracts/",
    "forge-std/=lib/forge-std/src/",
    "@redstone-finance/evm-connector/dist/contracts/=lib/redstone-oracles-monorepo/packages/evm-connector/contracts/",
    "@chainlink/=lib/foundry-chainlink-toolkit/",
    "@opengsn/=lib/contracts/lib/gsn/packages/",
    "@uniswap/v3-core/=lib/contracts/lib/v3-core/",
    "chainlink-brownie-contracts/=lib/foundry-chainlink-toolkit/lib/chainlink-brownie-contracts/contracts/src/v0.6/vendor/@arbitrum/nitro-contracts/src/",
    "contracts/=lib/contracts/contracts/",
    "ds-test/=lib/contracts/lib/ds-test/src/",
    "erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/",
    "foundry-chainlink-toolkit/=lib/foundry-chainlink-toolkit/",
    "gsn/=lib/contracts/lib/",
    "halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/",
    "openzeppelin-contracts/=lib/openzeppelin-contracts/",
    "redstone-oracles-monorepo/=lib/redstone-oracles-monorepo/",
    "utils/=lib/contracts/test/utils/",
    "v3-core/=lib/contracts/lib/v3-core/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "metadata": {
    "useLiteralContent": false,
    "bytecodeHash": "ipfs",
    "appendCBOR": true
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "shanghai",
  "viaIR": true,
  "libraries": {}
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"_implementationContract","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"lendOrder","type":"address"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"apr","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"maxDuration","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"minDuration","type":"uint256"},{"indexed":false,"internalType":"uint256[]","name":"LTVs","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"Ratios","type":"uint256[]"},{"indexed":false,"internalType":"uint256","name":"availableAmount","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isActive","type":"bool"},{"indexed":false,"internalType":"bool","name":"perpetual","type":"bool"}],"name":"LendOrderCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"lendOrder","type":"address"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"apr","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"maxDuration","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"minDuration","type":"uint256"},{"indexed":false,"internalType":"uint256[]","name":"LTVs","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"Ratios","type":"uint256[]"},{"indexed":false,"internalType":"uint256","name":"availableAmount","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isActive","type":"bool"},{"indexed":false,"internalType":"bool","name":"perpetual","type":"bool"}],"name":"LendOrderDeleted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"lendOrder","type":"address"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"apr","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"maxDuration","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"minDuration","type":"uint256"},{"indexed":false,"internalType":"uint256[]","name":"LTVs","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"Ratios","type":"uint256[]"},{"indexed":false,"internalType":"uint256","name":"availableAmount","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isActive","type":"bool"},{"indexed":false,"internalType":"bool","name":"perpetual","type":"bool"}],"name":"LendOrderUpdated","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"LendOrderIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"activeOrdersCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"allActiveLendOrders","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_perpetual","type":"bool"},{"internalType":"bool[]","name":"_oraclesActivated","type":"bool[]"},{"internalType":"bool","name":"_lonelyLender","type":"bool"},{"internalType":"uint256[]","name":"_LTVs","type":"uint256[]"},{"internalType":"uint256","name":"_apr","type":"uint256"},{"internalType":"uint256","name":"_maxDuration","type":"uint256"},{"internalType":"uint256","name":"_minDuration","type":"uint256"},{"internalType":"address[]","name":"_acceptedCollaterals","type":"address[]"},{"internalType":"address","name":"_principle","type":"address"},{"internalType":"address[]","name":"_oracles_Collateral","type":"address[]"},{"internalType":"uint256[]","name":"_ratio","type":"uint256[]"},{"internalType":"address","name":"_oracleID_Principle","type":"address"},{"internalType":"uint256","name":"_startedLendingAmount","type":"uint256"}],"name":"createLendOrder","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_lendOrder","type":"address"}],"name":"deleteOrder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_lendOrder","type":"address"}],"name":"emitDelete","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_lendOrder","type":"address"}],"name":"emitUpdate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"offset","type":"uint256"},{"internalType":"uint256","name":"limit","type":"uint256"}],"name":"getActiveOrders","outputs":[{"components":[{"internalType":"address","name":"lendOrderAddress","type":"address"},{"internalType":"bool","name":"perpetual","type":"bool"},{"internalType":"bool","name":"lonelyLender","type":"bool"},{"internalType":"bool[]","name":"oraclesPerPairActivated","type":"bool[]"},{"internalType":"uint256[]","name":"maxLTVs","type":"uint256[]"},{"internalType":"uint256","name":"apr","type":"uint256"},{"internalType":"uint256","name":"maxDuration","type":"uint256"},{"internalType":"uint256","name":"minDuration","type":"uint256"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"principle","type":"address"},{"internalType":"address[]","name":"acceptedCollaterals","type":"address[]"},{"internalType":"address[]","name":"oracle_Collaterals","type":"address[]"},{"internalType":"uint256[]","name":"maxRatio","type":"uint256[]"},{"internalType":"address","name":"oracle_Principle","type":"address"},{"internalType":"uint256","name":"startedLendingAmount","type":"uint256"},{"internalType":"uint256","name":"availableAmount","type":"uint256"}],"internalType":"struct DLOImplementation.LendInfo[]","name":"","type":"tuple[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"implementationContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isLendOrderLegit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_aggregatorContract","type":"address"}],"name":"setAggregatorContract","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60803461007a57601f61184038819003918201601f19168301916001600160401b0383118484101761007e5780849260209460405283398101031261007a57516001600160a01b0381169081900361007a5760018060a01b03193381600654161760065560055416176005556040516117ad90816100938239f35b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe6080806040526004361015610012575f80fd5b5f90813560e01c9081630ed96b2814611101575080633ff1b8d6146110e357806349e6f2ed146110aa5780637c95cdc614610d31578063896dd7f714610cf35780638d91e38e14610bcb5780638da5cb5b14610ba25780639967cf6014610acd57806399e7d05614610aa4578063a0b4e227146103b4578063b148414c146102425763cadbe0e0146100a2575f80fd5b3461023f5760208060031936011261023b576100bc611133565b903383528281526100d360ff604085205416611351565b6040516349b1b18760e01b8152916001600160a01b0390811691908484600481865afa93841561023057859461020c575b50610100840151169260a081015160c08201519160e08101519060808101516101808201516101e083015191604051936308bcf8b560e21b855288856004818d5afa948515610201578c95610197575b50907f440cf0b67b0cddcdcb38693e8828793790ea2c44cc7bd1af5a5d3137ba131ea2986101919695949392015115159460405198899889611301565b0390a380f35b9594509291908886813d83116101fa575b6101b281836111d9565b810103126101f6577f440cf0b67b0cddcdcb38693e8828793790ea2c44cc7bd1af5a5d3137ba131ea2986101e8610191976113b0565b959650989390919293610154565b8b80fd5b503d6101a8565b6040513d8e823e3d90fd5b6102299194503d8087833e61022181836111d9565b810190611481565b925f610104565b6040513d87823e3d90fd5b5080fd5b80fd5b503461023f5760208060031936011261023b5761025d611133565b9033835282815261027460ff604085205416611351565b6040516349b1b18760e01b8152916001600160a01b0390811691908484600481865afa938415610230578594610398575b50610100840151169260a081015160c08201519160e08101519060808101516101808201516101e083015191604051936308bcf8b560e21b855288856004818d5afa948515610201578c95610332575b50907f4b93895284b971d61ca2e8a72dd94981060a6d29e417f629f92d824ba81fdcc7986101919695949392015115159460405198899889611301565b9594509291908886813d8311610391575b61034d81836111d9565b810103126101f6577f4b93895284b971d61ca2e8a72dd94981060a6d29e417f629f92d824ba81fdcc798610383610191976113b0565b9596509893909192936102f5565b503d610343565b6103ad9194503d8087833e61022181836111d9565b925f6102a5565b503461023f576101a036600319011261023f5760043590811515820361023f576024359167ffffffffffffffff831161023b573660238401121561023b57826004013591610401836111fb565b9361040f60405195866111d9565b83855260208501906024829560051b82010190368211610a8757602401915b818310610a8b5750505060443592831515840361023b5760643567ffffffffffffffff811161088557610465903690600401611213565b9460e43567ffffffffffffffff8111610a8757610486903690600401611271565b6101043591906001600160a01b0383168303610a83576101243567ffffffffffffffff8111610a7f576104bd903690600401611271565b9067ffffffffffffffff6101443511610a7f576104e03661014435600401611213565b94610164356001600160a01b0381169003610a7b5760a43560c43511610a43578951825103610a0f5782518251036109d95783518251036109a257855182510361096d57600554604051906001600160a01b031667ffffffffffffffff610111830190811190831117610959576101116116678339610111820152602081610111810103019088f098891561094e576004546001600160a01b039a8b169a168a3b1561094a5794919390928b899460405197889563df1aaf1d60e01b87526101e487019160048801528d151560248801526101e060448801525180915261020486019790875b8181106109215750505061064f926105fb869798610662969461063c94151560648a01526003198983030160848a015261114d565b9060843560a488015260a43560c488015260c43560e48801523361010488015260018060a01b038b1661012488015260031987830301610144880152611180565b8481036003190161016486015290611180565b828103600319016101848401528761114d565b610164356001600160a01b03166101a4830152610184356101c48301520381838a5af18015610916576108e6575b506040516323b872dd60e01b6020820152336024820152856044820152610184356064820152606481528060a081011067ffffffffffffffff60a0830111176108d25760a0810160405280516020918591908301826001600160a01b0386165af1156108c75782513d6108be57506001600160a01b0381163b155b61089c576040516370a0823160e01b81526004810186905290602090829060249082906001600160a01b03165afa90811561089157839161085b575b506101843511610824576020946107fe7fb38a206b4b00d385edabb08c46d436837c987d18560cb50d15175cc2e9b6e05c9260408588809752808a52818120600160ff1982541617905560035460018b528083832055815260028a5220856001600160601b0360a01b8254161790556107c16003546112df565b6003556107f060405193608435855260a4358a86015260c435604086015261010080606087015285019061114d565b90838203608085015261114d565b936101843560a0830152600160c0830152151560e08201528033940390a3604051908152f35b60405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b6044820152606490fd5b90506020813d602011610889575b81610876602093836111d9565b8101031261088557515f610747565b8280fd5b3d9150610869565b6040513d85823e3d90fd5b604051635274afe760e01b81526001600160a01b039091166004820152602490fd5b6001141561070b565b6040513d84823e3d90fd5b634e487b7160e01b5f52604160045260245ffd5b67ffffffffffffffff819492941161090257604052915f610690565b634e487b7160e01b82526041600452602482fd5b6040513d86823e3d90fd5b9350939650945092956020806001928751151581520195019101928d918b9693899698956105c6565b8880fd5b6040513d89823e3d90fd5b634e487b7160e01b89526041600452602489fd5b60405162461bcd60e51b815260206004820152600d60248201526c496e76616c696420726174696f60981b6044820152606490fd5b60405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206f7261636c657360881b6044820152606490fd5b60405162461bcd60e51b815260206004820152600e60248201526d092dcecc2d8d2c840d8cadccee8d60931b6044820152606490fd5b60405162461bcd60e51b815260206004820152600c60248201526b496e76616c6964204c54567360a01b6044820152606490fd5b60405162461bcd60e51b815260206004820152601060248201526f24b73b30b634b210323ab930ba34b7b760811b6044820152606490fd5b8680fd5b8580fd5b8480fd5b8380fd5b82358015158103610a835781526020928301920161042e565b503461023f578060031936011261023f576005546040516001600160a01b039091168152602090f35b503461023f57602036600319011261023f57610ae7611133565b6006546001600160a01b039081163303610b4e5760045491818316610b1b5716906001600160601b0360a01b161760045580f35b60405162461bcd60e51b815260206004820152600b60248201526a105b1c9958591e481cd95d60aa1b6044820152606490fd5b60405162461bcd60e51b815260206004820152602660248201527f4f6e6c79206f776e65722063616e207365742061676772656761746f7220636f6044820152651b9d1c9858dd60d21b6064820152608490fd5b503461023f578060031936011261023f576006546040516001600160a01b039091168152602090f35b503461023f5760208060031936011261023b57610be6611133565b338352828252610bfc60ff604085205416611351565b6001600160a01b03908116835260018252604083208054908490556003545f19939190848101908111610cdf578552600282528260408620541692818652604086206001600160601b0360a01b9485825416179055600354858101908111610ccb578652600283526040862054168552600182526040852055600354838101908111610cb75790600291855252604083209081541690556003548015610ca3570160035580f35b634e487b7160e01b83526011600452602483fd5b634e487b7160e01b85526011600452602485fd5b634e487b7160e01b87526011600452602487fd5b634e487b7160e01b86526011600452602486fd5b503461023f57602036600319011261023f5760209060ff906040906001600160a01b03610d1e611133565b1681528084522054166040519015158152f35b503461023f57604036600319011261023f5760043560249081359081600354908184116110a1575b82840393841161108e5793610d6d846111fb565b93610d7b60405195866111d9565b808552610d8a601f19916111fb565b01865b8181106110095750505f19820191821190865b86610dab868361138f565b1015610ffc5782610dbc868361138f565b90610fe9578410610e575780610dd46004928761138f565b895260026020526040808a205490516349b1b18760e01b8152928a9184919082906001600160a01b03165afa8015610e4c57610e2d928a91610e32575b50610e1c828961163e565b52610e27818861163e565b506112df565b610da0565b610e4691503d808c833e61022181836111d9565b5f610e11565b6040513d8b823e3d90fd5b50505050509190505b604051918291602080840190808552835180925260408501928160408460051b880101950193815b848310610e955787870388f35b9193959092949650603f1988820301835284875191610200928382019360018060a01b0394858351168452848301511515858501526040830151151560408501526060918284015192850152815180915284610220850192019087905b808210610fcd575050509160019491610f96610f82610f6e610f228897608080870151908883039089015261114d565b60a0808601519087015260c0808601519087015260e085015160e08701526101008781870151169087015261012087818701511690870152610140808601519087830390880152611180565b610160808501519086830390870152611180565b61018080840151908583039086015261114d565b926101a0908183015116908301526101c080820151908301526101e080910151910152980193019301909287969593949294610e88565b8251151584528b96938401939092019160019190910190610ef2565b634e487b7160e01b895260116004528289fd5b5050505050919050610e60565b60209060409793975161101b816111bc565b898152828a818301528a6040830152606080808401528060808401528b60a08401528b60c08401528b60e08401528b6101008401528b61012084015280610140840152806101608401526101808301528a6101a08301528a6101c08301528a6101e0830152828901015201959195610d8d565b634e487b7160e01b865260116004528486fd5b92508092610d59565b503461023f57602036600319011261023f576020906040906001600160a01b036110d2611133565b168152600183522054604051908152f35b503461023f578060031936011261023f576020600354604051908152f35b90503461023b57602036600319011261023b576004358252600260209081526040909220546001600160a01b03168152f35b600435906001600160a01b038216820361114957565b5f80fd5b9081518082526020808093019301915f5b82811061116c575050505090565b83518552938101939281019260010161115e565b9081518082526020808093019301915f5b82811061119f575050505090565b83516001600160a01b031685529381019392810192600101611191565b610200810190811067ffffffffffffffff8211176108d257604052565b90601f8019910116810190811067ffffffffffffffff8211176108d257604052565b67ffffffffffffffff81116108d25760051b60200190565b81601f820112156111495780359161122a836111fb565b9261123860405194856111d9565b808452602092838086019260051b820101928311611149578301905b828210611262575050505090565b81358152908301908301611254565b81601f8201121561114957803591611288836111fb565b9261129660405194856111d9565b808452602092838086019260051b820101928311611149578301905b8282106112c0575050505090565b81356001600160a01b03811681036111495781529083019083016112b2565b5f1981146112ed5760010190565b634e487b7160e01b5f52601160045260245ffd5b969361133d9360e0979a99969361132f938a5260208a015260408901526101008060608a015288019061114d565b90868203608088015261114d565b9560a0850152151560c08401521515910152565b1561135857565b60405162461bcd60e51b815260206004820152600f60248201526e27b7363c903632b7321037b93232b960891b6044820152606490fd5b919082018092116112ed57565b51906001600160a01b038216820361114957565b5190811515820361114957565b81601f82011215611149578051916113d4836111fb565b926113e260405194856111d9565b808452602092838086019260051b820101928311611149578301905b82821061140c575050505090565b815181529083019083016113fe565b81601f8201121561114957805191611432836111fb565b9261144060405194856111d9565b808452602092838086019260051b820101928311611149578301905b82821061146a575050505090565b8380916114768461139c565b81520191019061145c565b602091828282031261114957815167ffffffffffffffff928382116111495701916102008383031261114957604051936114ba856111bc565b6114c38461139c565b85526114d08185016113b0565b818601526114e0604085016113b0565b604086015260608401518281116111495784019083601f830112156111495781519161150b836111fb565b9261151960405194856111d9565b808452828085019160051b83010191868311611149578301905b828210611627575050505060608501526080830151818111611149578261155b9185016113bd565b608085015260a083015160a085015260c083015160c085015260e083015160e085015261010061158c81850161139c565b9085015261012061159e81850161139c565b908501526101408084015182811161114957836115bc91860161141b565b908501526101608084015182811161114957836115da91860161141b565b908501526101809182840151918211611149576115f89184016113bd565b908301526101a061160a81830161139c565b908301526101c080820151908301526101e0809101519082015290565b838091611633846113b0565b815201910190611533565b80518210156116525760209160051b010190565b634e487b7160e01b5f52603260045260245ffdfe60803461007f57601f61011138819003918201601f19168301916001600160401b038311848410176100835780849260209460405283398101031261007f57516001600160a01b038116810361007f577f6c2e6ad0697ee74b6b109859efe075280fbb8639fd0923b952c65a4373bc191855604051607990816100988239f35b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe60806040527f6c2e6ad0697ee74b6b109859efe075280fbb8639fd0923b952c65a4373bc1918545f808092368280378136915af43d82803e15603f573d90f35b3d90fdfea2646970667358221220dc53c46fbbb536817120bbfe2ad4353676b0c05f64ede996df0aaa9938acc5ed64736f6c63430008140033a2646970667358221220a41f9d7e49441c8b775ec7bf2a0fc401aead4c493713ebbf7047aea9aa0d108764736f6c634300081400330000000000000000000000003ac4f83dd109ba480d66bba202392d4df03e7d8d

Deployed Bytecode

0x6080806040526004361015610012575f80fd5b5f90813560e01c9081630ed96b2814611101575080633ff1b8d6146110e357806349e6f2ed146110aa5780637c95cdc614610d31578063896dd7f714610cf35780638d91e38e14610bcb5780638da5cb5b14610ba25780639967cf6014610acd57806399e7d05614610aa4578063a0b4e227146103b4578063b148414c146102425763cadbe0e0146100a2575f80fd5b3461023f5760208060031936011261023b576100bc611133565b903383528281526100d360ff604085205416611351565b6040516349b1b18760e01b8152916001600160a01b0390811691908484600481865afa93841561023057859461020c575b50610100840151169260a081015160c08201519160e08101519060808101516101808201516101e083015191604051936308bcf8b560e21b855288856004818d5afa948515610201578c95610197575b50907f440cf0b67b0cddcdcb38693e8828793790ea2c44cc7bd1af5a5d3137ba131ea2986101919695949392015115159460405198899889611301565b0390a380f35b9594509291908886813d83116101fa575b6101b281836111d9565b810103126101f6577f440cf0b67b0cddcdcb38693e8828793790ea2c44cc7bd1af5a5d3137ba131ea2986101e8610191976113b0565b959650989390919293610154565b8b80fd5b503d6101a8565b6040513d8e823e3d90fd5b6102299194503d8087833e61022181836111d9565b810190611481565b925f610104565b6040513d87823e3d90fd5b5080fd5b80fd5b503461023f5760208060031936011261023b5761025d611133565b9033835282815261027460ff604085205416611351565b6040516349b1b18760e01b8152916001600160a01b0390811691908484600481865afa938415610230578594610398575b50610100840151169260a081015160c08201519160e08101519060808101516101808201516101e083015191604051936308bcf8b560e21b855288856004818d5afa948515610201578c95610332575b50907f4b93895284b971d61ca2e8a72dd94981060a6d29e417f629f92d824ba81fdcc7986101919695949392015115159460405198899889611301565b9594509291908886813d8311610391575b61034d81836111d9565b810103126101f6577f4b93895284b971d61ca2e8a72dd94981060a6d29e417f629f92d824ba81fdcc798610383610191976113b0565b9596509893909192936102f5565b503d610343565b6103ad9194503d8087833e61022181836111d9565b925f6102a5565b503461023f576101a036600319011261023f5760043590811515820361023f576024359167ffffffffffffffff831161023b573660238401121561023b57826004013591610401836111fb565b9361040f60405195866111d9565b83855260208501906024829560051b82010190368211610a8757602401915b818310610a8b5750505060443592831515840361023b5760643567ffffffffffffffff811161088557610465903690600401611213565b9460e43567ffffffffffffffff8111610a8757610486903690600401611271565b6101043591906001600160a01b0383168303610a83576101243567ffffffffffffffff8111610a7f576104bd903690600401611271565b9067ffffffffffffffff6101443511610a7f576104e03661014435600401611213565b94610164356001600160a01b0381169003610a7b5760a43560c43511610a43578951825103610a0f5782518251036109d95783518251036109a257855182510361096d57600554604051906001600160a01b031667ffffffffffffffff610111830190811190831117610959576101116116678339610111820152602081610111810103019088f098891561094e576004546001600160a01b039a8b169a168a3b1561094a5794919390928b899460405197889563df1aaf1d60e01b87526101e487019160048801528d151560248801526101e060448801525180915261020486019790875b8181106109215750505061064f926105fb869798610662969461063c94151560648a01526003198983030160848a015261114d565b9060843560a488015260a43560c488015260c43560e48801523361010488015260018060a01b038b1661012488015260031987830301610144880152611180565b8481036003190161016486015290611180565b828103600319016101848401528761114d565b610164356001600160a01b03166101a4830152610184356101c48301520381838a5af18015610916576108e6575b506040516323b872dd60e01b6020820152336024820152856044820152610184356064820152606481528060a081011067ffffffffffffffff60a0830111176108d25760a0810160405280516020918591908301826001600160a01b0386165af1156108c75782513d6108be57506001600160a01b0381163b155b61089c576040516370a0823160e01b81526004810186905290602090829060249082906001600160a01b03165afa90811561089157839161085b575b506101843511610824576020946107fe7fb38a206b4b00d385edabb08c46d436837c987d18560cb50d15175cc2e9b6e05c9260408588809752808a52818120600160ff1982541617905560035460018b528083832055815260028a5220856001600160601b0360a01b8254161790556107c16003546112df565b6003556107f060405193608435855260a4358a86015260c435604086015261010080606087015285019061114d565b90838203608085015261114d565b936101843560a0830152600160c0830152151560e08201528033940390a3604051908152f35b60405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b6044820152606490fd5b90506020813d602011610889575b81610876602093836111d9565b8101031261088557515f610747565b8280fd5b3d9150610869565b6040513d85823e3d90fd5b604051635274afe760e01b81526001600160a01b039091166004820152602490fd5b6001141561070b565b6040513d84823e3d90fd5b634e487b7160e01b5f52604160045260245ffd5b67ffffffffffffffff819492941161090257604052915f610690565b634e487b7160e01b82526041600452602482fd5b6040513d86823e3d90fd5b9350939650945092956020806001928751151581520195019101928d918b9693899698956105c6565b8880fd5b6040513d89823e3d90fd5b634e487b7160e01b89526041600452602489fd5b60405162461bcd60e51b815260206004820152600d60248201526c496e76616c696420726174696f60981b6044820152606490fd5b60405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206f7261636c657360881b6044820152606490fd5b60405162461bcd60e51b815260206004820152600e60248201526d092dcecc2d8d2c840d8cadccee8d60931b6044820152606490fd5b60405162461bcd60e51b815260206004820152600c60248201526b496e76616c6964204c54567360a01b6044820152606490fd5b60405162461bcd60e51b815260206004820152601060248201526f24b73b30b634b210323ab930ba34b7b760811b6044820152606490fd5b8680fd5b8580fd5b8480fd5b8380fd5b82358015158103610a835781526020928301920161042e565b503461023f578060031936011261023f576005546040516001600160a01b039091168152602090f35b503461023f57602036600319011261023f57610ae7611133565b6006546001600160a01b039081163303610b4e5760045491818316610b1b5716906001600160601b0360a01b161760045580f35b60405162461bcd60e51b815260206004820152600b60248201526a105b1c9958591e481cd95d60aa1b6044820152606490fd5b60405162461bcd60e51b815260206004820152602660248201527f4f6e6c79206f776e65722063616e207365742061676772656761746f7220636f6044820152651b9d1c9858dd60d21b6064820152608490fd5b503461023f578060031936011261023f576006546040516001600160a01b039091168152602090f35b503461023f5760208060031936011261023b57610be6611133565b338352828252610bfc60ff604085205416611351565b6001600160a01b03908116835260018252604083208054908490556003545f19939190848101908111610cdf578552600282528260408620541692818652604086206001600160601b0360a01b9485825416179055600354858101908111610ccb578652600283526040862054168552600182526040852055600354838101908111610cb75790600291855252604083209081541690556003548015610ca3570160035580f35b634e487b7160e01b83526011600452602483fd5b634e487b7160e01b85526011600452602485fd5b634e487b7160e01b87526011600452602487fd5b634e487b7160e01b86526011600452602486fd5b503461023f57602036600319011261023f5760209060ff906040906001600160a01b03610d1e611133565b1681528084522054166040519015158152f35b503461023f57604036600319011261023f5760043560249081359081600354908184116110a1575b82840393841161108e5793610d6d846111fb565b93610d7b60405195866111d9565b808552610d8a601f19916111fb565b01865b8181106110095750505f19820191821190865b86610dab868361138f565b1015610ffc5782610dbc868361138f565b90610fe9578410610e575780610dd46004928761138f565b895260026020526040808a205490516349b1b18760e01b8152928a9184919082906001600160a01b03165afa8015610e4c57610e2d928a91610e32575b50610e1c828961163e565b52610e27818861163e565b506112df565b610da0565b610e4691503d808c833e61022181836111d9565b5f610e11565b6040513d8b823e3d90fd5b50505050509190505b604051918291602080840190808552835180925260408501928160408460051b880101950193815b848310610e955787870388f35b9193959092949650603f1988820301835284875191610200928382019360018060a01b0394858351168452848301511515858501526040830151151560408501526060918284015192850152815180915284610220850192019087905b808210610fcd575050509160019491610f96610f82610f6e610f228897608080870151908883039089015261114d565b60a0808601519087015260c0808601519087015260e085015160e08701526101008781870151169087015261012087818701511690870152610140808601519087830390880152611180565b610160808501519086830390870152611180565b61018080840151908583039086015261114d565b926101a0908183015116908301526101c080820151908301526101e080910151910152980193019301909287969593949294610e88565b8251151584528b96938401939092019160019190910190610ef2565b634e487b7160e01b895260116004528289fd5b5050505050919050610e60565b60209060409793975161101b816111bc565b898152828a818301528a6040830152606080808401528060808401528b60a08401528b60c08401528b60e08401528b6101008401528b61012084015280610140840152806101608401526101808301528a6101a08301528a6101c08301528a6101e0830152828901015201959195610d8d565b634e487b7160e01b865260116004528486fd5b92508092610d59565b503461023f57602036600319011261023f576020906040906001600160a01b036110d2611133565b168152600183522054604051908152f35b503461023f578060031936011261023f576020600354604051908152f35b90503461023b57602036600319011261023b576004358252600260209081526040909220546001600160a01b03168152f35b600435906001600160a01b038216820361114957565b5f80fd5b9081518082526020808093019301915f5b82811061116c575050505090565b83518552938101939281019260010161115e565b9081518082526020808093019301915f5b82811061119f575050505090565b83516001600160a01b031685529381019392810192600101611191565b610200810190811067ffffffffffffffff8211176108d257604052565b90601f8019910116810190811067ffffffffffffffff8211176108d257604052565b67ffffffffffffffff81116108d25760051b60200190565b81601f820112156111495780359161122a836111fb565b9261123860405194856111d9565b808452602092838086019260051b820101928311611149578301905b828210611262575050505090565b81358152908301908301611254565b81601f8201121561114957803591611288836111fb565b9261129660405194856111d9565b808452602092838086019260051b820101928311611149578301905b8282106112c0575050505090565b81356001600160a01b03811681036111495781529083019083016112b2565b5f1981146112ed5760010190565b634e487b7160e01b5f52601160045260245ffd5b969361133d9360e0979a99969361132f938a5260208a015260408901526101008060608a015288019061114d565b90868203608088015261114d565b9560a0850152151560c08401521515910152565b1561135857565b60405162461bcd60e51b815260206004820152600f60248201526e27b7363c903632b7321037b93232b960891b6044820152606490fd5b919082018092116112ed57565b51906001600160a01b038216820361114957565b5190811515820361114957565b81601f82011215611149578051916113d4836111fb565b926113e260405194856111d9565b808452602092838086019260051b820101928311611149578301905b82821061140c575050505090565b815181529083019083016113fe565b81601f8201121561114957805191611432836111fb565b9261144060405194856111d9565b808452602092838086019260051b820101928311611149578301905b82821061146a575050505090565b8380916114768461139c565b81520191019061145c565b602091828282031261114957815167ffffffffffffffff928382116111495701916102008383031261114957604051936114ba856111bc565b6114c38461139c565b85526114d08185016113b0565b818601526114e0604085016113b0565b604086015260608401518281116111495784019083601f830112156111495781519161150b836111fb565b9261151960405194856111d9565b808452828085019160051b83010191868311611149578301905b828210611627575050505060608501526080830151818111611149578261155b9185016113bd565b608085015260a083015160a085015260c083015160c085015260e083015160e085015261010061158c81850161139c565b9085015261012061159e81850161139c565b908501526101408084015182811161114957836115bc91860161141b565b908501526101608084015182811161114957836115da91860161141b565b908501526101809182840151918211611149576115f89184016113bd565b908301526101a061160a81830161139c565b908301526101c080820151908301526101e0809101519082015290565b838091611633846113b0565b815201910190611533565b80518210156116525760209160051b010190565b634e487b7160e01b5f52603260045260245ffdfe60803461007f57601f61011138819003918201601f19168301916001600160401b038311848410176100835780849260209460405283398101031261007f57516001600160a01b038116810361007f577f6c2e6ad0697ee74b6b109859efe075280fbb8639fd0923b952c65a4373bc191855604051607990816100988239f35b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe60806040527f6c2e6ad0697ee74b6b109859efe075280fbb8639fd0923b952c65a4373bc1918545f808092368280378136915af43d82803e15603f573d90f35b3d90fdfea2646970667358221220dc53c46fbbb536817120bbfe2ad4353676b0c05f64ede996df0aaa9938acc5ed64736f6c63430008140033a2646970667358221220a41f9d7e49441c8b775ec7bf2a0fc401aead4c493713ebbf7047aea9aa0d108764736f6c63430008140033

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

0000000000000000000000003ac4f83dd109ba480d66bba202392d4df03e7d8d

-----Decoded View---------------
Arg [0] : _implementationContract (address): 0x3aC4F83Dd109ba480D66BbA202392D4df03E7d8D

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000003ac4f83dd109ba480d66bba202392d4df03e7d8d


Block Transaction 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
[ 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.