Skip to content

Commit 8272ca6

Browse files
committed
chore: clean up dependencies, remove USTB
test: try to isolate rounding issues for USDC converter
1 parent 9209e59 commit 8272ca6

File tree

7 files changed

+94
-61
lines changed

7 files changed

+94
-61
lines changed

.gitmodules

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,4 @@
2525
url = https://github.com/aave/safety-module
2626
[submodule "lib/openzeppelin-contracts"]
2727
path = lib/openzeppelin-contracts
28-
url = https://github.com/OpenZeppelin/openzeppelin-contracts
29-
[submodule "lib/ustb"]
30-
path = lib/ustb
31-
url = https://github.com/superstateinc/ustb
28+
url = https://github.com/OpenZeppelin/openzeppelin-contracts

lib/ustb

Lines changed: 0 additions & 1 deletion
This file was deleted.

src/contracts/facilitators/gsm/converter/USTBGsmConverter.sol

Lines changed: 22 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -183,9 +183,8 @@ contract USTBGsmConverter is Ownable, EIP712, IGsmConverter {
183183
uint256 initialIssuedAssetBalance = IERC20(ISSUED_ASSET).balanceOf(address(this));
184184
uint256 initialRedeemedAssetBalance = IERC20(REDEEMED_ASSET).balanceOf(address(this));
185185

186-
(uint256 minUSTBAmount, ) = ISubscriptionRedemption(REDEMPTION_CONTRACT).calculateUstbIn(
187-
minAmount
188-
);
186+
// (uint256 minUSTBAmount, ) = ISubscription(REDEMPTION_CONTRACT).calculateUstbIn(minAmount);
187+
uint256 minUSTBAmount = 0;
189188

190189
(, uint256 ghoAmount, , ) = IGsm(GSM).getGhoAmountForBuyAsset(minUSTBAmount);
191190

@@ -196,21 +195,21 @@ contract USTBGsmConverter is Ownable, EIP712, IGsmConverter {
196195
IGhoToken(GHO_TOKEN).approve(address(GSM), 0);
197196

198197
IERC20(ISSUED_ASSET).approve(address(REDEMPTION_CONTRACT), boughtAssetAmount);
199-
ISubscriptionRedemption(REDEMPTION_CONTRACT).redeem(boughtAssetAmount);
200-
IERC20(ISSUED_ASSET).approve(address(REDEMPTION_CONTRACT), 0);
201-
IERC20(REDEEMED_ASSET).safeTransfer(receiver, minAmount);
202-
203-
require(
204-
IGhoToken(GHO_TOKEN).balanceOf(address(this)) == initialGhoBalance,
205-
'INVALID_REMAINING_GHO_BALANCE'
206-
);
207-
require(
208-
IERC20(ISSUED_ASSET).balanceOf(address(this)) == initialIssuedAssetBalance,
209-
'INVALID_REMAINING_ISSUED_ASSET_BALANCE'
210-
);
211-
212-
emit BuyAssetThroughRedemption(originator, receiver, boughtAssetAmount, ghoSold);
213-
return (boughtAssetAmount, ghoSold);
198+
// ISubscription(REDEMPTION_CONTRACT).redeem(boughtAssetAmount);
199+
// IERC20(ISSUED_ASSET).approve(address(REDEMPTION_CONTRACT), 0);
200+
// IERC20(REDEEMED_ASSET).safeTransfer(receiver, minAmount);
201+
202+
// require(
203+
// IGhoToken(GHO_TOKEN).balanceOf(address(this)) == initialGhoBalance,
204+
// 'INVALID_REMAINING_GHO_BALANCE'
205+
// );
206+
// require(
207+
// IERC20(ISSUED_ASSET).balanceOf(address(this)) == initialIssuedAssetBalance,
208+
// 'INVALID_REMAINING_ISSUED_ASSET_BALANCE'
209+
// );
210+
211+
// emit BuyAssetThroughRedemption(originator, receiver, boughtAssetAmount, ghoSold);
212+
// return (boughtAssetAmount, ghoSold);
214213
}
215214

216215
/**
@@ -230,15 +229,14 @@ contract USTBGsmConverter is Ownable, EIP712, IGsmConverter {
230229
uint256 initialIssuedAssetBalance = IERC20(ISSUED_ASSET).balanceOf(address(this));
231230
uint256 initialRedeemedAssetBalance = IERC20(REDEEMED_ASSET).balanceOf(address(this));
232231

233-
(uint256 redeemedAssetAmount, , , ) = IGsm(GSM).getGhoAmountForSellAsset(maxAmount); // asset is BUIDL
232+
(uint256 redeemedAssetAmount, , , ) = IGsm(GSM).getGhoAmountForSellAsset(maxAmount); // asset is USTB
234233
IERC20(REDEEMED_ASSET).transferFrom(originator, address(this), redeemedAssetAmount);
235234
IERC20(REDEEMED_ASSET).approve(SUBSCRIPTION_CONTRACT, redeemedAssetAmount);
236235

237-
(uint256 subscribedAssetAmount, , ) = IERC20(SUBSCRIPTION_CONTRACT).calculateSuperstateTokenOut(
238-
redeemedAssetAmount,
239-
REDEEMED_ASSET
240-
);
236+
(uint256 subscribedAssetAmount, , ) = ISubscription(SUBSCRIPTION_CONTRACT)
237+
.calculateSuperstateTokenOut(redeemedAssetAmount, REDEEMED_ASSET);
241238
ISubscription(SUBSCRIPTION_CONTRACT).subscribe(redeemedAssetAmount, REDEEMED_ASSET);
239+
242240
require(
243241
IERC20(ISSUED_ASSET).balanceOf(address(this)) ==
244242
initialIssuedAssetBalance + subscribedAssetAmount,
@@ -249,6 +247,7 @@ contract USTBGsmConverter is Ownable, EIP712, IGsmConverter {
249247

250248
(redeemedAssetAmount, , , ) = IGsm(GSM).getGhoAmountForSellAsset(subscribedAssetAmount); // recalculate based on actual issuance amount, < maxAmount
251249
IERC20(ISSUED_ASSET).approve(GSM, redeemedAssetAmount);
250+
252251
(uint256 soldAssetAmount, uint256 ghoBought) = IGsm(GSM).sellAsset(
253252
subscribedAssetAmount,
254253
receiver

src/contracts/facilitators/gsm/dependencies/USTB/ISubscription.sol

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,21 @@ pragma solidity ^0.8.10;
33

44
interface ISubscription {
55
/**
6-
* @notice Subscribes an amount of USTB in exchange for USDC
7-
* @param amount The amount of USDC to subscribe
6+
* @notice The ```subscribe``` function takes in stablecoins and mints SuperstateToken in the proper amount for the msg.sender depending on the current Net Asset Value per Share.
7+
* @param inAmount The amount of the stablecoin in
88
* @param stablecoin The address of the stablecoin to calculate with
99
*/
1010
function subscribe(uint256 inAmount, address stablecoin) external;
11+
12+
function calculateSuperstateTokenOut(
13+
uint256 inAmount,
14+
address stablecoin
15+
)
16+
external
17+
view
18+
returns (
19+
uint256 superstateTokenOutAmount,
20+
uint256 stablecoinInAmountAfterFee,
21+
uint256 feeOnStablecoinInAmount
22+
);
1123
}

