Skip to main content

nym_mixnet_contract_common/
events.rs

1// Copyright 2022 - Nym Technologies SA <contact@nymtech.net>
2// SPDX-License-Identifier: Apache-2.0
3
4use crate::error::MixnetContractError;
5use crate::gateway::GatewayConfigUpdate;
6use crate::mixnode::{MixNodeConfigUpdate, NodeCostParams};
7use crate::nym_node::Role;
8use crate::reward_params::{ActiveSetUpdate, IntervalRewardParams, IntervalRewardingParamsUpdate};
9use crate::rewarding::RewardDistribution;
10use crate::{BlockHeight, ContractStateParamsUpdate, EpochId, IdentityKeyRef, Interval, NodeId};
11use cosmwasm_std::{Addr, Coin, Decimal, Event, attr};
12pub use nym_contracts_common::events::*;
13use std::fmt::Display;
14
15pub const EVENT_VERSION_PREFIX: &str = "v2_";
16
17pub enum MixnetEventType {
18    MixnodeBonding,
19    NymNodeBonding,
20    NymNodeUnbonding,
21    PendingNymNodeUnbonding,
22    GatewayMigration,
23    MixnodeMigration,
24    PendingPledgeIncrease,
25    PledgeIncrease,
26    PendingPledgeDecrease,
27    PledgeDecrease,
28    GatewayBonding,
29    GatewayUnbonding,
30    PendingMixnodeUnbonding,
31    MixnodeUnbonding,
32    MixnodeConfigUpdate,
33    PendingCostParamsUpdate,
34    CostParamsUpdate,
35    NodeRewarding,
36    WithdrawDelegatorReward,
37    WithdrawOperatorReward,
38    PendingActiveSetUpdate,
39    ActiveSetUpdate,
40    PendingIntervalRewardingParamsUpdate,
41    IntervalRewardingParamsUpdate,
42    PendingDelegation,
43    PendingUndelegation,
44    Delegation,
45    DelegationOnUnbonding,
46    Undelegation,
47    ContractSettingsUpdate,
48    NymNodeSemverUpdate,
49    RewardingValidatorUpdate,
50    BeginEpochTransition,
51    AdvanceEpoch,
52    RoleAssignment,
53    ExecutePendingEpochEvents,
54    ExecutePendingIntervalEvents,
55    ReconcilePendingEvents,
56    PendingIntervalConfigUpdate,
57    IntervalConfigUpdate,
58    GatewayConfigUpdate,
59}
60
61impl From<MixnetEventType> for String {
62    fn from(typ: MixnetEventType) -> Self {
63        typ.to_string()
64    }
65}
66
67impl Display for MixnetEventType {
68    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
69        let event_name = match self {
70            MixnetEventType::MixnodeBonding => "mixnode_bonding",
71            MixnetEventType::NymNodeBonding => "nymnode_bonding",
72            MixnetEventType::NymNodeUnbonding => "nymnode_unbonding",
73            MixnetEventType::PendingNymNodeUnbonding => "pending_nymnode_unbonding",
74            MixnetEventType::GatewayMigration => "gateway_migration",
75            MixnetEventType::MixnodeMigration => "mixnode_migration",
76            MixnetEventType::PendingPledgeIncrease => "pending_pledge_increase",
77            MixnetEventType::PledgeIncrease => "pledge_increase",
78            MixnetEventType::PendingPledgeDecrease => "pending_pledge_decrease",
79            MixnetEventType::PledgeDecrease => "pledge_decrease",
80            MixnetEventType::GatewayBonding => "gateway_bonding",
81            MixnetEventType::GatewayUnbonding => "gateway_unbonding",
82            MixnetEventType::PendingMixnodeUnbonding => "pending_mixnode_unbonding",
83            MixnetEventType::MixnodeConfigUpdate => "mixnode_config_update",
84            MixnetEventType::MixnodeUnbonding => "mixnode_unbonding",
85            MixnetEventType::PendingCostParamsUpdate => "pending_cost_params_update",
86            MixnetEventType::CostParamsUpdate => "cost_params_update",
87            MixnetEventType::NodeRewarding => "node_rewarding",
88            MixnetEventType::WithdrawDelegatorReward => "withdraw_delegator_reward",
89            MixnetEventType::WithdrawOperatorReward => "withdraw_operator_reward",
90            MixnetEventType::PendingActiveSetUpdate => "pending_active_set_update",
91            MixnetEventType::ActiveSetUpdate => "active_set_update",
92            MixnetEventType::PendingIntervalRewardingParamsUpdate => {
93                "pending_interval_rewarding_params_update"
94            }
95            MixnetEventType::IntervalRewardingParamsUpdate => "interval_rewarding_params_update",
96            MixnetEventType::PendingDelegation => "pending_delegation",
97            MixnetEventType::PendingUndelegation => "pending_undelegation",
98            MixnetEventType::Delegation => "delegation",
99            MixnetEventType::Undelegation => "undelegation",
100            MixnetEventType::ContractSettingsUpdate => "settings_update",
101            MixnetEventType::NymNodeSemverUpdate => "nym_node_semver_update",
102            MixnetEventType::RewardingValidatorUpdate => "rewarding_validator_address_update",
103            MixnetEventType::BeginEpochTransition => "beginning_epoch_transition",
104            MixnetEventType::AdvanceEpoch => "advance_epoch",
105            MixnetEventType::RoleAssignment => "role_assignment",
106            MixnetEventType::ExecutePendingEpochEvents => "execute_pending_epoch_events",
107            MixnetEventType::ExecutePendingIntervalEvents => "execute_pending_interval_events",
108            MixnetEventType::ReconcilePendingEvents => "reconcile_pending_events",
109            MixnetEventType::PendingIntervalConfigUpdate => "pending_interval_config_update",
110            MixnetEventType::IntervalConfigUpdate => "interval_config_update",
111            MixnetEventType::DelegationOnUnbonding => "delegation_on_unbonding_node",
112            MixnetEventType::GatewayConfigUpdate => "gateway_config_update",
113        };
114
115        write!(f, "{EVENT_VERSION_PREFIX}{event_name}")
116    }
117}
118
119// attributes that are used in multiple places
120pub const OWNER_KEY: &str = "owner";
121pub const AMOUNT_KEY: &str = "amount";
122pub const ERROR_MESSAGE_KEY: &str = "error_message";
123
124// event-specific attributes
125
126// delegation/undelegation
127pub const DELEGATOR_KEY: &str = "delegator";
128pub const DELEGATION_TARGET_KEY: &str = "delegation_target";
129pub const UNIT_REWARD_KEY: &str = "unit_reward";
130
131// bonding/unbonding
132pub const MIX_ID_KEY: &str = "mix_id";
133pub const NODE_ID_KEY: &str = "node_id";
134pub const NODE_IDENTITY_KEY: &str = "identity";
135
136// settings change
137pub const NEW_MINIMUM_PLEDGE_KEY: &str = "new_minimum_pledge";
138pub const NEW_MINIMUM_DELEGATION_KEY: &str = "new_minimum_delegation";
139pub const NEW_PROFIT_MARGIN_RANGE_KEY: &str = "new_profit_margin_range";
140pub const NEW_INTERVAL_OPERATING_COST_RANGE_KEY: &str = "new_interval_operating_cost_range";
141pub const NEW_VERSION_WEIGHTS_RANGE_KEY: &str = "new_version_weights_range";
142pub const NEW_VERSION_SCORE_FORMULA_PARAMS_KEY: &str = "new_version_score_formula_params";
143pub const NYM_NODE_CURRENT_SEMVER_KEY: &str = "new_current_semver";
144pub const NYM_NODE_CURRENT_SEMVER_ID_KEY: &str = "new_current_semver_id";
145
146pub const OLD_REWARDING_VALIDATOR_ADDRESS_KEY: &str = "old_rewarding_validator_address";
147pub const NEW_REWARDING_VALIDATOR_ADDRESS_KEY: &str = "new_rewarding_validator_address";
148
149pub const UPDATED_MIXNODE_CONFIG_KEY: &str = "updated_mixnode_config";
150pub const UPDATED_GATEWAY_CONFIG_KEY: &str = "updated_gateway_config";
151pub const UPDATED_MIXNODE_COST_PARAMS_KEY: &str = "updated_mixnode_cost_params";
152
153// rewarding
154pub const INTERVAL_KEY: &str = "interval_details";
155pub const OPERATOR_REWARD_KEY: &str = "operator_reward";
156pub const DELEGATES_REWARD_KEY: &str = "delegates_reward";
157pub const APPROXIMATE_TIME_LEFT_SECS_KEY: &str = "approximate_time_left_secs";
158pub const INTERVAL_REWARDING_PARAMS_UPDATE_KEY: &str = "interval_rewarding_params_update";
159pub const UPDATED_INTERVAL_REWARDING_PARAMS_KEY: &str = "updated_interval_rewarding_params";
160pub const PRIOR_DELEGATES_KEY: &str = "prior_delegates";
161pub const PRIOR_UNIT_REWARD_KEY: &str = "prior_unit_reward";
162
163pub const NO_REWARD_REASON_KEY: &str = "no_reward_reason";
164pub const BOND_NOT_FOUND_VALUE: &str = "bond_not_found";
165pub const ZERO_PERFORMANCE_OR_WORK_VALUE: &str = "zero_performance_or_work";
166
167// rewarded set update
168pub const NUM_MIXNODES_KEY: &str = "num_mixnodes";
169pub const NUM_ENTRIES_KEY: &str = "num_entry_gateways";
170pub const NUM_EXITS_KEY: &str = "num_exit_gateways";
171
172pub const CURRENT_EPOCH_KEY: &str = "current_epoch";
173pub const NEW_CURRENT_EPOCH_KEY: &str = "new_current_epoch";
174
175pub const ROLE_KEY: &str = "role";
176pub const NODE_COUNT_KEY: &str = "node_count";
177
178// interval
179pub const EVENTS_EXECUTED_KEY: &str = "number_of_events_executed";
180pub const EVENT_CREATION_HEIGHT_KEY: &str = "created_at";
181pub const REWARDED_SET_NODES_KEY: &str = "rewarded_set_nodes";
182pub const NEW_EPOCHS_DURATION_SECS_KEY: &str = "new_epoch_durations_secs";
183pub const NEW_EPOCHS_IN_INTERVAL: &str = "new_epochs_in_interval";
184
185pub fn new_delegation_event(
186    created_at: BlockHeight,
187    delegator: &Addr,
188    amount: &Coin,
189    mix_id: NodeId,
190    unit_reward: Decimal,
191) -> Event {
192    Event::new(MixnetEventType::Delegation)
193        .add_attribute(EVENT_CREATION_HEIGHT_KEY, created_at.to_string())
194        .add_attribute(DELEGATOR_KEY, delegator)
195        .add_attribute(AMOUNT_KEY, amount.to_string())
196        .add_attribute(DELEGATION_TARGET_KEY, mix_id.to_string())
197        .add_attribute(UNIT_REWARD_KEY, unit_reward.to_string())
198}
199
200pub fn new_delegation_on_unbonded_node_event(delegator: &Addr, mix_id: NodeId) -> Event {
201    Event::new(MixnetEventType::Delegation)
202        .add_attribute(DELEGATOR_KEY, delegator)
203        .add_attribute(DELEGATION_TARGET_KEY, mix_id.to_string())
204}
205
206pub fn new_pending_delegation_event(delegator: &Addr, amount: &Coin, mix_id: NodeId) -> Event {
207    Event::new(MixnetEventType::PendingDelegation)
208        .add_attribute(DELEGATOR_KEY, delegator)
209        .add_attribute(AMOUNT_KEY, amount.to_string())
210        .add_attribute(DELEGATION_TARGET_KEY, mix_id.to_string())
211}
212
213pub fn new_withdraw_operator_reward_event(owner: &Addr, amount: Coin, mix_id: NodeId) -> Event {
214    Event::new(MixnetEventType::WithdrawOperatorReward)
215        .add_attribute(OWNER_KEY, owner.as_str())
216        .add_attribute(AMOUNT_KEY, amount.to_string())
217        .add_attribute(MIX_ID_KEY, mix_id.to_string())
218}
219
220pub fn new_withdraw_delegator_reward_event(
221    delegator: &Addr,
222    amount: Coin,
223    mix_id: NodeId,
224) -> Event {
225    Event::new(MixnetEventType::WithdrawDelegatorReward)
226        .add_attribute(DELEGATOR_KEY, delegator)
227        .add_attribute(AMOUNT_KEY, amount.to_string())
228        .add_attribute(DELEGATION_TARGET_KEY, mix_id.to_string())
229}
230
231pub fn new_active_set_update_failure(err: MixnetContractError) -> Event {
232    Event::new(MixnetEventType::ActiveSetUpdate).add_attribute(ERROR_MESSAGE_KEY, err.to_string())
233}
234
235pub fn new_active_set_update_event(created_at: BlockHeight, update: ActiveSetUpdate) -> Event {
236    Event::new(MixnetEventType::ActiveSetUpdate)
237        .add_attribute(EVENT_CREATION_HEIGHT_KEY, created_at.to_string())
238        .add_attribute(NUM_MIXNODES_KEY, update.mixnodes.to_string())
239        .add_attribute(NUM_ENTRIES_KEY, update.entry_gateways.to_string())
240        .add_attribute(NUM_EXITS_KEY, update.exit_gateways.to_string())
241}
242
243pub fn new_pending_active_set_update_event(
244    update: ActiveSetUpdate,
245    approximate_time_remaining_secs: i64,
246) -> Event {
247    Event::new(MixnetEventType::PendingActiveSetUpdate)
248        .add_attribute(NUM_MIXNODES_KEY, update.mixnodes.to_string())
249        .add_attribute(NUM_ENTRIES_KEY, update.entry_gateways.to_string())
250        .add_attribute(NUM_EXITS_KEY, update.exit_gateways.to_string())
251        .add_attribute(
252            APPROXIMATE_TIME_LEFT_SECS_KEY,
253            approximate_time_remaining_secs.to_string(),
254        )
255}
256
257pub fn new_rewarding_params_update_event(
258    created_at: BlockHeight,
259    update: IntervalRewardingParamsUpdate,
260    updated: IntervalRewardParams,
261) -> Event {
262    Event::new(MixnetEventType::IntervalRewardingParamsUpdate)
263        .add_attribute(EVENT_CREATION_HEIGHT_KEY, created_at.to_string())
264        .add_attribute(
265            INTERVAL_REWARDING_PARAMS_UPDATE_KEY,
266            update.to_inline_json(),
267        )
268        .add_attribute(
269            UPDATED_INTERVAL_REWARDING_PARAMS_KEY,
270            updated.to_inline_json(),
271        )
272}
273
274pub fn new_pending_rewarding_params_update_event(
275    update: IntervalRewardingParamsUpdate,
276    approximate_time_remaining_secs: i64,
277) -> Event {
278    Event::new(MixnetEventType::PendingIntervalRewardingParamsUpdate)
279        .add_attribute(
280            INTERVAL_REWARDING_PARAMS_UPDATE_KEY,
281            update.to_inline_json(),
282        )
283        .add_attribute(
284            APPROXIMATE_TIME_LEFT_SECS_KEY,
285            approximate_time_remaining_secs.to_string(),
286        )
287}
288
289pub fn new_undelegation_event(created_at: BlockHeight, delegator: &Addr, mix_id: NodeId) -> Event {
290    Event::new(MixnetEventType::Undelegation)
291        .add_attribute(EVENT_CREATION_HEIGHT_KEY, created_at.to_string())
292        .add_attribute(DELEGATOR_KEY, delegator)
293        .add_attribute(MIX_ID_KEY, mix_id.to_string())
294}
295
296pub fn new_pending_undelegation_event(delegator: &Addr, mix_id: NodeId) -> Event {
297    Event::new(MixnetEventType::PendingUndelegation)
298        .add_attribute(DELEGATOR_KEY, delegator)
299        .add_attribute(MIX_ID_KEY, mix_id.to_string())
300}
301
302pub fn new_gateway_unbonding_event(
303    owner: &Addr,
304    amount: &Coin,
305    identity: IdentityKeyRef<'_>,
306) -> Event {
307    Event::new(MixnetEventType::GatewayUnbonding)
308        .add_attribute(OWNER_KEY, owner)
309        .add_attribute(NODE_IDENTITY_KEY, identity)
310        .add_attribute(AMOUNT_KEY, amount.to_string())
311}
312
313pub fn new_nym_node_bonding_event(
314    owner: &Addr,
315    amount: &Coin,
316    identity: IdentityKeyRef<'_>,
317    node_id: NodeId,
318) -> Event {
319    Event::new(MixnetEventType::NymNodeBonding)
320        .add_attribute(NODE_ID_KEY, node_id.to_string())
321        .add_attribute(NODE_IDENTITY_KEY, identity)
322        .add_attribute(OWNER_KEY, owner)
323        .add_attribute(AMOUNT_KEY, amount.to_string())
324}
325
326pub fn new_nym_node_unbonding_event(created_at: BlockHeight, node_id: NodeId) -> Event {
327    Event::new(MixnetEventType::NymNodeUnbonding)
328        .add_attribute(EVENT_CREATION_HEIGHT_KEY, created_at.to_string())
329        .add_attribute(NODE_ID_KEY, node_id.to_string())
330}
331
332pub fn new_pending_nym_node_unbonding_event(
333    owner: &Addr,
334    identity: IdentityKeyRef<'_>,
335    node_id: NodeId,
336) -> Event {
337    Event::new(MixnetEventType::PendingNymNodeUnbonding)
338        .add_attribute(NODE_ID_KEY, node_id.to_string())
339        .add_attribute(NODE_IDENTITY_KEY, identity)
340        .add_attribute(OWNER_KEY, owner)
341}
342
343pub fn new_migrated_gateway_event(
344    owner: &Addr,
345    identity: IdentityKeyRef<'_>,
346    node_id: NodeId,
347) -> Event {
348    Event::new(MixnetEventType::GatewayMigration)
349        .add_attribute(NODE_ID_KEY, node_id.to_string())
350        .add_attribute(NODE_IDENTITY_KEY, identity)
351        .add_attribute(OWNER_KEY, owner)
352}
353
354pub fn new_migrated_mixnode_event(
355    owner: &Addr,
356    identity: IdentityKeyRef<'_>,
357    node_id: NodeId,
358) -> Event {
359    Event::new(MixnetEventType::MixnodeMigration)
360        .add_attribute(NODE_ID_KEY, node_id.to_string())
361        .add_attribute(NODE_IDENTITY_KEY, identity)
362        .add_attribute(OWNER_KEY, owner)
363}
364
365pub fn new_pending_pledge_increase_event(node_id: NodeId, amount: &Coin) -> Event {
366    Event::new(MixnetEventType::PendingPledgeIncrease)
367        .add_attribute(NODE_ID_KEY, node_id.to_string())
368        .add_attribute(AMOUNT_KEY, amount.to_string())
369}
370
371pub fn new_pledge_increase_event(created_at: BlockHeight, node_id: NodeId, amount: &Coin) -> Event {
372    Event::new(MixnetEventType::PledgeIncrease)
373        .add_attribute(EVENT_CREATION_HEIGHT_KEY, created_at.to_string())
374        .add_attribute(NODE_ID_KEY, node_id.to_string())
375        .add_attribute(AMOUNT_KEY, amount.to_string())
376}
377
378pub fn new_pending_pledge_decrease_event(node_id: NodeId, amount: &Coin) -> Event {
379    Event::new(MixnetEventType::PendingPledgeDecrease)
380        .add_attribute(NODE_ID_KEY, node_id.to_string())
381        .add_attribute(AMOUNT_KEY, amount.to_string())
382}
383
384pub fn new_pledge_decrease_event(created_at: BlockHeight, node_id: NodeId, amount: &Coin) -> Event {
385    Event::new(MixnetEventType::PledgeDecrease)
386        .add_attribute(EVENT_CREATION_HEIGHT_KEY, created_at.to_string())
387        .add_attribute(NODE_ID_KEY, node_id.to_string())
388        .add_attribute(AMOUNT_KEY, amount.to_string())
389}
390
391pub fn new_mixnode_unbonding_event(created_at: BlockHeight, mix_id: NodeId) -> Event {
392    Event::new(MixnetEventType::MixnodeUnbonding)
393        .add_attribute(EVENT_CREATION_HEIGHT_KEY, created_at.to_string())
394        .add_attribute(MIX_ID_KEY, mix_id.to_string())
395}
396
397pub fn new_pending_mixnode_unbonding_event(
398    owner: &Addr,
399    identity: IdentityKeyRef<'_>,
400    mix_id: NodeId,
401) -> Event {
402    Event::new(MixnetEventType::PendingMixnodeUnbonding)
403        .add_attribute(MIX_ID_KEY, mix_id.to_string())
404        .add_attribute(NODE_IDENTITY_KEY, identity)
405        .add_attribute(OWNER_KEY, owner)
406}
407
408pub fn new_mixnode_config_update_event(
409    mix_id: NodeId,
410    owner: &Addr,
411    update: &MixNodeConfigUpdate,
412) -> Event {
413    Event::new(MixnetEventType::MixnodeConfigUpdate)
414        .add_attribute(MIX_ID_KEY, mix_id.to_string())
415        .add_attribute(OWNER_KEY, owner)
416        .add_attribute(UPDATED_MIXNODE_CONFIG_KEY, update.to_inline_json())
417}
418
419pub fn new_gateway_config_update_event(owner: &Addr, update: &GatewayConfigUpdate) -> Event {
420    Event::new(MixnetEventType::GatewayConfigUpdate)
421        .add_attribute(OWNER_KEY, owner)
422        .add_attribute(UPDATED_GATEWAY_CONFIG_KEY, update.to_inline_json())
423}
424
425pub fn new_pending_cost_params_update_event(mix_id: NodeId, new_costs: &NodeCostParams) -> Event {
426    Event::new(MixnetEventType::PendingCostParamsUpdate)
427        .add_attribute(NODE_ID_KEY, mix_id.to_string())
428        .add_attribute(UPDATED_MIXNODE_COST_PARAMS_KEY, new_costs.to_inline_json())
429}
430
431pub fn new_cost_params_update_event(
432    created_at: BlockHeight,
433    mix_id: NodeId,
434    new_costs: &NodeCostParams,
435) -> Event {
436    Event::new(MixnetEventType::CostParamsUpdate)
437        .add_attribute(EVENT_CREATION_HEIGHT_KEY, created_at.to_string())
438        .add_attribute(MIX_ID_KEY, mix_id.to_string())
439        .add_attribute(UPDATED_MIXNODE_COST_PARAMS_KEY, new_costs.to_inline_json())
440}
441
442pub fn new_rewarding_validator_address_update_event(old: Addr, new: Addr) -> Event {
443    Event::new(MixnetEventType::RewardingValidatorUpdate)
444        .add_attribute(OLD_REWARDING_VALIDATOR_ADDRESS_KEY, old)
445        .add_attribute(NEW_REWARDING_VALIDATOR_ADDRESS_KEY, new)
446}
447
448pub fn new_settings_update_event(update: &ContractStateParamsUpdate) -> Event {
449    let mut event = Event::new(MixnetEventType::ContractSettingsUpdate);
450
451    // check for delegations params updates
452    if let Some(delegations_update) = &update.delegations_params {
453        event.attributes.push(attr(
454            NEW_MINIMUM_DELEGATION_KEY,
455            delegations_update
456                .minimum_delegation
457                .as_ref()
458                .map(|d| d.to_string())
459                .unwrap_or("empty".to_string()),
460        ));
461    }
462
463    // check for operators params updates
464    if let Some(operators_update) = &update.operators_params {
465        if let Some(minimum_pledge) = &operators_update.minimum_pledge {
466            event
467                .attributes
468                .push(attr(NEW_MINIMUM_PLEDGE_KEY, minimum_pledge.to_string()))
469        }
470        if let Some(profit_margin) = &operators_update.profit_margin {
471            event
472                .attributes
473                .push(attr(NEW_PROFIT_MARGIN_RANGE_KEY, profit_margin.to_string()))
474        }
475        if let Some(interval_operating_cost) = &operators_update.interval_operating_cost {
476            event.attributes.push(attr(
477                NEW_INTERVAL_OPERATING_COST_RANGE_KEY,
478                interval_operating_cost.to_string(),
479            ))
480        }
481    }
482
483    // check for config score params updates
484    if let Some(config_score_update) = &update.config_score_params {
485        if let Some(version_weights) = &config_score_update.version_weights {
486            event.attributes.push(attr(
487                NEW_VERSION_WEIGHTS_RANGE_KEY,
488                format!("{version_weights:?}"),
489            ))
490        }
491        if let Some(version_score_formula_params) =
492            &config_score_update.version_score_formula_params
493        {
494            event.attributes.push(attr(
495                NEW_VERSION_SCORE_FORMULA_PARAMS_KEY,
496                format!("{version_score_formula_params:?}"),
497            ))
498        }
499    }
500
501    event
502}
503
504pub fn new_update_nym_node_semver_event(new_version: &str, new_id: u32) -> Event {
505    Event::new(MixnetEventType::NymNodeSemverUpdate)
506        .add_attribute(NYM_NODE_CURRENT_SEMVER_KEY, new_version)
507        .add_attribute(NYM_NODE_CURRENT_SEMVER_ID_KEY, new_id.to_string())
508}
509
510pub fn new_not_found_node_operator_rewarding_event(interval: Interval, node_id: NodeId) -> Event {
511    Event::new(MixnetEventType::NodeRewarding)
512        .add_attribute(
513            INTERVAL_KEY,
514            interval.current_epoch_absolute_id().to_string(),
515        )
516        .add_attribute(NODE_ID_KEY, node_id.to_string())
517        .add_attribute(NO_REWARD_REASON_KEY, BOND_NOT_FOUND_VALUE)
518}
519
520pub fn new_zero_uptime_mix_operator_rewarding_event(interval: Interval, node_id: NodeId) -> Event {
521    Event::new(MixnetEventType::NodeRewarding)
522        .add_attribute(
523            INTERVAL_KEY,
524            interval.current_epoch_absolute_id().to_string(),
525        )
526        .add_attribute(NODE_ID_KEY, node_id.to_string())
527        .add_attribute(NO_REWARD_REASON_KEY, ZERO_PERFORMANCE_OR_WORK_VALUE)
528}
529
530pub fn new_mix_rewarding_event(
531    interval: Interval,
532    node_id: NodeId,
533    reward_distribution: RewardDistribution,
534    prior_delegates: Decimal,
535    prior_unit_reward: Decimal,
536) -> Event {
537    Event::new(MixnetEventType::NodeRewarding)
538        .add_attribute(
539            INTERVAL_KEY,
540            interval.current_epoch_absolute_id().to_string(),
541        )
542        .add_attribute(PRIOR_DELEGATES_KEY, prior_delegates.to_string())
543        .add_attribute(PRIOR_UNIT_REWARD_KEY, prior_unit_reward.to_string())
544        .add_attribute(NODE_ID_KEY, node_id.to_string())
545        .add_attribute(
546            OPERATOR_REWARD_KEY,
547            reward_distribution.operator.to_string(),
548        )
549        .add_attribute(
550            DELEGATES_REWARD_KEY,
551            reward_distribution.delegates.to_string(),
552        )
553}
554
555pub fn new_epoch_transition_start_event(current_interval: Interval) -> Event {
556    Event::new(MixnetEventType::BeginEpochTransition).add_attribute(
557        CURRENT_EPOCH_KEY,
558        current_interval.current_epoch_absolute_id().to_string(),
559    )
560}
561
562pub fn new_assigned_role_event(role: Role, nodes: u32) -> Event {
563    Event::new(MixnetEventType::RoleAssignment)
564        .add_attribute(ROLE_KEY, role.to_string())
565        .add_attribute(NODE_COUNT_KEY, nodes.to_string())
566}
567
568pub fn new_advance_epoch_event(epoch_id: EpochId) -> Event {
569    Event::new(MixnetEventType::AdvanceEpoch)
570        .add_attribute(NEW_CURRENT_EPOCH_KEY, epoch_id.to_string())
571}
572
573pub fn new_pending_epoch_events_execution_event(executed: u32) -> Event {
574    Event::new(MixnetEventType::ExecutePendingEpochEvents)
575        .add_attribute(EVENTS_EXECUTED_KEY, executed.to_string())
576}
577
578pub fn new_pending_interval_events_execution_event(executed: u32) -> Event {
579    Event::new(MixnetEventType::ExecutePendingIntervalEvents)
580        .add_attribute(EVENTS_EXECUTED_KEY, executed.to_string())
581}
582
583pub fn new_reconcile_pending_events() -> Event {
584    Event::new(MixnetEventType::ReconcilePendingEvents)
585}
586
587pub fn new_interval_config_update_event(
588    created_at: BlockHeight,
589    epochs_in_interval: u32,
590    epoch_duration_secs: u64,
591    updated_rewarding_params: IntervalRewardParams,
592) -> Event {
593    Event::new(MixnetEventType::IntervalConfigUpdate)
594        .add_attribute(EVENT_CREATION_HEIGHT_KEY, created_at.to_string())
595        .add_attribute(
596            NEW_EPOCHS_DURATION_SECS_KEY,
597            epoch_duration_secs.to_string(),
598        )
599        .add_attribute(NEW_EPOCHS_IN_INTERVAL, epochs_in_interval.to_string())
600        .add_attribute(
601            UPDATED_INTERVAL_REWARDING_PARAMS_KEY,
602            updated_rewarding_params.to_inline_json(),
603        )
604}
605
606pub fn new_pending_interval_config_update_event(
607    epochs_in_interval: u32,
608    epoch_duration_secs: u64,
609    approximate_time_remaining_secs: i64,
610) -> Event {
611    Event::new(MixnetEventType::PendingIntervalConfigUpdate)
612        .add_attribute(
613            NEW_EPOCHS_DURATION_SECS_KEY,
614            epoch_duration_secs.to_string(),
615        )
616        .add_attribute(NEW_EPOCHS_IN_INTERVAL, epochs_in_interval.to_string())
617        .add_attribute(
618            APPROXIMATE_TIME_LEFT_SECS_KEY,
619            approximate_time_remaining_secs.to_string(),
620        )
621}