S Price: $0.497325 (+2.16%)

Contract

0x41AC752453d258d2de4eAd3887356a3949C95b25

Overview

S Balance

Sonic LogoSonic LogoSonic Logo0 S

S Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Deploy53360832025-01-25 5:04:495 days ago1737781489IN
0x41AC7524...949C95b25
0 S0.0651477782.5
Deploy53360812025-01-25 5:04:455 days ago1737781485IN
0x41AC7524...949C95b25
0 S0.065146782.5
Deploy53360772025-01-25 5:04:415 days ago1737781481IN
0x41AC7524...949C95b25
0 S0.065146782.5
Deploy53360742025-01-25 5:04:385 days ago1737781478IN
0x41AC7524...949C95b25
0 S0.065146782.5
Deploy53360722025-01-25 5:04:355 days ago1737781475IN
0x41AC7524...949C95b25
0 S0.0665997782.5

Latest 5 internal transactions

Parent Transaction Hash Block From To
53360832025-01-25 5:04:495 days ago1737781489
0x41AC7524...949C95b25
 Contract Creation0 S
53360812025-01-25 5:04:455 days ago1737781485
0x41AC7524...949C95b25
 Contract Creation0 S
53360772025-01-25 5:04:415 days ago1737781481
0x41AC7524...949C95b25
 Contract Creation0 S
53360742025-01-25 5:04:385 days ago1737781478
0x41AC7524...949C95b25
 Contract Creation0 S
53360722025-01-25 5:04:355 days ago1737781475
0x41AC7524...949C95b25
 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();

        int256 utilization = _calcUtilization(cash, borrows);

        // If this is the first call then use the current utilization instead of the lastUtilization from storage.
        int256 lastUtilization = irState[vault].lastUpdate == 0 ? utilization : irState[vault].lastUtilization;
        (uint256 rate, uint256 rateAtTarget) = computeInterestRateInternal(vault, lastUtilization);

        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 the normalized distance between current utilization and target utilization.
        // `err` is normalized to [-1, +1] where -1 is 0% util, 0 is at target and +1 is 100% util.
        int256 errNormFactor = utilization > TARGET_UTILIZATION ? WAD - TARGET_UTILIZATION : TARGET_UTILIZATION;
        int256 err = (utilization - TARGET_UTILIZATION) * WAD / errNormFactor;

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

        if (startRateAtTarget == 0) {
            // First interaction.
            endRateAtTarget = INITIAL_RATE_AT_TARGET;
        } else {
            // The speed is assumed constant between two updates, but it is in fact not constant because of interest.
            // So the rate is always underestimated.
            int256 speed = ADJUSTMENT_SPEED * err / 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);
            }
        }
        return (uint256(_curve(endRateAtTarget, err)), 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 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/native-token-transfers/evm:openzeppelin-contracts/contracts/=lib/native-token-transfers/evm/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/",
    "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/",
    "native-token-transfers/=lib/native-token-transfers/evm/src/",
    "@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/",
    "solidity-bytes-utils/=lib/native-token-transfers/evm/lib/solidity-bytes-utils/contracts/",
    "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/",
    "wormhole-solidity-sdk/=lib/native-token-transfers/evm/lib/wormhole-solidity-sdk/src/"
  ],
  "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

[{"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"}]

