From d493f06fa470d7f37e1125ca17862188e1dba62c Mon Sep 17 00:00:00 2001
From: maurelian The Security Council acts as the Guardian, which is authorized to activate the Superchain
Pause functionality and for
-blacklisting dispute
-game contracts.S
Deputy guardian module
However the Security Council cannot be expected to react quickly in an emergency situation. -Therefore the Deputy Guardian module enables the Security Council to share this -authorization with another account.
+Therefore the Deputy Guardian module enables the Security Council to share this authorization with +another account.The module has the following minimal interface:
interface DeputyGuardianModule {
/// @dev The address of the Security Council Safe
@@ -265,8 +265,9 @@
-For simplicity, the DeputyGuardianModule
module does not have functions for updating the safe
and
-deputyGuardian
addresses. If necessary these can be modified by swapping out with a new module.
For simplicity, the DeputyGuardianModule
module does not have functions for updating the safe
+and deputyGuardian
addresses. If necessary these can be modified by swapping out with a new
+module.
The following security properties must be upheld by the DeputyGuardianModule
:
showLiveness()()
method directly in order to prove liveness.Note that the first two methods do not require the owner to actually sign anything. However these mechanisms -are necessary to prevent new owners from being removed before they have had a chance to show liveness.
+Note that the first two methods do not require the owner to actually sign anything. However these +mechanisms are necessary to prevent new owners from being removed before they have had a chance to +show liveness.
A LivenessModule
is also created which does the following:
removeOwners()
that anyone may call to specify one or more owners to be removed from the
-Safe.LivenessGuard.lastLive()
to determine if the signer is
-eligible for removal.removeOwners()
that anyone may call to specify one or more owners to be removed
+from the Safe.LivenessGuard.lastLive()
to determine if the signer is eligible
+for removal.removeSigner()
to remove the non-live signer, and if necessary
reduce the threshold.M/N
is the lowest ratio
-which remains greater than or equal to 75%. Using integer math, this can be expressed as M = (N * 75 + 99) / 100
.M = (N * 75 + 99) / 100
.
The following diagram illustrates the flow for removing a single owner. The verifyFinalState
-box indicates calls to the Safe which ensure the final state is valid.
The following diagram illustrates the flow for removing a single owner. The verifyFinalState
box
+indicates calls to the Safe which ensure the final state is valid.
sequenceDiagram participant User participant LivenessModule @@ -346,8 +349,8 @@Shutdown
In the unlikely event that the signer set (
+owners, then (and only then) is a shutdown mechanism activated which removes the existing signers, +and hands control of the multisig over to a predetermined entity.N
) is reduced below the allowed minimum number of -owners, then (and only then) is a shutdown mechanism activated which removes the existing -signers, and hands control of the multisig over to a predetermined entity.Liveness Security Properties
The following security properties must be upheld:
In the guard
@@ -374,12 +377,13 @@In the module if enough other owners have been removed to activate the shutdown mechanism.
Note: neither the module nor guard attempt to prevent a quorum of owners from removing either the liveness -module or guard. There are legitimate reasons they might wish to do so. Moreover, if such a quorum -of owners exists, there is no benefit to removing them, as they are defacto 'sufficiently live'.
+Note: neither the module nor guard attempt to prevent a quorum of owners from removing either the +liveness module or guard. There are legitimate reasons they might wish to do so. Moreover, if such a +quorum of owners exists, there is no benefit to removing them, as they are defacto 'sufficiently +live'.
The guard has no dependency on the module, and can be used independently to track liveness of -Safe owners.
+The guard has no dependency on the module, and can be used independently to track liveness of Safe +owners.
This means that the module can be removed or replaced without any affect on the guard.
The module however does have a dependency on the guard; if the guard is removed from the Safe, then
the module will no longer be functional and calls to its removeOwners
function will revert.
The Security Council acts as the Guardian, which is authorized to activate the Superchain Pause functionality and for -blacklisting dispute -game contracts.
+blacklisting dispute game +contracts.However the Security Council cannot be expected to react quickly in an emergency situation. -Therefore the Deputy Guardian module enables the Security Council to share this -authorization with another account.
+Therefore the Deputy Guardian module enables the Security Council to share this authorization with +another account.The module has the following minimal interface:
interface DeputyGuardianModule {
/// @dev The address of the Security Council Safe
@@ -10022,8 +10022,9 @@
-For simplicity, the DeputyGuardianModule
module does not have functions for updating the safe
and
-deputyGuardian
addresses. If necessary these can be modified by swapping out with a new module.
For simplicity, the DeputyGuardianModule
module does not have functions for updating the safe
+and deputyGuardian
addresses. If necessary these can be modified by swapping out with a new
+module.
The following security properties must be upheld by the DeputyGuardianModule
:
showLiveness()()
method directly in order to prove liveness.Note that the first two methods do not require the owner to actually sign anything. However these mechanisms -are necessary to prevent new owners from being removed before they have had a chance to show liveness.
+Note that the first two methods do not require the owner to actually sign anything. However these +mechanisms are necessary to prevent new owners from being removed before they have had a chance to +show liveness.
A LivenessModule
is also created which does the following:
removeOwners()
that anyone may call to specify one or more owners to be removed from the
-Safe.LivenessGuard.lastLive()
to determine if the signer is
-eligible for removal.removeOwners()
that anyone may call to specify one or more owners to be removed
+from the Safe.LivenessGuard.lastLive()
to determine if the signer is eligible
+for removal.removeSigner()
to remove the non-live signer, and if necessary
reduce the threshold.M/N
is the lowest ratio
-which remains greater than or equal to 75%. Using integer math, this can be expressed as M = (N * 75 + 99) / 100
.M = (N * 75 + 99) / 100
.
The following diagram illustrates the flow for removing a single owner. The verifyFinalState
-box indicates calls to the Safe which ensure the final state is valid.
The following diagram illustrates the flow for removing a single owner. The verifyFinalState
box
+indicates calls to the Safe which ensure the final state is valid.
sequenceDiagram participant User participant LivenessModule @@ -10103,8 +10106,8 @@Shutdown
In the unlikely event that the signer set (
+owners, then (and only then) is a shutdown mechanism activated which removes the existing signers, +and hands control of the multisig over to a predetermined entity.N
) is reduced below the allowed minimum number of -owners, then (and only then) is a shutdown mechanism activated which removes the existing -signers, and hands control of the multisig over to a predetermined entity.Liveness Security Properties
The following security properties must be upheld:
In the guard
@@ -10131,12 +10134,13 @@In the module if enough other owners have been removed to activate the shutdown mechanism.
Note: neither the module nor guard attempt to prevent a quorum of owners from removing either the liveness -module or guard. There are legitimate reasons they might wish to do so. Moreover, if such a quorum -of owners exists, there is no benefit to removing them, as they are defacto 'sufficiently live'.
+Note: neither the module nor guard attempt to prevent a quorum of owners from removing either the +liveness module or guard. There are legitimate reasons they might wish to do so. Moreover, if such a +quorum of owners exists, there is no benefit to removing them, as they are defacto 'sufficiently +live'.
The guard has no dependency on the module, and can be used independently to track liveness of -Safe owners.
+The guard has no dependency on the module, and can be used independently to track liveness of Safe +owners.
This means that the module can be removed or replaced without any affect on the guard.
The module however does have a dependency on the guard; if the guard is removed from the Safe, then
the module will no longer be functional and calls to its removeOwners
function will revert.