Skip to main content

hypercall_db/types/
nonces.rs

1//! RSM signer nonce tracking for transaction replay protection.
2//!
3//! Tracks per-signer nonces and request claim slots for exactly-once
4//! on-chain transaction submission.
5
6use chrono::NaiveDateTime;
7use hypercall_types::WalletAddress;
8use serde::{Deserialize, Serialize};
9
10/// Tracks the next available nonce for an on-chain signer address.
11/// Used by the transaction submitter to avoid nonce collisions.
12#[derive(Debug, Clone, Serialize, Deserialize)]
13pub struct RsmSignerNonceRecord {
14    pub signer_address: WalletAddress,
15    pub next_nonce: i64,
16    /// Last nonce confirmed on-chain.
17    pub last_synced_nonce: Option<i64>,
18    pub created_at: Option<NaiveDateTime>,
19    pub updated_at: Option<NaiveDateTime>,
20}
21
22/// Record for a completed (or pending) RSM signer request.
23#[derive(Debug, Clone, Serialize, Deserialize)]
24pub struct RsmSignerRequestRecord {
25    pub request_id: String,
26    pub signer_address: WalletAddress,
27    pub account_address: WalletAddress,
28    pub action: Vec<u8>,
29    pub nonce: i64,
30    pub status: String,
31    pub directive: Option<Vec<u8>>,
32    pub signature: Option<String>,
33    pub created_at: Option<NaiveDateTime>,
34    pub updated_at: Option<NaiveDateTime>,
35}
36
37/// Outcome of attempting to claim an RSM signer request slot.
38#[derive(Debug, Clone)]
39pub enum RsmSignerRequestClaim {
40    /// Request was newly created with a reserved nonce.
41    Pending { nonce: u64 },
42    /// Request was already completed (idempotent replay).
43    Completed(RsmSignerRequestRecord),
44    /// Request ID already exists with different parameters.
45    Conflict { message: String },
46}