Overview
S Balance
S Value
$0.00More Info
Private Name Tags
ContractCreator
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Latest 1 internal transaction
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
5336072 | 12 days ago | Contract Creation | 0 S |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
IRMAdaptiveCurve
Compiler Version
v0.8.24+commit.e11b9ed9
Optimization Enabled:
Yes with 20000 runs
Other Settings:
cancun EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// 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; } }
// 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); }
// 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); } } }
{ "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
- No Contract Security Audit Submitted- Submit Audit Here
[{"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"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"E_IRMUpdateUnauthorized","type":"error"},{"inputs":[],"name":"InvalidParams","type":"error"},{"inputs":[],"name":"ADJUSTMENT_SPEED","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CURVE_STEEPNESS","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"INITIAL_RATE_AT_TARGET","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_RATE_AT_TARGET","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_RATE_AT_TARGET","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TARGET_UTILIZATION","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"vault","type":"address"},{"internalType":"uint256","name":"cash","type":"uint256"},{"internalType":"uint256","name":"borrows","type":"uint256"}],"name":"computeInterestRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"vault","type":"address"},{"internalType":"uint256","name":"cash","type":"uint256"},{"internalType":"uint256","name":"borrows","type":"uint256"}],"name":"computeInterestRateView","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"vault","type":"address"},{"internalType":"uint256","name":"cash","type":"uint256"},{"internalType":"uint256","name":"borrows","type":"uint256"}],"name":"computeRateAtTargetView","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"vault","type":"address"}],"name":"getLastUpdateTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
61014060405234801562000011575f80fd5b506040516200100638038062001006833981016040819052620000349162000208565b5f861315806200004b5750670de0b6b3a764000086135b156200006a57604051635435b28960e11b815260040160405180910390fd5b838512806200007857508285135b156200009757604051635435b28960e11b815260040160405180910390fd5b620000ae6301e1855866038d7ea4c680006200024f565b841280620000d25750620000cf6301e18558678ac7230489e800006200024f565b84135b15620000f157604051635435b28960e11b815260040160405180910390fd5b620001086301e1855866038d7ea4c680006200024f565b8312806200012c5750620001296301e18558678ac7230489e800006200024f565b83135b156200014b57604051635435b28960e11b815260040160405180910390fd5b670e043da6172500008212806200016a575068056bc75e2d6310000082135b156200018957604051635435b28960e11b815260040160405180910390fd5b620001a16301e18558671bc16d674ec800006200024f565b811280620001c65750620001c36301e18558683635c9adc5dea000006200024f565b81135b15620001e557604051635435b28960e11b815260040160405180910390fd5b60809590955260a09390935260c09190915260e052610100526101205262000295565b5f805f805f8060c087890312156200021e575f80fd5b865195506020870151945060408701519350606087015192506080870151915060a087015190509295509295509295565b5f826200026a57634e487b7160e01b5f52601260045260245ffd5b600160ff1b82145f19841416156200029057634e487b7160e01b5f52601160045260245ffd5b500590565b60805160a05160c05160e0516101005161012051610cd6620003305f395f81816101f8015261071f01525f81816102800152818161089901526108c401525f81816101d10152818161082c015261085401525f818160cd015281816107db015261080301525f818161025901526106eb01525f818161021f01528181610581015281816105a8015281816105d101526106100152610cd65ff3fe608060405234801561000f575f80fd5b50600436106100c4575f3560e01c806358f5cbad1161007d578063bca02c1311610058578063bca02c1314610241578063d91042b514610254578063fc4c2d541461027b575f80fd5b806358f5cbad146101cc5780635a92fa85146101f35780639a1a14d91461021a575f80fd5b80631a351d62116100ad5780631a351d621461014b5780632e34c872146101a65780634395b4fb146101b9575f80fd5b8063019ec38b146100c857806306fdde0314610102575b5f80fd5b6100ef7f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020015b60405180910390f35b61013e6040518060400160405280601081526020017f49524d416461707469766543757276650000000000000000000000000000000081525081565b6040516100f99190610a37565b6100ef610159366004610ac9565b73ffffffffffffffffffffffffffffffffffffffff165f908152602081905260409020547a010000000000000000000000000000000000000000000000000000900465ffffffffffff1690565b6100ef6101b4366004610ae2565b6102a2565b6100ef6101c7366004610ae2565b6102d6565b6100ef7f000000000000000000000000000000000000000000000000000000000000000081565b6100ef7f000000000000000000000000000000000000000000000000000000000000000081565b6100ef7f000000000000000000000000000000000000000000000000000000000000000081565b6100ef61024f366004610ae2565b610301565b6100ef7f000000000000000000000000000000000000000000000000000000000000000081565b6100ef7f000000000000000000000000000000000000000000000000000000000000000081565b5f806102ae8484610537565b90505f6102bb868361057c565b5090506102cc81633b9aca00610b3f565b9695505050505050565b5f806102e28484610537565b90505f6102ef868361057c565b91506102cc905081633b9aca00610b3f565b5f3373ffffffffffffffffffffffffffffffffffffffff851614610351576040517f35a4399400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61035c8484610537565b73ffffffffffffffffffffffffffffffffffffffff86165f90815260208190526040812054919250907a010000000000000000000000000000000000000000000000000000900465ffffffffffff16156103f35773ffffffffffffffffffffffffffffffffffffffff86165f908152602081905260409020547201000000000000000000000000000000000000900460070b6103f5565b815b90505f80610403888461057c565b9150915060405180606001604052808271ffffffffffffffffffffffffffffffffffff1681526020018560070b81526020014265ffffffffffff168152505f808a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a81548171ffffffffffffffffffffffffffffffffffff021916908371ffffffffffffffffffffffffffffffffffff1602179055506020820151815f0160126101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff1602179055506040820151815f01601a6101000a81548165ffffffffffff021916908365ffffffffffff16021790555090505081633b9aca0061052b9190610b3f565b98975050505050505050565b5f806105438385610b56565b9050805f03610555575f915050610576565b80610568670de0b6b3a764000085610b69565b6105729190610bb4565b9150505b92915050565b5f805f7f000000000000000000000000000000000000000000000000000000000000000084136105cc577f00000000000000000000000000000000000000000000000000000000000000006105fe565b6105fe7f0000000000000000000000000000000000000000000000000000000000000000670de0b6b3a7640000610c40565b90505f81670de0b6b3a76400006106357f000000000000000000000000000000000000000000000000000000000000000088610c40565b61063f9190610b69565b6106499190610bb4565b73ffffffffffffffffffffffffffffffffffffffff87165f908152602081815260408083208151606081018352905471ffffffffffffffffffffffffffffffffffff81168083527201000000000000000000000000000000000000820460070b948301949094527a010000000000000000000000000000000000000000000000000000900465ffffffffffff16918101919091529293509081810361070f57507f0000000000000000000000000000000000000000000000000000000000000000610797565b5f670de0b6b3a7640000610743867f0000000000000000000000000000000000000000000000000000000000000000610b69565b61074d9190610bb4565b90505f846040015165ffffffffffff16426107689190610c66565b90505f6107758284610b69565b9050805f0361078657849350610793565b61079085826107af565b93505b5050505b6107a18185610882565b999098509650505050505050565b5f80670de0b6b3a76400006107c384610947565b6107cd9086610b69565b6107d79190610bb4565b90507f000000000000000000000000000000000000000000000000000000000000000081121561082a577f0000000000000000000000000000000000000000000000000000000000000000915050610576565b7f000000000000000000000000000000000000000000000000000000000000000081131561087b577f0000000000000000000000000000000000000000000000000000000000000000915050610576565b9392505050565b5f805f83126108c2576108bd670de0b6b3a76400007f0000000000000000000000000000000000000000000000000000000000000000610c40565b610911565b7f00000000000000000000000000000000000000000000000000000000000000006108f5670de0b6b3a764000080610b69565b6108ff9190610bb4565b61091190670de0b6b3a7640000610c40565b9050670de0b6b3a76400008481806109298786610b69565b6109339190610bb4565b61093d9190610c79565b6105689190610b69565b5f7ffffffffffffffffffffffffffffffffffffffffffffffffdc0d0570925a462d882121561097757505f919050565b6805168fd0946fc0415f82126109a75750780931d81650c7d88b8000000000000000000000000000000000919050565b5f8083126109bd576704cf46d8192b672e6109df565b7ffffffffffffffffffffffffffffffffffffffffffffffffffb30b927e6d498d25b905067099e8db03256ce5d83820181900590810284035f6002670de0b6b3a7640000838002050582670de0b6b3a7640000010190505f8312610a265790911b949350505050565b825f0381901d945050505050919050565b5f602080835283518060208501525f5b81811015610a6357858101830151858201604001528201610a47565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610ac4575f80fd5b919050565b5f60208284031215610ad9575f80fd5b61087b82610aa1565b5f805f60608486031215610af4575f80fd5b610afd84610aa1565b95602085013595506040909401359392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808202811582820484141761057657610576610b12565b8082018082111561057657610576610b12565b8082025f82127f800000000000000000000000000000000000000000000000000000000000000084141615610ba057610ba0610b12565b818105831482151761057657610576610b12565b5f82610be7577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f800000000000000000000000000000000000000000000000000000000000000083141615610c3b57610c3b610b12565b500590565b8181035f831280158383131683831282161715610c5f57610c5f610b12565b5092915050565b8181038181111561057657610576610b12565b8082018281125f831280158216821582161715610c9857610c98610b12565b50509291505056fea2646970667358221220d696b8f30d5c053df29fcbaacf0a7de17f31f03a74de50888f88f6a29d3d9edb64736f6c634300081800330000000000000000000000000000000000000000000000000c7d713b49da00000000000000000000000000000000000000000000000000000000000012e687bf0000000000000000000000000000000000000000000000000000000001e3da5f0000000000000000000000000000000000000000000000000000000ec41a0ddf0000000000000000000000000000000000000000000000003782dace9d90000000000000000000000000000000000000000000000000000000000171268b5ad4
Deployed Bytecode
0x608060405234801561000f575f80fd5b50600436106100c4575f3560e01c806358f5cbad1161007d578063bca02c1311610058578063bca02c1314610241578063d91042b514610254578063fc4c2d541461027b575f80fd5b806358f5cbad146101cc5780635a92fa85146101f35780639a1a14d91461021a575f80fd5b80631a351d62116100ad5780631a351d621461014b5780632e34c872146101a65780634395b4fb146101b9575f80fd5b8063019ec38b146100c857806306fdde0314610102575b5f80fd5b6100ef7f0000000000000000000000000000000000000000000000000000000001e3da5f81565b6040519081526020015b60405180910390f35b61013e6040518060400160405280601081526020017f49524d416461707469766543757276650000000000000000000000000000000081525081565b6040516100f99190610a37565b6100ef610159366004610ac9565b73ffffffffffffffffffffffffffffffffffffffff165f908152602081905260409020547a010000000000000000000000000000000000000000000000000000900465ffffffffffff1690565b6100ef6101b4366004610ae2565b6102a2565b6100ef6101c7366004610ae2565b6102d6565b6100ef7f0000000000000000000000000000000000000000000000000000000ec41a0ddf81565b6100ef7f00000000000000000000000000000000000000000000000000000171268b5ad481565b6100ef7f0000000000000000000000000000000000000000000000000c7d713b49da000081565b6100ef61024f366004610ae2565b610301565b6100ef7f0000000000000000000000000000000000000000000000000000000012e687bf81565b6100ef7f0000000000000000000000000000000000000000000000003782dace9d90000081565b5f806102ae8484610537565b90505f6102bb868361057c565b5090506102cc81633b9aca00610b3f565b9695505050505050565b5f806102e28484610537565b90505f6102ef868361057c565b91506102cc905081633b9aca00610b3f565b5f3373ffffffffffffffffffffffffffffffffffffffff851614610351576040517f35a4399400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61035c8484610537565b73ffffffffffffffffffffffffffffffffffffffff86165f90815260208190526040812054919250907a010000000000000000000000000000000000000000000000000000900465ffffffffffff16156103f35773ffffffffffffffffffffffffffffffffffffffff86165f908152602081905260409020547201000000000000000000000000000000000000900460070b6103f5565b815b90505f80610403888461057c565b9150915060405180606001604052808271ffffffffffffffffffffffffffffffffffff1681526020018560070b81526020014265ffffffffffff168152505f808a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a81548171ffffffffffffffffffffffffffffffffffff021916908371ffffffffffffffffffffffffffffffffffff1602179055506020820151815f0160126101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff1602179055506040820151815f01601a6101000a81548165ffffffffffff021916908365ffffffffffff16021790555090505081633b9aca0061052b9190610b3f565b98975050505050505050565b5f806105438385610b56565b9050805f03610555575f915050610576565b80610568670de0b6b3a764000085610b69565b6105729190610bb4565b9150505b92915050565b5f805f7f0000000000000000000000000000000000000000000000000c7d713b49da000084136105cc577f0000000000000000000000000000000000000000000000000c7d713b49da00006105fe565b6105fe7f0000000000000000000000000000000000000000000000000c7d713b49da0000670de0b6b3a7640000610c40565b90505f81670de0b6b3a76400006106357f0000000000000000000000000000000000000000000000000c7d713b49da000088610c40565b61063f9190610b69565b6106499190610bb4565b73ffffffffffffffffffffffffffffffffffffffff87165f908152602081815260408083208151606081018352905471ffffffffffffffffffffffffffffffffffff81168083527201000000000000000000000000000000000000820460070b948301949094527a010000000000000000000000000000000000000000000000000000900465ffffffffffff16918101919091529293509081810361070f57507f0000000000000000000000000000000000000000000000000000000012e687bf610797565b5f670de0b6b3a7640000610743867f00000000000000000000000000000000000000000000000000000171268b5ad4610b69565b61074d9190610bb4565b90505f846040015165ffffffffffff16426107689190610c66565b90505f6107758284610b69565b9050805f0361078657849350610793565b61079085826107af565b93505b5050505b6107a18185610882565b999098509650505050505050565b5f80670de0b6b3a76400006107c384610947565b6107cd9086610b69565b6107d79190610bb4565b90507f0000000000000000000000000000000000000000000000000000000001e3da5f81121561082a577f0000000000000000000000000000000000000000000000000000000001e3da5f915050610576565b7f0000000000000000000000000000000000000000000000000000000ec41a0ddf81131561087b577f0000000000000000000000000000000000000000000000000000000ec41a0ddf915050610576565b9392505050565b5f805f83126108c2576108bd670de0b6b3a76400007f0000000000000000000000000000000000000000000000003782dace9d900000610c40565b610911565b7f0000000000000000000000000000000000000000000000003782dace9d9000006108f5670de0b6b3a764000080610b69565b6108ff9190610bb4565b61091190670de0b6b3a7640000610c40565b9050670de0b6b3a76400008481806109298786610b69565b6109339190610bb4565b61093d9190610c79565b6105689190610b69565b5f7ffffffffffffffffffffffffffffffffffffffffffffffffdc0d0570925a462d882121561097757505f919050565b6805168fd0946fc0415f82126109a75750780931d81650c7d88b8000000000000000000000000000000000919050565b5f8083126109bd576704cf46d8192b672e6109df565b7ffffffffffffffffffffffffffffffffffffffffffffffffffb30b927e6d498d25b905067099e8db03256ce5d83820181900590810284035f6002670de0b6b3a7640000838002050582670de0b6b3a7640000010190505f8312610a265790911b949350505050565b825f0381901d945050505050919050565b5f602080835283518060208501525f5b81811015610a6357858101830151858201604001528201610a47565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610ac4575f80fd5b919050565b5f60208284031215610ad9575f80fd5b61087b82610aa1565b5f805f60608486031215610af4575f80fd5b610afd84610aa1565b95602085013595506040909401359392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808202811582820484141761057657610576610b12565b8082018082111561057657610576610b12565b8082025f82127f800000000000000000000000000000000000000000000000000000000000000084141615610ba057610ba0610b12565b818105831482151761057657610576610b12565b5f82610be7577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f800000000000000000000000000000000000000000000000000000000000000083141615610c3b57610c3b610b12565b500590565b8181035f831280158383131683831282161715610c5f57610c5f610b12565b5092915050565b8181038181111561057657610576610b12565b8082018281125f831280158216821582161715610c9857610c98610b12565b50509291505056fea2646970667358221220d696b8f30d5c053df29fcbaacf0a7de17f31f03a74de50888f88f6a29d3d9edb64736f6c63430008180033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000c7d713b49da00000000000000000000000000000000000000000000000000000000000012e687bf0000000000000000000000000000000000000000000000000000000001e3da5f0000000000000000000000000000000000000000000000000000000ec41a0ddf0000000000000000000000000000000000000000000000003782dace9d90000000000000000000000000000000000000000000000000000000000171268b5ad4
-----Decoded View---------------
Arg [0] : _TARGET_UTILIZATION (int256): 900000000000000000
Arg [1] : _INITIAL_RATE_AT_TARGET (int256): 317097919
Arg [2] : _MIN_RATE_AT_TARGET (int256): 31709791
Arg [3] : _MAX_RATE_AT_TARGET (int256): 63419583967
Arg [4] : _CURVE_STEEPNESS (int256): 4000000000000000000
Arg [5] : _ADJUSTMENT_SPEED (int256): 1585489599188
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000c7d713b49da0000
Arg [1] : 0000000000000000000000000000000000000000000000000000000012e687bf
Arg [2] : 0000000000000000000000000000000000000000000000000000000001e3da5f
Arg [3] : 0000000000000000000000000000000000000000000000000000000ec41a0ddf
Arg [4] : 0000000000000000000000000000000000000000000000003782dace9d900000
Arg [5] : 00000000000000000000000000000000000000000000000000000171268b5ad4
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ 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.