Skip to content

Commit 6a25785

Browse files
authored
feat[periphery]: improve trove helper (#588)
1 parent 0a9e91a commit 6a25785

9 files changed

+104
-55
lines changed

devnet_dump.json

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

scripts/deployment/deploy_sepolia_alpha-sepolia_state.json

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -86,17 +86,6 @@
8686
"timestamp": 1716974342,
8787
"misc": null
8888
},
89-
"61bd2a4505d5386ebf029a20bc0670408c6744f2385faefe59245a40e3e321b9": {
90-
"name": "deploy",
91-
"output": {
92-
"type": "DeployResponse",
93-
"contract_address": "0x3d124e4166a09fb92787d480d44d6c25e6f638f706f8ae4074ee2766b634293",
94-
"transaction_hash": "0x1dda50af539b006d4e18df731c2df07e3d00dbd2a4fd09761c31d4cb4206130"
95-
},
96-
"status": "Success",
97-
"timestamp": 1716975029,
98-
"misc": null
99-
},
10089
"089a513db100b3f445de2e70b74115cee616e0413580e421778d825b5c4a7d94": {
10190
"name": "deploy",
10291
"output": {
@@ -340,17 +329,6 @@
340329
"timestamp": 1716974826,
341330
"misc": null
342331
},
343-
"a0c6d143f2f8ba10d8a5038653c8a128ad9a3a78d91cebc698d9b128ee8ac67f": {
344-
"name": "declare",
345-
"output": {
346-
"type": "DeclareResponse",
347-
"class_hash": "0x434f7be09f0bdcdc072ca7434f56682e5da6c35b26d40c5ff09635eef21f637",
348-
"transaction_hash": "0x567066381126cb4a08b725af849dce6b279569f8ed379b8b8722781496f190b"
349-
},
350-
"status": "Success",
351-
"timestamp": 1716893182,
352-
"misc": null
353-
},
354332
"189a73592c03c2eee41e593da13d971c369c2d2174c215178b21df22135f849f": {
355333
"name": "declare",
356334
"output": {
@@ -540,6 +518,28 @@
540518
"status": "Success",
541519
"timestamp": 1716974849,
542520
"misc": null
521+
},
522+
"a0c6d143f2f8ba10d8a5038653c8a128ad9a3a78d91cebc698d9b128ee8ac67f": {
523+
"name": "declare",
524+
"output": {
525+
"type": "DeclareResponse",
526+
"class_hash": "0x57de79aa98ec372b03eae8a68077e719926035da35ac6ab0d64822d41457019",
527+
"transaction_hash": "0x3dceb1ba484e16144541d92deb6616bbf87fff4800154a88c9b63a41abba629"
528+
},
529+
"status": "Success",
530+
"timestamp": 1718353096,
531+
"misc": null
532+
},
533+
"44d2ecccfd9a1b0f51200358dedc6ee47c568d742ea98c017270c51f3d6c179b": {
534+
"name": "deploy",
535+
"output": {
536+
"type": "DeployResponse",
537+
"contract_address": "0x348d8f672ea7f8f57ae45682571177a4d480301f36af45931bb197c37f6007a",
538+
"transaction_hash": "0x4e1c3c34400668ef7a3d6860697ed128ef79a55605dfb640eea3bc43397c45e"
539+
},
540+
"status": "Success",
541+
"timestamp": 1718353170,
542+
"misc": null
543543
}
544544
}
545545
}

