mirror of
https://github.com/Instadapp/dsa-connectors-2.0.git
synced 2024-07-29 21:57:39 +00:00
46 lines
1.6 KiB
Solidity
46 lines
1.6 KiB
Solidity
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||
|
pragma solidity ^0.8.0;
|
||
|
|
||
|
uint256 constant WAD = 1e18;
|
||
|
|
||
|
/// @title MathLib
|
||
|
/// @author Morpho Labs
|
||
|
/// @custom:contact security@morpho.org
|
||
|
/// @notice Library to manage fixed-point arithmetic.
|
||
|
library MathLib {
|
||
|
/// @dev Returns (`x` * `y`) / `WAD` rounded down.
|
||
|
function wMulDown(uint256 x, uint256 y) internal pure returns (uint256) {
|
||
|
return mulDivDown(x, y, WAD);
|
||
|
}
|
||
|
|
||
|
/// @dev Returns (`x` * `WAD`) / `y` rounded down.
|
||
|
function wDivDown(uint256 x, uint256 y) internal pure returns (uint256) {
|
||
|
return mulDivDown(x, WAD, y);
|
||
|
}
|
||
|
|
||
|
/// @dev Returns (`x` * `WAD`) / `y` rounded up.
|
||
|
function wDivUp(uint256 x, uint256 y) internal pure returns (uint256) {
|
||
|
return mulDivUp(x, WAD, y);
|
||
|
}
|
||
|
|
||
|
/// @dev Returns (`x` * `y`) / `d` rounded down.
|
||
|
function mulDivDown(uint256 x, uint256 y, uint256 d) internal pure returns (uint256) {
|
||
|
return (x * y) / d;
|
||
|
}
|
||
|
|
||
|
/// @dev Returns (`x` * `y`) / `d` rounded up.
|
||
|
function mulDivUp(uint256 x, uint256 y, uint256 d) internal pure returns (uint256) {
|
||
|
return (x * y + (d - 1)) / d;
|
||
|
}
|
||
|
|
||
|
/// @dev Returns the sum of the first three non-zero terms of a Taylor expansion of e^(nx) - 1, to approximate a
|
||
|
/// continuous compound interest rate.
|
||
|
function wTaylorCompounded(uint256 x, uint256 n) internal pure returns (uint256) {
|
||
|
uint256 firstTerm = x * n;
|
||
|
uint256 secondTerm = mulDivDown(firstTerm, firstTerm, 2 * WAD);
|
||
|
uint256 thirdTerm = mulDivDown(secondTerm, firstTerm, 3 * WAD);
|
||
|
|
||
|
return firstTerm + secondTerm + thirdTerm;
|
||
|
}
|
||
|
}
|