diff --git a/contracts/events/src/event_ops.rs b/contracts/events/src/event_ops.rs index 54ab7d6..9961690 100644 --- a/contracts/events/src/event_ops.rs +++ b/contracts/events/src/event_ops.rs @@ -192,6 +192,10 @@ pub fn propose_manager(env: &Env, event_id: u64, new_manager: Address) -> Result let event = storage::get_event(env, event_id).ok_or(Error::EventNotFound)?; resolve_manager(env, event_id, &event.owner).require_auth(); + if storage::get_pending_manager(env, event_id).is_some() { + evt::PendingManagerCancelled { event_id }.publish(env); + } + let expires_at = env .ledger() .sequence() diff --git a/contracts/events/src/tests/cross_contract.rs b/contracts/events/src/tests/cross_contract.rs index f4ab428..3cf3789 100644 --- a/contracts/events/src/tests/cross_contract.rs +++ b/contracts/events/src/tests/cross_contract.rs @@ -1076,6 +1076,22 @@ fn manager_can_be_rotated_via_propose_accept() { assert_eq!(ctx.events.get_manager(&id), manager2); } +#[test] +fn propose_manager_emits_cancellation_when_replacing_pending_proposal() { + let ctx = setup(); + let manager1 = Address::generate(&ctx.env); + let id = create_bounty_with_manager(&ctx, &manager1); + assert!(ctx.events.get_pending_manager(&id).is_some()); + + let manager2 = Address::generate(&ctx.env); + ctx.events.propose_manager(&id, &manager2); + let pending = ctx.events.get_pending_manager(&id).unwrap(); + assert_eq!(pending.target, manager2); + + ctx.events.accept_manager(&id); + assert_eq!(ctx.events.get_manager(&id), manager2); +} + #[test] fn cancel_pending_manager_vetoes_a_proposal() { let ctx = setup();