Overview
S Balance
0 S
S Value
$0.00More Info
Private Name Tags
ContractCreator
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
MutableSingleKinkInterestRateModel
Compiler Version
v0.8.24+commit.e11b9ed9
Optimization Enabled:
Yes with 200 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.24; import "../../../Lynx/interfaces/IInterestRateModel.sol"; import "../BaseModels/SingleKinkRateModel/MutableSingleKinkRateModel.sol"; /** * @title MutableSingleKinkInterestRateModel * @dev Single kink rate model for interest rates with the ability to change rate parameters */ contract MutableSingleKinkInterestRateModel is MutableSingleKinkRateModel, IInterestRateModel { constructor() MutableSingleKinkRateModel(msg.sender) {} function getBorrowRate( uint256 utilization ) external view override returns (uint256) { return getRateInternal(utilization); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol) pragma solidity ^0.8.20; import {Context} from "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * The initial owner is set to the address provided by the deployer. This can * later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; /** * @dev The caller account is not authorized to perform an operation. */ error OwnableUnauthorizedAccount(address account); /** * @dev The owner is not a valid owner account. (eg. `address(0)`) */ error OwnableInvalidOwner(address owner); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the address provided by the deployer as the initial owner. */ constructor(address initialOwner) { if (initialOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(initialOwner); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { if (owner() != _msgSender()) { revert OwnableUnauthorizedAccount(_msgSender()); } } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { if (newOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol) pragma solidity ^0.8.20; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.24; interface IInterestRateModel { // Returns asset/second of interest per borrowed unit // e.g : (0.01 * PRECISION) = 1% of interest per second function getBorrowRate(uint256 utilization) external view returns (uint256); }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.24; interface IRateModelV1 { /** * @param x The x value, between 0-1. scaled by PRECISION */ function getRate(uint256 x) external view returns (uint256); }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.24; import {IRateModelV1} from "../../../../Lynx/interfaces/IRateModelV1.sol"; /** * @title BaseSingleKinkRateModel * @dev Base contract for single kink rate models */ contract BaseSingleKinkRateModel is IRateModelV1 { uint public constant PRECISION = 1e18; /** * @notice The base rate which is the y-intercept when X = 0 */ uint256 public baseRate; /** * @notice The multiplier of utilization rate that gives the slope of the rate */ uint256 public multiplier; /** * @notice The point at which the 'postKinkMultiplier' is applied */ uint256 public kink; /** * @notice The multiplier when X > kink */ uint256 public postKinkMultiplier; /** * @notice The rate when X = kink * @dev Saves gas on reading storage variables */ uint256 public rateOnKink; event NewRateParams( uint256 baseRate, uint256 multiplier, uint256 kink, uint256 postKinkMultiplier, uint256 rateOnKink ); function getRate(uint256 x) external view returns (uint256) { return getRateInternal(x); } function setRateParamsInternal( uint256 _baseRate, uint256 _multiplier, uint256 _kink, uint256 _postKinkMultiplier ) internal { // Sanity, kink cannot be higher than 100% require(_kink <= PRECISION, "KINK_TOO_HIGH"); // Set rate params baseRate = _baseRate; multiplier = _multiplier; kink = _kink; postKinkMultiplier = _postKinkMultiplier; // Calculate rateOnKink rateOnKink = (kink * multiplier) / PRECISION + baseRate; // Event emit NewRateParams( _baseRate, _multiplier, _kink, _postKinkMultiplier, rateOnKink ); } function getRateInternal(uint256 x) internal view returns (uint256) { uint256 safeX = x > PRECISION ? PRECISION : x; uint256 _kink = kink; if (x <= _kink) { return (x * multiplier) / PRECISION + baseRate; } else { uint excess = safeX - _kink; return (excess * postKinkMultiplier) / PRECISION + rateOnKink; } } }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.24; import "@openzeppelin/contracts/access/Ownable.sol"; import "./BaseSingleKinkRateModel.sol"; /** * @title MutableSingleKinkRateModel * @dev Single kink rate model with the ability to change rate parameters */ contract MutableSingleKinkRateModel is Ownable, BaseSingleKinkRateModel { constructor(address _initialOwner) Ownable(_initialOwner) {} function setRateParams( uint256 _baseRate, uint256 _multiplier, uint256 _kink, uint256 _postKinkMultiplier ) external onlyOwner { setRateParamsInternal(_baseRate, _multiplier, _kink, _postKinkMultiplier); } }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "evmVersion": "paris", "metadata": { "useLiteralContent": true }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"baseRate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"multiplier","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"kink","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"postKinkMultiplier","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rateOnKink","type":"uint256"}],"name":"NewRateParams","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"PRECISION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"utilization","type":"uint256"}],"name":"getBorrowRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"}],"name":"getRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"kink","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"multiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"postKinkMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rateOnKink","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_baseRate","type":"uint256"},{"internalType":"uint256","name":"_multiplier","type":"uint256"},{"internalType":"uint256","name":"_kink","type":"uint256"},{"internalType":"uint256","name":"_postKinkMultiplier","type":"uint256"}],"name":"setRateParams","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b5033808061003857604051631e4fbdf760e01b81526000600482015260240160405180910390fd5b61004181610048565b5050610098565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b610512806100a76000396000f3fe608060405234801561001057600080fd5b50600436106100b45760003560e01c80639f2e815d116100715780639f2e815d1461011f5780639fa83b5a146100e7578063aaf5eb6814610128578063b02867c314610137578063f2fde38b1461014a578063fd2da3391461015d57600080fd5b80631b3ed722146100b95780631f68f20a146100d557806354614bcd146100de57806357764094146100e7578063715018a6146100fa5780638da5cb5b14610104575b600080fd5b6100c260025481565b6040519081526020015b60405180910390f35b6100c260015481565b6100c260045481565b6100c26100f53660046103ec565b610166565b610102610177565b005b6000546040516001600160a01b0390911681526020016100cc565b6100c260055481565b6100c2670de0b6b3a764000081565b610102610145366004610405565b61018b565b610102610158366004610437565b6101a5565b6100c260035481565b6000610171826101e8565b92915050565b61017f610292565b61018960006102bf565b565b610193610292565b61019f8484848461030f565b50505050565b6101ad610292565b6001600160a01b0381166101dc57604051631e4fbdf760e01b8152600060048201526024015b60405180910390fd5b6101e5816102bf565b50565b600080670de0b6b3a76400008311610200578261020a565b670de0b6b3a76400005b60035490915080841161024d57600154670de0b6b3a764000060025486610231919061047d565b61023b9190610494565b61024591906104b6565b949350505050565b600061025982846104c9565b9050600554670de0b6b3a764000060045483610275919061047d565b61027f9190610494565b61028991906104b6565b95945050505050565b6000546001600160a01b031633146101895760405163118cdaa760e01b81523360048201526024016101d3565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b670de0b6b3a76400008211156103575760405162461bcd60e51b815260206004820152600d60248201526c096929c96bea89e9ebe90928e9609b1b60448201526064016101d3565b600184905560028390556003829055600481905583670de0b6b3a764000061037f858561047d565b6103899190610494565b61039391906104b6565b60058190556040805186815260208101869052808201859052606081018490526080810192909252517fab46822b7cbadf240ece5c2805344fdd7e27975b156c7af397d99b7c3f74eb859181900360a00190a150505050565b6000602082840312156103fe57600080fd5b5035919050565b6000806000806080858703121561041b57600080fd5b5050823594602084013594506040840135936060013592509050565b60006020828403121561044957600080fd5b81356001600160a01b038116811461046057600080fd5b9392505050565b634e487b7160e01b600052601160045260246000fd5b808202811582820484141761017157610171610467565b6000826104b157634e487b7160e01b600052601260045260246000fd5b500490565b8082018082111561017157610171610467565b818103818111156101715761017161046756fea2646970667358221220c75b680fd1d8deeae5351345d44f4f50162207f5b1a6fbd7b9cb64c85a5ae14d64736f6c63430008180033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100b45760003560e01c80639f2e815d116100715780639f2e815d1461011f5780639fa83b5a146100e7578063aaf5eb6814610128578063b02867c314610137578063f2fde38b1461014a578063fd2da3391461015d57600080fd5b80631b3ed722146100b95780631f68f20a146100d557806354614bcd146100de57806357764094146100e7578063715018a6146100fa5780638da5cb5b14610104575b600080fd5b6100c260025481565b6040519081526020015b60405180910390f35b6100c260015481565b6100c260045481565b6100c26100f53660046103ec565b610166565b610102610177565b005b6000546040516001600160a01b0390911681526020016100cc565b6100c260055481565b6100c2670de0b6b3a764000081565b610102610145366004610405565b61018b565b610102610158366004610437565b6101a5565b6100c260035481565b6000610171826101e8565b92915050565b61017f610292565b61018960006102bf565b565b610193610292565b61019f8484848461030f565b50505050565b6101ad610292565b6001600160a01b0381166101dc57604051631e4fbdf760e01b8152600060048201526024015b60405180910390fd5b6101e5816102bf565b50565b600080670de0b6b3a76400008311610200578261020a565b670de0b6b3a76400005b60035490915080841161024d57600154670de0b6b3a764000060025486610231919061047d565b61023b9190610494565b61024591906104b6565b949350505050565b600061025982846104c9565b9050600554670de0b6b3a764000060045483610275919061047d565b61027f9190610494565b61028991906104b6565b95945050505050565b6000546001600160a01b031633146101895760405163118cdaa760e01b81523360048201526024016101d3565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b670de0b6b3a76400008211156103575760405162461bcd60e51b815260206004820152600d60248201526c096929c96bea89e9ebe90928e9609b1b60448201526064016101d3565b600184905560028390556003829055600481905583670de0b6b3a764000061037f858561047d565b6103899190610494565b61039391906104b6565b60058190556040805186815260208101869052808201859052606081018490526080810192909252517fab46822b7cbadf240ece5c2805344fdd7e27975b156c7af397d99b7c3f74eb859181900360a00190a150505050565b6000602082840312156103fe57600080fd5b5035919050565b6000806000806080858703121561041b57600080fd5b5050823594602084013594506040840135936060013592509050565b60006020828403121561044957600080fd5b81356001600160a01b038116811461046057600080fd5b9392505050565b634e487b7160e01b600052601160045260246000fd5b808202811582820484141761017157610171610467565b6000826104b157634e487b7160e01b600052601260045260246000fd5b500490565b8082018082111561017157610171610467565b818103818111156101715761017161046756fea2646970667358221220c75b680fd1d8deeae5351345d44f4f50162207f5b1a6fbd7b9cb64c85a5ae14d64736f6c63430008180033
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.