src/test/TestGhoBase.t.sol

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ import {IGhoCcipSteward} from '../contracts/misc/interfaces/IGhoCcipSteward.sol'
9696
import {GhoCcipSteward} from '../contracts/misc/GhoCcipSteward.sol';
9797
import {GhoBucketSteward} from '../contracts/misc/GhoBucketSteward.sol';
9898
import {GsmConverter} from '../contracts/facilitators/gsm/converter/GsmConverter.sol';
99+
import {USTBGsmConverter} from '../contracts/facilitators/gsm/converter/USTBGsmConverter.sol';
99100

100101
contract TestGhoBase is Test, Constants, Events {
101102
using WadRayMath for uint256;
@@ -145,9 +146,12 @@ contract TestGhoBase is Test, Constants, Events {
145146
Gsm GHO_GSM;
146147
Gsm4626 GHO_GSM_4626;
147148
Gsm GHO_BUIDL_GSM;
149+
Gsm GHO_USTB_GSM;
148150
GsmConverter GSM_CONVERTER;
151+
USTBGsmConverter USTB_GSM_CONVERTER;
149152
FixedPriceStrategy GHO_GSM_FIXED_PRICE_STRATEGY;
150153
FixedPriceStrategy GHO_BUIDL_GSM_FIXED_PRICE_STRATEGY;
154+
FixedPriceStrategy GHO_USTB_GSM_FIXED_PRICE_STRATEGY;
151155
FixedPriceStrategy4626 GHO_GSM_4626_FIXED_PRICE_STRATEGY;
152156
FixedFeeStrategy GHO_GSM_FIXED_FEE_STRATEGY;
153157
SampleLiquidator GHO_GSM_LAST_RESORT_LIQUIDATOR;
@@ -295,7 +299,7 @@ contract TestGhoBase is Test, Constants, Events {
295299
);
296300
GHO_USTB_GSM_FIXED_PRICE_STRATEGY = new FixedPriceStrategy(
297301
DEFAULT_FIXED_PRICE,
298-
address(BUIDL_TOKEN),
302+
address(USTB_TOKEN),
299303
6
300304
);
301305
GHO_GSM_FIXED_FEE_STRATEGY = new FixedFeeStrategy(DEFAULT_GSM_BUY_FEE, DEFAULT_GSM_SELL_FEE);
@@ -334,10 +338,24 @@ contract TestGhoBase is Test, Constants, Events {
334338
GHO_BUIDL_GSM = Gsm(address(buidlGsmProxy));
335339
GHO_BUIDL_GSM.initialize(address(this), TREASURY, DEFAULT_GSM_BUIDL_EXPOSURE);
336340

341+
Gsm ustbGsm = new Gsm(
342+
address(GHO_TOKEN),
343+
address(USTB_TOKEN),
344+
address(GHO_USTB_GSM_FIXED_PRICE_STRATEGY)
345+
);
346+
AdminUpgradeabilityProxy ustbGsmProxy = new AdminUpgradeabilityProxy(
347+
address(ustbGsm),
348+
SHORT_EXECUTOR,
349+
''
350+
);
351+
GHO_USTB_GSM = Gsm(address(ustbGsmProxy));
352+
GHO_USTB_GSM.initialize(address(this), TREASURY, DEFAULT_GSM_BUIDL_EXPOSURE);
353+
337354
GHO_GSM_FIXED_FEE_STRATEGY = new FixedFeeStrategy(DEFAULT_GSM_BUY_FEE, DEFAULT_GSM_SELL_FEE);
338355
GHO_GSM.updateFeeStrategy(address(GHO_GSM_FIXED_FEE_STRATEGY));
339356
GHO_GSM_4626.updateFeeStrategy(address(GHO_GSM_FIXED_FEE_STRATEGY));
340357
GHO_BUIDL_GSM.updateFeeStrategy(address(GHO_GSM_FIXED_FEE_STRATEGY));
358+
GHO_USTB_GSM.updateFeeStrategy(address(GHO_GSM_FIXED_FEE_STRATEGY));
341359

342360
GHO_GSM.grantRole(GSM_LIQUIDATOR_ROLE, address(GHO_GSM_LAST_RESORT_LIQUIDATOR));
343361
GHO_GSM.grantRole(GSM_SWAP_FREEZER_ROLE, address(GHO_GSM_SWAP_FREEZER));
@@ -435,7 +453,16 @@ contract TestGhoBase is Test, Constants, Events {
435453
address(USDC_TOKEN)
436454
);
437455

438-
USTB_SUBCRIPTION = new MockUSTBSubscription(address(USDC_TOKEN), address(USDC_TOKEN));
456+
// USTB
457+
USTB_SUBCRIPTION = new MockUSTBSubscription(address(USTB_TOKEN), address(USDC_TOKEN), 1e8);
458+
USTB_GSM_CONVERTER = new USTBGsmConverter(
459+
address(this),
460+
address(GHO_USTB_GSM),
461+
address(BUIDL_USDC_REDEMPTION),
462+
address(USTB_SUBCRIPTION),
463+
address(USTB_TOKEN),
464+
address(USDC_TOKEN)
465+
);
439466
}
440467

441468
function ghoFaucet(address to, uint256 amount) public {

src/test/TestUSTBGsmConverterEdge.t.sol

Lines changed: 27 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import './TestGhoBase.t.sol';
55

66
contract TestGsmConverterEdge is TestGhoBase {
77
function setUp() public {
8-
setUSTBPrice(1_100_000_000);
8+
USTB_SUBCRIPTION.setUSTBPrice(9.5e8);
99
}
1010

1111
/// @dev test buyAsset with zero fee to simulate errors seen by TokenLogic
@@ -17,7 +17,7 @@ contract TestGsmConverterEdge is TestGhoBase {
1717
// Left: 99_999_999_000_000_000_000
1818
// Right: 100_000_000_000_000_000_000
1919
function testSellAssetZeroFee_roundingError() public {
20-
GHO_BUIDL_GSM.updateFeeStrategy(address(0));
20+
GHO_USTB_GSM.updateFeeStrategy(address(0));
2121

2222
// Alice sells USDC for GHO
2323
// - GSM converter swaps USDC for BUIDL
@@ -28,34 +28,35 @@ contract TestGsmConverterEdge is TestGhoBase {
2828

2929
console2.log('GHO_TOKEN.balanceOf(ALICE) %e', GHO_TOKEN.balanceOf(ALICE));
3030

31-
// vm.startPrank(FAUCET);
32-
// // Supply BUIDL to issuance contract
33-
// BUIDL_TOKEN.mint(address(BUIDL_USDC_ISSUANCE), DEFAULT_GSM_USDC_AMOUNT);
34-
// vm.stopPrank();
31+
vm.startPrank(FAUCET);
32+
// Supply USTB to issuance contract
33+
USTB_TOKEN.mint(address(USTB_SUBCRIPTION), DEFAULT_GSM_USDC_AMOUNT * 100);
34+
vm.stopPrank();
3535

36-
// vm.startPrank(ALICE);
37-
// USDC_TOKEN.approve(address(GSM_CONVERTER), DEFAULT_GSM_USDC_AMOUNT);
36+
vm.startPrank(ALICE);
37+
USTB_TOKEN.approve(address(USTB_GSM_CONVERTER), DEFAULT_GSM_USDC_AMOUNT * 100);
38+
USDC_TOKEN.approve(address(USTB_GSM_CONVERTER), DEFAULT_GSM_USDC_AMOUNT);
3839

39-
// console2.log(
40-
// 'BUIDL_TOKEN.balanceOf(address(GHO_BUIDL_GSM)) %e',
41-
// BUIDL_TOKEN.balanceOf(address(GHO_BUIDL_GSM))
42-
// );
40+
console2.log(
41+
'USTB_TOKEN.balanceOf(address(GHO_USTB_GSM)) %e',
42+
USTB_TOKEN.balanceOf(address(GHO_USTB_GSM))
43+
);
4344

44-
// (uint256 assetAmount, uint256 ghoBought) = GSM_CONVERTER.sellAsset(
45-
// DEFAULT_GSM_USDC_AMOUNT,
46-
// ALICE
47-
// );
48-
// vm.stopPrank();
45+
(uint256 assetAmount, uint256 ghoBought) = USTB_GSM_CONVERTER.sellAsset(
46+
DEFAULT_GSM_USDC_AMOUNT,
47+
ALICE
48+
);
49+
vm.stopPrank();
4950

50-
// console2.log('------after sellAsset------');
51-
// console2.log('calculated assetAmount %e', assetAmount);
52-
// console2.log('calculated ghoBought %e', ghoBought);
53-
// console2.log('GHO_TOKEN.balanceOf(ALICE) %e', GHO_TOKEN.balanceOf(ALICE));
54-
// console2.log('DEFAULT_GSM_GHO_AMOUNT %e', DEFAULT_GSM_GHO_AMOUNT);
55-
// console2.log(
56-
// 'BUIDL_TOKEN.balanceOf(address(GHO_BUIDL_GSM)) %e',
57-
// BUIDL_TOKEN.balanceOf(address(GHO_BUIDL_GSM))
58-
// );
51+
console2.log('------after sellAsset------');
52+
console2.log('calculated assetAmount %e', assetAmount);
53+
console2.log('calculated ghoBought %e', ghoBought);
54+
console2.log('GHO_TOKEN.balanceOf(ALICE) %e', GHO_TOKEN.balanceOf(ALICE));
55+
console2.log('DEFAULT_GSM_GHO_AMOUNT %e', DEFAULT_GSM_GHO_AMOUNT);
56+
console2.log(
57+
'USTB_TOKEN.balanceOf(address(GHO_USTB_GSM)) %e',
58+
USTB_TOKEN.balanceOf(address(GHO_USTB_GSM))
59+
);
5960

6061
// assertEq(GHO_TOKEN.balanceOf(ALICE), DEFAULT_GSM_GHO_AMOUNT, 'Unexpected final GHO balance');
6162
}

src/test/mocks/MockUSTBSubscription.sol

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -68,12 +68,10 @@ contract MockUSTBSubscription {
6868
uint256 feeOnStablecoinInAmount
6969
)
7070
{
71-
StablecoinConfig memory config = supportedStablecoins[stablecoin];
72-
7371
feeOnStablecoinInAmount = 0;
7472
stablecoinInAmountAfterFee = inAmount - feeOnStablecoinInAmount;
7573

76-
usdPerSuperstateTokenChainlinkRaw = USTBPrice; // 9.5 USDC/SUPERSTATE_TOKEN
74+
uint256 usdPerSuperstateTokenChainlinkRaw = USTBPrice; // 9.5 USDC/SUPERSTATE_TOKEN
7775

7876
uint256 stablecoinPrecision = 10 ** 6;
7977
uint256 chainlinkFeedPrecision = 10 ** 8;

0 commit comments

Comments
 (0)