S Price: $0.579362 (-2.95%)

Contract

0x1515a13551fDF554203f2a86021e0370a08a8D94

Overview

S Balance

Sonic LogoSonic LogoSonic Logo0 S

S Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Deploy114762452025-03-03 20:59:3325 hrs ago1741035573IN
0x1515a135...0a08a8D94
0 S0.0597905771.76326688
Deploy114762402025-03-03 20:59:3125 hrs ago1741035571IN
0x1515a135...0a08a8D94
0 S0.0602576771.76326688
Deploy114762312025-03-03 20:59:2725 hrs ago1741035567IN
0x1515a135...0a08a8D94
0 S0.0602576771.76326688
Deploy114762272025-03-03 20:59:2525 hrs ago1741035565IN
0x1515a135...0a08a8D94
0 S0.0602576771.76326688
Deploy114762232025-03-03 20:59:2325 hrs ago1741035563IN
0x1515a135...0a08a8D94
0 S0.0610636571.76326688

Latest 5 internal transactions

Parent Transaction Hash Block From To
114762452025-03-03 20:59:3325 hrs ago1741035573
0x1515a135...0a08a8D94
 Contract Creation0 S
114762402025-03-03 20:59:3125 hrs ago1741035571
0x1515a135...0a08a8D94
 Contract Creation0 S
114762312025-03-03 20:59:2725 hrs ago1741035567
0x1515a135...0a08a8D94
 Contract Creation0 S
114762272025-03-03 20:59:2525 hrs ago1741035565
0x1515a135...0a08a8D94
 Contract Creation0 S
114762232025-03-03 20:59:2325 hrs ago1741035563
0x1515a135...0a08a8D94
 Contract Creation0 S
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
EulerIRMAdaptiveCurveFactory

Compiler Version
v0.8.24+commit.e11b9ed9

Optimization Enabled:
Yes with 20000 runs

Other Settings:
cancun EvmVersion
File 1 of 6 : EulerIRMAdaptiveCurveFactory.sol
// SPDX-License-Identifier: GPL-2.0-or-later

pragma solidity ^0.8.0;

import {BaseFactory} from "../BaseFactory/BaseFactory.sol";
import {IRMAdaptiveCurve} from "../IRM/IRMAdaptiveCurve.sol";

/// @title EulerIRMAdaptiveCurveFactory
/// @custom:security-contact [email protected]
/// @author Euler Labs (https://www.eulerlabs.com/)
/// @notice A minimal factory for Adaptive Curve IRMs.
contract EulerIRMAdaptiveCurveFactory is BaseFactory {
    /// @notice Deploy IRMAdaptiveCurve using the Factory.
    /// @param _TARGET_UTILIZATION The utilization rate targeted by the interest rate model.
    /// @param _INITIAL_RATE_AT_TARGET The initial interest rate at target utilization.
    /// @param _MIN_RATE_AT_TARGET The minimum interest rate at target utilization that the model can adjust to.
    /// @param _MAX_RATE_AT_TARGET The maximum interest rate at target utilization that the model can adjust to.
    /// @param _CURVE_STEEPNESS The slope of interest rate above target. The line below target has inverse slope.
    /// @param _ADJUSTMENT_SPEED The speed at which the rate at target utilization is adjusted up or down.
    /// @return The deployment address.
    function deploy(
        int256 _TARGET_UTILIZATION,
        int256 _INITIAL_RATE_AT_TARGET,
        int256 _MIN_RATE_AT_TARGET,
        int256 _MAX_RATE_AT_TARGET,
        int256 _CURVE_STEEPNESS,
        int256 _ADJUSTMENT_SPEED
    ) external returns (address) {
        // Deploy IRM.
        IRMAdaptiveCurve irm = new IRMAdaptiveCurve(
            _TARGET_UTILIZATION,
            _INITIAL_RATE_AT_TARGET,
            _MIN_RATE_AT_TARGET,
            _MAX_RATE_AT_TARGET,
            _CURVE_STEEPNESS,
            _ADJUSTMENT_SPEED
        );

        // Store the deployment and return the address.
        deploymentInfo[address(irm)] = DeploymentInfo(msg.sender, uint96(block.timestamp));
        deployments.push(address(irm));
        emit ContractDeployed(address(irm), msg.sender, block.timestamp);
        return address(irm);
    }
}

File 2 of 6 : BaseFactory.sol
// SPDX-License-Identifier: GPL-2.0-or-later

pragma solidity ^0.8.0;

import {IFactory} from "./interfaces/IFactory.sol";

/// @title BaseFactory
/// @custom:security-contact [email protected]
/// @author Euler Labs (https://www.eulerlabs.com/)
/// @notice A minimal factory for deploying various contracts.
abstract contract BaseFactory is IFactory {
    /// @notice Contracts deployed by the factory.
    mapping(address => DeploymentInfo) internal deploymentInfo;

    /// @notice An array of addresses of all the contracts deployed by the factory
    address[] public deployments;

    /// @inheritdoc IFactory
    function getDeploymentInfo(address contractAddress) external view returns (address deployer, uint96 deployedAt) {
        DeploymentInfo memory info = deploymentInfo[contractAddress];
        return (info.deployer, info.deployedAt);
    }

    /// @inheritdoc IFactory
    function isValidDeployment(address contractAddress) external view returns (bool) {
        return deploymentInfo[contractAddress].deployedAt != 0;
    }

    /// @inheritdoc IFactory
    function getDeploymentsListLength() external view returns (uint256) {
        return deployments.length;
    }

    /// @inheritdoc IFactory
    function getDeploymentsListSlice(uint256 start, uint256 end) external view returns (address[] memory list) {
        if (end == type(uint256).max) end = deployments.length;
        if (end < start || end > deployments.length) revert Factory_BadQuery();

        list = new address[](end - start);
        for (uint256 i; i < end - start; ++i) {
            list[i] = deployments[start + i];
        }
    }
}

File 3 of 6 : IRMAdaptiveCurve.sol
// SPDX-License-Identifier: MIT
// Copyright (c) 2023 Morpho Association

pragma solidity ^0.8.0;

import {IIRM} from "evk/InterestRateModels/IIRM.sol";
import {ExpLib} from "./lib/ExpLib.sol";

