#37607 [SC-Low] bricking redeem function
Previous#37595 [SC-Insight] `require_caller_is_bo_or_tm_or_sp_or_pm` did not emit correct messageNext#37624 [SC-Critical] lock issue bricks the redeem functionality
Last updated
Was this helpful?
Was this helpful?
fn internal_get_pending_asset_reward(address: Identity) -> u64 {
let snapshot_asset = storage.reward_snapshots.get(address).read().asset; // Reverts here
// ...
if (reward_per_unit_staked == 0
|| storage.troves.get(address).read().status != Status::Active) // Also a potential revert
{
// ...
}
}fn get_all_assets_info() -> AssetInfo {
// ...
while (current_borrower != null_identity_address() && current_cr < MCR) {
current_borrower = sorted_troves.get_prev(current_borrower, asset); // Returns null
current_cr = trove_manager.get_current_icr(current_borrower, price); // Reverts here
}
// ...
}diff --git a/contracts/trove-manager-contract/src/main.sw b/contracts/trove-manager-contract/src/main.sw
index 7e02245..dd93eaa 100644
--- a/contracts/trove-manager-contract/src/main.sw
+++ b/contracts/trove-manager-contract/src/main.sw
@@ -183,7 +183,7 @@ impl TroveManager for Contract {
}
#[storage(read, write)]
fn set_trove_status(id: Identity, status: Status) {
- require_caller_is_borrow_operations_contract();
+ // require_caller_is_borrow_operations_contract();
match storage.troves.get(id).try_read() {
Some(trove) => {
let mut new_trove = trove;
@@ -204,7 +204,7 @@ impl TroveManager for Contract {
}
#[storage(read, write)]
fn update_stake_and_total_stakes(id: Identity) -> u64 {
- require_caller_is_borrow_operations_contract();
+ // require_caller_is_borrow_operations_contract();
internal_update_stake_and_total_stakes(id)
}
#[storage(read, write)]
@@ -280,7 +280,7 @@ impl TroveManager for Contract {
}
#[storage(read, write)]
fn update_trove_reward_snapshots(id: Identity) {
- require_caller_is_borrow_operations_contract();
+ // require_caller_is_borrow_operations_contract();
internal_update_trove_reward_snapshots(id);
}
#[storage(read)]
@@ -979,3 +979,24 @@ fn internal_update_system_snapshots_exclude_coll_remainder(coll_remainder: u64)
.total_collateral_snapshot
.write(active_pool_coll - coll_remainder + liquidated_coll);
}
+
+#[test]
+fn test_reverts_for_non_existing_trove() {
+ let price = 3_000_000_000_000;
+
+ let caller = abi(TroveManager, CONTRACT_ID);
+
+ let icr = caller.get_current_icr(null_identity_address(), price);
+}
+
+#[test]
+fn test_works_for_existing_trove() {
+ let price = 3_000_000_000_000;
+
+ let caller = abi(TroveManager, CONTRACT_ID);
+ caller.set_trove_status(null_identity_address(), Status::Active);
+ caller.update_trove_reward_snapshots(null_identity_address());
+ let _ = caller.update_stake_and_total_stakes(null_identity_address());
+
+ let icr = caller.get_current_icr(null_identity_address(), price);
+}
\ No newline at end of file