Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions contracts/settlement/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -405,6 +405,19 @@ impl CalloraSettlement {
result
}

/// Return the pending admin address, or `None` if no transfer is in progress.
///
/// Integrators can poll this to detect an in-flight two-step admin handover
/// before `accept_admin` is called.
///
/// # Returns
/// `Some(Address)` of the nominated admin, or `None` when no transfer is pending.
pub fn get_pending_admin(env: Env) -> Option<Address> {
env.storage()
.instance()
.get(&StorageKey::PendingAdmin)
}

/// Nominate a new admin (admin only).
///
/// # Arguments
Expand Down
32 changes: 32 additions & 0 deletions contracts/settlement/src/test.rs
Original file line number Diff line number Diff line change
Expand Up @@ -324,6 +324,38 @@ mod settlement_tests {
assert_eq!(client.get_admin(), new_admin);
}

#[test]
fn test_get_pending_admin_none_before_nomination() {
let env = Env::default();
env.mock_all_auths();
let admin = Address::generate(&env);
let vault = Address::generate(&env);
let addr = env.register(CalloraSettlement, ());
let client = CalloraSettlementClient::new(&env, &addr);
client.init(&admin, &vault);

assert_eq!(client.get_pending_admin(), None);
}

#[test]
fn test_get_pending_admin_some_after_nomination() {
let env = Env::default();
env.mock_all_auths();
let admin = Address::generate(&env);
let vault = Address::generate(&env);
let new_admin = Address::generate(&env);
let addr = env.register(CalloraSettlement, ());
let client = CalloraSettlementClient::new(&env, &addr);
client.init(&admin, &vault);

client.set_admin(&admin, &new_admin);
assert_eq!(client.get_pending_admin(), Some(new_admin.clone()));

// clears after acceptance
client.accept_admin();
assert_eq!(client.get_pending_admin(), None);
}

#[test]
#[should_panic(expected = "no admin transfer pending")]
fn test_accept_admin_fails_if_not_nominated() {
Expand Down
10 changes: 10 additions & 0 deletions docs/interfaces/settlement.json
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,16 @@
"events": []
},

{
"name": "get_pending_admin",
"description": "Return the pending admin address, or null if no two-step transfer is in progress. Integrators can poll this to detect an in-flight admin handover before accept_admin is called.",
"access": "any",
"params": [],
"returns": "Address | null",
"panics": [],
"events": []
},

{
"name": "get_vault",
"description": "Return the registered vault contract address.",
Expand Down
Loading