@@ -59,22 +64,18 @@ export const SecurityCouncilCard = ({
className={"lg:bg-surface-default flex w-full flex-col gap-4 lg:p-4"}
>
-
- SECURITY COUNCIL
+
+ {label}
-
+
Multisig:
- {securityCouncil.multisig.threshold}/
- {securityCouncil.multisig.signers}
+ {multisig.threshold}/{multisig.signers}
required for transactions
@@ -83,7 +84,7 @@ export const SecurityCouncilCard = ({
-
+
diff --git a/apps/dashboard/shared/dao-config/comp.ts b/apps/dashboard/shared/dao-config/comp.ts
index 7606934c6..d1125b4c5 100644
--- a/apps/dashboard/shared/dao-config/comp.ts
+++ b/apps/dashboard/shared/dao-config/comp.ts
@@ -12,6 +12,7 @@ import {
GovernanceImplementationEnum,
RiskAreaEnum,
} from "@/shared/types/enums";
+import { calculateMonthsBefore } from "@/shared/utils/calculateMonthsBefore";
export const COMP: DaoConfiguration = {
name: "Compound",
@@ -48,6 +49,30 @@ export const COMP: DaoConfiguration = {
quorumCalculation: QUORUM_CALCULATION_TYPES.COMPOUND,
proposalThreshold: "25K $COMP",
},
+ securityCouncil: {
+ isActive: true,
+ label: "Proposal Guardian",
+ // CompoundGovernor.proposalGuardian() -> Compound Community Multisig,
+ // expiry 1898467200 (2030-02-28 00:00:00 UTC), last extended 2026-02-19.
+ vetoCouncilAddress: "0xbbf3f1421D886E9b2c5D716B5192aC998af2012c",
+ multisig: {
+ threshold: 5,
+ signers: 9,
+ externalLink:
+ "https://app.safe.global/home?safe=eth:0xbbf3f1421D886E9b2c5D716B5192aC998af2012c",
+ description:
+ "The Proposal Guardian is the Compound Community Multisig, with nine signers needing five signatures to cancel a proposal on the Governor contract.",
+ },
+ expiration: {
+ startDate: "February 19, 2026",
+ date: "February 28, 2030",
+ timestamp: 1898467200,
+ alertExpiration: calculateMonthsBefore({
+ monthsBeforeTimestamp: 3,
+ timestamp: 1898467200,
+ }),
+ },
+ },
},
attackProfitability: {
riskLevel: RiskLevel.HIGH,
@@ -153,12 +178,12 @@ export const COMP: DaoConfiguration = {
GovernanceImplementationEnum.SECURITY_COUNCIL
].description,
requirements: [
- "The Compound Security Council needs to raise the threshold to 75% for approvals on their multisig to be considered Low Risk.",
+ "The Compound Proposal Guardian needs to raise the threshold to 75% for approvals on their multisig to be considered Low Risk.",
],
currentSetting:
"Compound has the Proposal Guardian, a multisig responsible for canceling malicious proposals.",
impact:
- "The Security Council can protect the DAO from malicious proposals by canceling them after the 4/8 multisig approval.",
+ "The Proposal Guardian can protect the DAO from malicious proposals by canceling them after the 5/9 multisig approval.",
recommendedSetting:
RECOMMENDED_SETTINGS[GovernanceImplementationEnum.SECURITY_COUNCIL],
nextStep:
@@ -216,7 +241,7 @@ export const COMP: DaoConfiguration = {
currentSetting:
"There is a veto strategy controlled by the Compound DAO.",
impact:
- "Compound can veto malicious proposals with the Security Council.",
+ "Compound can veto malicious proposals with the Proposal Guardian.",
recommendedSetting:
RECOMMENDED_SETTINGS[GovernanceImplementationEnum.VETO_STRATEGY],
nextStep: "The parameter is in its lowest-risk condition.",
diff --git a/apps/dashboard/shared/dao-config/ens.ts b/apps/dashboard/shared/dao-config/ens.ts
index ec87114de..72daeee1f 100644
--- a/apps/dashboard/shared/dao-config/ens.ts
+++ b/apps/dashboard/shared/dao-config/ens.ts
@@ -54,20 +54,22 @@ export const ENS: DaoConfiguration = {
},
securityCouncil: {
isActive: true,
- vetoCouncilAddress: "0x552DF471a4c7Fea11Ea8d7a7b0Acc6989b902a95",
+ // SecurityCouncil contract granted PROPOSER_ROLE on the ENS timelock on
+ // 2026-07-22; expiration() returns 1847389751 (2028-07-16 19:49:11 UTC).
+ vetoCouncilAddress: "0x2acBf518b3759f6e1fA163294eda55bF1d0ae051",
multisig: {
- threshold: 4,
+ threshold: 5,
signers: 8,
externalLink:
- "https://app.safe.global/home?safe=eth:0xaA5cD05f6B62C3af58AE9c4F3F7A2aCC2Cdc2Cc7",
+ "https://app.safe.global/home?safe=eth:0x7101B78638e34444F0a5AdE9e1149fbEeC029931",
},
expiration: {
- startDate: "July 1, 2024",
- date: "July 26 2026",
- timestamp: 1784919179,
+ startDate: "July 22, 2026",
+ date: "July 16, 2028",
+ timestamp: 1847389751,
alertExpiration: calculateMonthsBefore({
monthsBeforeTimestamp: 3,
- timestamp: 1784919179,
+ timestamp: 1847389751,
}),
},
},
@@ -190,7 +192,7 @@ export const ENS: DaoConfiguration = {
GovernanceImplementationEnum.SECURITY_COUNCIL
].description,
currentSetting:
- "ENS has a Security Council, managed by a 4/8 multisig, whose authority to cancel proposals must be renewed every two years (and will expire in July 2026).",
+ "ENS has a Security Council, managed by a 5/8 multisig, whose authority to cancel proposals must be renewed every two years (and will expire in July 2028).",
impact: "ENS can veto malicious proposals with the Security Council.",
recommendedSetting:
RECOMMENDED_SETTINGS[GovernanceImplementationEnum.SECURITY_COUNCIL],
diff --git a/apps/dashboard/shared/dao-config/types.ts b/apps/dashboard/shared/dao-config/types.ts
index ca96aded1..9ddf64727 100644
--- a/apps/dashboard/shared/dao-config/types.ts
+++ b/apps/dashboard/shared/dao-config/types.ts
@@ -97,11 +97,20 @@ export interface DaoOverviewConfig {
};
securityCouncil?: {
isActive: boolean;
+ /** Card heading (rendered uppercase). Defaults to "Security Council". */
+ label?: string;
vetoCouncilAddress: string;
multisig: {
threshold: number;
signers: number;
externalLink: string;
+ /**
+ * Tooltip next to the multisig link. Falls back to a generated
+ * description that assumes cancellation happens on the Timelock, so set
+ * this explicitly whenever the cancellation path is somewhere else
+ * (Compound's guardian, for instance, cancels on the Governor).
+ */
+ description?: string;
};
expiration: {
date: string;