Skip to content

Commit

Permalink
feat: use mulDiv
Browse files Browse the repository at this point in the history
  • Loading branch information
bhargavaparoksham committed Jan 14, 2025
1 parent 191050c commit db499fd
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 13 deletions.
18 changes: 11 additions & 7 deletions src/protocol/AssetPool.sol
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ pragma solidity ^0.8.20;
import "openzeppelin-contracts/contracts/access/Ownable.sol";
import "openzeppelin-contracts/contracts/token/ERC20/IERC20.sol";
import "openzeppelin-contracts/contracts/utils/Pausable.sol";
import "openzeppelin-contracts/contracts/utils/math/Math.sol";
import {IAssetPool} from "../interfaces/IAssetPool.sol";
import {IXToken} from "../interfaces/IXToken.sol";
import {ILPRegistry} from "../interfaces/ILPRegistry.sol";
Expand Down Expand Up @@ -129,8 +130,8 @@ contract AssetPool is IAssetPool, Ownable, Pausable {

// Get scaled amount from xToken contract
uint256 scaledAmount = assetToken.scaledBalanceOf(msg.sender);
uint256 nominalBalance = assetToken.balanceOf(msg.sender);
uint256 scaledBurnAmount = scaledAmount * xTokenAmount / nominalBalance;
uint256 balance = assetToken.balanceOf(msg.sender);
uint256 scaledBurnAmount = Math.mulDiv(scaledAmount, xTokenAmount, balance);

assetToken.burn(msg.sender, xTokenAmount);
redemptionScaledRequests[msg.sender] = scaledBurnAmount;
Expand All @@ -147,11 +148,14 @@ contract AssetPool is IAssetPool, Ownable, Pausable {
if (amount == 0) revert NothingToCancel();

uint256 scaledAmount = redemptionScaledRequests[msg.sender];

totalRedemptionRequests -= amount;
totalRedemptionScaledRequests -= scaledAmount;

redemptionRequests[msg.sender] = 0;
redemptionScaledRequests[msg.sender] = 0;
totalRedemptionRequests -= redemptionRequests[msg.sender];
totalRedemptionScaledRequests -= scaledAmount;
uint256 price = amount * PRECISION / scaledAmount;

uint256 price = Math.mulDiv(amount, PRECISION, scaledAmount);
assetToken.mint(msg.sender, amount, price);

emit BurnCancelled(msg.sender, amount, cycleIndex);
Expand Down Expand Up @@ -187,8 +191,8 @@ contract AssetPool is IAssetPool, Ownable, Pausable {
uint256 spotPrice = assetToken.oracle().assetPrice();
netReserveDelta = int256(totalDepositRequests) - int256(totalRedemptionRequests);
newReserveSupply = assetToken.totalSupply() + totalDepositRequests; // Redemptions are already burned so they are not considered
newAssetSupply = newReserveSupply * spotPrice / PRECISION;
rebalanceAmount = int256(totalRedemptionScaledRequests * spotPrice / PRECISION) - int256(totalRedemptionRequests);
newAssetSupply = Math.mulDiv(newReserveSupply, spotPrice, PRECISION);
rebalanceAmount = int256(Math.mulDiv(totalRedemptionScaledRequests, spotPrice, PRECISION)) - int256(totalRedemptionRequests);

emit RebalanceInitiated(
cycleIndex,
Expand Down
11 changes: 5 additions & 6 deletions src/protocol/xToken.sol
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
pragma solidity ^0.8.20;

import "openzeppelin-contracts/contracts/token/ERC20/ERC20.sol";
import "openzeppelin-contracts/contracts/utils/math/Math.sol";
import "../interfaces/IAssetOracle.sol";
import "../interfaces/IXToken.sol";

Expand Down Expand Up @@ -79,7 +80,7 @@ contract xToken is IXToken, ERC20 {
*/
function _convertToScaledAmountWithPrice(uint256 amount, uint256 price) internal pure returns (uint256) {
if (price == 0) revert InvalidPrice();
return (amount * PRECISION) / price;
return Math.mulDiv(amount, PRECISION, price);
}

/**
Expand Down Expand Up @@ -129,8 +130,8 @@ contract xToken is IXToken, ERC20 {
function burn(address account, uint256 amount) external onlyPool {
uint256 balance = balanceOf(account);
if (balance < amount) revert InsufficientBalance();
uint256 scaledBalace = _scaledBalances[account];
uint256 scaledBalanceToBurn = scaledBalace * amount / balance;
uint256 scaledBalance = _scaledBalances[account];
uint256 scaledBalanceToBurn = Math.mulDiv(scaledBalance, amount, balance);

_scaledBalances[account] -= scaledBalanceToBurn;
_totalScaledSupply -= scaledBalanceToBurn;
Expand All @@ -150,14 +151,13 @@ contract xToken is IXToken, ERC20 {
if (balance < amount) revert InsufficientBalance();

uint256 scaledBalance = _scaledBalances[msg.sender];
uint256 scaledBalanceToTransfer = scaledBalance * amount / balance;
uint256 scaledBalanceToTransfer = Math.mulDiv(scaledBalance, amount, balance);

_scaledBalances[msg.sender] -= scaledBalanceToTransfer;
_scaledBalances[recipient] += scaledBalanceToTransfer;

_transfer(msg.sender, recipient, amount);

emit Transfer(msg.sender, recipient, amount);
return true;
}

Expand Down Expand Up @@ -189,7 +189,6 @@ contract xToken is IXToken, ERC20 {

_transfer(sender, recipient, amount);

emit Transfer(sender, recipient, amount);
return true;
}
}

0 comments on commit db499fd

Please sign in to comment.