1pub(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#[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#[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#[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#[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#[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}