You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
#88 fixes #70 by making manager delegation two-step (propose_manager → accept_manager), so a never-authorized address can no longer gain or lock event control. That closes the reported vulnerability.
Once a manager has accepted, resolve_manager returns that manager, so only the manager — not the owner — can propose_manager or cancel_pending_manager thereafter (both gate on resolve_manager(...).require_auth()). If that accepted manager later loses its key or goes dark, the owner cannot reclaim rotation authority, while the manager still holds select_winners / cancel authority over the escrow.
This is pre-existing behavior — the old set_manager had the same manager-only-rotation property once a manager was set — and it is not a regression introduced by #88. It is a distinct "delegated authority can get stuck" case that the two-step flow does not address.
Proposed change
Let the owner always retain override authority over manager rotation, so the funder can reclaim a delegated event:
Allow propose_manager and cancel_pending_manager to be authorized by the owner OR the current manager, rather than resolve_manager alone (which resolves to the manager once set).
accept_manager stays as-is: the proposed target must sign, so this does not weaken the acceptance guarantee.
Design questions (decide before implementing)
Owner override is a deliberate authority-model choice: it lets an owner unilaterally yank a legitimately delegated manager. Confirm that is desired (it usually is for a funder-owned escrow, but it is a policy call).
Consider whether owner override should also be able to clear a stuck/active manager back to owner-default (not just re-propose), e.g. an owner-only reset_manager that removes the manager key so resolve_manager falls back to the owner. That is the actual "unstick" primitive; re-propose still needs a new party to accept.
Contract ·
boundless-events· follow-up to #70 / #88 · P1Context
#88 fixes #70 by making manager delegation two-step (
propose_manager→accept_manager), so a never-authorized address can no longer gain or lock event control. That closes the reported vulnerability.Remaining gap (out of #70's scope)
Once a manager has accepted,
resolve_managerreturns that manager, so only the manager — not the owner — canpropose_managerorcancel_pending_managerthereafter (both gate onresolve_manager(...).require_auth()). If that accepted manager later loses its key or goes dark, the owner cannot reclaim rotation authority, while the manager still holdsselect_winners/ cancel authority over the escrow.This is pre-existing behavior — the old
set_managerhad the same manager-only-rotation property once a manager was set — and it is not a regression introduced by #88. It is a distinct "delegated authority can get stuck" case that the two-step flow does not address.Proposed change
Let the owner always retain override authority over manager rotation, so the funder can reclaim a delegated event:
propose_managerandcancel_pending_managerto be authorized by the owner OR the current manager, rather thanresolve_manageralone (which resolves to the manager once set).accept_managerstays as-is: the proposed target must sign, so this does not weaken the acceptance guarantee.Design questions (decide before implementing)
reset_managerthat removes the manager key soresolve_managerfalls back to the owner. That is the actual "unstick" primitive; re-propose still needs a new party to accept.Notes