use crate::schema_helpers::*;
use crate::serde_utils::{EntityHex, Hash256, Pubkey, SliceHex, U128Hex, U32Hex, U64Hex};
use ckb_jsonrpc_types::Script;
use ckb_types::packed::OutPoint;
use schemars::{json_schema, JsonSchema, Schema, SchemaGenerator};
use serde::{Deserialize, Serialize};
use serde_with::serde_as;
use std::collections::HashMap;
#[derive(Clone, Copy, Debug, Eq, PartialEq, Serialize, Deserialize, JsonSchema)]
pub enum PaymentStatus {
Created,
Inflight,
Success,
Failed,
}
#[serde_as]
#[derive(Serialize, Deserialize, Debug, JsonSchema)]
pub struct GetPaymentCommandParams {
pub payment_hash: Hash256,
}
#[serde_as]
#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema)]
pub struct SessionRouteNode {
pub pubkey: Pubkey,
#[serde_as(as = "U128Hex")]
#[schemars(schema_with = "schema_as_uint_hex")]
pub amount: u128,
#[serde_as(as = "EntityHex")]
#[schemars(schema_with = "schema_as_hex_bytes")]
pub channel_outpoint: OutPoint,
}
#[derive(Clone, Debug, Serialize, Deserialize, Default, JsonSchema)]
pub struct SessionRoute {
pub nodes: Vec<SessionRouteNode>,
}
#[serde_as]
#[derive(Serialize, Deserialize, Clone, Debug, JsonSchema)]
pub struct GetPaymentCommandResult {
pub payment_hash: Hash256,
pub payment_preimage: Option<Hash256>,
pub status: PaymentStatus,
#[serde_as(as = "U64Hex")]
#[schemars(schema_with = "schema_as_uint_hex")]
pub created_at: u64,
#[serde_as(as = "U64Hex")]
#[schemars(schema_with = "schema_as_uint_hex")]
pub last_updated_at: u64,
pub failed_error: Option<String>,
#[serde_as(as = "U128Hex")]
#[schemars(schema_with = "schema_as_uint_hex")]
pub fee: u128,
pub custom_records: Option<PaymentCustomRecords>,
#[cfg(debug_assertions)]
pub routers: Vec<SessionRoute>,
}
#[serde_as]
#[derive(Serialize, Deserialize, Debug, Default, JsonSchema)]
pub struct ListPaymentsParams {
pub status: Option<PaymentStatus>,
#[serde_as(as = "Option<U64Hex>")]
#[schemars(schema_with = "schema_as_uint_hex_optional")]
pub limit: Option<u64>,
pub after: Option<Hash256>,
}
#[derive(Serialize, Deserialize, Debug, Clone, JsonSchema)]
pub struct ListPaymentsResult {
pub payments: Vec<GetPaymentCommandResult>,
pub last_cursor: Option<Hash256>,
}
#[serde_as]
#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize, Default)]
pub struct PaymentCustomRecords {
#[serde(flatten)]
#[serde_as(as = "HashMap<U32Hex, SliceHex>")]
pub data: HashMap<u32, Vec<u8>>,
}
impl JsonSchema for PaymentCustomRecords {
fn schema_name() -> std::borrow::Cow<'static, str> {
"PaymentCustomRecords".into()
}
fn json_schema(_generator: &mut SchemaGenerator) -> Schema {
json_schema!({
"type": "object",
"description": "Custom records map. Keys are hex-encoded u32 (0~65535), \
values are hex-encoded bytes. Both prefixed with 0x.",
"propertyNames": {
"type": "string",
"pattern": "^0x(0|[1-9a-fA-F][0-9a-fA-F]{0,3})$"
},
"additionalProperties": {
"type": "string",
"pattern": "^0x([0-9a-fA-F]{2})*$"
}
})
}
}
#[serde_as]
#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema)]
pub struct SendPaymentCommandParams {
pub target_pubkey: Option<Pubkey>,
#[serde_as(as = "Option<U128Hex>")]
#[schemars(schema_with = "schema_as_uint_hex_optional")]
pub amount: Option<u128>,
pub payment_hash: Option<Hash256>,
#[serde_as(as = "Option<U64Hex>")]
#[schemars(schema_with = "schema_as_uint_hex_optional")]
pub final_tlc_expiry_delta: Option<u64>,
#[serde_as(as = "Option<U64Hex>")]
#[schemars(schema_with = "schema_as_uint_hex_optional")]
pub tlc_expiry_limit: Option<u64>,
pub invoice: Option<String>,
#[serde_as(as = "Option<U64Hex>")]
#[schemars(schema_with = "schema_as_uint_hex_optional")]
pub timeout: Option<u64>,
#[serde_as(as = "Option<U128Hex>")]
#[schemars(schema_with = "schema_as_uint_hex_optional")]
pub max_fee_amount: Option<u128>,
#[serde_as(as = "Option<U64Hex>")]
#[schemars(schema_with = "schema_as_uint_hex_optional")]
pub max_fee_rate: Option<u64>,
#[serde_as(as = "Option<U64Hex>")]
#[schemars(schema_with = "schema_as_uint_hex_optional")]
pub max_parts: Option<u64>,
pub trampoline_hops: Option<Vec<Pubkey>>,
pub keysend: Option<bool>,
pub udt_type_script: Option<Script>,
pub allow_self_payment: Option<bool>,
pub custom_records: Option<PaymentCustomRecords>,
pub hop_hints: Option<Vec<HopHint>>,
pub dry_run: Option<bool>,
}
#[serde_as]
#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema)]
pub struct HopHint {
pub pubkey: Pubkey,
#[serde_as(as = "EntityHex")]
#[schemars(schema_with = "schema_as_hex_bytes")]
pub channel_outpoint: OutPoint,
#[serde_as(as = "U64Hex")]
#[schemars(schema_with = "schema_as_uint_hex")]
pub fee_rate: u64,
#[serde_as(as = "U64Hex")]
#[schemars(schema_with = "schema_as_uint_hex")]
pub tlc_expiry_delta: u64,
}
#[serde_as]
#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema)]
pub struct BuildRouterParams {
#[serde_as(as = "Option<U128Hex>")]
#[schemars(schema_with = "schema_as_uint_hex_optional")]
pub amount: Option<u128>,
pub udt_type_script: Option<Script>,
pub hops_info: Vec<HopRequire>,
#[serde_as(as = "Option<U64Hex>")]
#[schemars(schema_with = "schema_as_uint_hex_optional")]
pub final_tlc_expiry_delta: Option<u64>,
}
#[serde_as]
#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema)]
pub struct HopRequire {
pub pubkey: Pubkey,
#[serde_as(as = "Option<EntityHex>")]
#[schemars(schema_with = "schema_as_hex_bytes_optional")]
pub channel_outpoint: Option<OutPoint>,
}
#[serde_as]
#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct RouterHop {
pub target: Pubkey,
#[serde_as(as = "EntityHex")]
#[schemars(schema_with = "schema_as_hex_bytes")]
pub channel_outpoint: OutPoint,
#[serde_as(as = "U128Hex")]
#[schemars(schema_with = "schema_as_uint_hex")]
pub amount_received: u128,
#[serde_as(as = "U64Hex")]
#[schemars(schema_with = "schema_as_uint_hex")]
pub incoming_tlc_expiry: u64,
}
#[serde_as]
#[derive(Serialize, Deserialize, Debug, Clone, JsonSchema)]
pub struct BuildPaymentRouterResult {
pub router_hops: Vec<RouterHop>,
}
#[serde_as]
#[derive(Serialize, Deserialize, Debug, JsonSchema)]
pub struct SendPaymentWithRouterParams {
pub payment_hash: Option<Hash256>,
pub router: Vec<RouterHop>,
pub invoice: Option<String>,
pub custom_records: Option<PaymentCustomRecords>,
pub keysend: Option<bool>,
pub udt_type_script: Option<Script>,
pub dry_run: Option<bool>,
}