Skip to content

Commit f571e93

Browse files
fix lint
2 parents e5ef3e5 + b6ba999 commit f571e93

10 files changed

+327
-50
lines changed

README.md

+15
Original file line numberDiff line numberDiff line change
@@ -132,4 +132,19 @@ docker-compose -f docker-compose.dev.yaml up --build
132132
2. In new terminal window run command to populate db
133133
```
134134
docker exec -ti backend_dev python -m web_app.db.seed_data
135+
```
136+
137+
138+
## How to create migration file:
139+
Run up docker containers
140+
```bash
141+
docker-compose -f docker-compose.dev.yaml up --build
142+
```
143+
Go to backend container in new terminal window
144+
```bash
145+
docker exec -ti backend_dev bash
146+
```
147+
Run command to create migration file
148+
```bash
149+
alembic -c web_app/alembic.ini revision --autogenerate -m "migration message"
135150
```

Scarb.lock

+86-15
Original file line numberDiff line numberDiff line change
@@ -11,50 +11,123 @@ name = "ekubo"
1111
version = "0.1.0"
1212
source = "git+https://github.com/ekuboprotocol/abis?rev=edb6de8#edb6de8c9baf515f1053bbab3d86825d54a63bc3"
1313

14+
[[package]]
15+
name = "openzeppelin"
16+
version = "0.19.0"
17+
source = "registry+https://scarbs.xyz/"
18+
checksum = "sha256:33174cc8f66cd2c1a527fd7f13a800dcb107d59f5c77e998e0c896a1da9cf1df"
19+
dependencies = [
20+
"openzeppelin_access",
21+
"openzeppelin_account",
22+
"openzeppelin_finance",
23+
"openzeppelin_governance",
24+
"openzeppelin_introspection",
25+
"openzeppelin_merkle_tree",
26+
"openzeppelin_presets",
27+
"openzeppelin_security",
28+
"openzeppelin_token",
29+
"openzeppelin_upgrades",
30+
"openzeppelin_utils",
31+
]
32+
33+
[[package]]
34+
name = "openzeppelin_access"
35+
version = "0.19.0"
36+
source = "registry+https://scarbs.xyz/"
37+
checksum = "sha256:0f5055ef443327bb613a56a812ccf31157abfd7d36a18739556f78b67f5b1116"
38+
dependencies = [
39+
"openzeppelin_introspection",
40+
"openzeppelin_utils",
41+
]
42+
1443
[[package]]
1544
name = "openzeppelin_account"
16-
version = "0.18.0"
45+
version = "0.19.0"
1746
source = "registry+https://scarbs.xyz/"
18-
checksum = "sha256:83e6571cac4c67049c8d0ab4e3c7ad146d582d7605e7354248835833e1d26c4a"
47+
checksum = "sha256:0c92c856e44080e3280788d1c46f89ac707c64fa555eb02c343e492709a1ee50"
1948
dependencies = [
2049
"openzeppelin_introspection",
2150
"openzeppelin_utils",
2251
]
2352

