use candid::{CandidType, Principal};
use serde::Deserialize;
#[derive(CandidType, Clone, Copy, Debug, Deserialize, Eq, PartialEq)]
pub enum ReplayReleaseAuthentication {
DirectCaller,
DelegatedToken,
RoleAttestation,
}
#[derive(CandidType, Clone, Copy, Debug, Deserialize, Eq, PartialEq)]
pub enum ReplayReleasePhase {
Reserved,
ExternalEffectInFlight,
Committed,
RecoveryRequired(ReplayReleaseRecoveryReason),
}
#[derive(CandidType, Clone, Copy, Debug, Deserialize, Eq, PartialEq)]
pub enum ReplayReleaseRecoveryReason {
ExternalEffectStatusUnknown,
ComponentChildLifecycleInterrupted,
ResponseCommitFailed,
CostSettlementFailed,
}
#[derive(CandidType, Clone, Debug, Deserialize, Eq, PartialEq)]
pub enum ReplayReleaseEffect {
RootCanisterProvision { command_kind: String },
ManagementCall { canister: Principal, method: String },
IcpTransfer { operation_id: [u8; 32] },
}
#[derive(CandidType, Clone, Copy, Debug, Deserialize, Eq, PartialEq)]
pub enum ReplayReleaseIntentState {
Pending,
Committed,
Aborted,
}
#[derive(CandidType, Clone, Debug, Deserialize, Eq, PartialEq)]
pub struct ReplayReleaseIntent {
pub resource_key: String,
pub quantity: u64,
pub state: ReplayReleaseIntentState,
pub created_at_secs: u64,
pub ttl_secs: Option<u64>,
}
#[derive(CandidType, Clone, Debug, Deserialize, Eq, PartialEq)]
pub struct ReplayReleaseSettlement {
pub quota_intent_id: u64,
pub reservation_intent_id: u64,
pub quota: Option<ReplayReleaseIntent>,
pub reservation: Option<ReplayReleaseIntent>,
}
#[derive(CandidType, Clone, Debug, Deserialize, Eq, PartialEq)]
pub struct ReplayReleaseEntry {
pub slot: [u8; 32],
pub command_kind: String,
pub operation_id: [u8; 32],
pub actor: Principal,
pub authentication: ReplayReleaseAuthentication,
pub payload_hash_schema_version: u32,
pub payload_hash: [u8; 32],
pub phase: ReplayReleasePhase,
pub created_at_ns: u64,
pub updated_at_ns: u64,
pub expires_at_ns: Option<u64>,
pub cost_guard_settlement: Option<ReplayReleaseSettlement>,
pub effect: Option<ReplayReleaseEffect>,
}
#[derive(CandidType, Clone, Debug, Deserialize, Eq, PartialEq)]
pub struct ReplayReleaseResponse {
pub owner: Principal,
pub entry: Option<ReplayReleaseEntry>,
pub next_after: Option<[u8; 32]>,
}