Skip to main content

ic_query/nns/proposals/report/model/
selection.rs

1//! Module: nns::proposals::report::model::selection
2//!
3//! Responsibility: NNS proposal filter, sort, and protocol vocabulary.
4//! Does not own: request DTOs, serialized report DTOs, or report rendering.
5//! Boundary: keeps public selection types and their canonical labels/codes together.
6
7pub(in crate::nns) const NNS_PROPOSAL_SORT_API_LABEL: &str = "api";
8pub(in crate::nns) const NNS_PROPOSAL_SORT_ID_LABEL: &str = "id";
9pub(in crate::nns) const NNS_PROPOSAL_SORT_STATUS_LABEL: &str = "status";
10pub(in crate::nns) const NNS_PROPOSAL_SORT_REWARD_STATUS_LABEL: &str = "reward-status";
11pub(in crate::nns) const NNS_PROPOSAL_SORT_TOPIC_LABEL: &str = "topic";
12pub(in crate::nns) const NNS_PROPOSAL_SORT_PROPOSER_LABEL: &str = "proposer";
13pub(in crate::nns) const NNS_PROPOSAL_SORT_TITLE_LABEL: &str = "title";
14pub(in crate::nns) const NNS_PROPOSAL_SORT_ACTION_LABEL: &str = "action";
15pub(in crate::nns) const NNS_PROPOSAL_SORT_YES_LABEL: &str = "yes";
16pub(in crate::nns) const NNS_PROPOSAL_SORT_NO_LABEL: &str = "no";
17pub(in crate::nns) const NNS_PROPOSAL_SORT_TOTAL_VOTES_LABEL: &str = "total-votes";
18pub(in crate::nns) const NNS_PROPOSAL_SORT_TALLY_TIME_LABEL: &str = "tally-time";
19pub(in crate::nns) const NNS_PROPOSAL_SORT_VOTING_POWER_LABEL: &str = "voting-power";
20pub(in crate::nns) const NNS_PROPOSAL_SORT_BALLOTS_LABEL: &str = "ballots";
21pub(in crate::nns) const NNS_PROPOSAL_SORT_REJECT_COST_LABEL: &str = "reject-cost";
22pub(in crate::nns) const NNS_PROPOSAL_SORT_REWARD_ROUND_LABEL: &str = "reward-round";
23pub(in crate::nns) const NNS_PROPOSAL_SORT_PROPOSED_LABEL: &str = "proposed";
24pub(in crate::nns) const NNS_PROPOSAL_SORT_DEADLINE_LABEL: &str = "deadline";
25pub(in crate::nns) const NNS_PROPOSAL_SORT_DECIDED_LABEL: &str = "decided";
26pub(in crate::nns) const NNS_PROPOSAL_SORT_EXECUTED_LABEL: &str = "executed";
27pub(in crate::nns) const NNS_PROPOSAL_SORT_FAILED_LABEL: &str = "failed";
28pub(in crate::nns) const NNS_PROPOSAL_SORT_ASC_LABEL: &str = "asc";
29pub(in crate::nns) const NNS_PROPOSAL_SORT_DESC_LABEL: &str = "desc";
30pub(in crate::nns) const NNS_PROPOSAL_SORT_NONE_LABEL: &str = "none";
31
32pub(in crate::nns) const NNS_PROPOSAL_STATUS_ANY_LABEL: &str = "any";
33pub(in crate::nns) const NNS_PROPOSAL_STATUS_OPEN_LABEL: &str = "open";
34pub(in crate::nns) const NNS_PROPOSAL_STATUS_REJECTED_LABEL: &str = "rejected";
35pub(in crate::nns) const NNS_PROPOSAL_STATUS_ADOPTED_LABEL: &str = "adopted";
36pub(in crate::nns) const NNS_PROPOSAL_STATUS_EXECUTED_LABEL: &str = "executed";
37pub(in crate::nns) const NNS_PROPOSAL_STATUS_FAILED_LABEL: &str = "failed";
38#[cfg(feature = "host")]
39pub(in crate::nns) const NNS_PROPOSAL_STATUS_UNSPECIFIED_LABEL: &str = "unspecified";
40#[cfg(feature = "host")]
41pub(in crate::nns) const NNS_PROPOSAL_STATUS_OPEN_CODE: i32 = 1;
42#[cfg(feature = "host")]
43pub(in crate::nns) const NNS_PROPOSAL_STATUS_REJECTED_CODE: i32 = 2;
44#[cfg(feature = "host")]
45pub(in crate::nns) const NNS_PROPOSAL_STATUS_ADOPTED_CODE: i32 = 3;
46#[cfg(feature = "host")]
47pub(in crate::nns) const NNS_PROPOSAL_STATUS_EXECUTED_CODE: i32 = 4;
48#[cfg(feature = "host")]
49pub(in crate::nns) const NNS_PROPOSAL_STATUS_FAILED_CODE: i32 = 5;
50
51pub(in crate::nns) const NNS_PROPOSAL_REWARD_STATUS_ACCEPT_VOTES_LABEL: &str = "accept-votes";
52pub(in crate::nns) const NNS_PROPOSAL_REWARD_STATUS_READY_TO_SETTLE_LABEL: &str = "ready-to-settle";
53pub(in crate::nns) const NNS_PROPOSAL_REWARD_STATUS_SETTLED_LABEL: &str = "settled";
54pub(in crate::nns) const NNS_PROPOSAL_REWARD_STATUS_INELIGIBLE_LABEL: &str = "ineligible";
55pub(in crate::nns) const NNS_PROPOSAL_REWARD_STATUS_ANY_LABEL: &str = "any";
56#[cfg(feature = "host")]
57pub(in crate::nns) const NNS_PROPOSAL_REWARD_STATUS_UNSPECIFIED_LABEL: &str = "unspecified";
58#[cfg(feature = "host")]
59pub(in crate::nns) const NNS_PROPOSAL_REWARD_STATUS_ACCEPT_VOTES_CODE: i32 = 1;
60#[cfg(feature = "host")]
61pub(in crate::nns) const NNS_PROPOSAL_REWARD_STATUS_READY_TO_SETTLE_CODE: i32 = 2;
62#[cfg(feature = "host")]
63pub(in crate::nns) const NNS_PROPOSAL_REWARD_STATUS_SETTLED_CODE: i32 = 3;
64#[cfg(feature = "host")]
65pub(in crate::nns) const NNS_PROPOSAL_REWARD_STATUS_INELIGIBLE_CODE: i32 = 4;
66
67#[cfg(feature = "host")]
68pub(in crate::nns) const NNS_PROPOSAL_VOTE_UNSPECIFIED_LABEL: &str = "unspecified";
69#[cfg(feature = "host")]
70pub(in crate::nns) const NNS_PROPOSAL_VOTE_YES_LABEL: &str = "yes";
71#[cfg(feature = "host")]
72pub(in crate::nns) const NNS_PROPOSAL_VOTE_NO_LABEL: &str = "no";
73#[cfg(feature = "host")]
74pub(in crate::nns) const NNS_PROPOSAL_VOTE_YES_CODE: i32 = 1;
75#[cfg(feature = "host")]
76pub(in crate::nns) const NNS_PROPOSAL_VOTE_NO_CODE: i32 = 2;
77
78pub(in crate::nns) const NNS_PROPOSAL_TOPIC_ANY_LABEL: &str = "any";
79pub(in crate::nns) const NNS_PROPOSAL_TOPIC_NEURON_MANAGEMENT_LABEL: &str = "neuron-management";
80pub(in crate::nns) const NNS_PROPOSAL_TOPIC_EXCHANGE_RATE_LABEL: &str = "exchange-rate";
81pub(in crate::nns) const NNS_PROPOSAL_TOPIC_NETWORK_ECONOMICS_LABEL: &str = "network-economics";
82pub(in crate::nns) const NNS_PROPOSAL_TOPIC_GOVERNANCE_LABEL: &str = "governance";
83pub(in crate::nns) const NNS_PROPOSAL_TOPIC_NODE_ADMIN_LABEL: &str = "node-admin";
84pub(in crate::nns) const NNS_PROPOSAL_TOPIC_PARTICIPANT_MANAGEMENT_LABEL: &str =
85    "participant-management";
86pub(in crate::nns) const NNS_PROPOSAL_TOPIC_SUBNET_MANAGEMENT_LABEL: &str = "subnet-management";
87pub(in crate::nns) const NNS_PROPOSAL_TOPIC_NETWORK_CANISTER_MANAGEMENT_LABEL: &str =
88    "network-canister-management";
89pub(in crate::nns) const NNS_PROPOSAL_TOPIC_KYC_LABEL: &str = "kyc";
90pub(in crate::nns) const NNS_PROPOSAL_TOPIC_NODE_PROVIDER_REWARDS_LABEL: &str =
91    "node-provider-rewards";
92pub(in crate::nns) const NNS_PROPOSAL_TOPIC_IC_OS_VERSION_DEPLOYMENT_LABEL: &str =
93    "ic-os-version-deployment";
94pub(in crate::nns) const NNS_PROPOSAL_TOPIC_IC_OS_VERSION_ELECTION_LABEL: &str =
95    "ic-os-version-election";
96pub(in crate::nns) const NNS_PROPOSAL_TOPIC_SNS_AND_COMMUNITY_FUND_LABEL: &str =
97    "sns-and-community-fund";
98pub(in crate::nns) const NNS_PROPOSAL_TOPIC_API_BOUNDARY_NODE_MANAGEMENT_LABEL: &str =
99    "api-boundary-node-management";
100pub(in crate::nns) const NNS_PROPOSAL_TOPIC_SUBNET_RENTAL_LABEL: &str = "subnet-rental";
101pub(in crate::nns) const NNS_PROPOSAL_TOPIC_APPLICATION_CANISTER_MANAGEMENT_LABEL: &str =
102    "application-canister-management";
103pub(in crate::nns) const NNS_PROPOSAL_TOPIC_PROTOCOL_CANISTER_MANAGEMENT_LABEL: &str =
104    "protocol-canister-management";
105#[cfg(feature = "host")]
106pub(in crate::nns) const NNS_PROPOSAL_TOPIC_UNSPECIFIED_LABEL: &str = "unspecified";
107#[cfg(feature = "host")]
108pub(in crate::nns) const NNS_PROPOSAL_TOPIC_NEURON_MANAGEMENT_CODE: i32 = 1;
109#[cfg(feature = "host")]
110pub(in crate::nns) const NNS_PROPOSAL_TOPIC_EXCHANGE_RATE_CODE: i32 = 2;
111#[cfg(feature = "host")]
112pub(in crate::nns) const NNS_PROPOSAL_TOPIC_NETWORK_ECONOMICS_CODE: i32 = 3;
113#[cfg(feature = "host")]
114pub(in crate::nns) const NNS_PROPOSAL_TOPIC_GOVERNANCE_CODE: i32 = 4;
115#[cfg(feature = "host")]
116pub(in crate::nns) const NNS_PROPOSAL_TOPIC_NODE_ADMIN_CODE: i32 = 5;
117#[cfg(feature = "host")]
118pub(in crate::nns) const NNS_PROPOSAL_TOPIC_PARTICIPANT_MANAGEMENT_CODE: i32 = 6;
119#[cfg(feature = "host")]
120pub(in crate::nns) const NNS_PROPOSAL_TOPIC_SUBNET_MANAGEMENT_CODE: i32 = 7;
121#[cfg(feature = "host")]
122pub(in crate::nns) const NNS_PROPOSAL_TOPIC_NETWORK_CANISTER_MANAGEMENT_CODE: i32 = 8;
123#[cfg(feature = "host")]
124pub(in crate::nns) const NNS_PROPOSAL_TOPIC_KYC_CODE: i32 = 9;
125#[cfg(feature = "host")]
126pub(in crate::nns) const NNS_PROPOSAL_TOPIC_NODE_PROVIDER_REWARDS_CODE: i32 = 10;
127#[cfg(feature = "host")]
128pub(in crate::nns) const NNS_PROPOSAL_TOPIC_IC_OS_VERSION_DEPLOYMENT_CODE: i32 = 12;
129#[cfg(feature = "host")]
130pub(in crate::nns) const NNS_PROPOSAL_TOPIC_IC_OS_VERSION_ELECTION_CODE: i32 = 13;
131#[cfg(feature = "host")]
132pub(in crate::nns) const NNS_PROPOSAL_TOPIC_SNS_AND_COMMUNITY_FUND_CODE: i32 = 14;
133#[cfg(feature = "host")]
134pub(in crate::nns) const NNS_PROPOSAL_TOPIC_API_BOUNDARY_NODE_MANAGEMENT_CODE: i32 = 15;
135#[cfg(feature = "host")]
136pub(in crate::nns) const NNS_PROPOSAL_TOPIC_SUBNET_RENTAL_CODE: i32 = 16;
137#[cfg(feature = "host")]
138pub(in crate::nns) const NNS_PROPOSAL_TOPIC_APPLICATION_CANISTER_MANAGEMENT_CODE: i32 = 17;
139#[cfg(feature = "host")]
140pub(in crate::nns) const NNS_PROPOSAL_TOPIC_PROTOCOL_CANISTER_MANAGEMENT_CODE: i32 = 18;
141
142///
143/// NnsProposalListSort
144///
145/// Report-model sort selector for NNS proposal listings.
146///
147
148#[derive(Clone, Copy, Debug, Default, Eq, PartialEq)]
149pub enum NnsProposalListSort {
150    #[default]
151    Api,
152    Id,
153    Status,
154    RewardStatus,
155    Topic,
156    Proposer,
157    Title,
158    Action,
159    Yes,
160    No,
161    TotalVotes,
162    TallyTime,
163    VotingPower,
164    Ballots,
165    RejectCost,
166    RewardRound,
167    Proposed,
168    Deadline,
169    Decided,
170    Executed,
171    Failed,
172}
173
174impl NnsProposalListSort {
175    #[must_use]
176    pub const fn as_str(self) -> &'static str {
177        match self {
178            Self::Api => NNS_PROPOSAL_SORT_API_LABEL,
179            Self::Id => NNS_PROPOSAL_SORT_ID_LABEL,
180            Self::Status => NNS_PROPOSAL_SORT_STATUS_LABEL,
181            Self::RewardStatus => NNS_PROPOSAL_SORT_REWARD_STATUS_LABEL,
182            Self::Topic => NNS_PROPOSAL_SORT_TOPIC_LABEL,
183            Self::Proposer => NNS_PROPOSAL_SORT_PROPOSER_LABEL,
184            Self::Title => NNS_PROPOSAL_SORT_TITLE_LABEL,
185            Self::Action => NNS_PROPOSAL_SORT_ACTION_LABEL,
186            Self::Yes => NNS_PROPOSAL_SORT_YES_LABEL,
187            Self::No => NNS_PROPOSAL_SORT_NO_LABEL,
188            Self::TotalVotes => NNS_PROPOSAL_SORT_TOTAL_VOTES_LABEL,
189            Self::TallyTime => NNS_PROPOSAL_SORT_TALLY_TIME_LABEL,
190            Self::VotingPower => NNS_PROPOSAL_SORT_VOTING_POWER_LABEL,
191            Self::Ballots => NNS_PROPOSAL_SORT_BALLOTS_LABEL,
192            Self::RejectCost => NNS_PROPOSAL_SORT_REJECT_COST_LABEL,
193            Self::RewardRound => NNS_PROPOSAL_SORT_REWARD_ROUND_LABEL,
194            Self::Proposed => NNS_PROPOSAL_SORT_PROPOSED_LABEL,
195            Self::Deadline => NNS_PROPOSAL_SORT_DEADLINE_LABEL,
196            Self::Decided => NNS_PROPOSAL_SORT_DECIDED_LABEL,
197            Self::Executed => NNS_PROPOSAL_SORT_EXECUTED_LABEL,
198            Self::Failed => NNS_PROPOSAL_SORT_FAILED_LABEL,
199        }
200    }
201
202    #[must_use]
203    pub const fn default_direction(self) -> NnsProposalSortDirection {
204        match self {
205            Self::Status
206            | Self::RewardStatus
207            | Self::Topic
208            | Self::Proposer
209            | Self::Title
210            | Self::Action => NnsProposalSortDirection::Asc,
211            _ => NnsProposalSortDirection::Desc,
212        }
213    }
214
215    #[must_use]
216    pub const fn uses_local_direction(self) -> bool {
217        !matches!(self, Self::Api)
218    }
219
220    #[must_use]
221    pub const fn direction_label(self, direction: NnsProposalSortDirection) -> &'static str {
222        match self {
223            Self::Api => NNS_PROPOSAL_SORT_NONE_LABEL,
224            _ => direction.as_str(),
225        }
226    }
227}
228
229///
230/// NnsProposalSortDirection
231///
232/// Report-model direction selector for local NNS proposal sorting.
233///
234
235#[derive(Clone, Copy, Debug, Default, Eq, PartialEq)]
236pub enum NnsProposalSortDirection {
237    Asc,
238    #[default]
239    Desc,
240}
241
242impl NnsProposalSortDirection {
243    #[must_use]
244    pub const fn as_str(self) -> &'static str {
245        match self {
246            Self::Asc => NNS_PROPOSAL_SORT_ASC_LABEL,
247            Self::Desc => NNS_PROPOSAL_SORT_DESC_LABEL,
248        }
249    }
250}
251
252///
253/// NnsProposalStatusFilter
254///
255/// Report-model status filter for bounded NNS proposal listings.
256///
257
258#[derive(Clone, Copy, Debug, Default, Eq, PartialEq)]
259pub enum NnsProposalStatusFilter {
260    #[default]
261    Any,
262    Open,
263    Rejected,
264    Adopted,
265    Executed,
266    Failed,
267}
268
269///
270/// NnsProposalRewardStatusFilter
271///
272/// Report-model reward status filter for bounded NNS proposal listings.
273///
274
275#[derive(Clone, Copy, Debug, Default, Eq, PartialEq)]
276pub enum NnsProposalRewardStatusFilter {
277    #[default]
278    Any,
279    AcceptVotes,
280    ReadyToSettle,
281    Settled,
282    Ineligible,
283}
284
285impl NnsProposalRewardStatusFilter {
286    #[must_use]
287    pub const fn as_str(self) -> &'static str {
288        match self {
289            Self::Any => NNS_PROPOSAL_REWARD_STATUS_ANY_LABEL,
290            Self::AcceptVotes => NNS_PROPOSAL_REWARD_STATUS_ACCEPT_VOTES_LABEL,
291            Self::ReadyToSettle => NNS_PROPOSAL_REWARD_STATUS_READY_TO_SETTLE_LABEL,
292            Self::Settled => NNS_PROPOSAL_REWARD_STATUS_SETTLED_LABEL,
293            Self::Ineligible => NNS_PROPOSAL_REWARD_STATUS_INELIGIBLE_LABEL,
294        }
295    }
296
297    #[cfg(feature = "host")]
298    pub(in crate::nns) const fn governance_reward_status_code(self) -> Option<i32> {
299        match self {
300            Self::Any => None,
301            Self::AcceptVotes => Some(NNS_PROPOSAL_REWARD_STATUS_ACCEPT_VOTES_CODE),
302            Self::ReadyToSettle => Some(NNS_PROPOSAL_REWARD_STATUS_READY_TO_SETTLE_CODE),
303            Self::Settled => Some(NNS_PROPOSAL_REWARD_STATUS_SETTLED_CODE),
304            Self::Ineligible => Some(NNS_PROPOSAL_REWARD_STATUS_INELIGIBLE_CODE),
305        }
306    }
307}
308
309impl NnsProposalStatusFilter {
310    #[must_use]
311    pub const fn as_str(self) -> &'static str {
312        match self {
313            Self::Any => NNS_PROPOSAL_STATUS_ANY_LABEL,
314            Self::Open => NNS_PROPOSAL_STATUS_OPEN_LABEL,
315            Self::Rejected => NNS_PROPOSAL_STATUS_REJECTED_LABEL,
316            Self::Adopted => NNS_PROPOSAL_STATUS_ADOPTED_LABEL,
317            Self::Executed => NNS_PROPOSAL_STATUS_EXECUTED_LABEL,
318            Self::Failed => NNS_PROPOSAL_STATUS_FAILED_LABEL,
319        }
320    }
321
322    #[cfg(feature = "host")]
323    pub(in crate::nns) const fn governance_status_code(self) -> Option<i32> {
324        match self {
325            Self::Any => None,
326            Self::Open => Some(NNS_PROPOSAL_STATUS_OPEN_CODE),
327            Self::Rejected => Some(NNS_PROPOSAL_STATUS_REJECTED_CODE),
328            Self::Adopted => Some(NNS_PROPOSAL_STATUS_ADOPTED_CODE),
329            Self::Executed => Some(NNS_PROPOSAL_STATUS_EXECUTED_CODE),
330            Self::Failed => Some(NNS_PROPOSAL_STATUS_FAILED_CODE),
331        }
332    }
333}
334
335///
336/// NnsProposalTopicFilter
337///
338/// Report-model topic filter for bounded NNS proposal listings.
339///
340
341#[derive(Clone, Copy, Debug, Default, Eq, PartialEq)]
342pub enum NnsProposalTopicFilter {
343    #[default]
344    Any,
345    NeuronManagement,
346    ExchangeRate,
347    NetworkEconomics,
348    Governance,
349    NodeAdmin,
350    ParticipantManagement,
351    SubnetManagement,
352    NetworkCanisterManagement,
353    Kyc,
354    NodeProviderRewards,
355    IcOsVersionDeployment,
356    IcOsVersionElection,
357    SnsAndCommunityFund,
358    ApiBoundaryNodeManagement,
359    SubnetRental,
360    ApplicationCanisterManagement,
361    ProtocolCanisterManagement,
362}
363
364impl NnsProposalTopicFilter {
365    #[must_use]
366    pub const fn as_str(self) -> &'static str {
367        match self {
368            Self::Any => NNS_PROPOSAL_TOPIC_ANY_LABEL,
369            Self::NeuronManagement => NNS_PROPOSAL_TOPIC_NEURON_MANAGEMENT_LABEL,
370            Self::ExchangeRate => NNS_PROPOSAL_TOPIC_EXCHANGE_RATE_LABEL,
371            Self::NetworkEconomics => NNS_PROPOSAL_TOPIC_NETWORK_ECONOMICS_LABEL,
372            Self::Governance => NNS_PROPOSAL_TOPIC_GOVERNANCE_LABEL,
373            Self::NodeAdmin => NNS_PROPOSAL_TOPIC_NODE_ADMIN_LABEL,
374            Self::ParticipantManagement => NNS_PROPOSAL_TOPIC_PARTICIPANT_MANAGEMENT_LABEL,
375            Self::SubnetManagement => NNS_PROPOSAL_TOPIC_SUBNET_MANAGEMENT_LABEL,
376            Self::NetworkCanisterManagement => NNS_PROPOSAL_TOPIC_NETWORK_CANISTER_MANAGEMENT_LABEL,
377            Self::Kyc => NNS_PROPOSAL_TOPIC_KYC_LABEL,
378            Self::NodeProviderRewards => NNS_PROPOSAL_TOPIC_NODE_PROVIDER_REWARDS_LABEL,
379            Self::IcOsVersionDeployment => NNS_PROPOSAL_TOPIC_IC_OS_VERSION_DEPLOYMENT_LABEL,
380            Self::IcOsVersionElection => NNS_PROPOSAL_TOPIC_IC_OS_VERSION_ELECTION_LABEL,
381            Self::SnsAndCommunityFund => NNS_PROPOSAL_TOPIC_SNS_AND_COMMUNITY_FUND_LABEL,
382            Self::ApiBoundaryNodeManagement => {
383                NNS_PROPOSAL_TOPIC_API_BOUNDARY_NODE_MANAGEMENT_LABEL
384            }
385            Self::SubnetRental => NNS_PROPOSAL_TOPIC_SUBNET_RENTAL_LABEL,
386            Self::ApplicationCanisterManagement => {
387                NNS_PROPOSAL_TOPIC_APPLICATION_CANISTER_MANAGEMENT_LABEL
388            }
389            Self::ProtocolCanisterManagement => {
390                NNS_PROPOSAL_TOPIC_PROTOCOL_CANISTER_MANAGEMENT_LABEL
391            }
392        }
393    }
394
395    #[cfg(feature = "host")]
396    pub(in crate::nns) const fn topic_code(self) -> Option<i32> {
397        match self {
398            Self::Any => None,
399            Self::NeuronManagement => Some(NNS_PROPOSAL_TOPIC_NEURON_MANAGEMENT_CODE),
400            Self::ExchangeRate => Some(NNS_PROPOSAL_TOPIC_EXCHANGE_RATE_CODE),
401            Self::NetworkEconomics => Some(NNS_PROPOSAL_TOPIC_NETWORK_ECONOMICS_CODE),
402            Self::Governance => Some(NNS_PROPOSAL_TOPIC_GOVERNANCE_CODE),
403            Self::NodeAdmin => Some(NNS_PROPOSAL_TOPIC_NODE_ADMIN_CODE),
404            Self::ParticipantManagement => Some(NNS_PROPOSAL_TOPIC_PARTICIPANT_MANAGEMENT_CODE),
405            Self::SubnetManagement => Some(NNS_PROPOSAL_TOPIC_SUBNET_MANAGEMENT_CODE),
406            Self::NetworkCanisterManagement => {
407                Some(NNS_PROPOSAL_TOPIC_NETWORK_CANISTER_MANAGEMENT_CODE)
408            }
409            Self::Kyc => Some(NNS_PROPOSAL_TOPIC_KYC_CODE),
410            Self::NodeProviderRewards => Some(NNS_PROPOSAL_TOPIC_NODE_PROVIDER_REWARDS_CODE),
411            Self::IcOsVersionDeployment => Some(NNS_PROPOSAL_TOPIC_IC_OS_VERSION_DEPLOYMENT_CODE),
412            Self::IcOsVersionElection => Some(NNS_PROPOSAL_TOPIC_IC_OS_VERSION_ELECTION_CODE),
413            Self::SnsAndCommunityFund => Some(NNS_PROPOSAL_TOPIC_SNS_AND_COMMUNITY_FUND_CODE),
414            Self::ApiBoundaryNodeManagement => {
415                Some(NNS_PROPOSAL_TOPIC_API_BOUNDARY_NODE_MANAGEMENT_CODE)
416            }
417            Self::SubnetRental => Some(NNS_PROPOSAL_TOPIC_SUBNET_RENTAL_CODE),
418            Self::ApplicationCanisterManagement => {
419                Some(NNS_PROPOSAL_TOPIC_APPLICATION_CANISTER_MANAGEMENT_CODE)
420            }
421            Self::ProtocolCanisterManagement => {
422                Some(NNS_PROPOSAL_TOPIC_PROTOCOL_CANISTER_MANAGEMENT_CODE)
423            }
424        }
425    }
426}