53+
[[package]]
54+
name = "openzeppelin_finance"
55+
version = "0.19.0"
56+
source = "registry+https://scarbs.xyz/"
57+
checksum = "sha256:3d38c8aff02478431ddbb0538be5281a89eb159016105195bf6409bf6c3c4fc4"
58+
dependencies = [
59+
"openzeppelin_access",
60+
"openzeppelin_token",
61+
]
62+
63+
[[package]]
64+
name = "openzeppelin_governance"
65+
version = "0.19.0"
66+
source = "registry+https://scarbs.xyz/"
67+
checksum = "sha256:fc6afb45e3cdcb5e843bbc80c6e12bb2536a34f557b74787c256872b86f2a81a"
68+
dependencies = [
69+
"openzeppelin_access",
70+
"openzeppelin_account",
71+
"openzeppelin_introspection",
72+
"openzeppelin_token",
73+
]
74+
2475
[[package]]
2576
name = "openzeppelin_introspection"
26-
version = "0.18.0"
77+
version = "0.19.0"
78+
source = "registry+https://scarbs.xyz/"
79+
checksum = "sha256:a1dda07a91c447b83ccfcc4895897ec134917f0ff6d2ca876b93ea27466d7693"
80+
81+
[[package]]
82+
name = "openzeppelin_merkle_tree"
83+
version = "0.19.0"
84+
source = "registry+https://scarbs.xyz/"
85+
checksum = "sha256:e7aaa00b9ea0f73938d3be6351aaa88efd21304bf6d5fd1b66c61e048a7a2375"
86+
87+
[[package]]
88+
name = "openzeppelin_presets"
89+
version = "0.19.0"
2790
source = "registry+https://scarbs.xyz/"
28-
checksum = "sha256:46c4cc6c95c9baa4c7d5cc0ed2bdaf334f46c25a8c92b3012829fff936e3042b"
91+
checksum = "sha256:57d5c48724025072419c63a929903d71b949287338dc86d561e52b52d869c06f"
92+
dependencies = [
93+
"openzeppelin_access",
94+
"openzeppelin_account",
95+
"openzeppelin_finance",
96+
"openzeppelin_introspection",
97+
"openzeppelin_token",
98+
"openzeppelin_upgrades",
99+
"openzeppelin_utils",
100+
]
29101

30102
[[package]]
31103
name = "openzeppelin_security"
32-
version = "0.18.0"
104+
version = "0.19.0"
33105
source = "registry+https://scarbs.xyz/"
34-
checksum = "sha256:1db3a41e02ed48806587981340ed01ee7d552c3ad52cb33a6d81c1ed5cba9ee0"
106+
checksum = "sha256:0f1462d6de898cd28199cde0110304b4248fb19c7e788d4121d26c93b290e991"
35107

36108
[[package]]
37109
name = "openzeppelin_token"
38-
version = "0.18.0"
110+
version = "0.19.0"
39111
source = "registry+https://scarbs.xyz/"
40-
checksum = "sha256:eafbe13f6a0487ce212459e25a81ae07f340ba76208ad4616626eb2d25a9625e"
112+
checksum = "sha256:9cba10f666ca6dd83b581367438d04b244bd5bbf0cfad6a28d193d373c0498b8"
41113
dependencies = [
114+
"openzeppelin_access",
42115
"openzeppelin_account",
43116
"openzeppelin_introspection",
44117
"openzeppelin_utils",
45118
]
46119

47120
[[package]]
48121
name = "openzeppelin_upgrades"
49-
version = "0.18.0"
122+
version = "0.19.0"
50123
source = "registry+https://scarbs.xyz/"
51-
checksum = "sha256:33c9d0865364fc18a5e7b471fe53c3b0f3e0aec56a94f435089638fad2a4a35b"
124+
checksum = "sha256:3f2badf764a2219b0ea5b567b039daeb4c1707331f98e4f7b985ca2b562b4e10"
52125

53126
[[package]]
54127
name = "openzeppelin_utils"
55-
version = "0.18.0"
128+
version = "0.19.0"
56129
source = "registry+https://scarbs.xyz/"
57-
checksum = "sha256:725b212839f3eddc32791408609099c5e808c167ca0cf331d8c1d778b07a4e21"
130+
checksum = "sha256:0e0e6f6b20b3c4075b92941a2c124430a59f1c207f8fbdfd56ce9239e6d666a8"
58131

59132
[[package]]
60133
name = "pragma_lib"
@@ -80,9 +153,7 @@ version = "0.1.0"
80153
dependencies = [
81154
"alexandria_math",
82155
"ekubo",
83-
"openzeppelin_security",
84-
"openzeppelin_token",
85-
"openzeppelin_upgrades",
156+
"openzeppelin",
86157
"pragma_lib",
87158
"snforge_std",
88159
]

Scarb.toml

