diff --git a/.changeset/renew-ens-security-council-add-comp-guardian.md b/.changeset/renew-ens-security-council-add-comp-guardian.md new file mode 100644 index 000000000..3954a1cd8 --- /dev/null +++ b/.changeset/renew-ens-security-council-add-comp-guardian.md @@ -0,0 +1,5 @@ +--- +"@anticapture/dashboard": minor +--- + +Update the ENS Security Council card to the council seated in July 2026 (5/8 multisig, expires July 16, 2028) and add Compound's Proposal Guardian with its expiration diff --git a/apps/dashboard/features/dao-overview/components/ProgressBar.tsx b/apps/dashboard/features/dao-overview/components/ProgressBar.tsx index cf3ae4ea7..d27fa421b 100644 --- a/apps/dashboard/features/dao-overview/components/ProgressBar.tsx +++ b/apps/dashboard/features/dao-overview/components/ProgressBar.tsx @@ -41,7 +41,9 @@ export const ProgressBar = ({

Danger Zone

- + )} diff --git a/apps/dashboard/features/dao-overview/components/SecurityCouncilCard.tsx b/apps/dashboard/features/dao-overview/components/SecurityCouncilCard.tsx index cb88a0649..75cf7cc86 100644 --- a/apps/dashboard/features/dao-overview/components/SecurityCouncilCard.tsx +++ b/apps/dashboard/features/dao-overview/components/SecurityCouncilCard.tsx @@ -52,6 +52,11 @@ export const SecurityCouncilCard = ({ if (!securityCouncil) return null; + const { label = "Security Council", multisig } = securityCouncil; + const multisigDescription = + multisig.description ?? + `The ${label} is set up as a multisig with ${multisig.signers} signers, needing the signature of ${multisig.threshold} out of ${multisig.signers} to execute a cancel transaction for an approved proposal in the Timelock contract.`; + return (
@@ -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;