Skip to content

Commit ed4e7d8

Browse files
committed
Modify fork tests for PPTSA to verify all actions
1 parent acf0524 commit ed4e7d8

File tree

3 files changed

+202
-41
lines changed

3 files changed

+202
-41
lines changed

deployments/957/shared.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,6 @@
99
"weeth": "0x7B35b4c05a90Ea5f311AeC815BE4148b446a68a2",
1010
"rsweth": "0xC419959850d49166C2d5250Ee89ff9910679D8c8",
1111
"rseth": "0xc47e2E800a9184cFbD274AC1eeCcCDF942715dB7",
12-
"susde": "0xb82D12742c3728a14EaA43EBe1C0d32bB62216EB",
12+
"susde": "0xb82d12742c3728a14eaa43ebe1c0d32bb62216eb",
1313
"feedSigners": ["0x555eB362b5057e36f88cCb42b44D6dA5Fe7A0656", "0x47ebFBAda4d85Dac6b9018C0CE75774556A8243f"]
1414
}

test/LyraFork.t.sol

Lines changed: 41 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -3,59 +3,64 @@ pragma solidity 0.8.20;
33
import "forge-std/Test.sol";
44
import "forge-std/console.sol";
55
import "v2-core/scripts/types.sol";
6+
import "forge-std/console2.sol";
67

78
import "v2-core/src/risk-managers/StandardManager.sol";
89
import "v2-core/src/risk-managers/SRMPortfolioViewer.sol";
910
import "v2-core/src/risk-managers/PMRM.sol";
1011
import "openzeppelin/access/Ownable2Step.sol";
1112