+1-3
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,7 @@ cairo-version = "2.8.2"
1010
starknet = "2.8.2"
1111
ekubo = { git = "https://github.com/ekuboprotocol/abis", rev = "edb6de8" }
1212
alexandria_math = { git = "https://github.com/keep-starknet-strange/alexandria.git", rev = "8208871" }
13-
openzeppelin_token = "0.18.0"
14-
openzeppelin_security = "0.18.0"
15-
openzeppelin_upgrades = "0.18.0"
13+
openzeppelin = "0.19.0"
1614

1715
[dev-dependencies]
1816
pragma_lib = { git = "https://github.com/astraly-labs/pragma-lib", tag = "2.8.2" }

src/deposit.cairo

+61-19
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,11 @@ mod Deposit {
88
types::{i129::i129, keys::PoolKey}
99
};
1010

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+
};
1516
use spotnet::{
1617
constants::{ZK_SCALE_DECIMALS, STRK_ADDRESS},
1718
interfaces::{
@@ -33,18 +34,25 @@ mod Deposit {
3334
path: ReentrancyGuardComponent, storage: reentrancy_guard, event: ReentrancyGuardEvent
3435
);
3536
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>;
3643

3744
impl ReentrancyInternalImpl = ReentrancyGuardComponent::InternalImpl<ContractState>;
3845
impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl<ContractState>;
3946

4047
#[storage]
4148
struct Storage {
42-
owner: ContractAddress,
4349
ekubo_core: ICoreDispatcher,
4450
zk_market: IMarketDispatcher,
4551
treasury: ContractAddress,
4652
is_position_open: bool,
4753
#[substorage(v0)]
54+
ownable: OwnableComponent::Storage,
55+
#[substorage(v0)]
4856
reentrancy_guard: ReentrancyGuardComponent::Storage,
4957
#[substorage(v0)]
5058
upgradeable: UpgradeableComponent::Storage
@@ -59,7 +67,7 @@ mod Deposit {
5967
treasury: ContractAddress
6068
) {
6169
assert(owner.is_non_zero(), 'Owner address is zero');
62-
self.owner.write(owner);
70+
self.ownable.initializer(owner);
6371
self.ekubo_core.write(ekubo_core);
6472
self.zk_market.write(zk_market);
6573
self.treasury.write(treasury);
@@ -93,7 +101,8 @@ mod Deposit {
93101
supply_decimals: DecimalScale,
94102
debt_decimals: DecimalScale
95103
) -> 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());
97106
let free_amount = (((deposited * collateral_factor.into() / ZK_SCALE_DECIMALS)
98107
* borrow_factor.into()
99108
/ ZK_SCALE_DECIMALS))
@@ -121,11 +130,27 @@ mod Deposit {
121130
repaid_amount: TokenAmount
122131
}
123132

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+
124145
#[event]
125146
#[derive(Drop, starknet::Event)]
126147
enum Event {
127148
LiquidityLooped: LiquidityLooped,
128149
PositionClosed: PositionClosed,
150+
Withdraw: Withdraw,
151+
ExtraDeposit: ExtraDeposit,
152+
#[flat]
153+
OwnableEvent: OwnableComponent::Event,
129154
#[flat]
130155
ReentrancyGuardEvent: ReentrancyGuardComponent::Event,
131156
#[flat]
@@ -165,7 +190,7 @@ mod Deposit {
165190
pool_price: TokenPrice
166191
) {
167192
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');
169194
assert(!self.is_position_open.read(), 'Open position already exists');
170195
let DepositData { token, amount, multiplier, borrow_portion_percent } = deposit_data;
171196
assert(
@@ -193,7 +218,7 @@ mod Deposit {
193218
(false, pool_key.token0, ekubo_limits.lower)
194219
};
195220

196-
token_dispatcher.transferFrom(self.owner.read(), curr_contract_address, amount);
221+
token_dispatcher.transferFrom(self.ownable.owner(), curr_contract_address, amount);
197222
let (deposit_reserve_data, debt_reserve_data) = (
198223
zk_market.get_reserve_data(token), zk_market.get_reserve_data(borrowing_token)
199224
);
@@ -203,6 +228,11 @@ mod Deposit {
203228
debt_reserve_data.borrow_factor.into()
204229
);
205230

231+
assert(
232+
deposit_reserve_data.enabled && debt_reserve_data.enabled,
233+
'Reserves must be enabled'
234+
);
235+
206236
zk_market.enable_collateral(token);
207237

208238
token_dispatcher.approve(zk_market.contract_address, amount);
@@ -293,7 +323,7 @@ mod Deposit {
293323
debt_price: TokenPrice
294324
) {
295325
assert(
296-
get_tx_info().unbox().account_contract_address == self.owner.read(),
326+
get_tx_info().unbox().account_contract_address == self.ownable.owner(),
297327
'Caller is not the owner'
298328
);
299329
assert(self.is_position_open.read(), 'Open position not exists');
@@ -309,6 +339,11 @@ mod Deposit {
309339
debt_reserve_data.borrow_factor.into()
310340
);
311341

342+
assert(
343+
deposit_reserve_data.enabled && debt_reserve_data.enabled,
344+
'Reserves must be enabled'
345+
);
346+
312347
let z_token_disp = ERC20ABIDispatcher {
313348
contract_address: deposit_reserve_data.z_token_address
314349
};
@@ -386,7 +421,7 @@ mod Deposit {
386421
zk_market.disable_collateral(supply_token);
387422
self.is_position_open.write(false);
388423
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);
390425
self
391426
.emit(
392427
PositionClosed {
@@ -465,10 +500,11 @@ mod Deposit {
465500
token_dispatcher.approve(zk_market.contract_address, amount);
466501
zk_market.enable_collateral(token);
467502
zk_market.deposit(token, amount.try_into().unwrap());
503+
self.emit(ExtraDeposit { token, amount });
468504
self.reentrancy_guard.end();
469505
}
470506

471-
/// Withdraws tokens from zkLend if looped tokens are repaid
507+
/// Withdraws tokens from zkLend
472508
///
473509
/// # Panics
474510
/// address of account that started the transaction is not equal to `owner` storage variable
@@ -477,19 +513,25 @@ mod Deposit {
477513
/// `token`: TokenAddress - token address to withdraw from zkLend
478514
/// `amount`: TokenAmount - amount to withdraw. Pass `0` to withdraw all
479515
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();
481517
let zk_market = self.zk_market.read();
518+
482519
let token_dispatcher = ERC20ABIDispatcher { contract_address: token };
520+
let mut withdrawn_amount = amount;
483521
if amount == 0 {
522+
let current_contract = get_contract_address();
523+
let initial_balance = ERC20ABIDispatcher { contract_address: token }
524+
.balanceOf(current_contract);
484525
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);
489530
} else {
490531
zk_market.withdraw(token, amount.try_into().unwrap());
491-
token_dispatcher.transfer(self.owner.read(), amount);
532+
token_dispatcher.transfer(self.ownable.owner(), amount);
492533
};
534+
self.emit(Withdraw { token, amount: withdrawn_amount });
493535
}
494536
}
495537

@@ -520,7 +562,7 @@ mod Deposit {
520562
impl UpgradeableImpl of IUpgradeable<ContractState> {
521563
fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {
522564
// 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();
524566

525567
self.upgradeable.upgrade(new_class_hash);
526568
}

src/types.cairo

+1-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ pub struct Claim {
4040

4141
#[derive(Drop, Serde, starknet::Store)]
4242
pub struct MarketReserveData {
43-
enabled: bool,
43+
pub enabled: bool,
4444
pub decimals: felt252,
4545
pub z_token_address: ContractAddress,
4646
interest_rate_model: ContractAddress,

0 commit comments

Comments
 (0)