scripts/deployment/src/deploy_devnet.cairo

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,7 @@ fn main() {
179179
// Peripheral deployment
180180
println!("Deploying periphery contracts");
181181
let frontend_data_provider: ContractAddress = periphery_deployment::deploy_frontend_data_provider(
182-
admin, shrine, sentinel
182+
admin, shrine, sentinel, abbot, purger
183183
);
184184

185185
// Print summary table of deployed contracts

scripts/deployment/src/deploy_sepolia.cairo

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ fn main() {
120120
// Peripheral deployment
121121
println!("Deploying periphery contracts");
122122
let frontend_data_provider: ContractAddress = periphery_deployment::deploy_frontend_data_provider(
123-
admin, shrine, sentinel
123+
admin, shrine, sentinel, abbot, purger
124124
);
125125

126126
println!("-------------------------------------------------\n");

scripts/deployment/src/periphery_deployment.cairo

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,17 @@ use starknet::{ClassHash, ContractAddress};
1010
//
1111

1212
pub fn deploy_frontend_data_provider(
13-
admin: ContractAddress, shrine: ContractAddress, sentinel: ContractAddress
13+
admin: ContractAddress,
14+
shrine: ContractAddress,
15+
sentinel: ContractAddress,
16+
abbot: ContractAddress,
17+
purger: ContractAddress
1418
) -> ContractAddress {
1519
let declare_frontend_data_provider = declare("frontend_data_provider", Option::Some(MAX_FEE), Option::None)
1620
.expect('failed FDP declare');
17-
let frontend_data_provider_calldata: Array<felt252> = array![admin.into(), shrine.into(), sentinel.into()];
21+
let frontend_data_provider_calldata: Array<felt252> = array![
22+
admin.into(), shrine.into(), sentinel.into(), abbot.into(), purger.into()
23+
];
1824
let deploy_frontend_data_provider = deploy(
1925
declare_frontend_data_provider.class_hash,
2026
frontend_data_provider_calldata,

scripts/src/addresses.cairo

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -26,83 +26,83 @@ pub mod devnet {
2626
// these deployments are based on replaying the transactions in `scripts/devnet_dump.json` and should not be used
2727
// in the deployment package
2828
pub fn abbot() -> ContractAddress {
29-
0x35e493910af6c1f19fb4e93a5a0f7b216a94ce500bad5ac1d4a3b030a534d52.try_into().unwrap()
29+
0x2f8940f748fee76656e25627fb9fc9237cf76827eb94f1cb8ed6db00e57491e.try_into().unwrap()
3030
}
3131

3232
pub fn absorber() -> ContractAddress {
33-
0x2d9fd7ee306bc387e22f3c38d9584f5ad134284f99f917a557454e50f72ca48.try_into().unwrap()
33+
0x6ad5948495fb2b102c72035770371a6370414ac845ae678c55a256d5cc87d76.try_into().unwrap()
3434
}
3535

3636
pub fn allocator() -> ContractAddress {
37-
0x28e45d85345a4664c8dbc783ffd8950aae653b135e50e7a983c438f78ef2fd6.try_into().unwrap()
37+
0x281e7062aa4ee1d58eb9692ec0a1737852c98b6466c7787b5c24ab98c15a640.try_into().unwrap()
3838
}
3939

4040
pub fn caretaker() -> ContractAddress {
41-
0x15a8105bce92aa7b57896d29527f2206d649f0dd1135d0fcbc1ffb0973f2792.try_into().unwrap()
41+
0x5dfcded9b418bab8774ae07ea6a04a4f462f4db23c574472e4ea68ecdbb30be.try_into().unwrap()
4242
}
4343

4444
pub fn controller() -> ContractAddress {
45-
0x442e4b7d97e60612412147a5f1db9ae79da022b5fb4420f21da85cb1d858712.try_into().unwrap()
45+
0x66d29efb9936beef9192a010027788254c9c3329d551e274dd17002c425a07.try_into().unwrap()
4646
}
4747

4848
pub fn equalizer() -> ContractAddress {
49-
0x77764d1aef5135740b921f7c5894c26e87279ebbc6c55354b15ea177b813a00.try_into().unwrap()
49+
0x1e53d5b14a7d9d7b8bd90707e4b7e7ccb2aae85f823e5bed449e807488f7684.try_into().unwrap()
5050
}
5151

5252
pub fn eth_gate() -> ContractAddress {
53-
0x5c3aba3cf90610605f497ddf53da85e48424c1972753a31f2a4988b9e54956f.try_into().unwrap()
53+
0x7ce8dbfcf1625a285ab2263bbef126d347547263bd897078732080101a7a3eb.try_into().unwrap()
5454
}
5555

5656
pub fn flash_mint() -> ContractAddress {
57-
0xde7443a45b5541c9a3794f85727136cae0cab9bac77894b27982d0510202e7.try_into().unwrap()
57+
0x5a1f1bc3b5eac6b514ddaf085ca9a668f5c1511bf265b9aa65cdc32791a405b.try_into().unwrap()
5858
}
5959

6060
pub fn frontend_data_provider() -> ContractAddress {
61-
0x59c36f7d6b60d549f7b3d98a847225ac87268c61ba519e04a8eb8d2edd16602.try_into().unwrap()
61+
0x397c140f6eded24bbad9b8ac00920fd12e33e8c6f7cc40ca16fbd5ebf993c5b.try_into().unwrap()
6262
}
6363

6464
pub fn mock_pragma() -> ContractAddress {
65-
0x2e17097c8241e04d350899aab12078f70fced59b90fe00ffc512c021e93067a.try_into().unwrap()
65+
0x5275fc46b59af9a110b087b2129ccdfd996677d6ce4aaba2f0bcd7561bfa2fc.try_into().unwrap()
6666
}
6767

6868
pub fn mock_switchboard() -> ContractAddress {
69-
0x74d5c80c714c5b9baa15f4862f3ca989d2f46614d6d01a6e272533010f9981c.try_into().unwrap()
69+
0x6bcfe770eca653c2940f51537885e88e3499e04ab2df82e58ec6bc8a8d4325d.try_into().unwrap()
7070
}
7171

7272
pub fn pragma() -> ContractAddress {
73-
0x6286bc2559e454cb18f3864bc8d222ede1e3ed172ec395387575819b690c165.try_into().unwrap()
73+
0x267595a58145771b39b66feb57bf50fd9321506d12a39ebace38c4995a3b77a.try_into().unwrap()
7474
}
7575

7676
pub fn purger() -> ContractAddress {
77-
0x5b19f7799753fd1a00550186cd226d5bfee37524c331d0c6944ba49e8a14261.try_into().unwrap()
77+
0x707c16dc18135483948fcb68e963a3c68cdbeeeef1e2bfe679ce032ad306403.try_into().unwrap()
7878
}
7979

8080
pub fn seer() -> ContractAddress {
81-
0x70e746130ea1965e78e8ac214571580d661e4d4fc22d2e1ae7be018ea45a2c3.try_into().unwrap()
81+
0x428adfdb17ceb3d7a6cc8898e14c5f035a92b1db5ed0a11d6339122a57e5b40.try_into().unwrap()
8282
}
8383

8484
pub fn sentinel() -> ContractAddress {
85-
0x586333ae3c4bfb73c377697822837849bdaa280734e2ea05b654e5ff5ad3a42.try_into().unwrap()
85+
0x75b3bb3a8c234a01b0b10f29fcb32f28b6d2ccf13b0e741ee8c77d902415b36.try_into().unwrap()
8686
}
8787

8888
pub fn shrine() -> ContractAddress {
89-
0x2ba3ab88304cb7990c38c69d021d7c61bef9b5934e8ee240689f7976cf7d729.try_into().unwrap()
89+
0x6a3ca8d0d0a0a022c78fc03dc19783f9b75b51d1629e678ad14154abcef67a.try_into().unwrap()
9090
}
9191

9292
pub fn strk_gate() -> ContractAddress {
93-
0x33fba20bd841967b6a1a9f456ea028cc385ab52f638136dc7d4032c14118a9c.try_into().unwrap()
93+
0xe5ac1bcb276ab1e46b1e647f030b7e3e8624038dd4d61bbdc010ba3de58925.try_into().unwrap()
9494
}
9595

9696
pub fn switchboard() -> ContractAddress {
97-
0x21ca98d6b54f10dad6e3149b0db9222cfacf57762ff56117c85e33cbf2b87a2.try_into().unwrap()
97+
0x6a2f82103368f594915e49baed4a345b6371c053583b7a77512e24e955ac83f.try_into().unwrap()
9898
}
9999

100100
pub fn wbtc() -> ContractAddress {
101-
0x186e2d191235b8411d2bb9e18e8d5fca6059662e2c7077571281b5097081df.try_into().unwrap()
101+
0x6d092cf0cf10d761e1e615cf1c0249299742175097ba3a6da62f69d532af813.try_into().unwrap()
102102
}
103103

104104
pub fn wbtc_gate() -> ContractAddress {
105-
0x7112dc7b7766b957f5aa87d585d0cdcc3a8ba075634187863c4db33c0cacd0b.try_into().unwrap()
105+
0x1aad2d6cc4356359fc88784228d73442488a79bd8af97b2ed83aa866bda6219.try_into().unwrap()
106106
}
107107
}
108108

@@ -160,7 +160,7 @@ pub mod sepolia {
160160
}
161161

162162
pub fn frontend_data_provider() -> ContractAddress {
163-
0x03d124e4166a09fb92787d480d44d6c25e6f638f706f8ae4074ee2766b634293.try_into().unwrap()
163+
0x0348d8f672ea7f8f57ae45682571177a4d480301f36af45931bb197c37f6007a.try_into().unwrap()
164164
}
165165

166166
pub fn pragma() -> ContractAddress {

src/periphery/frontend_data_provider.cairo

Lines changed: 36 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
#[starknet::contract]
22
pub mod frontend_data_provider {
33
use access_control::access_control_component;
4+
use opus::interfaces::IAbbot::{IAbbotDispatcher, IAbbotDispatcherTrait};
45
use opus::interfaces::IGate::{IGateDispatcher, IGateDispatcherTrait};
6+
use opus::interfaces::IPurger::{IPurgerDispatcher, IPurgerDispatcherTrait};
57
use opus::interfaces::ISentinel::{ISentinelDispatcher, ISentinelDispatcherTrait};
68
use opus::interfaces::IShrine::{IShrineDispatcher, IShrineDispatcherTrait};
79
use opus::periphery::interfaces::IFrontendDataProvider;
810
use opus::periphery::roles::frontend_data_provider_roles;
9-
use opus::periphery::types::{RecoveryModeInfo, ShrineAssetInfo, TroveAssetInfo, YinInfo};
11+
use opus::periphery::types::{RecoveryModeInfo, ShrineAssetInfo, TroveAssetInfo, TroveInfo, YinInfo};
1012
use opus::types::{Health, YangBalance};
1113
use opus::utils::upgradeable::{IUpgradeable, upgradeable_component};
1214
use starknet::{ClassHash, ContractAddress};
@@ -37,6 +39,8 @@ pub mod frontend_data_provider {
3739
access_control: access_control_component::Storage,
3840
#[substorage(v0)]
3941
upgradeable: upgradeable_component::Storage,
42+
abbot: IAbbotDispatcher,
43+
purger: IPurgerDispatcher,
4044
sentinel: ISentinelDispatcher,
4145
shrine: IShrineDispatcher,
4246
}
@@ -58,11 +62,18 @@ pub mod frontend_data_provider {
5862

5963
#[constructor]
6064
fn constructor(
61-
ref self: ContractState, admin: ContractAddress, shrine: ContractAddress, sentinel: ContractAddress
65+
ref self: ContractState,
66+
admin: ContractAddress,
67+
shrine: ContractAddress,
68+
sentinel: ContractAddress,
69+
abbot: ContractAddress,
70+
purger: ContractAddress
6271
) {
6372
self.access_control.initializer(admin, Option::Some(frontend_data_provider_roles::default_admin_role()));
6473
self.shrine.write(IShrineDispatcher { contract_address: shrine });
6574
self.sentinel.write(ISentinelDispatcher { contract_address: sentinel });
75+
self.abbot.write(IAbbotDispatcher { contract_address: abbot });
76+
self.purger.write(IPurgerDispatcher { contract_address: purger });
6677
}
6778

6879
//
@@ -105,11 +116,21 @@ pub mod frontend_data_provider {
105116
RecoveryModeInfo { is_recovery_mode: shrine.is_recovery_mode(), target_ltv, buffer_ltv }
106117
}
107118

108-
// Returns an ordered array of TroveAssetInfo struct for a trove
109-
fn get_trove_assets_info(self: @ContractState, trove_id: u64) -> Span<TroveAssetInfo> {
119+
// Returns a TroveInfo struct for a trove
120+
fn get_trove_info(self: @ContractState, trove_id: u64) -> TroveInfo {
110121
let shrine: IShrineDispatcher = self.shrine.read();
111122
let sentinel: ISentinelDispatcher = self.sentinel.read();
112123

124+
let trove_owner: ContractAddress = self.abbot.read().get_trove_owner(trove_id).unwrap();
125+
let max_forge_amt: Wad = shrine.get_max_forge(trove_id);
126+
let is_liquidatable: bool = !shrine.is_healthy(trove_id);
127+
let is_absorbable: bool = if !is_liquidatable {
128+
false
129+
} else {
130+
self.purger.read().is_absorbable(trove_id)
131+
};
132+
let health: Health = shrine.get_trove_health(trove_id);
133+
113134
let mut shrine_yang_balances: Span<YangBalance> = shrine.get_shrine_deposits();
114135
let mut trove_yang_balances: Span<YangBalance> = shrine.get_trove_deposits(trove_id);
115136
let mut yang_addresses: Span<ContractAddress> = sentinel.get_yang_addresses();
@@ -139,7 +160,17 @@ pub mod frontend_data_provider {
139160
};
140161
asset_infos.append(trove_asset_info);
141162
},
142-
Option::None => { break asset_infos.span(); }
163+
Option::None => {
164+
break TroveInfo {
165+
trove_id,
166+
owner: trove_owner,
167+
max_forge_amt,
168+
is_liquidatable,
169+
is_absorbable,
170+
health,
171+
assets: asset_infos.span()
172+
};
173+
}
143174
}
144175
}
145176
}

src/periphery/interfaces.cairo

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use opus::periphery::types::{RecoveryModeInfo, ShrineAssetInfo, TroveAssetInfo, YinInfo};
1+
use opus::periphery::types::{RecoveryModeInfo, ShrineAssetInfo, TroveInfo, YinInfo};
22
use starknet::ContractAddress;
33
use wadray::Wad;
44

@@ -7,6 +7,6 @@ pub trait IFrontendDataProvider<TContractState> {
77
// getters
88
fn get_yin_info(self: @TContractState) -> YinInfo;
99
fn get_recovery_mode_info(self: @TContractState) -> RecoveryModeInfo;
10-
fn get_trove_assets_info(self: @TContractState, trove_id: u64) -> Span<TroveAssetInfo>;
10+
fn get_trove_info(self: @TContractState, trove_id: u64) -> TroveInfo;
1111
fn get_shrine_assets_info(self: @TContractState) -> Span<ShrineAssetInfo>;
1212
}

src/periphery/types.cairo

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use opus::types::Health;
12
use starknet::ContractAddress;
23
use wadray::{Ray, Wad};
34

@@ -16,6 +17,17 @@ pub struct RecoveryModeInfo {
1617
pub buffer_ltv: Ray, // Thresholds are scaled once Shrine's LTV exceeds this
1718
}
1819

20+
#[derive(Copy, Debug, Drop, Serde)]
21+
pub struct TroveInfo {
22+
pub trove_id: u64,
23+
pub owner: ContractAddress,
24+
pub max_forge_amt: Wad,
25+
pub is_liquidatable: bool,
26+
pub is_absorbable: bool,
27+
pub health: Health,
28+
pub assets: Span<TroveAssetInfo>,
29+
}
30+
1931
#[derive(Copy, Debug, Drop, Serde)]
2032
pub struct TroveAssetInfo {
2133
pub shrine_asset_info: ShrineAssetInfo,

0 commit comments

Comments
 (0)