diff --git a/libs/types-internal/src/event.rs b/libs/types-internal/src/event.rs index 2cf04953..98fa727f 100644 --- a/libs/types-internal/src/event.rs +++ b/libs/types-internal/src/event.rs @@ -23,9 +23,9 @@ pub enum EventType { Init(InitArgs), /// The minter upgraded with the specified arguments. Upgrade(UpgradeArgs), - /// A user manually submitted a valid ckSOL deposit transaction via - /// `process_deposit`. ckSOL tokens have not yet been minted for this deposit. - AcceptedManualDeposit { + /// A valid ckSOL deposit was discovered. ckSOL tokens have not yet been + /// minted for this deposit. + AcceptedDeposit { /// The signature of the Solana deposit transaction. signature: Signature, /// The account to which the minter should mint ckSOL. @@ -36,6 +36,8 @@ pub enum EventType { /// This amount is generally lower than `deposit_amount` due /// to the deposit fee. amount_to_mint: Lamport, + /// The source of the deposit — manual or automatic. + source: DepositSource, }, /// The minter discovered a Solana transaction that is a valid ckSOL /// deposit, but it is unknown whether ckSOL tokens were minted for @@ -123,6 +125,15 @@ pub enum EventType { }, } +/// The source of an accepted deposit. +#[derive(Clone, Copy, Debug, PartialEq, CandidType, Deserialize)] +pub enum DepositSource { + /// The deposit was submitted manually via `process_deposit`. + Manual, + /// The deposit was discovered automatically by the minter's polling mechanism. + Automatic, +} + /// The purpose of a submitted Solana transaction. #[derive(Clone, Debug, PartialEq, CandidType, Deserialize)] pub enum TransactionPurpose { diff --git a/minter/cksol_minter.did b/minter/cksol_minter.did index f81e36f2..58454b6f 100644 --- a/minter/cksol_minter.did +++ b/minter/cksol_minter.did @@ -322,6 +322,14 @@ type TransactionPurpose = variant { }; }; +// The source of an accepted deposit. +type DepositSource = variant { + // The deposit was submitted manually via `process_deposit`. + Manual; + // The deposit was discovered automatically by the minter's polling mechanism. + Automatic; +}; + // A minter event payload. // // *WARNING*: This type is used exclusively by the debug `get_events` endpoint. @@ -336,9 +344,9 @@ type EventType = variant { // burned the requested amount of ckSOL. // The Solana transaction was not generated yet. AcceptedWithdrawalRequest : AcceptedWithdrawalRequest; - // A user manually submitted a valid ckSOL deposit transaction via - // `process_deposit`. ckSOL tokens have not yet been minted for this deposit. - AcceptedManualDeposit : record { + // A valid ckSOL deposit was discovered. ckSOL tokens have not yet been + // minted for this deposit. + AcceptedDeposit : record { // The signature of the Solana deposit transaction. signature: Signature; // The account to which the minter should mint ckSOL. @@ -349,6 +357,8 @@ type EventType = variant { // This amount is generally lower than `deposit_amount` due // to the deposit fee. amount_to_mint: Lamport; + // The source of the deposit — manual or automatic. + source: DepositSource; }; // The minter discovered a Solana transaction that is a valid ckSOL // deposit, but it is unknown whether ckSOL tokens were minted for diff --git a/minter/src/canbench.rs b/minter/src/canbench.rs index 9a130cd5..e0e97af4 100644 --- a/minter/src/canbench.rs +++ b/minter/src/canbench.rs @@ -4,7 +4,10 @@ use crate::{ runtime::IcCanisterRuntime, state::{ audit::{process_event, replay_events}, - event::{DepositId, EventType, TransactionPurpose, VersionedMessage, WithdrawalRequest}, + event::{ + DepositId, DepositSource, EventType, TransactionPurpose, VersionedMessage, + WithdrawalRequest, + }, init_once_state, mutate_state, reset_state, }, storage::{reset_events, total_event_count, with_event_iter}, @@ -97,10 +100,11 @@ fn setup_10k_events() { mutate_state(|s| { process_event( s, - EventType::AcceptedManualDeposit { + EventType::AcceptedDeposit { deposit_id: id, deposit_amount: amount, amount_to_mint: amount - deposit_fee, + source: DepositSource::Manual, }, &runtime, ) @@ -147,10 +151,11 @@ fn setup_10k_events() { mutate_state(|s| { process_event( s, - EventType::AcceptedManualDeposit { + EventType::AcceptedDeposit { deposit_id: id, deposit_amount: amount, amount_to_mint: amount - deposit_fee, + source: DepositSource::Manual, }, &runtime, ) @@ -211,10 +216,11 @@ fn setup_10k_events() { mutate_state(|s| { process_event( s, - EventType::AcceptedManualDeposit { + EventType::AcceptedDeposit { deposit_id: id, deposit_amount: amount, amount_to_mint: amount - deposit_fee, + source: DepositSource::Manual, }, &runtime, ) @@ -260,10 +266,11 @@ fn setup_10k_events() { mutate_state(|s| { process_event( s, - EventType::AcceptedManualDeposit { + EventType::AcceptedDeposit { deposit_id: id, deposit_amount: amount, amount_to_mint: amount - deposit_fee, + source: DepositSource::Manual, }, &runtime, ) diff --git a/minter/src/consolidate/tests.rs b/minter/src/consolidate/tests.rs index 28a56be9..cb52de76 100644 --- a/minter/src/consolidate/tests.rs +++ b/minter/src/consolidate/tests.rs @@ -44,7 +44,7 @@ async fn should_return_early_if_task_already_active() { // Only events from setup EventsAssert::from_recorded() - .expect_event(|e| assert_matches!(e, EventType::AcceptedManualDeposit { .. })) + .expect_event(|e| assert_matches!(e, EventType::AcceptedDeposit { .. })) .expect_event(|e| assert_matches!(e, EventType::Minted { .. })) .assert_no_more_events(); } @@ -65,7 +65,7 @@ async fn should_return_early_if_fetching_blockhash_fails() { // Only events from setup EventsAssert::from_recorded() - .expect_event(|e| assert_matches!(e, EventType::AcceptedManualDeposit { .. })) + .expect_event(|e| assert_matches!(e, EventType::AcceptedDeposit { .. })) .expect_event(|e| assert_matches!(e, EventType::Minted { .. })) .assert_no_more_events(); } @@ -91,7 +91,7 @@ async fn should_submit_single_consolidation_request() { consolidate_deposits(runtime).await; EventsAssert::from_recorded() - .expect_event(|e| assert_matches!(e, EventType::AcceptedManualDeposit { .. })) + .expect_event(|e| assert_matches!(e, EventType::AcceptedDeposit { .. })) .expect_event(|e| assert_matches!(e, EventType::Minted { .. })) .expect_event(|e| { assert_matches!(e, EventType::SubmittedTransaction { @@ -127,7 +127,7 @@ async fn should_record_events_even_if_transaction_submission_fails() { consolidate_deposits(runtime).await; EventsAssert::from_recorded() - .expect_event(|e| assert_matches!(e, EventType::AcceptedManualDeposit { .. })) + .expect_event(|e| assert_matches!(e, EventType::AcceptedDeposit { .. })) .expect_event(|e| assert_matches!(e, EventType::Minted { .. })) .expect_event(|e| { assert_matches!(e, EventType::SubmittedTransaction { @@ -177,7 +177,7 @@ async fn should_submit_multiple_consolidation_batches() { // Events from setup for _ in 0..NUM_DEPOSITS { events_assert = events_assert - .expect_event(|e| assert_matches!(e, EventType::AcceptedManualDeposit { .. })) + .expect_event(|e| assert_matches!(e, EventType::AcceptedDeposit { .. })) .expect_event(|e| assert_matches!(e, EventType::Minted { .. })); } // Batch 1: @@ -239,9 +239,9 @@ async fn should_consolidate_multiple_deposits_to_same_account_in_single_transfer consolidate_deposits(runtime).await; EventsAssert::from_recorded() - .expect_event(|e| assert_matches!(e, EventType::AcceptedManualDeposit { .. })) + .expect_event(|e| assert_matches!(e, EventType::AcceptedDeposit { .. })) .expect_event(|e| assert_matches!(e, EventType::Minted { .. })) - .expect_event(|e| assert_matches!(e, EventType::AcceptedManualDeposit { .. })) + .expect_event(|e| assert_matches!(e, EventType::AcceptedDeposit { .. })) .expect_event(|e| assert_matches!(e, EventType::Minted { .. })) .expect_event(|e| { assert_matches!(e, EventType::SubmittedTransaction { diff --git a/minter/src/deposit/manual/mod.rs b/minter/src/deposit/manual/mod.rs index 767f6c4c..179f23e6 100644 --- a/minter/src/deposit/manual/mod.rs +++ b/minter/src/deposit/manual/mod.rs @@ -8,7 +8,7 @@ use crate::{ state::{ Deposit, audit::process_event, - event::{DepositId, EventType}, + event::{DepositId, DepositSource, EventType}, mutate_state, read_state, }, }; @@ -96,10 +96,11 @@ async fn try_accept_deposit( mutate_state(|state| { process_event( state, - EventType::AcceptedManualDeposit { + EventType::AcceptedDeposit { deposit_id, deposit_amount, amount_to_mint, + source: DepositSource::Manual, }, runtime, ) diff --git a/minter/src/deposit/manual/tests.rs b/minter/src/deposit/manual/tests.rs index 997523f4..a1a0c6c6 100644 --- a/minter/src/deposit/manual/tests.rs +++ b/minter/src/deposit/manual/tests.rs @@ -1,7 +1,7 @@ use crate::{ constants::GET_TRANSACTION_CYCLES, deposit::manual::process_deposit, - state::event::{DepositId, EventType}, + state::event::{DepositId, DepositSource, EventType}, storage::reset_events, test_fixtures::{ BLOCK_INDEX, DEPOSIT_CONSOLIDATION_FEE, EventsAssert, MANUAL_DEPOSIT_FEE, @@ -245,13 +245,14 @@ mod process_deposit_tests { ); EventsAssert::from_recorded() - .expect_event_eq(EventType::AcceptedManualDeposit { + .expect_event_eq(EventType::AcceptedDeposit { deposit_id: DepositId { signature, account: DEPOSITOR_ACCOUNT, }, deposit_amount: DEPOSIT_AMOUNT, amount_to_mint: DEPOSIT_AMOUNT - MANUAL_DEPOSIT_FEE, + source: DepositSource::Manual, }) .expect_event_eq(EventType::Minted { deposit_id: DepositId { @@ -397,10 +398,11 @@ mod process_deposit_tests { account: ACCOUNTS[i], }; events_assert = events_assert - .expect_event_eq(EventType::AcceptedManualDeposit { + .expect_event_eq(EventType::AcceptedDeposit { deposit_id, deposit_amount: DEPOSIT_AMOUNTS[i], amount_to_mint: DEPOSIT_AMOUNTS[i] - MANUAL_DEPOSIT_FEE, + source: DepositSource::Manual, }) .expect_event_eq(EventType::Minted { deposit_id, diff --git a/minter/src/main.rs b/minter/src/main.rs index 4d144410..0203a3c6 100644 --- a/minter/src/main.rs +++ b/minter/src/main.rs @@ -104,7 +104,9 @@ fn withdrawal_status(args: WithdrawalStatusArgs) -> WithdrawalStatus { fn get_events( args: cksol_types_internal::event::GetEventsArgs, ) -> cksol_types_internal::event::GetEventsResult { - use cksol_minter::state::event::{Event, EventType, TransactionPurpose, VersionedMessage}; + use cksol_minter::state::event::{ + DepositSource, Event, EventType, TransactionPurpose, VersionedMessage, + }; use cksol_types_internal::event; const MAX_EVENTS_PER_RESPONSE: u64 = 2_000; @@ -129,15 +131,20 @@ fn get_events( amount_to_transfer: request.amount_to_transfer, } } - EventType::AcceptedManualDeposit { + EventType::AcceptedDeposit { deposit_id, deposit_amount, amount_to_mint, - } => event::EventType::AcceptedManualDeposit { + source, + } => event::EventType::AcceptedDeposit { signature: deposit_id.signature.into(), account: deposit_id.account, deposit_amount, amount_to_mint, + source: match source { + DepositSource::Manual => event::DepositSource::Manual, + DepositSource::Automatic => event::DepositSource::Automatic, + }, }, EventType::Minted { deposit_id, diff --git a/minter/src/state/audit.rs b/minter/src/state/audit.rs index 7ad256b6..75abceb9 100644 --- a/minter/src/state/audit.rs +++ b/minter/src/state/audit.rs @@ -27,10 +27,11 @@ fn apply_state_transition(state: &mut State, payload: &EventType, timestamp: u64 EventType::AcceptedWithdrawalRequest(request) => { state.process_accepted_withdrawal(request, timestamp); } - EventType::AcceptedManualDeposit { + EventType::AcceptedDeposit { deposit_id, deposit_amount, amount_to_mint, + source: _, } => { state.process_accepted_deposit(deposit_id, deposit_amount, amount_to_mint); } diff --git a/minter/src/state/event.rs b/minter/src/state/event.rs index 7b647d8f..0e25a919 100644 --- a/minter/src/state/event.rs +++ b/minter/src/state/event.rs @@ -42,16 +42,18 @@ pub enum EventType { /// The minter upgraded with the specified arguments. #[n(1)] Upgrade(#[n(0)] UpgradeArgs), - /// A user manually submitted a valid ckSOL deposit transaction via - /// `process_deposit`. ckSOL tokens have not yet been minted for this deposit. + /// A valid ckSOL deposit was discovered. ckSOL tokens have not yet been + /// minted for this deposit. #[n(2)] - AcceptedManualDeposit { + AcceptedDeposit { #[n(0)] deposit_id: DepositId, #[n(1)] deposit_amount: Lamport, #[n(2)] amount_to_mint: Lamport, + #[n(3)] + source: DepositSource, }, /// The minter discovered a Solana transaction that is a valid ckSOL /// deposit, but it is unknown whether ckSOL tokens were minted for @@ -144,6 +146,16 @@ pub enum EventType { }, } +/// The source of an accepted deposit — whether it was submitted manually or +/// discovered automatically by the minter's polling mechanism. +#[derive(Clone, Copy, Eq, PartialEq, Debug, Decode, Encode)] +pub enum DepositSource { + #[n(0)] + Manual, + #[n(1)] + Automatic, +} + /// Payload of the `AcceptedWithdrawalRequest` event. #[derive(Clone, Eq, PartialEq, Debug, Decode, Encode)] pub struct WithdrawalRequest { diff --git a/minter/src/test_fixtures/mod.rs b/minter/src/test_fixtures/mod.rs index ffb4af91..9079598c 100644 --- a/minter/src/test_fixtures/mod.rs +++ b/minter/src/test_fixtures/mod.rs @@ -2,7 +2,7 @@ use crate::{ numeric::LedgerMintIndex, state::{ SchnorrPublicKey, State, - event::{DepositId, Event, EventType}, + event::{DepositId, DepositSource, Event, EventType}, init_once_state, mutate_state, }, storage::with_event_iter, @@ -146,7 +146,7 @@ pub mod events { numeric::{LedgerBurnIndex, LedgerMintIndex}, state::{ audit::process_event, - event::{DepositId, EventType, TransactionPurpose, WithdrawalRequest}, + event::{DepositId, DepositSource, EventType, TransactionPurpose, WithdrawalRequest}, mutate_state, }, }; @@ -173,10 +173,11 @@ pub mod events { mutate_state(|state| { process_event( state, - EventType::AcceptedManualDeposit { + EventType::AcceptedDeposit { deposit_id, deposit_amount: amount, amount_to_mint: amount - MANUAL_DEPOSIT_FEE, + source: DepositSource::Manual, }, &runtime(), ) @@ -342,7 +343,9 @@ pub mod events { pub mod arb { use crate::{ numeric::{LedgerBurnIndex, LedgerMintIndex}, - state::event::{DepositId, Event, EventType, TransactionPurpose, WithdrawalRequest}, + state::event::{ + DepositId, DepositSource, Event, EventType, TransactionPurpose, WithdrawalRequest, + }, }; use candid::Principal; use cksol_types_internal::{Ed25519KeyName, InitArgs, SolanaNetwork, UpgradeArgs}; @@ -541,15 +544,20 @@ pub mod arb { arb_init_args().prop_map(EventType::Init), arb_upgrade_args().prop_map(EventType::Upgrade), arb_withdrawal_request().prop_map(EventType::AcceptedWithdrawalRequest), - (arb_deposit_id(), any::(), any::()).prop_map( - |(deposit_id, deposit_amount, amount_to_mint)| { - EventType::AcceptedManualDeposit { + ( + arb_deposit_id(), + any::(), + any::(), + prop_oneof![Just(DepositSource::Manual), Just(DepositSource::Automatic),] + ) + .prop_map(|(deposit_id, deposit_amount, amount_to_mint, source)| { + EventType::AcceptedDeposit { deposit_id, deposit_amount, amount_to_mint, + source, } - } - ), + }), arb_deposit_id().prop_map(EventType::QuarantinedDeposit), (arb_deposit_id(), arb_ledger_mint_index()).prop_map( |(deposit_id, mint_block_index)| EventType::Minted { @@ -632,10 +640,11 @@ pub mod deposit { } pub fn accepted_deposit_event() -> EventType { - EventType::AcceptedManualDeposit { + EventType::AcceptedDeposit { deposit_id: deposit_id(), deposit_amount: DEPOSIT_AMOUNT, amount_to_mint: DEPOSIT_AMOUNT - MANUAL_DEPOSIT_FEE, + source: DepositSource::Manual, } }