/// @title IRMAdaptiveCurve
/// @custom:contact [email protected]
/// @author Euler Labs (https://www.eulerlabs.com/).
/// @author Adapted from Morpho Labs (https://github.com/morpho-org/morpho-blue-irm/).
/// @notice A Linear Kink IRM that adjusts the rate at target utilization based on time spent above/below it.
/// @dev This implementation intentionally leaves variables names, units and ExpLib unchanged from original.
/// Returned rates are extended to RAY per second to be compatible with the EVK.
contract IRMAdaptiveCurve is IIRM {
    /// @dev Unit for internal precision.
    int256 internal constant WAD = 1e18;
    /// @dev Unit for internal precision.
    int256 internal constant YEAR = int256(365.2425 days);
    /// @notice The name of the IRM.
    string public constant name = "IRMAdaptiveCurve";
    /// @notice The utilization rate targeted by the model.
    /// @dev In WAD units.
    int256 public immutable TARGET_UTILIZATION;
    /// @notice The initial interest rate at target utilization.
    /// @dev In WAD per second units.
    /// When the IRM is initialized for a vault this is the rate at target utilization that is assigned.
    int256 public immutable INITIAL_RATE_AT_TARGET;
    /// @notice The minimum interest rate at target utilization that the model can adjust to.
    /// @dev In WAD per second units.
    int256 public immutable MIN_RATE_AT_TARGET;
    /// @notice The maximum interest rate at target utilization that the model can adjust to.
    /// @dev In WAD per second units.
    int256 public immutable MAX_RATE_AT_TARGET;
    /// @notice The steepness of the interest rate line.
    /// @dev In WAD units.
    int256 public immutable CURVE_STEEPNESS;
    /// @notice The speed at which the rate at target is adjusted up or down.
    /// @dev In WAD per second units.
    /// For example, with `2e18 / 24 hours` the model will 2x `rateAtTarget` if the vault is fully utilized for a day.
    int256 public immutable ADJUSTMENT_SPEED;

    /// @notice Internal cached state of the interest rate model.
    struct IRState {
        /// @dev The current rate at target utilization.
        uint144 rateAtTarget;
        /// @dev The previous utilization rate of the vault.
        int64 lastUtilization;
        /// @dev The timestamp of the last update to the model.
        uint48 lastUpdate;
    }

    /// @notice Get the internal cached state of a vault's irm.
    mapping(address => IRState) internal irState;

    error InvalidParams();

    /// @notice Deploy IRMAdaptiveCurve.
    /// @param _TARGET_UTILIZATION The utilization rate targeted by the interest rate model.
    /// @param _INITIAL_RATE_AT_TARGET The initial interest rate at target utilization.
    /// @param _MIN_RATE_AT_TARGET The minimum interest rate at target utilization that the model can adjust to.
    /// @param _MAX_RATE_AT_TARGET The maximum interest rate at target utilization that the model can adjust to.
    /// @param _CURVE_STEEPNESS The steepness of the interest rate line.
    /// @param _ADJUSTMENT_SPEED The speed at which the rate at target utilization is adjusted up or down.
    constructor(
        int256 _TARGET_UTILIZATION,
        int256 _INITIAL_RATE_AT_TARGET,
        int256 _MIN_RATE_AT_TARGET,
        int256 _MAX_RATE_AT_TARGET,
        int256 _CURVE_STEEPNESS,
        int256 _ADJUSTMENT_SPEED
    ) {
        // Validate parameters.
        if (_TARGET_UTILIZATION <= 0 || _TARGET_UTILIZATION > 1e18) {
            revert InvalidParams();
        }
        if (_INITIAL_RATE_AT_TARGET < _MIN_RATE_AT_TARGET || _INITIAL_RATE_AT_TARGET > _MAX_RATE_AT_TARGET) {
            revert InvalidParams();
        }
        if (_MIN_RATE_AT_TARGET < 0.001e18 / YEAR || _MIN_RATE_AT_TARGET > 10e18 / YEAR) {
            revert InvalidParams();
        }
        if (_MAX_RATE_AT_TARGET < 0.001e18 / YEAR || _MAX_RATE_AT_TARGET > 10e18 / YEAR) {
            revert InvalidParams();
        }
        if (_CURVE_STEEPNESS < 1.01e18 || _CURVE_STEEPNESS > 100e18) {
            revert InvalidParams();
        }
        if (_ADJUSTMENT_SPEED < 2e18 / YEAR || _ADJUSTMENT_SPEED > 1000e18 / YEAR) {
            revert InvalidParams();
        }

        TARGET_UTILIZATION = _TARGET_UTILIZATION;
        INITIAL_RATE_AT_TARGET = _INITIAL_RATE_AT_TARGET;
        MIN_RATE_AT_TARGET = _MIN_RATE_AT_TARGET;
        MAX_RATE_AT_TARGET = _MAX_RATE_AT_TARGET;
        CURVE_STEEPNESS = _CURVE_STEEPNESS;
        ADJUSTMENT_SPEED = _ADJUSTMENT_SPEED;
    }

    /// @inheritdoc IIRM
    function computeInterestRate(address vault, uint256 cash, uint256 borrows) external returns (uint256) {
        if (msg.sender != vault) revert E_IRMUpdateUnauthorized();

        // Do not update state until the first borrow.
        if (borrows == 0 && irState[vault].lastUpdate == 0) {
            return uint256(_curve(INITIAL_RATE_AT_TARGET, _calcErr(0))) * 1e9;
        }

        int256 utilization = _calcUtilization(cash, borrows);
        (uint256 rate, uint256 rateAtTarget) = computeInterestRateInternal(vault, utilization);

        irState[vault] = IRState(uint144(rateAtTarget), int64(utilization), uint48(block.timestamp));
        return rate * 1e9; // Extend rate to RAY/sec for EVK.
    }

    /// @inheritdoc IIRM
    function computeInterestRateView(address vault, uint256 cash, uint256 borrows) external view returns (uint256) {
        int256 utilization = _calcUtilization(cash, borrows);
        (uint256 rate,) = computeInterestRateInternal(vault, utilization);
        return rate * 1e9; // Extend rate to RAY/sec for EVK.
    }

    /// @notice Perform computation of the new rate at target without mutating state.
    /// @param vault Address of the vault to compute the new interest rate for.
    /// @param cash Amount of assets held directly by the vault.
    /// @param borrows Amount of assets lent out to borrowers by the vault.
    /// @return The new rate at target utilization in RAY units.
    function computeRateAtTargetView(address vault, uint256 cash, uint256 borrows) external view returns (uint256) {
        int256 utilization = _calcUtilization(cash, borrows);
        (, uint256 rateAtTarget) = computeInterestRateInternal(vault, utilization);
        return rateAtTarget * 1e9; // Extend rate to RAY/sec for EVK.
    }

    /// @notice Get the timestamp of the last update for a vault.
    /// @param vault Address of the vault to get the last update timestamp for.
    /// @return The last update timestamp.
    function getLastUpdateTimestamp(address vault) external view returns (uint256) {
        return irState[vault].lastUpdate;
    }

    /// @notice Compute the new interest rate and rate at target utilization of a vault.
    /// @param vault Address of the vault to compute the new interest rate for.
    /// @return The new interest rate at current utilization.
    /// @return The new interest rate at target utilization.
    function computeInterestRateInternal(address vault, int256 utilization) internal view returns (uint256, uint256) {
        // Calculate normalized distance using previous utilization for curve shifting
        int256 lastUtilization = irState[vault].lastUpdate == 0 ? utilization : int256(irState[vault].lastUtilization);
        int256 errOld = _calcErr(lastUtilization);

        // Calculate normalized distance using current utilization for position on curve
        int256 errNew = _calcErr(utilization);

        IRState memory state = irState[vault];
        int256 startRateAtTarget = int256(uint256(state.rateAtTarget));
        int256 endRateAtTarget;

        if (startRateAtTarget == 0) {
            // First interaction.
            endRateAtTarget = INITIAL_RATE_AT_TARGET;
        } else {
            // Use errOld for curve shifting
            int256 speed = ADJUSTMENT_SPEED * errOld / WAD;

            // Calculate the adaptation parameter.
            int256 elapsed = int256(block.timestamp - state.lastUpdate);
            int256 linearAdaptation = speed * elapsed;

            if (linearAdaptation == 0) {
                endRateAtTarget = startRateAtTarget;
            } else {
                endRateAtTarget = _newRateAtTarget(startRateAtTarget, linearAdaptation);
            }
        }

        // Use errNew for position on curve to get current interest rate
        return (uint256(_curve(endRateAtTarget, errNew)), uint256(endRateAtTarget));
    }

    /// @notice Calculate the interest rate according to the linear kink model.
    /// @param rateAtTarget The current interest rate at target utilization.
    /// @param err The distance between the current utilization and the target utilization, normalized to `[-1, +1]`.
    /// @dev rate = ((1-1/C)*err + 1) * rateAtTarget if err < 0
    ///             (C-1)*err + 1) * rateAtTarget else.
    /// @return The new interest rate at current utilization.
    function _curve(int256 rateAtTarget, int256 err) internal view returns (int256) {
        // Non negative because 1 - 1/C >= 0, C - 1 >= 0.
        int256 coeff = err < 0 ? WAD - WAD * WAD / CURVE_STEEPNESS : CURVE_STEEPNESS - WAD;
        // Non negative if rateAtTarget >= 0 because if err < 0, coeff <= 1.
        return ((coeff * err / WAD) + WAD) * rateAtTarget / WAD;
    }

    /// @notice Calculate the new interest rate at target utilization by applying an adaptation.
    /// @param startRateAtTarget The current interest rate at target utilization.
    /// @param linearAdaptation The adaptation parameter, used as a power of `e`.
    /// @dev Applies exponential growth/decay to the current interest rate at target utilization.
    /// Formula: `rateAtTarget = startRateAtTarget * e^linearAdaptation` bounded to min and max.
    /// @return The new interest rate at target utilization.
    function _newRateAtTarget(int256 startRateAtTarget, int256 linearAdaptation) internal view returns (int256) {
        int256 rateAtTarget = startRateAtTarget * ExpLib.wExp(linearAdaptation) / WAD;
        if (rateAtTarget < MIN_RATE_AT_TARGET) return MIN_RATE_AT_TARGET;
        if (rateAtTarget > MAX_RATE_AT_TARGET) return MAX_RATE_AT_TARGET;
        return rateAtTarget;
    }

    /// @notice Calculate the normalized distance between the utilization and target utilization.
    /// @param utilization The utilization rate.
    /// @return The normalized distance between the utilization and target utilization.
    function _calcErr(int256 utilization) internal view returns (int256) {
        int256 errNormFactor = utilization > TARGET_UTILIZATION ? WAD - TARGET_UTILIZATION : TARGET_UTILIZATION;
        return (utilization - TARGET_UTILIZATION) * WAD / errNormFactor;
    }

    /// @notice Calculate the utilization rate, given cash and borrows from the vault.
    /// @param cash Amount of assets held directly by the vault.
    /// @param borrows Amount of assets lent out to borrowers by the vault.
    /// @return The utilization rate in WAD.
    function _calcUtilization(uint256 cash, uint256 borrows) internal pure returns (int256) {
        int256 totalAssets = int256(cash + borrows);
        if (totalAssets == 0) return 0;
        return int256(borrows) * WAD / totalAssets;
    }
}

