Skip to main content

hypercall_signer/
types.rs

1use hypercall_db::RsmSignerRequestRecord;
2use hypercall_types::WalletAddress;
3use serde::Serialize;
4
5#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
6#[serde(rename_all = "camelCase")]
7pub struct SignedDirective {
8    pub request_id: String,
9    pub account: WalletAddress,
10    pub nonce: u64,
11    pub directive: Vec<u8>,
12    pub signature: String,
13}
14
15#[derive(Debug, Clone, PartialEq, Eq, Serialize, utoipa::ToSchema)]
16#[serde(rename_all = "camelCase")]
17pub struct RsmSignerStatus {
18    pub chain_id: u64,
19    pub signer_id: String,
20    pub relayer_paused: bool,
21    pub signer: WalletAddress,
22    pub next_nonce: String,
23}
24
25pub fn record_to_signed_directive(record: RsmSignerRequestRecord) -> SignedDirective {
26    let directive = record.directive.unwrap_or_else(|| {
27        panic!(
28            "STATE_CORRUPTION: completed RSM signer request {} is missing directive bytes",
29            record.request_id
30        )
31    });
32    let signature = record.signature.unwrap_or_else(|| {
33        panic!(
34            "STATE_CORRUPTION: completed RSM signer request {} is missing signature",
35            record.request_id
36        )
37    });
38    let nonce = u64::try_from(record.nonce).unwrap_or_else(|_| {
39        panic!(
40            "STATE_CORRUPTION: completed RSM signer request {} has negative nonce {}",
41            record.request_id, record.nonce
42        )
43    });
44
45    SignedDirective {
46        request_id: record.request_id,
47        account: record.account_address,
48        nonce,
49        directive,
50        signature,
51    }
52}