MNT Price: $0.86 (+1.61%)

Contract

0xAa64d130Dcf150E8A156c499a31578EDd93aFEA3
 

Overview

MNT Balance

Mantle Mainnet Network LogoMantle Mainnet Network LogoMantle Mainnet Network Logo0 MNT

MNT Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Block
From
To

There are no matching entries

Please try again later

View more zero value Internal Transactions in Advanced View mode

Advanced mode:

Cross-Chain Transactions
Loading...
Loading

Similar Match Source Code
This contract matches the deployed Bytecode of the Source Code for Contract 0xeFb09C25...8994ad800
The constructor portion of the code might be different and could alter the actual behaviour of the contract

Contract Name:
KinkMultiplierModel

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity Standard Json-Input format)

// SPDX-License-Identifier: BSD-3-Clause
pragma solidity 0.8.17;

import "./interfaces/IKinkMultiplierModel.sol";
import "./interfaces/IInterestRateModel.sol";

contract KinkMultiplierModel is IKinkMultiplierModel, IInterestRateModel {
    uint256 public constant blocksPerYear = 2628000; // 12 second block interval

    uint256 public immutable interestRateMultiplierPerBlock;
    uint256 public immutable initialRatePerBlock;
    uint256 public immutable kinkCurveMultiplierPerBlock;
    uint256 public immutable kinkPoint;

    /// @param initialRatePerYear The approximate target initial APR, as a mantissa (scaled by 1e18)
    /// @param interestRateMultiplierPerYear Interest rate to utilisation rate increase ratio (scaled by 1e18)
    /// @param kinkCurveMultiplierPerYear The multiplier per year after hitting a kink point
    /// @param kinkPoint_ The utilisation point at which the kink curve multiplier is applied
    constructor(
        uint256 initialRatePerYear,
        uint256 interestRateMultiplierPerYear,
        uint256 kinkCurveMultiplierPerYear,
        uint256 kinkPoint_
    ) {
        require(kinkPoint_ > 0);
        initialRatePerBlock = initialRatePerYear / blocksPerYear;
        interestRateMultiplierPerBlock = interestRateMultiplierPerYear / blocksPerYear;
        kinkCurveMultiplierPerBlock = kinkCurveMultiplierPerYear / blocksPerYear;
        kinkPoint = kinkPoint_;
    }

    /// @inheritdoc IInterestRateModel
    function getBorrowRate(
        uint256 cash,
        uint256 borrows,
        uint256 protocolInterest
    ) public view returns (uint256) {
        uint256 util = utilisationRate(cash, borrows, protocolInterest);
        if (util <= kinkPoint) {
            return (util * interestRateMultiplierPerBlock) / 1e18 + initialRatePerBlock;
        } else {
            uint256 normalRate = (kinkPoint * interestRateMultiplierPerBlock) / 1e18 + initialRatePerBlock;
            uint256 excessUtil = util - kinkPoint;
            return (excessUtil * kinkCurveMultiplierPerBlock) / 1e18 + normalRate;
        }
    }

    /// @inheritdoc IInterestRateModel
    function getSupplyRate(
        uint256 cash,
        uint256 borrows,
        uint256 protocolInterest,
        uint256 protocolInterestFactorMantissa
    ) external view returns (uint256) {
        uint256 oneMinusProtocolInterestFactor = 1e18 - protocolInterestFactorMantissa;
        uint256 borrowRate = getBorrowRate(cash, borrows, protocolInterest);
        uint256 rateToPool = (borrowRate * oneMinusProtocolInterestFactor) / 1e18;
        return (utilisationRate(cash, borrows, protocolInterest) * rateToPool) / 1e18;
    }

    /// @inheritdoc IKinkMultiplierModel
    function utilisationRate(
        uint256 cash,
        uint256 borrows,
        uint256 protocolInterest
    ) public pure returns (uint256) {
        // Utilisation rate is 0 when there are no borrows
        if (borrows == 0) return 0;
        return (borrows * 1e18) / (cash + borrows - protocolInterest);
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

// SPDX-License-Identifier: BSD-3-Clause
pragma solidity 0.8.17;

import "@openzeppelin/contracts/utils/introspection/IERC165.sol";

/**
 * @title Minterest InterestRateModel Interface
 * @author Minterest
 */
interface IInterestRateModel {
    /**
     * @notice Calculates the current borrow interest rate per block
     * @param cash The total amount of cash the market has
     * @param borrows The total amount of borrows the market has outstanding
     * @param protocolInterest The total amount of protocol interest the market has
     * @return The borrow rate per block (as a percentage, and scaled by 1e18)
     */
    function getBorrowRate(
        uint256 cash,
        uint256 borrows,
        uint256 protocolInterest
    ) external view returns (uint256);

    /**
     * @notice Calculates the current supply interest rate per block
     * @param cash The total amount of cash the market has
     * @param borrows The total amount of borrows the market has outstanding
     * @param protocolInterest The total amount of protocol interest the market has
     * @param protocolInterestFactorMantissa The current protocol interest factor the market has
     * @return The supply rate per block (as a percentage, and scaled by 1e18)
     */
    function getSupplyRate(
        uint256 cash,
        uint256 borrows,
        uint256 protocolInterest,
        uint256 protocolInterestFactorMantissa
    ) external view returns (uint256);
}

// SPDX-License-Identifier: BSD-3-Clause
pragma solidity 0.8.17;

interface IKinkMultiplierModel {
    /**
     * @notice Gets the approximate number of blocks per year that is assumed by the interest rate model
     */
    function blocksPerYear() external view returns (uint256);

    /**
     * @notice Gets the multiplier of utilisation rate that gives the slope of the interest rate
     */
    function interestRateMultiplierPerBlock() external view returns (uint256);

    /**
     * @notice Gets the initial interest rate which is the y-intercept when utilisation rate is 0
     */
    function initialRatePerBlock() external view returns (uint256);

    /**
     * @notice Gets the interestRateMultiplierPerBlock after hitting a specified utilisation point
     */
    function kinkCurveMultiplierPerBlock() external view returns (uint256);

    /**
     * @notice Gets the utilisation point at which the kink curve multiplier is applied
     */
    function kinkPoint() external view returns (uint256);

    /**
     * @notice Calculates the utilisation rate of the market: `borrows / (cash + borrows - protocol interest)`
     * @param cash The amount of cash in the market
     * @param borrows The amount of borrows in the market
     * @param protocolInterest The amount of protocol interest in the market
     * @return The utilisation rate as a mantissa between [0, 1e18]
     */
    function utilisationRate(
        uint256 cash,
        uint256 borrows,
        uint256 protocolInterest
    ) external pure returns (uint256);
}

Settings
{
  "libraries": {},
  "metadata": {
    "useLiteralContent": true
  },
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"uint256","name":"initialRatePerYear","type":"uint256"},{"internalType":"uint256","name":"interestRateMultiplierPerYear","type":"uint256"},{"internalType":"uint256","name":"kinkCurveMultiplierPerYear","type":"uint256"},{"internalType":"uint256","name":"kinkPoint_","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"blocksPerYear","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"cash","type":"uint256"},{"internalType":"uint256","name":"borrows","type":"uint256"},{"internalType":"uint256","name":"protocolInterest","type":"uint256"}],"name":"getBorrowRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"cash","type":"uint256"},{"internalType":"uint256","name":"borrows","type":"uint256"},{"internalType":"uint256","name":"protocolInterest","type":"uint256"},{"internalType":"uint256","name":"protocolInterestFactorMantissa","type":"uint256"}],"name":"getSupplyRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialRatePerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"interestRateMultiplierPerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"kinkCurveMultiplierPerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"kinkPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"cash","type":"uint256"},{"internalType":"uint256","name":"borrows","type":"uint256"},{"internalType":"uint256","name":"protocolInterest","type":"uint256"}],"name":"utilisationRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"}]

0x61010060405234801561001157600080fd5b5060405161064a38038061064a83398101604081905261003091610079565b6000811161003d57600080fd5b61004a622819a0856100af565b60a05261005a622819a0846100af565b60805261006a622819a0836100af565b60c05260e052506100d1915050565b6000806000806080858703121561008f57600080fd5b505082516020840151604085015160609095015191969095509092509050565b6000826100cc57634e487b7160e01b600052601260045260246000fd5b500490565b60805160a05160c05160e05161050a61014060003960008181610105015281816101900152818161027701526102b801526000818161012c01526102ee0152600081816092015281816101b7015261022901526000818160de015281816101e40152610256015261050a6000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c806372c2cfd01161005b57806372c2cfd014610127578063a385fb961461014e578063b816881614610158578063ca6c72001461016b57600080fd5b80630a9ea29f1461008d57806315f24053146100c65780634c041acc146100d9578063662db9ab14610100575b600080fd5b6100b47f000000000000000000000000000000000000000000000000000000000000000081565b60405190815260200160405180910390f35b6100b46100d43660046103fb565b61017e565b6100b47f000000000000000000000000000000000000000000000000000000000000000081565b6100b47f000000000000000000000000000000000000000000000000000000000000000081565b6100b47f000000000000000000000000000000000000000000000000000000000000000081565b6100b4622819a081565b6100b4610166366004610427565b610334565b6100b46101793660046103fb565b6103b0565b60008061018c8585856103b0565b90507f00000000000000000000000000000000000000000000000000000000000000008111610225577f0000000000000000000000000000000000000000000000000000000000000000670de0b6b3a76400006102097f00000000000000000000000000000000000000000000000000000000000000008461046f565b610213919061048c565b61021d91906104ae565b91505061032d565b60007f0000000000000000000000000000000000000000000000000000000000000000670de0b6b3a764000061029b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000061046f565b6102a5919061048c565b6102af91906104ae565b905060006102dd7f0000000000000000000000000000000000000000000000000000000000000000846104c1565b905081670de0b6b3a76400006103137f00000000000000000000000000000000000000000000000000000000000000008461046f565b61031d919061048c565b61032791906104ae565b93505050505b9392505050565b60008061034983670de0b6b3a76400006104c1565b9050600061035887878761017e565b90506000670de0b6b3a764000061036f848461046f565b610379919061048c565b9050670de0b6b3a7640000816103908a8a8a6103b0565b61039a919061046f565b6103a4919061048c565b98975050505050505050565b6000826000036103c25750600061032d565b816103cd84866104ae565b6103d791906104c1565b6103e984670de0b6b3a764000061046f565b6103f3919061048c565b949350505050565b60008060006060848603121561041057600080fd5b505081359360208301359350604090920135919050565b6000806000806080858703121561043d57600080fd5b5050823594602084013594506040840135936060013592509050565b634e487b7160e01b600052601160045260246000fd5b808202811582820484141761048657610486610459565b92915050565b6000826104a957634e487b7160e01b600052601260045260246000fd5b500490565b8082018082111561048657610486610459565b818103818111156104865761048661045956fea2646970667358221220cd1f02eb22df8738ed95308675433e68b4d5e8274162f4bea5ea8dcffc1f825964736f6c6343000811003300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000095626ee78400000000000000000000000000000000000000000000000000005b2d5430ce5100000000000000000000000000000000000000000000000000000b1a2bc2ec500000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106100885760003560e01c806372c2cfd01161005b57806372c2cfd014610127578063a385fb961461014e578063b816881614610158578063ca6c72001461016b57600080fd5b80630a9ea29f1461008d57806315f24053146100c65780634c041acc146100d9578063662db9ab14610100575b600080fd5b6100b47f000000000000000000000000000000000000000000000000000000000000000081565b60405190815260200160405180910390f35b6100b46100d43660046103fb565b61017e565b6100b47f00000000000000000000000000000000000000000000000000000003b9aca00081565b6100b47f0000000000000000000000000000000000000000000000000b1a2bc2ec50000081565b6100b47f00000000000000000000000000000000000000000000000000000246139ca80081565b6100b4622819a081565b6100b4610166366004610427565b610334565b6100b46101793660046103fb565b6103b0565b60008061018c8585856103b0565b90507f0000000000000000000000000000000000000000000000000b1a2bc2ec5000008111610225577f0000000000000000000000000000000000000000000000000000000000000000670de0b6b3a76400006102097f00000000000000000000000000000000000000000000000000000003b9aca0008461046f565b610213919061048c565b61021d91906104ae565b91505061032d565b60007f0000000000000000000000000000000000000000000000000000000000000000670de0b6b3a764000061029b7f00000000000000000000000000000000000000000000000000000003b9aca0007f0000000000000000000000000000000000000000000000000b1a2bc2ec50000061046f565b6102a5919061048c565b6102af91906104ae565b905060006102dd7f0000000000000000000000000000000000000000000000000b1a2bc2ec500000846104c1565b905081670de0b6b3a76400006103137f00000000000000000000000000000000000000000000000000000246139ca8008461046f565b61031d919061048c565b61032791906104ae565b93505050505b9392505050565b60008061034983670de0b6b3a76400006104c1565b9050600061035887878761017e565b90506000670de0b6b3a764000061036f848461046f565b610379919061048c565b9050670de0b6b3a7640000816103908a8a8a6103b0565b61039a919061046f565b6103a4919061048c565b98975050505050505050565b6000826000036103c25750600061032d565b816103cd84866104ae565b6103d791906104c1565b6103e984670de0b6b3a764000061046f565b6103f3919061048c565b949350505050565b60008060006060848603121561041057600080fd5b505081359360208301359350604090920135919050565b6000806000806080858703121561043d57600080fd5b5050823594602084013594506040840135936060013592509050565b634e487b7160e01b600052601160045260246000fd5b808202811582820484141761048657610486610459565b92915050565b6000826104a957634e487b7160e01b600052601260045260246000fd5b500490565b8082018082111561048657610486610459565b818103818111156104865761048661045956fea2646970667358221220cd1f02eb22df8738ed95308675433e68b4d5e8274162f4bea5ea8dcffc1f825964736f6c63430008110033

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

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.