blacklistrc 0.0.1

BRC: Blacklist Request for Comment
Documentation
use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use std::collections::HashMap;

#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct BRCEvent {
    pub event_type: BRCEventType,
    pub token_id: String,
    pub from: Option<String>,
    pub to: Option<String>,
    pub amount: Option<u64>,
    pub timestamp: DateTime<Utc>,
    pub transaction_hash: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub enum BRCEventType {
    Transfer,
    Mint,
    Approval,
    PaymentReceived,
    RoyaltyPaid,
    StreamStarted,
    StreamStopped,
}

pub trait MintBRC {
    fn mint(&self, req: &BRCMintRequest) -> BRCToken;
}

pub trait TransferBRC {
    fn transfer(&self, req: &BRCTransferRequest) -> BRCEvent;
}

pub trait ApproveBRC {
    fn approve(&self, req: &BRCApprovalRequest) -> BRCEvent;
}

#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct BRCToken {
    pub token_id: String,
    pub owner: String,
    pub approved: Option<String>,
    pub metadata: BRCMetadata,
    pub payment_stream: Option<PaymentStream>,
    pub royalty_info: Option<RoyaltyInfo>,
    pub created_at: DateTime<Utc>,
    pub last_transfer: Option<DateTime<Utc>>,
}

#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct BRCMetadata {
    pub name: String,
    pub symbol: String,
    pub description: String,
    pub image: String,
    pub external_url: Option<String>,
    pub attributes: HashMap<String, String>,
    pub animation_url: Option<String>,
    pub background_color: Option<String>,
    pub youtube_url: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct PaymentStream {
    pub stream_id: String,
    pub amount_per_second: u64, // sats per second
    pub total_amount: u64,
    pub current_amount: u64,
    pub start_time: DateTime<Utc>,
    pub end_time: Option<DateTime<Utc>>,
    pub channel_id: Option<String>,
    pub is_active: bool,
}

#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct RoyaltyInfo {
    pub recipient: String,
    pub percentage: u16, // 0-10000 (basis points)
    pub secondary_sales: bool,
}

#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct BRCTransferRequest {
    pub token_id: String,
    pub from: String,
    pub to: String,
    pub payment_invoice: Option<String>, // Lightning invoice for transfer fee
    pub royalty_payment: Option<String>, // Lightning invoice for royalties
}

#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct BRCMintRequest {
    pub to: String,
    pub metadata: BRCMetadata,
    pub initial_payment_stream: Option<PaymentStream>,
    pub royalty_info: Option<RoyaltyInfo>,
    pub mint_invoice: Option<String>, // Lightning invoice for minting fee
}

#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct BRCApprovalRequest {
    pub token_id: String,
    pub owner: String,
    pub approved: String,
}