use crate::schema_helpers::*;
use crate::serde_utils::{duration_hex, Hash256, Pubkey, U128Hex, U64Hex};
use ckb_jsonrpc_types::Script;
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use serde_with::serde_as;
#[derive(Debug, Clone, Copy, Eq, PartialEq, Serialize, Deserialize, Default, JsonSchema)]
pub enum Currency {
Fibb,
Fibt,
#[default]
Fibd,
}
#[derive(Copy, Clone, Debug, PartialEq, Eq, Serialize, Deserialize, Default, Hash, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum HashAlgorithm {
#[default]
CkbHash,
Sha256,
}
#[derive(Debug, Clone, Copy, Eq, PartialEq, Serialize, Deserialize, JsonSchema)]
pub enum CkbInvoiceStatus {
Open,
Cancelled,
Expired,
Received,
Paid,
}
#[serde_as]
#[derive(Debug, Clone, Eq, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum Attribute {
#[serde(with = "U64Hex")]
#[schemars(schema_with = "schema_as_uint_hex")]
FinalHtlcTimeout(u64),
#[serde(with = "U64Hex")]
#[schemars(schema_with = "schema_as_uint_hex")]
FinalHtlcMinimumExpiryDelta(u64),
#[serde(with = "duration_hex")]
#[schemars(schema_with = "schema_as_uint_hex")]
ExpiryTime(std::time::Duration),
Description(String),
FallbackAddr(String),
UdtScript(String),
PayeePublicKey(Pubkey),
HashAlgorithm(HashAlgorithm),
Feature(Vec<String>),
PaymentSecret(String),
}
#[serde_as]
#[derive(Debug, Clone, Eq, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct InvoiceData {
#[serde_as(as = "U128Hex")]
#[schemars(schema_with = "schema_as_uint_hex")]
pub timestamp: u128,
pub payment_hash: Hash256,
pub attrs: Vec<Attribute>,
}
#[serde_as]
#[derive(Debug, Clone, Eq, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct CkbInvoice {
pub currency: Currency,
#[serde_as(as = "Option<U128Hex>")]
#[schemars(schema_with = "schema_as_uint_hex_optional")]
pub amount: Option<u128>,
pub signature: Option<String>,
pub data: InvoiceData,
}
#[serde_as]
#[derive(Serialize, Deserialize, Default, Clone, JsonSchema)]
pub struct NewInvoiceParams {
#[serde_as(as = "U128Hex")]
#[schemars(schema_with = "schema_as_uint_hex")]
pub amount: u128,
pub description: Option<String>,
pub currency: Currency,
pub payment_preimage: Option<Hash256>,
pub payment_hash: Option<Hash256>,
#[serde_as(as = "Option<U64Hex>")]
#[schemars(schema_with = "schema_as_uint_hex_optional")]
pub expiry: Option<u64>,
pub fallback_address: Option<String>,
#[serde_as(as = "Option<U64Hex>")]
#[schemars(schema_with = "schema_as_uint_hex_optional")]
pub final_expiry_delta: Option<u64>,
pub udt_type_script: Option<Script>,
pub hash_algorithm: Option<HashAlgorithm>,
pub allow_mpp: Option<bool>,
pub allow_trampoline_routing: Option<bool>,
}
#[derive(Clone, Serialize, Deserialize, Debug, JsonSchema)]
pub struct InvoiceResult {
pub invoice_address: String,
pub invoice: CkbInvoice,
}
#[derive(Serialize, Deserialize, JsonSchema)]
pub struct ParseInvoiceParams {
pub invoice: String,
}
#[derive(Clone, Serialize, Deserialize, JsonSchema)]
pub struct ParseInvoiceResult {
pub invoice: CkbInvoice,
}
#[derive(Serialize, Deserialize, Debug, JsonSchema)]
pub struct InvoiceParams {
pub payment_hash: Hash256,
}
#[derive(Serialize, Deserialize, Debug, JsonSchema)]
pub struct SettleInvoiceParams {
pub payment_hash: Hash256,
pub payment_preimage: Hash256,
}
#[derive(Serialize, Deserialize, Debug, Clone, JsonSchema)]
pub struct SettleInvoiceResult {}
#[derive(Clone, Serialize, Deserialize, JsonSchema)]
pub struct GetInvoiceResult {
pub invoice_address: String,
pub invoice: CkbInvoice,
pub status: CkbInvoiceStatus,
}