@subscrypts/subscrypts-sdk-react 1.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +2140 -0
- package/dist/components/buttons/SubscryptsButton.d.ts +19 -0
- package/dist/components/buttons/SubscryptsButton.d.ts.map +1 -0
- package/dist/components/buttons/index.d.ts +5 -0
- package/dist/components/buttons/index.d.ts.map +1 -0
- package/dist/components/checkout/CheckoutWizard.d.ts +22 -0
- package/dist/components/checkout/CheckoutWizard.d.ts.map +1 -0
- package/dist/components/checkout/ConfigurationStep.d.ts +15 -0
- package/dist/components/checkout/ConfigurationStep.d.ts.map +1 -0
- package/dist/components/checkout/TransactionStep.d.ts +15 -0
- package/dist/components/checkout/TransactionStep.d.ts.map +1 -0
- package/dist/components/checkout/index.d.ts +7 -0
- package/dist/components/checkout/index.d.ts.map +1 -0
- package/dist/components/guards/SubscriptionGuard.d.ts +25 -0
- package/dist/components/guards/SubscriptionGuard.d.ts.map +1 -0
- package/dist/components/guards/index.d.ts +5 -0
- package/dist/components/guards/index.d.ts.map +1 -0
- package/dist/components/index.d.ts +20 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/merchant/MerchantDashboard.d.ts +24 -0
- package/dist/components/merchant/MerchantDashboard.d.ts.map +1 -0
- package/dist/components/merchant/index.d.ts +6 -0
- package/dist/components/merchant/index.d.ts.map +1 -0
- package/dist/components/pricing/PlanCard.d.ts +45 -0
- package/dist/components/pricing/PlanCard.d.ts.map +1 -0
- package/dist/components/pricing/PricingTable.d.ts +68 -0
- package/dist/components/pricing/PricingTable.d.ts.map +1 -0
- package/dist/components/pricing/index.d.ts +10 -0
- package/dist/components/pricing/index.d.ts.map +1 -0
- package/dist/components/shared/ErrorDisplay.d.ts +34 -0
- package/dist/components/shared/ErrorDisplay.d.ts.map +1 -0
- package/dist/components/shared/LoadingSpinner.d.ts +5 -0
- package/dist/components/shared/LoadingSpinner.d.ts.map +1 -0
- package/dist/components/shared/Modal.d.ts +12 -0
- package/dist/components/shared/Modal.d.ts.map +1 -0
- package/dist/components/shared/NetworkSwitchPrompt.d.ts +33 -0
- package/dist/components/shared/NetworkSwitchPrompt.d.ts.map +1 -0
- package/dist/components/shared/SubscryptsErrorBoundary.d.ts +41 -0
- package/dist/components/shared/SubscryptsErrorBoundary.d.ts.map +1 -0
- package/dist/components/subscription/ConfirmDialog.d.ts +44 -0
- package/dist/components/subscription/ConfirmDialog.d.ts.map +1 -0
- package/dist/components/subscription/ManageSubscriptionModal.d.ts +35 -0
- package/dist/components/subscription/ManageSubscriptionModal.d.ts.map +1 -0
- package/dist/components/subscription/SubscriptionCard.d.ts +35 -0
- package/dist/components/subscription/SubscriptionCard.d.ts.map +1 -0
- package/dist/components/subscription/SubscriptionDashboard.d.ts +40 -0
- package/dist/components/subscription/SubscriptionDashboard.d.ts.map +1 -0
- package/dist/components/subscription/index.d.ts +12 -0
- package/dist/components/subscription/index.d.ts.map +1 -0
- package/dist/components/wallet/ConnectWalletModal.d.ts +29 -0
- package/dist/components/wallet/ConnectWalletModal.d.ts.map +1 -0
- package/dist/components/wallet/index.d.ts +6 -0
- package/dist/components/wallet/index.d.ts.map +1 -0
- package/dist/constants/index.d.ts +16 -0
- package/dist/constants/index.d.ts.map +1 -0
- package/dist/context/SubscryptsContext.d.ts +36 -0
- package/dist/context/SubscryptsContext.d.ts.map +1 -0
- package/dist/context/SubscryptsProvider.d.ts +28 -0
- package/dist/context/SubscryptsProvider.d.ts.map +1 -0
- package/dist/context/index.d.ts +7 -0
- package/dist/context/index.d.ts.map +1 -0
- package/dist/contract/abis/Subscrypts.d.ts +2917 -0
- package/dist/contract/abis/Subscrypts.d.ts.map +1 -0
- package/dist/contract/abis/dexFactoryABI.d.ts +184 -0
- package/dist/contract/abis/dexFactoryABI.d.ts.map +1 -0
- package/dist/contract/abis/dexPairABI.d.ts +775 -0
- package/dist/contract/abis/dexPairABI.d.ts.map +1 -0
- package/dist/contract/abis/dexPositionManagerABI.d.ts +948 -0
- package/dist/contract/abis/dexPositionManagerABI.d.ts.map +1 -0
- package/dist/contract/abis/dexQuoterABI.d.ts +206 -0
- package/dist/contract/abis/dexQuoterABI.d.ts.map +1 -0
- package/dist/contract/abis/dexRouterABI.d.ts +439 -0
- package/dist/contract/abis/dexRouterABI.d.ts.map +1 -0
- package/dist/contract/abis/dexUSDCABI.d.ts +132 -0
- package/dist/contract/abis/dexUSDCABI.d.ts.map +1 -0
- package/dist/contract/abis/index.d.ts +15 -0
- package/dist/contract/abis/index.d.ts.map +1 -0
- package/dist/contract/config.d.ts +40 -0
- package/dist/contract/config.d.ts.map +1 -0
- package/dist/contract/index.d.ts +12 -0
- package/dist/contract/index.d.ts.map +1 -0
- package/dist/contract/methods.d.ts +305 -0
- package/dist/contract/methods.d.ts.map +1 -0
- package/dist/hooks/events/index.d.ts +6 -0
- package/dist/hooks/events/index.d.ts.map +1 -0
- package/dist/hooks/events/useSubscryptsEvents.d.ts +63 -0
- package/dist/hooks/events/useSubscryptsEvents.d.ts.map +1 -0
- package/dist/hooks/index.d.ts +12 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/merchant/index.d.ts +10 -0
- package/dist/hooks/merchant/index.d.ts.map +1 -0
- package/dist/hooks/merchant/useMerchantPlans.d.ts +30 -0
- package/dist/hooks/merchant/useMerchantPlans.d.ts.map +1 -0
- package/dist/hooks/merchant/useMerchantRevenue.d.ts +59 -0
- package/dist/hooks/merchant/useMerchantRevenue.d.ts.map +1 -0
- package/dist/hooks/merchant/useMerchantSubscribers.d.ts +54 -0
- package/dist/hooks/merchant/useMerchantSubscribers.d.ts.map +1 -0
- package/dist/hooks/plans/index.d.ts +12 -0
- package/dist/hooks/plans/index.d.ts.map +1 -0
- package/dist/hooks/plans/usePlan.d.ts +33 -0
- package/dist/hooks/plans/usePlan.d.ts.map +1 -0
- package/dist/hooks/plans/usePlans.d.ts +36 -0
- package/dist/hooks/plans/usePlans.d.ts.map +1 -0
- package/dist/hooks/plans/usePlansByMerchant.d.ts +35 -0
- package/dist/hooks/plans/usePlansByMerchant.d.ts.map +1 -0
- package/dist/hooks/pricing/index.d.ts +10 -0
- package/dist/hooks/pricing/index.d.ts.map +1 -0
- package/dist/hooks/pricing/usePlanPrice.d.ts +59 -0
- package/dist/hooks/pricing/usePlanPrice.d.ts.map +1 -0
- package/dist/hooks/pricing/useSUBSPrice.d.ts +39 -0
- package/dist/hooks/pricing/useSUBSPrice.d.ts.map +1 -0
- package/dist/hooks/subscriptions/index.d.ts +12 -0
- package/dist/hooks/subscriptions/index.d.ts.map +1 -0
- package/dist/hooks/subscriptions/useManageSubscription.d.ts +39 -0
- package/dist/hooks/subscriptions/useManageSubscription.d.ts.map +1 -0
- package/dist/hooks/subscriptions/useMySubscriptions.d.ts +53 -0
- package/dist/hooks/subscriptions/useMySubscriptions.d.ts.map +1 -0
- package/dist/hooks/subscriptions/useSubscribe.d.ts +58 -0
- package/dist/hooks/subscriptions/useSubscribe.d.ts.map +1 -0
- package/dist/hooks/subscriptions/useSubscriptionStatus.d.ts +34 -0
- package/dist/hooks/subscriptions/useSubscriptionStatus.d.ts.map +1 -0
- package/dist/hooks/tokens/index.d.ts +6 -0
- package/dist/hooks/tokens/index.d.ts.map +1 -0
- package/dist/hooks/tokens/useTokenBalance.d.ts +36 -0
- package/dist/hooks/tokens/useTokenBalance.d.ts.map +1 -0
- package/dist/hooks/wallet/index.d.ts +6 -0
- package/dist/hooks/wallet/index.d.ts.map +1 -0
- package/dist/hooks/wallet/useWallet.d.ts +40 -0
- package/dist/hooks/wallet/useWallet.d.ts.map +1 -0
- package/dist/index.cjs +2 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +42 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7850 -0
- package/dist/index.js.map +1 -0
- package/dist/services/cache.service.d.ts +89 -0
- package/dist/services/cache.service.d.ts.map +1 -0
- package/dist/services/index.d.ts +7 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/token.service.d.ts +43 -0
- package/dist/services/token.service.d.ts.map +1 -0
- package/dist/services/wallet.service.d.ts +46 -0
- package/dist/services/wallet.service.d.ts.map +1 -0
- package/dist/style.css +3 -0
- package/dist/styles.d.ts +2 -0
- package/dist/styles.d.ts.map +1 -0
- package/dist/types/component.types.d.ts +192 -0
- package/dist/types/component.types.d.ts.map +1 -0
- package/dist/types/contract.types.d.ts +81 -0
- package/dist/types/contract.types.d.ts.map +1 -0
- package/dist/types/index.d.ts +8 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/subscription.types.d.ts +65 -0
- package/dist/types/subscription.types.d.ts.map +1 -0
- package/dist/types/wallet.types.d.ts +53 -0
- package/dist/types/wallet.types.d.ts.map +1 -0
- package/dist/utils/errorMessages.d.ts +44 -0
- package/dist/utils/errorMessages.d.ts.map +1 -0
- package/dist/utils/errors.d.ts +60 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/formatters.d.ts +44 -0
- package/dist/utils/formatters.d.ts.map +1 -0
- package/dist/utils/index.d.ts +10 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/logger.d.ts +80 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/permit.utils.d.ts +52 -0
- package/dist/utils/permit.utils.d.ts.map +1 -0
- package/dist/utils/subscriptionHelpers.d.ts +67 -0
- package/dist/utils/subscriptionHelpers.d.ts.map +1 -0
- package/dist/utils/subscriptionStatus.d.ts +48 -0
- package/dist/utils/subscriptionStatus.d.ts.map +1 -0
- package/dist/utils/validators.d.ts +76 -0
- package/dist/utils/validators.d.ts.map +1 -0
- package/dist/wallet/ExternalConnector.d.ts +32 -0
- package/dist/wallet/ExternalConnector.d.ts.map +1 -0
- package/dist/wallet/InjectedConnector.d.ts +55 -0
- package/dist/wallet/InjectedConnector.d.ts.map +1 -0
- package/dist/wallet/index.d.ts +9 -0
- package/dist/wallet/index.d.ts.map +1 -0
- package/dist/wallet/sessionStore.d.ts +28 -0
- package/dist/wallet/sessionStore.d.ts.map +1 -0
- package/dist/wallet/types.d.ts +66 -0
- package/dist/wallet/types.d.ts.map +1 -0
- package/package.json +99 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../src/context/SubscryptsContext.tsx","../src/utils/errors.ts","../src/services/wallet.service.ts","../src/contract/config.ts","../src/contract/abis/Subscrypts.ts","../src/contract/abis/dexUSDCABI.ts","../src/contract/abis/dexQuoterABI.ts","../src/contract/methods.ts","../src/services/token.service.ts","../src/services/cache.service.ts","../src/constants/index.ts","../src/utils/logger.ts","../src/wallet/InjectedConnector.ts","../src/wallet/ExternalConnector.ts","../src/wallet/sessionStore.ts","../src/context/SubscryptsProvider.tsx","../src/utils/validators.ts","../src/hooks/subscriptions/useSubscriptionStatus.ts","../src/utils/permit.utils.ts","../src/hooks/subscriptions/useSubscribe.ts","../src/hooks/subscriptions/useManageSubscription.ts","../src/hooks/subscriptions/useMySubscriptions.ts","../src/utils/formatters.ts","../src/hooks/tokens/useTokenBalance.ts","../src/hooks/wallet/useWallet.ts","../src/hooks/plans/usePlan.ts","../src/hooks/plans/usePlans.ts","../src/hooks/plans/usePlansByMerchant.ts","../src/hooks/pricing/useSUBSPrice.ts","../src/hooks/pricing/usePlanPrice.ts","../src/hooks/events/useSubscryptsEvents.ts","../src/hooks/merchant/useMerchantPlans.ts","../src/utils/subscriptionStatus.ts","../src/hooks/merchant/useMerchantSubscribers.ts","../src/hooks/merchant/useMerchantRevenue.ts","../src/components/shared/LoadingSpinner.tsx","../src/components/guards/SubscriptionGuard.tsx","../src/components/shared/Modal.tsx","../src/components/checkout/ConfigurationStep.tsx","../src/utils/errorMessages.ts","../src/components/shared/ErrorDisplay.tsx","../src/components/checkout/TransactionStep.tsx","../src/components/checkout/CheckoutWizard.tsx","../src/components/buttons/SubscryptsButton.tsx","../src/components/pricing/PlanCard.tsx","../src/components/pricing/PricingTable.tsx","../src/components/shared/NetworkSwitchPrompt.tsx","../src/components/shared/SubscryptsErrorBoundary.tsx","../src/components/wallet/ConnectWalletModal.tsx","../src/components/subscription/ConfirmDialog.tsx","../src/components/subscription/ManageSubscriptionModal.tsx","../src/components/subscription/SubscriptionCard.tsx","../src/components/subscription/SubscriptionDashboard.tsx","../src/components/merchant/MerchantDashboard.tsx","../src/utils/subscriptionHelpers.ts","../src/index.ts"],"sourcesContent":["/**\n * Subscrypts SDK Context\n */\n\nimport { createContext, useContext } from 'react';\nimport { BrowserProvider, Signer, Contract } from 'ethers';\nimport { NetworkConfig, WalletState } from '../types';\nimport type { WalletConnector, ConnectorId } from '../wallet/types';\nimport type { CacheManager } from '../services/cache.service';\n\n/**\n * Context value type\n */\nexport interface SubscryptsContextValue {\n // Wallet state\n wallet: WalletState;\n signer: Signer | null;\n provider: BrowserProvider | null;\n\n // Network\n network: NetworkConfig;\n switchNetwork: (chainId: number) => Promise<void>;\n\n // Contracts\n subscryptsContract: Contract | null;\n subsTokenContract: Contract | null;\n usdcTokenContract: Contract | null;\n\n // Balances\n subsBalance: bigint | null;\n usdcBalance: bigint | null;\n refreshBalances: () => Promise<void>;\n\n // Cache\n cacheManager: CacheManager;\n\n // Actions (only available if internal wallet management is enabled)\n connect?: () => Promise<void>;\n disconnect?: () => Promise<void>;\n\n // Connector architecture\n connectors: WalletConnector[];\n activeConnector: WalletConnector | null;\n connectWith: (connectorId: ConnectorId) => Promise<void>;\n}\n\n/**\n * Create context with undefined default\n */\nexport const SubscryptsContext = createContext<SubscryptsContextValue | undefined>(undefined);\n\n/**\n * Hook to access Subscrypts context\n */\nexport function useSubscrypts(): SubscryptsContextValue {\n const context = useContext(SubscryptsContext);\n\n if (!context) {\n throw new Error(\n 'useSubscrypts must be used within a SubscryptsProvider'\n );\n }\n\n return context;\n}\n","/**\n * Custom error classes for Subscrypts SDK\n */\n\n/**\n * Base error class for Subscrypts SDK\n */\nexport class SubscryptsError extends Error {\n constructor(\n public code: string,\n message: string,\n public details?: Record<string, unknown>\n ) {\n super(message);\n this.name = 'SubscryptsError';\n Object.setPrototypeOf(this, SubscryptsError.prototype);\n }\n}\n\n/**\n * Wallet connection errors\n */\nexport class WalletError extends SubscryptsError {\n constructor(message: string, details?: Record<string, unknown>) {\n super('WALLET_ERROR', message, details);\n this.name = 'WalletError';\n }\n}\n\n/**\n * Network errors\n */\nexport class NetworkError extends SubscryptsError {\n constructor(message: string, details?: Record<string, unknown>) {\n super('NETWORK_ERROR', message, details);\n this.name = 'NetworkError';\n }\n}\n\n/**\n * Contract interaction errors\n */\nexport class ContractError extends SubscryptsError {\n constructor(message: string, details?: Record<string, unknown>) {\n super('CONTRACT_ERROR', message, details);\n this.name = 'ContractError';\n }\n}\n\n/**\n * Insufficient balance errors\n */\nexport class InsufficientBalanceError extends SubscryptsError {\n constructor(\n public required: bigint,\n public available: bigint,\n public token: 'SUBS' | 'USDC'\n ) {\n super(\n 'INSUFFICIENT_BALANCE',\n `Insufficient ${token} balance. Required: ${required}, Available: ${available}`,\n { required: required.toString(), available: available.toString(), token }\n );\n this.name = 'InsufficientBalanceError';\n }\n}\n\n/**\n * Transaction errors\n */\nexport class TransactionError extends SubscryptsError {\n constructor(message: string, public txHash?: string, details?: Record<string, unknown>) {\n super('TRANSACTION_ERROR', message, { ...details, txHash });\n this.name = 'TransactionError';\n }\n}\n\n/**\n * Validation errors\n */\nexport class ValidationError extends SubscryptsError {\n constructor(field: string, message: string) {\n super('VALIDATION_ERROR', message, { field });\n this.name = 'ValidationError';\n }\n}\n\n/**\n * Sanctions errors - thrown when address is sanctioned\n */\nexport class SanctionsError extends SubscryptsError {\n public readonly address: string;\n public readonly isMerchant: boolean;\n\n constructor(address: string, isMerchant: boolean, details?: Record<string, unknown>) {\n super(\n 'SANCTIONS_ERROR',\n `Address ${address} is sanctioned and cannot ${isMerchant ? 'receive payments' : 'create subscriptions'}`,\n details\n );\n this.name = 'SanctionsError';\n this.address = address;\n this.isMerchant = isMerchant;\n }\n}\n","/**\n * Wallet service for managing wallet connections\n */\n\nimport { BrowserProvider, Eip1193Provider } from 'ethers';\nimport { WalletError, NetworkError } from '../utils/errors';\nimport { NetworkConfig } from '../types';\n\n/**\n * Service class for wallet connection and management\n */\nexport class WalletService {\n private provider: BrowserProvider | null = null;\n\n /**\n * Connect to browser wallet (MetaMask, etc.)\n */\n async connect(): Promise<{\n provider: BrowserProvider;\n address: string;\n chainId: number;\n }> {\n if (typeof window === 'undefined' || !window.ethereum) {\n throw new WalletError(\n 'No Ethereum wallet found. Please install MetaMask or another Web3 wallet.'\n );\n }\n\n try {\n const ethereumProvider = window.ethereum as Eip1193Provider;\n this.provider = new BrowserProvider(ethereumProvider);\n\n // Request account access\n const accounts = await this.provider.send('eth_requestAccounts', []);\n\n if (!accounts || accounts.length === 0) {\n throw new WalletError('No accounts found. Please unlock your wallet.');\n }\n\n const network = await this.provider.getNetwork();\n const chainId = Number(network.chainId);\n\n return {\n provider: this.provider,\n address: accounts[0],\n chainId\n };\n } catch (error) {\n if (error instanceof WalletError) {\n throw error;\n }\n throw new WalletError('Failed to connect wallet', { error });\n }\n }\n\n /**\n * Switch to a specific network\n */\n async switchNetwork(targetNetwork: NetworkConfig): Promise<void> {\n if (!window.ethereum) {\n throw new WalletError('No Ethereum wallet found');\n }\n\n try {\n await window.ethereum.request({\n method: 'wallet_switchEthereumChain',\n params: [{ chainId: `0x${targetNetwork.chainId.toString(16)}` }]\n });\n } catch (error: any) {\n // If chain not added, try to add it\n if (error.code === 4902) {\n await this.addNetwork(targetNetwork);\n } else {\n throw new NetworkError(\n `Failed to switch to ${targetNetwork.name}`,\n { chainId: targetNetwork.chainId, error }\n );\n }\n }\n }\n\n /**\n * Add a network to the wallet\n */\n async addNetwork(network: NetworkConfig): Promise<void> {\n if (!window.ethereum) {\n throw new WalletError('No Ethereum wallet found');\n }\n\n try {\n await window.ethereum.request({\n method: 'wallet_addEthereumChain',\n params: [\n {\n chainId: `0x${network.chainId.toString(16)}`,\n chainName: network.name,\n nativeCurrency: network.nativeCurrency,\n rpcUrls: [network.rpcUrl],\n blockExplorerUrls: [network.blockExplorer]\n }\n ]\n });\n } catch (error) {\n throw new NetworkError(\n `Failed to add ${network.name} network`,\n { network, error }\n );\n }\n }\n\n /**\n * Get current provider\n */\n getProvider(): BrowserProvider | null {\n return this.provider;\n }\n\n /**\n * Listen to account changes\n */\n onAccountsChanged(callback: (...args: unknown[]) => void): void {\n if (window.ethereum) {\n window.ethereum.on('accountsChanged', callback);\n }\n }\n\n /**\n * Listen to network changes\n */\n onChainChanged(callback: (...args: unknown[]) => void): void {\n if (window.ethereum) {\n window.ethereum.on('chainChanged', callback);\n }\n }\n\n /**\n * Remove account change listener\n */\n removeAccountsChangedListener(callback: (...args: unknown[]) => void): void {\n if (window.ethereum) {\n window.ethereum.removeListener('accountsChanged', callback);\n }\n }\n\n /**\n * Remove network change listener\n */\n removeChainChangedListener(callback: (...args: unknown[]) => void): void {\n if (window.ethereum) {\n window.ethereum.removeListener('chainChanged', callback);\n }\n }\n}\n","/**\n * Blockchain Configuration for Subscrypts SDK\n *\n * Central file for all blockchain-related constants:\n * - Network configuration (chain ID, RPC, explorer)\n * - Smart contract addresses\n * - Token addresses and decimals\n * - DEX/Uniswap addresses\n * - PERMIT2 configuration\n */\n\nimport { NetworkConfig } from '../types';\n\n// ============================================\n// NETWORK CONFIG\n// ============================================\n\nexport const CHAIN_ID = 42161;\nexport const CHAIN_NAME = 'Arbitrum One';\n\nexport const RPC_URLS = [\n 'https://arb1.arbitrum.io/rpc',\n 'https://rpc.ankr.com/arbitrum',\n 'https://arbitrum.llamarpc.com'\n];\n\nexport const DEFAULT_RPC_URL = RPC_URLS[0];\nexport const BLOCK_EXPLORER = 'https://arbiscan.io';\n\nexport const NETWORK_CONFIG: NetworkConfig = {\n chainId: CHAIN_ID,\n name: CHAIN_NAME,\n rpcUrl: DEFAULT_RPC_URL,\n blockExplorer: BLOCK_EXPLORER,\n nativeCurrency: {\n name: 'Ether',\n symbol: 'ETH',\n decimals: 18\n }\n};\n\n// ============================================\n// SUBSCRYPTS CONTRACT\n// ============================================\n\n/**\n * Subscrypts proxy contract address\n * UUPS Diamond Facet pattern - handles both subscriptions and SUBS token\n */\nexport const SUBSCRYPTS_ADDRESS = '0xE2E5409C4B4Be5b67C69Cc2C6507B0598D069Eac';\n\n// Alias for clarity (same address due to Diamond Facet)\nexport const SUBS_TOKEN_ADDRESS = SUBSCRYPTS_ADDRESS;\n\n// ============================================\n// TOKEN ADDRESSES\n// ============================================\n\nexport const USDC_ADDRESS = '0xaf88d065e77c8cC2239327C5EDb3A432268e5831';\n\n// ============================================\n// TOKEN DECIMALS\n// ============================================\n\nexport const DECIMALS = {\n SUBS: 18,\n USDC: 6,\n ETH: 18\n} as const;\n\n// ============================================\n// UNISWAP / DEX CONFIG\n// ============================================\n\nexport const DEX_FACTORY_ADDRESS = '0x1F98431c8aD98523631AE4a59f267346ea31F984';\nexport const DEX_QUOTER_ADDRESS = '0x61fFE014bA17989E743c5F6cB21bF9697530B21e';\nexport const DEX_ROUTER_ADDRESS = '0xa51afafe0263b40edaef0df8781ea9aa03e381a3';\nexport const DEX_POSITION_MANAGER_ADDRESS = '0xC36442b4a4522E871399CD717aBDD847Ab11FE88';\nexport const DEX_PAIR_ADDRESS = '0xa8C221C5110FA82b0B90A6bA78227C2EE8061f48';\n\nexport const UNISWAP_FEE_TIER = 3000; // 0.3%\n\n// ============================================\n// PERMIT2 CONFIG\n// ============================================\n\nexport const PERMIT2_ADDRESS = '0x000000000022D473030F116dDEE9F6B43aC78BA3';\n\n// ============================================\n// SDK DEFAULTS\n// ============================================\n\nexport const DEFAULTS = {\n NETWORK: 'arbitrum' as const, // Default network\n BALANCE_REFRESH_INTERVAL: 30000, // 30 seconds\n SUBSCRIPTION_CACHE_TIME: 30000, // 30 seconds\n DEFAULT_CYCLE_LIMIT: 12,\n TRANSACTION_DEADLINE_SECONDS: 300, // 5 minutes\n PERMIT_DEADLINE_SECONDS: 1800, // 30 minutes\n SLIPPAGE_BUFFER_BPS: 50, // 0.5% (50 basis points)\n UNISWAP_FEE_TIER: UNISWAP_FEE_TIER // Re-export for convenience\n} as const;\n\n// ============================================\n// HELPER FUNCTIONS\n// ============================================\n\nexport function isArbitrumNetwork(chainId: number): boolean {\n return chainId === CHAIN_ID;\n}\n\nexport function getSubscryptsAddress(chainId: number): string {\n if (chainId !== CHAIN_ID) {\n throw new Error(`Subscrypts only deployed on Arbitrum One (chain ${CHAIN_ID})`);\n }\n return SUBSCRYPTS_ADDRESS;\n}\n","\nexport const subscryptsABI = [\n {\n \"inputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"constructor\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"implementation\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"ERC1967InvalidImplementation\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"ERC1967NonPayable\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"spender\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"allowance\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"needed\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"ERC20InsufficientAllowance\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"sender\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"balance\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"needed\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"ERC20InsufficientBalance\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"approver\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"ERC20InvalidApprover\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"receiver\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"ERC20InvalidReceiver\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"sender\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"ERC20InvalidSender\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"spender\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"ERC20InvalidSpender\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"UUPSUnauthorizedCallContext\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"slot\",\n \"type\": \"bytes32\"\n }\n ],\n \"name\": \"UUPSUnsupportedProxiableUUID\",\n \"type\": \"error\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"owner\",\n \"type\": \"address\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"spender\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"value\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"Approval\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"from\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"amt\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"BurnByAdmin\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"bytes4\",\n \"name\": \"selector\",\n \"type\": \"bytes4\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"facet\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"FacetSelectorUpdated\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"target\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"bool\",\n \"name\": \"frozen\",\n \"type\": \"bool\"\n }\n ],\n \"name\": \"FrozenFunds\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": false,\n \"internalType\": \"uint8\",\n \"name\": \"version\",\n \"type\": \"uint8\"\n }\n ],\n \"name\": \"Initialized\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"to\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"amt\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"MintByAdmin\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"previousOwner\",\n \"type\": \"address\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"newOwner\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"OwnershipTransferred\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"account\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"bool\",\n \"name\": \"enabled\",\n \"type\": \"bool\"\n }\n ],\n \"name\": \"ServiceAccountChanged\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"from\",\n \"type\": \"address\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"to\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"value\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"Transfer\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"implementation\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"Upgraded\",\n \"type\": \"event\"\n },\n {\n \"stateMutability\": \"payable\",\n \"type\": \"fallback\"\n },\n {\n \"inputs\": [],\n \"name\": \"UPGRADE_INTERFACE_VERSION\",\n \"outputs\": [\n {\n \"internalType\": \"string\",\n \"name\": \"\",\n \"type\": \"string\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"_planAutoIncrement\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"_value\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"_subscriptionAutoIncrement\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"_value\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"owner\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"spender\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"allowance\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"spender\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"value\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"approve\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"account\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"balanceOf\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"value\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"burn\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"from\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"amt\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"burnByAdmin\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"account\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"value\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"burnFrom\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"contractAddress\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"acct\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"bool\",\n \"name\": \"freeze\",\n \"type\": \"bool\"\n }\n ],\n \"name\": \"contractFreezeAccount\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"contractFundAddress\",\n \"outputs\": [\n {\n \"internalType\": \"address payable\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"contractHaltCurrencyUSD\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"contractHaltNonServiceTransfers\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"contractHaltPlanCreation\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"contractHaltSubcriptions\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"contractHaltSubscriptionPayments\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"addAcct\",\n \"type\": \"bool\"\n },\n {\n \"internalType\": \"bool\",\n \"name\": \"delAcct\",\n \"type\": \"bool\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"acct\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"contractServiceAccountsCHG\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"decimals\",\n \"outputs\": [\n {\n \"internalType\": \"uint8\",\n \"name\": \"\",\n \"type\": \"uint8\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"dexFactory\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"dexPair\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"dexPositionManager\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"dexQuoter\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"dexRouter\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"dexUSDC\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"facetAdmin\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"facetPaymentUsdc\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"facetSubscription\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"facetView\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"getContractDetails\",\n \"outputs\": [\n {\n \"internalType\": \"string\",\n \"name\": \"Symbol\",\n \"type\": \"string\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"Owner\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"ContractAddress\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"ContractBalanceNative\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"ContractBalanceToken\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"TokenHolders\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"TokenTransactions\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"TotalSupply\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"getContractHaltStates\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"ContracthaltNonServiceTransfers\",\n \"type\": \"bool\"\n },\n {\n \"internalType\": \"bool\",\n \"name\": \"ContracthaltPlanCreation\",\n \"type\": \"bool\"\n },\n {\n \"internalType\": \"bool\",\n \"name\": \"ContracthaltSubcriptions\",\n \"type\": \"bool\"\n },\n {\n \"internalType\": \"bool\",\n \"name\": \"ContracthaltSubscriptionPayments\",\n \"type\": \"bool\"\n },\n {\n \"internalType\": \"bool\",\n \"name\": \"ContracthaltCurrencyUSD\",\n \"type\": \"bool\"\n },\n {\n \"internalType\": \"bool\",\n \"name\": \"SanctionsCheckEnabled\",\n \"type\": \"bool\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"SanctionsContract\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes4\",\n \"name\": \"selector\",\n \"type\": \"bytes4\"\n }\n ],\n \"name\": \"getFacetSelector\",\n \"outputs\": [\n {\n \"internalType\": \"bytes4\",\n \"name\": \"\",\n \"type\": \"bytes4\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"getSubscriptionAndPlanDetails\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"ContractFundAddress\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"bool\",\n \"name\": \"SubscriptionCollectPassiveEnabled\",\n \"type\": \"bool\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"SubscriptionCollectPassiveIndex\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"SubscriptionCollectPassiveMax\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"TotalSubscriptionsActive\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"PlanCreationCost\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"PlanVerificationCost\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"PlanDefaultCommission\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"initialize\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"listFacetSelectors\",\n \"outputs\": [\n {\n \"components\": [\n {\n \"internalType\": \"bytes4\",\n \"name\": \"selector\",\n \"type\": \"bytes4\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"facetAddress\",\n \"type\": \"address\"\n }\n ],\n \"internalType\": \"struct Subscrypts.FacetSelectorEntry[]\",\n \"name\": \"out\",\n \"type\": \"tuple[]\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"to\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"amt\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"mintByAdmin\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"name\",\n \"outputs\": [\n {\n \"internalType\": \"string\",\n \"name\": \"\",\n \"type\": \"string\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"owner\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"planCreationCost\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"planDefaultCommission\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"planVerificationCost\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"proxiableUUID\",\n \"outputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"\",\n \"type\": \"bytes32\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"proxyLogic\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes4\",\n \"name\": \"selector\",\n \"type\": \"bytes4\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"facetAddress\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"registerFacetSelector\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"registeredSelectors\",\n \"outputs\": [\n {\n \"internalType\": \"bytes4\",\n \"name\": \"\",\n \"type\": \"bytes4\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"renounceOwnership\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"sanctionsCheckEnabled\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"sanctionsContract\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"from\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"to\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"subCheckSanctions\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n },\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"from\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"amt\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"subInternalBurn\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"to\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"amt\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"subInternalMint\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"subTxIncrement\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"subscriptionCollectPassiveEnabled\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"subscriptionCollectPassiveIndex\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"subscriptionCollectPassiveMax\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"symbol\",\n \"outputs\": [\n {\n \"internalType\": \"string\",\n \"name\": \"\",\n \"type\": \"string\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"tokenHolders\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"tokenTransactions\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"totalSubscriptionsActive\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"totalSupply\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"to\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"value\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"transfer\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"from\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"to\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"value\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"transferFrom\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"newOwner\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"transferOwnership\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes4\",\n \"name\": \"selector\",\n \"type\": \"bytes4\"\n }\n ],\n \"name\": \"unregisterFacetSelector\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"newImplementation\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"bytes\",\n \"name\": \"data\",\n \"type\": \"bytes\"\n }\n ],\n \"name\": \"upgradeToAndCall\",\n \"outputs\": [],\n \"stateMutability\": \"payable\",\n \"type\": \"function\"\n },\n {\n \"stateMutability\": \"payable\",\n \"type\": \"receive\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"planid\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"getPlan\",\n \"outputs\": [\n {\n \"components\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"id\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"merchantAddress\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"currencyCode\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"subscriptionAmount\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"paymentFrequency\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"referralBonus\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"commission\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bytes32\",\n \"name\": \"description\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"bytes32\",\n \"name\": \"defaultAttributes\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"verificationExpiryDate\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"subscriberCount\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bool\",\n \"name\": \"isActive\",\n \"type\": \"bool\"\n }\n ],\n \"internalType\": \"struct SubscryptsStorage.Plan\",\n \"name\": \"\",\n \"type\": \"tuple\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"planid\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"subscriber\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"getPlanSubscription\",\n \"outputs\": [\n {\n \"components\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"id\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"merchantAddress\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"planId\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"subscriberAddress\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"currencyCode\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"subscriptionAmount\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"paymentFrequency\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bool\",\n \"name\": \"isRecurring\",\n \"type\": \"bool\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"remainingCycles\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bytes32\",\n \"name\": \"customAttributes\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"lastPaymentDate\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"nextPaymentDate\",\n \"type\": \"uint256\"\n }\n ],\n \"internalType\": \"struct SubscryptsStorage.Subscription\",\n \"name\": \"\",\n \"type\": \"tuple\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"indexStart\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"indexEnd\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"getPlans\",\n \"outputs\": [\n {\n \"components\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"id\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"merchantAddress\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"currencyCode\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"subscriptionAmount\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"paymentFrequency\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"referralBonus\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"commission\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bytes32\",\n \"name\": \"description\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"bytes32\",\n \"name\": \"defaultAttributes\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"verificationExpiryDate\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"subscriberCount\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bool\",\n \"name\": \"isActive\",\n \"type\": \"bool\"\n }\n ],\n \"internalType\": \"struct SubscryptsStorage.Plan[]\",\n \"name\": \"\",\n \"type\": \"tuple[]\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"IndexStart\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"IndexEnd\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"PlanLength\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"subscriptionid\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"getSubscription\",\n \"outputs\": [\n {\n \"components\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"id\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"merchantAddress\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"planId\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"subscriberAddress\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"currencyCode\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"subscriptionAmount\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"paymentFrequency\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bool\",\n \"name\": \"isRecurring\",\n \"type\": \"bool\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"remainingCycles\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bytes32\",\n \"name\": \"customAttributes\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"lastPaymentDate\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"nextPaymentDate\",\n \"type\": \"uint256\"\n }\n ],\n \"internalType\": \"struct SubscryptsStorage.Subscription\",\n \"name\": \"\",\n \"type\": \"tuple\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"indexStart\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"indexEnd\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"getSubscriptions\",\n \"outputs\": [\n {\n \"components\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"id\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"merchantAddress\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"planId\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"subscriberAddress\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"currencyCode\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"subscriptionAmount\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"paymentFrequency\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bool\",\n \"name\": \"isRecurring\",\n \"type\": \"bool\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"remainingCycles\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bytes32\",\n \"name\": \"customAttributes\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"lastPaymentDate\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"nextPaymentDate\",\n \"type\": \"uint256\"\n }\n ],\n \"internalType\": \"struct SubscryptsStorage.Subscription[]\",\n \"name\": \"\",\n \"type\": \"tuple[]\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"IndexStart\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"IndexEnd\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"SubscriptionLength\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"subscriber\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"indexStart\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"indexEnd\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"getSubscriptionsByAddress\",\n \"outputs\": [\n {\n \"components\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"id\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"merchantAddress\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"planId\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"subscriberAddress\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"currencyCode\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"subscriptionAmount\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"paymentFrequency\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bool\",\n \"name\": \"isRecurring\",\n \"type\": \"bool\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"remainingCycles\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bytes32\",\n \"name\": \"customAttributes\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"lastPaymentDate\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"nextPaymentDate\",\n \"type\": \"uint256\"\n }\n ],\n \"internalType\": \"struct SubscryptsStorage.Subscription[]\",\n \"name\": \"\",\n \"type\": \"tuple[]\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"IndexStart\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"IndexEnd\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"SubscriberSubscriptionsLength\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"planid\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"indexStart\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"indexEnd\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"getSubscriptionsByPlan\",\n \"outputs\": [\n {\n \"components\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"id\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"merchantAddress\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"planId\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"subscriberAddress\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"currencyCode\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"subscriptionAmount\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"paymentFrequency\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bool\",\n \"name\": \"isRecurring\",\n \"type\": \"bool\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"remainingCycles\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bytes32\",\n \"name\": \"customAttributes\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"lastPaymentDate\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"nextPaymentDate\",\n \"type\": \"uint256\"\n }\n ],\n \"internalType\": \"struct SubscryptsStorage.Subscription[]\",\n \"name\": \"\",\n \"type\": \"tuple[]\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"IndexStart\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"IndexEnd\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"MerchantPlanSubscriptionsLength\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"facetAddr\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"AdminFacetUpdated\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": false,\n \"internalType\": \"address\",\n \"name\": \"newFundAddress\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"ContractFundAddressChanged\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": false,\n \"internalType\": \"bool\",\n \"name\": \"newSanctionsCheckEnabled\",\n \"type\": \"bool\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"address\",\n \"name\": \"newSanctionsContract\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"ContractSanctionsChanged\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": false,\n \"internalType\": \"address\",\n \"name\": \"newDexFactory\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"address\",\n \"name\": \"newDexRouter\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"address\",\n \"name\": \"newDexPair\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"address\",\n \"name\": \"newDexPositionManager\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"address\",\n \"name\": \"newDexQuoter\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"address\",\n \"name\": \"newDexUSDC\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"DexGovernanceChanged\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": false,\n \"internalType\": \"bool\",\n \"name\": \"newHaltNonServiceTransfers\",\n \"type\": \"bool\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"bool\",\n \"name\": \"newHaltPlanCreation\",\n \"type\": \"bool\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"bool\",\n \"name\": \"newHaltSubscriptions\",\n \"type\": \"bool\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"bool\",\n \"name\": \"newHaltSubscriptionPayments\",\n \"type\": \"bool\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"bool\",\n \"name\": \"newHaltCurrencyUSD\",\n \"type\": \"bool\"\n }\n ],\n \"name\": \"HaltStatesChanged\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"facetAddr\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"PaymentUsdcUpdated\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"uint256\",\n \"name\": \"planid\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"address\",\n \"name\": \"newMerchant\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"newAmount\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"newFrequency\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"newReferralBonus\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"newCommission\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"bytes32\",\n \"name\": \"newDescription\",\n \"type\": \"bytes32\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"bytes32\",\n \"name\": \"newAttributes\",\n \"type\": \"bytes32\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"newVerifExpDate\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"bool\",\n \"name\": \"newActive\",\n \"type\": \"bool\"\n }\n ],\n \"name\": \"PlanChanged\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"newPlanCreationCost\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"newPlanVerificationCost\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"newPlanDefaultCommission\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"PlanGovernanceChanged\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"indexStart\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"indexEnd\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"planid\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"newAmount\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"newFrequency\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"bytes32\",\n \"name\": \"newAttribute\",\n \"type\": \"bytes32\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"bool\",\n \"name\": \"overrideRecurring\",\n \"type\": \"bool\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"subscriptionChanged\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"PlanSubscriptionsBulkChanged\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"logicAddr\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"ProxyLogicUpdated\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": false,\n \"internalType\": \"bool\",\n \"name\": \"newEnabled\",\n \"type\": \"bool\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"newMax\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"SubscriptionCollectPassiveChanged\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"facetAddr\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"SubscriptionFacetUpdated\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"facetAddr\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"ViewFacetUpdated\",\n \"type\": \"event\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address payable\",\n \"name\": \"newcontractFundAddress\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"contractFundAddressCHG\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"newSanctionsCheckEnabled\",\n \"type\": \"bool\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"newSanctionsContract\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"contractSanctionsContractCHG\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"newDexFactory\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"newDexRouter\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"newDexPair\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"newDexPositionManager\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"newDexQuoter\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"newDexUSDC\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"dexGovernanceCHG\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"updatedDexFactory\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"updatedDexRouter\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"updatedDexPair\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"updatedDexPositionManager\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"updatedDexQuoter\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"updateddexUSDC\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"planid\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"merchant\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"amount\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"frequency\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"referralbonus\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"contractcommission\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bytes32\",\n \"name\": \"description\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"bytes32\",\n \"name\": \"setAttribute\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"verifExpDate\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bool\",\n \"name\": \"active\",\n \"type\": \"bool\"\n }\n ],\n \"name\": \"planChange\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"indexStart\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"indexEnd\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"planid\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"amount\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"frequency\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bytes32\",\n \"name\": \"attribute\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"bool\",\n \"name\": \"overrideRecurring\",\n \"type\": \"bool\"\n }\n ],\n \"name\": \"planChangeSubscriptionsBulk\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"IndexStart\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"IndexEnd\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"SubscriptionChanged\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"newPlanCreationCost\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"newPlanVerificationCost\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"newPlanDefaultCommission\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"planGoveranceCHG\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"PlanCreationCost\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"PlanVerificationCost\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"PlanDefaultCommission\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"facetAddr\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"setFacetAdmin\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"facetAddr\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"setFacetPaymentUsdc\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"facetAddr\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"setFacetSubscription\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"facetAddr\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"setFacetView\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"haltNonServiceTransfers\",\n \"type\": \"bool\"\n },\n {\n \"internalType\": \"bool\",\n \"name\": \"haltPlanCreation\",\n \"type\": \"bool\"\n },\n {\n \"internalType\": \"bool\",\n \"name\": \"haltSubscriptions\",\n \"type\": \"bool\"\n },\n {\n \"internalType\": \"bool\",\n \"name\": \"haltSubscriptionPayments\",\n \"type\": \"bool\"\n },\n {\n \"internalType\": \"bool\",\n \"name\": \"haltCurrencyUSD\",\n \"type\": \"bool\"\n }\n ],\n \"name\": \"setHaltStates\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"IsHaltNonServiceTransfers\",\n \"type\": \"bool\"\n },\n {\n \"internalType\": \"bool\",\n \"name\": \"IsHaltPlanCreation\",\n \"type\": \"bool\"\n },\n {\n \"internalType\": \"bool\",\n \"name\": \"IsHaltSubscriptions\",\n \"type\": \"bool\"\n },\n {\n \"internalType\": \"bool\",\n \"name\": \"IsHaltSubscriptionPayments\",\n \"type\": \"bool\"\n },\n {\n \"internalType\": \"bool\",\n \"name\": \"IsHaltCurrencyUSD\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"logicAddr\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"setProxyLogicAddress\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"enable\",\n \"type\": \"bool\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"newsubscriptionCollectPassiveMax\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"subscriptionCollectPassiveCHG\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"uint256\",\n \"name\": \"id\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"currency\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"amount\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"frequency\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"_planCreate\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"uint256\",\n \"name\": \"subscriptionId\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"planId\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"address\",\n \"name\": \"subscriber\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"bool\",\n \"name\": \"recurring\",\n \"type\": \"bool\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"remainingCycles\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"address\",\n \"name\": \"referral\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"_subscriptionCreate\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"uint256\",\n \"name\": \"subscriptionId\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"planId\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"address\",\n \"name\": \"subscriber\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"amount\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"_subscriptionPay\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"uint256\",\n \"name\": \"subscriptionId\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"address\",\n \"name\": \"merchant\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"planId\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"address\",\n \"name\": \"subscriber\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"bool\",\n \"name\": \"enabled\",\n \"type\": \"bool\"\n }\n ],\n \"name\": \"_subscriptionRecurring\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"uint256\",\n \"name\": \"subscriptionid\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"address\",\n \"name\": \"merchant\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"planfk\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"address\",\n \"name\": \"subscriber\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"_subscriptionStop\",\n \"type\": \"event\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"amountUSDC18\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"convertOtherCurrencyToToken\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"outputSUBS18\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"inputUSDC18\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"value1USDCInSUBS\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"amountSUBS18\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"convertTokenToOtherCurrency\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"outputUSDC18\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"inputSUBS18\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"value1SUBSInUSDC\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"currency\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"amount\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"frequency\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bytes32\",\n \"name\": \"description\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"bytes32\",\n \"name\": \"setAttribute\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"referralBonus\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"planCreate\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"payable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"subscriptionid\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bytes32\",\n \"name\": \"newAttribute\",\n \"type\": \"bytes32\"\n }\n ],\n \"name\": \"subscriptionAttributeCHG\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"Success\",\n \"type\": \"bool\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"Subscriptionid\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bytes32\",\n \"name\": \"NewAttribute\",\n \"type\": \"bytes32\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"indexStart\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"indexEnd\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"maxCollect\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"subscriptionCollect\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"IndexStart\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"IndexEnd\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"MaxCollect\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"SubscriptionRenewed\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"subscriber\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"indexStart\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"indexEnd\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"maxCollect\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"subscriptionCollectByAddress\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"Subscriber\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"IndexStart\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"IndexEnd\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"MaxCollect\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"SubscriptionRenewed\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"planId\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"indexStart\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"indexEnd\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"maxCollect\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"subscriptionCollectByPlan\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"PlanId\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"IndexStart\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"IndexEnd\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"MaxCollect\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"SubscriptionRenewed\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"from\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"to\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"subscriptionCollectPassive\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"Success\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"planid\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"subscriber\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"bool\",\n \"name\": \"recurring\",\n \"type\": \"bool\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"remainingCycles\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"referral\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"bool\",\n \"name\": \"onlycreate\",\n \"type\": \"bool\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"deductfrom\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"subscriptionCreate\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"Subscriptionid\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bool\",\n \"name\": \"AlreadyExist\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"planid\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"subscriber\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"referral\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"bool\",\n \"name\": \"giveaway\",\n \"type\": \"bool\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"deductfrom\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"timebonus\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"subscriptionGift\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"Planid\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"Subscriber\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"Referral\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"bool\",\n \"name\": \"Success\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"subscriptionid\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bool\",\n \"name\": \"enabled\",\n \"type\": \"bool\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"setCycles\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"subscriptionRecurringCHG\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"Subcriptionid\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bool\",\n \"name\": \"Recurring\",\n \"type\": \"bool\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"RemainingCycles\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"uint256\",\n \"name\": \"subscriptionId\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"subscriber\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"subsAmount18\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"usdcSpent6\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint24\",\n \"name\": \"feeTier\",\n \"type\": \"uint24\"\n }\n ],\n \"name\": \"subscriptionPaidWithUsdc\",\n \"type\": \"event\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"planId\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bool\",\n \"name\": \"recurring\",\n \"type\": \"bool\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"remainingCycles\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"referral\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint24\",\n \"name\": \"feeTier\",\n \"type\": \"uint24\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"deadline\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"nonce\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"permitDeadline\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bytes\",\n \"name\": \"signature\",\n \"type\": \"bytes\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"maxUsdcIn6Cap\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"paySubscriptionWithUsdc\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"subId\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bool\",\n \"name\": \"subExist\",\n \"type\": \"bool\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"subsPaid18\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"usdcSpent6\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"subsOut18\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint24\",\n \"name\": \"feeTier\",\n \"type\": \"uint24\"\n }\n ],\n \"name\": \"quoteUsdcForSubs\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"usdcQuoted6\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"SUBS\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"USDC\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"WETH9\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"_recipient\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"_quantity\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"crossmintOnramp\",\n \"outputs\": [],\n \"stateMutability\": \"payable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"poolFee1\",\n \"outputs\": [\n {\n \"internalType\": \"uint24\",\n \"name\": \"\",\n \"type\": \"uint24\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"poolFee2\",\n \"outputs\": [\n {\n \"internalType\": \"uint24\",\n \"name\": \"\",\n \"type\": \"uint24\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"_usdc\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"_subs\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint24\",\n \"name\": \"_fee1\",\n \"type\": \"uint24\"\n },\n {\n \"internalType\": \"uint24\",\n \"name\": \"_fee2\",\n \"type\": \"uint24\"\n }\n ],\n \"name\": \"setConfig\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"_router\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"_weth\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"setInfrastructure\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"universalRouter\",\n \"outputs\": [\n {\n \"internalType\": \"contract IUniversalRouter\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"withdraw\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"_token\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"withdrawToken\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n }\n] as const;\n","export const dexUSDCABI = [\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"owner\",\n \"type\": \"address\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"spender\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"value\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"Approval\",\n \"type\": \"event\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"owner\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"spender\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"allowance\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"spender\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"value\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"approve\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"account\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"balanceOf\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"decimals\",\n \"outputs\": [\n {\n \"internalType\": \"uint8\",\n \"name\": \"\",\n \"type\": \"uint8\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"symbol\",\n \"outputs\": [\n {\n \"internalType\": \"string\",\n \"name\": \"\",\n \"type\": \"string\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"to\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"value\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"transfer\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"from\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"to\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"value\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"transferFrom\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n }\n] as const;","\nexport const dexQuoterABI = [\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"_factory\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"_WETH9\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"constructor\"\n },\n {\n \"inputs\": [],\n \"name\": \"WETH9\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"factory\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes\",\n \"name\": \"path\",\n \"type\": \"bytes\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"amountIn\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"quoteExactInput\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"amountOut\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint160[]\",\n \"name\": \"sqrtPriceX96AfterList\",\n \"type\": \"uint160[]\"\n },\n {\n \"internalType\": \"uint32[]\",\n \"name\": \"initializedTicksCrossedList\",\n \"type\": \"uint32[]\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"gasEstimate\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"components\": [\n {\n \"internalType\": \"address\",\n \"name\": \"tokenIn\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"tokenOut\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"amountIn\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint24\",\n \"name\": \"fee\",\n \"type\": \"uint24\"\n },\n {\n \"internalType\": \"uint160\",\n \"name\": \"sqrtPriceLimitX96\",\n \"type\": \"uint160\"\n }\n ],\n \"internalType\": \"struct IQuoterV2.QuoteExactInputSingleParams\",\n \"name\": \"params\",\n \"type\": \"tuple\"\n }\n ],\n \"name\": \"quoteExactInputSingle\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"amountOut\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint160\",\n \"name\": \"sqrtPriceX96After\",\n \"type\": \"uint160\"\n },\n {\n \"internalType\": \"uint32\",\n \"name\": \"initializedTicksCrossed\",\n \"type\": \"uint32\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"gasEstimate\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes\",\n \"name\": \"path\",\n \"type\": \"bytes\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"amountOut\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"quoteExactOutput\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"amountIn\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint160[]\",\n \"name\": \"sqrtPriceX96AfterList\",\n \"type\": \"uint160[]\"\n },\n {\n \"internalType\": \"uint32[]\",\n \"name\": \"initializedTicksCrossedList\",\n \"type\": \"uint32[]\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"gasEstimate\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"components\": [\n {\n \"internalType\": \"address\",\n \"name\": \"tokenIn\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"tokenOut\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"amount\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint24\",\n \"name\": \"fee\",\n \"type\": \"uint24\"\n },\n {\n \"internalType\": \"uint160\",\n \"name\": \"sqrtPriceLimitX96\",\n \"type\": \"uint160\"\n }\n ],\n \"internalType\": \"struct IQuoterV2.QuoteExactOutputSingleParams\",\n \"name\": \"params\",\n \"type\": \"tuple\"\n }\n ],\n \"name\": \"quoteExactOutputSingle\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"amountIn\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint160\",\n \"name\": \"sqrtPriceX96After\",\n \"type\": \"uint160\"\n },\n {\n \"internalType\": \"uint32\",\n \"name\": \"initializedTicksCrossed\",\n \"type\": \"uint32\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"gasEstimate\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"int256\",\n \"name\": \"amount0Delta\",\n \"type\": \"int256\"\n },\n {\n \"internalType\": \"int256\",\n \"name\": \"amount1Delta\",\n \"type\": \"int256\"\n },\n {\n \"internalType\": \"bytes\",\n \"name\": \"path\",\n \"type\": \"bytes\"\n }\n ],\n \"name\": \"uniswapV3SwapCallback\",\n \"outputs\": [],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n }\n] as const;\n","/**\n * Subscrypts Contract Method Wrappers\n *\n * Direct contract method calls using ethers.js\n * These are utility functions for direct contract interaction\n */\n\nimport { ethers } from 'ethers';\nimport { SUBSCRYPTS_ABI } from './abis';\nimport { SUBSCRYPTS_ADDRESS } from './config';\n\n// ==========================================\n// HELPERS\n// ==========================================\n\nexport const getContract = (runner: ethers.ContractRunner) => {\n return new ethers.Contract(SUBSCRYPTS_ADDRESS, SUBSCRYPTS_ABI, runner);\n};\n\nexport const bytes32Encode = (str: string): string => {\n try {\n if (!str) return ethers.ZeroHash;\n return ethers.encodeBytes32String(str);\n } catch (e) {\n console.error(\"Error encoding bytes32:\", e);\n return ethers.ZeroHash;\n }\n};\n\nexport const bytes32Decode = (hex: string): string => {\n try {\n return ethers.decodeBytes32String(hex).replace(/\\0/g, '');\n } catch (e) {\n return hex; // Return raw if decode fails\n }\n};\n\n// ==========================================\n// ERC20 / BASIC TOKEN\n// ==========================================\n\nexport const approve = async (signer: ethers.Signer, spender: string, amount: bigint) => {\n const contract = getContract(signer);\n return await contract.approve(spender, amount);\n};\n\nexport const burn = async (signer: ethers.Signer, amount: bigint) => {\n const contract = getContract(signer);\n return await contract.burn(amount);\n};\n\nexport const burnFrom = async (signer: ethers.Signer, account: string, amount: bigint) => {\n const contract = getContract(signer);\n return await contract.burnFrom(account, amount);\n};\n\nexport const transfer = async (signer: ethers.Signer, to: string, amount: bigint) => {\n const contract = getContract(signer);\n return await contract.transfer(to, amount);\n};\n\nexport const transferFrom = async (signer: ethers.Signer, from: string, to: string, amount: bigint) => {\n const contract = getContract(signer);\n return await contract.transferFrom(from, to, amount);\n};\n\n// ==========================================\n// ADMIN & GOVERNANCE\n// ==========================================\n\nexport const contractFreezeAccount = async (signer: ethers.Signer, account: string, freeze: boolean) => {\n const contract = getContract(signer);\n return await contract.contractFreezeAccount(account, freeze);\n};\n\nexport const contractFundAddressCHG = async (signer: ethers.Signer, newAddress: string) => {\n const contract = getContract(signer);\n return await contract.contractFundAddressCHG(newAddress);\n};\n\nexport const contractSanctionsContractCHG = async (signer: ethers.Signer, enabled: boolean, newContract: string) => {\n const contract = getContract(signer);\n return await contract.contractSanctionsContractCHG(enabled, newContract);\n};\n\nexport const contractServiceAccountsCHG = async (signer: ethers.Signer, add: boolean, del: boolean, account: string) => {\n const contract = getContract(signer);\n return await contract.contractServiceAccountsCHG(add, del, account);\n};\n\nexport const dexGovernanceCHG = async (signer: ethers.Signer, factory: string, router: string, pair: string, posMgr: string, quoter: string, usdc: string) => {\n const contract = getContract(signer);\n return await contract.dexGovernanceCHG(factory, router, pair, posMgr, quoter, usdc);\n};\n\nexport const mintByAdmin = async (signer: ethers.Signer, to: string, amount: bigint) => {\n const contract = getContract(signer);\n return await contract.mintByAdmin(to, amount);\n};\n\nexport const burnByAdmin = async (signer: ethers.Signer, wallet: string, amount: bigint) => {\n const contract = getContract(signer);\n return await contract.burnByAdmin(wallet, amount);\n};\n\nexport const planGoveranceCHG = async (signer: ethers.Signer, creationCost: bigint, verifCost: bigint, commission: bigint) => {\n const contract = getContract(signer);\n return await contract.planGoveranceCHG(creationCost, verifCost, commission);\n};\n\nexport const setHaltStates = async (signer: ethers.Signer, noTransfer: boolean, noPlan: boolean, noSub: boolean, noPay: boolean, noUSD: boolean) => {\n const contract = getContract(signer);\n return await contract.setHaltStates(noTransfer, noPlan, noSub, noPay, noUSD);\n};\n\nexport const renounceOwnership = async (signer: ethers.Signer) => {\n const contract = getContract(signer);\n return await contract.renounceOwnership();\n};\n\nexport const transferOwnership = async (signer: ethers.Signer, newOwner: string) => {\n const contract = getContract(signer);\n return await contract.transferOwnership(newOwner);\n};\n\n// ==========================================\n// SUBSCRIPTION & PLANS\n// ==========================================\n\n/**\n * Change plan parameters\n *\n * ⚠️ **WARNING - DESTRUCTIVE OPERATION**: Changing `amount` or `frequency` will\n * automatically disable recurring payment configuration to ALL existing subscriptions\n * to this plan. Subscribers will need to manually re-configure the recurring payments\n * with the new parameters.\n *\n * **Why This Design**: Prevents subscribers from being charged unexpected amounts\n * without explicit consent. Protects both merchant (can change pricing) and\n * subscriber (won't be auto-charged new amount).\n *\n * **Contract behavior**: facetSubscription.sol lines 352-355\n *\n * @param signer - Wallet signer (must be plan owner)\n * @param planId - Plan ID to modify\n * @param merchant - Merchant address (must match plan owner)\n * @param amount - New subscription amount (⚠️ changing this disables all subscriptions)\n * @param frequency - New payment frequency (⚠️ changing this disables all subscriptions)\n * @param referralBonus - Referral reward amount\n * @param commission - Protocol commission\n * @param description - Plan description (bytes32)\n * @param setAttribute - Default attributes (bytes32)\n * @param verifExpDate - Verification expiry timestamp\n * @param active - Plan active status\n *\n * @example\n * ```typescript\n * // WARNING: This will disable isRecurring and reset remainingCycles\n * // for ALL existing subscriptions\n * await planChange(\n * signer,\n * 1n, // planId\n * merchantAddress,\n * parseEther('10'), // NEW amount (was 5 SUBS)\n * 2592000n, // frequency (30 days)\n * parseEther('1'), // referralBonus\n * 500n, // 5% commission\n * 'Premium Plan',\n * '',\n * 0n,\n * true\n * );\n * // All subscribers must now re-enable recurring payments\n * ```\n *\n * @see planChangeSubscriptionsBulk for non-destructive bulk updates\n */\nexport const planChange = async (signer: ethers.Signer, planId: bigint, merchant: string, amount: bigint, frequency: bigint, referralBonus: bigint, commission: bigint, description: string, setAttribute: string, verifExpDate: bigint, active: boolean) => {\n const contract = getContract(signer);\n const descBytes = bytes32Encode(description);\n const attrBytes = bytes32Encode(setAttribute);\n return await contract.planChange(planId, merchant, amount, frequency, referralBonus, commission, descBytes, attrBytes, verifExpDate, active);\n};\n\nexport const planChangeSubscriptionsBulk = async (signer: ethers.Signer, start: bigint, end: bigint, planId: bigint, amount: bigint, frequency: bigint, attribute: string, overrideRecurring: boolean) => {\n const contract = getContract(signer);\n const attrBytes = bytes32Encode(attribute);\n return await contract.planChangeSubscriptionsBulk(start, end, planId, amount, frequency, attrBytes, overrideRecurring);\n};\n\nexport const planCreate = async (signer: ethers.Signer, currency: bigint, amount: bigint, frequency: bigint, description: string, setAttribute: string, referralBonus: bigint, value: bigint = 0n) => {\n const contract = getContract(signer);\n const descBytes = bytes32Encode(description);\n const attrBytes = bytes32Encode(setAttribute);\n return await contract.planCreate(currency, amount, frequency, descBytes, attrBytes, referralBonus, { value });\n};\n\nexport const paySubscriptionWithUsdc = async (signer: ethers.Signer, planId: bigint, recurring: boolean, remainingCycles: bigint, referral: string, feeTier: bigint, deadline: bigint, nonce: bigint, permitDeadline: bigint, signature: string, maxUsdc: bigint) => {\n const contract = getContract(signer);\n const referralAddr = referral || ethers.ZeroAddress;\n return await contract.paySubscriptionWithUsdc(planId, recurring, remainingCycles, referralAddr, feeTier, deadline, nonce, permitDeadline, signature, maxUsdc);\n};\n\nexport const subscriptionAttributeCHG = async (signer: ethers.Signer, subId: bigint, newAttribute: string) => {\n const contract = getContract(signer);\n const attrBytes = bytes32Encode(newAttribute);\n return await contract.subscriptionAttributeCHG(subId, attrBytes);\n};\n\nexport const subscriptionCollect = async (signer: ethers.Signer, start: bigint, end: bigint, maxCollect: bigint) => {\n const contract = getContract(signer);\n return await contract.subscriptionCollect(start, end, maxCollect);\n};\n\nexport const subscriptionCollectByAddress = async (signer: ethers.Signer, subscriber: string, start: bigint, end: bigint, maxCollect: bigint) => {\n const contract = getContract(signer);\n return await contract.subscriptionCollectByAddress(subscriber, start, end, maxCollect);\n};\n\nexport const subscriptionCollectByPlan = async (signer: ethers.Signer, planId: bigint, start: bigint, end: bigint, maxCollect: bigint) => {\n const contract = getContract(signer);\n return await contract.subscriptionCollectByPlan(planId, start, end, maxCollect);\n};\n\nexport const subscriptionCollectPassive = async (signer: ethers.Signer, from: string, to: string) => {\n const contract = getContract(signer);\n return await contract.subscriptionCollectPassive(from, to);\n};\n\nexport const subscriptionCollectPassiveCHG = async (signer: ethers.Signer, enable: boolean, newMax: bigint) => {\n const contract = getContract(signer);\n return await contract.subscriptionCollectPassiveCHG(enable, newMax);\n};\n\nexport const subscriptionCreate = async (signer: ethers.Signer, planId: bigint, subscriber: string, recurring: boolean, remainingCycles: bigint, referral: string, onlyCreate: boolean, deductFrom: string) => {\n const contract = getContract(signer);\n const referralAddr = referral || ethers.ZeroAddress;\n return await contract.subscriptionCreate(planId, subscriber, recurring, remainingCycles, referralAddr, onlyCreate, deductFrom);\n};\n\nexport const subscriptionGift = async (signer: ethers.Signer, planId: bigint, subscriber: string, referral: string, giveaway: boolean, deductFrom: string, timeBonus: bigint) => {\n const contract = getContract(signer);\n return await contract.subscriptionGift(planId, subscriber, referral, giveaway, deductFrom, timeBonus);\n};\n\nexport const subscriptionRecurringCHG = async (signer: ethers.Signer, subId: bigint, enabled: boolean, cycles: bigint) => {\n const contract = getContract(signer);\n return await contract.subscriptionRecurringCHG(subId, enabled, cycles);\n};\n\nexport const subInternalBurn = async (signer: ethers.Signer, from: string, amount: bigint) => {\n const contract = getContract(signer);\n return await contract.subInternalBurn(from, amount);\n};\n\nexport const subInternalMint = async (signer: ethers.Signer, to: string, amount: bigint) => {\n const contract = getContract(signer);\n return await contract.subInternalMint(to, amount);\n};\n\nexport const subTxIncrement = async (signer: ethers.Signer) => {\n const contract = getContract(signer);\n return await contract.subTxIncrement();\n};\n\n// ==========================================\n// PROXY & DIAMOND FACETS\n// ==========================================\n\nexport const initialize = async (signer: ethers.Signer) => {\n const contract = getContract(signer);\n return await contract.initialize();\n};\n\nexport const registerFacetSelector = async (signer: ethers.Signer, selector: string, facet: string) => {\n const contract = getContract(signer);\n return await contract.registerFacetSelector(selector, facet);\n};\n\nexport const unregisterFacetSelector = async (signer: ethers.Signer, selector: string) => {\n const contract = getContract(signer);\n return await contract.unregisterFacetSelector(selector);\n};\n\nexport const setFacetAdmin = async (signer: ethers.Signer, module: string) => {\n const contract = getContract(signer);\n return await contract.setFacetAdmin(module);\n};\n\nexport const setFacetPaymentUsdc = async (signer: ethers.Signer, module: string) => {\n const contract = getContract(signer);\n return await contract.setFacetPaymentUsdc(module);\n};\n\nexport const setFacetSubscription = async (signer: ethers.Signer, module: string) => {\n const contract = getContract(signer);\n return await contract.setFacetSubscription(module);\n};\n\nexport const setFacetView = async (signer: ethers.Signer, module: string) => {\n const contract = getContract(signer);\n return await contract.setFacetView(module);\n};\n\nexport const setProxyLogicAddress = async (signer: ethers.Signer, module: string) => {\n const contract = getContract(signer);\n return await contract.setProxyLogicAddress(module);\n};\n\nexport const upgradeToAndCall = async (signer: ethers.Signer, newImpl: string, data: string) => {\n const contract = getContract(signer);\n return await contract.upgradeToAndCall(newImpl, data);\n};\n\n// ==========================================\n// VIEW FUNCTIONS\n// ==========================================\n\n// Helper for cleaning Plan structs (decoding bytes32)\nexport const cleanPlan = (p: any) => {\n return {\n id: p.id,\n merchantAddress: p.merchantAddress,\n currencyCode: p.currencyCode,\n subscriptionAmount: p.subscriptionAmount,\n paymentFrequency: p.paymentFrequency,\n referralBonus: p.referralBonus,\n commission: p.commission,\n description: bytes32Decode(p.description),\n defaultAttributes: bytes32Decode(p.defaultAttributes),\n verificationExpiryDate: p.verificationExpiryDate,\n subscriberCount: p.subscriberCount,\n isActive: p.isActive\n };\n};\n\n// Helper for cleaning Subscription structs\nexport const cleanSub = (s: any) => {\n return {\n id: s.id,\n merchantAddress: s.merchantAddress,\n planId: s.planId,\n subscriberAddress: s.subscriberAddress,\n currencyCode: s.currencyCode,\n subscriptionAmount: s.subscriptionAmount,\n paymentFrequency: s.paymentFrequency,\n isRecurring: s.isRecurring,\n remainingCycles: s.remainingCycles,\n customAttributes: bytes32Decode(s.customAttributes),\n lastPaymentDate: s.lastPaymentDate,\n nextPaymentDate: s.nextPaymentDate\n };\n};\n\nexport const planAutoIncrement = async (runner: ethers.ContractRunner) => {\n return await getContract(runner)._planAutoIncrement();\n};\n\nexport const subscriptionAutoIncrement = async (runner: ethers.ContractRunner) => {\n return await getContract(runner)._subscriptionAutoIncrement();\n};\n\nexport const allowance = async (runner: ethers.ContractRunner, owner: string, spender: string) => {\n return await getContract(runner).allowance(owner, spender);\n};\n\nexport const balanceOf = async (runner: ethers.ContractRunner, account: string) => {\n return await getContract(runner).balanceOf(account);\n};\n\nexport const contractAddress = async (runner: ethers.ContractRunner) => {\n return await getContract(runner).contractAddress();\n};\n\nexport const contractFundAddress = async (runner: ethers.ContractRunner) => {\n return await getContract(runner).contractFundAddress();\n};\n\nexport const contractHaltCurrencyUSD = async (runner: ethers.ContractRunner) => {\n return await getContract(runner).contractHaltCurrencyUSD();\n};\n\nexport const contractHaltNonServiceTransfers = async (runner: ethers.ContractRunner) => {\n return await getContract(runner).contractHaltNonServiceTransfers();\n};\n\nexport const contractHaltPlanCreation = async (runner: ethers.ContractRunner) => {\n return await getContract(runner).contractHaltPlanCreation();\n};\n\nexport const contractHaltSubcriptions = async (runner: ethers.ContractRunner) => {\n return await getContract(runner).contractHaltSubcriptions();\n};\n\nexport const contractHaltSubscriptionPayments = async (runner: ethers.ContractRunner) => {\n return await getContract(runner).contractHaltSubscriptionPayments();\n};\n\nexport const convertOtherCurrencyToToken = async (runner: ethers.ContractRunner, amount: bigint) => {\n return await getContract(runner).convertOtherCurrencyToToken(amount);\n};\n\nexport const convertTokenToOtherCurrency = async (runner: ethers.ContractRunner, amount: bigint) => {\n return await getContract(runner).convertTokenToOtherCurrency(amount);\n};\n\nexport const decimals = async (runner: ethers.ContractRunner) => {\n return await getContract(runner).decimals();\n};\n\nexport const dexFactory = async (runner: ethers.ContractRunner) => {\n return await getContract(runner).dexFactory();\n};\n\nexport const dexPair = async (runner: ethers.ContractRunner) => {\n return await getContract(runner).dexPair();\n};\n\nexport const dexPositionManager = async (runner: ethers.ContractRunner) => {\n return await getContract(runner).dexPositionManager();\n};\n\nexport const dexQuoter = async (runner: ethers.ContractRunner) => {\n return await getContract(runner).dexQuoter();\n};\n\nexport const dexRouter = async (runner: ethers.ContractRunner) => {\n return await getContract(runner).dexRouter();\n};\n\nexport const dexUSDC = async (runner: ethers.ContractRunner) => {\n return await getContract(runner).dexUSDC();\n};\n\nexport const getContractDetails = async (runner: ethers.ContractRunner) => {\n return await getContract(runner).getContractDetails();\n};\n\nexport const getContractHaltStates = async (runner: ethers.ContractRunner) => {\n return await getContract(runner).getContractHaltStates();\n};\n\nexport const getPlan = async (runner: ethers.ContractRunner, planId: bigint) => {\n const result = await getContract(runner).getPlan(planId);\n return cleanPlan(result);\n};\n\nexport const getPlans = async (runner: ethers.ContractRunner, start: bigint, end: bigint) => {\n const result = await getContract(runner).getPlans(start, end);\n const plans = result[0].map(cleanPlan);\n return [plans, result[1], result[2], result[3]]; // Plans, Start, End, Length\n};\n\nexport const getPlanSubscription = async (runner: ethers.ContractRunner, planId: bigint, subscriber: string) => {\n const result = await getContract(runner).getPlanSubscription(planId, subscriber);\n return cleanSub(result);\n};\n\nexport const getSubscription = async (runner: ethers.ContractRunner, subId: bigint) => {\n const result = await getContract(runner).getSubscription(subId);\n return cleanSub(result);\n};\n\nexport const getSubscriptionAndPlanDetails = async (runner: ethers.ContractRunner) => {\n return await getContract(runner).getSubscriptionAndPlanDetails();\n};\n\nexport const getSubscriptions = async (runner: ethers.ContractRunner, start: bigint, end: bigint) => {\n const result = await getContract(runner).getSubscriptions(start, end);\n const subs = result[0].map(cleanSub);\n return [subs, result[1], result[2], result[3]];\n};\n\nexport const getSubscriptionsByAddress = async (runner: ethers.ContractRunner, subscriber: string, start: bigint, end: bigint) => {\n const result = await getContract(runner).getSubscriptionsByAddress(subscriber, start, end);\n const subs = result[0].map(cleanSub);\n return [subs, result[1], result[2], result[3]];\n};\n\nexport const getSubscriptionsByPlan = async (runner: ethers.ContractRunner, planId: bigint, start: bigint, end: bigint) => {\n const result = await getContract(runner).getSubscriptionsByPlan(planId, start, end);\n const subs = result[0].map(cleanSub);\n return [subs, result[1], result[2], result[3]];\n};\n\nexport const name = async (runner: ethers.ContractRunner) => {\n return await getContract(runner).name();\n};\n\nexport const owner = async (runner: ethers.ContractRunner) => {\n return await getContract(runner).owner();\n};\n\nexport const planCreationCost = async (runner: ethers.ContractRunner) => {\n return await getContract(runner).planCreationCost();\n};\n\nexport const planDefaultCommission = async (runner: ethers.ContractRunner) => {\n return await getContract(runner).planDefaultCommission();\n};\n\nexport const sanctionsCheckEnabled = async (runner: ethers.ContractRunner) => {\n return await getContract(runner).sanctionsCheckEnabled();\n};\n\nexport const sanctionsContract = async (runner: ethers.ContractRunner) => {\n return await getContract(runner).sanctionsContract();\n};\n\nexport const subCheckSanctions = async (runner: ethers.ContractRunner, from: string, to: string) => {\n return await getContract(runner).subCheckSanctions(from, to);\n};\n\nexport const subscriptionCollectPassiveEnabled = async (runner: ethers.ContractRunner) => {\n return await getContract(runner).subscriptionCollectPassiveEnabled();\n};\n\nexport const subscriptionCollectPassiveIndex = async (runner: ethers.ContractRunner) => {\n return await getContract(runner).subscriptionCollectPassiveIndex();\n};\n\nexport const subscriptionCollectPassiveMax = async (runner: ethers.ContractRunner) => {\n return await getContract(runner).subscriptionCollectPassiveMax();\n};\n\nexport const symbol = async (runner: ethers.ContractRunner) => {\n return await getContract(runner).symbol();\n};\n\nexport const tokenHolders = async (runner: ethers.ContractRunner) => {\n return await getContract(runner).tokenHolders();\n};\n\nexport const tokenTransactions = async (runner: ethers.ContractRunner) => {\n return await getContract(runner).tokenTransactions();\n};\n\nexport const totalSubscriptionsActive = async (runner: ethers.ContractRunner) => {\n return await getContract(runner).totalSubscriptionsActive();\n};\n\nexport const totalSupply = async (runner: ethers.ContractRunner) => {\n return await getContract(runner).totalSupply();\n};\n\nexport const UPGRADE_INTERFACE_VERSION = async (runner: ethers.ContractRunner) => {\n return await getContract(runner).UPGRADE_INTERFACE_VERSION();\n};\n\nexport const facetAdmin = async (runner: ethers.ContractRunner) => {\n return await getContract(runner).facetAdmin();\n};\n\nexport const facetSubscription = async (runner: ethers.ContractRunner) => {\n return await getContract(runner).facetSubscription();\n};\n\nexport const facetView = async (runner: ethers.ContractRunner) => {\n return await getContract(runner).facetView();\n};\n\nexport const proxyLogic = async (runner: ethers.ContractRunner) => {\n return await getContract(runner).proxyLogic();\n};\n\nexport const facetPaymentUsdc = async (runner: ethers.ContractRunner) => {\n return await getContract(runner).facetPaymentUsdc();\n};\n\nexport const getFacetSelector = async (runner: ethers.ContractRunner, selector: string) => {\n return await getContract(runner).getFacetSelector(selector);\n};\n\nexport const listFacetSelectors = async (runner: ethers.ContractRunner) => {\n return await getContract(runner).listFacetSelectors();\n};\n\nexport const registeredSelectors = async (runner: ethers.ContractRunner, index: bigint) => {\n return await getContract(runner).registeredSelectors(index);\n};\n\nexport const planVerificationCost = async (runner: ethers.ContractRunner) => {\n return await getContract(runner).planVerificationCost();\n};\n\nexport const proxiableUUID = async (runner: ethers.ContractRunner) => {\n return await getContract(runner).proxiableUUID();\n};\n\nexport const quoteUsdcForSubs = async (runner: ethers.ContractRunner, subsOut: bigint, feeTier: bigint) => {\n return await getContract(runner).quoteUsdcForSubs(subsOut, feeTier);\n};\n\n// ==========================================\n// VERIFIED TRANSACTION WRAPPERS\n// ==========================================\n\n/**\n * Parse _subscriptionCreate event from transaction receipt\n * @private\n */\nconst parseSubscriptionCreatedEvent = (receipt: ethers.TransactionReceipt, contractInterface: ethers.Interface): bigint => {\n for (const log of receipt.logs) {\n try {\n const parsed = contractInterface.parseLog({\n topics: [...log.topics] as string[],\n data: log.data\n });\n\n if (parsed && parsed.name === '_subscriptionCreate') {\n return parsed.args.subscriptionId;\n }\n } catch {\n // Continue to next log if parsing fails\n continue;\n }\n }\n\n throw new Error(`Subscription ID not found in transaction logs: ${receipt.hash}`);\n};\n\n/**\n * Parse subscriptionPaidWithUsdc event from transaction receipt\n * @private\n */\nconst parseUsdcPaymentEvent = (receipt: ethers.TransactionReceipt, contractInterface: ethers.Interface): {\n subsAmount18: bigint;\n usdcSpent6: bigint;\n} | null => {\n for (const log of receipt.logs) {\n try {\n const parsed = contractInterface.parseLog({\n topics: [...log.topics] as string[],\n data: log.data\n });\n\n if (parsed && parsed.name === 'subscriptionPaidWithUsdc') {\n return {\n subsAmount18: parsed.args.subsAmount18,\n usdcSpent6: parsed.args.usdcSpent6\n };\n }\n } catch {\n continue;\n }\n }\n\n return null;\n};\n\n/**\n * Get current subscription state for verification\n * Uses two-step lookup: getPlanSubscription → getSubscription\n * @private\n */\nconst getSubscriptionState = async (\n runner: ethers.ContractRunner | ethers.Contract,\n planId: bigint,\n subscriber: string\n): Promise<{ subscriptionId: bigint; nextPaymentDate: bigint }> => {\n try {\n const contract = runner instanceof ethers.Contract ? runner : getContract(runner);\n\n // Step 1: Get subscriptionId from plan/subscriber mapping\n const planSubscription = await contract.getPlanSubscription(planId, subscriber);\n const subscriptionId = planSubscription?.id ?? planSubscription?.[0] ?? 0n;\n\n if (subscriptionId === 0n) {\n return { subscriptionId: 0n, nextPaymentDate: 0n };\n }\n\n // Step 2: Get full subscription record with real nextPaymentDate\n const subscription = await contract.getSubscription(subscriptionId);\n const nextPaymentDate = subscription?.nextPaymentDate ?? subscription?.[11] ?? 0n;\n\n return { subscriptionId, nextPaymentDate };\n } catch {\n return { subscriptionId: 0n, nextPaymentDate: 0n };\n }\n};\n\n/**\n * Verify subscription payment by checking nextPaymentDate change\n * @private\n */\nconst verifySubscriptionPayment = async (\n runner: ethers.ContractRunner | ethers.Contract,\n planId: bigint,\n subscriber: string,\n previousNextPaymentDate: bigint\n): Promise<bigint | null> => {\n try {\n const contract = runner instanceof ethers.Contract ? runner : getContract(runner);\n\n // Step 1: Get subscriptionId\n const planSubscription = await contract.getPlanSubscription(planId, subscriber);\n const subscriptionId = planSubscription?.id ?? planSubscription?.[0] ?? 0n;\n\n if (subscriptionId === 0n) {\n return null;\n }\n\n // Step 2: Get full subscription with real nextPaymentDate\n const subscription = await contract.getSubscription(subscriptionId);\n const nextPaymentDate = subscription?.nextPaymentDate ?? subscription?.[11] ?? 0n;\n\n // Subscription exists and nextPaymentDate has changed (increased)\n if (nextPaymentDate > 0n && nextPaymentDate > previousNextPaymentDate) {\n return subscriptionId;\n }\n return null;\n } catch {\n return null;\n }\n};\n\n/**\n * Create a subscription with SUBS tokens (with verification)\n *\n * This is a high-level wrapper that:\n * - Captures state before transaction\n * - Executes the transaction\n * - Parses events to extract subscriptionId\n * - Falls back to state verification if event parsing fails\n *\n * @param signer - Ethers signer\n * @param params - Subscription creation parameters\n * @returns subscriptionId and alreadyExist flag\n *\n * @example\n * ```typescript\n * const result = await createSubscriptionVerified(signer, {\n * planId: 1n,\n * subscriber: '0x...',\n * recurring: true,\n * remainingCycles: 12n,\n * referral: ethers.ZeroAddress,\n * onlyCreate: false,\n * deductFrom: '0x...'\n * });\n * console.log('Subscription ID:', result.subscriptionId);\n * ```\n */\nexport const createSubscriptionVerified = async (\n signer: ethers.Signer,\n params: {\n planId: bigint;\n subscriber: string;\n recurring: boolean;\n remainingCycles: bigint;\n referral: string;\n onlyCreate: boolean;\n deductFrom: string;\n }\n): Promise<{\n subscriptionId: bigint;\n alreadyExist: boolean;\n}> => {\n const contract = getContract(signer);\n const contractInterface = new ethers.Interface(SUBSCRYPTS_ABI);\n\n // Capture state before transaction\n const stateBefore = await getSubscriptionState(contract, params.planId, params.subscriber);\n const previousNextPaymentDate = stateBefore.nextPaymentDate;\n\n // Execute transaction\n const tx = await subscriptionCreate(\n signer,\n params.planId,\n params.subscriber,\n params.recurring,\n params.remainingCycles,\n params.referral,\n params.onlyCreate,\n params.deductFrom\n );\n\n const receipt = await tx.wait();\n\n if (!receipt) {\n throw new Error('Transaction receipt not available');\n }\n\n // Try event parsing first\n let subscriptionId: bigint | null = null;\n try {\n subscriptionId = parseSubscriptionCreatedEvent(receipt, contractInterface);\n } catch {\n // Event parsing failed, will use fallback\n }\n\n // Fallback: verify via contract state\n if (subscriptionId === null) {\n subscriptionId = await verifySubscriptionPayment(\n contract,\n params.planId,\n params.subscriber,\n previousNextPaymentDate\n );\n\n if (subscriptionId === null) {\n throw new Error(\n `Subscription verification failed: nextPaymentDate did not change. Transaction: ${receipt.hash}`\n );\n }\n }\n\n return {\n subscriptionId,\n alreadyExist: previousNextPaymentDate > 0n\n };\n};\n\n/**\n * Create a subscription with USDC (with verification)\n *\n * This is a high-level wrapper that:\n * - Captures state before transaction\n * - Executes the USDC payment transaction\n * - Parses events to extract subscriptionId and payment data\n * - Falls back to state verification if event parsing fails\n *\n * @param signer - Ethers signer\n * @param params - USDC payment parameters\n * @param subscriber - Subscriber address (for verification)\n * @returns subscriptionId, existence flag, and payment amounts\n *\n * @example\n * ```typescript\n * const result = await paySubscriptionWithUsdcVerified(signer, {\n * planId: 1n,\n * recurring: true,\n * remainingCycles: 12n,\n * referral: ethers.ZeroAddress,\n * feeTier: 3000n,\n * deadline: BigInt(Date.now() / 1000 + 1800),\n * nonce: 0n,\n * permitDeadline: BigInt(Date.now() / 1000 + 1800),\n * signature: '0x...',\n * maxUsdcIn6Cap: 10000000n\n * }, '0xSubscriber...');\n * ```\n */\nexport const paySubscriptionWithUsdcVerified = async (\n signer: ethers.Signer,\n params: {\n planId: bigint;\n recurring: boolean;\n remainingCycles: bigint;\n referral: string;\n feeTier: bigint;\n deadline: bigint;\n nonce: bigint;\n permitDeadline: bigint;\n signature: string;\n maxUsdcIn6Cap: bigint;\n },\n subscriber: string\n): Promise<{\n subId: bigint;\n subExist: boolean;\n subsPaid18: bigint;\n usdcSpent6: bigint;\n}> => {\n const contract = getContract(signer);\n const contractInterface = new ethers.Interface(SUBSCRYPTS_ABI);\n\n // Capture state before transaction\n const stateBefore = await getSubscriptionState(contract, params.planId, subscriber);\n const previousNextPaymentDate = stateBefore.nextPaymentDate;\n\n // Execute transaction\n const tx = await paySubscriptionWithUsdc(\n signer,\n params.planId,\n params.recurring,\n params.remainingCycles,\n params.referral,\n params.feeTier,\n params.deadline,\n params.nonce,\n params.permitDeadline,\n params.signature,\n params.maxUsdcIn6Cap\n );\n\n const receipt = await tx.wait();\n\n if (!receipt) {\n throw new Error('Transaction receipt not available');\n }\n\n // Try event parsing first\n let subscriptionId: bigint | null = null;\n let paymentData: { subsAmount18: bigint; usdcSpent6: bigint } | null = null;\n\n try {\n subscriptionId = parseSubscriptionCreatedEvent(receipt, contractInterface);\n paymentData = parseUsdcPaymentEvent(receipt, contractInterface);\n } catch {\n // Event parsing failed, will use fallback\n }\n\n // Fallback: verify via contract state\n if (subscriptionId === null) {\n subscriptionId = await verifySubscriptionPayment(\n contract,\n params.planId,\n subscriber,\n previousNextPaymentDate\n );\n\n if (subscriptionId === null) {\n throw new Error(\n `Subscription verification failed: nextPaymentDate did not change. Transaction: ${receipt.hash}`\n );\n }\n }\n\n return {\n subId: subscriptionId,\n subExist: previousNextPaymentDate > 0n,\n subsPaid18: paymentData?.subsAmount18 || 0n,\n usdcSpent6: paymentData?.usdcSpent6 || 0n\n };\n};\n","/**\n * Token service for ERC20 token operations (SUBS and USDC)\n */\n\nimport { Contract, Signer } from 'ethers';\nimport { ERC20_ABI } from '../contract';\nimport { ContractError, InsufficientBalanceError } from '../utils/errors';\n\n/**\n * Service class for ERC20 token operations\n */\nexport class TokenService {\n private contract: Contract;\n private decimals: number;\n private symbol: string;\n\n constructor(tokenAddress: string, signer: Signer, decimals: number, symbol: string) {\n this.contract = new Contract(tokenAddress, ERC20_ABI, signer);\n this.decimals = decimals;\n this.symbol = symbol;\n }\n\n /**\n * Get token balance for an address\n */\n async getBalance(address: string): Promise<bigint> {\n try {\n const balance = await this.contract.balanceOf(address);\n return balance;\n } catch (error) {\n throw new ContractError(\n `Failed to fetch ${this.symbol} balance`,\n { address, error }\n );\n }\n }\n\n /**\n * Get current allowance for a spender\n */\n async getAllowance(owner: string, spender: string): Promise<bigint> {\n try {\n const allowance = await this.contract.allowance(owner, spender);\n return allowance;\n } catch (error) {\n throw new ContractError(\n `Failed to fetch ${this.symbol} allowance`,\n { owner, spender, error }\n );\n }\n }\n\n /**\n * Approve spender to use tokens\n */\n async approve(spender: string, amount: bigint): Promise<string> {\n try {\n const tx = await this.contract.approve(spender, amount);\n const receipt = await tx.wait();\n\n if (!receipt) {\n throw new ContractError('Transaction receipt not available');\n }\n\n return receipt.hash;\n } catch (error) {\n throw new ContractError(\n `Failed to approve ${this.symbol}`,\n { spender, amount: amount.toString(), error }\n );\n }\n }\n\n /**\n * Check if balance is sufficient and approve if needed\n */\n async ensureAllowance(\n owner: string,\n spender: string,\n requiredAmount: bigint\n ): Promise<{ needsApproval: boolean; txHash?: string }> {\n // Check balance first\n const balance = await this.getBalance(owner);\n\n if (balance < requiredAmount) {\n throw new InsufficientBalanceError(\n requiredAmount,\n balance,\n this.symbol as 'SUBS' | 'USDC'\n );\n }\n\n // Check allowance\n const currentAllowance = await this.getAllowance(owner, spender);\n\n if (currentAllowance >= requiredAmount) {\n return { needsApproval: false };\n }\n\n // Approve\n const txHash = await this.approve(spender, requiredAmount);\n\n return { needsApproval: true, txHash };\n }\n\n /**\n * Get token contract instance\n */\n getContract(): Contract {\n return this.contract;\n }\n\n /**\n * Get token decimals\n */\n getDecimals(): number {\n return this.decimals;\n }\n\n /**\n * Get token symbol\n */\n getSymbol(): string {\n return this.symbol;\n }\n}\n","/**\n * Intelligent Caching Service\n *\n * Provides TTL-based caching with:\n * - Chain ID namespacing (prevents testnet/mainnet collisions)\n * - In-flight request deduplication\n * - LRU eviction\n * - Pattern-based invalidation\n * - Performance statistics tracking\n */\n\nexport interface CacheEntry<T> {\n data: T;\n timestamp: number;\n ttl: number; // milliseconds, -1 = infinite\n}\n\nexport interface CacheConfig {\n enabled: boolean;\n defaultTTL: number;\n maxEntries: number;\n}\n\nexport interface CacheStats {\n hits: number;\n misses: number;\n entries: number;\n hitRate: number;\n}\n\n/**\n * Cache Manager with chain ID namespacing and statistics\n */\nexport class CacheManager {\n private cache: Map<string, CacheEntry<unknown>>;\n private config: CacheConfig;\n private inFlightRequests: Map<string, Promise<unknown>>;\n private stats: { hits: number; misses: number };\n private chainId: number;\n\n constructor(chainId: number, config?: Partial<CacheConfig>) {\n this.cache = new Map();\n this.inFlightRequests = new Map();\n this.stats = { hits: 0, misses: 0 };\n this.chainId = chainId;\n this.config = {\n enabled: true,\n defaultTTL: 60_000, // 60 seconds\n maxEntries: 500,\n ...config,\n };\n }\n\n /**\n * Get cached data or execute fetcher\n *\n * @param key - Cache key (will be prefixed with chain ID)\n * @param fetcher - Async function to fetch data if not cached\n * @param ttl - Time-to-live in milliseconds (-1 for infinite)\n */\n async get<T>(\n key: string,\n fetcher: () => Promise<T>,\n ttl?: number\n ): Promise<T> {\n if (!this.config.enabled) {\n return fetcher();\n }\n\n // Namespace cache key with chain ID to prevent testnet/mainnet collisions\n const namespacedKey = `${this.chainId}:${key}`;\n\n // Check cache\n const cached = this.cache.get(namespacedKey);\n if (cached && !this.isExpired(cached)) {\n this.stats.hits++;\n return cached.data as T;\n }\n\n this.stats.misses++;\n\n // Check in-flight requests (deduplication)\n if (this.inFlightRequests.has(namespacedKey)) {\n return this.inFlightRequests.get(namespacedKey) as Promise<T>;\n }\n\n // Execute fetcher\n const promise = fetcher();\n this.inFlightRequests.set(namespacedKey, promise);\n\n try {\n const data = await promise;\n this.set(namespacedKey, data, ttl ?? this.config.defaultTTL);\n return data;\n } finally {\n this.inFlightRequests.delete(namespacedKey);\n }\n }\n\n /**\n * Manually set cache entry (used for smart TTL updates)\n */\n set(key: string, data: unknown, ttl: number): void {\n // Namespace if not already namespaced\n const namespacedKey = key.includes(':') ? key : `${this.chainId}:${key}`;\n\n // Enforce max entries (LRU eviction)\n if (this.cache.size >= this.config.maxEntries) {\n const firstKey = this.cache.keys().next().value;\n if (firstKey !== undefined) {\n this.cache.delete(firstKey);\n }\n }\n\n this.cache.set(namespacedKey, {\n data,\n timestamp: Date.now(),\n ttl,\n });\n }\n\n /**\n * Check if cache entry has expired\n */\n private isExpired(entry: CacheEntry<unknown>): boolean {\n if (entry.ttl === -1) return false; // Infinite TTL\n return Date.now() - entry.timestamp > entry.ttl;\n }\n\n /**\n * Invalidate cache entries by pattern\n *\n * @param keyPattern - Regex pattern to match keys (omit for clear all)\n *\n * @example\n * ```typescript\n * // Invalidate all subscription status for a specific plan\n * cacheManager.invalidate('subscription-status:1:');\n *\n * // Invalidate all user subscriptions\n * cacheManager.invalidate('my-subscriptions:');\n *\n * // Clear all cache\n * cacheManager.invalidate();\n * ```\n */\n invalidate(keyPattern?: string): void {\n if (!keyPattern) {\n this.cache.clear();\n return;\n }\n\n // Match against namespaced keys (chainId:pattern)\n const namespacedPattern = `${this.chainId}:${keyPattern}`;\n const regex = new RegExp(namespacedPattern);\n for (const key of this.cache.keys()) {\n if (regex.test(key)) {\n this.cache.delete(key);\n }\n }\n }\n\n /**\n * Clear all cache entries and reset statistics\n */\n clear(): void {\n this.cache.clear();\n this.inFlightRequests.clear();\n this.stats = { hits: 0, misses: 0 };\n }\n\n /**\n * Get cache performance statistics\n *\n * @returns Cache stats including hit rate\n *\n * @example\n * ```typescript\n * const stats = cacheManager.getStats();\n * console.log(`Hit rate: ${(stats.hitRate * 100).toFixed(1)}%`);\n * console.log(`RPC savings: ${stats.hits} calls avoided`);\n * ```\n */\n getStats(): CacheStats {\n const total = this.stats.hits + this.stats.misses;\n return {\n hits: this.stats.hits,\n misses: this.stats.misses,\n entries: this.cache.size,\n hitRate: total > 0 ? this.stats.hits / total : 0,\n };\n }\n}\n","/**\n * Constants for @subscrypts/subscrypts-sdk-react\n *\n * Re-exports from centralized src/contract/ directory\n */\n\n// Re-export everything from central contract config\nexport {\n // Network\n CHAIN_ID,\n CHAIN_NAME,\n RPC_URLS,\n DEFAULT_RPC_URL,\n BLOCK_EXPLORER,\n NETWORK_CONFIG,\n\n // Subscrypts\n SUBSCRYPTS_ADDRESS,\n SUBS_TOKEN_ADDRESS,\n\n // Tokens\n USDC_ADDRESS,\n DECIMALS,\n\n // DEX / Uniswap\n DEX_FACTORY_ADDRESS,\n DEX_QUOTER_ADDRESS,\n DEX_ROUTER_ADDRESS,\n DEX_POSITION_MANAGER_ADDRESS,\n DEX_PAIR_ADDRESS,\n UNISWAP_FEE_TIER,\n\n // PERMIT2\n PERMIT2_ADDRESS,\n\n // Defaults\n DEFAULTS,\n\n // Helpers\n isArbitrumNetwork,\n getSubscryptsAddress\n} from '../contract';\n\n// Legacy aliases for backwards compatibility\nexport { NETWORK_CONFIG as ARBITRUM_ONE } from '../contract';\nexport { SUBSCRYPTS_ADDRESS as SUBSCRYPTS_CONTRACT_ADDRESS } from '../contract';\nexport { CHAIN_ID as ARBITRUM_ONE_CHAIN_ID } from '../contract';\nexport { DECIMALS as TOKEN_DECIMALS } from '../contract';\n\n// Legacy helper functions\nimport { NETWORK_CONFIG, CHAIN_ID, SUBS_TOKEN_ADDRESS, USDC_ADDRESS, getSubscryptsAddress } from '../contract';\n\nexport const getNetworkConfig = (_network?: 'arbitrum') => NETWORK_CONFIG;\nexport const getSubscryptsContractAddress = getSubscryptsAddress;\nexport const getSubsTokenAddress = (chainId: number): string => {\n if (chainId !== CHAIN_ID) throw new Error(`Only Arbitrum One (chain ${CHAIN_ID}) supported`);\n return SUBS_TOKEN_ADDRESS;\n};\nexport const getUsdcTokenAddress = (chainId: number): string => {\n if (chainId !== CHAIN_ID) throw new Error(`Only Arbitrum One (chain ${CHAIN_ID}) supported`);\n return USDC_ADDRESS;\n};\n","/**\n * Subscrypts SDK Logger\n *\n * Configurable logging with three levels:\n * - silent: No output (production)\n * - info: User-friendly status messages\n * - debug: Full developer debugging info\n */\n\nexport type LogLevel = 'silent' | 'info' | 'debug';\n\nexport interface LoggerConfig {\n level: LogLevel;\n prefix?: string;\n}\n\nexport interface PerformanceMetric {\n operation: string;\n duration: number;\n timestamp: number;\n}\n\nconst LOG_STYLES = {\n info: 'color: #3B82F6; font-weight: bold;', // Blue\n debug: 'color: #8B5CF6; font-weight: bold;', // Purple\n warn: 'color: #F59E0B; font-weight: bold;', // Orange\n error: 'color: #EF4444; font-weight: bold;', // Red\n success: 'color: #10B981; font-weight: bold;', // Green\n};\n\nclass SubscryptsLogger {\n private level: LogLevel = 'info';\n private prefix = '[Subscrypts]';\n private performanceMetrics: PerformanceMetric[] = [];\n private correlationIdCounter = 0;\n\n configure(config: Partial<LoggerConfig>) {\n if (config.level !== undefined) this.level = config.level;\n if (config.prefix !== undefined) this.prefix = config.prefix;\n }\n\n getLevel(): LogLevel {\n return this.level;\n }\n\n /**\n * Generate unique correlation ID for tracing related operations\n */\n generateCorrelationId(): string {\n return `${Date.now()}-${++this.correlationIdCounter}`;\n }\n\n /**\n * Track performance of async operations (debug mode only)\n */\n async trackPerformance<T>(\n operation: string,\n fn: () => Promise<T>\n ): Promise<T> {\n if (this.level !== 'debug') {\n return fn(); // Skip tracking if not in debug mode\n }\n\n const start = performance.now();\n try {\n const result = await fn();\n const duration = performance.now() - start;\n\n this.performanceMetrics.push({ operation, duration, timestamp: Date.now() });\n this.debug(`⏱️ ${operation}: ${duration.toFixed(2)}ms`);\n\n return result;\n } catch (error) {\n const duration = performance.now() - start;\n this.debug(`⏱️ ${operation}: ${duration.toFixed(2)}ms (failed)`);\n throw error;\n }\n }\n\n /**\n * Get performance metrics (debug mode only)\n */\n getPerformanceMetrics(): PerformanceMetric[] {\n return [...this.performanceMetrics];\n }\n\n /**\n * Clear performance metrics\n */\n clearMetrics(): void {\n this.performanceMetrics = [];\n }\n\n private shouldLog(minLevel: LogLevel): boolean {\n if (this.level === 'silent') return false;\n if (this.level === 'debug') return true;\n if (this.level === 'info' && minLevel !== 'debug') return true;\n return false;\n }\n\n /**\n * Debug level - detailed developer info\n */\n debug(message: string, data?: unknown) {\n if (this.shouldLog('debug')) {\n console.log(`%c${this.prefix} DEBUG:`, LOG_STYLES.debug, message, data !== undefined ? data : '');\n }\n }\n\n /**\n * Info level - user-friendly status\n */\n info(message: string, data?: unknown) {\n if (this.shouldLog('info')) {\n console.log(`%c${this.prefix}`, LOG_STYLES.info, message, data !== undefined ? data : '');\n }\n }\n\n /**\n * Warning - potential issues\n */\n warn(message: string, data?: unknown) {\n if (this.shouldLog('info')) {\n console.warn(`%c${this.prefix} WARNING:`, LOG_STYLES.warn, message, data !== undefined ? data : '');\n }\n }\n\n /**\n * Error - failures\n */\n error(message: string, data?: unknown) {\n if (this.shouldLog('info')) {\n console.error(`%c${this.prefix} ERROR:`, LOG_STYLES.error, message, data !== undefined ? data : '');\n }\n }\n\n /**\n * Success - completed operations\n */\n success(message: string, data?: unknown) {\n if (this.shouldLog('info')) {\n console.log(`%c${this.prefix} ✓`, LOG_STYLES.success, message, data !== undefined ? data : '');\n }\n }\n\n /**\n * Group logs together (debug only)\n */\n group(label: string) {\n if (this.shouldLog('debug')) {\n console.group(`${this.prefix} ${label}`);\n }\n }\n\n groupEnd() {\n if (this.shouldLog('debug')) {\n console.groupEnd();\n }\n }\n\n /**\n * Log a table of data (debug only)\n */\n table(data: unknown) {\n if (this.shouldLog('debug')) {\n console.table(data);\n }\n }\n}\n\n// Singleton instance\nexport const logger = new SubscryptsLogger();\n\n/**\n * Helper to format BigInt values for logging\n * Converts BigInt to string to avoid JSON serialization issues\n */\nexport function formatLogValue(value: unknown): unknown {\n if (typeof value === 'bigint') {\n return value.toString();\n }\n if (Array.isArray(value)) {\n return value.map(formatLogValue);\n }\n if (value && typeof value === 'object') {\n const formatted: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value)) {\n formatted[k] = formatLogValue(v);\n }\n return formatted;\n }\n return value;\n}\n","/**\n * InjectedConnector\n *\n * Connects to browser-injected wallets (MetaMask, Coinbase Wallet, etc.)\n * via window.ethereum. Wraps the existing WalletService logic.\n */\n\nimport { BrowserProvider, Eip1193Provider } from 'ethers';\nimport { WalletConnector, ConnectResult } from './types';\nimport { WalletError, NetworkError } from '../utils/errors';\nimport { NetworkConfig } from '../types';\nimport { getNetworkConfig } from '../constants';\n\nexport class InjectedConnector implements WalletConnector {\n readonly id = 'injected' as const;\n readonly name: string;\n readonly icon?: string;\n\n private provider: BrowserProvider | null = null;\n private accountsHandler: ((...args: unknown[]) => void) | null = null;\n private chainHandler: ((...args: unknown[]) => void) | null = null;\n\n constructor(options?: { name?: string; icon?: string }) {\n this.name = options?.name || this.detectWalletName();\n this.icon = options?.icon;\n }\n\n /**\n * Detect the installed wallet name from window.ethereum\n */\n private detectWalletName(): string {\n if (typeof window === 'undefined' || !window.ethereum) return 'Browser Wallet';\n if (window.ethereum.isMetaMask) return 'MetaMask';\n if (window.ethereum.isCoinbaseWallet) return 'Coinbase Wallet';\n return 'Browser Wallet';\n }\n\n /**\n * Check if a browser wallet is available\n */\n isAvailable(): boolean {\n return typeof window !== 'undefined' && !!window.ethereum;\n }\n\n /**\n * Connect to the browser wallet\n */\n async connect(): Promise<ConnectResult> {\n if (!this.isAvailable()) {\n throw new WalletError(\n 'No Ethereum wallet found. Please install MetaMask or another Web3 wallet.'\n );\n }\n\n try {\n const ethereumProvider = window.ethereum as unknown as Eip1193Provider;\n this.provider = new BrowserProvider(ethereumProvider);\n\n const accounts = await this.provider.send('eth_requestAccounts', []);\n\n if (!accounts || accounts.length === 0) {\n throw new WalletError('No accounts found. Please unlock your wallet.');\n }\n\n const network = await this.provider.getNetwork();\n const chainId = Number(network.chainId);\n const signer = await this.provider.getSigner();\n\n return {\n provider: this.provider,\n signer,\n address: accounts[0],\n chainId\n };\n } catch (error) {\n if (error instanceof WalletError) throw error;\n throw new WalletError('Failed to connect wallet', { error });\n }\n }\n\n /**\n * Disconnect (reset internal state)\n */\n async disconnect(): Promise<void> {\n this.removeListeners();\n this.provider = null;\n }\n\n /**\n * Silent reconnect: check if already authorized without popup\n */\n async reconnect(): Promise<ConnectResult | null> {\n if (!this.isAvailable()) return null;\n\n try {\n const ethereumProvider = window.ethereum as unknown as Eip1193Provider;\n this.provider = new BrowserProvider(ethereumProvider);\n\n // eth_accounts doesn't trigger a popup (unlike eth_requestAccounts)\n const accounts = await this.provider.send('eth_accounts', []);\n\n if (!accounts || accounts.length === 0) return null;\n\n const network = await this.provider.getNetwork();\n const chainId = Number(network.chainId);\n const signer = await this.provider.getSigner();\n\n return {\n provider: this.provider,\n signer,\n address: accounts[0],\n chainId\n };\n } catch {\n return null;\n }\n }\n\n /**\n * Listen to account changes\n */\n onAccountsChanged(callback: (accounts: string[]) => void): void {\n if (!window.ethereum) return;\n\n this.accountsHandler = (...args: unknown[]) => {\n callback(args[0] as string[]);\n };\n window.ethereum.on('accountsChanged', this.accountsHandler);\n }\n\n /**\n * Listen to chain changes\n */\n onChainChanged(callback: (chainId: number) => void): void {\n if (!window.ethereum) return;\n\n this.chainHandler = (...args: unknown[]) => {\n const chainIdHex = args[0] as string;\n callback(parseInt(chainIdHex, 16));\n };\n window.ethereum.on('chainChanged', this.chainHandler);\n }\n\n /**\n * Remove all event listeners\n */\n removeListeners(): void {\n if (!window.ethereum) return;\n\n if (this.accountsHandler) {\n window.ethereum.removeListener('accountsChanged', this.accountsHandler);\n this.accountsHandler = null;\n }\n if (this.chainHandler) {\n window.ethereum.removeListener('chainChanged', this.chainHandler);\n this.chainHandler = null;\n }\n }\n\n /**\n * Switch to a specific network\n */\n async switchNetwork(chainId: number): Promise<void> {\n if (!window.ethereum) {\n throw new WalletError('No Ethereum wallet found');\n }\n\n const targetNetwork = getNetworkConfig('arbitrum');\n\n try {\n await window.ethereum.request({\n method: 'wallet_switchEthereumChain',\n params: [{ chainId: `0x${chainId.toString(16)}` }]\n });\n } catch (error: any) {\n if (error.code === 4902) {\n await this.addNetwork(targetNetwork);\n } else {\n throw new NetworkError(\n `Failed to switch to chain ${chainId}`,\n { chainId, error }\n );\n }\n }\n }\n\n /**\n * Add a network to the wallet\n */\n private async addNetwork(network: NetworkConfig): Promise<void> {\n if (!window.ethereum) {\n throw new WalletError('No Ethereum wallet found');\n }\n\n try {\n await window.ethereum.request({\n method: 'wallet_addEthereumChain',\n params: [\n {\n chainId: `0x${network.chainId.toString(16)}`,\n chainName: network.name,\n nativeCurrency: network.nativeCurrency,\n rpcUrls: [network.rpcUrl],\n blockExplorerUrls: [network.blockExplorer]\n }\n ]\n });\n } catch (error) {\n throw new NetworkError(\n `Failed to add ${network.name} network`,\n { network, error }\n );\n }\n }\n}\n","/**\n * ExternalConnector\n *\n * Wraps an externally-managed wallet provider (Wagmi, RainbowKit, etc.)\n * into the WalletConnector interface. The external app manages connection\n * lifecycle; this connector just exposes the provider/signer.\n */\n\nimport { WalletConnector, ConnectResult } from './types';\nimport { ExternalWalletConfig } from '../types';\n\nexport class ExternalConnector implements WalletConnector {\n readonly id = 'external' as const;\n readonly name = 'External Provider';\n readonly icon?: string;\n\n private config: ExternalWalletConfig;\n private chainId: number;\n\n constructor(config: ExternalWalletConfig, chainId: number) {\n this.config = config;\n this.chainId = chainId;\n }\n\n /**\n * External providers are always available (they're passed in by the app)\n */\n isAvailable(): boolean {\n return true;\n }\n\n /**\n * Return the external provider/signer directly\n */\n async connect(): Promise<ConnectResult> {\n return {\n provider: this.config.provider,\n signer: this.config.signer,\n address: this.config.address,\n chainId: this.chainId\n };\n }\n\n /**\n * External disconnect is a no-op (managed by the parent app)\n */\n async disconnect(): Promise<void> {\n // No-op: external app manages disconnect\n }\n\n /**\n * External providers can always reconnect (already connected)\n */\n async reconnect(): Promise<ConnectResult | null> {\n return this.connect();\n }\n\n /**\n * Update the external config (called when externalProvider prop changes)\n */\n updateConfig(config: ExternalWalletConfig, chainId: number): void {\n this.config = config;\n this.chainId = chainId;\n }\n}\n","/**\n * Wallet Session Persistence\n *\n * Saves/loads wallet session info to localStorage so users\n * can auto-reconnect on page reload without a popup.\n */\n\nimport { ConnectorId } from './types';\n\nconst STORAGE_KEY = 'subscrypts_wallet_session';\nconst SESSION_MAX_AGE_MS = 7 * 24 * 60 * 60 * 1000; // 7 days\n\n/**\n * Stored wallet session data\n */\nexport interface WalletSession {\n connectorId: ConnectorId;\n address: string;\n timestamp: number;\n}\n\n/**\n * Save a wallet session to localStorage\n */\nexport function saveSession(connectorId: ConnectorId, address: string): void {\n try {\n const session: WalletSession = {\n connectorId,\n address,\n timestamp: Date.now()\n };\n localStorage.setItem(STORAGE_KEY, JSON.stringify(session));\n } catch {\n // localStorage may be unavailable (SSR, private browsing, etc.)\n }\n}\n\n/**\n * Load a wallet session from localStorage\n * Returns null if no session exists or session is invalid\n */\nexport function loadSession(): WalletSession | null {\n try {\n const raw = localStorage.getItem(STORAGE_KEY);\n if (!raw) return null;\n\n const session: WalletSession = JSON.parse(raw);\n\n // Validate shape\n if (!session.connectorId || !session.address || !session.timestamp) {\n clearSession();\n return null;\n }\n\n return session;\n } catch {\n clearSession();\n return null;\n }\n}\n\n/**\n * Clear the stored wallet session\n */\nexport function clearSession(): void {\n try {\n localStorage.removeItem(STORAGE_KEY);\n } catch {\n // Ignore storage errors\n }\n}\n\n/**\n * Check if a session is stale (older than max age)\n */\nexport function isSessionStale(session: WalletSession): boolean {\n return Date.now() - session.timestamp > SESSION_MAX_AGE_MS;\n}\n","/**\n * Main Subscrypts Provider Component\n *\n * Supports three usage patterns:\n * 1. enableWalletManagement=true (default) → auto-creates InjectedConnector\n * 2. externalProvider → auto-creates ExternalConnector\n * 3. connectors=[...] → uses provided connectors directly\n */\n\nimport { useState, useEffect, useCallback, useMemo, useRef } from 'react';\nimport { Contract, Signer } from 'ethers';\nimport { SubscryptsContext, SubscryptsContextValue } from './SubscryptsContext';\nimport { SubscryptsProviderProps, WalletState } from '../types';\nimport { WalletService, CacheManager } from '../services';\nimport {\n getNetworkConfig,\n getSubscryptsContractAddress,\n getSubsTokenAddress,\n getUsdcTokenAddress,\n DEFAULTS\n} from '../constants';\nimport { SUBSCRYPTS_ABI } from '../contract';\nimport { WalletError } from '../utils/errors';\nimport { logger } from '../utils/logger';\nimport { VERSION } from '../index';\nimport { WalletConnector, ConnectorId } from '../wallet/types';\nimport { InjectedConnector } from '../wallet/InjectedConnector';\nimport { ExternalConnector } from '../wallet/ExternalConnector';\nimport { saveSession, loadSession, clearSession, isSessionStale } from '../wallet/sessionStore';\n\n/**\n * Subscrypts Provider Component\n *\n * @example\n * ```tsx\n * // Pattern 1: Internal wallet management (unchanged)\n * <SubscryptsProvider enableWalletManagement={true}>\n * <App />\n * </SubscryptsProvider>\n *\n * // Pattern 2: External wallet / Wagmi (unchanged)\n * <SubscryptsProvider\n * enableWalletManagement={false}\n * externalProvider={{ provider, signer, address }}\n * >\n * <App />\n * </SubscryptsProvider>\n *\n * // Pattern 3: Connector-based (new)\n * <SubscryptsProvider connectors={[new InjectedConnector(), myPrivyConnector]}>\n * <App />\n * </SubscryptsProvider>\n * ```\n */\nexport function SubscryptsProvider({\n children,\n enableWalletManagement = true,\n externalProvider,\n network: networkName = DEFAULTS.NETWORK,\n balanceRefreshInterval = DEFAULTS.BALANCE_REFRESH_INTERVAL,\n debug = 'info',\n onAccountChange,\n onChainChange,\n connectors: connectorsProp,\n persistSession: persistSessionProp = true,\n caching\n}: SubscryptsProviderProps) {\n const network = getNetworkConfig(networkName);\n\n // Configure logger on mount\n useEffect(() => {\n logger.configure({ level: debug });\n\n if (debug !== 'silent') {\n logger.info(`SDK v${VERSION} initialized`);\n }\n\n if (debug === 'debug') {\n logger.debug('Configuration:', {\n enableWalletManagement,\n network: networkName,\n balanceRefreshInterval,\n debugLevel: debug,\n hasConnectors: !!connectorsProp,\n persistSession: persistSessionProp\n });\n }\n }, [debug, enableWalletManagement, networkName, balanceRefreshInterval, connectorsProp, persistSessionProp]);\n\n // --- Determine connector mode ---\n // If connectors prop is provided, use it directly.\n // If enableWalletManagement=true (no connectors), auto-create InjectedConnector.\n // If externalProvider is set, auto-create ExternalConnector.\n const resolvedConnectors = useMemo<WalletConnector[]>(() => {\n if (connectorsProp) return connectorsProp;\n if (!enableWalletManagement && externalProvider) {\n return [new ExternalConnector(externalProvider, network.chainId)];\n }\n if (enableWalletManagement) {\n return [new InjectedConnector()];\n }\n return [];\n }, [connectorsProp, enableWalletManagement, externalProvider, network.chainId]);\n\n const useConnectorMode = !!connectorsProp;\n\n // Wallet state\n const [walletState, setWalletState] = useState<WalletState>({\n address: null,\n chainId: null,\n isConnected: false,\n isConnecting: false,\n error: null\n });\n\n // Provider and signer\n const [signer, setSigner] = useState<Signer | null>(null);\n const [provider, setProvider] = useState<any>(null);\n\n // Contracts\n const [subscryptsContract, setSubscryptsContract] = useState<Contract | null>(null);\n const [subsTokenContract, setSubsTokenContract] = useState<Contract | null>(null);\n const [usdcTokenContract, setUsdcTokenContract] = useState<Contract | null>(null);\n\n // Balances\n const [subsBalance, setSubsBalance] = useState<bigint | null>(null);\n const [usdcBalance, setUsdcBalance] = useState<bigint | null>(null);\n\n // Active connector\n const [activeConnector, setActiveConnector] = useState<WalletConnector | null>(null);\n\n // Legacy wallet service (for non-connector mode)\n const walletService = useMemo(() => new WalletService(), []);\n\n // Track whether session reconnect has been attempted\n const sessionReconnectAttempted = useRef(false);\n\n // Cache manager for query results (namespaced by chain ID)\n const cacheManager = useMemo(\n () => new CacheManager(network.chainId, {\n enabled: caching?.enabled ?? true,\n defaultTTL: caching?.defaultTTL ?? 60_000,\n maxEntries: caching?.maxEntries ?? 500,\n }),\n [network.chainId, caching?.enabled, caching?.defaultTTL, caching?.maxEntries]\n );\n\n /**\n * Initialize contracts when signer or provider changes\n *\n * CRITICAL: Use provider for contract initialization to support read operations.\n * Ethers.js v6 requires a provider that supports 'call' operations for view functions.\n * For write operations, hooks will use signer by connecting it to the contract.\n */\n useEffect(() => {\n // Need either provider or signer with provider for reads\n const contractRunner = provider || signer;\n\n if (!contractRunner || !walletState.chainId) {\n setSubscryptsContract(null);\n setSubsTokenContract(null);\n setUsdcTokenContract(null);\n return;\n }\n\n try {\n const subscryptsAddress = getSubscryptsContractAddress(walletState.chainId);\n const subsAddress = getSubsTokenAddress(walletState.chainId);\n const usdcAddress = getUsdcTokenAddress(walletState.chainId);\n\n // Initialize with provider (or signer with provider) for read operations\n setSubscryptsContract(\n new Contract(subscryptsAddress, SUBSCRYPTS_ABI, contractRunner)\n );\n\n setSubsTokenContract(\n new Contract(subsAddress, ['function balanceOf(address) view returns (uint256)', 'function allowance(address,address) view returns (uint256)', 'function approve(address,uint256) returns (bool)'], contractRunner)\n );\n\n setUsdcTokenContract(\n new Contract(usdcAddress, ['function balanceOf(address) view returns (uint256)', 'function allowance(address,address) view returns (uint256)', 'function approve(address,uint256) returns (bool)'], contractRunner)\n );\n } catch (error) {\n console.error('Failed to initialize contracts:', error);\n }\n }, [provider, signer, walletState.chainId]);\n\n /**\n * Fetch token balances\n */\n const refreshBalances = useCallback(async () => {\n if (!walletState.address || !subsTokenContract || !usdcTokenContract) {\n return;\n }\n\n try {\n const [subs, usdc] = await Promise.all([\n subsTokenContract.balanceOf(walletState.address),\n usdcTokenContract.balanceOf(walletState.address)\n ]);\n\n setSubsBalance(subs);\n setUsdcBalance(usdc);\n } catch (error) {\n console.error('Failed to fetch balances:', error);\n }\n }, [walletState.address, subsTokenContract, usdcTokenContract]);\n\n /**\n * Balance refresh interval\n */\n useEffect(() => {\n if (!walletState.isConnected) {\n return;\n }\n\n refreshBalances();\n\n const interval = setInterval(refreshBalances, balanceRefreshInterval);\n\n return () => clearInterval(interval);\n }, [walletState.isConnected, refreshBalances, balanceRefreshInterval]);\n\n /**\n * Apply a ConnectResult to provider state\n */\n const applyConnectResult = useCallback((\n connector: WalletConnector,\n result: { provider: any; signer: Signer; address: string; chainId: number }\n ) => {\n setProvider(result.provider);\n setSigner(result.signer);\n setActiveConnector(connector);\n setWalletState({\n address: result.address,\n chainId: result.chainId,\n isConnected: true,\n isConnecting: false,\n error: null\n });\n\n if (persistSessionProp) {\n saveSession(connector.id, result.address);\n }\n\n logger.info(`Wallet connected via ${connector.name}: ${result.address.slice(0, 6)}...${result.address.slice(-4)}`);\n logger.debug('Wallet details:', { connector: connector.id, address: result.address, chainId: result.chainId });\n }, [persistSessionProp]);\n\n /**\n * Reset wallet state (shared disconnect logic)\n */\n const resetWalletState = useCallback(() => {\n setSigner(null);\n setProvider(null);\n setActiveConnector(null);\n setWalletState({\n address: null,\n chainId: null,\n isConnected: false,\n isConnecting: false,\n error: null\n });\n setSubsBalance(null);\n setUsdcBalance(null);\n clearSession();\n }, []);\n\n // ============================================================\n // Connector-based methods\n // ============================================================\n\n /**\n * Connect with a specific connector by ID\n */\n const connectWith = useCallback(async (connectorId: ConnectorId) => {\n const connector = resolvedConnectors.find(c => c.id === connectorId);\n if (!connector) {\n throw new WalletError(`Connector \"${connectorId}\" not found`);\n }\n\n if (!connector.isAvailable()) {\n throw new WalletError(`Connector \"${connector.name}\" is not available`);\n }\n\n setWalletState(prev => ({ ...prev, isConnecting: true, error: null }));\n\n try {\n const result = await connector.connect();\n\n // Auto-switch to Arbitrum if on wrong network\n if (result.chainId !== network.chainId && connector.switchNetwork) {\n await connector.switchNetwork(network.chainId);\n // Re-connect to get updated chain\n const refreshed = await connector.connect();\n applyConnectResult(connector, refreshed);\n } else {\n applyConnectResult(connector, result);\n }\n } catch (error) {\n logger.error(`Connection via ${connector.name} failed:`, error);\n setWalletState(prev => ({\n ...prev,\n isConnecting: false,\n error: error as Error\n }));\n throw error;\n }\n }, [resolvedConnectors, network.chainId, applyConnectResult]);\n\n // ============================================================\n // Legacy methods (backward compatibility)\n // ============================================================\n\n /**\n * Internal wallet connection handler (legacy)\n */\n const connect = useCallback(async () => {\n // If in connector mode, connect with first available connector\n if (useConnectorMode) {\n const available = resolvedConnectors.find(c => c.isAvailable());\n if (available) {\n await connectWith(available.id);\n return;\n }\n throw new WalletError('No available wallet connectors');\n }\n\n if (!enableWalletManagement) {\n throw new WalletError('Internal wallet management is disabled');\n }\n\n setWalletState(prev => ({ ...prev, isConnecting: true, error: null }));\n\n try {\n const result = await walletService.connect();\n\n // Check if we're on the correct network\n if (result.chainId !== network.chainId) {\n await walletService.switchNetwork(network);\n const refreshedResult = await walletService.connect();\n result.chainId = refreshedResult.chainId;\n }\n\n const providerSigner = await result.provider.getSigner();\n\n setProvider(result.provider);\n setSigner(providerSigner);\n setWalletState({\n address: result.address,\n chainId: result.chainId,\n isConnected: true,\n isConnecting: false,\n error: null\n });\n\n if (persistSessionProp) {\n saveSession('injected', result.address);\n }\n\n logger.info(`Wallet connected: ${result.address.slice(0, 6)}...${result.address.slice(-4)}`);\n logger.debug('Wallet details:', { address: result.address, chainId: result.chainId });\n } catch (error) {\n logger.error('Wallet connection failed:', error);\n setWalletState(prev => ({\n ...prev,\n isConnecting: false,\n error: error as Error\n }));\n throw error;\n }\n }, [useConnectorMode, resolvedConnectors, connectWith, enableWalletManagement, walletService, network, persistSessionProp]);\n\n /**\n * Disconnect wallet\n */\n const disconnect = useCallback(async () => {\n logger.info('Wallet disconnected');\n\n // Disconnect active connector if any\n if (activeConnector) {\n try {\n activeConnector.removeListeners?.();\n await activeConnector.disconnect();\n } catch {\n // Ignore disconnect errors\n }\n }\n\n resetWalletState();\n }, [activeConnector, resetWalletState]);\n\n /**\n * Switch network\n */\n const switchNetwork = useCallback(\n async (chainId: number) => {\n if (chainId !== 42161) {\n throw new Error('Only Arbitrum One (chain ID 42161) is supported');\n }\n\n // Try connector's switchNetwork first\n if (activeConnector?.switchNetwork) {\n await activeConnector.switchNetwork(chainId);\n // Reconnect to refresh state\n const result = await activeConnector.connect();\n applyConnectResult(activeConnector, result);\n return;\n }\n\n // Legacy fallback\n const targetNetwork = getNetworkConfig('arbitrum');\n await walletService.switchNetwork(targetNetwork);\n\n if (enableWalletManagement) {\n await connect();\n }\n },\n [activeConnector, applyConnectResult, walletService, enableWalletManagement, connect]\n );\n\n // ============================================================\n // Session persistence: auto-reconnect on mount\n // ============================================================\n\n useEffect(() => {\n if (sessionReconnectAttempted.current) return;\n sessionReconnectAttempted.current = true;\n\n if (!persistSessionProp) return;\n\n const session = loadSession();\n if (!session || isSessionStale(session)) {\n clearSession();\n return;\n }\n\n // Find the connector for this session\n const connector = resolvedConnectors.find(c => c.id === session.connectorId);\n if (!connector || !connector.isAvailable()) {\n clearSession();\n return;\n }\n\n // Silent reconnect (no popup)\n if (connector.reconnect) {\n connector.reconnect().then(result => {\n if (result) {\n applyConnectResult(connector, result);\n logger.debug('Session restored via', connector.name);\n } else {\n clearSession();\n }\n }).catch(() => {\n clearSession();\n });\n }\n }, [persistSessionProp, resolvedConnectors, applyConnectResult]);\n\n // ============================================================\n // Connector event listeners\n // ============================================================\n\n useEffect(() => {\n if (!activeConnector) return;\n\n // Listen to account changes via connector\n if (activeConnector.onAccountsChanged) {\n activeConnector.onAccountsChanged((accounts) => {\n if (accounts.length === 0) {\n disconnect();\n } else if (accounts[0] !== walletState.address) {\n const oldAddress = walletState.address;\n setWalletState(prev => ({ ...prev, address: accounts[0] }));\n\n if (persistSessionProp) {\n saveSession(activeConnector.id, accounts[0]);\n }\n\n if (onAccountChange && oldAddress) {\n onAccountChange(accounts[0], oldAddress);\n }\n }\n });\n }\n\n // Listen to chain changes via connector\n if (activeConnector.onChainChanged) {\n activeConnector.onChainChanged((newChainId) => {\n const oldChainId = walletState.chainId;\n setWalletState(prev => ({ ...prev, chainId: newChainId }));\n\n if (onChainChange && oldChainId) {\n onChainChange(newChainId, oldChainId);\n }\n\n if (newChainId !== network.chainId) {\n switchNetwork(network.chainId).catch(console.error);\n }\n });\n }\n\n return () => {\n activeConnector.removeListeners?.();\n };\n }, [activeConnector, disconnect, walletState.address, walletState.chainId, network.chainId, switchNetwork, onAccountChange, onChainChange, persistSessionProp]);\n\n // ============================================================\n // Legacy: external provider setup (non-connector mode)\n // ============================================================\n\n useEffect(() => {\n if (useConnectorMode) return;\n\n if (!enableWalletManagement && externalProvider) {\n setProvider(externalProvider.provider);\n setSigner(externalProvider.signer);\n setWalletState({\n address: externalProvider.address,\n chainId: network.chainId,\n isConnected: true,\n isConnecting: false,\n error: null\n });\n }\n }, [useConnectorMode, enableWalletManagement, externalProvider, network.chainId]);\n\n // ============================================================\n // Legacy: wallet event listeners (non-connector mode)\n // ============================================================\n\n useEffect(() => {\n if (useConnectorMode || !enableWalletManagement || activeConnector) {\n return;\n }\n\n const handleAccountsChanged = (...args: unknown[]) => {\n const accounts = args[0] as string[];\n if (accounts.length === 0) {\n disconnect();\n } else if (accounts[0] !== walletState.address) {\n const oldAddress = walletState.address;\n setWalletState(prev => ({ ...prev, address: accounts[0] }));\n if (onAccountChange && oldAddress) {\n onAccountChange(accounts[0], oldAddress);\n }\n }\n };\n\n const handleChainChanged = (...args: unknown[]) => {\n const chainIdHex = args[0] as string;\n const newChainId = parseInt(chainIdHex, 16);\n const oldChainId = walletState.chainId;\n setWalletState(prev => ({ ...prev, chainId: newChainId }));\n\n if (onChainChange && oldChainId) {\n onChainChange(newChainId, oldChainId);\n }\n\n if (newChainId !== network.chainId) {\n switchNetwork(network.chainId).catch(console.error);\n }\n };\n\n walletService.onAccountsChanged(handleAccountsChanged);\n walletService.onChainChanged(handleChainChanged);\n\n return () => {\n walletService.removeAccountsChangedListener(handleAccountsChanged);\n walletService.removeChainChangedListener(handleChainChanged);\n };\n }, [useConnectorMode, enableWalletManagement, activeConnector, walletService, disconnect, walletState.address, walletState.chainId, network.chainId, switchNetwork, onAccountChange, onChainChange]);\n\n /**\n * Context value\n */\n const contextValue: SubscryptsContextValue = useMemo(\n () => ({\n wallet: walletState,\n signer,\n provider,\n network,\n switchNetwork,\n subscryptsContract,\n subsTokenContract,\n usdcTokenContract,\n subsBalance,\n usdcBalance,\n refreshBalances,\n cacheManager,\n connectors: resolvedConnectors,\n activeConnector,\n connectWith,\n ...(enableWalletManagement || useConnectorMode ? { connect, disconnect } : {})\n }),\n [\n walletState,\n signer,\n provider,\n network,\n switchNetwork,\n subscryptsContract,\n subsTokenContract,\n usdcTokenContract,\n subsBalance,\n usdcBalance,\n refreshBalances,\n cacheManager,\n resolvedConnectors,\n activeConnector,\n connectWith,\n enableWalletManagement,\n useConnectorMode,\n connect,\n disconnect\n ]\n );\n\n return (\n <SubscryptsContext.Provider value={contextValue}>\n {children}\n </SubscryptsContext.Provider>\n );\n}\n","/**\n * Input validation utilities\n */\n\nimport { isAddress, getAddress, Contract } from 'ethers';\nimport { ValidationError } from './errors';\n\n/**\n * Validate Ethereum address\n */\nexport function validateAddress(address: string, fieldName: string = 'Address'): string {\n if (!address || address.trim() === '') {\n throw new ValidationError(fieldName, `${fieldName} is required`);\n }\n\n if (!isAddress(address)) {\n throw new ValidationError(fieldName, `Invalid ${fieldName.toLowerCase()}: ${address}`);\n }\n\n // Return checksummed address\n return getAddress(address);\n}\n\n/**\n * Validate positive number\n */\nexport function validatePositiveNumber(value: number, fieldName: string = 'Value'): void {\n if (typeof value !== 'number' || isNaN(value)) {\n throw new ValidationError(fieldName, `${fieldName} must be a number`);\n }\n\n if (value <= 0) {\n throw new ValidationError(fieldName, `${fieldName} must be positive`);\n }\n}\n\n/**\n * Validate positive bigint\n */\nexport function validatePositiveBigInt(value: bigint, fieldName: string = 'Value'): void {\n if (typeof value !== 'bigint') {\n throw new ValidationError(fieldName, `${fieldName} must be a bigint`);\n }\n\n if (value <= 0n) {\n throw new ValidationError(fieldName, `${fieldName} must be positive`);\n }\n}\n\n/**\n * Validate plan ID\n */\nexport function validatePlanId(planId: string): void {\n if (!planId || planId.trim() === '') {\n throw new ValidationError('planId', 'Plan ID is required');\n }\n}\n\n/**\n * Validate cycle limit\n */\nexport function validateCycleLimit(cycles: number): void {\n validatePositiveNumber(cycles, 'Cycle limit');\n\n if (!Number.isInteger(cycles)) {\n throw new ValidationError('cycleLimit', 'Cycle limit must be an integer');\n }\n\n if (cycles > 1000) {\n throw new ValidationError('cycleLimit', 'Cycle limit cannot exceed 1000');\n }\n}\n\n/**\n * Validate referral address for a plan\n *\n * Referral addresses must be existing subscribers to the same plan to receive\n * referral bonuses. Invalid referrals are silently ignored by the contract\n * (no error, no bonus applied).\n *\n * Contract requirement: facetSubscription.sol lines 196-198\n *\n * @param contract - Subscrypts contract instance\n * @param planId - Plan ID to check\n * @param referralAddress - Referral address to validate\n * @returns true if referral is valid (subscribed to plan), false otherwise\n *\n * @example\n * ```typescript\n * const isValid = await isValidReferral(contract, '1', '0x123...');\n * if (!isValid) {\n * console.warn('Referral address is not subscribed to this plan');\n * }\n * ```\n */\nexport async function isValidReferral(\n contract: Contract,\n planId: string | bigint,\n referralAddress: string\n): Promise<boolean> {\n try {\n const planIdBigInt = typeof planId === 'string' ? BigInt(planId) : planId;\n\n // Check if referral is subscribed to this plan\n const subscription = await contract.getPlanSubscription(\n planIdBigInt,\n referralAddress\n );\n\n // Valid if subscription exists (id > 0)\n return subscription && subscription.id > 0n;\n } catch {\n return false;\n }\n}\n\n/**\n * Check if an address is sanctioned\n *\n * Pre-flight check before subscription creation to prevent wasted gas.\n * Uses contract's subCheckSanctions method which queries Chainalysis oracle.\n *\n * **Fail-open pattern**: If the check fails (contract error, oracle unavailable),\n * returns false for both addresses to allow the transaction. This prevents breaking\n * existing integrations where sanctions checking might not be enabled.\n *\n * @param contract - Subscrypts contract instance\n * @param merchantAddress - Merchant address to check\n * @param subscriberAddress - Subscriber address to check\n * @returns Promise<{ merchantSanctioned: boolean, subscriberSanctioned: boolean }>\n *\n * @example\n * ```typescript\n * const result = await checkSanctions(contract, merchantAddr, subscriberAddr);\n * if (result.merchantSanctioned) {\n * throw new SanctionsError(merchantAddr, true);\n * }\n * if (result.subscriberSanctioned) {\n * throw new SanctionsError(subscriberAddr, false);\n * }\n * ```\n */\nexport async function checkSanctions(\n contract: Contract,\n merchantAddress: string,\n subscriberAddress: string\n): Promise<{ merchantSanctioned: boolean; subscriberSanctioned: boolean }> {\n try {\n const [merchantSanctioned, subscriberSanctioned] = await contract.subCheckSanctions(\n merchantAddress,\n subscriberAddress\n );\n return { merchantSanctioned, subscriberSanctioned };\n } catch (error) {\n // If sanctions check fails (contract not enabled), allow transaction\n // This prevents breaking existing contracts that don't have sanctions enabled\n console.warn('Sanctions check failed, allowing transaction:', error);\n return { merchantSanctioned: false, subscriberSanctioned: false };\n }\n}\n","/**\n * useSubscriptionStatus Hook\n *\n * Core hook for checking if a wallet has an active subscription to a plan.\n * This is the primary hook for access control and gating features.\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport { useSubscrypts } from '../../context/SubscryptsContext';\nimport { SubscriptionStatus, ContractSubscription } from '../../types';\nimport { getPlanSubscription, getSubscription } from '../../contract';\nimport { validatePlanId } from '../../utils/validators';\n\n/**\n * Hook return type\n */\nexport interface UseSubscriptionStatusReturn {\n /** Subscription status (null if not found) */\n status: SubscriptionStatus | null;\n /** Loading state */\n isLoading: boolean;\n /** Error if any */\n error: Error | null;\n /** Manually refresh subscription status */\n refetch: () => Promise<void>;\n}\n\n/**\n * Check subscription status for a specific plan\n *\n * @param planId - Plan ID to check\n * @param subscriber - Optional subscriber address (defaults to connected wallet)\n *\n * @example\n * ```tsx\n * const { status, isLoading, error } = useSubscriptionStatus('1');\n *\n * if (isLoading) return <Spinner />;\n * if (error) return <Error message={error.message} />;\n * if (!status?.isActive) return <Subscribe />;\n *\n * return <PremiumContent />;\n * ```\n */\nexport function useSubscriptionStatus(\n planId: string,\n subscriber?: string\n): UseSubscriptionStatusReturn {\n const { subscryptsContract, wallet, cacheManager } = useSubscrypts();\n\n const [status, setStatus] = useState<SubscriptionStatus | null>(null);\n const [isLoading, setIsLoading] = useState<boolean>(true);\n const [error, setError] = useState<Error | null>(null);\n\n // Determine which address to check\n const addressToCheck = subscriber || wallet.address;\n\n /**\n * Fetch subscription status from contract\n */\n const fetchStatus = useCallback(async () => {\n // Validation\n try {\n validatePlanId(planId);\n } catch (validationError) {\n setError(validationError as Error);\n setIsLoading(false);\n return;\n }\n\n if (!subscryptsContract) {\n setError(new Error('Subscrypts contract not initialized'));\n setIsLoading(false);\n return;\n }\n\n if (!addressToCheck) {\n setError(new Error('No wallet address available'));\n setIsLoading(false);\n return;\n }\n\n if (!cacheManager) {\n setError(new Error('Cache manager not initialized'));\n setIsLoading(false);\n return;\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n // Use contract.runner for read operations (supports both provider and signer with provider)\n const runner = subscryptsContract.runner;\n if (!runner) {\n throw new Error('Contract runner not available');\n }\n\n const cacheKey = `subscription-status:${planId}:${addressToCheck}`;\n\n // Calculate smart TTL based on subscription expiration\n const getSmartTTL = (subscription: ContractSubscription | null): number => {\n if (!subscription || !subscription.nextPaymentDate) return 30_000; // Default 30s\n\n const now = Math.floor(Date.now() / 1000);\n const expiresIn = Number(subscription.nextPaymentDate) - now;\n\n if (expiresIn < 300) return 10_000; // Expires soon: 10s TTL\n if (expiresIn < 3600) return 30_000; // Expires in <1hr: 30s TTL\n return 60_000; // Expires later: 60s TTL\n };\n\n // Fetch subscription data with caching\n const result = await cacheManager.get(\n cacheKey,\n async () => {\n // STEP 1: Get subscriptionId from plan/subscriber mapping\n const planSub = await getPlanSubscription(runner, BigInt(planId), addressToCheck);\n if (!planSub || planSub.id === 0n) return null;\n\n // STEP 2: Get FULL subscription data with authoritative nextPaymentDate\n return await getSubscription(runner, planSub.id);\n },\n undefined // Use default TTL initially, will be updated below\n );\n\n // Update cache with smart TTL based on the result\n if (result) {\n cacheManager.set(cacheKey, result, getSmartTTL(result as ContractSubscription));\n }\n\n const subscription = result as ContractSubscription | null;\n\n // Extract subscriptionId\n const subscriptionId = subscription?.id ?? 0n;\n\n if (subscriptionId === 0n || !subscription) {\n setStatus({\n isActive: false,\n expirationDate: null,\n isAutoRenewing: false,\n remainingCycles: 0,\n subscriptionId: null\n });\n setIsLoading(false);\n return;\n }\n\n // Check if subscription is active using REAL nextPaymentDate\n const now = Math.floor(Date.now() / 1000);\n const nextPaymentDate = subscription.nextPaymentDate ?? 0n;\n const isActive = Number(nextPaymentDate) > now;\n\n setStatus({\n isActive,\n expirationDate: new Date(Number(nextPaymentDate) * 1000),\n isAutoRenewing: subscription.isRecurring,\n remainingCycles: Number(subscription.remainingCycles),\n subscriptionId: subscriptionId.toString()\n });\n\n setIsLoading(false);\n } catch (err) {\n setError(err as Error);\n setIsLoading(false);\n setStatus(null);\n }\n }, [subscryptsContract, planId, addressToCheck, cacheManager]);\n\n /**\n * Fetch on mount and when dependencies change\n */\n useEffect(() => {\n fetchStatus();\n }, [fetchStatus]);\n\n /**\n * Refetch function for manual refresh\n */\n const refetch = useCallback(async () => {\n await fetchStatus();\n }, [fetchStatus]);\n\n return {\n status,\n isLoading,\n error,\n refetch\n };\n}\n","/**\n * PERMIT2 signature generation utilities\n *\n * PERMIT2 is Uniswap's universal token approval contract that allows\n * secure, gas-efficient token transfers using EIP-712 signatures.\n */\n\nimport { ethers } from 'ethers';\nimport { PERMIT2_ADDRESS } from '../constants';\nimport { logger } from './logger';\n\n/**\n * EIP-712 domain for PERMIT2 on Arbitrum One\n */\nexport const PERMIT2_DOMAIN = {\n name: 'Permit2',\n chainId: 42161,\n verifyingContract: PERMIT2_ADDRESS\n} as const;\n\n/**\n * EIP-712 types for PERMIT2 PermitTransferFrom\n */\nexport const PERMIT2_TYPES = {\n TokenPermissions: [\n { name: 'token', type: 'address' },\n { name: 'amount', type: 'uint256' }\n ],\n PermitTransferFrom: [\n { name: 'permitted', type: 'TokenPermissions' },\n { name: 'spender', type: 'address' },\n { name: 'nonce', type: 'uint256' },\n { name: 'deadline', type: 'uint256' }\n ]\n};\n\n/**\n * Generate PERMIT2 signature for token transfer\n *\n * This function creates a valid EIP-712 signature that allows the spender\n * to transfer tokens on behalf of the signer through PERMIT2.\n *\n * @param signer - Ethers signer (wallet) that will sign the permit\n * @param tokenAddress - Address of the token to permit (e.g., USDC)\n * @param amount - Amount of tokens to permit (in wei/token decimals)\n * @param spender - Address that will be allowed to spend tokens (e.g., Subscrypts contract)\n * @param deadline - Unix timestamp when the permit expires\n * @returns Object containing the signature and nonce\n *\n * @example\n * ```typescript\n * const { signature, nonce } = await generatePermit2Signature(\n * signer,\n * USDC_ADDRESS,\n * parseUnits('100', 6), // 100 USDC\n * SUBSCRYPTS_CONTRACT_ADDRESS,\n * BigInt(Math.floor(Date.now() / 1000) + 1800) // 30 minutes\n * );\n * ```\n */\nexport async function generatePermit2Signature(\n signer: ethers.Signer,\n tokenAddress: string,\n amount: bigint,\n spender: string,\n deadline: bigint\n): Promise<{ signature: string; nonce: string }> {\n logger.debug('Generating PERMIT2 signature:', {\n token: tokenAddress,\n amount: amount.toString(),\n spender,\n deadline: deadline.toString()\n });\n\n // Generate random nonce for replay protection\n const nonce = ethers.hexlify(ethers.randomBytes(32));\n\n // Create EIP-712 message\n const message = {\n permitted: {\n token: tokenAddress,\n amount: amount.toString()\n },\n spender: spender,\n nonce: BigInt(nonce).toString(),\n deadline: deadline.toString()\n };\n\n logger.debug('EIP-712 message:', message);\n\n // Sign typed data (will prompt user's wallet)\n logger.info('Requesting wallet signature...');\n const signature = await signer.signTypedData(\n PERMIT2_DOMAIN,\n PERMIT2_TYPES,\n message\n );\n\n logger.debug('PERMIT2 signature obtained:', {\n nonce,\n signatureLength: signature.length\n });\n\n return { signature, nonce };\n}\n","/**\n * useSubscribe Hook\n *\n * Execute subscription creation with SUBS or USDC payment\n */\n\nimport { useState, useCallback } from 'react';\nimport { useSubscrypts } from '../../context/SubscryptsContext';\nimport { PaymentMethod } from '../../types';\nimport { TokenService } from '../../services';\nimport { getSubscryptsContractAddress, DECIMALS, DEFAULTS, PERMIT2_ADDRESS, DEX_QUOTER_ADDRESS, USDC_ADDRESS } from '../../constants';\nimport { validatePlanId, validateCycleLimit, isValidReferral, checkSanctions } from '../../utils/validators';\nimport { TransactionError, InsufficientBalanceError, ContractError, SanctionsError } from '../../utils/errors';\nimport { generatePermit2Signature } from '../../utils/permit.utils';\nimport { DEX_QUOTER_ABI, createSubscriptionVerified, paySubscriptionWithUsdcVerified } from '../../contract';\nimport { ZeroAddress, Contract } from 'ethers';\nimport { logger, formatLogValue } from '../../utils/logger';\n\n/**\n * Subscription parameters\n */\nexport interface SubscribeParams {\n /** Plan ID to subscribe to */\n planId: string;\n /** Number of payment cycles */\n cycleLimit: number;\n /** Enable auto-renewal */\n autoRenew: boolean;\n /** Payment method: SUBS or USDC */\n paymentMethod: PaymentMethod;\n /** Referral address (optional) */\n referralAddress?: string;\n}\n\n/**\n * Hook return type\n */\nexport interface UseSubscribeReturn {\n /** Execute subscription */\n subscribe: (params: SubscribeParams) => Promise<string>;\n /** Transaction is in progress */\n isSubscribing: boolean;\n /** Current transaction state */\n txState: 'idle' | 'approving' | 'waiting_approval' | 'subscribing' | 'waiting_subscribe' | 'success' | 'error';\n /** Error if any */\n error: Error | null;\n /** Transaction hash */\n txHash: string | null;\n /** Subscription ID (available after success) */\n subscriptionId: string | null;\n}\n\n/**\n * Hook to execute subscription transactions\n *\n * @example\n * ```tsx\n * const { subscribe, isSubscribing, txState, error } = useSubscribe();\n *\n * const handleSubscribe = async () => {\n * try {\n * const subId = await subscribe({\n * planId: '1',\n * cycleLimit: 12,\n * autoRenew: true,\n * paymentMethod: 'SUBS'\n * });\n * console.log('Subscription ID:', subId);\n * } catch (error) {\n * console.error('Failed:', error);\n * }\n * };\n * ```\n */\nexport function useSubscribe(): UseSubscribeReturn {\n const { subscryptsContract, subsTokenContract, usdcTokenContract, wallet, signer, cacheManager } = useSubscrypts();\n\n const [isSubscribing, setIsSubscribing] = useState(false);\n const [txState, setTxState] = useState<UseSubscribeReturn['txState']>('idle');\n const [error, setError] = useState<Error | null>(null);\n const [txHash, setTxHash] = useState<string | null>(null);\n const [subscriptionId, setSubscriptionId] = useState<string | null>(null);\n\n const subscribe = useCallback(\n async (params: SubscribeParams): Promise<string> => {\n logger.group(`Subscribe (${params.paymentMethod})`);\n logger.debug('Subscribe params:', formatLogValue(params));\n\n // Validation\n try {\n validatePlanId(params.planId);\n validateCycleLimit(params.cycleLimit);\n logger.debug('Validation passed');\n } catch (validationError) {\n logger.error('Validation failed:', validationError);\n logger.groupEnd();\n setError(validationError as Error);\n throw validationError;\n }\n\n if (!subscryptsContract || !wallet.address || !signer) {\n const err = new Error('Wallet not connected or contract not initialized');\n logger.error('Pre-condition failed:', err.message);\n logger.groupEnd();\n setError(err);\n throw err;\n }\n\n if (!subsTokenContract || !usdcTokenContract) {\n const err = new Error('Token contracts not initialized');\n logger.error('Pre-condition failed:', err.message);\n logger.groupEnd();\n setError(err);\n throw err;\n }\n\n setIsSubscribing(true);\n setError(null);\n setTxState('idle');\n setTxHash(null);\n setSubscriptionId(null);\n\n try {\n const subscryptsAddress = getSubscryptsContractAddress(wallet.chainId!);\n\n if (params.paymentMethod === 'SUBS') {\n // SUBS payment flow\n logger.info('Starting SUBS payment flow');\n\n // Sanctions pre-flight check\n logger.info('Checking sanctions status...');\n const plan = await subscryptsContract.getPlan(BigInt(params.planId));\n const sanctionsResult = await checkSanctions(\n subscryptsContract,\n plan.merchantAddress,\n wallet.address\n );\n\n if (sanctionsResult.merchantSanctioned) {\n logger.error('Merchant address is sanctioned');\n throw new SanctionsError(plan.merchantAddress, true, { planId: params.planId });\n }\n\n if (sanctionsResult.subscriberSanctioned) {\n logger.error('Subscriber address is sanctioned');\n throw new SanctionsError(wallet.address, false, { planId: params.planId });\n }\n\n logger.debug('Sanctions check passed');\n\n const subsService = new TokenService(\n subsTokenContract.target as string,\n signer,\n DECIMALS.SUBS,\n 'SUBS'\n );\n\n setTxState('approving');\n logger.info('Checking SUBS allowance...');\n\n // Ensure allowance (this will check balance and approve if needed)\n // We use a large approval amount since the exact cost needs to be fetched from contract\n const largeApproval = BigInt('1000000000000000000000'); // 1000 SUBS\n\n try {\n await subsService.ensureAllowance(\n wallet.address,\n subscryptsAddress,\n largeApproval\n );\n logger.debug('SUBS allowance confirmed');\n } catch (err) {\n if (err instanceof InsufficientBalanceError) {\n logger.error('Insufficient SUBS balance:', err);\n logger.groupEnd();\n setError(err);\n setIsSubscribing(false);\n setTxState('error');\n throw err;\n }\n logger.warn('Allowance check warning (continuing):', err);\n }\n\n // Validate referral address if provided\n if (params.referralAddress && params.referralAddress !== ZeroAddress) {\n logger.info('Validating referral address...');\n\n const isValid = await isValidReferral(\n subscryptsContract,\n params.planId,\n params.referralAddress\n );\n\n if (!isValid) {\n logger.warn(\n `Referral address is not a subscriber to this plan: ${params.referralAddress} - Referral bonus will NOT be applied by the contract`\n );\n // Don't fail - contract will silently ignore invalid referral\n // Just log warning for developer awareness\n } else {\n logger.debug('Referral address validated successfully');\n }\n }\n\n setTxState('subscribing');\n\n // Create subscription with verification\n const result = await createSubscriptionVerified(signer, {\n planId: BigInt(params.planId),\n subscriber: wallet.address,\n recurring: params.autoRenew,\n remainingCycles: BigInt(params.cycleLimit),\n referral: params.referralAddress || ZeroAddress,\n onlyCreate: false,\n deductFrom: wallet.address\n });\n\n const subId = result.subscriptionId.toString();\n setSubscriptionId(subId);\n setTxState('success');\n setIsSubscribing(false);\n\n // Auto-invalidate cache after successful subscription\n logger.debug('Auto-invalidating cache after successful subscription');\n cacheManager.invalidate('my-subscriptions:'); // Clear user's subscriptions list\n cacheManager.invalidate(`subscription-status:${params.planId}:`); // Clear this plan's status checks\n logger.debug('Cache invalidated successfully');\n\n logger.success(`Subscription ID: ${subId}`);\n logger.groupEnd();\n\n return subId;\n\n } else {\n // USDC payment flow with calculated amount\n logger.info('Starting USDC payment flow');\n const usdcService = new TokenService(\n usdcTokenContract.target as string,\n signer,\n DECIMALS.USDC,\n 'USDC'\n );\n\n // Step 1: Calculate actual USDC needed via Uniswap Quoter\n setTxState('approving');\n\n const provider = signer.provider;\n if (!provider) {\n logger.error('Provider not available');\n logger.groupEnd();\n throw new ContractError('Provider not available');\n }\n\n // Fetch plan from contract to get required SUBS amount\n logger.info('Fetching plan data...');\n const plan = await subscryptsContract.getPlan(BigInt(params.planId));\n logger.debug('Plan data:', formatLogValue({\n subscriptionAmount: plan.subscriptionAmount,\n currencyCode: plan.currencyCode\n }));\n\n // Sanctions pre-flight check\n logger.info('Checking sanctions status...');\n const sanctionsResult = await checkSanctions(\n subscryptsContract,\n plan.merchantAddress,\n wallet.address\n );\n\n if (sanctionsResult.merchantSanctioned) {\n logger.error('Merchant address is sanctioned');\n throw new SanctionsError(plan.merchantAddress, true, { planId: params.planId });\n }\n\n if (sanctionsResult.subscriberSanctioned) {\n logger.error('Subscriber address is sanctioned');\n throw new SanctionsError(wallet.address, false, { planId: params.planId });\n }\n\n logger.debug('Sanctions check passed');\n\n // Calculate required SUBS (handle both SUBS and USD-denominated plans)\n let requiredSubs18 = plan.subscriptionAmount;\n\n if (Number(plan.currencyCode) === 1) {\n // USD-denominated plan: convert to SUBS at current price\n logger.debug('USD-denominated plan, converting to SUBS...');\n const conversion = await subscryptsContract.convertOtherCurrencyToToken(\n plan.subscriptionAmount\n );\n requiredSubs18 = conversion.outputSUBS18;\n logger.debug('Conversion result:', { outputSUBS18: requiredSubs18.toString() });\n }\n\n logger.debug('Required SUBS:', requiredSubs18.toString());\n\n // Quote USDC needed from Uniswap QuoterV2\n logger.info('Fetching USDC quote from Uniswap...');\n const quoter = new Contract(DEX_QUOTER_ADDRESS, DEX_QUOTER_ABI, provider);\n const quoteResult = await quoter.quoteExactOutputSingle.staticCall({\n tokenIn: USDC_ADDRESS,\n tokenOut: subscryptsAddress,\n amount: requiredSubs18,\n fee: DEFAULTS.UNISWAP_FEE_TIER,\n sqrtPriceLimitX96: 0n\n });\n\n // Extract amountIn from tuple result (QuoterV2 returns [amountIn, sqrtPriceX96After, initializedTicksCrossed, gasEstimate])\n const usdcNeeded = quoteResult[0];\n\n // Add 0.5% buffer for price slippage\n const maxUsdcIn = (usdcNeeded * 10050n) / 10000n;\n\n logger.debug('Quote result:', {\n usdcNeeded: usdcNeeded.toString(),\n maxUsdcIn: maxUsdcIn.toString(),\n slippageBuffer: '0.5%'\n });\n\n // Step 2: Approve PERMIT2 for calculated USDC amount\n logger.info('Checking USDC allowance for PERMIT2...');\n try {\n await usdcService.ensureAllowance(\n wallet.address,\n PERMIT2_ADDRESS,\n maxUsdcIn\n );\n logger.debug('USDC allowance confirmed for PERMIT2');\n } catch (err) {\n if (err instanceof InsufficientBalanceError) {\n logger.error('Insufficient USDC balance:', err);\n logger.groupEnd();\n setError(err);\n setIsSubscribing(false);\n setTxState('error');\n throw err;\n }\n logger.warn('Allowance check warning (continuing):', err);\n }\n\n // Step 3: Generate deadline for permit (30 minutes from now)\n const deadline = BigInt(Math.floor(Date.now() / 1000) + 1800);\n\n // Step 4: Generate PERMIT2 signature with calculated amount\n logger.info('Generating PERMIT2 signature...');\n setTxState('approving');\n\n const { signature, nonce } = await generatePermit2Signature(\n signer,\n usdcTokenContract.target as string,\n maxUsdcIn,\n subscryptsAddress,\n deadline\n );\n\n logger.debug('PERMIT2 signature generated:', {\n nonce: nonce.toString(),\n deadline: deadline.toString(),\n signatureLength: signature.length\n });\n\n // Validate referral address if provided\n if (params.referralAddress && params.referralAddress !== ZeroAddress) {\n logger.info('Validating referral address...');\n\n const isValid = await isValidReferral(\n subscryptsContract,\n params.planId,\n params.referralAddress\n );\n\n if (!isValid) {\n logger.warn(\n `Referral address is not a subscriber to this plan: ${params.referralAddress} - Referral bonus will NOT be applied by the contract`\n );\n // Don't fail - contract will silently ignore invalid referral\n // Just log warning for developer awareness\n } else {\n logger.debug('Referral address validated successfully');\n }\n }\n\n // Step 5: Call contract with valid signature and calculated amount\n setTxState('subscribing');\n\n const result = await paySubscriptionWithUsdcVerified(\n signer,\n {\n planId: BigInt(params.planId),\n recurring: params.autoRenew,\n remainingCycles: BigInt(params.cycleLimit),\n referral: params.referralAddress || ZeroAddress,\n feeTier: BigInt(DEFAULTS.UNISWAP_FEE_TIER),\n deadline: deadline,\n nonce: BigInt(nonce),\n permitDeadline: deadline,\n signature: signature,\n maxUsdcIn6Cap: maxUsdcIn\n },\n wallet.address // Pass subscriber address for verification\n );\n\n const subId = result.subId.toString();\n setSubscriptionId(subId);\n setTxState('success');\n setIsSubscribing(false);\n\n // Auto-invalidation cache after successful subscription\n logger.debug('Auto-invalidating cache after successful subscription');\n cacheManager.invalidate('my-subscriptions:'); // Clear user's subscriptions list\n cacheManager.invalidate(`subscription-status:${params.planId}:`); // Clear this plan's status checks\n logger.debug('Cache invalidated successfully');\n\n logger.success(`Subscription ID: ${subId}`);\n logger.groupEnd();\n\n return subId;\n }\n } catch (err) {\n logger.error('Subscribe failed:', err);\n logger.groupEnd();\n const txError = new TransactionError(\n 'Failed to create subscription',\n undefined,\n { error: err }\n );\n setError(txError);\n setTxState('error');\n setIsSubscribing(false);\n throw txError;\n }\n },\n [subscryptsContract, subsTokenContract, usdcTokenContract, wallet, signer]\n );\n\n return {\n subscribe,\n isSubscribing,\n txState,\n error,\n txHash,\n subscriptionId\n };\n}\n","/**\n * useManageSubscription Hook\n *\n * Manage an existing subscription: cancel, toggle auto-renewal, update cycles, change attributes.\n */\n\nimport { useState, useCallback } from 'react';\nimport { useSubscrypts } from '../../context/SubscryptsContext';\nimport { subscriptionRecurringCHG, subscriptionAttributeCHG } from '../../contract';\nimport { TransactionError } from '../../utils/errors';\nimport { logger } from '../../utils/logger';\nimport type { TransactionState } from '../../types';\n\n/**\n * Hook return type\n */\nexport interface UseManageSubscriptionReturn {\n /** Cancel subscription (disables auto-renew and sets 0 remaining cycles) */\n cancelSubscription: () => Promise<void>;\n /** Toggle auto-renewal on/off */\n toggleAutoRenew: (enabled: boolean) => Promise<void>;\n /** Update remaining payment cycles */\n updateCycles: (cycles: number) => Promise<void>;\n /** Update subscription custom attributes */\n updateAttributes: (attributes: string) => Promise<void>;\n /** Current transaction state */\n txState: TransactionState;\n /** Error if any */\n error: Error | null;\n /** Whether a transaction is in progress */\n isProcessing: boolean;\n}\n\n/**\n * Manage an existing subscription.\n *\n * @param subscriptionId - The subscription ID to manage\n *\n * @example\n * ```tsx\n * const { cancelSubscription, toggleAutoRenew, isProcessing } = useManageSubscription('42');\n *\n * // Cancel subscription\n * await cancelSubscription();\n *\n * // Toggle auto-renewal\n * await toggleAutoRenew(false);\n * ```\n */\nexport function useManageSubscription(subscriptionId: string): UseManageSubscriptionReturn {\n const { signer } = useSubscrypts();\n\n const [txState, setTxState] = useState<TransactionState>('idle');\n const [error, setError] = useState<Error | null>(null);\n const [isProcessing, setIsProcessing] = useState(false);\n\n const subId = BigInt(subscriptionId);\n\n const cancelSubscription = useCallback(async () => {\n if (!signer) {\n throw new Error('Wallet not connected');\n }\n\n logger.info(`Cancelling subscription ${subscriptionId}`);\n setIsProcessing(true);\n setTxState('subscribing');\n setError(null);\n\n try {\n const tx = await subscriptionRecurringCHG(signer, subId, false, 0n);\n await tx.wait();\n setTxState('success');\n logger.info(`Subscription ${subscriptionId} cancelled`);\n } catch (err) {\n const txError = new TransactionError(\n 'Failed to cancel subscription',\n undefined,\n { error: err }\n );\n setError(txError);\n setTxState('error');\n throw txError;\n } finally {\n setIsProcessing(false);\n }\n }, [signer, subId, subscriptionId]);\n\n const toggleAutoRenew = useCallback(async (enabled: boolean) => {\n if (!signer) {\n throw new Error('Wallet not connected');\n }\n\n logger.info(`Setting auto-renew=${enabled} for subscription ${subscriptionId}`);\n setIsProcessing(true);\n setTxState('subscribing');\n setError(null);\n\n try {\n // When toggling auto-renew, keep current cycles (pass 0 to not change)\n const tx = await subscriptionRecurringCHG(signer, subId, enabled, 0n);\n await tx.wait();\n setTxState('success');\n logger.info(`Subscription ${subscriptionId} auto-renew set to ${enabled}`);\n } catch (err) {\n const txError = new TransactionError(\n 'Failed to update auto-renewal',\n undefined,\n { error: err }\n );\n setError(txError);\n setTxState('error');\n throw txError;\n } finally {\n setIsProcessing(false);\n }\n }, [signer, subId, subscriptionId]);\n\n const updateCycles = useCallback(async (cycles: number) => {\n if (!signer) {\n throw new Error('Wallet not connected');\n }\n\n logger.info(`Updating cycles to ${cycles} for subscription ${subscriptionId}`);\n setIsProcessing(true);\n setTxState('subscribing');\n setError(null);\n\n try {\n const tx = await subscriptionRecurringCHG(signer, subId, true, BigInt(cycles));\n await tx.wait();\n setTxState('success');\n logger.info(`Subscription ${subscriptionId} cycles updated to ${cycles}`);\n } catch (err) {\n const txError = new TransactionError(\n 'Failed to update payment cycles',\n undefined,\n { error: err }\n );\n setError(txError);\n setTxState('error');\n throw txError;\n } finally {\n setIsProcessing(false);\n }\n }, [signer, subId, subscriptionId]);\n\n const updateAttributes = useCallback(async (attributes: string) => {\n if (!signer) {\n throw new Error('Wallet not connected');\n }\n\n logger.info(`Updating attributes for subscription ${subscriptionId}`);\n setIsProcessing(true);\n setTxState('subscribing');\n setError(null);\n\n try {\n const tx = await subscriptionAttributeCHG(signer, subId, attributes);\n await tx.wait();\n setTxState('success');\n logger.info(`Subscription ${subscriptionId} attributes updated`);\n } catch (err) {\n const txError = new TransactionError(\n 'Failed to update subscription attributes',\n undefined,\n { error: err }\n );\n setError(txError);\n setTxState('error');\n throw txError;\n } finally {\n setIsProcessing(false);\n }\n }, [signer, subId, subscriptionId]);\n\n return {\n cancelSubscription,\n toggleAutoRenew,\n updateCycles,\n updateAttributes,\n txState,\n error,\n isProcessing\n };\n}\n","/**\n * useMySubscriptions Hook\n *\n * Fetch paginated subscriptions for the connected wallet address.\n *\n * STRATEGY:\n * 1. PRIMARY: Calls getSubscriptionsByAddress(0, 100) for all subscriptions (1 RPC call - efficient)\n * 2. FILTER: If planIds specified, filters results to only include those plans\n * 3. FALLBACK: If empty results + planIds provided, loops through plans using getPlanSubscription (reliable but slower)\n *\n * This optimizes for the best case (contract working = 1 call) while handling the broken case.\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport { useSubscrypts } from '../../context/SubscryptsContext';\nimport { Subscription, ContractSubscription } from '../../types';\nimport { getSubscriptionsByAddress, getPlanSubscription, getSubscription } from '../../contract';\n\n/**\n * Transform contract subscription data to SDK Subscription type\n */\nfunction transformContractSubscription(contractSub: ContractSubscription): Subscription {\n return {\n id: contractSub.id.toString(),\n merchantAddress: contractSub.merchantAddress,\n planId: contractSub.planId.toString(),\n subscriber: contractSub.subscriberAddress,\n currencyCode: contractSub.currencyCode,\n subscriptionAmount: contractSub.subscriptionAmount,\n paymentFrequency: contractSub.paymentFrequency,\n isAutoRenewing: contractSub.isRecurring,\n remainingCycles: Number(contractSub.remainingCycles),\n customAttributes: contractSub.customAttributes,\n lastPaymentDate: new Date(Number(contractSub.lastPaymentDate) * 1000),\n nextPaymentDate: new Date(Number(contractSub.nextPaymentDate) * 1000)\n };\n}\n\n/**\n * Hook return type\n */\nexport interface UseMySubscriptionsReturn {\n /** Array of subscriptions for current page */\n subscriptions: Subscription[];\n /** Total number of subscriptions */\n total: number;\n /** Current page (1-indexed) */\n page: number;\n /** Number of subscriptions per page */\n pageSize: number;\n /** Whether there are more pages */\n hasMore: boolean;\n /** Loading state */\n isLoading: boolean;\n /** Error if any */\n error: Error | null;\n /** Go to next page */\n nextPage: () => void;\n /** Go to previous page */\n prevPage: () => void;\n /** Manually refresh subscriptions */\n refetch: () => Promise<void>;\n}\n\n/**\n * Fetch paginated subscriptions for a wallet address\n *\n * @param address - Optional address to fetch subscriptions for (defaults to connected wallet)\n * @param pageSize - Number of subscriptions per page (default: 10)\n * @param planIds - Optional array of plan IDs to check (recommended for reliability)\n *\n * @example\n * ```tsx\n * // Get all subscriptions (tries getSubscriptionsByAddress, up to 100 subs)\n * const { subscriptions, isLoading } = useMySubscriptions();\n *\n * // Filter to specific plans + fallback if getSubscriptionsByAddress fails\n * const { subscriptions, isLoading } = useMySubscriptions(undefined, 10, ['1', '2', '3']);\n *\n * if (isLoading) return <Spinner />;\n *\n * return (\n * <div>\n * {subscriptions.map(sub => <SubscriptionCard key={sub.id} subscription={sub} />)}\n * </div>\n * );\n * ```\n */\nexport function useMySubscriptions(\n address?: string,\n pageSize: number = 10,\n planIds?: string[]\n): UseMySubscriptionsReturn {\n const { provider, wallet, cacheManager } = useSubscrypts();\n\n const [subscriptions, setSubscriptions] = useState<Subscription[]>([]);\n const [total, setTotal] = useState<number>(0);\n const [page, setPage] = useState<number>(1);\n const [isLoading, setIsLoading] = useState<boolean>(true);\n const [error, setError] = useState<Error | null>(null);\n\n // Determine which address to use\n const targetAddress = address || wallet?.address;\n\n /**\n * Fetch subscriptions for current page from contract\n */\n const fetchSubscriptions = useCallback(async () => {\n if (!targetAddress) {\n setError(new Error('No wallet address provided'));\n setIsLoading(false);\n return;\n }\n\n if (!provider || !cacheManager) {\n setError(new Error('Provider not initialized'));\n setIsLoading(false);\n return;\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n const cacheKey = `my-subscriptions:${targetAddress}`;\n\n // PRIMARY METHOD: Try getSubscriptionsByAddress first (most efficient - 1 RPC call)\n // Fetch up to 100 subscriptions with 2-minute cache\n let allSubs = await cacheManager.get(\n cacheKey,\n async () => {\n const result = await getSubscriptionsByAddress(provider, targetAddress, 0n, 100n);\n const [subs] = result;\n return (subs as ContractSubscription[]).map(transformContractSubscription);\n },\n 120_000 // 2-minute TTL\n );\n\n // FALLBACK: If getSubscriptionsByAddress returns empty but we have planIds to check\n // This handles the case where contract's subscriberSubscriptions mapping isn't populated\n if (allSubs.length === 0 && planIds && planIds.length > 0) {\n console.warn('getSubscriptionsByAddress returned empty, falling back to plan loop method');\n\n // Check each plan individually (slower but reliable)\n for (const planId of planIds) {\n try {\n const planSub = await getPlanSubscription(provider, BigInt(planId), targetAddress);\n\n if (planSub && planSub.id && planSub.id !== 0n) {\n // Get full subscription data\n const fullSub = await getSubscription(provider, planSub.id);\n\n if (fullSub) {\n allSubs.push(transformContractSubscription(fullSub as ContractSubscription));\n }\n }\n } catch (planErr) {\n // Skip plans that error (might not exist)\n console.warn(`Failed to fetch subscription for plan ${planId}:`, planErr);\n }\n }\n }\n\n // FILTER: If planIds specified, filter results to only include those plans\n if (planIds && planIds.length > 0 && allSubs.length > 0) {\n allSubs = allSubs.filter(sub => planIds.includes(sub.planId));\n }\n\n // Apply pagination to results\n const startIdx = (page - 1) * pageSize;\n const endIdx = page * pageSize;\n const paginatedSubs = allSubs.slice(startIdx, endIdx);\n\n setSubscriptions(paginatedSubs);\n setTotal(allSubs.length);\n setIsLoading(false);\n } catch (err) {\n setError(err as Error);\n setIsLoading(false);\n setSubscriptions([]);\n setTotal(0);\n }\n }, [provider, targetAddress, page, pageSize, planIds, cacheManager]);\n\n /**\n * Fetch on mount and when dependencies change\n */\n useEffect(() => {\n fetchSubscriptions();\n }, [fetchSubscriptions]);\n\n /**\n * Navigate to next page\n */\n const nextPage = useCallback(() => {\n if (page * pageSize < total) {\n setPage(prev => prev + 1);\n }\n }, [page, pageSize, total]);\n\n /**\n * Navigate to previous page\n */\n const prevPage = useCallback(() => {\n if (page > 1) {\n setPage(prev => prev - 1);\n }\n }, [page]);\n\n /**\n * Check if there are more pages\n */\n const hasMore = page * pageSize < total;\n\n /**\n * Refetch function for manual refresh\n */\n const refetch = useCallback(async () => {\n await fetchSubscriptions();\n }, [fetchSubscriptions]);\n\n return {\n subscriptions,\n total,\n page,\n pageSize,\n hasMore,\n isLoading,\n error,\n nextPage,\n prevPage,\n refetch\n };\n}\n","/**\n * Formatting utilities for numbers, dates, and addresses\n */\n\nimport { formatUnits, parseUnits } from 'ethers';\n\n/**\n * Format bigint token amount to human-readable string\n */\nexport function formatTokenAmount(amount: bigint, decimals: number, maxDecimals: number = 4): string {\n const formatted = formatUnits(amount, decimals);\n const parts = formatted.split('.');\n\n if (parts.length === 1) return parts[0];\n\n // Limit decimal places\n const decimalPart = parts[1].slice(0, maxDecimals);\n return `${parts[0]}.${decimalPart}`;\n}\n\n/**\n * Parse token amount from string to bigint\n */\nexport function parseTokenAmount(amount: string, decimals: number): bigint {\n return parseUnits(amount, decimals);\n}\n\n/**\n * Format SUBS token amount (18 decimals)\n */\nexport function formatSubs(amount: bigint): string {\n return formatTokenAmount(amount, 18, 4);\n}\n\n/**\n * Format USDC token amount (6 decimals)\n */\nexport function formatUsdc(amount: bigint): string {\n return formatTokenAmount(amount, 6, 2);\n}\n\n/**\n * Format date for display\n */\nexport function formatDate(date: Date): string {\n return new Intl.DateTimeFormat('en-US', {\n year: 'numeric',\n month: 'short',\n day: 'numeric'\n }).format(date);\n}\n\n/**\n * Format date with time\n */\nexport function formatDateTime(date: Date): string {\n return new Intl.DateTimeFormat('en-US', {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit'\n }).format(date);\n}\n\n/**\n * Format duration in seconds to human-readable string\n */\nexport function formatDuration(seconds: number): string {\n const days = Math.floor(seconds / 86400);\n const hours = Math.floor((seconds % 86400) / 3600);\n const minutes = Math.floor((seconds % 3600) / 60);\n\n if (days > 0) {\n return `${days} day${days > 1 ? 's' : ''}`;\n }\n if (hours > 0) {\n return `${hours} hour${hours > 1 ? 's' : ''}`;\n }\n if (minutes > 0) {\n return `${minutes} minute${minutes > 1 ? 's' : ''}`;\n }\n return `${seconds} second${seconds > 1 ? 's' : ''}`;\n}\n\n/**\n * Shorten address for display (0x1234...5678)\n */\nexport function shortenAddress(address: string, startChars: number = 6, endChars: number = 4): string {\n if (!address) return '';\n if (address.length <= startChars + endChars) return address;\n\n return `${address.slice(0, startChars)}...${address.slice(-endChars)}`;\n}\n\n/**\n * Format percentage\n */\nexport function formatPercentage(value: number, decimals: number = 2): string {\n return `${value.toFixed(decimals)}%`;\n}\n\n/**\n * Format a fiat (USD) price for display\n */\nexport function formatFiatPrice(amount: number, locale: string = 'en-US'): string {\n return new Intl.NumberFormat(locale, {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n maximumFractionDigits: 2\n }).format(amount);\n}\n","/**\n * useTokenBalance Hook\n *\n * Get token balance for SUBS or USDC\n */\n\nimport { useSubscrypts } from '../../context/SubscryptsContext';\nimport { formatSubs, formatUsdc } from '../../utils/formatters';\n\n/**\n * Token type\n */\nexport type TokenType = 'SUBS' | 'USDC';\n\n/**\n * Hook return type\n */\nexport interface UseTokenBalanceReturn {\n /** Raw balance (bigint) */\n balance: bigint | null;\n /** Formatted balance (string) */\n formatted: string;\n /** Loading state */\n isLoading: boolean;\n /** Manually refresh balance */\n refetch: () => Promise<void>;\n}\n\n/**\n * Hook to get token balance\n *\n * @param token - Token to get balance for ('SUBS' or 'USDC')\n *\n * @example\n * ```tsx\n * const { balance, formatted, isLoading } = useTokenBalance('SUBS');\n *\n * return <div>Balance: {formatted} SUBS</div>;\n * ```\n */\nexport function useTokenBalance(token: TokenType): UseTokenBalanceReturn {\n const { subsBalance, usdcBalance, refreshBalances, wallet } = useSubscrypts();\n\n const balance = token === 'SUBS' ? subsBalance : usdcBalance;\n const isLoading = wallet.isConnected && balance === null;\n\n const formatted = balance !== null\n ? (token === 'SUBS' ? formatSubs(balance) : formatUsdc(balance))\n : '0.00';\n\n return {\n balance,\n formatted,\n isLoading,\n refetch: refreshBalances\n };\n}\n","/**\n * useWallet Hook\n *\n * Access wallet connection state, actions, and connector information.\n */\n\nimport { useSubscrypts } from '../../context/SubscryptsContext';\nimport { WalletState } from '../../types';\nimport type { WalletConnector, ConnectorId } from '../../wallet/types';\n\n/**\n * Hook return type\n */\nexport interface UseWalletReturn extends WalletState {\n /** Connect wallet (only available if wallet management is enabled) */\n connect?: () => Promise<void>;\n /** Disconnect wallet (only available if wallet management is enabled) */\n disconnect?: () => Promise<void>;\n /** Switch network */\n switchNetwork: (chainId: number) => Promise<void>;\n /** Available wallet connectors */\n connectors: WalletConnector[];\n /** Currently active connector (null if not connected) */\n activeConnector: WalletConnector | null;\n /** Connect with a specific connector by ID */\n connectWith: (connectorId: ConnectorId) => Promise<void>;\n}\n\n/**\n * Hook to access wallet state and connector info\n *\n * @example\n * ```tsx\n * const { address, isConnected, connect, disconnect, connectors, connectWith } = useWallet();\n *\n * if (!isConnected) {\n * return <button onClick={connect}>Connect Wallet</button>;\n * }\n *\n * return (\n * <button onClick={disconnect}>\n * {address?.slice(0, 6)}...{address?.slice(-4)}\n * </button>\n * );\n * ```\n */\nexport function useWallet(): UseWalletReturn {\n const { wallet, connect, disconnect, switchNetwork, connectors, activeConnector, connectWith } = useSubscrypts();\n\n return {\n ...wallet,\n connect,\n disconnect,\n switchNetwork,\n connectors,\n activeConnector,\n connectWith\n };\n}\n","/**\n * usePlan Hook\n *\n * Fetch a single subscription plan from the smart contract.\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport { useSubscrypts } from '../../context/SubscryptsContext';\nimport { Plan } from '../../types';\nimport { getPlan } from '../../contract';\nimport { validatePlanId } from '../../utils/validators';\n\n/**\n * Hook return type\n */\nexport interface UsePlanReturn {\n /** Plan data (null if not found or loading) */\n plan: Plan | null;\n /** Loading state */\n isLoading: boolean;\n /** Error if any */\n error: Error | null;\n /** Manually refresh plan data */\n refetch: () => Promise<void>;\n}\n\n/**\n * Fetch a single plan by ID\n *\n * @param planId - Plan ID to fetch\n *\n * @example\n * ```tsx\n * const { plan, isLoading, error } = usePlan('1');\n *\n * if (isLoading) return <Spinner />;\n * if (error) return <Error message={error.message} />;\n * if (!plan) return <NotFound />;\n *\n * return <PlanDetails plan={plan} />;\n * ```\n */\nexport function usePlan(planId: string): UsePlanReturn {\n const { provider, cacheManager } = useSubscrypts();\n\n const [plan, setPlan] = useState<Plan | null>(null);\n const [isLoading, setIsLoading] = useState<boolean>(true);\n const [error, setError] = useState<Error | null>(null);\n\n /**\n * Fetch plan from contract\n */\n const fetchPlan = useCallback(async () => {\n // Validation\n try {\n validatePlanId(planId);\n } catch (validationError) {\n setError(validationError as Error);\n setIsLoading(false);\n return;\n }\n\n if (!provider || !cacheManager) {\n setError(new Error('Provider not initialized'));\n setIsLoading(false);\n return;\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n const cacheKey = `plan:${planId}`;\n const result = await cacheManager.get(\n cacheKey,\n () => getPlan(provider, BigInt(planId)),\n -1 // Infinite TTL - plans are static\n );\n setPlan(result as Plan);\n setIsLoading(false);\n } catch (err) {\n setError(err as Error);\n setIsLoading(false);\n setPlan(null);\n }\n }, [provider, planId, cacheManager]);\n\n /**\n * Fetch on mount and when dependencies change\n */\n useEffect(() => {\n if (planId) {\n fetchPlan();\n }\n }, [fetchPlan, planId]);\n\n /**\n * Refetch function for manual refresh\n */\n const refetch = useCallback(async () => {\n await fetchPlan();\n }, [fetchPlan]);\n\n return {\n plan,\n isLoading,\n error,\n refetch\n };\n}\n","/**\n * usePlans Hook\n *\n * Fetch multiple subscription plans from the smart contract.\n */\n\nimport { useState, useEffect, useCallback, useMemo } from 'react';\nimport { useSubscrypts } from '../../context/SubscryptsContext';\nimport { Plan } from '../../types';\nimport { getPlan } from '../../contract';\nimport { validatePlanId } from '../../utils/validators';\n\n/**\n * Hook return type\n */\nexport interface UsePlansReturn {\n /** Array of plans (empty if loading or error) */\n plans: Plan[];\n /** Loading state */\n isLoading: boolean;\n /** Error if any */\n error: Error | null;\n /** Manually refresh all plans */\n refetch: () => Promise<void>;\n}\n\n/**\n * Fetch multiple plans by IDs\n *\n * @param planIds - Array of plan IDs to fetch\n *\n * @example\n * ```tsx\n * const { plans, isLoading, error } = usePlans(['1', '2', '3']);\n *\n * if (isLoading) return <Spinner />;\n * if (error) return <Error message={error.message} />;\n *\n * return (\n * <div className=\"grid\">\n * {plans.map(plan => <PlanCard key={plan.id.toString()} plan={plan} />)}\n * </div>\n * );\n * ```\n */\nexport function usePlans(planIds: string[]): UsePlansReturn {\n const { provider } = useSubscrypts();\n\n const [plans, setPlans] = useState<Plan[]>([]);\n const [isLoading, setIsLoading] = useState<boolean>(true);\n const [error, setError] = useState<Error | null>(null);\n\n // Memoize planIds to prevent unnecessary re-fetches\n const planIdsKey = useMemo(() => planIds.join(','), [planIds]);\n\n /**\n * Fetch all plans from contract in parallel\n */\n const fetchPlans = useCallback(async () => {\n if (!planIds || planIds.length === 0) {\n setPlans([]);\n setIsLoading(false);\n return;\n }\n\n // Validate all plan IDs\n try {\n planIds.forEach(id => validatePlanId(id));\n } catch (validationError) {\n setError(validationError as Error);\n setIsLoading(false);\n return;\n }\n\n if (!provider) {\n setError(new Error('Provider not initialized'));\n setIsLoading(false);\n return;\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n // Fetch all plans in parallel\n const planPromises = planIds.map(id =>\n getPlan(provider, BigInt(id))\n );\n\n const results = await Promise.all(planPromises);\n setPlans(results as Plan[]);\n setIsLoading(false);\n } catch (err) {\n setError(err as Error);\n setIsLoading(false);\n setPlans([]);\n }\n }, [provider, planIdsKey]);\n\n /**\n * Fetch on mount and when dependencies change\n */\n useEffect(() => {\n fetchPlans();\n }, [fetchPlans]);\n\n /**\n * Refetch function for manual refresh\n */\n const refetch = useCallback(async () => {\n await fetchPlans();\n }, [fetchPlans]);\n\n return {\n plans,\n isLoading,\n error,\n refetch\n };\n}\n","/**\n * usePlansByMerchant Hook\n *\n * Fetch all plans created by a specific merchant address.\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport { useSubscrypts } from '../../context/SubscryptsContext';\nimport { getPlans, planAutoIncrement } from '../../contract';\nimport { validateAddress } from '../../utils/validators';\nimport type { Plan } from '../../types';\n\n/**\n * Hook return type\n */\nexport interface UsePlansByMerchantReturn {\n /** Plans created by the merchant */\n plans: Plan[];\n /** Total matching plans */\n total: number;\n /** Loading state */\n isLoading: boolean;\n /** Error if any */\n error: Error | null;\n /** Manually refresh data */\n refetch: () => Promise<void>;\n}\n\n/**\n * Fetch all plans created by a specific merchant address.\n *\n * Fetches all plans from the contract and filters client-side by merchantAddress.\n *\n * @param merchantAddress - Ethereum address of the merchant\n *\n * @example\n * ```tsx\n * const { plans, total, isLoading } = usePlansByMerchant('0x1234...');\n *\n * plans.forEach(plan => {\n * console.log(plan.description, plan.subscriberCount);\n * });\n * ```\n */\nexport function usePlansByMerchant(merchantAddress: string): UsePlansByMerchantReturn {\n const { provider } = useSubscrypts();\n\n const [plans, setPlans] = useState<Plan[]>([]);\n const [total, setTotal] = useState<number>(0);\n const [isLoading, setIsLoading] = useState<boolean>(true);\n const [error, setError] = useState<Error | null>(null);\n\n const fetchPlans = useCallback(async () => {\n try {\n validateAddress(merchantAddress);\n } catch (validationError) {\n setError(validationError as Error);\n setIsLoading(false);\n return;\n }\n\n if (!provider) {\n setError(new Error('Provider not initialized'));\n setIsLoading(false);\n return;\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n // Get total plan count\n const totalPlans = await planAutoIncrement(provider);\n const count = Number(totalPlans);\n\n if (count === 0) {\n setPlans([]);\n setTotal(0);\n setIsLoading(false);\n return;\n }\n\n // Fetch all plans (1-indexed)\n const [allPlans] = await getPlans(provider, 1n, BigInt(count));\n\n // Filter by merchant address (case-insensitive comparison)\n const merchantPlans = (allPlans as Plan[]).filter(\n (p) => p.merchantAddress.toLowerCase() === merchantAddress.toLowerCase()\n );\n\n setPlans(merchantPlans);\n setTotal(merchantPlans.length);\n setIsLoading(false);\n } catch (err) {\n setError(err as Error);\n setIsLoading(false);\n setPlans([]);\n }\n }, [provider, merchantAddress]);\n\n useEffect(() => {\n if (merchantAddress) {\n fetchPlans();\n }\n }, [fetchPlans, merchantAddress]);\n\n const refetch = useCallback(async () => {\n await fetchPlans();\n }, [fetchPlans]);\n\n return {\n plans,\n total,\n isLoading,\n error,\n refetch\n };\n}\n","/**\n * useSUBSPrice Hook\n *\n * Fetch the current SUBS token price in USD from the on-chain oracle.\n */\n\nimport { useState, useEffect, useCallback, useRef } from 'react';\nimport { useSubscrypts } from '../../context/SubscryptsContext';\nimport { convertTokenToOtherCurrency } from '../../contract';\nimport { DECIMALS } from '../../contract/config';\n\n/**\n * Hook return type\n */\nexport interface UseSUBSPriceReturn {\n /** Price of 1 SUBS in USD (null if not loaded) */\n priceUsd: number | null;\n /** Raw price from contract (null if not loaded) */\n rawPrice: bigint | null;\n /** Loading state */\n isLoading: boolean;\n /** Error if any */\n error: Error | null;\n /** Manually refresh price */\n refetch: () => Promise<void>;\n}\n\n/** 1 SUBS in 18-decimal format */\nconst ONE_SUBS = 10n ** BigInt(DECIMALS.SUBS);\n\n/** Default refresh interval: 60 seconds */\nconst DEFAULT_REFRESH_INTERVAL = 60_000;\n\n/**\n * Fetch the current SUBS/USD price from the on-chain oracle.\n *\n * Uses `convertTokenToOtherCurrency(1e18)` to get the USD value of 1 SUBS.\n * Auto-refreshes every 60 seconds.\n *\n * @param refreshInterval - Refresh interval in ms (default: 60000)\n *\n * @example\n * ```tsx\n * const { priceUsd, isLoading } = useSUBSPrice();\n *\n * if (priceUsd) {\n * console.log(`1 SUBS = $${priceUsd.toFixed(4)}`);\n * }\n * ```\n */\nexport function useSUBSPrice(refreshInterval: number = DEFAULT_REFRESH_INTERVAL): UseSUBSPriceReturn {\n const { provider } = useSubscrypts();\n\n const [priceUsd, setPriceUsd] = useState<number | null>(null);\n const [rawPrice, setRawPrice] = useState<bigint | null>(null);\n const [isLoading, setIsLoading] = useState<boolean>(true);\n const [error, setError] = useState<Error | null>(null);\n const intervalRef = useRef<ReturnType<typeof setInterval> | null>(null);\n\n const fetchPrice = useCallback(async () => {\n if (!provider) {\n setError(new Error('Provider not initialized'));\n setIsLoading(false);\n return;\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n // convertTokenToOtherCurrency returns the USD value for the given SUBS amount\n // The result has 18 decimals\n const result = await convertTokenToOtherCurrency(provider, ONE_SUBS);\n const raw = BigInt(result.toString());\n setRawPrice(raw);\n\n // Convert 18-decimal bigint to number\n const usdValue = Number(raw) / Number(ONE_SUBS);\n setPriceUsd(usdValue);\n setIsLoading(false);\n } catch (err) {\n setError(err as Error);\n setIsLoading(false);\n }\n }, [provider]);\n\n // Fetch on mount and set up refresh interval\n useEffect(() => {\n fetchPrice();\n\n if (refreshInterval > 0) {\n intervalRef.current = setInterval(fetchPrice, refreshInterval);\n }\n\n return () => {\n if (intervalRef.current) {\n clearInterval(intervalRef.current);\n }\n };\n }, [fetchPrice, refreshInterval]);\n\n const refetch = useCallback(async () => {\n await fetchPrice();\n }, [fetchPrice]);\n\n return {\n priceUsd,\n rawPrice,\n isLoading,\n error,\n refetch\n };\n}\n","/**\n * usePlanPrice Hook\n *\n * Comprehensive price information for a subscription plan,\n * including SUBS, USDC, and USD-equivalent prices.\n */\n\nimport { useState, useEffect, useCallback, useRef } from 'react';\nimport { useSubscrypts } from '../../context/SubscryptsContext';\nimport { getPlan, convertTokenToOtherCurrency, convertOtherCurrencyToToken } from '../../contract';\nimport { DECIMALS, DEX_QUOTER_ADDRESS, USDC_ADDRESS, DEFAULTS } from '../../contract/config';\nimport { DEX_QUOTER_ABI } from '../../contract/abis';\nimport { getSubscryptsContractAddress } from '../../constants';\nimport { formatSubs, formatUsdc } from '../../utils/formatters';\nimport { validatePlanId } from '../../utils/validators';\nimport { Contract } from 'ethers';\n\n/**\n * Comprehensive price information for a plan\n */\nexport interface PlanPriceInfo {\n /** Price in SUBS (18 decimals) */\n subsAmount: bigint;\n /** Formatted SUBS amount */\n subsFormatted: string;\n /** USDC equivalent (6 decimals), null if quote unavailable */\n usdcAmount: bigint | null;\n /** Formatted USDC amount, null if quote unavailable */\n usdcFormatted: string | null;\n /** USD display value, null if price unavailable */\n usdValue: number | null;\n /** Payment frequency label */\n frequency: string;\n /** Whether the plan is USD-denominated (currencyCode=1) */\n isUsdDenominated: boolean;\n}\n\n/**\n * Hook return type\n */\nexport interface UsePlanPriceReturn {\n /** Price information (null if not loaded) */\n price: PlanPriceInfo | null;\n /** Loading state */\n isLoading: boolean;\n /** Error if any */\n error: Error | null;\n /** Manually refresh price */\n refetch: () => Promise<void>;\n}\n\n/** 1 SUBS in 18-decimal format */\nconst ONE_SUBS = 10n ** BigInt(DECIMALS.SUBS);\n\n/** Default refresh interval: 60 seconds */\nconst DEFAULT_REFRESH_INTERVAL = 60_000;\n\n/**\n * Convert payment frequency (seconds) to human-readable label\n */\nfunction frequencyLabel(seconds: bigint): string {\n const secs = Number(seconds);\n if (secs <= 0) return 'One-time';\n if (secs <= 86400) return 'Daily';\n if (secs <= 604800) return 'Weekly';\n if (secs <= 1209600) return 'Bi-weekly';\n if (secs <= 2678400) return 'Monthly'; // ~31 days\n if (secs <= 7948800) return 'Quarterly'; // ~92 days\n if (secs <= 15897600) return 'Semi-annually'; // ~184 days\n if (secs <= 31536000) return 'Annually';\n return `Every ${Math.round(secs / 86400)} days`;\n}\n\n/**\n * Fetch comprehensive price information for a subscription plan.\n *\n * Resolves SUBS amount, USDC equivalent (via Uniswap), and USD value\n * for both SUBS-denominated and USD-denominated plans.\n *\n * @param planId - Plan ID to fetch pricing for\n * @param refreshInterval - Refresh interval in ms (default: 60000)\n *\n * @example\n * ```tsx\n * const { price, isLoading } = usePlanPrice('1');\n *\n * if (price) {\n * console.log(`${price.subsFormatted} SUBS / ${price.frequency}`);\n * if (price.usdValue) console.log(`≈ $${price.usdValue.toFixed(2)}`);\n * }\n * ```\n */\nexport function usePlanPrice(\n planId: string,\n refreshInterval: number = DEFAULT_REFRESH_INTERVAL\n): UsePlanPriceReturn {\n const { provider, wallet } = useSubscrypts();\n\n const [price, setPrice] = useState<PlanPriceInfo | null>(null);\n const [isLoading, setIsLoading] = useState<boolean>(true);\n const [error, setError] = useState<Error | null>(null);\n const intervalRef = useRef<ReturnType<typeof setInterval> | null>(null);\n\n const fetchPrice = useCallback(async () => {\n try {\n validatePlanId(planId);\n } catch (validationError) {\n setError(validationError as Error);\n setIsLoading(false);\n return;\n }\n\n if (!provider) {\n setError(new Error('Provider not initialized'));\n setIsLoading(false);\n return;\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n // Fetch plan data\n const plan = await getPlan(provider, BigInt(planId));\n const isUsdDenominated = Number(plan.currencyCode) === 1;\n const frequency = frequencyLabel(plan.paymentFrequency);\n\n let subsAmount: bigint;\n let usdValue: number | null = null;\n\n if (isUsdDenominated) {\n // USD-denominated plan: amount is in USD (18 decimals), convert to SUBS\n const conversion = await convertOtherCurrencyToToken(provider, plan.subscriptionAmount);\n subsAmount = BigInt(conversion.outputSUBS18?.toString() ?? conversion.toString());\n\n // USD value is the plan amount directly\n usdValue = Number(plan.subscriptionAmount) / Number(ONE_SUBS);\n } else {\n // SUBS-denominated plan: amount is in SUBS, convert to USD\n subsAmount = plan.subscriptionAmount;\n\n try {\n const usdRaw = await convertTokenToOtherCurrency(provider, subsAmount);\n usdValue = Number(BigInt(usdRaw.toString())) / Number(ONE_SUBS);\n } catch {\n // USD price unavailable - not critical\n usdValue = null;\n }\n }\n\n // Get USDC quote via Uniswap\n let usdcAmount: bigint | null = null;\n let usdcFormatted: string | null = null;\n\n try {\n const subscryptsAddress = getSubscryptsContractAddress(wallet.chainId ?? 42161);\n const quoter = new Contract(DEX_QUOTER_ADDRESS, DEX_QUOTER_ABI, provider);\n const quoteResult = await quoter.quoteExactOutputSingle.staticCall({\n tokenIn: USDC_ADDRESS,\n tokenOut: subscryptsAddress,\n amount: subsAmount,\n fee: DEFAULTS.UNISWAP_FEE_TIER,\n sqrtPriceLimitX96: 0n\n });\n const quotedUsdc: bigint = quoteResult[0];\n usdcAmount = quotedUsdc;\n usdcFormatted = formatUsdc(quotedUsdc);\n } catch {\n // USDC quote unavailable - not critical\n }\n\n setPrice({\n subsAmount,\n subsFormatted: formatSubs(subsAmount),\n usdcAmount,\n usdcFormatted,\n usdValue,\n frequency,\n isUsdDenominated\n });\n setIsLoading(false);\n } catch (err) {\n setError(err as Error);\n setIsLoading(false);\n setPrice(null);\n }\n }, [provider, wallet.chainId, planId]);\n\n // Fetch on mount and set up refresh interval\n useEffect(() => {\n if (planId) {\n fetchPrice();\n\n if (refreshInterval > 0) {\n intervalRef.current = setInterval(fetchPrice, refreshInterval);\n }\n }\n\n return () => {\n if (intervalRef.current) {\n clearInterval(intervalRef.current);\n }\n };\n }, [fetchPrice, planId, refreshInterval]);\n\n const refetch = useCallback(async () => {\n await fetchPrice();\n }, [fetchPrice]);\n\n return {\n price,\n isLoading,\n error,\n refetch\n };\n}\n","/**\n * useSubscryptsEvents Hook\n *\n * Subscribe to real-time Subscrypts protocol events.\n * Uses ethers.js contract.on() under the hood with automatic cleanup.\n */\n\nimport { useEffect, useState } from 'react';\nimport { useSubscrypts } from '../../context/SubscryptsContext';\n\n/**\n * Event callback types\n */\nexport interface SubscryptsEventCallbacks {\n /** Called when a new subscription is created */\n onSubscriptionCreated?: (event: {\n subscriptionId: bigint;\n planId: bigint;\n subscriber: string;\n referral: string;\n }) => void;\n\n /** Called when a subscription payment is made */\n onSubscriptionPaid?: (event: {\n subscriptionId: bigint;\n payer: string;\n amount: bigint;\n }) => void;\n\n /** Called when a subscription is stopped/cancelled */\n onSubscriptionStopped?: (event: {\n subscriptionId: bigint;\n subscriber: string;\n enabled: boolean;\n }) => void;\n}\n\n/**\n * Hook return type\n */\nexport interface UseSubscryptsEventsReturn {\n /** Whether event listeners are active */\n isListening: boolean;\n /** Error if any */\n error: Error | null;\n}\n\n/**\n * Subscribe to real-time Subscrypts protocol events.\n * Automatically cleans up listeners on unmount.\n *\n * @param callbacks - Event handlers\n *\n * @example\n * ```tsx\n * const { isListening } = useSubscryptsEvents({\n * onSubscriptionCreated: (event) => {\n * console.log('New subscription:', event.subscriptionId);\n * refetchDashboard();\n * },\n * onSubscriptionPaid: (event) => {\n * console.log('Payment made:', event.amount);\n * },\n * onSubscriptionStopped: (event) => {\n * console.log('Subscription stopped:', event.subscriptionId);\n * }\n * });\n * ```\n */\nexport function useSubscryptsEvents(\n callbacks: SubscryptsEventCallbacks\n): UseSubscryptsEventsReturn {\n const { subscryptsContract } = useSubscrypts();\n\n const [isListening, setIsListening] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n // Stable callback refs\n const { onSubscriptionCreated, onSubscriptionPaid, onSubscriptionStopped } = callbacks;\n\n /**\n * Set up event listeners\n */\n useEffect(() => {\n if (!subscryptsContract) {\n setIsListening(false);\n return;\n }\n\n try {\n // _subscriptionCreate event\n if (onSubscriptionCreated) {\n const handleCreate = (\n subscriptionId: bigint,\n planId: bigint,\n subscriber: string,\n referral: string\n ) => {\n onSubscriptionCreated({\n subscriptionId,\n planId,\n subscriber,\n referral\n });\n };\n\n subscryptsContract.on('_subscriptionCreate', handleCreate);\n }\n\n // _subscriptionPay event\n if (onSubscriptionPaid) {\n const handlePay = (\n subscriptionId: bigint,\n payer: string,\n amount: bigint\n ) => {\n onSubscriptionPaid({\n subscriptionId,\n payer,\n amount\n });\n };\n\n subscryptsContract.on('_subscriptionPay', handlePay);\n }\n\n // _subscriptionRecurring event (used for stop/cancel)\n if (onSubscriptionStopped) {\n const handleRecurring = (\n subscriptionId: bigint,\n subscriber: string,\n enabled: boolean\n ) => {\n onSubscriptionStopped({\n subscriptionId,\n subscriber,\n enabled\n });\n };\n\n subscryptsContract.on('_subscriptionRecurring', handleRecurring);\n }\n\n setIsListening(true);\n setError(null);\n } catch (err) {\n setError(err as Error);\n setIsListening(false);\n }\n\n /**\n * Cleanup: remove all listeners\n */\n return () => {\n if (subscryptsContract) {\n subscryptsContract.removeAllListeners('_subscriptionCreate');\n subscryptsContract.removeAllListeners('_subscriptionPay');\n subscryptsContract.removeAllListeners('_subscriptionRecurring');\n }\n setIsListening(false);\n };\n }, [subscryptsContract, onSubscriptionCreated, onSubscriptionPaid, onSubscriptionStopped]);\n\n return {\n isListening,\n error\n };\n}\n","/**\n * useMerchantPlans Hook\n *\n * Fetch all plans owned by the connected wallet (merchant).\n */\n\nimport { useSubscrypts } from '../../context/SubscryptsContext';\nimport { usePlansByMerchant, UsePlansByMerchantReturn } from '../plans/usePlansByMerchant';\n\n/**\n * Hook return type (re-exported from usePlansByMerchant)\n */\nexport type UseMerchantPlansReturn = UsePlansByMerchantReturn;\n\n/**\n * Fetch all plans owned by the connected wallet.\n *\n * This is a convenience wrapper around usePlansByMerchant that uses\n * the connected wallet address automatically.\n *\n * @example\n * ```tsx\n * const { plans, total, isLoading } = useMerchantPlans();\n *\n * return (\n * <div>\n * <h2>My Plans ({total})</h2>\n * {plans.map(plan => (\n * <div key={plan.id.toString()}>\n * {plan.description} - {plan.subscriberCount.toString()} subscribers\n * </div>\n * ))}\n * </div>\n * );\n * ```\n */\nexport function useMerchantPlans(): UseMerchantPlansReturn {\n const { wallet } = useSubscrypts();\n\n // Use wallet address or fallback to empty string (will error appropriately)\n const merchantAddress = wallet?.address || '';\n\n return usePlansByMerchant(merchantAddress);\n}\n","/**\n * Subscription Status Resolver\n *\n * Pure function for normalizing subscription states.\n * Usable by hooks, components, non-React code, and AI agents.\n */\n\nimport type { Subscription } from '../types';\n\n/**\n * Normalized subscription states\n */\nexport type SubscriptionState =\n | 'active'\n | 'expired'\n | 'expiring-soon'\n | 'cancelled'\n | 'not-found';\n\n/**\n * Input for resolving subscription status\n */\nexport interface ResolveStatusInput {\n /** The subscription to evaluate (null if none exists) */\n subscription: Subscription | null;\n /** Reference time for comparison (defaults to now) */\n now?: Date;\n}\n\n/**\n * Resolved subscription status with computed fields\n */\nexport interface ResolvedStatus {\n /** Normalized subscription state */\n state: SubscriptionState;\n /** Whether the subscription grants active access */\n isActive: boolean;\n /** Days until expiry (null if expired or not found) */\n daysUntilExpiry: number | null;\n /** Next payment date (null if not found) */\n nextPaymentDate: Date | null;\n /** Whether auto-renewal is enabled */\n isAutoRenewing: boolean;\n /** Remaining payment cycles */\n remainingCycles: number;\n}\n\n/** Threshold for \"expiring soon\" warning (3 days in milliseconds) */\nconst EXPIRING_SOON_THRESHOLD_MS = 3 * 24 * 60 * 60 * 1000;\n\n/**\n * Resolve the normalized status of a subscription.\n *\n * This is a pure function with no side effects or blockchain calls.\n * It can be used in React components, Node.js scripts, AI agents, etc.\n *\n * @example\n * ```typescript\n * const status = resolveSubscriptionStatus({ subscription });\n * if (status.state === 'expiring-soon') {\n * showRenewalReminder();\n * }\n * ```\n */\nexport function resolveSubscriptionStatus(input: ResolveStatusInput): ResolvedStatus {\n const { subscription, now = new Date() } = input;\n\n // No subscription found\n if (!subscription) {\n return {\n state: 'not-found',\n isActive: false,\n daysUntilExpiry: null,\n nextPaymentDate: null,\n isAutoRenewing: false,\n remainingCycles: 0\n };\n }\n\n const { nextPaymentDate, isAutoRenewing, remainingCycles } = subscription;\n\n // Subscription expired\n if (nextPaymentDate <= now) {\n return {\n state: 'expired',\n isActive: false,\n daysUntilExpiry: 0,\n nextPaymentDate,\n isAutoRenewing,\n remainingCycles\n };\n }\n\n // Cancelled (not auto-renewing and no remaining cycles)\n if (!isAutoRenewing && remainingCycles === 0) {\n const msUntilExpiry = nextPaymentDate.getTime() - now.getTime();\n const daysUntilExpiry = Math.ceil(msUntilExpiry / (24 * 60 * 60 * 1000));\n\n return {\n state: 'cancelled',\n isActive: true, // Still active until expiry\n daysUntilExpiry,\n nextPaymentDate,\n isAutoRenewing,\n remainingCycles\n };\n }\n\n // Calculate time until expiry\n const msUntilExpiry = nextPaymentDate.getTime() - now.getTime();\n const daysUntilExpiry = Math.ceil(msUntilExpiry / (24 * 60 * 60 * 1000));\n\n // Expiring soon (within 3 days)\n if (msUntilExpiry < EXPIRING_SOON_THRESHOLD_MS) {\n return {\n state: 'expiring-soon',\n isActive: true,\n daysUntilExpiry,\n nextPaymentDate,\n isAutoRenewing,\n remainingCycles\n };\n }\n\n // Active\n return {\n state: 'active',\n isActive: true,\n daysUntilExpiry,\n nextPaymentDate,\n isAutoRenewing,\n remainingCycles\n };\n}\n","/**\n * useMerchantSubscribers Hook\n *\n * Fetch paginated subscribers for a specific plan.\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport { useSubscrypts } from '../../context/SubscryptsContext';\nimport { Subscription } from '../../types';\nimport { getSubscriptionsByPlan } from '../../contract';\nimport { resolveSubscriptionStatus } from '../../utils/subscriptionStatus';\n\n/**\n * Hook return type\n */\nexport interface UseMerchantSubscribersReturn {\n /** Array of subscriptions for current page */\n subscribers: Subscription[];\n /** Total number of subscriptions */\n total: number;\n /** Number of active subscriptions */\n activeCount: number;\n /** Current page (1-indexed) */\n page: number;\n /** Number of subscriptions per page */\n pageSize: number;\n /** Whether there are more pages */\n hasMore: boolean;\n /** Loading state */\n isLoading: boolean;\n /** Error if any */\n error: Error | null;\n /** Go to next page */\n nextPage: () => void;\n /** Go to previous page */\n prevPage: () => void;\n /** Manually refresh subscriptions */\n refetch: () => Promise<void>;\n}\n\n/**\n * Fetch paginated subscribers for a specific plan\n *\n * @param planId - Plan ID to fetch subscribers for\n * @param pageSize - Number of subscriptions per page (default: 10)\n *\n * @example\n * ```tsx\n * const { subscribers, activeCount, total, page, hasMore, nextPage, prevPage, isLoading }\n * = useMerchantSubscribers('1');\n *\n * return (\n * <div>\n * <h3>{activeCount} active out of {total} total subscribers</h3>\n * {subscribers.map(sub => (\n * <SubscriptionCard key={sub.id} subscription={sub} />\n * ))}\n * <button onClick={prevPage} disabled={page === 1}>Previous</button>\n * <button onClick={nextPage} disabled={!hasMore}>Next</button>\n * </div>\n * );\n * ```\n */\nexport function useMerchantSubscribers(\n planId: string,\n pageSize: number = 10\n): UseMerchantSubscribersReturn {\n const { provider } = useSubscrypts();\n\n const [subscribers, setSubscribers] = useState<Subscription[]>([]);\n const [total, setTotal] = useState<number>(0);\n const [activeCount, setActiveCount] = useState<number>(0);\n const [page, setPage] = useState<number>(1);\n const [isLoading, setIsLoading] = useState<boolean>(true);\n const [error, setError] = useState<Error | null>(null);\n\n /**\n * Fetch subscriptions for current page from contract\n */\n const fetchSubscribers = useCallback(async () => {\n if (!planId) {\n setError(new Error('Plan ID is required'));\n setIsLoading(false);\n return;\n }\n\n if (!provider) {\n setError(new Error('Provider not initialized'));\n setIsLoading(false);\n return;\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n // Calculate 1-indexed start/end for contract call\n const start = BigInt((page - 1) * pageSize + 1);\n const end = BigInt(page * pageSize);\n\n // getSubscriptionsByPlan returns [subs[], startIdx, endIdx, totalLength]\n const result = await getSubscriptionsByPlan(provider, BigInt(planId), start, end);\n const [subs, , , totalLength] = result;\n\n setSubscribers(subs as Subscription[]);\n setTotal(Number(totalLength));\n\n // Calculate active count from current page\n // Note: This is a subset count, not total active. For total active,\n // we'd need to fetch all subscriptions, but that's expensive.\n const currentPageActive = (subs as Subscription[]).filter(sub => {\n const status = resolveSubscriptionStatus({ subscription: sub });\n return status.isActive;\n }).length;\n\n setActiveCount(currentPageActive);\n setIsLoading(false);\n } catch (err) {\n setError(err as Error);\n setIsLoading(false);\n setSubscribers([]);\n setTotal(0);\n setActiveCount(0);\n }\n }, [provider, planId, page, pageSize]);\n\n /**\n * Fetch on mount and when dependencies change\n */\n useEffect(() => {\n fetchSubscribers();\n }, [fetchSubscribers]);\n\n /**\n * Navigate to next page\n */\n const nextPage = useCallback(() => {\n if (page * pageSize < total) {\n setPage(prev => prev + 1);\n }\n }, [page, pageSize, total]);\n\n /**\n * Navigate to previous page\n */\n const prevPage = useCallback(() => {\n if (page > 1) {\n setPage(prev => prev - 1);\n }\n }, [page]);\n\n /**\n * Check if there are more pages\n */\n const hasMore = page * pageSize < total;\n\n /**\n * Refetch function for manual refresh\n */\n const refetch = useCallback(async () => {\n await fetchSubscribers();\n }, [fetchSubscribers]);\n\n return {\n subscribers,\n total,\n activeCount,\n page,\n pageSize,\n hasMore,\n isLoading,\n error,\n nextPage,\n prevPage,\n refetch\n };\n}\n","/**\n * useMerchantRevenue Hook\n *\n * Calculate Monthly Recurring Revenue (MRR) from active subscriptions.\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport { useSubscrypts } from '../../context/SubscryptsContext';\nimport { useMerchantPlans } from './useMerchantPlans';\nimport { useSUBSPrice } from '../pricing/useSUBSPrice';\nimport { getSubscriptionsByPlan } from '../../contract';\nimport { resolveSubscriptionStatus } from '../../utils/subscriptionStatus';\nimport { formatSubs } from '../../utils/formatters';\nimport type { Subscription } from '../../types';\n\n/**\n * Merchant revenue data\n */\nexport interface MerchantRevenueData {\n /** Total number of subscribers across all plans */\n totalSubscribers: number;\n /** Number of active subscribers */\n activeSubscribers: number;\n /** Monthly Recurring Revenue in SUBS (18 decimals) */\n monthlyRecurringRevenue: bigint;\n /** MRR formatted as SUBS string */\n mrrFormatted: string;\n /** MRR in USD (estimated using current SUBS price) */\n mrrUsdEstimate: number | null;\n}\n\n/**\n * Hook return type\n */\nexport interface UseMerchantRevenueReturn {\n /** Revenue data (null if loading or error) */\n revenue: MerchantRevenueData | null;\n /** Loading state */\n isLoading: boolean;\n /** Error if any */\n error: Error | null;\n /** Manually refresh revenue */\n refetch: () => Promise<void>;\n}\n\n/**\n * Calculate Monthly Recurring Revenue from active subscriptions.\n *\n * Fetches all subscriptions for the merchant's plans, filters for active ones,\n * and calculates MRR by normalizing all subscriptions to monthly amounts.\n *\n * @param planIds - Optional array of plan IDs to calculate revenue for (defaults to all merchant plans)\n *\n * @example\n * ```tsx\n * const { revenue, isLoading } = useMerchantRevenue();\n *\n * if (revenue) {\n * return (\n * <div>\n * <h2>Revenue Dashboard</h2>\n * <p>MRR: {revenue.mrrFormatted} SUBS</p>\n * <p>≈ ${revenue.mrrUsdEstimate?.toFixed(2)}</p>\n * <p>{revenue.activeSubscribers} / {revenue.totalSubscribers} active</p>\n * </div>\n * );\n * }\n * ```\n */\nexport function useMerchantRevenue(planIds?: string[]): UseMerchantRevenueReturn {\n const { provider } = useSubscrypts();\n const { plans, isLoading: plansLoading, error: plansError } = useMerchantPlans();\n const { priceUsd } = useSUBSPrice();\n\n const [revenue, setRevenue] = useState<MerchantRevenueData | null>(null);\n const [isLoading, setIsLoading] = useState<boolean>(true);\n const [error, setError] = useState<Error | null>(null);\n\n /**\n * Calculate MRR from subscriptions\n */\n const calculateRevenue = useCallback(async () => {\n if (plansError) {\n setError(plansError);\n setIsLoading(false);\n return;\n }\n\n if (plansLoading) {\n return;\n }\n\n if (!provider) {\n setError(new Error('Provider not initialized'));\n setIsLoading(false);\n return;\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n // Determine which plans to calculate revenue for\n const targetPlans = planIds\n ? plans.filter(p => planIds.includes(p.id.toString()))\n : plans;\n\n if (targetPlans.length === 0) {\n setRevenue({\n totalSubscribers: 0,\n activeSubscribers: 0,\n monthlyRecurringRevenue: 0n,\n mrrFormatted: '0.0000',\n mrrUsdEstimate: 0\n });\n setIsLoading(false);\n return;\n }\n\n // Fetch all subscriptions for all plans\n const allSubscriptionsPromises = targetPlans.map(async (plan) => {\n const planSubscriberCount = Number(plan.subscriberCount);\n if (planSubscriberCount === 0) {\n return [];\n }\n\n // Fetch all subscriptions for this plan (1-indexed)\n const [subs] = await getSubscriptionsByPlan(\n provider,\n plan.id,\n 1n,\n BigInt(planSubscriberCount)\n );\n return subs as Subscription[];\n });\n\n const subscriptionArrays = await Promise.all(allSubscriptionsPromises);\n const allSubscriptions = subscriptionArrays.flat();\n\n // Filter for active subscriptions\n const activeSubscriptions = allSubscriptions.filter(sub => {\n const status = resolveSubscriptionStatus({ subscription: sub });\n return status.isActive;\n });\n\n // Calculate MRR by normalizing all subscriptions to monthly amounts\n // Formula: (subscriptionAmount / paymentFrequency) * SECONDS_PER_MONTH\n const SECONDS_PER_MONTH = 2_592_000n; // 30 days\n\n let totalMrr = 0n;\n for (const sub of activeSubscriptions) {\n const amountPerSecond = sub.subscriptionAmount / sub.paymentFrequency;\n const monthlyAmount = amountPerSecond * SECONDS_PER_MONTH;\n totalMrr += monthlyAmount;\n }\n\n // Convert to USD if price available\n const mrrUsd = priceUsd\n ? Number(totalMrr) / 1e18 * priceUsd\n : null;\n\n setRevenue({\n totalSubscribers: allSubscriptions.length,\n activeSubscribers: activeSubscriptions.length,\n monthlyRecurringRevenue: totalMrr,\n mrrFormatted: formatSubs(totalMrr),\n mrrUsdEstimate: mrrUsd\n });\n\n setIsLoading(false);\n } catch (err) {\n setError(err as Error);\n setIsLoading(false);\n setRevenue(null);\n }\n }, [provider, plans, planIds, plansLoading, plansError, priceUsd]);\n\n /**\n * Calculate on mount and when dependencies change\n */\n useEffect(() => {\n calculateRevenue();\n }, [calculateRevenue]);\n\n /**\n * Refetch function for manual refresh\n */\n const refetch = useCallback(async () => {\n await calculateRevenue();\n }, [calculateRevenue]);\n\n return {\n revenue,\n isLoading,\n error,\n refetch\n };\n}\n","/**\n * Default loading spinner component\n */\n\nexport function LoadingSpinner() {\n return (\n <div className=\"subscrypts-flex subscrypts-items-center subscrypts-justify-center subscrypts-p-4\">\n <div\n className=\"subscrypts-animate-spin subscrypts-rounded-full subscrypts-h-8 subscrypts-w-8 subscrypts-border-b-2 subscrypts-border-brand-primary\"\n role=\"status\"\n aria-label=\"Loading\"\n >\n <span className=\"subscrypts-sr-only\">Loading...</span>\n </div>\n </div>\n );\n}\n","/**\n * SubscriptionGuard Component\n *\n * Protect routes and components based on subscription status.\n * Supports single-plan (planId) and multi-plan (planIds) gating.\n */\n\nimport { useEffect, useState, useCallback } from 'react';\nimport { useSubscriptionStatus } from '../../hooks/subscriptions/useSubscriptionStatus';\nimport { useSubscrypts } from '../../context/SubscryptsContext';\nimport { SubscriptionGuardProps } from '../../types';\nimport { getPlanSubscription, getSubscription } from '../../contract';\nimport { LoadingSpinner } from '../shared/LoadingSpinner';\n\n/**\n * Internal hook for multi-plan subscription checking.\n * Checks multiple plans and returns aggregate access state.\n */\nfunction useMultiPlanStatus(\n planIds: string[],\n requireAll: boolean\n) {\n const { subscryptsContract, wallet } = useSubscrypts();\n const [isActive, setIsActive] = useState(false);\n const [isLoading, setIsLoading] = useState(true);\n\n const checkPlans = useCallback(async () => {\n if (!subscryptsContract || !wallet.address || planIds.length === 0) {\n setIsActive(false);\n setIsLoading(false);\n return;\n }\n\n setIsLoading(true);\n\n try {\n // Use contract.runner for read operations\n const runner = subscryptsContract.runner;\n if (!runner) {\n setIsActive(false);\n setIsLoading(false);\n return;\n }\n\n const now = Math.floor(Date.now() / 1000);\n\n const results = await Promise.all(\n planIds.map(async (planId) => {\n try {\n // STEP 1: Get subscriptionId from plan/subscriber mapping\n const planSubscription = await getPlanSubscription(\n runner,\n BigInt(planId),\n wallet.address!\n );\n\n // Extract subscriptionId\n const subscriptionId = planSubscription?.id ?? 0n;\n\n if (subscriptionId === 0n || !planSubscription) {\n return false;\n }\n\n // STEP 2: Get FULL subscription data with authoritative nextPaymentDate\n const subscription = await getSubscription(runner, subscriptionId);\n\n if (!subscription) {\n return false;\n }\n\n // Check if active using REAL nextPaymentDate\n const nextPaymentDate = subscription.nextPaymentDate ?? 0n;\n return Number(nextPaymentDate) > now;\n } catch {\n return false;\n }\n })\n );\n\n const hasAccess = requireAll\n ? results.every((active) => active)\n : results.some((active) => active);\n\n setIsActive(hasAccess);\n } catch {\n setIsActive(false);\n } finally {\n setIsLoading(false);\n }\n }, [subscryptsContract, wallet.address, planIds, requireAll]);\n\n useEffect(() => {\n checkPlans();\n }, [checkPlans]);\n\n return { isActive, isLoading };\n}\n\n/**\n * Subscription Guard Component\n *\n * @example\n * ```tsx\n * // Single plan (backward compatible)\n * <SubscriptionGuard planId=\"1\" fallbackUrl=\"/subscribe\">\n * <PremiumContent />\n * </SubscriptionGuard>\n *\n * // Multi-plan: any of these plans grants access\n * <SubscriptionGuard planIds={['1', '2', '3']}>\n * <PremiumContent />\n * </SubscriptionGuard>\n *\n * // Multi-plan: require ALL plans\n * <SubscriptionGuard planIds={['1', '2']} requireAll>\n * <BundleContent />\n * </SubscriptionGuard>\n * ```\n */\nexport function SubscriptionGuard({\n planId,\n planIds,\n requireAll = false,\n fallbackUrl,\n loadingComponent,\n children,\n onAccessDenied\n}: SubscriptionGuardProps) {\n // Determine which mode: single plan or multi-plan\n const effectivePlanIds = planIds || (planId ? [planId] : []);\n const isSinglePlan = !planIds && !!planId;\n\n // Single plan mode: use the existing hook for backward compatibility\n const singlePlan = useSubscriptionStatus(isSinglePlan ? planId! : '0');\n\n // Multi-plan mode: use internal multi-plan hook\n const multiPlan = useMultiPlanStatus(\n isSinglePlan ? [] : effectivePlanIds,\n requireAll\n );\n\n // Resolve loading and access state based on mode\n const isLoading = isSinglePlan ? singlePlan.isLoading : multiPlan.isLoading;\n const hasAccess = isSinglePlan\n ? !!singlePlan.status?.isActive\n : multiPlan.isActive;\n\n /**\n * Handle access denial\n */\n useEffect(() => {\n if (!isLoading && !hasAccess) {\n if (onAccessDenied) {\n onAccessDenied();\n }\n\n if (fallbackUrl) {\n window.location.href = fallbackUrl;\n }\n }\n }, [isLoading, hasAccess, fallbackUrl, onAccessDenied]);\n\n // Show loading state\n if (isLoading) {\n return <>{loadingComponent || <LoadingSpinner />}</>;\n }\n\n // Block access if subscription is not active\n if (!hasAccess) {\n return null;\n }\n\n // Render protected content\n return <>{children}</>;\n}\n","/**\n * Modal Component\n */\n\nimport { useEffect } from 'react';\n\nexport interface ModalProps {\n isOpen: boolean;\n onClose: () => void;\n title?: string;\n children: React.ReactNode;\n size?: 'sm' | 'md' | 'lg';\n}\n\nexport function Modal({ isOpen, onClose, title, children, size = 'md' }: ModalProps) {\n // Close on escape key\n useEffect(() => {\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && isOpen) {\n onClose();\n }\n };\n\n document.addEventListener('keydown', handleEscape);\n return () => document.removeEventListener('keydown', handleEscape);\n }, [isOpen, onClose]);\n\n // Prevent body scroll when modal is open\n useEffect(() => {\n if (isOpen) {\n document.body.style.overflow = 'hidden';\n } else {\n document.body.style.overflow = 'unset';\n }\n\n return () => {\n document.body.style.overflow = 'unset';\n };\n }, [isOpen]);\n\n if (!isOpen) return null;\n\n const sizeClasses = {\n sm: 'subscrypts-max-w-md',\n md: 'subscrypts-max-w-lg',\n lg: 'subscrypts-max-w-2xl'\n };\n\n return (\n <div className=\"subscrypts-modal-overlay\" onClick={onClose}>\n <div\n className={`subscrypts-modal-content ${sizeClasses[size]}`}\n onClick={(e) => e.stopPropagation()}\n >\n {title && (\n <div className=\"subscrypts-modal-header\">\n <h2 className=\"subscrypts-modal-title\">{title}</h2>\n <button\n onClick={onClose}\n className=\"subscrypts-modal-close\"\n aria-label=\"Close modal\"\n >\n ×\n </button>\n </div>\n )}\n <div className=\"subscrypts-modal-body\">{children}</div>\n </div>\n </div>\n );\n}\n","/**\n * Configuration Step Component\n */\n\nimport { PaymentMethod } from '../../types';\nimport { useTokenBalance } from '../../hooks/tokens/useTokenBalance';\n\ninterface ConfigurationStepProps {\n cycleLimit: number;\n onCycleLimitChange: (value: number) => void;\n autoRenew: boolean;\n onAutoRenewChange: (value: boolean) => void;\n paymentMethod: PaymentMethod;\n onPaymentMethodChange: (value: PaymentMethod) => void;\n onNext: () => void;\n onCancel: () => void;\n}\n\nexport function ConfigurationStep({\n cycleLimit,\n onCycleLimitChange,\n autoRenew,\n onAutoRenewChange,\n paymentMethod,\n onPaymentMethodChange,\n onNext,\n onCancel\n}: ConfigurationStepProps) {\n const { formatted: subsBalance } = useTokenBalance('SUBS');\n const { formatted: usdcBalance } = useTokenBalance('USDC');\n\n const cycleLimitOptions = [12, 24, 36];\n\n return (\n <div className=\"subscrypts-config-step\">\n {/* Cycle Limit Selector */}\n <div className=\"subscrypts-form-group\">\n <label className=\"subscrypts-label\">Cycle Limit</label>\n <div className=\"subscrypts-cycle-options\">\n {cycleLimitOptions.map((option) => (\n <button\n key={option}\n onClick={() => onCycleLimitChange(option)}\n className={`subscrypts-cycle-option ${\n cycleLimit === option ? 'subscrypts-cycle-option-active' : ''\n }`}\n >\n {option} cycles\n </button>\n ))}\n </div>\n <input\n type=\"number\"\n value={cycleLimit}\n onChange={(e) => onCycleLimitChange(Number(e.target.value))}\n min={1}\n max={1000}\n className=\"subscrypts-input subscrypts-mt-2\"\n placeholder=\"Custom cycles\"\n />\n </div>\n\n {/* Auto-Renewal Toggle */}\n <div className=\"subscrypts-form-group\">\n <label className=\"subscrypts-label subscrypts-flex subscrypts-items-center\">\n <input\n type=\"checkbox\"\n checked={autoRenew}\n onChange={(e) => onAutoRenewChange(e.target.checked)}\n className=\"subscrypts-checkbox\"\n />\n <span className=\"subscrypts-ml-2\">Enable Auto-Renewal</span>\n </label>\n <p className=\"subscrypts-text-sm subscrypts-text-secondary\">\n Automatically renew subscription when it expires\n </p>\n </div>\n\n {/* Payment Method Selection */}\n <div className=\"subscrypts-form-group\">\n <label className=\"subscrypts-label\">Payment Method</label>\n <div className=\"subscrypts-payment-methods\">\n <button\n onClick={() => onPaymentMethodChange('SUBS')}\n className={`subscrypts-payment-card ${\n paymentMethod === 'SUBS' ? 'subscrypts-payment-card-active' : ''\n }`}\n >\n <div className=\"subscrypts-payment-card-header\">\n <span className=\"subscrypts-payment-card-title\">Pay with SUBS</span>\n </div>\n <div className=\"subscrypts-payment-card-balance\">\n Balance: {subsBalance} SUBS\n </div>\n </button>\n\n <button\n onClick={() => onPaymentMethodChange('USDC')}\n className={`subscrypts-payment-card ${\n paymentMethod === 'USDC' ? 'subscrypts-payment-card-active' : ''\n }`}\n >\n <div className=\"subscrypts-payment-card-header\">\n <span className=\"subscrypts-payment-card-title\">Pay with USDC</span>\n <span className=\"subscrypts-badge\">Auto-Swap</span>\n </div>\n <div className=\"subscrypts-payment-card-balance\">\n Balance: {usdcBalance} USDC\n </div>\n </button>\n </div>\n </div>\n\n {/* Actions */}\n <div className=\"subscrypts-form-actions\">\n <button\n onClick={onCancel}\n className=\"subscrypts-btn subscrypts-btn-outline subscrypts-btn-md\"\n >\n Cancel\n </button>\n <button\n onClick={onNext}\n className=\"subscrypts-btn subscrypts-btn-primary subscrypts-btn-md\"\n >\n Next\n </button>\n </div>\n </div>\n );\n}\n","/**\n * Error message mapping for human-readable blockchain errors.\n *\n * Maps ethers.js error codes and common blockchain errors\n * to user-friendly messages with actionable suggestions.\n */\n\n/**\n * Configuration for a user-facing error message\n */\nexport interface ErrorMessageConfig {\n /** Short error title */\n title: string;\n /** User-friendly error description */\n message: string;\n /** Actionable suggestion for the user */\n suggestion: string;\n /** Whether the user can retry this operation */\n isRetryable: boolean;\n}\n\n/**\n * Map of known error codes to user-friendly messages.\n * Covers ethers.js v6 error codes and common contract revert reasons.\n */\nexport const ERROR_CODE_MAP: Record<string, ErrorMessageConfig> = {\n // ethers.js v6 error codes\n ACTION_REJECTED: {\n title: 'Transaction Rejected',\n message: 'You rejected the transaction in your wallet.',\n suggestion: 'Click retry if you would like to try again.',\n isRetryable: true\n },\n INSUFFICIENT_FUNDS: {\n title: 'Insufficient Gas',\n message: 'You do not have enough ETH to pay for network fees.',\n suggestion: 'Add ETH to your wallet on Arbitrum to cover gas fees.',\n isRetryable: false\n },\n CALL_EXCEPTION: {\n title: 'Contract Error',\n message: 'The smart contract returned an error.',\n suggestion: 'The plan may no longer be available, or your subscription may already exist.',\n isRetryable: true\n },\n NETWORK_ERROR: {\n title: 'Network Error',\n message: 'Could not connect to the Arbitrum network.',\n suggestion: 'Check your internet connection and try again.',\n isRetryable: true\n },\n TIMEOUT: {\n title: 'Request Timeout',\n message: 'The request took too long to complete.',\n suggestion: 'The network may be congested. Please try again.',\n isRetryable: true\n },\n UNPREDICTABLE_GAS_LIMIT: {\n title: 'Transaction Would Fail',\n message: 'This transaction would likely fail if submitted.',\n suggestion: 'Check that you have sufficient token balance and allowance.',\n isRetryable: false\n },\n NONCE_EXPIRED: {\n title: 'Transaction Outdated',\n message: 'The transaction nonce has expired.',\n suggestion: 'Please try the transaction again.',\n isRetryable: true\n },\n REPLACEMENT_UNDERPRICED: {\n title: 'Gas Price Too Low',\n message: 'The replacement transaction gas price is too low.',\n suggestion: 'Wait for the pending transaction to complete, then try again.',\n isRetryable: true\n },\n SERVER_ERROR: {\n title: 'Server Error',\n message: 'The RPC server returned an error.',\n suggestion: 'The network may be experiencing issues. Please try again later.',\n isRetryable: true\n },\n\n // SDK-specific error codes\n WALLET_ERROR: {\n title: 'Wallet Error',\n message: 'There was a problem with your wallet connection.',\n suggestion: 'Try disconnecting and reconnecting your wallet.',\n isRetryable: true\n },\n NETWORK_MISMATCH: {\n title: 'Wrong Network',\n message: 'Your wallet is connected to the wrong network.',\n suggestion: 'Please switch to Arbitrum One in your wallet.',\n isRetryable: true\n },\n INSUFFICIENT_BALANCE: {\n title: 'Insufficient Balance',\n message: 'You do not have enough tokens to complete this transaction.',\n suggestion: 'Add more tokens to your wallet before trying again.',\n isRetryable: false\n },\n TRANSACTION_ERROR: {\n title: 'Transaction Failed',\n message: 'The transaction failed to execute.',\n suggestion: 'Please try again. If the issue persists, the contract conditions may have changed.',\n isRetryable: true\n },\n VALIDATION_ERROR: {\n title: 'Invalid Input',\n message: 'The provided input is invalid.',\n suggestion: 'Please check your input values and try again.',\n isRetryable: false\n },\n SANCTIONS_ERROR: {\n title: 'Address Sanctioned',\n message: 'This wallet address is sanctioned and cannot be used for subscriptions.',\n suggestion: 'This address has been flagged by compliance systems. Contact support if you believe this is an error.',\n isRetryable: false\n }\n};\n\n/** Default error message for unknown errors */\nconst DEFAULT_ERROR: ErrorMessageConfig = {\n title: 'Something Went Wrong',\n message: 'An unexpected error occurred.',\n suggestion: 'Please try again. If the issue persists, check your wallet and network connection.',\n isRetryable: true\n};\n\n/**\n * Extract the error code from an unknown error object.\n * Handles ethers.js errors, SubscryptsError, and generic errors.\n */\nexport function getErrorCode(error: unknown): string {\n if (!error) return 'UNKNOWN';\n\n // ethers.js v6 errors have a `code` property\n if (typeof error === 'object' && error !== null) {\n const err = error as Record<string, unknown>;\n\n // Direct code property (ethers.js, SubscryptsError)\n if (typeof err.code === 'string') {\n return err.code;\n }\n\n // Check nested error info (ethers.js v6 wraps errors)\n if (err.info && typeof err.info === 'object') {\n const info = err.info as Record<string, unknown>;\n if (info.error && typeof info.error === 'object') {\n const innerError = info.error as Record<string, unknown>;\n if (typeof innerError.code === 'string') {\n return innerError.code;\n }\n }\n }\n\n // Check error message for known patterns\n const message = typeof err.message === 'string' ? err.message.toLowerCase() : '';\n if (message.includes('user rejected') || message.includes('user denied')) {\n return 'ACTION_REJECTED';\n }\n if (message.includes('insufficient funds')) {\n return 'INSUFFICIENT_FUNDS';\n }\n if (message.includes('network') || message.includes('could not detect')) {\n return 'NETWORK_ERROR';\n }\n if (message.includes('timeout') || message.includes('timed out')) {\n return 'TIMEOUT';\n }\n if (message.includes('nonce')) {\n return 'NONCE_EXPIRED';\n }\n }\n\n return 'UNKNOWN';\n}\n\n/**\n * Get a user-friendly error message for any error.\n *\n * @example\n * ```typescript\n * try {\n * await subscribe({ planId: '1', ... });\n * } catch (err) {\n * const { title, message, suggestion, isRetryable } = getErrorMessage(err);\n * // Display to user\n * }\n * ```\n */\nexport function getErrorMessage(error: unknown): ErrorMessageConfig {\n const code = getErrorCode(error);\n return ERROR_CODE_MAP[code] || DEFAULT_ERROR;\n}\n","/**\n * ErrorDisplay Component\n *\n * Context-aware error display with human-readable messages\n * and optional retry/dismiss actions.\n */\n\nimport { getErrorMessage } from '../../utils/errorMessages';\n\nexport interface ErrorDisplayProps {\n /** The error to display */\n error: Error | null;\n /** Callback for retry action (only shown if error is retryable) */\n onRetry?: () => void;\n /** Callback for dismiss action */\n onDismiss?: () => void;\n /** Compact mode for inline display */\n compact?: boolean;\n /** Additional CSS class name */\n className?: string;\n}\n\n/**\n * ErrorDisplay Component\n *\n * Automatically maps blockchain errors to user-friendly messages.\n *\n * @example\n * ```tsx\n * <ErrorDisplay\n * error={error}\n * onRetry={() => subscribe(params)}\n * onDismiss={() => setError(null)}\n * />\n * ```\n */\nexport function ErrorDisplay({\n error,\n onRetry,\n onDismiss,\n compact = false,\n className = ''\n}: ErrorDisplayProps) {\n if (!error) return null;\n\n const { title, message, suggestion, isRetryable } = getErrorMessage(error);\n\n if (compact) {\n return (\n <div className={`subscrypts-error-display subscrypts-error-display-compact ${className}`}>\n <div className=\"subscrypts-error-display-content\">\n <p className=\"subscrypts-error-display-message\">\n <strong>{title}:</strong> {message}\n </p>\n {isRetryable && onRetry && (\n <button\n onClick={onRetry}\n className=\"subscrypts-btn subscrypts-btn-outline subscrypts-btn-sm\"\n >\n Retry\n </button>\n )}\n </div>\n </div>\n );\n }\n\n return (\n <div className={`subscrypts-error-display ${className}`}>\n <div className=\"subscrypts-error-display-icon\">✕</div>\n <h3 className=\"subscrypts-error-display-title\">{title}</h3>\n <p className=\"subscrypts-error-display-message\">{message}</p>\n <p className=\"subscrypts-error-display-suggestion\">{suggestion}</p>\n\n <div className=\"subscrypts-error-display-actions\">\n {onDismiss && (\n <button\n onClick={onDismiss}\n className=\"subscrypts-btn subscrypts-btn-outline subscrypts-btn-sm\"\n >\n Dismiss\n </button>\n )}\n {isRetryable && onRetry && (\n <button\n onClick={onRetry}\n className=\"subscrypts-btn subscrypts-btn-primary subscrypts-btn-sm\"\n >\n Try Again\n </button>\n )}\n </div>\n </div>\n );\n}\n","/**\n * Transaction Step Component\n */\n\nimport { PaymentMethod } from '../../types';\nimport { LoadingSpinner } from '../shared/LoadingSpinner';\nimport { ErrorDisplay } from '../shared/ErrorDisplay';\n\ninterface TransactionStepProps {\n paymentMethod: PaymentMethod;\n txState: 'idle' | 'approving' | 'waiting_approval' | 'subscribing' | 'waiting_subscribe' | 'success' | 'error';\n error: Error | null;\n subscriptionId: string | null;\n txHash: string | null;\n onExecute: () => void;\n onClose: () => void;\n onBack: () => void;\n}\n\nexport function TransactionStep({\n paymentMethod,\n txState,\n error,\n subscriptionId,\n txHash,\n onExecute,\n onClose,\n onBack\n}: TransactionStepProps) {\n const getStateMessage = () => {\n switch (txState) {\n case 'idle':\n return 'Ready to subscribe';\n case 'approving':\n return `Approving ${paymentMethod}...`;\n case 'waiting_approval':\n return 'Waiting for wallet confirmation...';\n case 'subscribing':\n return 'Creating subscription...';\n case 'waiting_subscribe':\n return 'Waiting for wallet confirmation...';\n case 'success':\n return 'Subscription created successfully!';\n case 'error':\n return 'Transaction failed';\n default:\n return 'Processing...';\n }\n };\n\n const isProcessing = ['approving', 'waiting_approval', 'subscribing', 'waiting_subscribe'].includes(txState);\n const isSuccess = txState === 'success';\n const isError = txState === 'error';\n\n return (\n <div className=\"subscrypts-transaction-step\">\n {/* Status Display */}\n <div className=\"subscrypts-transaction-status\">\n {isProcessing && <LoadingSpinner />}\n\n {isSuccess && (\n <div className=\"subscrypts-success-icon\">✓</div>\n )}\n\n {isError && (\n <div className=\"subscrypts-error-icon\">✕</div>\n )}\n\n <p className=\"subscrypts-transaction-message\">{getStateMessage()}</p>\n\n {error && (\n <ErrorDisplay\n error={error}\n compact={true}\n onRetry={isError ? onExecute : undefined}\n />\n )}\n\n {subscriptionId && (\n <div className=\"subscrypts-info-box\">\n <p className=\"subscrypts-info-label\">Subscription ID</p>\n <p className=\"subscrypts-info-value\">{subscriptionId}</p>\n </div>\n )}\n\n {txHash && (\n <a\n href={`https://arbiscan.io/tx/${txHash}`}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"subscrypts-link subscrypts-arbiscan-link\"\n >\n View on Arbiscan →\n </a>\n )}\n </div>\n\n {/* Actions */}\n <div className=\"subscrypts-form-actions\">\n {txState === 'idle' && (\n <>\n <button\n onClick={onBack}\n className=\"subscrypts-btn subscrypts-btn-outline subscrypts-btn-md\"\n >\n Back\n </button>\n <button\n onClick={onExecute}\n className=\"subscrypts-btn subscrypts-btn-primary subscrypts-btn-md\"\n >\n Subscribe\n </button>\n </>\n )}\n\n {isError && (\n <>\n <button\n onClick={onBack}\n className=\"subscrypts-btn subscrypts-btn-outline subscrypts-btn-md\"\n >\n Back\n </button>\n <button\n onClick={onExecute}\n className=\"subscrypts-btn subscrypts-btn-primary subscrypts-btn-md\"\n >\n Retry\n </button>\n </>\n )}\n\n {isSuccess && (\n <button\n onClick={onClose}\n className=\"subscrypts-btn subscrypts-btn-primary subscrypts-btn-md subscrypts-w-full\"\n >\n Close\n </button>\n )}\n\n {isProcessing && (\n <p className=\"subscrypts-text-sm subscrypts-text-secondary subscrypts-text-center\">\n Please confirm the transaction in your wallet\n </p>\n )}\n </div>\n </div>\n );\n}\n","/**\n * CheckoutWizard Component\n *\n * Multi-step subscription checkout flow\n */\n\nimport { useState } from 'react';\nimport { CheckoutWizardProps, PaymentMethod } from '../../types';\nimport { Modal } from '../shared/Modal';\nimport { ConfigurationStep } from './ConfigurationStep';\nimport { TransactionStep } from './TransactionStep';\nimport { useSubscribe } from '../../hooks/subscriptions/useSubscribe';\n\n/**\n * Checkout Wizard Component\n *\n * @example\n * ```tsx\n * const [isOpen, setIsOpen] = useState(false);\n *\n * <CheckoutWizard\n * planId=\"1\"\n * isOpen={isOpen}\n * onClose={() => setIsOpen(false)}\n * onSuccess={(subId) => {\n * console.log('Subscribed!', subId);\n * setIsOpen(false);\n * }}\n * />\n * ```\n */\nexport function CheckoutWizard({\n planId,\n isOpen,\n onClose,\n referralAddress,\n onSuccess,\n onError\n}: CheckoutWizardProps) {\n const [currentStep, setCurrentStep] = useState<'configuration' | 'transaction' | 'success'>('configuration');\n\n // Configuration state\n const [cycleLimit, setCycleLimit] = useState(12);\n const [autoRenew, setAutoRenew] = useState(false);\n const [paymentMethod, setPaymentMethod] = useState<PaymentMethod>('SUBS');\n\n const { subscribe, txState, error, subscriptionId, txHash } = useSubscribe();\n\n const handleConfigure = () => {\n setCurrentStep('transaction');\n };\n\n const handleSubscribe = async () => {\n try {\n const subId = await subscribe({\n planId,\n cycleLimit,\n autoRenew,\n paymentMethod,\n referralAddress\n });\n\n setCurrentStep('success');\n\n if (onSuccess) {\n onSuccess(subId);\n }\n } catch (err) {\n if (onError) {\n onError(err as Error);\n }\n }\n };\n\n const handleClose = () => {\n // Reset state when closing\n setCurrentStep('configuration');\n setCycleLimit(12);\n setAutoRenew(false);\n setPaymentMethod('SUBS');\n onClose();\n };\n\n return (\n <Modal\n isOpen={isOpen}\n onClose={handleClose}\n title={`Subscribe to Plan ${planId}`}\n size=\"md\"\n >\n {currentStep === 'configuration' && (\n <ConfigurationStep\n cycleLimit={cycleLimit}\n onCycleLimitChange={setCycleLimit}\n autoRenew={autoRenew}\n onAutoRenewChange={setAutoRenew}\n paymentMethod={paymentMethod}\n onPaymentMethodChange={setPaymentMethod}\n onNext={handleConfigure}\n onCancel={handleClose}\n />\n )}\n\n {currentStep === 'transaction' && (\n <TransactionStep\n paymentMethod={paymentMethod}\n txState={txState}\n error={error}\n subscriptionId={subscriptionId}\n txHash={txHash}\n onExecute={handleSubscribe}\n onClose={handleClose}\n onBack={() => setCurrentStep('configuration')}\n />\n )}\n\n {currentStep === 'success' && (\n <div className=\"subscrypts-checkout-success\">\n <div className=\"subscrypts-success-icon\">✓</div>\n <h3 className=\"subscrypts-success-title\">Subscription Created!</h3>\n <p className=\"subscrypts-success-message\">\n Your subscription has been successfully created.\n </p>\n {subscriptionId && (\n <p className=\"subscrypts-success-id\">\n Subscription ID: {subscriptionId}\n </p>\n )}\n {txHash && (\n <a\n href={`https://arbiscan.io/tx/${txHash}`}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"subscrypts-link subscrypts-arbiscan-link\"\n >\n View on Arbiscan →\n </a>\n )}\n <button\n onClick={handleClose}\n className=\"subscrypts-btn subscrypts-btn-primary subscrypts-btn-md\"\n >\n Close\n </button>\n </div>\n )}\n </Modal>\n );\n}\n","/**\n * SubscryptsButton Component\n *\n * Simple subscribe button with built-in checkout modal\n */\n\nimport { useState } from 'react';\nimport { SubscryptsButtonProps } from '../../types';\nimport { useWallet } from '../../hooks/wallet/useWallet';\nimport { CheckoutWizard } from '../checkout/CheckoutWizard';\n\n/**\n * Subscrypts Button Component\n *\n * @example\n * ```tsx\n * <SubscryptsButton\n * planId=\"1\"\n * variant=\"primary\"\n * size=\"lg\"\n * onSuccess={(subId) => navigate('/dashboard')}\n * >\n * Subscribe Now\n * </SubscryptsButton>\n * ```\n */\nexport function SubscryptsButton({\n planId,\n variant = 'primary',\n size = 'md',\n children,\n referralAddress,\n onSuccess\n}: SubscryptsButtonProps) {\n const [isModalOpen, setIsModalOpen] = useState(false);\n const { isConnected, connect } = useWallet();\n\n const handleClick = () => {\n if (!isConnected && connect) {\n connect();\n } else {\n setIsModalOpen(true);\n }\n };\n\n const handleSuccess = (subscriptionId: string) => {\n setIsModalOpen(false);\n if (onSuccess) {\n onSuccess(subscriptionId);\n }\n };\n\n return (\n <>\n <button\n onClick={handleClick}\n className={`subscrypts-btn subscrypts-btn-${variant} subscrypts-btn-${size}`}\n >\n {children || 'Subscribe'}\n </button>\n\n <CheckoutWizard\n planId={planId}\n isOpen={isModalOpen}\n onClose={() => setIsModalOpen(false)}\n referralAddress={referralAddress}\n onSuccess={handleSuccess}\n />\n </>\n );\n}\n","/**\n * PlanCard Component\n *\n * Displays a subscription plan with configurable fields and subscribe button.\n */\n\nimport { Plan } from '../../types';\nimport { DECIMALS } from '../../contract';\n\n/**\n * Available fields that can be displayed on the plan card\n */\nexport type PlanField =\n | 'description'\n | 'amount'\n | 'frequency'\n | 'subscribers'\n | 'merchant'\n | 'referralBonus'\n | 'attributes';\n\n/**\n * PlanCard props\n */\nexport interface PlanCardProps {\n /** Plan data from smart contract */\n plan: Plan;\n /** Currency to display prices in (default: 'SUBS') */\n currency?: 'SUBS' | 'USDC';\n /** Fields to display on the card (default: description, amount, frequency) */\n showFields?: PlanField[];\n /** Callback when subscribe button is clicked */\n onSubscribe?: (planId: string) => void;\n /** Custom label for subscribe button */\n subscribeLabel?: string;\n /** Additional CSS class name */\n className?: string;\n /** Whether to show the subscribe button (default: true) */\n showSubscribeButton?: boolean;\n /** Whether the plan card is highlighted/featured */\n featured?: boolean;\n /** Custom header/title for the card */\n title?: string;\n}\n\n/**\n * Format payment frequency in human-readable text\n */\nfunction formatFrequency(frequency: bigint): string {\n const seconds = Number(frequency);\n const days = seconds / 86400;\n\n if (days === 1) return 'Daily';\n if (days === 7) return 'Weekly';\n if (days === 14) return 'Bi-weekly';\n if (days >= 28 && days <= 31) return 'Monthly';\n if (days >= 89 && days <= 92) return 'Quarterly';\n if (days >= 365 && days <= 366) return 'Yearly';\n\n return `Every ${days} days`;\n}\n\n/**\n * Format amount with proper decimals\n */\nfunction formatAmount(amount: bigint, decimals: number): string {\n const divisor = BigInt(10 ** decimals);\n const whole = amount / divisor;\n const fraction = amount % divisor;\n\n if (fraction === 0n) {\n return whole.toString();\n }\n\n const fractionStr = fraction.toString().padStart(decimals, '0').replace(/0+$/, '');\n return `${whole}.${fractionStr}`;\n}\n\n/**\n * PlanCard Component\n *\n * @example\n * ```tsx\n * <PlanCard\n * plan={plan}\n * currency=\"SUBS\"\n * showFields={['description', 'amount', 'frequency', 'subscribers']}\n * onSubscribe={(planId) => openCheckout(planId)}\n * subscribeLabel=\"Get Started\"\n * />\n * ```\n */\nexport function PlanCard({\n plan,\n currency = 'SUBS',\n showFields = ['description', 'amount', 'frequency'],\n onSubscribe,\n subscribeLabel = 'Subscribe',\n className = '',\n showSubscribeButton = true,\n featured = false,\n title\n}: PlanCardProps) {\n const decimals = currency === 'SUBS' ? DECIMALS.SUBS : DECIMALS.USDC;\n const formattedAmount = formatAmount(plan.subscriptionAmount, decimals);\n const formattedFrequency = formatFrequency(plan.paymentFrequency);\n\n const handleSubscribe = () => {\n if (onSubscribe) {\n onSubscribe(plan.id.toString());\n }\n };\n\n const cardClasses = [\n 'subscrypts-plan-card',\n featured ? 'subscrypts-plan-card-featured' : '',\n className\n ].filter(Boolean).join(' ');\n\n return (\n <div className={cardClasses}>\n {/* Header */}\n <div className=\"subscrypts-plan-card-header\">\n {title && <h3 className=\"subscrypts-plan-card-title\">{title}</h3>}\n {!title && plan.description && (\n <h3 className=\"subscrypts-plan-card-title\">{plan.description}</h3>\n )}\n {featured && <span className=\"subscrypts-plan-card-badge\">Featured</span>}\n </div>\n\n {/* Price */}\n {showFields.includes('amount') && (\n <div className=\"subscrypts-plan-card-price\">\n <span className=\"subscrypts-plan-card-amount\">{formattedAmount}</span>\n <span className=\"subscrypts-plan-card-currency\">{currency}</span>\n {showFields.includes('frequency') && (\n <span className=\"subscrypts-plan-card-frequency\">/ {formattedFrequency}</span>\n )}\n </div>\n )}\n\n {/* Details */}\n <div className=\"subscrypts-plan-card-details\">\n {showFields.includes('description') && plan.description && !title && (\n <p className=\"subscrypts-plan-card-description\">{plan.description}</p>\n )}\n\n {showFields.includes('subscribers') && (\n <p className=\"subscrypts-plan-card-subscribers\">\n {plan.subscriberCount.toString()} subscribers\n </p>\n )}\n\n {showFields.includes('merchant') && (\n <p className=\"subscrypts-plan-card-merchant\">\n Merchant: {plan.merchantAddress.slice(0, 6)}...{plan.merchantAddress.slice(-4)}\n </p>\n )}\n\n {showFields.includes('referralBonus') && plan.referralBonus > 0n && (\n <p className=\"subscrypts-plan-card-referral\">\n Referral Bonus: {formatAmount(plan.referralBonus, decimals)} {currency}\n </p>\n )}\n\n {showFields.includes('attributes') && plan.defaultAttributes && (\n <p className=\"subscrypts-plan-card-attributes\">{plan.defaultAttributes}</p>\n )}\n </div>\n\n {/* Subscribe Button */}\n {showSubscribeButton && (\n <div className=\"subscrypts-plan-card-actions\">\n <button\n onClick={handleSubscribe}\n className=\"subscrypts-btn subscrypts-btn-primary subscrypts-btn-md subscrypts-w-full\"\n disabled={!plan.isActive}\n >\n {plan.isActive ? subscribeLabel : 'Unavailable'}\n </button>\n </div>\n )}\n </div>\n );\n}\n","/**\n * PricingTable Component\n *\n * Display multiple subscription plans in a responsive grid layout.\n */\n\nimport { useState } from 'react';\nimport { usePlans } from '../../hooks/plans';\nimport { PlanCard, PlanField } from './PlanCard';\nimport { LoadingSpinner } from '../shared/LoadingSpinner';\nimport { CheckoutWizard } from '../checkout/CheckoutWizard';\n\n/**\n * Configuration for individual plan display\n */\nexport interface PlanConfig {\n /** Plan ID */\n planId: string;\n /** Custom title for this plan */\n title?: string;\n /** Whether this plan is featured/highlighted */\n featured?: boolean;\n /** Custom subscribe button label */\n subscribeLabel?: string;\n}\n\n/**\n * PricingTable props\n */\nexport interface PricingTableProps {\n /** Array of plan IDs or plan configurations to display */\n plans: (string | PlanConfig)[];\n /** Currency to display prices in (default: 'SUBS') */\n currency?: 'SUBS' | 'USDC';\n /** Fields to display on each plan card */\n showFields?: PlanField[];\n /** Number of columns in the grid (1-4, default: auto based on count) */\n columns?: 1 | 2 | 3 | 4;\n /** Custom callback when subscribe is clicked (overrides built-in checkout) */\n onSubscribe?: (planId: string) => void;\n /** Default subscribe button label (can be overridden per-plan) */\n subscribeLabel?: string;\n /** Additional CSS class name */\n className?: string;\n /** Callback when subscription is successful */\n onSubscriptionSuccess?: (subscriptionId: string, planId: string) => void;\n /** Callback when subscription fails */\n onSubscriptionError?: (error: Error, planId: string) => void;\n /** Referral address for subscriptions */\n referralAddress?: string;\n /** Custom loading component */\n loadingComponent?: React.ReactNode;\n /** Custom error component */\n errorComponent?: React.ReactNode;\n}\n\n/**\n * PricingTable Component\n *\n * @example\n * ```tsx\n * // Simple usage with plan IDs\n * <PricingTable\n * plans={['1', '2', '3']}\n * currency=\"SUBS\"\n * showFields={['description', 'amount', 'frequency', 'subscribers']}\n * />\n *\n * // With custom configuration per plan\n * <PricingTable\n * plans={[\n * { planId: '1', title: 'Basic', subscribeLabel: 'Start Free' },\n * { planId: '2', title: 'Pro', featured: true, subscribeLabel: 'Go Pro' },\n * { planId: '3', title: 'Enterprise', subscribeLabel: 'Contact Us' }\n * ]}\n * />\n * ```\n */\nexport function PricingTable({\n plans,\n currency = 'SUBS',\n showFields = ['description', 'amount', 'frequency'],\n columns,\n onSubscribe: customOnSubscribe,\n subscribeLabel = 'Subscribe',\n className = '',\n onSubscriptionSuccess,\n onSubscriptionError,\n referralAddress,\n loadingComponent,\n errorComponent\n}: PricingTableProps) {\n // Extract plan IDs and configs\n const planConfigs = plans.map(p =>\n typeof p === 'string' ? { planId: p } : p\n );\n const planIds = planConfigs.map(c => c.planId);\n\n // Fetch plans from contract\n const { plans: fetchedPlans, isLoading, error } = usePlans(planIds);\n\n // Checkout state\n const [checkoutPlanId, setCheckoutPlanId] = useState<string | null>(null);\n\n // Determine columns\n const gridColumns = columns || Math.min(planConfigs.length, 3);\n\n const handleSubscribe = (planId: string) => {\n if (customOnSubscribe) {\n customOnSubscribe(planId);\n } else {\n setCheckoutPlanId(planId);\n }\n };\n\n const handleCheckoutClose = () => {\n setCheckoutPlanId(null);\n };\n\n const handleCheckoutSuccess = (subscriptionId: string) => {\n if (onSubscriptionSuccess && checkoutPlanId) {\n onSubscriptionSuccess(subscriptionId, checkoutPlanId);\n }\n setCheckoutPlanId(null);\n };\n\n const handleCheckoutError = (err: Error) => {\n if (onSubscriptionError && checkoutPlanId) {\n onSubscriptionError(err, checkoutPlanId);\n }\n };\n\n // Loading state\n if (isLoading) {\n return loadingComponent || (\n <div className=\"subscrypts-pricing-table-loading\">\n <LoadingSpinner />\n <p>Loading plans...</p>\n </div>\n );\n }\n\n // Error state\n if (error) {\n return errorComponent || (\n <div className=\"subscrypts-pricing-table-error\">\n <p>Failed to load plans: {error.message}</p>\n </div>\n );\n }\n\n // Empty state\n if (fetchedPlans.length === 0) {\n return (\n <div className=\"subscrypts-pricing-table-empty\">\n <p>No plans available</p>\n </div>\n );\n }\n\n const gridClass = `subscrypts-pricing-table subscrypts-pricing-table-cols-${gridColumns} ${className}`;\n\n return (\n <>\n <div className={gridClass}>\n {fetchedPlans.map((plan, index) => {\n const config = planConfigs[index];\n return (\n <PlanCard\n key={plan.id.toString()}\n plan={plan}\n currency={currency}\n showFields={showFields}\n onSubscribe={handleSubscribe}\n subscribeLabel={config.subscribeLabel || subscribeLabel}\n featured={config.featured}\n title={config.title}\n />\n );\n })}\n </div>\n\n {/* Built-in Checkout Wizard */}\n {checkoutPlanId && (\n <CheckoutWizard\n planId={checkoutPlanId}\n isOpen={true}\n onClose={handleCheckoutClose}\n onSuccess={handleCheckoutSuccess}\n onError={handleCheckoutError}\n referralAddress={referralAddress}\n />\n )}\n </>\n );\n}\n","/**\n * NetworkSwitchPrompt Component\n *\n * Displayed when the user is connected to the wrong network.\n * Provides a one-click switch to Arbitrum One.\n */\n\nimport { ARBITRUM_ONE } from '../../constants';\n\nexport interface NetworkSwitchPromptProps {\n /** Current chain ID the user is connected to */\n currentChainId: number | null;\n /** Callback to trigger network switch */\n onSwitch: () => void;\n /** Optional callback to dismiss the prompt */\n onDismiss?: () => void;\n /** Additional CSS class name */\n className?: string;\n}\n\n/**\n * NetworkSwitchPrompt Component\n *\n * @example\n * ```tsx\n * const { walletState, switchNetwork } = useWallet();\n *\n * {walletState.chainId && walletState.chainId !== 42161 && (\n * <NetworkSwitchPrompt\n * currentChainId={walletState.chainId}\n * onSwitch={() => switchNetwork(42161)}\n * />\n * )}\n * ```\n */\nexport function NetworkSwitchPrompt({\n currentChainId,\n onSwitch,\n onDismiss,\n className = ''\n}: NetworkSwitchPromptProps) {\n return (\n <div className={`subscrypts-network-prompt ${className}`}>\n <div className=\"subscrypts-network-prompt-icon\">⚠</div>\n <div className=\"subscrypts-network-prompt-content\">\n <h3 className=\"subscrypts-network-prompt-title\">Wrong Network</h3>\n <p className=\"subscrypts-network-prompt-message\">\n You are connected to chain {currentChainId || 'unknown'}.\n Please switch to {ARBITRUM_ONE.name} to continue.\n </p>\n </div>\n <div className=\"subscrypts-network-prompt-actions\">\n {onDismiss && (\n <button\n onClick={onDismiss}\n className=\"subscrypts-btn subscrypts-btn-outline subscrypts-btn-sm\"\n >\n Dismiss\n </button>\n )}\n <button\n onClick={onSwitch}\n className=\"subscrypts-btn subscrypts-btn-primary subscrypts-btn-sm\"\n >\n Switch to Arbitrum\n </button>\n </div>\n </div>\n );\n}\n","/**\n * SubscryptsErrorBoundary Component\n *\n * React error boundary wrapper for Subscrypts SDK components.\n * Catches rendering errors and displays a fallback UI.\n */\n\nimport { Component, type ErrorInfo, type ReactNode } from 'react';\n\nexport interface SubscryptsErrorBoundaryProps {\n /** Child components to wrap */\n children: ReactNode;\n /** Custom fallback UI or render function */\n fallback?: ReactNode | ((error: Error, resetError: () => void) => ReactNode);\n /** Callback when an error is caught */\n onError?: (error: Error, errorInfo: ErrorInfo) => void;\n}\n\ninterface ErrorBoundaryState {\n hasError: boolean;\n error: Error | null;\n}\n\n/**\n * Error Boundary for Subscrypts SDK components.\n *\n * @example\n * ```tsx\n * <SubscryptsErrorBoundary\n * fallback={(error, reset) => (\n * <div>\n * <p>Something went wrong: {error.message}</p>\n * <button onClick={reset}>Try Again</button>\n * </div>\n * )}\n * onError={(error) => analytics.trackError(error)}\n * >\n * <SubscriptionDashboard />\n * </SubscryptsErrorBoundary>\n * ```\n */\nexport class SubscryptsErrorBoundary extends Component<\n SubscryptsErrorBoundaryProps,\n ErrorBoundaryState\n> {\n constructor(props: SubscryptsErrorBoundaryProps) {\n super(props);\n this.state = { hasError: false, error: null };\n }\n\n static getDerivedStateFromError(error: Error): ErrorBoundaryState {\n return { hasError: true, error };\n }\n\n componentDidCatch(error: Error, errorInfo: ErrorInfo): void {\n if (this.props.onError) {\n this.props.onError(error, errorInfo);\n }\n }\n\n resetError = (): void => {\n this.setState({ hasError: false, error: null });\n };\n\n render(): ReactNode {\n if (this.state.hasError && this.state.error) {\n const { fallback } = this.props;\n\n if (typeof fallback === 'function') {\n return fallback(this.state.error, this.resetError);\n }\n\n if (fallback) {\n return fallback;\n }\n\n // Default fallback UI\n return (\n <div className=\"subscrypts-error-boundary-fallback\">\n <div className=\"subscrypts-error-boundary-icon\">⚠</div>\n <h3 className=\"subscrypts-error-boundary-title\">Something went wrong</h3>\n <p className=\"subscrypts-error-boundary-message\">\n {this.state.error.message}\n </p>\n <button\n onClick={this.resetError}\n className=\"subscrypts-btn subscrypts-btn-primary subscrypts-btn-sm\"\n >\n Try Again\n </button>\n </div>\n );\n }\n\n return this.props.children;\n }\n}\n","/**\n * ConnectWalletModal Component\n *\n * Lists available wallet connectors and handles connection.\n * Uses the Modal component for presentation.\n */\n\nimport { useState } from 'react';\nimport { WalletConnector } from '../../wallet/types';\nimport { Modal } from '../shared/Modal';\nimport { ErrorDisplay } from '../shared/ErrorDisplay';\n\nexport interface ConnectWalletModalProps {\n /** Modal open state */\n isOpen: boolean;\n /** Close handler */\n onClose: () => void;\n /** Available wallet connectors */\n connectors: WalletConnector[];\n /** Callback when connection succeeds */\n onConnect: (connectorId: string) => Promise<void>;\n /** Additional CSS class name */\n className?: string;\n}\n\n/**\n * Connect Wallet Modal\n *\n * @example\n * ```tsx\n * <ConnectWalletModal\n * isOpen={showModal}\n * onClose={() => setShowModal(false)}\n * connectors={connectors}\n * onConnect={(id) => connectWith(id)}\n * />\n * ```\n */\nexport function ConnectWalletModal({\n isOpen,\n onClose,\n connectors,\n onConnect,\n className = ''\n}: ConnectWalletModalProps) {\n const [connectingId, setConnectingId] = useState<string | null>(null);\n const [error, setError] = useState<Error | null>(null);\n\n const availableConnectors = connectors.filter((c) => c.isAvailable());\n\n const handleConnect = async (connectorId: string) => {\n setConnectingId(connectorId);\n setError(null);\n\n try {\n await onConnect(connectorId);\n onClose();\n } catch (err) {\n setError(err as Error);\n } finally {\n setConnectingId(null);\n }\n };\n\n return (\n <Modal isOpen={isOpen} onClose={onClose} title=\"Connect Wallet\" size=\"sm\">\n <div className={`subscrypts-connect-wallet ${className}`}>\n {error && (\n <ErrorDisplay\n error={error}\n compact\n onDismiss={() => setError(null)}\n />\n )}\n\n {availableConnectors.length === 0 ? (\n <div className=\"subscrypts-connect-wallet-empty\">\n <p>No wallets detected.</p>\n <p>Please install MetaMask or another Web3 wallet to continue.</p>\n </div>\n ) : (\n <div className=\"subscrypts-connect-wallet-list\">\n {availableConnectors.map((connector) => (\n <button\n key={connector.id}\n onClick={() => handleConnect(connector.id)}\n disabled={connectingId !== null}\n className={`subscrypts-connect-wallet-option ${\n connectingId === connector.id ? 'subscrypts-connect-wallet-option-loading' : ''\n }`}\n >\n {connector.icon && (\n <img\n src={connector.icon}\n alt={connector.name}\n className=\"subscrypts-connect-wallet-icon\"\n />\n )}\n <span className=\"subscrypts-connect-wallet-name\">\n {connector.name}\n </span>\n {connectingId === connector.id && (\n <span className=\"subscrypts-connect-wallet-spinner\" />\n )}\n </button>\n ))}\n </div>\n )}\n </div>\n </Modal>\n );\n}\n","/**\n * ConfirmDialog Component\n *\n * Reusable confirmation dialog for destructive or important actions.\n */\n\nimport { Modal } from '../shared/Modal';\n\n/**\n * ConfirmDialog props\n */\nexport interface ConfirmDialogProps {\n /** Whether the dialog is open */\n isOpen: boolean;\n /** Dialog title */\n title: string;\n /** Dialog message */\n message: string;\n /** Confirm button label */\n confirmLabel?: string;\n /** Cancel button label */\n cancelLabel?: string;\n /** Visual variant */\n variant?: 'danger' | 'default';\n /** Called when user confirms */\n onConfirm: () => void;\n /** Called when user cancels */\n onCancel: () => void;\n}\n\n/**\n * Confirmation dialog for important actions.\n *\n * @example\n * ```tsx\n * <ConfirmDialog\n * isOpen={showConfirm}\n * title=\"Cancel Subscription?\"\n * message=\"Your subscription will remain active until the end of the current period.\"\n * variant=\"danger\"\n * confirmLabel=\"Cancel Subscription\"\n * onConfirm={handleCancel}\n * onCancel={() => setShowConfirm(false)}\n * />\n * ```\n */\nexport function ConfirmDialog({\n isOpen,\n title,\n message,\n confirmLabel = 'Confirm',\n cancelLabel = 'Cancel',\n variant = 'default',\n onConfirm,\n onCancel\n}: ConfirmDialogProps) {\n return (\n <Modal isOpen={isOpen} onClose={onCancel} title={title}>\n <div className=\"subscrypts-confirm-dialog\">\n <p className=\"subscrypts-confirm-dialog__message\">{message}</p>\n <div className=\"subscrypts-confirm-dialog__actions\">\n <button\n className=\"subscrypts-btn subscrypts-btn-secondary\"\n onClick={onCancel}\n >\n {cancelLabel}\n </button>\n <button\n className={`subscrypts-btn ${variant === 'danger' ? 'subscrypts-btn-danger' : 'subscrypts-btn-primary'}`}\n onClick={onConfirm}\n >\n {confirmLabel}\n </button>\n </div>\n </div>\n </Modal>\n );\n}\n","/**\n * ManageSubscriptionModal Component\n *\n * Modal for managing an existing subscription: cancel, toggle auto-renewal, update cycles.\n */\n\nimport { useState } from 'react';\nimport { Modal } from '../shared/Modal';\nimport { ConfirmDialog } from './ConfirmDialog';\nimport { ErrorDisplay } from '../shared/ErrorDisplay';\nimport { LoadingSpinner } from '../shared/LoadingSpinner';\nimport { useManageSubscription } from '../../hooks/subscriptions/useManageSubscription';\nimport { formatDate } from '../../utils/formatters';\nimport type { Subscription } from '../../types';\n\n/**\n * ManageSubscriptionModal props\n */\nexport interface ManageSubscriptionModalProps {\n /** Whether the modal is open */\n isOpen: boolean;\n /** Close handler */\n onClose: () => void;\n /** Subscription ID to manage */\n subscriptionId: string;\n /** Pre-loaded subscription data (to skip additional fetch) */\n subscription?: Subscription;\n /** Called when subscription is cancelled */\n onCancelled?: () => void;\n /** Called when subscription is updated */\n onUpdated?: () => void;\n}\n\n/**\n * Modal for managing a subscription with cancel, auto-renew toggle, and cycle updates.\n *\n * @example\n * ```tsx\n * <ManageSubscriptionModal\n * isOpen={showManage}\n * onClose={() => setShowManage(false)}\n * subscriptionId=\"42\"\n * subscription={subscriptionData}\n * onCancelled={() => refetchSubscriptions()}\n * />\n * ```\n */\nexport function ManageSubscriptionModal({\n isOpen,\n onClose,\n subscriptionId,\n subscription,\n onCancelled,\n onUpdated\n}: ManageSubscriptionModalProps) {\n const {\n cancelSubscription,\n toggleAutoRenew,\n updateCycles,\n txState,\n error,\n isProcessing\n } = useManageSubscription(subscriptionId);\n\n const [showCancelConfirm, setShowCancelConfirm] = useState(false);\n\n const handleCancel = async () => {\n setShowCancelConfirm(false);\n try {\n await cancelSubscription();\n onCancelled?.();\n } catch {\n // Error is set in hook state\n }\n };\n\n const handleToggleAutoRenew = async () => {\n if (!subscription) return;\n try {\n await toggleAutoRenew(!subscription.isAutoRenewing);\n onUpdated?.();\n } catch {\n // Error is set in hook state\n }\n };\n\n const handleUpdateCycles = async (cycles: number) => {\n try {\n await updateCycles(cycles);\n onUpdated?.();\n } catch {\n // Error is set in hook state\n }\n };\n\n return (\n <>\n <Modal isOpen={isOpen} onClose={onClose} title=\"Manage Subscription\">\n <div className=\"subscrypts-manage-modal\">\n {subscription && (\n <div className=\"subscrypts-manage-modal__info\">\n <div className=\"subscrypts-manage-modal__row\">\n <span className=\"subscrypts-manage-modal__label\">Subscription ID</span>\n <span className=\"subscrypts-manage-modal__value\">#{subscriptionId}</span>\n </div>\n <div className=\"subscrypts-manage-modal__row\">\n <span className=\"subscrypts-manage-modal__label\">Next Payment</span>\n <span className=\"subscrypts-manage-modal__value\">\n {formatDate(subscription.nextPaymentDate)}\n </span>\n </div>\n <div className=\"subscrypts-manage-modal__row\">\n <span className=\"subscrypts-manage-modal__label\">Auto-Renewal</span>\n <span className=\"subscrypts-manage-modal__value\">\n {subscription.isAutoRenewing ? 'Enabled' : 'Disabled'}\n </span>\n </div>\n <div className=\"subscrypts-manage-modal__row\">\n <span className=\"subscrypts-manage-modal__label\">Remaining Cycles</span>\n <span className=\"subscrypts-manage-modal__value\">\n {subscription.remainingCycles}\n </span>\n </div>\n </div>\n )}\n\n <ErrorDisplay error={error} compact />\n\n {isProcessing && (\n <div className=\"subscrypts-manage-modal__processing\">\n <LoadingSpinner />\n <span>Processing transaction...</span>\n </div>\n )}\n\n {txState === 'success' && (\n <div className=\"subscrypts-manage-modal__success\">\n Subscription updated successfully.\n </div>\n )}\n\n <div className=\"subscrypts-manage-modal__actions\">\n <button\n className=\"subscrypts-btn subscrypts-btn-secondary\"\n onClick={handleToggleAutoRenew}\n disabled={isProcessing || !subscription}\n >\n {subscription?.isAutoRenewing ? 'Disable' : 'Enable'} Auto-Renewal\n </button>\n\n <button\n className=\"subscrypts-btn subscrypts-btn-secondary\"\n onClick={() => handleUpdateCycles(12)}\n disabled={isProcessing}\n >\n Set 12 Cycles\n </button>\n\n <button\n className=\"subscrypts-btn subscrypts-btn-danger\"\n onClick={() => setShowCancelConfirm(true)}\n disabled={isProcessing}\n >\n Cancel Subscription\n </button>\n </div>\n </div>\n </Modal>\n\n <ConfirmDialog\n isOpen={showCancelConfirm}\n title=\"Cancel Subscription?\"\n message=\"Your subscription will remain active until the end of the current billing period. After that, access will be revoked and auto-renewal will be disabled.\"\n variant=\"danger\"\n confirmLabel=\"Cancel Subscription\"\n onConfirm={handleCancel}\n onCancel={() => setShowCancelConfirm(false)}\n />\n </>\n );\n}\n","/**\n * SubscriptionCard Component\n *\n * Display subscription info with status badge, amount, frequency, and manage button.\n */\n\nimport { useState } from 'react';\nimport { ManageSubscriptionModal } from './ManageSubscriptionModal';\nimport { resolveSubscriptionStatus } from '../../utils/subscriptionStatus';\nimport { formatSubs, formatDate } from '../../utils/formatters';\nimport type { Subscription } from '../../types';\n\n/**\n * SubscriptionCard props\n */\nexport interface SubscriptionCardProps {\n /** Subscription to display */\n subscription: Subscription;\n /** Show manage button (default: true) */\n showManageButton?: boolean;\n /** Show fiat price (default: false) */\n showFiatPrice?: boolean;\n /** Custom manage handler (overrides default modal) */\n onManage?: (subscriptionId: string) => void;\n /** Called when subscription is cancelled */\n onCancelled?: () => void;\n /** Called when subscription is updated */\n onUpdated?: () => void;\n /** Additional CSS class */\n className?: string;\n}\n\n/**\n * Card displaying subscription details with status badge.\n *\n * @example\n * ```tsx\n * <SubscriptionCard\n * subscription={subscription}\n * showManageButton={true}\n * onCancelled={() => refetch()}\n * />\n * ```\n */\nexport function SubscriptionCard({\n subscription,\n showManageButton = true,\n showFiatPrice: _showFiatPrice = false,\n onManage,\n onCancelled,\n onUpdated,\n className = ''\n}: SubscriptionCardProps) {\n const [showManageModal, setShowManageModal] = useState(false);\n\n // Resolve subscription status\n const status = resolveSubscriptionStatus({ subscription });\n\n // Determine badge variant based on state\n const getBadgeVariant = (): 'active' | 'expired' | 'expiring' | 'cancelled' => {\n switch (status.state) {\n case 'active':\n return 'active';\n case 'expiring-soon':\n return 'expiring';\n case 'expired':\n return 'expired';\n case 'cancelled':\n return 'cancelled';\n default:\n return 'expired';\n }\n };\n\n // Get badge label\n const getBadgeLabel = (): string => {\n switch (status.state) {\n case 'active':\n return 'Active';\n case 'expiring-soon':\n return 'Expiring Soon';\n case 'expired':\n return 'Expired';\n case 'cancelled':\n return 'Cancelled';\n default:\n return 'Unknown';\n }\n };\n\n // Format frequency\n const getFrequencyLabel = (): string => {\n const seconds = Number(subscription.paymentFrequency);\n const days = seconds / 86400;\n\n if (days === 1) return 'Daily';\n if (days === 7) return 'Weekly';\n if (days === 30 || days === 31) return 'Monthly';\n if (days === 365) return 'Yearly';\n return `Every ${days} days`;\n };\n\n const handleManageClick = () => {\n if (onManage) {\n onManage(subscription.id);\n } else {\n setShowManageModal(true);\n }\n };\n\n const handleCancelled = () => {\n setShowManageModal(false);\n onCancelled?.();\n };\n\n const handleUpdated = () => {\n setShowManageModal(false);\n onUpdated?.();\n };\n\n return (\n <>\n <div className={`subscrypts-subscription-card ${className}`}>\n {/* Header: Status Badge */}\n <div className=\"subscrypts-subscription-card__header\">\n <span className={`subscrypts-subscription-card__badge subscrypts-subscription-card__badge--${getBadgeVariant()}`}>\n {getBadgeLabel()}\n </span>\n </div>\n\n {/* Content: Amount & Frequency */}\n <div className=\"subscrypts-subscription-card__content\">\n <div className=\"subscrypts-subscription-card__amount\">\n {formatSubs(subscription.subscriptionAmount)} SUBS\n </div>\n <div className=\"subscrypts-subscription-card__frequency\">\n {getFrequencyLabel()}\n </div>\n </div>\n\n {/* Details Grid */}\n <div className=\"subscrypts-subscription-card__details\">\n <div className=\"subscrypts-subscription-card__detail-row\">\n <span className=\"subscrypts-subscription-card__detail-label\">Next Payment</span>\n <span className=\"subscrypts-subscription-card__detail-value\">\n {formatDate(subscription.nextPaymentDate)}\n </span>\n </div>\n\n <div className=\"subscrypts-subscription-card__detail-row\">\n <span className=\"subscrypts-subscription-card__detail-label\">Auto-Renewal</span>\n <span className=\"subscrypts-subscription-card__detail-value\">\n {subscription.isAutoRenewing ? 'Enabled' : 'Disabled'}\n </span>\n </div>\n\n <div className=\"subscrypts-subscription-card__detail-row\">\n <span className=\"subscrypts-subscription-card__detail-label\">Remaining Cycles</span>\n <span className=\"subscrypts-subscription-card__detail-value\">\n {subscription.remainingCycles === 0 ? 'Unlimited' : subscription.remainingCycles}\n </span>\n </div>\n\n {status.daysUntilExpiry !== null && (\n <div className=\"subscrypts-subscription-card__detail-row\">\n <span className=\"subscrypts-subscription-card__detail-label\">Days Until Expiry</span>\n <span className=\"subscrypts-subscription-card__detail-value\">\n {status.daysUntilExpiry}\n </span>\n </div>\n )}\n </div>\n\n {/* Actions */}\n {showManageButton && (\n <div className=\"subscrypts-subscription-card__actions\">\n <button\n className=\"subscrypts-btn subscrypts-btn-secondary\"\n onClick={handleManageClick}\n >\n Manage\n </button>\n </div>\n )}\n </div>\n\n {/* Manage Modal */}\n {!onManage && (\n <ManageSubscriptionModal\n isOpen={showManageModal}\n onClose={() => setShowManageModal(false)}\n subscriptionId={subscription.id}\n subscription={subscription}\n onCancelled={handleCancelled}\n onUpdated={handleUpdated}\n />\n )}\n </>\n );\n}\n","/**\n * SubscriptionDashboard Component\n *\n * Full subscription management dashboard with pagination, empty/loading states.\n */\n\nimport { SubscriptionCard } from './SubscriptionCard';\nimport { LoadingSpinner } from '../shared/LoadingSpinner';\nimport { ErrorDisplay } from '../shared/ErrorDisplay';\nimport { useMySubscriptions } from '../../hooks/subscriptions/useMySubscriptions';\n\n/**\n * SubscriptionDashboard props\n */\nexport interface SubscriptionDashboardProps {\n /** Address to fetch subscriptions for (defaults to connected wallet) */\n address?: string;\n /** Number of subscriptions per page (default: 10) */\n pageSize?: number;\n /** Show fiat prices on cards (default: false) */\n showFiatPrices?: boolean;\n /** Custom empty state component */\n emptyComponent?: React.ReactNode;\n /** Custom loading component */\n loadingComponent?: React.ReactNode;\n /** Additional CSS class */\n className?: string;\n /** Called when a subscription is cancelled */\n onSubscriptionCancelled?: (subscriptionId: string) => void;\n /** Called when a subscription is updated */\n onSubscriptionUpdated?: (subscriptionId: string) => void;\n}\n\n/**\n * Dashboard for viewing and managing user subscriptions.\n *\n * @example\n * ```tsx\n * <SubscriptionDashboard\n * pageSize={10}\n * showFiatPrices={true}\n * onSubscriptionCancelled={() => console.log('Subscription cancelled')}\n * />\n * ```\n */\nexport function SubscriptionDashboard({\n address,\n pageSize = 10,\n showFiatPrices = false,\n emptyComponent,\n loadingComponent,\n className = '',\n onSubscriptionCancelled,\n onSubscriptionUpdated\n}: SubscriptionDashboardProps) {\n const {\n subscriptions,\n total,\n page,\n hasMore,\n isLoading,\n error,\n nextPage,\n prevPage,\n refetch\n } = useMySubscriptions(address, pageSize);\n\n // Loading state\n if (isLoading && subscriptions.length === 0) {\n if (loadingComponent) {\n return <>{loadingComponent}</>;\n }\n return (\n <div className=\"subscrypts-subscription-dashboard__loading\">\n <LoadingSpinner />\n <p>Loading subscriptions...</p>\n </div>\n );\n }\n\n // Error state\n if (error) {\n return (\n <div className=\"subscrypts-subscription-dashboard__error\">\n <ErrorDisplay error={error} onRetry={refetch} />\n </div>\n );\n }\n\n // Empty state\n if (subscriptions.length === 0 && !isLoading) {\n if (emptyComponent) {\n return <>{emptyComponent}</>;\n }\n return (\n <div className=\"subscrypts-subscription-dashboard__empty\">\n <p className=\"subscrypts-subscription-dashboard__empty-text\">\n No subscriptions found\n </p>\n <p className=\"subscrypts-subscription-dashboard__empty-subtext\">\n Subscribe to a plan to get started\n </p>\n </div>\n );\n }\n\n const handleCancelled = (subscriptionId: string) => {\n refetch();\n onSubscriptionCancelled?.(subscriptionId);\n };\n\n const handleUpdated = (subscriptionId: string) => {\n refetch();\n onSubscriptionUpdated?.(subscriptionId);\n };\n\n return (\n <div className={`subscrypts-subscription-dashboard ${className}`}>\n {/* Header */}\n <div className=\"subscrypts-subscription-dashboard__header\">\n <h2 className=\"subscrypts-subscription-dashboard__title\">\n My Subscriptions\n </h2>\n <p className=\"subscrypts-subscription-dashboard__subtitle\">\n {total} {total === 1 ? 'subscription' : 'subscriptions'}\n </p>\n </div>\n\n {/* Subscription Grid */}\n <div className=\"subscrypts-subscription-dashboard__grid\">\n {subscriptions.map((subscription) => (\n <SubscriptionCard\n key={subscription.id}\n subscription={subscription}\n showFiatPrice={showFiatPrices}\n onCancelled={() => handleCancelled(subscription.id)}\n onUpdated={() => handleUpdated(subscription.id)}\n />\n ))}\n </div>\n\n {/* Pagination */}\n {total > pageSize && (\n <div className=\"subscrypts-subscription-dashboard__pagination\">\n <button\n className=\"subscrypts-btn subscrypts-btn-secondary subscrypts-subscription-dashboard__pagination-btn\"\n onClick={prevPage}\n disabled={page === 1 || isLoading}\n >\n Previous\n </button>\n\n <span className=\"subscrypts-subscription-dashboard__pagination-info\">\n Page {page} of {Math.ceil(total / pageSize)}\n </span>\n\n <button\n className=\"subscrypts-btn subscrypts-btn-secondary subscrypts-subscription-dashboard__pagination-btn\"\n onClick={nextPage}\n disabled={!hasMore || isLoading}\n >\n Next\n </button>\n </div>\n )}\n </div>\n );\n}\n","/**\n * MerchantDashboard Component\n *\n * Complete merchant overview with revenue metrics, plan list, and subscriber stats.\n */\n\nimport { useState } from 'react';\nimport { LoadingSpinner } from '../shared/LoadingSpinner';\nimport { ErrorDisplay } from '../shared/ErrorDisplay';\nimport { useMerchantRevenue } from '../../hooks/merchant/useMerchantRevenue';\nimport { useMerchantPlans } from '../../hooks/merchant/useMerchantPlans';\nimport { useMerchantSubscribers } from '../../hooks/merchant/useMerchantSubscribers';\nimport { formatFiatPrice } from '../../utils/formatters';\n\n/**\n * MerchantDashboard props\n */\nexport interface MerchantDashboardProps {\n /** Merchant address (defaults to connected wallet) */\n merchantAddress?: string;\n /** Additional CSS class */\n className?: string;\n}\n\n/**\n * Complete merchant dashboard showing revenue, plans, and subscribers.\n *\n * @example\n * ```tsx\n * <MerchantDashboard />\n * ```\n */\nexport function MerchantDashboard({\n merchantAddress: _merchantAddress,\n className = ''\n}: MerchantDashboardProps) {\n const { revenue, isLoading: revenueLoading, error: revenueError } = useMerchantRevenue();\n const { plans, isLoading: plansLoading, error: plansError } = useMerchantPlans();\n\n const [selectedPlanId, setSelectedPlanId] = useState<string | null>(null);\n\n // Load subscribers for selected plan\n const {\n subscribers,\n total: subscriberTotal,\n activeCount,\n isLoading: subscribersLoading\n } = useMerchantSubscribers(\n selectedPlanId || '0',\n 10\n );\n\n // Combined loading state\n const isLoading = revenueLoading || plansLoading;\n\n // Combined error state\n const error = revenueError || plansError;\n\n // Loading state\n if (isLoading) {\n return (\n <div className=\"subscrypts-merchant-dashboard__loading\">\n <LoadingSpinner />\n <p>Loading dashboard...</p>\n </div>\n );\n }\n\n // Error state\n if (error) {\n return (\n <div className=\"subscrypts-merchant-dashboard__error\">\n <ErrorDisplay error={error} />\n </div>\n );\n }\n\n // Empty state (no plans)\n if (!plans || plans.length === 0) {\n return (\n <div className={`subscrypts-merchant-dashboard ${className}`}>\n <div className=\"subscrypts-merchant-dashboard__empty\">\n <h2 className=\"subscrypts-merchant-dashboard__empty-title\">\n No Plans Yet\n </h2>\n <p className=\"subscrypts-merchant-dashboard__empty-text\">\n Create your first subscription plan to start earning revenue\n </p>\n </div>\n </div>\n );\n }\n\n return (\n <div className={`subscrypts-merchant-dashboard ${className}`}>\n {/* Header */}\n <div className=\"subscrypts-merchant-dashboard__header\">\n <h1 className=\"subscrypts-merchant-dashboard__title\">\n Merchant Dashboard\n </h1>\n </div>\n\n {/* Revenue Summary Card */}\n <div className=\"subscrypts-merchant-dashboard__revenue-card\">\n <h2 className=\"subscrypts-merchant-dashboard__section-title\">\n Revenue Overview\n </h2>\n\n {revenue && (\n <div className=\"subscrypts-merchant-dashboard__metrics\">\n <div className=\"subscrypts-merchant-dashboard__metric\">\n <div className=\"subscrypts-merchant-dashboard__metric-label\">\n Monthly Recurring Revenue\n </div>\n <div className=\"subscrypts-merchant-dashboard__metric-value subscrypts-merchant-dashboard__metric-value--primary\">\n {revenue.mrrFormatted} SUBS\n </div>\n {revenue.mrrUsdEstimate !== null && (\n <div className=\"subscrypts-merchant-dashboard__metric-subvalue\">\n ≈ {formatFiatPrice(revenue.mrrUsdEstimate)}\n </div>\n )}\n </div>\n\n <div className=\"subscrypts-merchant-dashboard__metric\">\n <div className=\"subscrypts-merchant-dashboard__metric-label\">\n Active Subscribers\n </div>\n <div className=\"subscrypts-merchant-dashboard__metric-value\">\n {revenue.activeSubscribers}\n </div>\n <div className=\"subscrypts-merchant-dashboard__metric-subvalue\">\n of {revenue.totalSubscribers} total\n </div>\n </div>\n\n <div className=\"subscrypts-merchant-dashboard__metric\">\n <div className=\"subscrypts-merchant-dashboard__metric-label\">\n Active Plans\n </div>\n <div className=\"subscrypts-merchant-dashboard__metric-value\">\n {plans.filter(p => p.isActive).length}\n </div>\n <div className=\"subscrypts-merchant-dashboard__metric-subvalue\">\n of {plans.length} total\n </div>\n </div>\n </div>\n )}\n </div>\n\n {/* Plans Section */}\n <div className=\"subscrypts-merchant-dashboard__section\">\n <h2 className=\"subscrypts-merchant-dashboard__section-title\">\n Your Plans\n </h2>\n\n <div className=\"subscrypts-merchant-dashboard__plans-grid\">\n {plans.map((plan) => (\n <div\n key={plan.id.toString()}\n className={`subscrypts-merchant-dashboard__plan-card ${\n selectedPlanId === plan.id.toString()\n ? 'subscrypts-merchant-dashboard__plan-card--selected'\n : ''\n }`}\n onClick={() => setSelectedPlanId(plan.id.toString())}\n >\n <div className=\"subscrypts-merchant-dashboard__plan-header\">\n <h3 className=\"subscrypts-merchant-dashboard__plan-name\">\n Plan #{plan.id.toString()}\n </h3>\n {plan.isActive && (\n <span className=\"subscrypts-merchant-dashboard__plan-badge\">\n Active\n </span>\n )}\n </div>\n\n <div className=\"subscrypts-merchant-dashboard__plan-description\">\n {plan.description || 'No description'}\n </div>\n\n <div className=\"subscrypts-merchant-dashboard__plan-stats\">\n <div className=\"subscrypts-merchant-dashboard__plan-stat\">\n <span className=\"subscrypts-merchant-dashboard__plan-stat-label\">\n Subscribers:\n </span>\n <span className=\"subscrypts-merchant-dashboard__plan-stat-value\">\n {plan.subscriberCount.toString()}\n </span>\n </div>\n </div>\n </div>\n ))}\n </div>\n </div>\n\n {/* Subscribers Section (for selected plan) */}\n {selectedPlanId && (\n <div className=\"subscrypts-merchant-dashboard__section\">\n <h2 className=\"subscrypts-merchant-dashboard__section-title\">\n Subscribers for Plan #{selectedPlanId}\n </h2>\n\n {subscribersLoading ? (\n <div className=\"subscrypts-merchant-dashboard__subscribers-loading\">\n <LoadingSpinner />\n <p>Loading subscribers...</p>\n </div>\n ) : subscribers.length === 0 ? (\n <div className=\"subscrypts-merchant-dashboard__subscribers-empty\">\n <p>No subscribers yet for this plan</p>\n </div>\n ) : (\n <>\n <div className=\"subscrypts-merchant-dashboard__subscribers-summary\">\n <p>\n {activeCount} active out of {subscriberTotal} total subscribers\n </p>\n </div>\n\n <div className=\"subscrypts-merchant-dashboard__subscribers-list\">\n {subscribers.map((sub) => (\n <div\n key={sub.id}\n className=\"subscrypts-merchant-dashboard__subscriber-item\"\n >\n <div className=\"subscrypts-merchant-dashboard__subscriber-address\">\n {sub.subscriber.slice(0, 6)}...{sub.subscriber.slice(-4)}\n </div>\n <div className=\"subscrypts-merchant-dashboard__subscriber-status\">\n {sub.isAutoRenewing ? 'Auto-renewing' : 'Manual'}\n </div>\n <div className=\"subscrypts-merchant-dashboard__subscriber-cycles\">\n {sub.remainingCycles === 0 ? 'Unlimited' : `${sub.remainingCycles} cycles`}\n </div>\n </div>\n ))}\n </div>\n </>\n )}\n </div>\n )}\n </div>\n );\n}\n","/**\n * Subscription Decision Helpers\n *\n * Pure utility functions for subscription decisions.\n * Usable by React code, AI agents, cron jobs, and automation scripts.\n * No blockchain calls - operates on existing data only.\n */\n\nimport type { Subscription } from '../types';\nimport { resolveSubscriptionStatus } from './subscriptionStatus';\nimport type { SubscriptionState } from './subscriptionStatus';\n\n/**\n * Check if a subscription grants active access.\n * Pure function - no blockchain calls.\n *\n * @example\n * ```typescript\n * if (canAccess(subscription)) {\n * showPremiumContent();\n * }\n * ```\n */\nexport function canAccess(subscription: Subscription | null): boolean {\n if (!subscription) return false;\n const status = resolveSubscriptionStatus({ subscription });\n return status.isActive;\n}\n\n/**\n * Check if a subscription payment is due (past nextPaymentDate).\n *\n * @example\n * ```typescript\n * if (isPaymentDue(subscription)) {\n * triggerPaymentCollection();\n * }\n * ```\n */\nexport function isPaymentDue(subscription: Subscription, now: Date = new Date()): boolean {\n return subscription.nextPaymentDate <= now;\n}\n\n/**\n * Check if a subscription should be renewed.\n * True when: payment is due AND auto-renewing AND has remaining cycles.\n *\n * @example\n * ```typescript\n * if (shouldRenew(subscription)) {\n * processRenewalPayment();\n * }\n * ```\n */\nexport function shouldRenew(subscription: Subscription, now: Date = new Date()): boolean {\n return (\n isPaymentDue(subscription, now) &&\n subscription.isAutoRenewing &&\n subscription.remainingCycles > 0\n );\n}\n\n/**\n * Subscription health summary\n */\nexport interface SubscriptionHealth {\n /** Normalized subscription state */\n state: SubscriptionState;\n /** Whether a payment is currently due */\n isPaymentDue: boolean;\n /** Whether the subscription should be renewed */\n shouldRenew: boolean;\n /** Days until expiry (null if expired or not found) */\n daysUntilExpiry: number | null;\n /** Remaining payment cycles */\n cyclesRemaining: number;\n}\n\n/**\n * Get comprehensive subscription health summary.\n * Combines status resolution with decision helpers.\n *\n * @example\n * ```typescript\n * const health = getSubscriptionHealth(subscription);\n * console.log(health.state); // 'active'\n * console.log(health.isPaymentDue); // false\n * console.log(health.daysUntilExpiry); // 25\n * ```\n */\nexport function getSubscriptionHealth(\n subscription: Subscription | null,\n now: Date = new Date()\n): SubscriptionHealth {\n const status = resolveSubscriptionStatus({ subscription, now });\n\n return {\n state: status.state,\n isPaymentDue: subscription ? isPaymentDue(subscription, now) : false,\n shouldRenew: subscription ? shouldRenew(subscription, now) : false,\n daysUntilExpiry: status.daysUntilExpiry,\n cyclesRemaining: status.remainingCycles\n };\n}\n","/**\n * @subscrypts/subscrypts-sdk-react\n *\n * Official React SDK for Subscrypts - Decentralized subscriptions on Arbitrum\n *\n * @example\n * ```tsx\n * import { SubscryptsProvider, SubscriptionGuard } from '@subscrypts/subscrypts-sdk-react';\n * import '@subscrypts/subscrypts-sdk-react/styles';\n *\n * function App() {\n * return (\n * <SubscryptsProvider enableWalletManagement={true}>\n * <SubscriptionGuard\n * planId=\"1\"\n * fallbackUrl=\"/subscribe\"\n * >\n * <PremiumContent />\n * </SubscriptionGuard>\n * </SubscryptsProvider>\n * );\n * }\n * ```\n */\n\n// Context & Provider\nexport { SubscryptsProvider, useSubscrypts } from './context';\nexport type { SubscryptsContextValue } from './context';\n\n// Hooks (Headless API)\nexport {\n useSubscriptionStatus,\n useSubscribe,\n useTokenBalance,\n useWallet,\n usePlan,\n usePlans,\n // v1.2.0\n useSUBSPrice,\n usePlanPrice,\n useManageSubscription,\n usePlansByMerchant,\n // v1.3.0\n useMySubscriptions,\n useSubscryptsEvents,\n // v1.4.0\n useMerchantPlans,\n useMerchantSubscribers,\n useMerchantRevenue\n} from './hooks';\nexport type {\n UseSubscriptionStatusReturn,\n UseSubscribeReturn,\n SubscribeParams,\n UseTokenBalanceReturn,\n TokenType,\n UseWalletReturn,\n UsePlanReturn,\n UsePlansReturn,\n // v1.2.0\n UseSUBSPriceReturn,\n UsePlanPriceReturn,\n PlanPriceInfo,\n UseManageSubscriptionReturn,\n UsePlansByMerchantReturn,\n // v1.3.0\n UseMySubscriptionsReturn,\n SubscryptsEventCallbacks,\n UseSubscryptsEventsReturn,\n // v1.4.0\n UseMerchantPlansReturn,\n UseMerchantSubscribersReturn,\n MerchantRevenueData,\n UseMerchantRevenueReturn\n} from './hooks';\n\n// Components\nexport {\n SubscriptionGuard,\n CheckoutWizard,\n SubscryptsButton,\n LoadingSpinner,\n Modal,\n PlanCard,\n PricingTable,\n ErrorDisplay,\n NetworkSwitchPrompt,\n SubscryptsErrorBoundary,\n ConnectWalletModal,\n // v1.2.0\n ManageSubscriptionModal,\n ConfirmDialog,\n // v1.3.0\n SubscriptionCard,\n SubscriptionDashboard,\n // v1.4.0\n MerchantDashboard\n} from './components';\nexport type {\n PlanCardProps,\n PlanField,\n PricingTableProps,\n PlanConfig,\n ErrorDisplayProps,\n NetworkSwitchPromptProps,\n SubscryptsErrorBoundaryProps,\n ConnectWalletModalProps,\n // v1.2.0\n ManageSubscriptionModalProps,\n ConfirmDialogProps,\n // v1.3.0\n SubscriptionCardProps,\n SubscriptionDashboardProps,\n // v1.4.0\n MerchantDashboardProps\n} from './components';\n\n// Types\nexport type {\n // Subscription types\n SubscriptionStatus,\n Subscription,\n Plan,\n PaymentMethod,\n TransactionState,\n CheckoutStep,\n\n // Contract types\n SubscriptionCreateParams,\n PayWithUsdcParams,\n SubscriptionCreateResult,\n PayWithUsdcResult,\n ContractSubscription,\n\n // Wallet types\n NetworkConfig,\n WalletState,\n ExternalWalletConfig,\n\n // Component prop types\n SubscryptsProviderProps,\n SubscriptionGuardProps\n} from './types';\n\n// Constants\nexport {\n ARBITRUM_ONE,\n getNetworkConfig,\n isArbitrumNetwork,\n getSubscryptsContractAddress,\n getSubsTokenAddress,\n getUsdcTokenAddress,\n PERMIT2_ADDRESS,\n DEX_QUOTER_ADDRESS,\n TOKEN_DECIMALS,\n DEFAULTS\n} from './constants';\n\n// Utilities\nexport {\n // Formatters\n formatTokenAmount,\n parseTokenAmount,\n formatSubs,\n formatUsdc,\n formatDate,\n formatDateTime,\n formatDuration,\n shortenAddress,\n formatPercentage,\n\n // Validators\n validateAddress,\n validatePositiveNumber,\n validatePositiveBigInt,\n validatePlanId,\n validateCycleLimit,\n\n // Errors\n SubscryptsError,\n WalletError,\n NetworkError,\n ContractError,\n InsufficientBalanceError,\n TransactionError,\n ValidationError,\n\n // Error messages (v1.1.0)\n getErrorMessage,\n getErrorCode,\n ERROR_CODE_MAP,\n\n // Subscription status resolver (v1.1.0)\n resolveSubscriptionStatus,\n\n // Fiat price formatter (v1.2.0)\n formatFiatPrice,\n\n // Decision helpers (v1.2.0)\n canAccess,\n isPaymentDue,\n shouldRenew,\n getSubscriptionHealth\n} from './utils';\nexport type {\n ErrorMessageConfig,\n SubscriptionState,\n ResolvedStatus,\n ResolveStatusInput,\n // v1.2.0\n SubscriptionHealth\n} from './utils';\n\n// PERMIT2 utilities\nexport {\n generatePermit2Signature,\n PERMIT2_DOMAIN,\n PERMIT2_TYPES\n} from './utils/permit.utils';\n\n// ABIs\nexport { DEX_QUOTER_ABI } from './contract';\n\n// Wallet connectors (v1.1.0)\nexport type { WalletConnector, ConnectorId, ConnectResult } from './wallet';\nexport { InjectedConnector } from './wallet';\nexport type { WalletSession } from './wallet';\n\n// Logger\nexport { logger, type LogLevel, type LoggerConfig } from './utils/logger';\n\n// Version\nexport const VERSION = '1.4.1';\n"],"names":["SubscryptsContext","createContext","useSubscrypts","context","useContext","SubscryptsError","code","message","details","WalletError","NetworkError","ContractError","InsufficientBalanceError","required","available","token","TransactionError","txHash","ValidationError","field","SanctionsError","address","isMerchant","__publicField","WalletService","ethereumProvider","BrowserProvider","accounts","network","chainId","error","targetNetwork","callback","CHAIN_ID","CHAIN_NAME","RPC_URLS","DEFAULT_RPC_URL","BLOCK_EXPLORER","NETWORK_CONFIG","SUBSCRYPTS_ADDRESS","SUBS_TOKEN_ADDRESS","USDC_ADDRESS","DECIMALS","DEX_QUOTER_ADDRESS","UNISWAP_FEE_TIER","PERMIT2_ADDRESS","DEFAULTS","isArbitrumNetwork","getSubscryptsAddress","subscryptsABI","dexUSDCABI","dexQuoterABI","getContract","runner","ethers","SUBSCRYPTS_ABI","bytes32Encode","str","bytes32Decode","hex","paySubscriptionWithUsdc","signer","planId","recurring","remainingCycles","referral","feeTier","deadline","nonce","permitDeadline","signature","maxUsdc","contract","referralAddr","subscriptionAttributeCHG","subId","newAttribute","attrBytes","subscriptionCreate","subscriber","onlyCreate","deductFrom","subscriptionRecurringCHG","enabled","cycles","cleanPlan","p","cleanSub","s","planAutoIncrement","convertOtherCurrencyToToken","amount","convertTokenToOtherCurrency","getPlan","result","getPlans","start","end","getPlanSubscription","getSubscription","getSubscriptionsByAddress","getSubscriptionsByPlan","parseSubscriptionCreatedEvent","receipt","contractInterface","log","parsed","parseUsdcPaymentEvent","getSubscriptionState","planSubscription","subscriptionId","subscription","nextPaymentDate","verifySubscriptionPayment","previousNextPaymentDate","createSubscriptionVerified","params","paySubscriptionWithUsdcVerified","paymentData","TokenService","tokenAddress","decimals","symbol","Contract","ERC20_ABI","owner","spender","requiredAmount","balance","CacheManager","config","key","fetcher","ttl","namespacedKey","cached","promise","data","firstKey","entry","keyPattern","namespacedPattern","regex","total","getNetworkConfig","_network","getSubscryptsContractAddress","getSubsTokenAddress","getUsdcTokenAddress","LOG_STYLES","SubscryptsLogger","operation","fn","duration","minLevel","label","logger","formatLogValue","value","formatted","k","v","InjectedConnector","options","args","chainIdHex","ExternalConnector","STORAGE_KEY","SESSION_MAX_AGE_MS","saveSession","connectorId","session","loadSession","raw","clearSession","isSessionStale","SubscryptsProvider","children","enableWalletManagement","externalProvider","networkName","balanceRefreshInterval","debug","onAccountChange","onChainChange","connectorsProp","persistSessionProp","caching","useEffect","VERSION","resolvedConnectors","useMemo","useConnectorMode","walletState","setWalletState","useState","setSigner","provider","setProvider","subscryptsContract","setSubscryptsContract","subsTokenContract","setSubsTokenContract","usdcTokenContract","setUsdcTokenContract","subsBalance","setSubsBalance","usdcBalance","setUsdcBalance","activeConnector","setActiveConnector","walletService","sessionReconnectAttempted","useRef","cacheManager","contractRunner","subscryptsAddress","subsAddress","usdcAddress","refreshBalances","useCallback","subs","usdc","interval","applyConnectResult","connector","resetWalletState","connectWith","c","prev","refreshed","connect","refreshedResult","providerSigner","disconnect","_a","switchNetwork","oldAddress","newChainId","oldChainId","handleAccountsChanged","handleChainChanged","contextValue","validateAddress","fieldName","isAddress","getAddress","validatePositiveNumber","validatePositiveBigInt","validatePlanId","validateCycleLimit","isValidReferral","referralAddress","planIdBigInt","checkSanctions","merchantAddress","subscriberAddress","merchantSanctioned","subscriberSanctioned","useSubscriptionStatus","wallet","status","setStatus","isLoading","setIsLoading","setError","addressToCheck","fetchStatus","validationError","cacheKey","getSmartTTL","now","expiresIn","planSub","isActive","err","refetch","PERMIT2_DOMAIN","PERMIT2_TYPES","generatePermit2Signature","useSubscribe","isSubscribing","setIsSubscribing","txState","setTxState","setTxHash","setSubscriptionId","plan","sanctionsResult","subsService","largeApproval","ZeroAddress","usdcService","requiredSubs18","usdcNeeded","DEX_QUOTER_ABI","maxUsdcIn","txError","useManageSubscription","isProcessing","setIsProcessing","cancelSubscription","toggleAutoRenew","updateCycles","updateAttributes","attributes","transformContractSubscription","contractSub","useMySubscriptions","pageSize","planIds","subscriptions","setSubscriptions","setTotal","page","setPage","targetAddress","fetchSubscriptions","allSubs","fullSub","planErr","sub","startIdx","endIdx","paginatedSubs","nextPage","prevPage","hasMore","formatTokenAmount","maxDecimals","parts","formatUnits","decimalPart","parseTokenAmount","parseUnits","formatSubs","formatUsdc","formatDate","date","formatDateTime","formatDuration","seconds","days","hours","minutes","shortenAddress","startChars","endChars","formatPercentage","formatFiatPrice","locale","useTokenBalance","useWallet","connectors","usePlan","setPlan","fetchPlan","usePlans","plans","setPlans","planIdsKey","fetchPlans","id","planPromises","results","usePlansByMerchant","totalPlans","count","allPlans","merchantPlans","ONE_SUBS","DEFAULT_REFRESH_INTERVAL","useSUBSPrice","refreshInterval","priceUsd","setPriceUsd","rawPrice","setRawPrice","intervalRef","fetchPrice","usdValue","frequencyLabel","secs","usePlanPrice","price","setPrice","isUsdDenominated","frequency","subsAmount","conversion","usdRaw","usdcAmount","usdcFormatted","quotedUsdc","useSubscryptsEvents","callbacks","isListening","setIsListening","onSubscriptionCreated","onSubscriptionPaid","onSubscriptionStopped","handleCreate","handlePay","payer","handleRecurring","useMerchantPlans","EXPIRING_SOON_THRESHOLD_MS","resolveSubscriptionStatus","input","isAutoRenewing","msUntilExpiry","daysUntilExpiry","useMerchantSubscribers","subscribers","setSubscribers","activeCount","setActiveCount","fetchSubscribers","totalLength","currentPageActive","useMerchantRevenue","plansLoading","plansError","revenue","setRevenue","calculateRevenue","targetPlans","allSubscriptionsPromises","planSubscriberCount","allSubscriptions","activeSubscriptions","SECONDS_PER_MONTH","totalMrr","monthlyAmount","mrrUsd","LoadingSpinner","jsx","useMultiPlanStatus","requireAll","setIsActive","checkPlans","hasAccess","active","SubscriptionGuard","fallbackUrl","loadingComponent","onAccessDenied","effectivePlanIds","isSinglePlan","singlePlan","multiPlan","Fragment","Modal","isOpen","onClose","title","size","handleEscape","e","sizeClasses","jsxs","ConfigurationStep","cycleLimit","onCycleLimitChange","autoRenew","onAutoRenewChange","paymentMethod","onPaymentMethodChange","onNext","onCancel","cycleLimitOptions","option","ERROR_CODE_MAP","DEFAULT_ERROR","getErrorCode","info","innerError","getErrorMessage","ErrorDisplay","onRetry","onDismiss","compact","className","suggestion","isRetryable","TransactionStep","onExecute","onBack","getStateMessage","isSuccess","isError","CheckoutWizard","onSuccess","onError","currentStep","setCurrentStep","setCycleLimit","setAutoRenew","setPaymentMethod","subscribe","handleConfigure","handleSubscribe","handleClose","SubscryptsButton","variant","isModalOpen","setIsModalOpen","isConnected","handleClick","handleSuccess","formatFrequency","formatAmount","divisor","whole","fraction","fractionStr","PlanCard","currency","showFields","onSubscribe","subscribeLabel","showSubscribeButton","featured","formattedAmount","formattedFrequency","cardClasses","PricingTable","columns","customOnSubscribe","onSubscriptionSuccess","onSubscriptionError","errorComponent","planConfigs","fetchedPlans","checkoutPlanId","setCheckoutPlanId","gridColumns","handleCheckoutClose","handleCheckoutSuccess","handleCheckoutError","gridClass","index","NetworkSwitchPrompt","currentChainId","onSwitch","ARBITRUM_ONE","SubscryptsErrorBoundary","Component","props","errorInfo","fallback","ConnectWalletModal","onConnect","connectingId","setConnectingId","availableConnectors","handleConnect","ConfirmDialog","confirmLabel","cancelLabel","onConfirm","ManageSubscriptionModal","onCancelled","onUpdated","showCancelConfirm","setShowCancelConfirm","handleCancel","handleToggleAutoRenew","handleUpdateCycles","SubscriptionCard","showManageButton","_showFiatPrice","onManage","showManageModal","setShowManageModal","getBadgeVariant","getBadgeLabel","getFrequencyLabel","handleManageClick","handleCancelled","handleUpdated","SubscriptionDashboard","showFiatPrices","emptyComponent","onSubscriptionCancelled","onSubscriptionUpdated","MerchantDashboard","_merchantAddress","revenueLoading","revenueError","selectedPlanId","setSelectedPlanId","subscriberTotal","subscribersLoading","canAccess","isPaymentDue","shouldRenew","getSubscriptionHealth"],"mappings":"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"}
|