Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion src/contracts/facilitators/gsm/Gsm.sol
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,11 @@ contract Gsm is AccessControl, VersionedInitializable, EIP712, IGsm {
* @param underlyingAsset The address of the collateral asset
* @param priceStrategy The address of the price strategy
*/
constructor(address ghoToken, address underlyingAsset, address priceStrategy) EIP712('GSM', '1') {
constructor(
address ghoToken,
address underlyingAsset,
address priceStrategy
) EIP712('GSM', '1') initializer {
require(ghoToken != address(0), 'ZERO_ADDRESS_NOT_VALID');
require(underlyingAsset != address(0), 'ZERO_ADDRESS_NOT_VALID');
require(
Expand Down
6 changes: 6 additions & 0 deletions tests/unit/TestGhoBase.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -279,6 +279,12 @@ contract TestGhoBase is Test, Constants, Events {
address(USDX_4626_TOKEN),
address(GHO_GSM_4626_FIXED_PRICE_STRATEGY)
);
AdminUpgradeabilityProxy gsm4626Proxy = new AdminUpgradeabilityProxy(
address(GHO_GSM_4626),
SHORT_EXECUTOR,
''
);
GHO_GSM_4626 = Gsm4626(address(gsm4626Proxy));
GHO_GSM_4626.initialize(
address(this),
TREASURY,
Expand Down
7 changes: 7 additions & 0 deletions tests/unit/TestGsm.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ contract TestGsm is TestGhoBase {
address(USDX_TOKEN),
address(GHO_GSM_FIXED_PRICE_STRATEGY)
);
gsm = Gsm(address(new AdminUpgradeabilityProxy(address(gsm), SHORT_EXECUTOR, '')));
vm.expectEmit(true, true, true, true, address(gsm));
emit RoleGranted(DEFAULT_ADMIN_ROLE, address(this), address(this));
vm.expectEmit(true, true, false, true, address(gsm));
Expand All @@ -66,6 +67,7 @@ contract TestGsm is TestGhoBase {
address(USDX_TOKEN),
address(GHO_GSM_FIXED_PRICE_STRATEGY)
);
gsm = Gsm(address(new AdminUpgradeabilityProxy(address(gsm), SHORT_EXECUTOR, '')));
vm.expectRevert('ZERO_ADDRESS_NOT_VALID');
gsm.initialize(address(0), TREASURY, DEFAULT_GSM_USDX_EXPOSURE, address(GHO_RESERVE));
}
Expand All @@ -76,6 +78,7 @@ contract TestGsm is TestGhoBase {
address(USDX_TOKEN),
address(GHO_GSM_FIXED_PRICE_STRATEGY)
);
gsm = Gsm(address(new AdminUpgradeabilityProxy(address(gsm), SHORT_EXECUTOR, '')));
vm.expectRevert('ZERO_ADDRESS_NOT_VALID');
gsm.initialize(address(this), TREASURY, DEFAULT_GSM_USDX_EXPOSURE, address(0));
}
Expand All @@ -86,6 +89,7 @@ contract TestGsm is TestGhoBase {
address(USDX_TOKEN),
address(GHO_GSM_FIXED_PRICE_STRATEGY)
);
gsm = Gsm(address(new AdminUpgradeabilityProxy(address(gsm), SHORT_EXECUTOR, '')));
gsm.initialize(address(this), TREASURY, DEFAULT_GSM_USDX_EXPOSURE, address(GHO_RESERVE));
vm.expectRevert('Contract instance has already been initialized');
gsm.initialize(address(this), TREASURY, DEFAULT_GSM_USDX_EXPOSURE, address(GHO_RESERVE));
Expand Down Expand Up @@ -368,6 +372,7 @@ contract TestGsm is TestGhoBase {
address(USDX_TOKEN),
address(GHO_GSM_FIXED_PRICE_STRATEGY)
);
gsm = Gsm(address(new AdminUpgradeabilityProxy(address(gsm), SHORT_EXECUTOR, '')));
gsm.initialize(address(this), TREASURY, DEFAULT_GSM_USDX_EXPOSURE, address(GHO_RESERVE));
GHO_RESERVE.addEntity(address(gsm));
uint256 defaultCapInUsdx = DEFAULT_CAPACITY / (10 ** (18 - USDX_TOKEN.decimals()));
Expand All @@ -388,6 +393,7 @@ contract TestGsm is TestGhoBase {
address(USDX_TOKEN),
address(GHO_GSM_FIXED_PRICE_STRATEGY)
);
gsm = Gsm(address(new AdminUpgradeabilityProxy(address(gsm), SHORT_EXECUTOR, '')));
gsm.initialize(address(this), TREASURY, DEFAULT_GSM_USDX_EXPOSURE - 1, address(GHO_RESERVE));
GHO_TOKEN.addFacilitator(address(gsm), 'GSM Modified Exposure Cap', DEFAULT_CAPACITY);

Expand Down Expand Up @@ -1073,6 +1079,7 @@ contract TestGsm is TestGhoBase {
address(USDX_TOKEN),
address(GHO_GSM_FIXED_PRICE_STRATEGY)
);
gsm = Gsm(address(new AdminUpgradeabilityProxy(address(gsm), SHORT_EXECUTOR, '')));
vm.expectRevert(bytes('ZERO_ADDRESS_NOT_VALID'));
gsm.initialize(address(this), address(0), DEFAULT_GSM_USDX_EXPOSURE, address(GHO_RESERVE));
}
Expand Down
3 changes: 3 additions & 0 deletions tests/unit/TestGsm4626.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ contract TestGsm4626 is TestGhoBase {
address(USDX_4626_TOKEN),
address(GHO_GSM_4626_FIXED_PRICE_STRATEGY)
);
gsm = Gsm4626(address(new AdminUpgradeabilityProxy(address(gsm), SHORT_EXECUTOR, '')));
vm.expectEmit(true, true, true, true, address(gsm));
emit RoleGranted(DEFAULT_ADMIN_ROLE, address(this), address(this));
vm.expectEmit(true, true, false, true, address(gsm));
Expand All @@ -60,6 +61,7 @@ contract TestGsm4626 is TestGhoBase {
address(USDX_4626_TOKEN),
address(GHO_GSM_4626_FIXED_PRICE_STRATEGY)
);
gsm = Gsm4626(address(new AdminUpgradeabilityProxy(address(gsm), SHORT_EXECUTOR, '')));
gsm.initialize(address(this), TREASURY, DEFAULT_GSM_USDX_EXPOSURE, address(GHO_RESERVE));
vm.expectRevert('Contract instance has already been initialized');
gsm.initialize(address(this), TREASURY, DEFAULT_GSM_USDX_EXPOSURE, address(GHO_RESERVE));
Expand Down Expand Up @@ -167,6 +169,7 @@ contract TestGsm4626 is TestGhoBase {
address(USDX_4626_TOKEN),
address(GHO_GSM_4626_FIXED_PRICE_STRATEGY)
);
gsm = Gsm4626(address(new AdminUpgradeabilityProxy(address(gsm), SHORT_EXECUTOR, '')));
gsm.initialize(address(this), TREASURY, DEFAULT_GSM_USDX_EXPOSURE - 1, address(GHO_RESERVE));
GHO_TOKEN.addFacilitator(address(gsm), 'GSM Modified Exposure Cap', DEFAULT_CAPACITY);

Expand Down
2 changes: 2 additions & 0 deletions tests/unit/TestGsm4626Edge.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -196,6 +196,7 @@ contract TestGsm4626Edge is TestGhoBase {
address(USDX_4626_TOKEN),
address(GHO_GSM_4626_FIXED_PRICE_STRATEGY)
);
gsm = Gsm4626(address(new AdminUpgradeabilityProxy(address(gsm), SHORT_EXECUTOR, '')));
gsm.initialize(address(this), TREASURY, DEFAULT_GSM_USDX_EXPOSURE - 1, address(GHO_RESERVE));
GHO_RESERVE.addEntity(address(gsm));
GHO_RESERVE.setLimit(address(gsm), DEFAULT_CAPACITY);
Expand Down Expand Up @@ -224,6 +225,7 @@ contract TestGsm4626Edge is TestGhoBase {
address(USDX_4626_TOKEN),
address(GHO_GSM_4626_FIXED_PRICE_STRATEGY)
);
gsm = Gsm4626(address(new AdminUpgradeabilityProxy(address(gsm), SHORT_EXECUTOR, '')));
gsm.initialize(address(this), TREASURY, DEFAULT_GSM_USDX_EXPOSURE - 1, address(GHO_RESERVE));
GHO_RESERVE.addEntity(address(gsm));
GHO_RESERVE.setLimit(address(gsm), DEFAULT_CAPACITY);
Expand Down
1 change: 1 addition & 0 deletions tests/unit/TestGsmFullFlow.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ contract TestGsmFullFlow is TestGhoBase {
address(USDX_TOKEN),
address(GHO_GSM_FIXED_PRICE_STRATEGY)
);
gsm = Gsm(address(new AdminUpgradeabilityProxy(address(gsm), SHORT_EXECUTOR, '')));
gsm.initialize(address(this), TREASURY, DEFAULT_GSM_USDX_EXPOSURE, address(reserve));

reserve.addEntity(address(gsm));
Expand Down
9 changes: 9 additions & 0 deletions tests/unit/TestGsmSwapEdge.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ contract TestGsmSwapEdge is TestGhoBase {
5
);
Gsm gsm = new Gsm(address(GHO_TOKEN), address(newToken), address(newPriceStrategy));
gsm = Gsm(address(new AdminUpgradeabilityProxy(address(gsm), SHORT_EXECUTOR, '')));
gsm.initialize(address(this), TREASURY, type(uint128).max, address(GHO_RESERVE));
GHO_RESERVE.addEntity(address(gsm));
GHO_RESERVE.setLimit(address(gsm), type(uint128).max);
Expand Down Expand Up @@ -77,6 +78,7 @@ contract TestGsmSwapEdge is TestGhoBase {
18
);
Gsm gsm = new Gsm(address(GHO_TOKEN), address(newToken), address(newPriceStrategy));
gsm = Gsm(address(new AdminUpgradeabilityProxy(address(gsm), SHORT_EXECUTOR, '')));
gsm.initialize(address(this), TREASURY, 100_000_000e18, address(GHO_RESERVE));
gsm.updateFeeStrategy(address(newFeeStrategy));
GHO_RESERVE.addEntity(address(gsm));
Expand Down Expand Up @@ -112,6 +114,7 @@ contract TestGsmSwapEdge is TestGhoBase {
18
);
Gsm gsm = new Gsm(address(GHO_TOKEN), address(newToken), address(newPriceStrategy));
gsm = Gsm(address(new AdminUpgradeabilityProxy(address(gsm), SHORT_EXECUTOR, '')));
gsm.initialize(address(this), TREASURY, 100_000_000e18, address(GHO_RESERVE));
gsm.updateFeeStrategy(address(newFeeStrategy));
GHO_RESERVE.addEntity(address(gsm));
Expand Down Expand Up @@ -157,6 +160,7 @@ contract TestGsmSwapEdge is TestGhoBase {
24 // decimals
);
Gsm gsm = new Gsm(address(GHO_TOKEN), address(newToken), address(newPriceStrategy));
gsm = Gsm(address(new AdminUpgradeabilityProxy(address(gsm), SHORT_EXECUTOR, '')));
gsm.initialize(ALICE, TREASURY, 1_000_000e24, address(GHO_RESERVE));
GHO_RESERVE.addEntity(address(gsm));
GHO_RESERVE.setLimit(address(gsm), 100_000_000 ether);
Expand Down Expand Up @@ -207,6 +211,7 @@ contract TestGsmSwapEdge is TestGhoBase {
24 // decimals
);
Gsm gsm = new Gsm(address(GHO_TOKEN), address(newToken), address(newPriceStrategy));
gsm = Gsm(address(new AdminUpgradeabilityProxy(address(gsm), SHORT_EXECUTOR, '')));
gsm.initialize(ALICE, TREASURY, 1_000_000e24, address(GHO_RESERVE));
GHO_RESERVE.addEntity(address(gsm));
GHO_RESERVE.setLimit(address(gsm), 100_000_000 ether);
Expand Down Expand Up @@ -252,6 +257,7 @@ contract TestGsmSwapEdge is TestGhoBase {
6 // decimals
);
Gsm gsm = new Gsm(address(GHO_TOKEN), address(newToken), address(newPriceStrategy));
gsm = Gsm(address(new AdminUpgradeabilityProxy(address(gsm), SHORT_EXECUTOR, '')));
gsm.initialize(ALICE, TREASURY, 1_000_000e6, address(GHO_RESERVE));
GHO_RESERVE.addEntity(address(gsm));
GHO_RESERVE.setLimit(address(gsm), 100_000_000 ether);
Expand Down Expand Up @@ -303,6 +309,7 @@ contract TestGsmSwapEdge is TestGhoBase {
24 // decimals
);
Gsm gsm = new Gsm(address(GHO_TOKEN), address(newToken), address(newPriceStrategy));
gsm = Gsm(address(new AdminUpgradeabilityProxy(address(gsm), SHORT_EXECUTOR, '')));
gsm.initialize(ALICE, TREASURY, 1_000_000e24, address(GHO_RESERVE));
GHO_RESERVE.addEntity(address(gsm));
GHO_RESERVE.setLimit(address(gsm), 100_000_000 ether);
Expand Down Expand Up @@ -354,6 +361,7 @@ contract TestGsmSwapEdge is TestGhoBase {
6 // decimals
);
Gsm gsm = new Gsm(address(GHO_TOKEN), address(newToken), address(newPriceStrategy));
gsm = Gsm(address(new AdminUpgradeabilityProxy(address(gsm), SHORT_EXECUTOR, '')));
gsm.initialize(ALICE, TREASURY, 1_000_000e6, address(GHO_RESERVE));
GHO_RESERVE.addEntity(address(gsm));
GHO_RESERVE.setLimit(address(gsm), 100_000_000 ether);
Expand Down Expand Up @@ -404,6 +412,7 @@ contract TestGsmSwapEdge is TestGhoBase {
24 // decimals
);
Gsm gsm = new Gsm(address(GHO_TOKEN), address(newToken), address(newPriceStrategy));
gsm = Gsm(address(new AdminUpgradeabilityProxy(address(gsm), SHORT_EXECUTOR, '')));
gsm.initialize(ALICE, TREASURY, 1_000_000e24, address(GHO_RESERVE));
GHO_RESERVE.addEntity(address(gsm));
GHO_RESERVE.setLimit(address(gsm), 100_000_000 ether);
Expand Down
12 changes: 12 additions & 0 deletions tests/unit/TestGsmSwapFuzz.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,7 @@ contract TestGsmSwapFuzz is TestGhoBase {
underlyingDecimals // decimals
);
Gsm gsm = new Gsm(address(GHO_TOKEN), address(newToken), address(newPriceStrategy));
gsm = Gsm(address(new AdminUpgradeabilityProxy(address(gsm), SHORT_EXECUTOR, '')));
gsm.initialize(address(this), TREASURY, type(uint128).max, address(GHO_RESERVE));
GHO_RESERVE.addEntity(address(gsm));
GHO_RESERVE.setLimit(address(gsm), type(uint128).max);
Expand Down Expand Up @@ -175,6 +176,7 @@ contract TestGsmSwapFuzz is TestGhoBase {
underlyingDecimals // decimals
);
Gsm gsm = new Gsm(address(GHO_TOKEN), address(newToken), address(newPriceStrategy));
gsm = Gsm(address(new AdminUpgradeabilityProxy(address(gsm), SHORT_EXECUTOR, '')));
gsm.initialize(address(this), TREASURY, type(uint128).max, address(GHO_RESERVE));

// Get gho amount for selling assets
Expand Down Expand Up @@ -212,6 +214,7 @@ contract TestGsmSwapFuzz is TestGhoBase {
underlyingDecimals // decimals
);
Gsm gsm = new Gsm(address(GHO_TOKEN), address(newToken), address(newPriceStrategy));
gsm = Gsm(address(new AdminUpgradeabilityProxy(address(gsm), SHORT_EXECUTOR, '')));
gsm.initialize(address(this), TREASURY, type(uint128).max, address(GHO_RESERVE));
GHO_TOKEN.addFacilitator(address(gsm), 'Test GSM', type(uint128).max);

Expand Down Expand Up @@ -253,6 +256,7 @@ contract TestGsmSwapFuzz is TestGhoBase {
underlyingDecimals // decimals
);
Gsm gsm = new Gsm(address(GHO_TOKEN), address(newToken), address(newPriceStrategy));
gsm = Gsm(address(new AdminUpgradeabilityProxy(address(gsm), SHORT_EXECUTOR, '')));
gsm.initialize(address(this), TREASURY, type(uint128).max, address(GHO_RESERVE));
GHO_RESERVE.addEntity(address(gsm));
GHO_RESERVE.setLimit(address(gsm), type(uint128).max);
Expand Down Expand Up @@ -305,6 +309,7 @@ contract TestGsmSwapFuzz is TestGhoBase {
underlyingDecimals // decimals
);
Gsm gsm = new Gsm(address(GHO_TOKEN), address(newToken), address(newPriceStrategy));
gsm = Gsm(address(new AdminUpgradeabilityProxy(address(gsm), SHORT_EXECUTOR, '')));
gsm.initialize(address(this), TREASURY, type(uint128).max, address(GHO_RESERVE));
GHO_RESERVE.addEntity(address(gsm));
GHO_RESERVE.setLimit(address(gsm), type(uint128).max);
Expand Down Expand Up @@ -350,6 +355,7 @@ contract TestGsmSwapFuzz is TestGhoBase {
underlyingDecimals // decimals
);
Gsm gsm = new Gsm(address(GHO_TOKEN), address(newToken), address(newPriceStrategy));
gsm = Gsm(address(new AdminUpgradeabilityProxy(address(gsm), SHORT_EXECUTOR, '')));
gsm.initialize(address(this), TREASURY, type(uint128).max, address(GHO_RESERVE));
GHO_RESERVE.addEntity(address(gsm));
GHO_RESERVE.setLimit(address(gsm), type(uint128).max);
Expand Down Expand Up @@ -395,6 +401,7 @@ contract TestGsmSwapFuzz is TestGhoBase {
underlyingDecimals // decimals
);
Gsm gsm = new Gsm(address(GHO_TOKEN), address(newToken), address(newPriceStrategy));
gsm = Gsm(address(new AdminUpgradeabilityProxy(address(gsm), SHORT_EXECUTOR, '')));
gsm.initialize(address(this), TREASURY, type(uint128).max, address(GHO_RESERVE));
GHO_RESERVE.addEntity(address(gsm));
GHO_RESERVE.setLimit(address(gsm), type(uint128).max);
Expand Down Expand Up @@ -441,6 +448,7 @@ contract TestGsmSwapFuzz is TestGhoBase {
underlyingDecimals // decimals
);
Gsm gsm = new Gsm(address(GHO_TOKEN), address(newToken), address(newPriceStrategy));
gsm = Gsm(address(new AdminUpgradeabilityProxy(address(gsm), SHORT_EXECUTOR, '')));
gsm.initialize(address(this), TREASURY, type(uint128).max, address(GHO_RESERVE));

if (buyFeeBps > 0 || sellFeeBps > 0) {
Expand Down Expand Up @@ -487,6 +495,7 @@ contract TestGsmSwapFuzz is TestGhoBase {
underlyingDecimals // decimals
);
Gsm gsm = new Gsm(address(GHO_TOKEN), address(newToken), address(newPriceStrategy));
gsm = Gsm(address(new AdminUpgradeabilityProxy(address(gsm), SHORT_EXECUTOR, '')));
gsm.initialize(address(this), TREASURY, uint128(assetAmount), address(GHO_RESERVE));

if (buyFeeBps > 0 || sellFeeBps > 0) {
Expand Down Expand Up @@ -558,6 +567,7 @@ contract TestGsmSwapFuzz is TestGhoBase {
underlyingDecimals // decimals
);
Gsm gsm = new Gsm(address(GHO_TOKEN), address(newToken), address(newPriceStrategy));
gsm = Gsm(address(new AdminUpgradeabilityProxy(address(gsm), SHORT_EXECUTOR, '')));
gsm.initialize(address(this), TREASURY, uint128(assetAmount), address(GHO_RESERVE));

if (buyFeeBps > 0 || sellFeeBps > 0) {
Expand Down Expand Up @@ -625,6 +635,7 @@ contract TestGsmSwapFuzz is TestGhoBase {
underlyingDecimals // decimals
);
Gsm gsm = new Gsm(address(GHO_TOKEN), address(newToken), address(newPriceStrategy));
gsm = Gsm(address(new AdminUpgradeabilityProxy(address(gsm), SHORT_EXECUTOR, '')));
gsm.initialize(address(this), TREASURY, uint128(assetAmount), address(GHO_RESERVE));
GHO_RESERVE.addEntity(address(gsm));
GHO_RESERVE.setLimit(address(gsm), type(uint128).max);
Expand Down Expand Up @@ -724,6 +735,7 @@ contract TestGsmSwapFuzz is TestGhoBase {
underlyingDecimals // decimals
);
Gsm gsm = new Gsm(address(GHO_TOKEN), address(newToken), address(newPriceStrategy));
gsm = Gsm(address(new AdminUpgradeabilityProxy(address(gsm), SHORT_EXECUTOR, '')));
gsm.initialize(address(this), TREASURY, type(uint128).max, address(GHO_RESERVE));
GHO_RESERVE.addEntity(address(gsm));
GHO_RESERVE.setLimit(address(gsm), type(uint128).max);
Expand Down
Loading