File 4 of 6 : IFactory.sol
// SPDX-License-Identifier: GPL-2.0-or-later

pragma solidity >=0.8.0;

/// @title IFactory
/// @custom:security-contact [email protected]
/// @author Euler Labs (https://www.eulerlabs.com/)
/// @notice A minimal factory interface for deploying contracts.
interface IFactory {
    struct DeploymentInfo {
        /// @notice The sender of the deployment call.
        address deployer;
        /// @notice The timestamp when the contract was deployed.
        uint96 deployedAt;
    }

    /// @notice An instance of a contract was deployed.
    /// @param deployedContract The deployment address of the contract.
    /// @param deployer The sender of the deployment call.
    /// @param deployedAt The deployment timestamp of the contract.
    event ContractDeployed(address indexed deployedContract, address indexed deployer, uint256 deployedAt);

    /// @notice Error thrown when the query is incorrect.
    error Factory_BadQuery();

    /// @notice Contracts deployed by the factory.
    function getDeploymentInfo(address contractAddress) external view returns (address deployer, uint96 deployedAt);

    /// @notice Checks if the deployment at the given address is valid.
    /// @param contractAddress The address of the contract to check.
    /// @return True if the deployment is valid, false otherwise.
    function isValidDeployment(address contractAddress) external view returns (bool);

    /// @notice Returns the number of contracts deployed by the factory.
    /// @return The number of deployed contracts.
    function getDeploymentsListLength() external view returns (uint256);

    /// @notice Returns a slice of the list of deployments.
    /// @param start The starting index of the slice.
    /// @param end The ending index of the slice (exclusive).
    /// @return list An array of addresses of the deployed contracts in the specified range.
    function getDeploymentsListSlice(uint256 start, uint256 end) external view returns (address[] memory list);
}

File 5 of 6 : IIRM.sol
// SPDX-License-Identifier: GPL-2.0-or-later

pragma solidity >=0.8.0;

/// @title IIRM
/// @custom:security-contact [email protected]
/// @author Euler Labs (https://www.eulerlabs.com/)
/// @notice Interface of the interest rate model contracts used by EVault
interface IIRM {
    error E_IRMUpdateUnauthorized();

    /// @notice Perform potentially state mutating computation of the new interest rate
    /// @param vault Address of the vault to compute the new interest rate for
    /// @param cash Amount of assets held directly by the vault
    /// @param borrows Amount of assets lent out to borrowers by the vault
    /// @return Then new interest rate in second percent yield (SPY), scaled by 1e27
    function computeInterestRate(address vault, uint256 cash, uint256 borrows) external returns (uint256);

