Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/renew-ens-security-council-add-comp-guardian.md
Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,9 @@ export const ProgressBar = ({
<p className="text-error flex-nowrap text-xs font-medium leading-4">
Danger Zone
</p>
<TooltipInfo text="This means that the Security Council is approaching expiration and it might be good to start the process of renewal." />
<TooltipInfo
text={`This means that the ${daoOverview.securityCouncil?.label ?? "Security Council"} is approaching expiration and it might be good to start the process of renewal.`}
/>
</div>
)}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,29 +52,30 @@ 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 (
<div className="flex flex-col gap-5">
<div className="border-x-1 border-inverted mx-5">
<div
className={"lg:bg-surface-default flex w-full flex-col gap-4 lg:p-4"}
>
<div className="flex w-full flex-col text-[13px] lg:flex-row lg:items-center lg:gap-2">
<p className="text-primary flex items-center gap-2 font-mono font-medium tracking-wider lg:px-0">
SECURITY COUNCIL
<p className="text-primary flex items-center gap-2 font-mono font-medium uppercase tracking-wider lg:px-0">
{label}
</p>
<div className="hidden size-1 items-center rounded-full bg-[#3F3F46] lg:flex" />
<div className="flex items-center gap-1.5">
<UnderlinedLink
href={securityCouncil.multisig.externalLink}
openInNewTab
>
<UnderlinedLink href={multisig.externalLink} openInNewTab>
<div className="flex items-center gap-2">
<div className="flex items-center gap-1">
<Key className="text-link size-3.5" /> Multisig:
</div>
<span>
{securityCouncil.multisig.threshold}/
{securityCouncil.multisig.signers}
{multisig.threshold}/{multisig.signers}
</span>
<span className="hidden lg:inline">
required for transactions
Expand All @@ -83,7 +84,7 @@ export const SecurityCouncilCard = ({
</div>
</UnderlinedLink>
<div className="hidden lg:flex">
<TooltipInfo text="The security council is set up as a multisig with eight signers, needing the signature of 4 out of 8 to execute a cancel transaction for an approved proposal in the Timelock contract." />
<TooltipInfo text={multisigDescription} />
</div>
</div>
</div>
Expand Down
31 changes: 28 additions & 3 deletions apps/dashboard/shared/dao-config/comp.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import {
GovernanceImplementationEnum,
RiskAreaEnum,
} from "@/shared/types/enums";
import { calculateMonthsBefore } from "@/shared/utils/calculateMonthsBefore";

export const COMP: DaoConfiguration = {
name: "Compound",
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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:
Expand Down Expand Up @@ -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.",
Expand Down
16 changes: 9 additions & 7 deletions apps/dashboard/shared/dao-config/ens.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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,

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Refresh the ENS Security Council risk copy

When users open the Security Council detail in ENS Risk Analysis, the unchanged governanceImplementation.fields[SECURITY_COUNCIL].currentSetting in this same file still says the council is a 4/8 multisig expiring in July 2026. This update now configures a 5/8 council expiring in July 2028, so the overview card and risk-analysis drawer present contradictory council details; update the current-setting copy as part of the renewal.

Useful? React with 👍 / 👎.

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,
}),
},
},
Expand Down
9 changes: 9 additions & 0 deletions apps/dashboard/shared/dao-config/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Loading