Overview
S Balance
S Value
$0.00More Info
Private Name Tags
ContractCreator
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
MutableSingleKinkFundingRateModel
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/IFundingRateModel.sol"; import "../BaseModels/SingleKinkRateModel/MutableSingleKinkRateModel.sol"; /** * @title MutableSingleKinkFundingRateModel * @dev Single kink rate model for funding rates with the ability to change rate parameters */ contract MutableSingleKinkFundingRateModel is MutableSingleKinkRateModel, IFundingRateModel { constructor() MutableSingleKinkRateModel(msg.sender) {} // return values in mantissa per oi unit per second function getFundingRate( uint256, // pairId, uint256 openInterestLong, uint256 openInterestShort, uint256 // pairMaxOpenInterest ) external view override returns (uint256) { uint256 absDIff = openInterestLong > openInterestShort ? openInterestLong - openInterestShort : openInterestShort - openInterestLong; uint sum = openInterestLong + openInterestShort; if (sum == 0) { return 0; } else { return getRateInternal((absDIff * PRECISION) / sum); } } }
// 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 IFundingRateModel { // return value is the "funding paid by heavier side" in PRECISION per OI (heavier side) per second // e.g : (0.01 * PRECISION) = Paying (heavier) side (as a whole) pays 1% of funding per second for each OI unit function getFundingRate( uint256 pairId, uint256 openInterestLong, uint256 openInterestShort, uint256 pairMaxOpenInterest ) 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
Contract ABI
API[{"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":"","type":"uint256"},{"internalType":"uint256","name":"openInterestLong","type":"uint256"},{"internalType":"uint256","name":"openInterestShort","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"getFundingRate","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
608060405234801561001057600080fd5b5033808061003857604051631e4fbdf760e01b81526000600482015260240160405180910390fd5b61004181610048565b5050610098565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b610595806100a76000396000f3fe608060405234801561001057600080fd5b50600436106100b45760003560e01c80638da5cb5b116100715780638da5cb5b146101175780639f2e815d14610132578063aaf5eb681461013b578063b02867c31461014a578063f2fde38b1461015d578063fd2da3391461017057600080fd5b80630f417ad4146100b95780631b3ed722146100df5780631f68f20a146100e857806354614bcd146100f157806357764094146100fa578063715018a61461010d575b600080fd5b6100cc6100c736600461046f565b610179565b6040519081526020015b60405180910390f35b6100cc60025481565b6100cc60015481565b6100cc60045481565b6100cc6101083660046104a1565b6101f1565b610115610202565b005b6000546040516001600160a01b0390911681526020016100d6565b6100cc60055481565b6100cc670de0b6b3a764000081565b61011561015836600461046f565b610216565b61011561016b3660046104ba565b610230565b6100cc60035481565b6000808385116101925761018d8585610500565b61019c565b61019c8486610500565b905060006101aa8587610513565b9050806000036101bf576000925050506101e9565b6101e4816101d5670de0b6b3a764000085610526565b6101df919061053d565b610273565b925050505b949350505050565b60006101fc82610273565b92915050565b61020a610315565b6102146000610342565b565b61021e610315565b61022a84848484610392565b50505050565b610238610315565b6001600160a01b03811661026757604051631e4fbdf760e01b8152600060048201526024015b60405180910390fd5b61027081610342565b50565b600080670de0b6b3a7640000831161028b5782610295565b670de0b6b3a76400005b6003549091508084116102d057600154670de0b6b3a7640000600254866102bc9190610526565b6102c6919061053d565b6101e99190610513565b60006102dc8284610500565b9050600554670de0b6b3a7640000600454836102f89190610526565b610302919061053d565b61030c9190610513565b95945050505050565b6000546001600160a01b031633146102145760405163118cdaa760e01b815233600482015260240161025e565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b670de0b6b3a76400008211156103da5760405162461bcd60e51b815260206004820152600d60248201526c096929c96bea89e9ebe90928e9609b1b604482015260640161025e565b600184905560028390556003829055600481905583670de0b6b3a76400006104028585610526565b61040c919061053d565b6104169190610513565b60058190556040805186815260208101869052808201859052606081018490526080810192909252517fab46822b7cbadf240ece5c2805344fdd7e27975b156c7af397d99b7c3f74eb859181900360a00190a150505050565b6000806000806080858703121561048557600080fd5b5050823594602084013594506040840135936060013592509050565b6000602082840312156104b357600080fd5b5035919050565b6000602082840312156104cc57600080fd5b81356001600160a01b03811681146104e357600080fd5b9392505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156101fc576101fc6104ea565b808201808211156101fc576101fc6104ea565b80820281158282048414176101fc576101fc6104ea565b60008261055a57634e487b7160e01b600052601260045260246000fd5b50049056fea26469706673582212200c8f7327f53ebb37b7995d7335c3bff605a49a89efef9b9f5806778063724cfc64736f6c63430008180033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100b45760003560e01c80638da5cb5b116100715780638da5cb5b146101175780639f2e815d14610132578063aaf5eb681461013b578063b02867c31461014a578063f2fde38b1461015d578063fd2da3391461017057600080fd5b80630f417ad4146100b95780631b3ed722146100df5780631f68f20a146100e857806354614bcd146100f157806357764094146100fa578063715018a61461010d575b600080fd5b6100cc6100c736600461046f565b610179565b6040519081526020015b60405180910390f35b6100cc60025481565b6100cc60015481565b6100cc60045481565b6100cc6101083660046104a1565b6101f1565b610115610202565b005b6000546040516001600160a01b0390911681526020016100d6565b6100cc60055481565b6100cc670de0b6b3a764000081565b61011561015836600461046f565b610216565b61011561016b3660046104ba565b610230565b6100cc60035481565b6000808385116101925761018d8585610500565b61019c565b61019c8486610500565b905060006101aa8587610513565b9050806000036101bf576000925050506101e9565b6101e4816101d5670de0b6b3a764000085610526565b6101df919061053d565b610273565b925050505b949350505050565b60006101fc82610273565b92915050565b61020a610315565b6102146000610342565b565b61021e610315565b61022a84848484610392565b50505050565b610238610315565b6001600160a01b03811661026757604051631e4fbdf760e01b8152600060048201526024015b60405180910390fd5b61027081610342565b50565b600080670de0b6b3a7640000831161028b5782610295565b670de0b6b3a76400005b6003549091508084116102d057600154670de0b6b3a7640000600254866102bc9190610526565b6102c6919061053d565b6101e99190610513565b60006102dc8284610500565b9050600554670de0b6b3a7640000600454836102f89190610526565b610302919061053d565b61030c9190610513565b95945050505050565b6000546001600160a01b031633146102145760405163118cdaa760e01b815233600482015260240161025e565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b670de0b6b3a76400008211156103da5760405162461bcd60e51b815260206004820152600d60248201526c096929c96bea89e9ebe90928e9609b1b604482015260640161025e565b600184905560028390556003829055600481905583670de0b6b3a76400006104028585610526565b61040c919061053d565b6104169190610513565b60058190556040805186815260208101869052808201859052606081018490526080810192909252517fab46822b7cbadf240ece5c2805344fdd7e27975b156c7af397d99b7c3f74eb859181900360a00190a150505050565b6000806000806080858703121561048557600080fd5b5050823594602084013594506040840135936060013592509050565b6000602082840312156104b357600080fd5b5035919050565b6000602082840312156104cc57600080fd5b81356001600160a01b03811681146104e357600080fd5b9392505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156101fc576101fc6104ea565b808201808211156101fc576101fc6104ea565b80820281158282048414176101fc576101fc6104ea565b60008261055a57634e487b7160e01b600052601260045260246000fd5b50049056fea26469706673582212200c8f7327f53ebb37b7995d7335c3bff605a49a89efef9b9f5806778063724cfc64736f6c63430008180033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 35 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.