    /// @notice Perform computation of the new interest rate without mutating state
    /// @param vault Address of the vault to compute the new interest rate for
    /// @param cash Amount of assets held directly by the vault
    /// @param borrows Amount of assets lent out to borrowers by the vault
    /// @return Then new interest rate in second percent yield (SPY), scaled by 1e27
    function computeInterestRateView(address vault, uint256 cash, uint256 borrows) external view returns (uint256);
}

File 6 of 6 : ExpLib.sol
// SPDX-License-Identifier: MIT
// Copyright (c) 2023 Morpho Association
pragma solidity ^0.8.0;
/// @title ExpLib
/// @custom:contact [email protected]
/// @author Adapted from Morpho Labs
/// (https://github.com/morpho-org/morpho-blue-irm/blob/a824ce06a53f45f12d0ffedb51abd756896b29fa/src/adaptive-curve-irm/libraries/ExpLib.sol)
/// @notice Library to approximate the exponential function.

library ExpLib {
    int256 internal constant WAD = 1e18;
    /// @dev ln(2).
    int256 internal constant LN_2_INT = 0.693147180559945309e18;
    /// @dev ln(1e-18).
    int256 internal constant LN_WEI_INT = -41.446531673892822312e18;
    /// @dev Above this bound, `wExp` is clipped to avoid overflowing when multiplied with 1e18.
    /// @dev This upper bound corresponds to: ln(type(int256).max / 1e36) (scaled by WAD, floored).
    int256 internal constant WEXP_UPPER_BOUND = 93.859467695000404319e18;
    /// @dev The value of wExp(`WEXP_UPPER_BOUND`).
    int256 internal constant WEXP_UPPER_VALUE = 57716089161558943949701069502944508345128.422502756744429568e18;
    /// @dev Returns an approximation of exp.

    function wExp(int256 x) internal pure returns (int256) {
        unchecked {
            // If x < ln(1e-18) then exp(x) < 1e-18 so it is rounded to zero.
            if (x < LN_WEI_INT) return 0;
            // `wExp` is clipped to avoid overflowing when multiplied with 1e18.
            if (x >= WEXP_UPPER_BOUND) return WEXP_UPPER_VALUE;
            // Decompose x as x = q * ln(2) + r with q an integer and -ln(2)/2 <= r <= ln(2)/2.
            // q = x / ln(2) rounded half toward zero.
            int256 roundingAdjustment = (x < 0) ? -(LN_2_INT / 2) : (LN_2_INT / 2);
            // Safe unchecked because x is bounded.
            int256 q = (x + roundingAdjustment) / LN_2_INT;
            // Safe unchecked because |q * ln(2) - x| <= ln(2)/2.
            int256 r = x - q * LN_2_INT;
            // Compute e^r with a 2nd-order Taylor polynomial.
            // Safe unchecked because |r| < 1e18.
            int256 expR = WAD + r + (r * r) / WAD / 2;
            // Return e^x = 2^q * e^r.
            if (q >= 0) return expR << uint256(q);
            else return expR >> uint256(-q);
        }
    }
}

