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, 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, 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>, pub royalty_payment: Option<String>, }
#[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>, }
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct BRCApprovalRequest {
pub token_id: String,
pub owner: String,
pub approved: String,
}