use candid::{CandidType, Principal};
use serde::Deserialize;
#[derive(CandidType, Clone, Copy, Debug, Deserialize, Eq, Ord, PartialEq, PartialOrd)]
pub enum IntentReleaseKey {
Local(u64),
ReceiptBacked([u8; 32]),
}
#[derive(CandidType, Clone, Copy, Debug, Deserialize, Eq, PartialEq)]
pub struct IntentReleaseEvidence {
pub source_canister: Principal,
pub schema_version: u32,
pub fingerprint: [u8; 32],
}
#[derive(CandidType, Clone, Copy, Debug, Deserialize, Eq, PartialEq)]
pub enum IntentReleaseReceiptState {
Pending,
Committed(IntentReleaseEvidence),
RolledBack(IntentReleaseEvidence),
}
#[derive(CandidType, Clone, Debug, Deserialize, Eq, PartialEq)]
pub struct IntentReleaseReceipt {
pub operation_id: [u8; 32],
pub payload_hash_schema_version: u32,
pub payload_hash: [u8; 32],
pub resource_key: String,
pub quantity: u64,
pub state: IntentReleaseReceiptState,
pub revision: u64,
pub created_at_ns: u64,
pub updated_at_ns: u64,
pub application_replay_deadline_ns: Option<u64>,
}
#[derive(CandidType, Clone, Debug, Deserialize, Eq, PartialEq)]
pub enum IntentReleaseEntry {
Local {
intent_id: u64,
record: crate::dto::release_receipts::ReplayReleaseIntent,
},
ReceiptBacked(IntentReleaseReceipt),
}
#[derive(CandidType, Clone, Debug, Deserialize, Eq, PartialEq)]
pub struct IntentReleaseResponse {
pub owner: Principal,
pub entry: Option<IntentReleaseEntry>,
pub next_after: Option<IntentReleaseKey>,
}