Settings
{
  "remappings": [
    "lib/euler-price-oracle:@openzeppelin/contracts/=lib/euler-price-oracle/lib/openzeppelin-contracts/contracts/",
    "lib/euler-earn:@openzeppelin/=lib/euler-earn/lib/openzeppelin-contracts/",
    "lib/euler-earn:@openzeppelin-upgradeable/=lib/euler-earn/lib/openzeppelin-contracts-upgradeable/contracts/",
    "lib/euler-earn:ethereum-vault-connector/=lib/euler-earn/lib/ethereum-vault-connector/src/",
    "lib/layerzero-devtools/packages/oft-evm/contracts:@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts/contracts/",
    "lib/layerzero-devtools/packages/oft-evm-upgradeable/contracts:@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/",
    "lib/layerzero-devtools/packages/oapp-evm-upgradeable/contracts:@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/",
    "@layerzerolabs/oft-evm/=lib/layerzero-devtools/packages/oft-evm/",
    "@layerzerolabs/oapp-evm/=lib/layerzero-devtools/packages/oapp-evm/",
    "@layerzerolabs/oapp-evm-upgradeable/=lib/layerzero-devtools/packages/oapp-evm-upgradeable/",
    "@layerzerolabs/lz-evm-protocol-v2/=lib/layerzero-v2/packages/layerzero-v2/evm/protocol/",
    "@layerzerolabs/lz-evm-messagelib-v2/=lib/layerzero-v2/packages/layerzero-v2/evm/messagelib/",
    "@layerzerolabs/lz-evm-oapp-v2/=lib/layerzero-v2/packages/layerzero-v2/evm/oapp/",
    "openzeppelin-contracts/=lib/openzeppelin-contracts/contracts/",
    "openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/",
    "ethereum-vault-connector/=lib/ethereum-vault-connector/src/",
    "evc/=lib/ethereum-vault-connector/src/",
    "evk/=lib/euler-vault-kit/src/",
    "evk-test/=lib/euler-vault-kit/test/",
    "euler-price-oracle/=lib/euler-price-oracle/src/",
    "euler-price-oracle-test/=lib/euler-price-oracle/test/",
    "fee-flow/=lib/fee-flow/src/",
    "reward-streams/=lib/reward-streams/src/",
    "@openzeppelin/=lib/openzeppelin-contracts/contracts/",
    "euler-earn/=lib/euler-earn/src/",
    "layerzero/oft-evm/=lib/layerzero-devtools/packages/oft-evm/contracts/",
    "layerzero/oft-evm-upgradeable/=lib/layerzero-devtools/packages/oft-evm-upgradeable/contracts/",
    "solidity-bytes-utils/=lib/solidity-bytes-utils/",
    "@openzeppelin-upgradeable/=lib/euler-earn/lib/openzeppelin-contracts-upgradeable/contracts/",
    "@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/",
    "@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/",
    "@pendle/core-v2/=lib/euler-price-oracle/lib/pendle-core-v2-public/contracts/",
    "@pyth/=lib/euler-price-oracle/lib/pyth-sdk-solidity/",
    "@redstone/evm-connector/=lib/euler-price-oracle/lib/redstone-oracles-monorepo/packages/evm-connector/contracts/",
    "@solady/=lib/euler-price-oracle/lib/solady/src/",
    "@uniswap/v3-core/=lib/euler-price-oracle/lib/v3-core/",
    "@uniswap/v3-periphery/=lib/euler-price-oracle/lib/v3-periphery/",
    "ERC4626/=lib/euler-earn/lib/properties/lib/ERC4626/contracts/",
    "crytic-properties/=lib/euler-earn/lib/properties/contracts/",
    "ds-test/=lib/ethereum-vault-connector/lib/forge-std/lib/ds-test/src/",
    "erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/",
    "euler-vault-kit/=lib/euler-vault-kit/",
    "forge-gas-snapshot/=lib/euler-vault-kit/lib/permit2/lib/forge-gas-snapshot/src/",
    "forge-std/=lib/forge-std/src/",
    "halmos-cheatcodes/=lib/openzeppelin-contracts-upgradeable/lib/halmos-cheatcodes/src/",
    "layerzero-devtools/=lib/layerzero-devtools/packages/toolbox-foundry/src/",
    "layerzero-v2/=lib/layerzero-v2/",
    "openzeppelin/=lib/ethereum-vault-connector/lib/openzeppelin-contracts/contracts/",
    "pendle-core-v2-public/=lib/euler-price-oracle/lib/pendle-core-v2-public/contracts/",
    "permit2/=lib/euler-vault-kit/lib/permit2/",
    "properties/=lib/euler-earn/lib/properties/contracts/",
    "pyth-sdk-solidity/=lib/euler-price-oracle/lib/pyth-sdk-solidity/",
    "redstone-oracles-monorepo/=lib/euler-price-oracle/lib/",
    "solady/=lib/euler-price-oracle/lib/solady/src/",
    "solmate/=lib/fee-flow/lib/solmate/src/",
    "v3-core/=lib/euler-price-oracle/lib/v3-core/contracts/",
    "v3-periphery/=lib/euler-price-oracle/lib/v3-periphery/contracts/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 20000
  },
  "metadata": {
    "useLiteralContent": false,
    "bytecodeHash": "ipfs",
    "appendCBOR": true
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "cancun",
  "viaIR": false,
  "libraries": {}
}

Contract Security Audit

Contract ABI

API
[{"inputs":[],"name":"Factory_BadQuery","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"deployedContract","type":"address"},{"indexed":true,"internalType":"address","name":"deployer","type":"address"},{"indexed":false,"internalType":"uint256","name":"deployedAt","type":"uint256"}],"name":"ContractDeployed","type":"event"},{"inputs":[{"internalType":"int256","name":"_TARGET_UTILIZATION","type":"int256"},{"internalType":"int256","name":"_INITIAL_RATE_AT_TARGET","type":"int256"},{"internalType":"int256","name":"_MIN_RATE_AT_TARGET","type":"int256"},{"internalType":"int256","name":"_MAX_RATE_AT_TARGET","type":"int256"},{"internalType":"int256","name":"_CURVE_STEEPNESS","type":"int256"},{"internalType":"int256","name":"_ADJUSTMENT_SPEED","type":"int256"}],"name":"deploy","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"deployments","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"}],"name":"getDeploymentInfo","outputs":[{"internalType":"address","name":"deployer","type":"address"},{"internalType":"uint96","name":"deployedAt","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDeploymentsListLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"}],"name":"getDeploymentsListSlice","outputs":[{"internalType":"address[]","name":"list","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"}],"name":"isValidDeployment","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]

608060405234801561000f575f80fd5b506117c48061001d5f395ff3fe608060405234801561000f575f80fd5b506004361061006f575f3560e01c80636ee0787a1161004d5780636ee0787a1461016e578063dd1faaef146101db578063e536913d146101ee575f80fd5b806306609bbe146100735780633fc756f8146100b05780636aebd5831461015d575b5f80fd5b610086610081366004610512565b61020e565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6101246100be366004610529565b73ffffffffffffffffffffffffffffffffffffffff9081165f9081526020818152604091829020825180840190935254928316808352740100000000000000000000000000000000000000009093046bffffffffffffffffffffffff1691018190529091565b6040805173ffffffffffffffffffffffffffffffffffffffff90931683526bffffffffffffffffffffffff9091166020830152016100a7565b6001546040519081526020016100a7565b6101cb61017c366004610529565b73ffffffffffffffffffffffffffffffffffffffff165f908152602081905260409020547401000000000000000000000000000000000000000090046bffffffffffffffffffffffff16151590565b60405190151581526020016100a7565b6100866101e9366004610563565b610243565b6102016101fc3660046105a2565b6103a5565b6040516100a791906105c2565b6001818154811061021d575f80fd5b5f9182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b5f8087878787878760405161025790610505565b958652602086019490945260408501929092526060840152608083015260a082015260c001604051809103905ff080158015610295573d5f803e3d5ffd5b50604080518082018252338082526bffffffffffffffffffffffff42818116602080860191825273ffffffffffffffffffffffffffffffffffffffff8089165f8181529283905288832097519351909516740100000000000000000000000000000000000000000292169190911790945560018054808201825594527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf690930180547fffffffffffffffffffffffff000000000000000000000000000000000000000016821790559251939450927fac4ce915ef22753b636e57aac5ae5fdd9d13d782ae5bf6dbcda15e29f95386c1916103929190815260200190565b60405180910390a3979650505050505050565b60607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036103d45760015491505b828210806103e3575060015482115b1561041a576040517f4e32a13200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6104248383610648565b67ffffffffffffffff81111561043c5761043c610661565b604051908082528060200260200182016040528015610465578160200160208202803683370190505b5090505f5b6104748484610648565b8110156104fe576001610487828661068e565b81548110610497576104976106a1565b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff168282815181106104d1576104d16106a1565b73ffffffffffffffffffffffffffffffffffffffff9092166020928302919091019091015260010161046a565b5092915050565b6110c0806106cf83390190565b5f60208284031215610522575f80fd5b5035919050565b5f60208284031215610539575f80fd5b813573ffffffffffffffffffffffffffffffffffffffff8116811461055c575f80fd5b9392505050565b5f805f805f8060c08789031215610578575f80fd5b505084359660208601359650604086013595606081013595506080810135945060a0013592509050565b5f80604083850312156105b3575f80fd5b50508035926020909101359150565b602080825282518282018190525f9190848201906040850190845b8181101561060f57835173ffffffffffffffffffffffffffffffffffffffff16835292840192918401916001016105dd565b50909695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8181038181111561065b5761065b61061b565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b8082018082111561065b5761065b61061b565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffdfe61014060405234801562000011575f80fd5b50604051620010c0380380620010c0833981016040819052620000349162000208565b5f861315806200004b5750670de0b6b3a764000086135b156200006a57604051635435b28960e11b815260040160405180910390fd5b838512806200007857508285135b156200009757604051635435b28960e11b815260040160405180910390fd5b620000ae6301e1855866038d7ea4c680006200024f565b841280620000d25750620000cf6301e18558678ac7230489e800006200024f565b84135b15620000f157604051635435b28960e11b815260040160405180910390fd5b620001086301e1855866038d7ea4c680006200024f565b8312806200012c5750620001296301e18558678ac7230489e800006200024f565b83135b156200014b57604051635435b28960e11b815260040160405180910390fd5b670e043da6172500008212806200016a575068056bc75e2d6310000082135b156200018957604051635435b28960e11b815260040160405180910390fd5b620001a16301e18558671bc16d674ec800006200024f565b811280620001c65750620001c36301e18558683635c9adc5dea000006200024f565b81135b15620001e557604051635435b28960e11b815260040160405180910390fd5b60809590955260a09390935260c09190915260e052610100526101205262000295565b5f805f805f8060c087890312156200021e575f80fd5b865195506020870151945060408701519350606087015192506080870151915060a087015190509295509295509295565b5f826200026a57634e487b7160e01b5f52601260045260245ffd5b600160ff1b82145f19841416156200029057634e487b7160e01b5f52601160045260245ffd5b500590565b60805160a05160c05160e0516101005161012051610d89620003375f395f81816101f8015261070d01525f81816102800152818161088001526108ab01525f81816101d1015281816109ab01526109d301525f818160cd0152818161095a015261098201525f8181610259015281816103b301526106d901525f818161021f015281816107a2015281816107c9015281816107f201526108300152610d895ff3fe608060405234801561000f575f80fd5b50600436106100c4575f3560e01c806358f5cbad1161007d578063bca02c1311610058578063bca02c1314610241578063d91042b514610254578063fc4c2d541461027b575f80fd5b806358f5cbad146101cc5780635a92fa85146101f35780639a1a14d91461021a575f80fd5b80631a351d62116100ad5780631a351d621461014b5780632e34c872146101a65780634395b4fb146101b9575f80fd5b8063019ec38b146100c857806306fdde0314610102575b5f80fd5b6100ef7f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020015b60405180910390f35b61013e6040518060400160405280601081526020017f49524d416461707469766543757276650000000000000000000000000000000081525081565b6040516100f99190610aea565b6100ef610159366004610b7c565b73ffffffffffffffffffffffffffffffffffffffff165f908152602081905260409020547a010000000000000000000000000000000000000000000000000000900465ffffffffffff1690565b6100ef6101b4366004610b95565b6102a2565b6100ef6101c7366004610b95565b6102d8565b6100ef7f000000000000000000000000000000000000000000000000000000000000000081565b6100ef7f000000000000000000000000000000000000000000000000000000000000000081565b6100ef7f000000000000000000000000000000000000000000000000000000000000000081565b6100ef61024f366004610b95565b610303565b6100ef7f000000000000000000000000000000000000000000000000000000000000000081565b6100ef7f000000000000000000000000000000000000000000000000000000000000000081565b5f806102ae8484610541565b90505f6102bb8683610586565b5090506102cc81633b9aca00610bf2565b925050505b9392505050565b5f806102e48484610541565b90505f6102f18683610586565b91506102cc905081633b9aca00610bf2565b5f3373ffffffffffffffffffffffffffffffffffffffff851614610353576040517f35a4399400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b811580156103a9575073ffffffffffffffffffffffffffffffffffffffff84165f908152602081905260409020547a010000000000000000000000000000000000000000000000000000900465ffffffffffff16155b156103f5576103e07f00000000000000000000000000000000000000000000000000000000000000006103db5f61079e565b610869565b6103ee90633b9aca00610bf2565b90506102d1565b5f6104008484610541565b90505f8061040e8784610586565b9150915060405180606001604052808271ffffffffffffffffffffffffffffffffffff1681526020018460070b81526020014265ffffffffffff168152505f808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a81548171ffffffffffffffffffffffffffffffffffff021916908371ffffffffffffffffffffffffffffffffffff1602179055506020820151815f0160126101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff1602179055506040820151815f01601a6101000a81548165ffffffffffff021916908365ffffffffffff16021790555090505081633b9aca006105369190610bf2565b979650505050505050565b5f8061054d8385610c09565b9050805f0361055f575f915050610580565b80610572670de0b6b3a764000085610c1c565b61057c9190610c67565b9150505b92915050565b73ffffffffffffffffffffffffffffffffffffffff82165f90815260208190526040812054819081907a010000000000000000000000000000000000000000000000000000900465ffffffffffff161561061d5773ffffffffffffffffffffffffffffffffffffffff85165f908152602081905260409020547201000000000000000000000000000000000000900460070b61061f565b835b90505f61062b8261079e565b90505f6106378661079e565b73ffffffffffffffffffffffffffffffffffffffff88165f908152602081815260408083208151606081018352905471ffffffffffffffffffffffffffffffffffff81168083527201000000000000000000000000000000000000820460070b948301949094527a010000000000000000000000000000000000000000000000000000900465ffffffffffff1691810191909152929350908181036106fd57507f0000000000000000000000000000000000000000000000000000000000000000610785565b5f670de0b6b3a7640000610731877f0000000000000000000000000000000000000000000000000000000000000000610c1c565b61073b9190610c67565b90505f846040015165ffffffffffff16426107569190610cf3565b90505f6107638284610c1c565b9050805f0361077457849350610781565b61077e858261092e565b93505b5050505b61078f8185610869565b9a909950975050505050505050565b5f807f000000000000000000000000000000000000000000000000000000000000000083136107ed577f000000000000000000000000000000000000000000000000000000000000000061081f565b61081f7f0000000000000000000000000000000000000000000000000000000000000000670de0b6b3a7640000610d06565b905080670de0b6b3a76400006108557f000000000000000000000000000000000000000000000000000000000000000086610d06565b61085f9190610c1c565b6102d19190610c67565b5f805f83126108a9576108a4670de0b6b3a76400007f0000000000000000000000000000000000000000000000000000000000000000610d06565b6108f8565b7f00000000000000000000000000000000000000000000000000000000000000006108dc670de0b6b3a764000080610c1c565b6108e69190610c67565b6108f890670de0b6b3a7640000610d06565b9050670de0b6b3a76400008481806109108786610c1c565b61091a9190610c67565b6109249190610d2c565b6105729190610c1c565b5f80670de0b6b3a7640000610942846109fa565b61094c9086610c1c565b6109569190610c67565b90507f00000000000000000000000000000000000000000000000000000000000000008112156109a9577f0000000000000000000000000000000000000000000000000000000000000000915050610580565b7f00000000000000000000000000000000000000000000000000000000000000008113156102d1577f0000000000000000000000000000000000000000000000000000000000000000915050610580565b5f7ffffffffffffffffffffffffffffffffffffffffffffffffdc0d0570925a462d8821215610a2a57505f919050565b6805168fd0946fc0415f8212610a5a5750780931d81650c7d88b8000000000000000000000000000000000919050565b5f808312610a70576704cf46d8192b672e610a92565b7ffffffffffffffffffffffffffffffffffffffffffffffffffb30b927e6d498d25b905067099e8db03256ce5d83820181900590810284035f6002670de0b6b3a7640000838002050582670de0b6b3a7640000010190505f8312610ad95790911b949350505050565b825f0381901d945050505050919050565b5f602080835283518060208501525f5b81811015610b1657858101830151858201604001528201610afa565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610b77575f80fd5b919050565b5f60208284031215610b8c575f80fd5b6102d182610b54565b5f805f60608486031215610ba7575f80fd5b610bb084610b54565b95602085013595506040909401359392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808202811582820484141761058057610580610bc5565b8082018082111561058057610580610bc5565b8082025f82127f800000000000000000000000000000000000000000000000000000000000000084141615610c5357610c53610bc5565b818105831482151761058057610580610bc5565b5f82610c9a577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f800000000000000000000000000000000000000000000000000000000000000083141615610cee57610cee610bc5565b500590565b8181038181111561058057610580610bc5565b8181035f831280158383131683831282161715610d2557610d25610bc5565b5092915050565b8082018281125f831280158216821582161715610d4b57610d4b610bc5565b50509291505056fea26469706673582212205ab84ff6cf39d2aeb60240d99cbcc9d2d9b0330de02a90a6933d6d20f71f490b64736f6c63430008180033a26469706673582212205b1778f66092619e1dbc878c1e5abb4f38b20faff52ecc04a931597f0f3fd2d764736f6c63430008180033

Deployed Bytecode

0x608060405234801561000f575f80fd5b506004361061006f575f3560e01c80636ee0787a1161004d5780636ee0787a1461016e578063dd1faaef146101db578063e536913d146101ee575f80fd5b806306609bbe146100735780633fc756f8146100b05780636aebd5831461015d575b5f80fd5b610086610081366004610512565b61020e565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6101246100be366004610529565b73ffffffffffffffffffffffffffffffffffffffff9081165f9081526020818152604091829020825180840190935254928316808352740100000000000000000000000000000000000000009093046bffffffffffffffffffffffff1691018190529091565b6040805173ffffffffffffffffffffffffffffffffffffffff90931683526bffffffffffffffffffffffff9091166020830152016100a7565b6001546040519081526020016100a7565b6101cb61017c366004610529565b73ffffffffffffffffffffffffffffffffffffffff165f908152602081905260409020547401000000000000000000000000000000000000000090046bffffffffffffffffffffffff16151590565b60405190151581526020016100a7565b6100866101e9366004610563565b610243565b6102016101fc3660046105a2565b6103a5565b6040516100a791906105c2565b6001818154811061021d575f80fd5b5f9182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b5f8087878787878760405161025790610505565b958652602086019490945260408501929092526060840152608083015260a082015260c001604051809103905ff080158015610295573d5f803e3d5ffd5b50604080518082018252338082526bffffffffffffffffffffffff42818116602080860191825273ffffffffffffffffffffffffffffffffffffffff8089165f8181529283905288832097519351909516740100000000000000000000000000000000000000000292169190911790945560018054808201825594527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf690930180547fffffffffffffffffffffffff000000000000000000000000000000000000000016821790559251939450927fac4ce915ef22753b636e57aac5ae5fdd9d13d782ae5bf6dbcda15e29f95386c1916103929190815260200190565b60405180910390a3979650505050505050565b60607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036103d45760015491505b828210806103e3575060015482115b1561041a576040517f4e32a13200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6104248383610648565b67ffffffffffffffff81111561043c5761043c610661565b604051908082528060200260200182016040528015610465578160200160208202803683370190505b5090505f5b6104748484610648565b8110156104fe576001610487828661068e565b81548110610497576104976106a1565b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff168282815181106104d1576104d16106a1565b73ffffffffffffffffffffffffffffffffffffffff9092166020928302919091019091015260010161046a565b5092915050565b6110c0806106cf83390190565b5f60208284031215610522575f80fd5b5035919050565b5f60208284031215610539575f80fd5b813573ffffffffffffffffffffffffffffffffffffffff8116811461055c575f80fd5b9392505050565b5f805f805f8060c08789031215610578575f80fd5b505084359660208601359650604086013595606081013595506080810135945060a0013592509050565b5f80604083850312156105b3575f80fd5b50508035926020909101359150565b602080825282518282018190525f9190848201906040850190845b8181101561060f57835173ffffffffffffffffffffffffffffffffffffffff16835292840192918401916001016105dd565b50909695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8181038181111561065b5761065b61061b565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b8082018082111561065b5761065b61061b565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffdfe61014060405234801562000011575f80fd5b50604051620010c0380380620010c0833981016040819052620000349162000208565b5f861315806200004b5750670de0b6b3a764000086135b156200006a57604051635435b28960e11b815260040160405180910390fd5b838512806200007857508285135b156200009757604051635435b28960e11b815260040160405180910390fd5b620000ae6301e1855866038d7ea4c680006200024f565b841280620000d25750620000cf6301e18558678ac7230489e800006200024f565b84135b15620000f157604051635435b28960e11b815260040160405180910390fd5b620001086301e1855866038d7ea4c680006200024f565b8312806200012c5750620001296301e18558678ac7230489e800006200024f565b83135b156200014b57604051635435b28960e11b815260040160405180910390fd5b670e043da6172500008212806200016a575068056bc75e2d6310000082135b156200018957604051635435b28960e11b815260040160405180910390fd5b620001a16301e18558671bc16d674ec800006200024f565b811280620001c65750620001c36301e18558683635c9adc5dea000006200024f565b81135b15620001e557604051635435b28960e11b815260040160405180910390fd5b60809590955260a09390935260c09190915260e052610100526101205262000295565b5f805f805f8060c087890312156200021e575f80fd5b865195506020870151945060408701519350606087015192506080870151915060a087015190509295509295509295565b5f826200026a57634e487b7160e01b5f52601260045260245ffd5b600160ff1b82145f19841416156200029057634e487b7160e01b5f52601160045260245ffd5b500590565b60805160a05160c05160e0516101005161012051610d89620003375f395f81816101f8015261070d01525f81816102800152818161088001526108ab01525f81816101d1015281816109ab01526109d301525f818160cd0152818161095a015261098201525f8181610259015281816103b301526106d901525f818161021f015281816107a2015281816107c9015281816107f201526108300152610d895ff3fe608060405234801561000f575f80fd5b50600436106100c4575f3560e01c806358f5cbad1161007d578063bca02c1311610058578063bca02c1314610241578063d91042b514610254578063fc4c2d541461027b575f80fd5b806358f5cbad146101cc5780635a92fa85146101f35780639a1a14d91461021a575f80fd5b80631a351d62116100ad5780631a351d621461014b5780632e34c872146101a65780634395b4fb146101b9575f80fd5b8063019ec38b146100c857806306fdde0314610102575b5f80fd5b6100ef7f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020015b60405180910390f35b61013e6040518060400160405280601081526020017f49524d416461707469766543757276650000000000000000000000000000000081525081565b6040516100f99190610aea565b6100ef610159366004610b7c565b73ffffffffffffffffffffffffffffffffffffffff165f908152602081905260409020547a010000000000000000000000000000000000000000000000000000900465ffffffffffff1690565b6100ef6101b4366004610b95565b6102a2565b6100ef6101c7366004610b95565b6102d8565b6100ef7f000000000000000000000000000000000000000000000000000000000000000081565b6100ef7f000000000000000000000000000000000000000000000000000000000000000081565b6100ef7f000000000000000000000000000000000000000000000000000000000000000081565b6100ef61024f366004610b95565b610303565b6100ef7f000000000000000000000000000000000000000000000000000000000000000081565b6100ef7f000000000000000000000000000000000000000000000000000000000000000081565b5f806102ae8484610541565b90505f6102bb8683610586565b5090506102cc81633b9aca00610bf2565b925050505b9392505050565b5f806102e48484610541565b90505f6102f18683610586565b91506102cc905081633b9aca00610bf2565b5f3373ffffffffffffffffffffffffffffffffffffffff851614610353576040517f35a4399400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b811580156103a9575073ffffffffffffffffffffffffffffffffffffffff84165f908152602081905260409020547a010000000000000000000000000000000000000000000000000000900465ffffffffffff16155b156103f5576103e07f00000000000000000000000000000000000000000000000000000000000000006103db5f61079e565b610869565b6103ee90633b9aca00610bf2565b90506102d1565b5f6104008484610541565b90505f8061040e8784610586565b9150915060405180606001604052808271ffffffffffffffffffffffffffffffffffff1681526020018460070b81526020014265ffffffffffff168152505f808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a81548171ffffffffffffffffffffffffffffffffffff021916908371ffffffffffffffffffffffffffffffffffff1602179055506020820151815f0160126101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff1602179055506040820151815f01601a6101000a81548165ffffffffffff021916908365ffffffffffff16021790555090505081633b9aca006105369190610bf2565b979650505050505050565b5f8061054d8385610c09565b9050805f0361055f575f915050610580565b80610572670de0b6b3a764000085610c1c565b61057c9190610c67565b9150505b92915050565b73ffffffffffffffffffffffffffffffffffffffff82165f90815260208190526040812054819081907a010000000000000000000000000000000000000000000000000000900465ffffffffffff161561061d5773ffffffffffffffffffffffffffffffffffffffff85165f908152602081905260409020547201000000000000000000000000000000000000900460070b61061f565b835b90505f61062b8261079e565b90505f6106378661079e565b73ffffffffffffffffffffffffffffffffffffffff88165f908152602081815260408083208151606081018352905471ffffffffffffffffffffffffffffffffffff81168083527201000000000000000000000000000000000000820460070b948301949094527a010000000000000000000000000000000000000000000000000000900465ffffffffffff1691810191909152929350908181036106fd57507f0000000000000000000000000000000000000000000000000000000000000000610785565b5f670de0b6b3a7640000610731877f0000000000000000000000000000000000000000000000000000000000000000610c1c565b61073b9190610c67565b90505f846040015165ffffffffffff16426107569190610cf3565b90505f6107638284610c1c565b9050805f0361077457849350610781565b61077e858261092e565b93505b5050505b61078f8185610869565b9a909950975050505050505050565b5f807f000000000000000000000000000000000000000000000000000000000000000083136107ed577f000000000000000000000000000000000000000000000000000000000000000061081f565b61081f7f0000000000000000000000000000000000000000000000000000000000000000670de0b6b3a7640000610d06565b905080670de0b6b3a76400006108557f000000000000000000000000000000000000000000000000000000000000000086610d06565b61085f9190610c1c565b6102d19190610c67565b5f805f83126108a9576108a4670de0b6b3a76400007f0000000000000000000000000000000000000000000000000000000000000000610d06565b6108f8565b7f00000000000000000000000000000000000000000000000000000000000000006108dc670de0b6b3a764000080610c1c565b6108e69190610c67565b6108f890670de0b6b3a7640000610d06565b9050670de0b6b3a76400008481806109108786610c1c565b61091a9190610c67565b6109249190610d2c565b6105729190610c1c565b5f80670de0b6b3a7640000610942846109fa565b61094c9086610c1c565b6109569190610c67565b90507f00000000000000000000000000000000000000000000000000000000000000008112156109a9577f0000000000000000000000000000000000000000000000000000000000000000915050610580565b7f00000000000000000000000000000000000000000000000000000000000000008113156102d1577f0000000000000000000000000000000000000000000000000000000000000000915050610580565b5f7ffffffffffffffffffffffffffffffffffffffffffffffffdc0d0570925a462d8821215610a2a57505f919050565b6805168fd0946fc0415f8212610a5a5750780931d81650c7d88b8000000000000000000000000000000000919050565b5f808312610a70576704cf46d8192b672e610a92565b7ffffffffffffffffffffffffffffffffffffffffffffffffffb30b927e6d498d25b905067099e8db03256ce5d83820181900590810284035f6002670de0b6b3a7640000838002050582670de0b6b3a7640000010190505f8312610ad95790911b949350505050565b825f0381901d945050505050919050565b5f602080835283518060208501525f5b81811015610b1657858101830151858201604001528201610afa565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610b77575f80fd5b919050565b5f60208284031215610b8c575f80fd5b6102d182610b54565b5f805f60608486031215610ba7575f80fd5b610bb084610b54565b95602085013595506040909401359392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808202811582820484141761058057610580610bc5565b8082018082111561058057610580610bc5565b8082025f82127f800000000000000000000000000000000000000000000000000000000000000084141615610c5357610c53610bc5565b818105831482151761058057610580610bc5565b5f82610c9a577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f800000000000000000000000000000000000000000000000000000000000000083141615610cee57610cee610bc5565b500590565b8181038181111561058057610580610bc5565b8181035f831280158383131683831282161715610d2557610d25610bc5565b5092915050565b8082018281125f831280158216821582161715610d4b57610d4b610bc5565b50509291505056fea26469706673582212205ab84ff6cf39d2aeb60240d99cbcc9d2d9b0330de02a90a6933d6d20f71f490b64736f6c63430008180033a26469706673582212205b1778f66092619e1dbc878c1e5abb4f38b20faff52ecc04a931597f0f3fd2d764736f6c63430008180033

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  ]
[ 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.