13+
contract LyraForkTest is Test {
1214

15+
function setUp() external {}
1316

14-
contract LyraForkTest is Test {
15-
function setUp() external {}
17+
function testFork() external skipped {
18+
vm.deal(address(0xB176A44D819372A38cee878fB0603AEd4d26C5a5), 1 ether);
19+
vm.startPrank(0xB176A44D819372A38cee878fB0603AEd4d26C5a5);
1620

17-
function testFork() external {
18-
vm.deal(address(0xB176A44D819372A38cee878fB0603AEd4d26C5a5), 1 ether);
19-
vm.startPrank(0xB176A44D819372A38cee878fB0603AEd4d26C5a5);
21+
StandardManager srm = StandardManager(_getContract("core", "srm"));
2022

21-
StandardManager srm = StandardManager(_getContract("core", "srm"));
23+
uint marketId = srm.createMarket("sUSDe");
24+
console.log("marketId:", marketId);
2225

23-
uint marketId = srm.createMarket("sUSDe");
24-
console.log("marketId:", marketId);
26+
srm.whitelistAsset(IAsset(_getContract("sUSDe", "base")), marketId, IStandardManager.AssetType.Base);
27+
srm.setOraclesForMarket(marketId, ISpotFeed(_getContract("sUSDe", "spotFeed")), IForwardFeed(address(0)), IVolFeed(address(0)));
2528

26-
srm.whitelistAsset(IAsset(_getContract("sUSDe", "base")), marketId, IStandardManager.AssetType.Base);
27-
srm.setOraclesForMarket(marketId, ISpotFeed(_getContract("sUSDe", "spotFeed")), IForwardFeed(address(0)), IVolFeed(address(0)));
29+
srm.setOracleContingencyParams(marketId, IStandardManager.OracleContingencyParams({
30+
perpThreshold: 0.55e18,
31+
optionThreshold: 0.55e18,
32+
baseThreshold: 0.55e18,
33+
OCFactor: 1e18
34+
}));
2835

29-
srm.setOracleContingencyParams(marketId, IStandardManager.OracleContingencyParams({
30-
perpThreshold: 0.55e18,
31-
optionThreshold: 0.55e18,
32-
baseThreshold: 0.55e18,
33-
OCFactor: 1e18
34-
}));
36+
srm.setBaseAssetMarginFactor(marketId, 0.8e18, 0.6e18);
3537

36-
srm.setBaseAssetMarginFactor(marketId, 0.8e18, 0.6e18);
38+
SRMPortfolioViewer srmViewer = SRMPortfolioViewer(_getContract("core", "srmViewer"));
39+
srmViewer.setOIFeeRateBPS(_getContract("sUSDe", "base"), 0.5e18);
3740

38-
SRMPortfolioViewer srmViewer = SRMPortfolioViewer(_getContract("core", "srmViewer"));
39-
srmViewer.setOIFeeRateBPS(_getContract("sUSDe", "base"), 0.5e18);
41+
srm.setWhitelistedCallee(_getContract("sUSDe", "spotFeed"), true);
42+
PMRM(_getContract("ETH", "pmrm")).setWhitelistedCallee(_getContract("sUSDe", "spotFeed"), true);
43+
PMRM(_getContract("BTC", "pmrm")).setWhitelistedCallee(_getContract("sUSDe", "spotFeed"), true);
4044

41-
srm.setWhitelistedCallee(_getContract("sUSDe", "spotFeed"), true);
42-
PMRM(_getContract("ETH", "pmrm")).setWhitelistedCallee(_getContract("sUSDe", "spotFeed"), true);
43-
PMRM(_getContract("BTC", "pmrm")).setWhitelistedCallee(_getContract("sUSDe", "spotFeed"), true);
45+
Ownable2Step(_getContract("sUSDe", "base")).acceptOwnership();
46+
Ownable2Step(_getContract("sUSDe", "spotFeed")).acceptOwnership();
47+
}
4448

45-
Ownable2Step(_getContract("sUSDe", "base")).acceptOwnership();
46-
Ownable2Step(_getContract("sUSDe", "spotFeed")).acceptOwnership();
47-
}
49+
function _getContract(string memory file, string memory name) internal view returns (address) {
50+
file = _readDeploymentFile(file);
51+
return abi.decode(vm.parseJson(file, string.concat(".", name)), (address));
52+
}
4853

49-
function _getContract(string memory file, string memory name) internal view returns (address) {
50-
string memory file = _readDeploymentFile(file);
51-
return abi.decode(vm.parseJson(file, string.concat(".", name)), (address));
52-
}
54+
///@dev read deployment file from deployments/
55+
function _readDeploymentFile(string memory fileName) internal view returns (string memory) {
56+
string memory deploymentDir = string.concat(vm.projectRoot(), "/deployments/");
57+
string memory chainDir = string.concat(vm.toString(block.chainid), "/");
58+
string memory file = string.concat(fileName, ".json");
59+
return vm.readFile(string.concat(deploymentDir, chainDir, file));
60+
}
5361

54-
///@dev read deployment file from deployments/
55-
function _readDeploymentFile(string memory fileName) internal view returns (string memory) {
56-
string memory deploymentDir = string.concat(vm.projectRoot(), "/deployments/");
57-
string memory chainDir = string.concat(vm.toString(block.chainid), "/");
58-
string memory file = string.concat(fileName, ".json");
59-
return vm.readFile(string.concat(deploymentDir, chainDir, file));
60-
}
62+
modifier skipped() {
63+
vm.skip(true);
64+
_;
65+
}
6166
}

test/LyraForkUpgrade.t.sol

Lines changed: 160 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,11 @@ import "openzeppelin/proxy/transparent/TransparentUpgradeableProxy.sol";
2020
import {TokenizedSubAccount} from "../src/tokenizedSubaccounts/TSA.sol";
2121
import "openzeppelin/proxy/transparent/ProxyAdmin.sol";
2222
import {TSAShareHandler} from "../src/tokenizedSubaccounts/TSAShareHandler.sol";
23-
23+
import "v2-core/src/l2/LyraERC20.sol";
24+
import "../src/Matching.sol";
25+
import "v2-core/src/assets/WLWrappedERC20Asset.sol";
26+
import "../src/modules/RfqModule.sol";
27+
import "v2-core/src/SubAccounts.sol";
2428

2529

2630
contract LyraForkUpgradeTest is Test {
@@ -58,7 +62,6 @@ contract LyraForkUpgradeTest is Test {
5862
vm.startPrank(deployer);
5963
string memory tsaName = "sUSDeBULL";
6064

61-
StandardManager srm = StandardManager(_getContract("core", "srm"));
6265
ProxyAdmin proxyAdmin = ProxyAdmin(_getContract(tsaName, "proxyAdmin"));
6366

6467
PrincipalProtectedTSA implementation = PrincipalProtectedTSA(_getContract(tsaName, "implementation"));
@@ -106,12 +109,165 @@ contract LyraForkUpgradeTest is Test {
106109
);
107110
pptsa.setPPTSAParams(defaultLrtppTSAParams);
108111
pptsa.setCollateralManagementParams(defaultCollateralManagementParams);
112+
pptsa.setShareKeeper(deployer, true);
113+
pptsa.setSigner(deployer, true);
114+
vm.stopPrank();
115+
_verifyAndMatchDeposit(pptsa);
116+
_verifyTakerTrade(pptsa);
117+
_verifyMakerTrade(pptsa);
118+
_verifyWithdraw(pptsa);
119+
}
120+
121+
function _verifyAndMatchDeposit(PrincipalProtectedTSA pptsa) internal {
122+
address susde = _getContract("shared", "susde");
123+
address deployer = 0xB176A44D819372A38cee878fB0603AEd4d26C5a5;
124+
Matching matching = Matching(_getContract("matching", "matching"));
125+
LyraERC20 susdeCoin = LyraERC20(susde);
126+
address proxyAddress = _getContract("sUSDeBULL", "proxy");
127+
128+
vm.prank(proxyAddress);
129+
susdeCoin.approve(deployer, 11e18);
130+
vm.startPrank(deployer);
131+
susdeCoin.transferFrom(proxyAddress, deployer, 10e18);
132+
133+
WLWrappedERC20Asset wrappedDepositAsset = WLWrappedERC20Asset(_getContract("sUSDe", "base"));
134+
wrappedDepositAsset.wrappedAsset().approve(address(pptsa), 11e18);
135+
wrappedDepositAsset.setWhitelistEnabled(false);
136+
uint depositId = pptsa.initiateDeposit(1e18, deployer);
137+
pptsa.processDeposit(depositId);
138+
139+
bytes memory depositData =
140+
abi.encode(IDepositModule.DepositData({
141+
amount: 10e18,
142+
asset: _getContract("sUSDe", "base"),
143+
managerForNewAccount: address(0)}));
144+
145+
IActionVerifier.Action memory action = IActionVerifier.Action({
146+
subaccountId: pptsa.subAccount(),
147+
nonce: 1,
148+
module: IDepositModule(_getContract("matching", "deposit")),
149+
data: depositData,
150+
expiry: block.timestamp + 8 minutes,
151+
owner: address(pptsa),
152+
signer: address(pptsa)
153+
});
154+
155+
pptsa.signActionData(action, "");
156+
bytes memory encodedAction = abi.encode(action);
157+
IActionVerifier.Action[] memory actions = new IActionVerifier.Action[](1);
158+
bytes[] memory signatures = new bytes[](1);
159+
actions[0] = action;
160+
161+
matching.setTradeExecutor(deployer, true);
162+
vm.stopPrank();
163+
vm.prank(deployer);
164+
matching.verifyAndMatch(actions, signatures, encodedAction);
165+
}
166+
167+
function _verifyTakerTrade(PrincipalProtectedTSA pptsa) internal {
168+
address deployer = 0xB176A44D819372A38cee878fB0603AEd4d26C5a5;
169+
OptionAsset optionAsset = OptionAsset(_getContract("ETH", "option"));
170+
RfqModule rfqModule = RfqModule(_getContract("matching", "rfq"));
171+
172+
uint higherPrice = 3.6e18;
173+
uint highStrike = 2900e18;
174+
uint lowerPrice = 30e18;
175+
uint lowStrike = 2700e18;
176+
177+
IRfqModule.TradeData[] memory trades = new IRfqModule.TradeData[](2);
178+
trades[0] = IRfqModule.TradeData({
179+
asset: address(optionAsset),
180+
subId: OptionEncoding.toSubId(uint64(1723708800), highStrike, true), // TODO: Fix to next friday 8 AM UTC
181+
price: higherPrice,
182+
amount: .0001e18
183+
});
184+
185+
trades[1] = IRfqModule.TradeData({
186+
asset: address(optionAsset),
187+
subId: OptionEncoding.toSubId(uint64(1723708800), lowStrike, true),
188+
price: lowerPrice,
189+
amount: -.0001e18
190+
});
191+
192+
IRfqModule.TakerOrder memory takerOrder = IRfqModule.TakerOrder({orderHash: keccak256(abi.encode(trades)), maxFee: 0});
193+
194+
// taker order
195+
IActionVerifier.Action memory action = IActionVerifier.Action({
196+
subaccountId: pptsa.subAccount(),
197+
nonce: 2,
198+
module: rfqModule,
199+
data: abi.encode(takerOrder),
200+
expiry: block.timestamp + 8 minutes,
201+
owner: address(pptsa),
202+
signer: address(pptsa)
203+
});
204+
vm.prank(deployer);
205+
pptsa.signActionData(action, abi.encode(trades));
206+
}
207+
208+
function _verifyMakerTrade(PrincipalProtectedTSA pptsa) internal {
209+
address deployer = 0xB176A44D819372A38cee878fB0603AEd4d26C5a5;
210+
OptionAsset optionAsset = OptionAsset(_getContract("ETH", "option"));
211+
RfqModule rfqModule = RfqModule(_getContract("matching", "rfq"));
212+
213+
uint higherPrice = 3.6e18;
214+
uint highStrike = 2900e18;
215+
uint lowerPrice = 30e18;
216+
uint lowStrike = 2700e18;
217+
218+
IRfqModule.TradeData[] memory trades = new IRfqModule.TradeData[](2);
219+
trades[0] = IRfqModule.TradeData({
220+
asset: address(optionAsset),
221+
subId: OptionEncoding.toSubId(uint64(1723708800), highStrike, true), // TODO: Fix to next friday 8 AM UTC
222+
price: higherPrice,
223+
amount: -.0001e18
224+
});
225+
226+
trades[1] = IRfqModule.TradeData({
227+
asset: address(optionAsset),
228+
subId: OptionEncoding.toSubId(uint64(1723708800), lowStrike, true),
229+
price: lowerPrice,
230+
amount: .0001e18
231+
});
232+
233+
IRfqModule.RfqOrder memory makerOrder = IRfqModule.RfqOrder({maxFee: 0, trades: trades});
234+
235+
IActionVerifier.Action memory action = IActionVerifier.Action({
236+
subaccountId: pptsa.subAccount(),
237+
nonce: 3,
238+
module: IMatchingModule(address(rfqModule)),
239+
data: abi.encode(makerOrder),
240+
expiry: block.timestamp + 8 minutes,
241+
owner: address(pptsa),
242+
signer: address(pptsa)
243+
});
244+
vm.prank(deployer);
245+
pptsa.signActionData(action, "");
246+
}
247+
248+
function _verifyWithdraw(PrincipalProtectedTSA pptsa) internal {
249+
address deployer = 0xB176A44D819372A38cee878fB0603AEd4d26C5a5;
250+
IWithdrawalModule.WithdrawalData memory data = IWithdrawalModule.WithdrawalData({
251+
asset: _getContract("sUSDe", "base"),
252+
assetAmount: 10e18
253+
});
109254

255+
IActionVerifier.Action memory action = IActionVerifier.Action({
256+
subaccountId: pptsa.subAccount(),
257+
nonce: 5,
258+
module: IWithdrawalModule(_getContract("matching", "withdrawal")),
259+
data: abi.encode(data),
260+
expiry: block.timestamp + 8 minutes,
261+
owner: address(pptsa),
262+
signer: address(pptsa)
263+
});
264+
vm.prank(deployer);
265+
pptsa.signActionData(action, "");
110266
}
111267

112268
function _getContract(string memory file, string memory name) internal view returns (address) {
113-
string memory file = _readDeploymentFile(file);
114-
return abi.decode(vm.parseJson(file, string.concat(".", name)), (address));
269+
string memory deploymentFile = _readDeploymentFile(file);
270+
return abi.decode(vm.parseJson(deploymentFile, string.concat(".", name)), (address));
115271
}
116272

117273
///@dev read deployment file from deployments/

0 commit comments

Comments
 (0)