@@ -20,7 +20,11 @@ import "openzeppelin/proxy/transparent/TransparentUpgradeableProxy.sol";
20
20
import {TokenizedSubAccount} from "../src/tokenizedSubaccounts/TSA.sol " ;
21
21
import "openzeppelin/proxy/transparent/ProxyAdmin.sol " ;
22
22
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 " ;
24
28
25
29
26
30
contract LyraForkUpgradeTest is Test {
@@ -58,7 +62,6 @@ contract LyraForkUpgradeTest is Test {
58
62
vm.startPrank (deployer);
59
63
string memory tsaName = "sUSDeBULL " ;
60
64
61
- StandardManager srm = StandardManager (_getContract ("core " , "srm " ));
62
65
ProxyAdmin proxyAdmin = ProxyAdmin (_getContract (tsaName, "proxyAdmin " ));
63
66
64
67
PrincipalProtectedTSA implementation = PrincipalProtectedTSA (_getContract (tsaName, "implementation " ));
@@ -106,12 +109,165 @@ contract LyraForkUpgradeTest is Test {
106
109
);
107
110
pptsa.setPPTSAParams (defaultLrtppTSAParams);
108
111
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
+ });
109
254
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, "" );
110
266
}
111
267
112
268
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 ));
115
271
}
116
272
117
273
///@dev read deployment file from deployments/
0 commit comments