use crate::BlocktankError;
use serde::{Deserialize, Serialize};
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
pub enum BitcoinNetworkEnum {
#[serde(rename = "mainnet")]
Mainnet,
#[serde(rename = "testnet")]
Testnet,
#[serde(rename = "signet")]
Signet,
#[serde(rename = "regtest")]
Regtest,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub enum BtBolt11InvoiceState {
#[serde(rename = "pending")]
Pending,
#[serde(rename = "holding")]
Holding,
#[serde(rename = "paid")]
Paid,
#[serde(rename = "canceled")]
Canceled,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub enum BtChannelOrderErrorType {
#[serde(rename = "WRONG_ORDER_STATE")]
WrongOrderState,
#[serde(rename = "PEER_NOT_REACHABLE")]
PeerNotReachable,
#[serde(rename = "CHANNEL_REJECTED_BY_DESTINATION")]
ChannelRejectedByDestination,
#[serde(rename = "CHANNEL_REJECTED_BY_LSP")]
ChannelRejectedByLsp,
#[serde(rename = "BLOCKTANK_NOT_READY")]
BlocktankNotReady,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub enum BtOpenChannelState {
#[serde(rename = "opening")]
Opening,
#[serde(rename = "open")]
Open,
#[serde(rename = "closed")]
Closed,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub enum BtOrderState {
#[serde(rename = "created")]
Created,
#[serde(rename = "expired")]
Expired,
#[serde(rename = "open")]
Open,
#[serde(rename = "closed")]
Closed,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub enum BtOrderState2 {
#[serde(rename = "created")]
Created,
#[serde(rename = "expired")]
Expired,
#[serde(rename = "executed")]
Executed,
#[serde(rename = "paid")]
Paid,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub enum BtPaymentState {
#[serde(rename = "created")]
Created,
#[serde(rename = "partiallyPaid")]
PartiallyPaid,
#[serde(rename = "paid")]
Paid,
#[serde(rename = "refunded")]
Refunded,
#[serde(rename = "refundAvailable")]
RefundAvailable,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub enum BtPaymentState2 {
#[serde(rename = "created")]
Created,
#[serde(rename = "paid")]
Paid,
#[serde(rename = "refunded")]
Refunded,
#[serde(rename = "refundAvailable")]
RefundAvailable,
#[serde(rename = "canceled")]
Canceled,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub enum CJitStateEnum {
#[serde(rename = "created")]
Created,
#[serde(rename = "completed")]
Completed,
#[serde(rename = "expired")]
Expired,
#[serde(rename = "failed")]
Failed,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
#[serde(rename_all = "camelCase")]
pub struct IBt0ConfMinTxFeeWindow {
#[serde(rename = "satPerVByte")]
pub sat_per_vbyte: f64,
pub validity_ends_at: String,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
#[serde(rename_all = "camelCase")]
pub struct IBtBolt11Invoice {
pub request: String,
pub state: BtBolt11InvoiceState,
pub expires_at: String,
pub updated_at: String,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
#[serde(rename_all = "camelCase")]
pub struct FundingTx {
pub id: String,
pub vout: u64,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
#[serde(rename_all = "camelCase")]
pub struct IBtChannel {
pub state: BtOpenChannelState,
pub lsp_node_pubkey: String,
pub client_node_pubkey: String,
pub announce_channel: bool,
pub funding_tx: FundingTx,
pub closing_tx_id: Option<String>,
pub close: Option<IBtChannelClose>,
pub short_channel_id: Option<String>,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
#[serde(rename_all = "camelCase")]
pub struct IBtChannelClose {
pub tx_id: String,
#[serde(rename = "type")]
pub close_type: String, pub initiator: String, pub registered_at: String,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
#[serde(rename_all = "camelCase")]
pub struct IBtEstimateFeeResponse {
pub fee_sat: u64,
#[serde(rename = "min0ConfTxFee")]
pub min_0_conf_tx_fee: IBt0ConfMinTxFeeWindow,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
#[serde(rename_all = "camelCase")]
pub struct IBtEstimateFeeResponse2 {
pub fee_sat: u64,
pub network_fee_sat: u64,
pub service_fee_sat: u64,
#[serde(rename = "min0ConfTxFee")]
pub min_0_conf_tx_fee: IBt0ConfMinTxFeeWindow,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
#[serde(rename_all = "camelCase")]
pub struct IBtInfoOptions {
pub min_channel_size_sat: u64,
pub max_channel_size_sat: u64,
pub min_expiry_weeks: u32,
pub max_expiry_weeks: u32,
pub min_payment_confirmations: u32,
pub min_high_risk_payment_confirmations: u32,
pub max_0_conf_client_balance_sat: u64,
pub max_client_balance_sat: u64,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct IBtInfoVersions {
pub http: String,
pub btc: String,
pub ln2: String,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct FeeRates {
pub fast: u32,
pub mid: u32,
pub slow: u32,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
#[serde(rename_all = "camelCase")]
pub struct IBtInfoOnchain {
pub network: BitcoinNetworkEnum,
pub fee_rates: FeeRates,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct IBtInfo {
pub version: u32,
pub nodes: Vec<ILspNode>,
pub options: IBtInfoOptions,
pub versions: IBtInfoVersions,
pub onchain: IBtInfoOnchain,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
#[serde(rename_all = "camelCase")]
pub struct IBtOnchainTransaction {
pub amount_sat: u64,
pub tx_id: String,
pub vout: u32,
pub block_height: Option<u32>,
pub block_confirmation_count: u32,
#[serde(rename = "feeRateSatPerVbyte")]
pub fee_rate_sat_per_vbyte: f64,
pub confirmed: bool,
#[serde(rename = "suspicious0ConfReason")]
pub suspicious_0_conf_reason: String,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
#[serde(rename_all = "camelCase")]
pub struct IBtOnchainTransactions {
pub address: String,
pub confirmed_sat: u64,
pub required_confirmations: u32,
pub transactions: Vec<IBtOnchainTransaction>,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
#[serde(rename_all = "camelCase")]
pub struct IBtOrder {
pub id: String,
pub state: BtOrderState,
pub state2: Option<BtOrderState2>,
pub fee_sat: u64,
pub network_fee_sat: u64,
pub service_fee_sat: u64,
pub lsp_balance_sat: u64,
pub client_balance_sat: u64,
#[serde(rename = "zeroConf")]
pub zero_conf: bool,
pub zero_reserve: bool,
pub client_node_id: Option<String>,
pub channel_expiry_weeks: u32,
pub channel_expires_at: String,
pub order_expires_at: String,
pub channel: Option<IBtChannel>,
pub lsp_node: Option<ILspNode>,
pub lnurl: Option<String>,
pub payment: Option<IBtPayment>,
pub coupon_code: Option<String>,
pub source: Option<String>,
pub discount: Option<IDiscount>,
pub updated_at: String,
pub created_at: String,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
#[serde(rename_all = "camelCase")]
pub struct IBtPayment {
pub state: BtPaymentState,
pub state2: Option<BtPaymentState2>,
pub paid_sat: u64,
pub bolt11_invoice: Option<IBtBolt11Invoice>,
pub onchain: Option<IBtOnchainTransactions>,
pub is_manually_paid: Option<bool>,
pub manual_refunds: Option<Vec<IManualRefund>>,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
#[serde(rename_all = "camelCase")]
pub struct ICJitEntry {
pub id: String,
pub state: CJitStateEnum,
pub fee_sat: u64,
pub network_fee_sat: u64,
pub service_fee_sat: u64,
pub channel_size_sat: u64,
pub channel_expiry_weeks: u32,
pub channel_open_error: Option<String>,
pub node_id: String,
pub invoice: IBtBolt11Invoice,
pub channel: Option<IBtChannel>,
pub lsp_node: ILspNode,
pub coupon_code: String,
pub source: Option<String>,
pub discount: Option<IDiscount>,
pub expires_at: String,
pub updated_at: String,
pub created_at: String,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
#[serde(rename_all = "camelCase")]
pub struct IDiscount {
pub code: String,
pub absolute_sat: u64,
pub relative: f64,
pub overall_sat: u64,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
#[serde(rename_all = "camelCase")]
pub struct ILspNode {
pub alias: String,
pub pubkey: String,
pub connection_strings: Vec<String>,
pub readonly: Option<bool>,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub enum ManualRefundStateEnum {
#[serde(rename = "CREATED")]
Created,
#[serde(rename = "APPROVED")]
Approved,
#[serde(rename = "REJECTED")]
Rejected,
#[serde(rename = "SENT")]
Sent,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
#[serde(rename_all = "camelCase")]
pub struct IManualRefund {
pub amount_sat: u64,
pub target: String,
pub state: ManualRefundStateEnum,
pub created_by_name: String,
pub voted_by_name: Option<String>,
pub reason: Option<String>,
#[serde(rename = "targetType")]
pub target_type: String, }
#[derive(Debug, Serialize, Deserialize, Clone)]
#[serde(rename_all = "camelCase")]
pub struct CreateOrderOptions {
pub client_balance_sat: u64,
pub lsp_node_id: Option<String>,
pub coupon_code: String,
pub source: Option<String>,
pub discount_code: Option<String>,
pub zero_conf: bool,
pub zero_conf_payment: Option<bool>,
pub zero_reserve: bool,
pub client_node_id: Option<String>,
pub timestamp: Option<String>,
pub signature: Option<String>,
pub refund_onchain_address: Option<String>,
pub announce_channel: bool,
}
impl Default for CreateOrderOptions {
fn default() -> Self {
Self {
client_balance_sat: 0,
lsp_node_id: None,
coupon_code: String::new(),
source: None,
discount_code: None,
zero_conf: false,
zero_conf_payment: None,
zero_reserve: false,
client_node_id: None,
timestamp: None,
signature: None,
refund_onchain_address: None,
announce_channel: false,
}
}
}
#[derive(Debug, Serialize, Deserialize, Clone)]
#[serde(rename_all = "camelCase")]
pub struct CreateCjitOptions {
pub source: Option<String>,
pub discount_code: Option<String>,
}
impl Default for CreateCjitOptions {
fn default() -> Self {
Self {
source: None,
discount_code: None,
}
}
}
impl std::str::FromStr for BtOrderState2 {
type Err = BlocktankError;
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s {
"Created" => Ok(BtOrderState2::Created),
"Expired" => Ok(BtOrderState2::Expired),
"Executed" => Ok(BtOrderState2::Executed),
"Paid" => Ok(BtOrderState2::Paid),
_ => Err(BlocktankError::DataError {
error_details: format!("Invalid BtOrderState2 value: {}", s),
}),
}
}
}
impl std::str::FromStr for BtOrderState {
type Err = BlocktankError;
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s {
"Created" => Ok(BtOrderState::Created),
"Expired" => Ok(BtOrderState::Expired),
"Open" => Ok(BtOrderState::Open),
"Closed" => Ok(BtOrderState::Closed),
_ => Err(BlocktankError::DataError {
error_details: format!("Invalid BtOrderState value: {}", s),
}),
}
}
}
impl std::str::FromStr for CJitStateEnum {
type Err = BlocktankError;
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s {
"Created" => Ok(CJitStateEnum::Created),
"Completed" => Ok(CJitStateEnum::Completed),
"Expired" => Ok(CJitStateEnum::Expired),
"Failed" => Ok(CJitStateEnum::Failed),
_ => Err(BlocktankError::DataError {
error_details: format!("Invalid CJitStateEnum value: {}", s),
}),
}
}
}
#[derive(Debug, Deserialize)]
pub struct ApiValidationError {
#[serde(rename = "type")]
error_type: String,
pub(crate) errors: ApiErrorDetails,
}
#[derive(Debug, Deserialize)]
pub struct ApiErrorDetails {
pub(crate) issues: Vec<ApiErrorIssue>,
name: String,
}
#[derive(Debug, Deserialize)]
pub struct ApiErrorIssue {
code: String,
pub(crate) message: String,
path: Vec<String>,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
#[serde(rename_all = "camelCase")]
pub struct IGiftCode {
pub id: String,
pub code: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub scope: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub expires_at: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub gift_sat: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_count: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub updated_at: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub created_at: Option<String>,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
#[serde(rename_all = "camelCase")]
pub struct IGiftBtcAddress {
pub id: String,
pub address: String,
#[serde(default)]
pub transactions: Vec<serde_json::Value>,
#[serde(default)]
pub all_transactions: Vec<serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub is_blacklisted: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub watch_until: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub watch_for_block_confirmations: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub updated_at: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub created_at: Option<String>,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
#[serde(rename_all = "camelCase")]
pub struct IGiftBolt11Invoice {
pub id: String,
pub request: String,
pub state: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub is_hodl_invoice: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub payment_hash: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub amount_sat: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub amount_msat: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub internal_node_pubkey: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub updated_at: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub created_at: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub expires_at: Option<String>,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
#[serde(rename_all = "camelCase")]
pub struct IGiftPayment {
pub id: String,
pub state: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub old_state: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub onchain_state: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub ln_state: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub paid_onchain_sat: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub paid_ln_sat: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub paid_sat: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub is_overpaid: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub is_refunded: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub overpaid_amount_sat: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub required_onchain_confirmations: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub settlement_state: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub expected_amount_sat: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub is_manually_paid: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub btc_address: Option<IGiftBtcAddress>,
#[serde(skip_serializing_if = "Option::is_none")]
pub btc_address_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub bolt11_invoice: Option<IGiftBolt11Invoice>,
#[serde(skip_serializing_if = "Option::is_none")]
pub bolt11_invoice_id: Option<String>,
#[serde(default)]
pub manual_refunds: Vec<serde_json::Value>,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
#[serde(rename_all = "camelCase")]
pub struct IGiftLspNode {
pub alias: String,
pub pubkey: String,
pub connection_strings: Vec<String>,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
#[serde(rename_all = "camelCase")]
pub struct IGiftOrder {
pub id: String,
pub state: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub old_state: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub is_channel_expired: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub is_order_expired: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub lsp_balance_sat: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub client_balance_sat: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub channel_expiry_weeks: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub zero_conf: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub zero_reserve: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub announced: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub client_node_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(rename = "channelExiresAt")]
pub channel_expires_at: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub order_expires_at: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub fee_sat: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub network_fee_sat: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub service_fee_sat: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub payment: Option<IGiftPayment>,
#[serde(skip_serializing_if = "Option::is_none")]
pub lsp_node: Option<IGiftLspNode>,
#[serde(skip_serializing_if = "Option::is_none")]
pub updated_at: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub created_at: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub node_id_verified: Option<bool>,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
#[serde(rename_all = "camelCase")]
pub struct IGift {
pub id: String,
pub node_id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub order_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub order: Option<IGiftOrder>,
#[serde(skip_serializing_if = "Option::is_none")]
pub bolt11_payment_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub bolt11_payment: Option<IGiftPayment>,
#[serde(skip_serializing_if = "Option::is_none")]
pub applied_gift_code_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub applied_gift_code: Option<IGiftCode>,
#[serde(skip_serializing_if = "Option::is_none")]
pub updated_at: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub created_at: Option<String>,
}