From cb5ff98dbc4da5e243c6b75a4291155a99f0fa1c Mon Sep 17 00:00:00 2001 From: Taylor Brent Date: Thu, 5 Sep 2024 17:46:34 -0400 Subject: [PATCH] accmumulate throttles during dissolve()/mint() --- contracts/p0/RToken.sol | 4 ++++ contracts/p1/RToken.sol | 13 ++++++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/contracts/p0/RToken.sol b/contracts/p0/RToken.sol index c30757f96..ec3ba5ecd 100644 --- a/contracts/p0/RToken.sol +++ b/contracts/p0/RToken.sol @@ -267,6 +267,8 @@ contract RTokenP0 is ComponentP0, ERC20PermitUpgradeable, IRToken { /// @custom:protected function mint(uint192 baskets) external exchangeRateIsValidAfter { require(_msgSender() == address(main.backingManager()), "not backing manager"); + issuanceThrottle.useAvailable(totalSupply(), 0); + redemptionThrottle.useAvailable(totalSupply(), 0); _scaleUp(address(main.backingManager()), baskets); } @@ -285,6 +287,8 @@ contract RTokenP0 is ComponentP0, ERC20PermitUpgradeable, IRToken { /// @custom:protected function dissolve(uint256 amount) external exchangeRateIsValidAfter { require(_msgSender() == address(main.backingManager()), "not backing manager"); + issuanceThrottle.useAvailable(totalSupply(), 0); + redemptionThrottle.useAvailable(totalSupply(), 0); _scaleDown(_msgSender(), amount); } diff --git a/contracts/p1/RToken.sol b/contracts/p1/RToken.sol index e6350c81a..63308e58e 100644 --- a/contracts/p1/RToken.sol +++ b/contracts/p1/RToken.sol @@ -355,7 +355,12 @@ contract RTokenP1 is ComponentP1, ERC20PermitUpgradeable, IRToken { // BU exchange rate cannot decrease, and it can only increase when < FIX_ONE. function mint(uint192 baskets) external { require(_msgSender() == address(backingManager), "not backing manager"); - _scaleUp(address(backingManager), baskets, totalSupply()); + uint256 supply = totalSupply(); + + // Accumulate the throttle before the supply change + issuanceThrottle.useAvailable(supply, 0); + redemptionThrottle.useAvailable(supply, 0); + _scaleUp(address(backingManager), baskets, supply); } /// Melt a quantity of RToken from the caller's account, increasing the basket rate @@ -372,6 +377,7 @@ contract RTokenP1 is ComponentP1, ERC20PermitUpgradeable, IRToken { require(caller == address(furnace), "furnace only"); _burn(caller, amtRToken); emit Melted(amtRToken); + // do not update throttles: melting is frequent and always small } /// Burn an amount of RToken from caller's account and scale basketsNeeded down @@ -387,6 +393,11 @@ contract RTokenP1 is ComponentP1, ERC20PermitUpgradeable, IRToken { function dissolve(uint256 amount) external { address caller = _msgSender(); require(caller == address(backingManager), "not backing manager"); + uint256 supply = totalSupply(); + + // Accumulate the throttle before the supply change + issuanceThrottle.useAvailable(supply, 0); + redemptionThrottle.useAvailable(supply, 0); _scaleDown(caller, amount); }