608060405234801561000f575f80fd5b5061170a8061001d5f395ff3fe608060405234801561000f575f80fd5b506004361061006f575f3560e01c80636ee0787a1161004d5780636ee0787a1461016e578063dd1faaef146101db578063e536913d146101ee575f80fd5b806306609bbe146100735780633fc756f8146100b05780636aebd5831461015d575b5f80fd5b610086610081366004610512565b61020e565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6101246100be366004610529565b73ffffffffffffffffffffffffffffffffffffffff9081165f9081526020818152604091829020825180840190935254928316808352740100000000000000000000000000000000000000009093046bffffffffffffffffffffffff1691018190529091565b6040805173ffffffffffffffffffffffffffffffffffffffff90931683526bffffffffffffffffffffffff9091166020830152016100a7565b6001546040519081526020016100a7565b6101cb61017c366004610529565b73ffffffffffffffffffffffffffffffffffffffff165f908152602081905260409020547401000000000000000000000000000000000000000090046bffffffffffffffffffffffff16151590565b60405190151581526020016100a7565b6100866101e9366004610563565b610243565b6102016101fc3660046105a2565b6103a5565b6040516100a791906105c2565b6001818154811061021d575f80fd5b5f9182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b5f8087878787878760405161025790610505565b958652602086019490945260408501929092526060840152608083015260a082015260c001604051809103905ff080158015610295573d5f803e3d5ffd5b50604080518082018252338082526bffffffffffffffffffffffff42818116602080860191825273ffffffffffffffffffffffffffffffffffffffff8089165f8181529283905288832097519351909516740100000000000000000000000000000000000000000292169190911790945560018054808201825594527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf690930180547fffffffffffffffffffffffff000000000000000000000000000000000000000016821790559251939450927fac4ce915ef22753b636e57aac5ae5fdd9d13d782ae5bf6dbcda15e29f95386c1916103929190815260200190565b60405180910390a3979650505050505050565b60607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036103d45760015491505b828210806103e3575060015482115b1561041a576040517f4e32a13200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6104248383610648565b67ffffffffffffffff81111561043c5761043c610661565b604051908082528060200260200182016040528015610465578160200160208202803683370190505b5090505f5b6104748484610648565b8110156104fe576001610487828661068e565b81548110610497576104976106a1565b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff168282815181106104d1576104d16106a1565b73ffffffffffffffffffffffffffffffffffffffff9092166020928302919091019091015260010161046a565b5092915050565b611006806106cf83390190565b5f60208284031215610522575f80fd5b5035919050565b5f60208284031215610539575f80fd5b813573ffffffffffffffffffffffffffffffffffffffff8116811461055c575f80fd5b9392505050565b5f805f805f8060c08789031215610578575f80fd5b505084359660208601359650604086013595606081013595506080810135945060a0013592509050565b5f80604083850312156105b3575f80fd5b50508035926020909101359150565b602080825282518282018190525f9190848201906040850190845b8181101561060f57835173ffffffffffffffffffffffffffffffffffffffff16835292840192918401916001016105dd565b50909695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8181038181111561065b5761065b61061b565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b8082018082111561065b5761065b61061b565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffdfe61014060405234801562000011575f80fd5b506040516200100638038062001006833981016040819052620000349162000208565b5f861315806200004b5750670de0b6b3a764000086135b156200006a57604051635435b28960e11b815260040160405180910390fd5b838512806200007857508285135b156200009757604051635435b28960e11b815260040160405180910390fd5b620000ae6301e1855866038d7ea4c680006200024f565b841280620000d25750620000cf6301e18558678ac7230489e800006200024f565b84135b15620000f157604051635435b28960e11b815260040160405180910390fd5b620001086301e1855866038d7ea4c680006200024f565b8312806200012c5750620001296301e18558678ac7230489e800006200024f565b83135b156200014b57604051635435b28960e11b815260040160405180910390fd5b670e043da6172500008212806200016a575068056bc75e2d6310000082135b156200018957604051635435b28960e11b815260040160405180910390fd5b620001a16301e18558671bc16d674ec800006200024f565b811280620001c65750620001c36301e18558683635c9adc5dea000006200024f565b81135b15620001e557604051635435b28960e11b815260040160405180910390fd5b60809590955260a09390935260c09190915260e052610100526101205262000295565b5f805f805f8060c087890312156200021e575f80fd5b865195506020870151945060408701519350606087015192506080870151915060a087015190509295509295509295565b5f826200026a57634e487b7160e01b5f52601260045260245ffd5b600160ff1b82145f19841416156200029057634e487b7160e01b5f52601160045260245ffd5b500590565b60805160a05160c05160e0516101005161012051610cd6620003305f395f81816101f8015261071f01525f81816102800152818161089901526108c401525f81816101d10152818161082c015261085401525f818160cd015281816107db015261080301525f818161025901526106eb01525f818161021f01528181610581015281816105a8015281816105d101526106100152610cd65ff3fe608060405234801561000f575f80fd5b50600436106100c4575f3560e01c806358f5cbad1161007d578063bca02c1311610058578063bca02c1314610241578063d91042b514610254578063fc4c2d541461027b575f80fd5b806358f5cbad146101cc5780635a92fa85146101f35780639a1a14d91461021a575f80fd5b80631a351d62116100ad5780631a351d621461014b5780632e34c872146101a65780634395b4fb146101b9575f80fd5b8063019ec38b146100c857806306fdde0314610102575b5f80fd5b6100ef7f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020015b60405180910390f35b61013e6040518060400160405280601081526020017f49524d416461707469766543757276650000000000000000000000000000000081525081565b6040516100f99190610a37565b6100ef610159366004610ac9565b73ffffffffffffffffffffffffffffffffffffffff165f908152602081905260409020547a010000000000000000000000000000000000000000000000000000900465ffffffffffff1690565b6100ef6101b4366004610ae2565b6102a2565b6100ef6101c7366004610ae2565b6102d6565b6100ef7f000000000000000000000000000000000000000000000000000000000000000081565b6100ef7f000000000000000000000000000000000000000000000000000000000000000081565b6100ef7f000000000000000000000000000000000000000000000000000000000000000081565b6100ef61024f366004610ae2565b610301565b6100ef7f000000000000000000000000000000000000000000000000000000000000000081565b6100ef7f000000000000000000000000000000000000000000000000000000000000000081565b5f806102ae8484610537565b90505f6102bb868361057c565b5090506102cc81633b9aca00610b3f565b9695505050505050565b5f806102e28484610537565b90505f6102ef868361057c565b91506102cc905081633b9aca00610b3f565b5f3373ffffffffffffffffffffffffffffffffffffffff851614610351576040517f35a4399400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61035c8484610537565b73ffffffffffffffffffffffffffffffffffffffff86165f90815260208190526040812054919250907a010000000000000000000000000000000000000000000000000000900465ffffffffffff16156103f35773ffffffffffffffffffffffffffffffffffffffff86165f908152602081905260409020547201000000000000000000000000000000000000900460070b6103f5565b815b90505f80610403888461057c565b9150915060405180606001604052808271ffffffffffffffffffffffffffffffffffff1681526020018560070b81526020014265ffffffffffff168152505f808a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a81548171ffffffffffffffffffffffffffffffffffff021916908371ffffffffffffffffffffffffffffffffffff1602179055506020820151815f0160126101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff1602179055506040820151815f01601a6101000a81548165ffffffffffff021916908365ffffffffffff16021790555090505081633b9aca0061052b9190610b3f565b98975050505050505050565b5f806105438385610b56565b9050805f03610555575f915050610576565b80610568670de0b6b3a764000085610b69565b6105729190610bb4565b9150505b92915050565b5f805f7f000000000000000000000000000000000000000000000000000000000000000084136105cc577f00000000000000000000000000000000000000000000000000000000000000006105fe565b6105fe7f0000000000000000000000000000000000000000000000000000000000000000670de0b6b3a7640000610c40565b90505f81670de0b6b3a76400006106357f000000000000000000000000000000000000000000000000000000000000000088610c40565b61063f9190610b69565b6106499190610bb4565b73ffffffffffffffffffffffffffffffffffffffff87165f908152602081815260408083208151606081018352905471ffffffffffffffffffffffffffffffffffff81168083527201000000000000000000000000000000000000820460070b948301949094527a010000000000000000000000000000000000000000000000000000900465ffffffffffff16918101919091529293509081810361070f57507f0000000000000000000000000000000000000000000000000000000000000000610797565b5f670de0b6b3a7640000610743867f0000000000000000000000000000000000000000000000000000000000000000610b69565b61074d9190610bb4565b90505f846040015165ffffffffffff16426107689190610c66565b90505f6107758284610b69565b9050805f0361078657849350610793565b61079085826107af565b93505b5050505b6107a18185610882565b999098509650505050505050565b5f80670de0b6b3a76400006107c384610947565b6107cd9086610b69565b6107d79190610bb4565b90507f000000000000000000000000000000000000000000000000000000000000000081121561082a577f0000000000000000000000000000000000000000000000000000000000000000915050610576565b7f000000000000000000000000000000000000000000000000000000000000000081131561087b577f0000000000000000000000000000000000000000000000000000000000000000915050610576565b9392505050565b5f805f83126108c2576108bd670de0b6b3a76400007f0000000000000000000000000000000000000000000000000000000000000000610c40565b610911565b7f00000000000000000000000000000000000000000000000000000000000000006108f5670de0b6b3a764000080610b69565b6108ff9190610bb4565b61091190670de0b6b3a7640000610c40565b9050670de0b6b3a76400008481806109298786610b69565b6109339190610bb4565b61093d9190610c79565b6105689190610b69565b5f7ffffffffffffffffffffffffffffffffffffffffffffffffdc0d0570925a462d882121561097757505f919050565b6805168fd0946fc0415f82126109a75750780931d81650c7d88b8000000000000000000000000000000000919050565b5f8083126109bd576704cf46d8192b672e6109df565b7ffffffffffffffffffffffffffffffffffffffffffffffffffb30b927e6d498d25b905067099e8db03256ce5d83820181900590810284035f6002670de0b6b3a7640000838002050582670de0b6b3a7640000010190505f8312610a265790911b949350505050565b825f0381901d945050505050919050565b5f602080835283518060208501525f5b81811015610a6357858101830151858201604001528201610a47565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610ac4575f80fd5b919050565b5f60208284031215610ad9575f80fd5b61087b82610aa1565b5f805f60608486031215610af4575f80fd5b610afd84610aa1565b95602085013595506040909401359392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808202811582820484141761057657610576610b12565b8082018082111561057657610576610b12565b8082025f82127f800000000000000000000000000000000000000000000000000000000000000084141615610ba057610ba0610b12565b818105831482151761057657610576610b12565b5f82610be7577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f800000000000000000000000000000000000000000000000000000000000000083141615610c3b57610c3b610b12565b500590565b8181035f831280158383131683831282161715610c5f57610c5f610b12565b5092915050565b8181038181111561057657610576610b12565b8082018281125f831280158216821582161715610c9857610c98610b12565b50509291505056fea2646970667358221220d696b8f30d5c053df29fcbaacf0a7de17f31f03a74de50888f88f6a29d3d9edb64736f6c63430008180033a2646970667358221220d749660cd9dc832bce416b3fe9294e4a88d0b56181588702ed0936daad62345a64736f6c63430008180033

