{"version":3,"sources":["../../src/config/contracts.ts","../../src/protocols/NFTProtocol.ts","../../src/protocols/TipsProtocol.ts","../../src/protocols/SubscriptionProtocol.ts","../../src/protocols/PayoutsProtocol.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["// Contract addresses for Zubari ecosystem\nexport interface ContractAddresses {\n  registry: string;\n  nft: string;\n  marketplace: string;\n  tips: string;\n  subscriptions: string;\n  payouts: string;\n  entryPoint: string;\n  paymaster: string;\n  accountFactory: string;\n  usdt: string;\n  weth: string;\n}\n\n// Placeholder addresses - will be updated after deployment\nconst ZERO_ADDRESS = '0x0000000000000000000000000000000000000000';\n\nexport const ZUBARI_CONTRACTS: Record<'testnet' | 'mainnet', ContractAddresses> = {\n  testnet: {\n    // Ethereum Sepolia (11155111) - Deployed 2024-12-09\n    registry: '0xEdDf443D48832f23D4A0bED4C4c5eF200B38A7d3',\n    nft: '0xdc37e25650D685e4c38124aC314477Ea5f508a9e',\n    marketplace: ZERO_ADDRESS, // Not yet deployed\n    tips: '0xFDc353edC63Cd3D4bba35bB43861369516a9Dc85',\n    subscriptions: '0x8C05F8aD2F295fB7f3596043a7c37C98A5F7fAB8',\n    payouts: '0x804Fe503936E8b8d3D5Dbb62AF4fB6Fe7265Fb2c',\n    entryPoint: '0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789',\n    paymaster: ZERO_ADDRESS, // Not yet deployed\n    accountFactory: ZERO_ADDRESS, // Not yet deployed\n    usdt: '0xaA8E23Fb1079EA71e0a56F48a2aA51851D8433D0', // USDT on Sepolia\n    weth: '0xfFf9976782d46CC05630D1f6eBAb18b2324d6B14',\n  },\n  mainnet: {\n    // Ethereum Mainnet (1)\n    registry: ZERO_ADDRESS,\n    nft: ZERO_ADDRESS,\n    marketplace: ZERO_ADDRESS,\n    tips: ZERO_ADDRESS,\n    subscriptions: ZERO_ADDRESS,\n    payouts: ZERO_ADDRESS,\n    entryPoint: '0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789',\n    paymaster: ZERO_ADDRESS,\n    accountFactory: ZERO_ADDRESS,\n    usdt: '0xdAC17F958D2ee523a2206206994597C13D831ec7', // USDT on Ethereum\n    weth: '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2',\n  },\n};\n\n// Platform configuration\nexport const PLATFORM_CONFIG = {\n  // Platform fee in basis points (300 = 3%)\n  tipFeeBps: 300,\n  // Maximum royalty in basis points (1000 = 10%)\n  maxRoyaltyBps: 1000,\n  // Default slippage tolerance for swaps (50 = 0.5%)\n  defaultSlippageBps: 50,\n  // Voucher validity in seconds (30 days)\n  voucherValiditySecs: 30 * 24 * 60 * 60,\n  // Swap deadline in seconds (30 minutes)\n  swapDeadlineSecs: 30 * 60,\n} as const;\n\n// EIP-712 Domain for lazy minting\nexport const NFT_VOUCHER_DOMAIN = {\n  name: 'ZubariNFT',\n  version: '1',\n} as const;\n\nexport const NFT_VOUCHER_TYPES = {\n  NFTVoucher: [\n    { name: 'tokenId', type: 'bytes32' },\n    { name: 'uri', type: 'string' },\n    { name: 'creator', type: 'address' },\n    { name: 'royaltyBps', type: 'uint256' },\n    { name: 'deadline', type: 'uint256' },\n  ],\n} as const;\n\nexport function getContractAddresses(network: 'testnet' | 'mainnet'): ContractAddresses {\n  return ZUBARI_CONTRACTS[network];\n}\n","import type {\n  NFTMetadata,\n  LazyMintVoucher,\n  NFT,\n  ListingParams,\n  TxResult,\n} from '../types';\nimport { PLATFORM_CONFIG, NFT_VOUCHER_DOMAIN, NFT_VOUCHER_TYPES } from '../config/contracts';\n\n/**\n * ZubariNFTProtocol - NFT creation and marketplace operations\n *\n * Handles lazy minting via EIP-712 signatures, NFT listing,\n * and marketplace operations on Ethereum network.\n */\nexport class ZubariNFTProtocol {\n  private readonly contractAddress: string;\n  private readonly _marketplaceAddress: string;\n  private readonly chainId: number;\n\n  constructor(\n    contractAddress: string,\n    marketplaceAddress: string,\n    chainId: number\n  ) {\n    this.contractAddress = contractAddress;\n    this._marketplaceAddress = marketplaceAddress;\n    this.chainId = chainId;\n  }\n\n  /**\n   * Create a lazy mint voucher for off-chain NFT creation\n   * The voucher can be redeemed on-chain when purchased\n   */\n  async createLazyMintVoucher(\n    metadata: NFTMetadata,\n    creatorAddress: string,\n    signer: { signTypedData: (domain: object, types: object, value: object) => Promise<string> }\n  ): Promise<LazyMintVoucher> {\n    // Validate royalty\n    if (metadata.royaltyBps > PLATFORM_CONFIG.maxRoyaltyBps) {\n      throw new Error(`Royalty cannot exceed ${PLATFORM_CONFIG.maxRoyaltyBps / 100}%`);\n    }\n\n    // Generate random tokenId\n    const tokenId = this.generateTokenId();\n\n    // Calculate deadline (30 days from now)\n    const deadline = Math.floor(Date.now() / 1000) + PLATFORM_CONFIG.voucherValiditySecs;\n\n    // Build voucher data\n    const voucherData = {\n      tokenId,\n      uri: metadata.image, // Will be IPFS URI\n      creator: creatorAddress,\n      royaltyBps: metadata.royaltyBps,\n      deadline,\n    };\n\n    // Create EIP-712 domain\n    const domain = {\n      ...NFT_VOUCHER_DOMAIN,\n      chainId: this.chainId,\n      verifyingContract: this.contractAddress,\n    };\n\n    // Sign the voucher\n    const signature = await signer.signTypedData(domain, NFT_VOUCHER_TYPES, voucherData);\n\n    return {\n      ...voucherData,\n      signature,\n    };\n  }\n\n  /**\n   * Redeem a lazy mint voucher to mint the NFT on-chain\n   */\n  async redeemVoucher(voucher: LazyMintVoucher, _buyerAddress: string): Promise<TxResult> {\n    // Validate voucher deadline\n    if (voucher.deadline < Math.floor(Date.now() / 1000)) {\n      throw new Error('Voucher has expired');\n    }\n\n    // Placeholder - will call contract\n    return {\n      hash: '',\n      network: 'ethereum',\n      status: 'pending',\n    };\n  }\n\n  /**\n   * List an NFT for sale on the marketplace\n   */\n  async listForSale(_params: ListingParams): Promise<TxResult> {\n    // Placeholder - will approve and list\n    return {\n      hash: '',\n      network: 'ethereum',\n      status: 'pending',\n    };\n  }\n\n  /**\n   * Buy an NFT from the marketplace\n   */\n  async buyNFT(_listingId: string, _price: bigint): Promise<TxResult> {\n    // Placeholder - will call marketplace contract\n    return {\n      hash: '',\n      network: 'ethereum',\n      status: 'pending',\n    };\n  }\n\n  /**\n   * Transfer an NFT to another address\n   */\n  async transfer(_tokenId: string, _to: string): Promise<TxResult> {\n    // Placeholder - will call NFT contract\n    return {\n      hash: '',\n      network: 'ethereum',\n      status: 'pending',\n    };\n  }\n\n  /**\n   * Get NFTs owned by an address\n   */\n  async getOwnedNFTs(_address: string): Promise<NFT[]> {\n    // Placeholder - will query contract/indexer\n    return [];\n  }\n\n  /**\n   * Generate a random tokenId (32 bytes hex)\n   */\n  private generateTokenId(): string {\n    const bytes = new Uint8Array(32);\n    crypto.getRandomValues(bytes);\n    return '0x' + Array.from(bytes).map(b => b.toString(16).padStart(2, '0')).join('');\n  }\n}\n","import type { TipData, TipResult, TipStats, TxResult } from '../types';\nimport { PLATFORM_CONFIG } from '../config/contracts';\n\n/**\n * ZubariTipsProtocol - Micropayment tips for creators\n *\n * Handles ETH and ERC-20 token tips with platform fee distribution.\n * Supports gasless tips via ERC-4337 when enabled.\n */\nexport class ZubariTipsProtocol {\n  private readonly contractAddress: string;\n  private readonly chainId: number;\n  private readonly gaslessEnabled: boolean;\n\n  constructor(contractAddress: string, chainId: number, gaslessEnabled: boolean = false) {\n    this.contractAddress = contractAddress;\n    this.chainId = chainId;\n    this.gaslessEnabled = gaslessEnabled;\n  }\n\n  /**\n   * Send a tip to a creator\n   */\n  async sendTip(tip: TipData): Promise<TipResult> {\n    const { recipient, amount, token, message } = tip;\n\n    // Calculate platform fee (3%)\n    const platformFee = (amount * BigInt(PLATFORM_CONFIG.tipFeeBps)) / BigInt(10000);\n    const creatorAmount = amount - platformFee;\n\n    // Validate amount\n    if (amount <= 0n) {\n      throw new Error('Tip amount must be greater than 0');\n    }\n\n    // Placeholder - will call contract\n    const txResult: TxResult = {\n      hash: '',\n      network: 'ethereum',\n      status: 'pending',\n    };\n\n    return {\n      txHash: txResult.hash,\n      tipId: '', // Will be returned from contract event\n      recipient,\n      amount: creatorAmount,\n      platformFee,\n      timestamp: Math.floor(Date.now() / 1000),\n    };\n  }\n\n  /**\n   * Send tips to multiple creators in a single transaction\n   */\n  async sendBatchTips(tips: TipData[]): Promise<TipResult[]> {\n    if (tips.length === 0) {\n      throw new Error('At least one tip is required');\n    }\n\n    // Calculate total amount needed\n    const totalAmount = tips.reduce((sum, tip) => sum + tip.amount, BigInt(0));\n\n    // Placeholder - will call batch function\n    return tips.map(tip => ({\n      txHash: '',\n      tipId: '',\n      recipient: tip.recipient,\n      amount: tip.amount - (tip.amount * BigInt(PLATFORM_CONFIG.tipFeeBps)) / BigInt(10000),\n      platformFee: (tip.amount * BigInt(PLATFORM_CONFIG.tipFeeBps)) / BigInt(10000),\n      timestamp: Math.floor(Date.now() / 1000),\n    }));\n  }\n\n  /**\n   * Get tips received by an address\n   */\n  async getTipsReceived(address: string): Promise<TipResult[]> {\n    // Placeholder - will query indexer\n    return [];\n  }\n\n  /**\n   * Get tips sent by an address\n   */\n  async getTipsSent(address: string): Promise<TipResult[]> {\n    // Placeholder - will query indexer\n    return [];\n  }\n\n  /**\n   * Get tip statistics for a creator\n   */\n  async getCreatorTipStats(creator: string): Promise<TipStats> {\n    // Placeholder - will query indexer/contract\n    return {\n      totalReceived: BigInt(0),\n      tipCount: 0,\n      uniqueTippers: 0,\n    };\n  }\n\n  /**\n   * Get platform fee in basis points\n   */\n  getPlatformFeeBps(): number {\n    return PLATFORM_CONFIG.tipFeeBps;\n  }\n}\n","import type { SubscriptionPlan, Subscription, TxResult } from '../types';\n\n/**\n * ZubariSubscriptionProtocol - Recurring subscription payments\n *\n * Handles subscription plan creation, subscription management,\n * and verification of active subscriptions.\n */\nexport class ZubariSubscriptionProtocol {\n  private readonly contractAddress: string;\n  private readonly chainId: number;\n\n  constructor(contractAddress: string, chainId: number) {\n    this.contractAddress = contractAddress;\n    this.chainId = chainId;\n  }\n\n  /**\n   * Create a new subscription plan\n   */\n  async createPlan(plan: SubscriptionPlan): Promise<string> {\n    // Validate plan\n    if (!plan.name || plan.name.length === 0) {\n      throw new Error('Plan name is required');\n    }\n    if (plan.price <= 0n) {\n      throw new Error('Plan price must be greater than 0');\n    }\n    if (plan.duration <= 0) {\n      throw new Error('Plan duration must be greater than 0');\n    }\n\n    // Generate planId based on creator + name hash\n    const planId = this.generatePlanId(plan.name);\n\n    // Placeholder - will call contract\n    return planId;\n  }\n\n  /**\n   * Update an existing subscription plan\n   */\n  async updatePlan(planId: string, updates: Partial<SubscriptionPlan>): Promise<TxResult> {\n    // Placeholder - will call contract\n    return {\n      hash: '',\n      network: 'ethereum',\n      status: 'pending',\n    };\n  }\n\n  /**\n   * Subscribe to a creator's plan\n   */\n  async subscribe(\n    creator: string,\n    planId: string,\n    months: number = 1\n  ): Promise<Subscription> {\n    if (months <= 0) {\n      throw new Error('Subscription duration must be at least 1 month');\n    }\n\n    const now = Math.floor(Date.now() / 1000);\n    const durationSeconds = months * 30 * 24 * 60 * 60; // 30 days per month\n\n    // Placeholder - will call contract\n    return {\n      subscriptionId: '',\n      planId,\n      creator,\n      subscriber: '', // Current user address\n      startTime: now,\n      endTime: now + durationSeconds,\n      autoRenew: false,\n      status: 'active',\n    };\n  }\n\n  /**\n   * Cancel an active subscription\n   */\n  async cancel(subscriptionId: string): Promise<TxResult> {\n    // Placeholder - will call contract\n    return {\n      hash: '',\n      network: 'ethereum',\n      status: 'pending',\n    };\n  }\n\n  /**\n   * Check if an address is subscribed to a creator\n   */\n  async isSubscribed(creator: string, subscriber?: string): Promise<boolean> {\n    // Placeholder - will call contract view function\n    return false;\n  }\n\n  /**\n   * Get active subscriptions for a subscriber\n   */\n  async getActiveSubscriptions(subscriber?: string): Promise<Subscription[]> {\n    // Placeholder - will query contract/indexer\n    return [];\n  }\n\n  /**\n   * Get all subscribers for a creator\n   */\n  async getSubscribers(creator: string): Promise<Subscription[]> {\n    // Placeholder - will query contract/indexer\n    return [];\n  }\n\n  /**\n   * Get a specific plan by ID\n   */\n  async getPlan(planId: string): Promise<SubscriptionPlan | null> {\n    // Placeholder - will query contract\n    return null;\n  }\n\n  /**\n   * Get all plans for a creator\n   */\n  async getCreatorPlans(creator: string): Promise<SubscriptionPlan[]> {\n    // Placeholder - will query contract/indexer\n    return [];\n  }\n\n  /**\n   * Generate a unique plan ID\n   */\n  private generatePlanId(name: string): string {\n    const bytes = new Uint8Array(16);\n    crypto.getRandomValues(bytes);\n    return '0x' + Array.from(bytes).map(b => b.toString(16).padStart(2, '0')).join('');\n  }\n}\n","import type { EarningsBreakdown, RevenueSplit, TxResult } from '../types';\n\n/**\n * ZubariPayoutsProtocol - Creator earnings management\n *\n * Handles earnings tracking, claiming, revenue splits,\n * and conversion to stablecoins.\n */\nexport class ZubariPayoutsProtocol {\n  private readonly contractAddress: string;\n  private readonly chainId: number;\n\n  constructor(contractAddress: string, chainId: number) {\n    this.contractAddress = contractAddress;\n    this.chainId = chainId;\n  }\n\n  /**\n   * Get pending earnings breakdown for the current user\n   */\n  async getPendingEarnings(): Promise<EarningsBreakdown> {\n    // Placeholder - will call contract\n    return {\n      tips: BigInt(0),\n      subscriptions: BigInt(0),\n      nftSales: BigInt(0),\n      royalties: BigInt(0),\n      total: BigInt(0),\n    };\n  }\n\n  /**\n   * Get historical earnings for a time period\n   */\n  async getEarningsHistory(\n    period: 'day' | 'week' | 'month' | 'all' = 'all'\n  ): Promise<EarningsBreakdown[]> {\n    // Placeholder - will query indexer\n    return [];\n  }\n\n  /**\n   * Claim all pending earnings\n   */\n  async claimEarnings(): Promise<TxResult> {\n    // Placeholder - will call contract\n    return {\n      hash: '',\n      network: 'ethereum',\n      status: 'pending',\n    };\n  }\n\n  /**\n   * Claim specific amount of earnings\n   */\n  async claimPartialEarnings(amount: bigint): Promise<TxResult> {\n    if (amount <= 0n) {\n      throw new Error('Amount must be greater than 0');\n    }\n\n    // Placeholder - will call contract\n    return {\n      hash: '',\n      network: 'ethereum',\n      status: 'pending',\n    };\n  }\n\n  /**\n   * Setup revenue split with collaborators\n   * Basis points must sum to 10000 (100%)\n   */\n  async setupRevenueSplit(splits: RevenueSplit[]): Promise<TxResult> {\n    // Validate that basis points sum to 100%\n    const totalBps = splits.reduce((sum, split) => sum + split.basisPoints, 0);\n    if (totalBps !== 10000) {\n      throw new Error('Revenue splits must sum to 100% (10000 basis points)');\n    }\n\n    // Validate each split\n    for (const split of splits) {\n      if (split.basisPoints <= 0) {\n        throw new Error('Each split must have positive basis points');\n      }\n      if (!split.recipient || split.recipient.length === 0) {\n        throw new Error('Each split must have a valid recipient address');\n      }\n    }\n\n    // Placeholder - will call contract\n    return {\n      hash: '',\n      network: 'ethereum',\n      status: 'pending',\n    };\n  }\n\n  /**\n   * Get current revenue split configuration\n   */\n  async getRevenueSplit(): Promise<RevenueSplit[]> {\n    // Placeholder - will query contract\n    return [];\n  }\n\n  /**\n   * Remove revenue split (creator gets 100%)\n   */\n  async removeRevenueSplit(): Promise<TxResult> {\n    // Placeholder - will call contract\n    return {\n      hash: '',\n      network: 'ethereum',\n      status: 'pending',\n    };\n  }\n\n  /**\n   * Convert earnings to stablecoin (USDT)\n   */\n  async convertToStable(token: string, amount: bigint): Promise<TxResult> {\n    if (amount <= 0n) {\n      throw new Error('Amount must be greater than 0');\n    }\n\n    // Placeholder - will use swap protocol\n    return {\n      hash: '',\n      network: 'ethereum',\n      status: 'pending',\n    };\n  }\n}\n"]}