@@ -8,10 +8,11 @@ mod Deposit {
8
8
types :: {i129 :: i129, keys :: PoolKey }
9
9
};
10
10
11
- use openzeppelin_security :: ReentrancyGuardComponent ;
12
-
13
- use openzeppelin_token :: erc20 :: interface :: {ERC20ABIDispatcher , ERC20ABIDispatcherTrait };
14
- use openzeppelin_upgrades :: {UpgradeableComponent , interface :: IUpgradeable };
11
+ use openzeppelin :: {
12
+ security :: ReentrancyGuardComponent ,
13
+ token :: erc20 :: interface :: {ERC20ABIDispatcher , ERC20ABIDispatcherTrait },
14
+ upgrades :: {UpgradeableComponent , interface :: IUpgradeable }, access :: ownable :: OwnableComponent
15
+ };
15
16
use spotnet :: {
16
17
constants :: {ZK_SCALE_DECIMALS , STRK_ADDRESS },
17
18
interfaces :: {
@@ -33,18 +34,25 @@ mod Deposit {
33
34
path : ReentrancyGuardComponent , storage : reentrancy_guard , event : ReentrancyGuardEvent
34
35
);
35
36
component! (path : UpgradeableComponent , storage : upgradeable , event : UpgradeableEvent );
37
+ component! (path : OwnableComponent , storage : ownable , event : OwnableEvent );
38
+
39
+ impl OwnableInternalImpl = OwnableComponent :: InternalImpl <ContractState >;
40
+ #[abi(embed_v0)]
41
+ impl OwnableTwoStepMixinImpl =
42
+ OwnableComponent :: OwnableTwoStepMixinImpl <ContractState >;
36
43
37
44
impl ReentrancyInternalImpl = ReentrancyGuardComponent :: InternalImpl <ContractState >;
38
45
impl UpgradeableInternalImpl = UpgradeableComponent :: InternalImpl <ContractState >;
39
46
40
47
#[storage]
41
48
struct Storage {
42
- owner : ContractAddress ,
43
49
ekubo_core : ICoreDispatcher ,
44
50
zk_market : IMarketDispatcher ,
45
51
treasury : ContractAddress ,
46
52
is_position_open : bool ,
47
53
#[substorage(v0)]
54
+ ownable : OwnableComponent :: Storage ,
55
+ #[substorage(v0)]
48
56
reentrancy_guard : ReentrancyGuardComponent :: Storage ,
49
57
#[substorage(v0)]
50
58
upgradeable : UpgradeableComponent :: Storage
@@ -59,7 +67,7 @@ mod Deposit {
59
67
treasury : ContractAddress
60
68
) {
61
69
assert (owner . is_non_zero (), ' Owner address is zero' );
62
- self . owner . write (owner );
70
+ self . ownable . initializer (owner );
63
71
self . ekubo_core. write (ekubo_core );
64
72
self . zk_market. write (zk_market );
65
73
self . treasury. write (treasury );
@@ -93,7 +101,8 @@ mod Deposit {
93
101
supply_decimals : DecimalScale ,
94
102
debt_decimals : DecimalScale
95
103
) -> u256 {
96
- let deposited = ((total_deposited * ZK_SCALE_DECIMALS * supply_token_price . into ()) / supply_decimals . into ());
104
+ let deposited = ((total_deposited * ZK_SCALE_DECIMALS * supply_token_price . into ())
105
+ / supply_decimals . into ());
97
106
let free_amount = (((deposited * collateral_factor . into () / ZK_SCALE_DECIMALS )
98
107
* borrow_factor . into ()
99
108
/ ZK_SCALE_DECIMALS ))
@@ -121,11 +130,27 @@ mod Deposit {
121
130
repaid_amount : TokenAmount
122
131
}
123
132
133
+ #[derive(starknet:: Event , Drop )]
134
+ struct Withdraw {
135
+ token : ContractAddress ,
136
+ amount : TokenAmount
137
+ }
138
+
139
+ #[derive(starknet:: Event , Drop )]
140
+ struct ExtraDeposit {
141
+ token : ContractAddress ,
142
+ amount : TokenAmount
143
+ }
144
+
124
145
#[event]
125
146
#[derive(Drop , starknet:: Event )]
126
147
enum Event {
127
148
LiquidityLooped : LiquidityLooped ,
128
149
PositionClosed : PositionClosed ,
150
+ Withdraw : Withdraw ,
151
+ ExtraDeposit : ExtraDeposit ,
152
+ #[flat]
153
+ OwnableEvent : OwnableComponent :: Event ,
129
154
#[flat]
130
155
ReentrancyGuardEvent : ReentrancyGuardComponent :: Event ,
131
156
#[flat]
@@ -165,7 +190,7 @@ mod Deposit {
165
190
pool_price : TokenPrice
166
191
) {
167
192
let user_account = get_tx_info (). unbox (). account_contract_address;
168
- assert (user_account == self . owner . read (), ' Caller is not the owner' );
193
+ assert (user_account == self . ownable . owner (), ' Caller is not the owner' );
169
194
assert (! self . is_position_open. read (), ' Open position already exists' );
170
195
let DepositData { token , amount , multiplier , borrow_portion_percent } = deposit_data ;
171
196
assert (
@@ -193,7 +218,7 @@ mod Deposit {
193
218
(false , pool_key . token0, ekubo_limits . lower)
194
219
};
195
220
196
- token_dispatcher . transferFrom (self . owner . read (), curr_contract_address , amount );
221
+ token_dispatcher . transferFrom (self . ownable . owner (), curr_contract_address , amount );
197
222
let (deposit_reserve_data , debt_reserve_data ) = (
198
223
zk_market . get_reserve_data (token ), zk_market . get_reserve_data (borrowing_token )
199
224
);
@@ -203,6 +228,11 @@ mod Deposit {
203
228
debt_reserve_data . borrow_factor. into ()
204
229
);
205
230
231
+ assert (
232
+ deposit_reserve_data . enabled && debt_reserve_data . enabled,
233
+ ' Reserves must be enabled'
234
+ );
235
+
206
236
zk_market . enable_collateral (token );
207
237
208
238
token_dispatcher . approve (zk_market . contract_address, amount );
@@ -293,7 +323,7 @@ mod Deposit {
293
323
debt_price : TokenPrice
294
324
) {
295
325
assert (
296
- get_tx_info (). unbox (). account_contract_address == self . owner . read (),
326
+ get_tx_info (). unbox (). account_contract_address == self . ownable . owner (),
297
327
' Caller is not the owner'
298
328
);
299
329
assert (self . is_position_open. read (), ' Open position not exists' );
@@ -309,6 +339,11 @@ mod Deposit {
309
339
debt_reserve_data . borrow_factor. into ()
310
340
);
311
341
342
+ assert (
343
+ deposit_reserve_data . enabled && debt_reserve_data . enabled,
344
+ ' Reserves must be enabled'
345
+ );
346
+
312
347
let z_token_disp = ERC20ABIDispatcher {
313
348
contract_address : deposit_reserve_data . z_token_address
314
349
};
@@ -386,7 +421,7 @@ mod Deposit {
386
421
zk_market . disable_collateral (supply_token );
387
422
self . is_position_open. write (false );
388
423
let withdrawn_amount = token_disp . balanceOf (contract_address );
389
- token_disp . transfer (self . owner . read (), withdrawn_amount );
424
+ token_disp . transfer (self . ownable . owner (), withdrawn_amount );
390
425
self
391
426
. emit (
392
427
PositionClosed {
@@ -465,10 +500,11 @@ mod Deposit {
465
500
token_dispatcher . approve (zk_market . contract_address, amount );
466
501
zk_market . enable_collateral (token );
467
502
zk_market . deposit (token , amount . try_into (). unwrap ());
503
+ self . emit (ExtraDeposit { token , amount });
468
504
self . reentrancy_guard. end ();
469
505
}
470
506
471
- /// Withdraws tokens from zkLend if looped tokens are repaid
507
+ /// Withdraws tokens from zkLend
472
508
///
473
509
/// # Panics
474
510
/// address of account that started the transaction is not equal to `owner` storage variable
@@ -477,19 +513,25 @@ mod Deposit {
477
513
/// `token`: TokenAddress - token address to withdraw from zkLend
478
514
/// `amount`: TokenAmount - amount to withdraw. Pass `0` to withdraw all
479
515
fn withdraw (ref self : ContractState , token : ContractAddress , amount : TokenAmount ) {
480
- assert ( get_caller_address () == self . owner . read (), ' Caller is not the owner ' );
516
+ self . ownable . assert_only_owner ( );
481
517
let zk_market = self . zk_market. read ();
518
+
482
519
let token_dispatcher = ERC20ABIDispatcher { contract_address : token };
520
+ let mut withdrawn_amount = amount ;
483
521
if amount == 0 {
522
+ let current_contract = get_contract_address ();
523
+ let initial_balance = ERC20ABIDispatcher { contract_address : token }
524
+ . balanceOf (current_contract );
484
525
zk_market . withdraw_all (token );
485
- token_dispatcher
486
- . transfer (
487
- self . owner . read (), token_dispatcher . balanceOf ( get_contract_address ())
488
- );
526
+ let new_balance = ERC20ABIDispatcher { contract_address : token }
527
+ . balanceOf ( current_contract );
528
+ withdrawn_amount = new_balance - initial_balance ;
529
+ token_dispatcher . transfer ( self . ownable . owner (), new_balance );
489
530
} else {
490
531
zk_market . withdraw (token , amount . try_into (). unwrap ());
491
- token_dispatcher . transfer (self . owner . read (), amount );
532
+ token_dispatcher . transfer (self . ownable . owner (), amount );
492
533
};
534
+ self . emit (Withdraw { token , amount : withdrawn_amount });
493
535
}
494
536
}
495
537
@@ -520,7 +562,7 @@ mod Deposit {
520
562
impl UpgradeableImpl of IUpgradeable <ContractState > {
521
563
fn upgrade (ref self : ContractState , new_class_hash : ClassHash ) {
522
564
// This function can only be called by the owner
523
- assert ( get_caller_address () == self . owner . read (), ' Caller is not the owner ' );
565
+ self . ownable . assert_only_owner ( );
524
566
525
567
self . upgradeable. upgrade (new_class_hash );
526
568
}
0 commit comments