Deployed Bytecode

0x608060405234801561000f575f80fd5b506004361061006f575f3560e01c80636ee0787a1161004d5780636ee0787a1461016e578063dd1faaef146101db578063e536913d146101ee575f80fd5b806306609bbe146100735780633fc756f8146100b05780636aebd5831461015d575b5f80fd5b610086610081366004610512565b61020e565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6101246100be366004610529565b73ffffffffffffffffffffffffffffffffffffffff9081165f9081526020818152604091829020825180840190935254928316808352740100000000000000000000000000000000000000009093046bffffffffffffffffffffffff1691018190529091565b6040805173ffffffffffffffffffffffffffffffffffffffff90931683526bffffffffffffffffffffffff9091166020830152016100a7565b6001546040519081526020016100a7565b6101cb61017c366004610529565b73ffffffffffffffffffffffffffffffffffffffff165f908152602081905260409020547401000000000000000000000000000000000000000090046bffffffffffffffffffffffff16151590565b60405190151581526020016100a7565b6100866101e9366004610563565b610243565b6102016101fc3660046105a2565b6103a5565b6040516100a791906105c2565b6001818154811061021d575f80fd5b5f9182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b5f8087878787878760405161025790610505565b958652602086019490945260408501929092526060840152608083015260a082015260c001604051809103905ff080158015610295573d5f803e3d5ffd5b50604080518082018252338082526bffffffffffffffffffffffff42818116602080860191825273ffffffffffffffffffffffffffffffffffffffff8089165f8181529283905288832097519351909516740100000000000000000000000000000000000000000292169190911790945560018054808201825594527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf690930180547fffffffffffffffffffffffff000000000000000000000000000000000000000016821790559251939450927fac4ce915ef22753b636e57aac5ae5fdd9d13d782ae5bf6dbcda15e29f95386c1916103929190815260200190565b60405180910390a3979650505050505050565b60607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036103d45760015491505b828210806103e3575060015482115b1561041a576040517f4e32a13200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6104248383610648565b67ffffffffffffffff81111561043c5761043c610661565b604051908082528060200260200182016040528015610465578160200160208202803683370190505b5090505f5b6104748484610648565b8110156104fe576001610487828661068e565b81548110610497576104976106a1565b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff168282815181106104d1576104d16106a1565b73ffffffffffffffffffffffffffffffffffffffff9092166020928302919091019091015260010161046a565b5092915050565b611006806106cf83390190565b5f60208284031215610522575f80fd5b5035919050565b5f60208284031215610539575f80fd5b813573ffffffffffffffffffffffffffffffffffffffff8116811461055c575f80fd5b9392505050565b5f805f805f8060c08789031215610578575f80fd5b505084359660208601359650604086013595606081013595506080810135945060a0013592509050565b5f80604083850312156105b3575f80fd5b50508035926020909101359150565b602080825282518282018190525f9190848201906040850190845b8181101561060f57835173ffffffffffffffffffffffffffffffffffffffff16835292840192918401916001016105dd565b50909695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8181038181111561065b5761065b61061b565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b8082018082111561065b5761065b61061b565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffdfe61014060405234801562000011575f80fd5b506040516200100638038062001006833981016040819052620000349162000208565b5f861315806200004b5750670de0b6b3a764000086135b156200006a57604051635435b28960e11b815260040160405180910390fd5b838512806200007857508285135b156200009757604051635435b28960e11b815260040160405180910390fd5b620000ae6301e1855866038d7ea4c680006200024f565b841280620000d25750620000cf6301e18558678ac7230489e800006200024f565b84135b15620000f157604051635435b28960e11b815260040160405180910390fd5b620001086301e1855866038d7ea4c680006200024f565b8312806200012c5750620001296301e18558678ac7230489e800006200024f565b83135b156200014b57604051635435b28960e11b815260040160405180910390fd5b670e043da6172500008212806200016a575068056bc75e2d6310000082135b156200018957604051635435b28960e11b815260040160405180910390fd5b620001a16301e18558671bc16d674ec800006200024f565b811280620001c65750620001c36301e18558683635c9adc5dea000006200024f565b81135b15620001e557604051635435b28960e11b815260040160405180910390fd5b60809590955260a09390935260c09190915260e052610100526101205262000295565b5f805f805f8060c087890312156200021e575f80fd5b865195506020870151945060408701519350606087015192506080870151915060a087015190509295509295509295565b5f826200026a57634e487b7160e01b5f52601260045260245ffd5b600160ff1b82145f19841416156200029057634e487b7160e01b5f52601160045260245ffd5b500590565b60805160a05160c05160e0516101005161012051610cd6620003305f395f81816101f8015261071f01525f81816102800152818161089901526108c401525f81816101d10152818161082c015261085401525f818160cd015281816107db015261080301525f818161025901526106eb01525f818161021f01528181610581015281816105a8015281816105d101526106100152610cd65ff3fe608060405234801561000f575f80fd5b50600436106100c4575f3560e01c806358f5cbad1161007d578063bca02c1311610058578063bca02c1314610241578063d91042b514610254578063fc4c2d541461027b575f80fd5b806358f5cbad146101cc5780635a92fa85146101f35780639a1a14d91461021a575f80fd5b80631a351d62116100ad5780631a351d621461014b5780632e34c872146101a65780634395b4fb146101b9575f80fd5b8063019ec38b146100c857806306fdde0314610102575b5f80fd5b6100ef7f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020015b60405180910390f35b61013e6040518060400160405280601081526020017f49524d416461707469766543757276650000000000000000000000000000000081525081565b6040516100f99190610a37565b6100ef610159366004610ac9565b73ffffffffffffffffffffffffffffffffffffffff165f908152602081905260409020547a010000000000000000000000000000000000000000000000000000900465ffffffffffff1690565b6100ef6101b4366004610ae2565b6102a2565b6100ef6101c7366004610ae2565b6102d6565b6100ef7f000000000000000000000000000000000000000000000000000000000000000081565b6100ef7f000000000000000000000000000000000000000000000000000000000000000081565b6100ef7f000000000000000000000000000000000000000000000000000000000000000081565b6100ef61024f366004610ae2565b610301565b6100ef7f000000000000000000000000000000000000000000000000000000000000000081565b6100ef7f000000000000000000000000000000000000000000000000000000000000000081565b5f806102ae8484610537565b90505f6102bb868361057c565b5090506102cc81633b9aca00610b3f565b9695505050505050565b5f806102e28484610537565b90505f6102ef868361057c565b91506102cc905081633b9aca00610b3f565b5f3373ffffffffffffffffffffffffffffffffffffffff851614610351576040517f35a4399400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61035c8484610537565b73ffffffffffffffffffffffffffffffffffffffff86165f90815260208190526040812054919250907a010000000000000000000000000000000000000000000000000000900465ffffffffffff16156103f35773ffffffffffffffffffffffffffffffffffffffff86165f908152602081905260409020547201000000000000000000000000000000000000900460070b6103f5565b815b90505f80610403888461057c565b9150915060405180606001604052808271ffffffffffffffffffffffffffffffffffff1681526020018560070b81526020014265ffffffffffff168152505f808a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a81548171ffffffffffffffffffffffffffffffffffff021916908371ffffffffffffffffffffffffffffffffffff1602179055506020820151815f0160126101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff1602179055506040820151815f01601a6101000a81548165ffffffffffff021916908365ffffffffffff16021790555090505081633b9aca0061052b9190610b3f565b98975050505050505050565b5f806105438385610b56565b9050805f03610555575f915050610576565b80610568670de0b6b3a764000085610b69565b6105729190610bb4565b9150505b92915050565b5f805f7f000000000000000000000000000000000000000000000000000000000000000084136105cc577f00000000000000000000000000000000000000000000000000000000000000006105fe565b6105fe7f0000000000000000000000000000000000000000000000000000000000000000670de0b6b3a7640000610c40565b90505f81670de0b6b3a76400006106357f000000000000000000000000000000000000000000000000000000000000000088610c40565b61063f9190610b69565b6106499190610bb4565b73ffffffffffffffffffffffffffffffffffffffff87165f908152602081815260408083208151606081018352905471ffffffffffffffffffffffffffffffffffff81168083527201000000000000000000000000000000000000820460070b948301949094527a010000000000000000000000000000000000000000000000000000900465ffffffffffff16918101919091529293509081810361070f57507f0000000000000000000000000000000000000000000000000000000000000000610797565b5f670de0b6b3a7640000610743867f0000000000000000000000000000000000000000000000000000000000000000610b69565b61074d9190610bb4565b90505f846040015165ffffffffffff16426107689190610c66565b90505f6107758284610b69565b9050805f0361078657849350610793565b61079085826107af565b93505b5050505b6107a18185610882565b999098509650505050505050565b5f80670de0b6b3a76400006107c384610947565b6107cd9086610b69565b6107d79190610bb4565b90507f000000000000000000000000000000000000000000000000000000000000000081121561082a577f0000000000000000000000000000000000000000000000000000000000000000915050610576565b7f000000000000000000000000000000000000000000000000000000000000000081131561087b577f0000000000000000000000000000000000000000000000000000000000000000915050610576565b9392505050565b5f805f83126108c2576108bd670de0b6b3a76400007f0000000000000000000000000000000000000000000000000000000000000000610c40565b610911565b7f00000000000000000000000000000000000000000000000000000000000000006108f5670de0b6b3a764000080610b69565b6108ff9190610bb4565b61091190670de0b6b3a7640000610c40565b9050670de0b6b3a76400008481806109298786610b69565b6109339190610bb4565b61093d9190610c79565b6105689190610b69565b5f7ffffffffffffffffffffffffffffffffffffffffffffffffdc0d0570925a462d882121561097757505f919050565b6805168fd0946fc0415f82126109a75750780931d81650c7d88b8000000000000000000000000000000000919050565b5f8083126109bd576704cf46d8192b672e6109df565b7ffffffffffffffffffffffffffffffffffffffffffffffffffb30b927e6d498d25b905067099e8db03256ce5d83820181900590810284035f6002670de0b6b3a7640000838002050582670de0b6b3a7640000010190505f8312610a265790911b949350505050565b825f0381901d945050505050919050565b5f602080835283518060208501525f5b81811015610a6357858101830151858201604001528201610a47565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610ac4575f80fd5b919050565b5f60208284031215610ad9575f80fd5b61087b82610aa1565b5f805f60608486031215610af4575f80fd5b610afd84610aa1565b95602085013595506040909401359392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808202811582820484141761057657610576610b12565b8082018082111561057657610576610b12565b8082025f82127f800000000000000000000000000000000000000000000000000000000000000084141615610ba057610ba0610b12565b818105831482151761057657610576610b12565b5f82610be7577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f800000000000000000000000000000000000000000000000000000000000000083141615610c3b57610c3b610b12565b500590565b8181035f831280158383131683831282161715610c5f57610c5f610b12565b5092915050565b8181038181111561057657610576610b12565b8082018281125f831280158216821582161715610c9857610c98610b12565b50509291505056fea2646970667358221220d696b8f30d5c053df29fcbaacf0a7de17f31f03a74de50888f88f6a29d3d9edb64736f6c63430008180033a2646970667358221220d749660cd9dc832bce416b3fe9294e4a88d0b56181588702ed0936daad62345a64736f6c63430008180033

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.