mirror of
https://github.com/Instadapp/dsa-connectors-2.0.git
synced 2024-07-29 21:57:39 +00:00
46 lines
2.3 KiB
Solidity
46 lines
2.3 KiB
Solidity
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
pragma solidity ^0.8.0;
|
|
|
|
import {MathLib} from "./MathLib.sol";
|
|
|
|
/// @title SharesMathLib
|
|
/// @author Morpho Labs
|
|
/// @custom:contact security@morpho.org
|
|
/// @notice Shares management library.
|
|
/// @dev This implementation mitigates share price manipulations, using OpenZeppelin's method of virtual shares:
|
|
/// https://docs.openzeppelin.com/contracts/4.x/erc4626#inflation-attack.
|
|
library SharesMathLib {
|
|
using MathLib for uint256;
|
|
|
|
/// @dev The number of virtual shares has been chosen low enough to prevent overflows, and high enough to ensure
|
|
/// high precision computations.
|
|
/// @dev Virtual shares can never be redeemed for the assets they are entitled to, but it is assumed the share price
|
|
/// stays low enough not to inflate these assets to a significant value.
|
|
/// @dev Warning: The assets to which virtual borrow shares are entitled behave like unrealizable bad debt.
|
|
uint256 internal constant VIRTUAL_SHARES = 1e6;
|
|
|
|
/// @dev A number of virtual assets of 1 enforces a conversion rate between shares and assets when a market is
|
|
/// empty.
|
|
uint256 internal constant VIRTUAL_ASSETS = 1;
|
|
|
|
/// @dev Calculates the value of `assets` quoted in shares, rounding down.
|
|
function toSharesDown(uint256 assets, uint256 totalAssets, uint256 totalShares) internal pure returns (uint256) {
|
|
return assets.mulDivDown(totalShares + VIRTUAL_SHARES, totalAssets + VIRTUAL_ASSETS);
|
|
}
|
|
|
|
/// @dev Calculates the value of `shares` quoted in assets, rounding down.
|
|
function toAssetsDown(uint256 shares, uint256 totalAssets, uint256 totalShares) internal pure returns (uint256) {
|
|
return shares.mulDivDown(totalAssets + VIRTUAL_ASSETS, totalShares + VIRTUAL_SHARES);
|
|
}
|
|
|
|
/// @dev Calculates the value of `assets` quoted in shares, rounding up.
|
|
function toSharesUp(uint256 assets, uint256 totalAssets, uint256 totalShares) internal pure returns (uint256) {
|
|
return assets.mulDivUp(totalShares + VIRTUAL_SHARES, totalAssets + VIRTUAL_ASSETS);
|
|
}
|
|
|
|
/// @dev Calculates the value of `shares` quoted in assets, rounding up.
|
|
function toAssetsUp(uint256 shares, uint256 totalAssets, uint256 totalShares) internal pure returns (uint256) {
|
|
return shares.mulDivUp(totalAssets + VIRTUAL_ASSETS, totalShares + VIRTUAL_SHARES);
|
|
}
|
|
}
|