@cookill/wallet-adapter 2.5.4 → 3.1.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/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * @cookill/wallet-adapter v2.5.0\n * Sheep Wallet adapter for Rialo blockchain dApps\n */\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type RialoChain = 'rialo:mainnet' | 'rialo:testnet' | 'rialo:devnet' | 'rialo:localnet';\nexport type RialoNetwork = 'mainnet' | 'testnet' | 'devnet' | 'localnet';\n\nexport interface WalletAccount {\n address: string;\n publicKey?: Uint8Array | string;\n label?: string;\n}\n\nexport interface TransactionRequest {\n to: string;\n value: string;\n data?: string;\n memo?: string;\n}\n\nexport interface TransactionResult {\n hash: string;\n signature?: string;\n status: 'pending' | 'confirmed' | 'failed';\n blockNumber?: number;\n}\n\nexport interface SignedMessage {\n signature: string;\n message: string;\n address: string;\n publicKey?: string;\n}\n\nexport interface BalanceResult {\n balance: string;\n balanceKelvins: string;\n formatted: string;\n}\n\nexport interface NetworkConfig {\n chainId: string;\n name: string;\n rpcUrl: string;\n wsUrl?: string;\n explorerUrl?: string;\n symbol: string;\n decimals: number;\n}\n\nexport interface WalletInfo {\n id: string;\n name: string;\n icon: string;\n installed?: boolean;\n downloadUrl?: string;\n}\n\nexport type WalletEvent = \n | 'connect' \n | 'disconnect' \n | 'accountsChanged'\n | 'networkChanged' \n | 'chainChanged'\n | 'error';\n\n// ============================================================================\n// Network Configurations\n// ============================================================================\n\nexport const NETWORKS: Record<RialoNetwork, NetworkConfig> = {\n mainnet: {\n chainId: 'rialo:mainnet',\n name: 'Rialo Mainnet',\n rpcUrl: 'https://mainnet.rialo.io:4101',\n wsUrl: 'wss://mainnet.rialo.io:4102',\n explorerUrl: 'https://explorer.rialo.io',\n symbol: 'RLO',\n decimals: 9,\n },\n testnet: {\n chainId: 'rialo:testnet',\n name: 'Rialo Testnet',\n rpcUrl: 'https://testnet.rialo.io:4101',\n wsUrl: 'wss://testnet.rialo.io:4102',\n explorerUrl: 'https://testnet.explorer.rialo.io',\n symbol: 'tRLO',\n decimals: 9,\n },\n devnet: {\n chainId: 'rialo:devnet',\n name: 'Rialo Devnet',\n rpcUrl: 'https://devnet.rialo.io:4101',\n wsUrl: 'wss://devnet.rialo.io:4102',\n explorerUrl: 'https://devnet.explorer.rialo.io',\n symbol: 'dRLO',\n decimals: 9,\n },\n localnet: {\n chainId: 'rialo:localnet',\n name: 'Rialo Localnet',\n rpcUrl: 'http://localhost:4101',\n wsUrl: 'ws://localhost:4102',\n explorerUrl: 'http://localhost:3000',\n symbol: 'lRLO',\n decimals: 9,\n },\n};\n\n// ============================================================================\n// Provider Interface\n// ============================================================================\n\nexport interface RialoProvider {\n // Metadata\n isRialo: boolean;\n isSheepWallet?: boolean;\n name?: string;\n walletName?: string;\n version: string;\n icon?: string;\n\n // Connection\n connect(options?: { silent?: boolean }): Promise<WalletAccount[]>;\n disconnect(): Promise<void>;\n isConnected(): Promise<boolean>;\n getAccounts(): Promise<WalletAccount[]>;\n\n // Transactions\n signTransaction(tx: TransactionRequest): Promise<{ signature: string; signedTransaction?: string; rawTransaction?: string }>;\n sendTransaction(tx: TransactionRequest): Promise<TransactionResult>;\n signAndSendTransaction(tx: TransactionRequest): Promise<TransactionResult>;\n signAllTransactions?(txs: TransactionRequest[]): Promise<{ signedTransactions: string[] }>;\n\n // Message signing\n signMessage(message: string | Uint8Array): Promise<SignedMessage>;\n\n // Network\n getNetwork(): Promise<RialoNetwork>;\n switchNetwork(network: RialoNetwork): Promise<{ success: boolean }>;\n getChainId(): Promise<string>;\n getBalance(address?: string): Promise<BalanceResult | string>;\n\n // Events\n on(event: WalletEvent, callback: (data: unknown) => void): () => void;\n off?(event: WalletEvent, callback: (data: unknown) => void): void;\n removeListener(event: WalletEvent, callback: (data: unknown) => void): void;\n removeAllListeners(event?: WalletEvent): void;\n\n // Utilities\n utils?: {\n isValidAddress(address: string): boolean;\n formatAddress(address: string, chars?: number): string;\n };\n\n // Wallet Standard\n features?: string[];\n supportsFeature?(feature: string): boolean;\n\n // State getters\n readonly connected?: boolean;\n readonly accounts?: WalletAccount[];\n readonly address?: string | null;\n readonly publicKey?: string | null;\n readonly network?: RialoNetwork;\n readonly chainId?: string;\n}\n\n// ============================================================================\n// Detection & Access\n// ============================================================================\n\nexport function isRialoInstalled(): boolean {\n if (typeof window === 'undefined') return false;\n return !!(window as RialoWindow).rialo?.isRialo;\n}\n\nexport function getRialoProvider(): RialoProvider | undefined {\n if (typeof window === 'undefined') return undefined;\n const rialo = (window as RialoWindow).rialo;\n return rialo?.isRialo ? rialo : undefined;\n}\n\nexport function waitForRialoProvider(timeout = 3000): Promise<RialoProvider | undefined> {\n return new Promise((resolve) => {\n if (isRialoInstalled()) {\n resolve(getRialoProvider());\n return;\n }\n\n let resolved = false;\n const checkInterval = setInterval(() => {\n if (isRialoInstalled() && !resolved) {\n resolved = true;\n clearInterval(checkInterval);\n resolve(getRialoProvider());\n }\n }, 100);\n\n setTimeout(() => {\n if (!resolved) {\n resolved = true;\n clearInterval(checkInterval);\n resolve(undefined);\n }\n }, timeout);\n\n // Also listen for initialization event\n const handler = () => {\n if (!resolved) {\n resolved = true;\n clearInterval(checkInterval);\n resolve(getRialoProvider());\n }\n };\n window.addEventListener('rialo#initialized', handler, { once: true });\n });\n}\n\n// ============================================================================\n// Simple Wallet Class (Non-React)\n// ============================================================================\n\nexport class RialoWallet {\n private provider: RialoProvider | undefined;\n private _connected = false;\n private _accounts: WalletAccount[] = [];\n private _network: RialoNetwork = 'devnet';\n private _listeners: Map<string, Set<() => void>> = new Map();\n\n constructor() {\n this.provider = getRialoProvider();\n this.setupEvents();\n }\n\n private setupEvents() {\n if (!this.provider) return;\n\n this.provider.on('disconnect', () => {\n this._connected = false;\n this._accounts = [];\n });\n\n this.provider.on('accountsChanged', (data: unknown) => {\n const accounts = data as WalletAccount[];\n this._accounts = accounts;\n });\n\n this.provider.on('networkChanged', (data: unknown) => {\n const { network } = data as { network: RialoNetwork };\n this._network = network;\n });\n }\n\n get isInstalled(): boolean {\n return isRialoInstalled();\n }\n\n get connected(): boolean {\n return this._connected;\n }\n\n get accounts(): WalletAccount[] {\n return this._accounts;\n }\n\n get activeAccount(): WalletAccount | undefined {\n return this._accounts[0];\n }\n\n get network(): RialoNetwork {\n return this._network;\n }\n\n get chainId(): string {\n return `rialo:${this._network}`;\n }\n\n async connect(): Promise<WalletAccount[]> {\n this.provider = getRialoProvider();\n if (!this.provider) {\n throw new Error('Rialo Wallet not installed. Download at https://rialo.io/wallet');\n }\n\n const accounts = await this.provider.connect();\n this._accounts = accounts;\n this._connected = true;\n\n const network = await this.provider.getNetwork();\n this._network = network;\n\n return this._accounts;\n }\n\n async disconnect(): Promise<void> {\n if (this.provider) {\n await this.provider.disconnect();\n }\n this._connected = false;\n this._accounts = [];\n }\n\n async signMessage(message: string): Promise<SignedMessage> {\n if (!this.provider || !this._connected) {\n throw new Error('Wallet not connected');\n }\n return this.provider.signMessage(message);\n }\n\n async signTransaction(tx: TransactionRequest): Promise<string> {\n if (!this.provider || !this._connected) {\n throw new Error('Wallet not connected');\n }\n const result = await this.provider.signTransaction(tx);\n return result.signature;\n }\n\n async sendTransaction(tx: TransactionRequest): Promise<TransactionResult> {\n if (!this.provider || !this._connected) {\n throw new Error('Wallet not connected');\n }\n return this.provider.sendTransaction(tx);\n }\n\n async signAndSendTransaction(tx: TransactionRequest): Promise<TransactionResult> {\n if (!this.provider || !this._connected) {\n throw new Error('Wallet not connected');\n }\n return this.provider.signAndSendTransaction(tx);\n }\n\n async getBalance(address?: string): Promise<string> {\n if (!this.provider) {\n throw new Error('Wallet not available');\n }\n const result = await this.provider.getBalance(address);\n if (typeof result === 'string') return result;\n return result.balance;\n }\n\n async switchNetwork(network: RialoNetwork): Promise<void> {\n if (!this.provider) {\n throw new Error('Wallet not available');\n }\n await this.provider.switchNetwork(network);\n this._network = network;\n }\n\n on(event: WalletEvent, callback: (data: unknown) => void): () => void {\n if (!this.provider) {\n return () => {};\n }\n return this.provider.on(event, callback);\n }\n}\n\n// ============================================================================\n// Utilities\n// ============================================================================\n\nexport function formatAddress(address: string, chars = 4): string {\n if (!address) return '';\n if (address.length <= chars * 2 + 3) return address;\n return `${address.slice(0, chars + 2)}...${address.slice(-chars)}`;\n}\n\nexport function formatBalance(kelvins: string | bigint, decimals = 4): string {\n const value = typeof kelvins === 'string' ? BigInt(kelvins || '0') : kelvins;\n const rlo = Number(value) / 1_000_000_000;\n return rlo.toFixed(decimals);\n}\n\nexport function parseBalance(rlo: string | number): bigint {\n const value = typeof rlo === 'string' ? parseFloat(rlo) : rlo;\n return BigInt(Math.floor(value * 1_000_000_000));\n}\n\nexport function isValidAddress(address: string): boolean {\n if (!address || typeof address !== 'string') return false;\n if (address.length < 32 || address.length > 50) return false;\n return /^[1-9A-HJ-NP-Za-km-z]+$/.test(address);\n}\n\nexport function toChainId(network: RialoNetwork): RialoChain {\n return `rialo:${network}` as RialoChain;\n}\n\nexport function fromChainId(chainId: RialoChain): RialoNetwork {\n return chainId.replace('rialo:', '') as RialoNetwork;\n}\n\n// ============================================================================\n// Window Extension\n// ============================================================================\n\ninterface RialoWindow extends Window {\n rialo?: RialoProvider;\n}\n\ndeclare global {\n interface Window {\n rialo?: RialoProvider;\n Rialo?: RialoProvider;\n }\n}\n\n// ============================================================================\n// Exports\n// ============================================================================\n\nexport default RialoWallet;\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/core/types.ts","../src/core/provider.ts","../src/core/utils.ts","../src/core/wallet.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * @cookill/wallet-adapter v3.1.0\n * Core type definitions\n * \n * Includes support for:\n * - REX (Rialo Extended Execution) — confidential computation transactions\n * - SfS (Stake-for-Service) — gasless transactions via staking yield\n * - Scan-to-Connect — QR-based cross-device wallet pairing\n */\n\n// ============================================================================\n// Network & Chain Types\n// ============================================================================\n\nexport type RialoNetwork = 'mainnet' | 'testnet' | 'devnet' | 'localnet';\nexport type RialoChainId = `rialo:${RialoNetwork}`;\n\nexport interface NetworkConfig {\n chainId: RialoChainId;\n name: string;\n rpcUrl: string;\n wsUrl?: string;\n explorerUrl?: string;\n symbol: string;\n decimals: number;\n supportsREX?: boolean;\n supportsSfS?: boolean;\n}\n\nexport const NETWORKS: Record<RialoNetwork, NetworkConfig> = {\n mainnet: {\n chainId: 'rialo:mainnet',\n name: 'Rialo Mainnet',\n rpcUrl: 'https://mainnet.rialo.io:4101',\n wsUrl: 'wss://mainnet.rialo.io:4102',\n explorerUrl: 'https://explorer.rialo.io',\n symbol: 'RLO',\n decimals: 9,\n supportsREX: true,\n supportsSfS: true,\n },\n testnet: {\n chainId: 'rialo:testnet',\n name: 'Rialo Testnet',\n rpcUrl: 'https://testnet.rialo.io:4101',\n wsUrl: 'wss://testnet.rialo.io:4102',\n explorerUrl: 'https://testnet.explorer.rialo.io',\n symbol: 'tRLO',\n decimals: 9,\n supportsREX: true,\n supportsSfS: true,\n },\n devnet: {\n chainId: 'rialo:devnet',\n name: 'Rialo Devnet',\n rpcUrl: 'https://devnet.rialo.io:4101',\n wsUrl: 'wss://devnet.rialo.io:4102',\n explorerUrl: 'https://devnet.explorer.rialo.io',\n symbol: 'dRLO',\n decimals: 9,\n supportsREX: true,\n supportsSfS: true,\n },\n localnet: {\n chainId: 'rialo:localnet',\n name: 'Rialo Localnet',\n rpcUrl: 'http://localhost:4101',\n wsUrl: 'ws://localhost:4102',\n explorerUrl: 'http://localhost:3000',\n symbol: 'lRLO',\n decimals: 9,\n supportsREX: false,\n supportsSfS: false,\n },\n};\n\n// ============================================================================\n// Account Types\n// ============================================================================\n\nexport interface WalletAccount {\n address: string;\n publicKey?: string | Uint8Array;\n label?: string;\n}\n\n// ============================================================================\n// Transaction Types\n// ============================================================================\n\nexport interface TransactionRequest {\n to: string;\n value: string;\n data?: string;\n memo?: string;\n /** If true, attempt to pay gas via Stake-for-Service credits */\n gasless?: boolean;\n /** REX confidential execution context */\n rex?: REXConfig;\n}\n\nexport interface TransactionResult {\n hash: string;\n signature?: string;\n status: 'pending' | 'confirmed' | 'failed';\n blockNumber?: number;\n /** Whether gas was paid via SfS credits */\n gasless?: boolean;\n /** REX execution proof if confidential */\n rexProof?: string;\n}\n\nexport interface SignedMessage {\n signature: string;\n message: string;\n address: string;\n publicKey?: string;\n}\n\nexport interface BalanceResult {\n balance: string;\n formatted: string;\n}\n\n// ============================================================================\n// REX (Rialo Extended Execution) — Confidential Computation\n// ============================================================================\n\n/**\n * REX enables privacy-preserving computation on Rialo.\n * Transactions can be executed confidentially using TEEs, MPC, or FHE\n * without exposing inputs to the public blockchain.\n */\n\n/** Privacy technology used for confidential computation */\nexport type REXPrivacyMode = 'tee' | 'mpc' | 'fhe' | 'auto';\n\nexport interface REXConfig {\n /** Enable confidential execution */\n confidential: boolean;\n /** Privacy technology to use (default: 'auto' — protocol selects optimal) */\n privacyMode?: REXPrivacyMode;\n /** Encrypted inputs (base64-encoded ciphertext) */\n encryptedInputs?: string;\n /** REX program ID to execute */\n programId?: string;\n /** Whether output should remain encrypted for future computation */\n keepEncrypted?: boolean;\n /** Access control — who can decrypt the result */\n accessPolicy?: REXAccessPolicy;\n}\n\nexport interface REXAccessPolicy {\n /** Addresses allowed to decrypt the result */\n allowedDecryptors: string[];\n /** Expiry timestamp (ms) for access */\n expiresAt?: number;\n}\n\nexport interface REXTransactionResult extends TransactionResult {\n /** Attestation proof from TEE/MPC */\n attestation?: string;\n /** Encrypted output (if keepEncrypted was true) */\n encryptedOutput?: string;\n /** Public output (if computation produced public results) */\n publicOutput?: string;\n}\n\n/** REX capabilities query result */\nexport interface REXCapabilities {\n supported: boolean;\n privacyModes: REXPrivacyMode[];\n maxInputSize: number;\n programs: string[];\n}\n\n// ============================================================================\n// Stake-for-Service (SfS) — Gasless Transactions\n// ============================================================================\n\n/**\n * SfS converts staking yield into service credits that automatically\n * pay for network costs (gas, storage, scheduled executions).\n * Users stake RLO, set a routing fraction, and the ServicePaymaster\n * mints credits from their yield.\n */\n\nexport interface SfSPosition {\n /** Position ID */\n id: string;\n /** Staked principal in kelvins */\n principal: string;\n /** Validator/pool receiving the delegation */\n validator: string;\n /** Fraction of yield routed to service credits (0.0 - 1.0) */\n routingFraction: number;\n /** Current service credit balance */\n creditBalance: string;\n /** Estimated credits per epoch */\n creditsPerEpoch: string;\n /** Position status */\n status: 'active' | 'pending' | 'closed';\n /** Creation timestamp */\n createdAt: number;\n}\n\nexport interface SfSCreateParams {\n /** Amount of RLO to stake (in kelvins) */\n amount: string;\n /** Validator address to delegate to */\n validator: string;\n /** Fraction of yield to route to service credits (0.0 - 1.0) */\n routingFraction: number;\n}\n\nexport interface SfSUpdateParams {\n /** Position ID to update */\n positionId: string;\n /** New routing fraction (0.0 - 1.0) */\n routingFraction?: number;\n}\n\nexport interface SfSCreditBalance {\n /** Available service credits */\n available: string;\n /** Credits used this epoch */\n usedThisEpoch: string;\n /** Total credits earned */\n totalEarned: string;\n /** Estimated credits per epoch */\n estimatedPerEpoch: string;\n}\n\n// ============================================================================\n// Scan-to-Connect (QR-based Cross-Device Pairing)\n// ============================================================================\n\n/**\n * Enables connecting a wallet on one device to a dApp on another device\n * via QR code scanning. Supports bidirectional flow:\n * - dApp shows QR → wallet scans to connect\n * - Wallet shows QR → dApp scans to connect\n */\n\nexport interface ScanConnectSession {\n /** Unique session identifier */\n sessionId: string;\n /** Session topic for relay */\n topic: string;\n /** Relay server URL */\n relay: string;\n /** Session encryption key (hex) */\n symmetricKey: string;\n /** Originator: 'dapp' or 'wallet' */\n origin: 'dapp' | 'wallet';\n /** dApp metadata */\n dappMetadata?: ScanConnectDAppMetadata;\n /** Wallet metadata */\n walletMetadata?: ScanConnectWalletMetadata;\n /** Requested chain IDs */\n chains: RialoChainId[];\n /** Expiry timestamp */\n expiresAt: number;\n}\n\nexport interface ScanConnectDAppMetadata {\n name: string;\n url: string;\n icon?: string;\n description?: string;\n}\n\nexport interface ScanConnectWalletMetadata {\n name: string;\n icon?: string;\n version?: string;\n}\n\n/** URI format for scan-to-connect QR codes */\nexport interface ScanConnectURI {\n /** Full URI string (rialo-wc://...) */\n uri: string;\n /** Parsed session info */\n session: ScanConnectSession;\n}\n\nexport type ScanConnectStatus = \n | 'idle'\n | 'generating' // Generating QR/session\n | 'waiting' // Waiting for counterpart to scan\n | 'scanned' // QR scanned, awaiting approval\n | 'approving' // User reviewing connection\n | 'connected' // Successfully connected\n | 'expired' // Session expired\n | 'rejected' // User rejected\n | 'error';\n\n// ============================================================================\n// Wallet Info\n// ============================================================================\n\nexport interface WalletInfo {\n id: string;\n name: string;\n icon: string;\n installed?: boolean;\n downloadUrl?: string;\n supportsREX?: boolean;\n supportsSfS?: boolean;\n supportsScanConnect?: boolean;\n}\n\n// ============================================================================\n// Provider Interface (what window.rialo exposes)\n// ============================================================================\n\nexport type WalletEventType = \n | 'connect' \n | 'disconnect' \n | 'accountsChanged'\n | 'networkChanged' \n | 'chainChanged'\n | 'scanConnect' // Scan-to-connect session events\n | 'sfsUpdate' // SfS position/credit updates\n | 'error';\n\nexport interface RialoProvider {\n // Identity\n isRialo: boolean;\n isSheepWallet?: boolean;\n version: string;\n \n // Connection\n connect(options?: { silent?: boolean }): Promise<Array<string | WalletAccount>>;\n disconnect(): Promise<void>;\n isConnected(): Promise<boolean>;\n getAccounts(): Promise<Array<string | WalletAccount>>;\n \n // Transactions\n signTransaction(tx: TransactionRequest): Promise<{ signature: string; rawTransaction?: string }>;\n sendTransaction(tx: TransactionRequest): Promise<TransactionResult>;\n signAndSendTransaction(tx: TransactionRequest): Promise<TransactionResult>;\n \n // Message signing\n signMessage(message: string | Uint8Array): Promise<SignedMessage>;\n \n // Network\n getNetwork(): Promise<RialoNetwork>;\n switchNetwork(network: RialoNetwork): Promise<{ success: boolean }>;\n getBalance(address?: string): Promise<BalanceResult | string>;\n \n // REX — Confidential Computation\n getREXCapabilities?(): Promise<REXCapabilities>;\n submitREXTransaction?(tx: TransactionRequest): Promise<REXTransactionResult>;\n \n // SfS — Stake-for-Service (Gasless)\n getSfSPositions?(): Promise<SfSPosition[]>;\n createSfSPosition?(params: SfSCreateParams): Promise<SfSPosition>;\n updateSfSPosition?(params: SfSUpdateParams): Promise<SfSPosition>;\n closeSfSPosition?(positionId: string): Promise<{ success: boolean }>;\n getSfSCredits?(): Promise<SfSCreditBalance>;\n \n // Scan-to-Connect\n createScanSession?(origin: 'wallet'): Promise<ScanConnectURI>;\n approveScanSession?(sessionId: string): Promise<WalletAccount[]>;\n rejectScanSession?(sessionId: string): Promise<void>;\n \n // Events\n on(event: WalletEventType, callback: (data: unknown) => void): () => void;\n removeListener(event: WalletEventType, callback: (data: unknown) => void): void;\n removeAllListeners(event?: WalletEventType): void;\n}\n\n// Window extension\ndeclare global {\n interface Window {\n rialo?: RialoProvider;\n }\n}\n","/**\n * @cookill/wallet-adapter v3.0.0\n * Provider detection and access utilities\n * \n * CRITICAL: All provider access is non-blocking and defensive\n */\n\nimport type { RialoProvider } from './types';\n\n/**\n * Check if Rialo/Sheep Wallet is installed\n * This is synchronous and never blocks\n */\nexport function isInstalled(): boolean {\n if (typeof window === 'undefined') return false;\n try {\n return !!window.rialo?.isRialo;\n } catch {\n return false;\n }\n}\n\n/**\n * Get the provider reference (synchronous)\n * Returns undefined if not installed\n */\nexport function getProvider(): RialoProvider | undefined {\n if (typeof window === 'undefined') return undefined;\n try {\n const provider = window.rialo;\n if (provider?.isRialo) return provider;\n } catch {}\n return undefined;\n}\n\n/**\n * Wait for provider to become available\n * Uses polling + event listener, with guaranteed timeout\n * \n * @param timeout Maximum time to wait in ms (default 3000)\n */\nexport function waitForProvider(timeout = 3000): Promise<RialoProvider | undefined> {\n return new Promise((resolve) => {\n // Already available?\n const existing = getProvider();\n if (existing) {\n resolve(existing);\n return;\n }\n\n let resolved = false;\n let checkInterval: ReturnType<typeof setInterval> | null = null;\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n\n const cleanup = () => {\n resolved = true;\n if (checkInterval) clearInterval(checkInterval);\n if (timeoutId) clearTimeout(timeoutId);\n };\n\n const done = (provider: RialoProvider | undefined) => {\n if (resolved) return;\n cleanup();\n resolve(provider);\n };\n\n // Poll every 100ms\n checkInterval = setInterval(() => {\n const p = getProvider();\n if (p) done(p);\n }, 100);\n\n // Listen for initialization event\n const onInit = () => done(getProvider());\n window.addEventListener('rialo#initialized', onInit, { once: true });\n\n // Guaranteed timeout\n timeoutId = setTimeout(() => {\n window.removeEventListener('rialo#initialized', onInit);\n done(undefined);\n }, timeout);\n });\n}\n\n/**\n * Promise timeout wrapper\n * Ensures promises never hang indefinitely\n */\nexport function withTimeout<T>(\n promise: Promise<T>,\n ms: number,\n errorMessage = 'Operation timed out'\n): Promise<T> {\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n\n const timeout = new Promise<never>((_, reject) => {\n timeoutId = setTimeout(() => reject(new Error(errorMessage)), ms);\n });\n\n return Promise.race([promise, timeout]).finally(() => {\n if (timeoutId) clearTimeout(timeoutId);\n }) as Promise<T>;\n}\n","/**\n * @cookill/wallet-adapter v3.0.0\n * Utility functions\n */\n\nimport type { WalletAccount, RialoNetwork, RialoChainId } from './types';\n\n/**\n * Format address for display (truncated)\n */\nexport function formatAddress(address: string, chars = 4): string {\n if (!address) return '';\n if (address.length <= chars * 2 + 3) return address;\n return `${address.slice(0, chars + 2)}...${address.slice(-chars)}`;\n}\n\n/**\n * Format balance from kelvins to RLO\n */\nexport function formatBalance(kelvins: string | bigint, decimals = 4): string {\n const value = typeof kelvins === 'string' ? BigInt(kelvins || '0') : kelvins;\n const rlo = Number(value) / 1_000_000_000;\n return rlo.toFixed(decimals);\n}\n\n/**\n * Parse RLO amount to kelvins\n */\nexport function parseBalance(rlo: string | number): bigint {\n const value = typeof rlo === 'string' ? parseFloat(rlo) : rlo;\n return BigInt(Math.floor(value * 1_000_000_000));\n}\n\n/**\n * Validate Rialo address format\n */\nexport function isValidAddress(address: string): boolean {\n if (!address || typeof address !== 'string') return false;\n if (address.length < 32 || address.length > 50) return false;\n return /^[1-9A-HJ-NP-Za-km-z]+$/.test(address);\n}\n\n/**\n * Convert network name to chain ID\n */\nexport function toChainId(network: RialoNetwork): RialoChainId {\n return `rialo:${network}`;\n}\n\n/**\n * Extract network from chain ID\n */\nexport function fromChainId(chainId: RialoChainId): RialoNetwork {\n return chainId.replace('rialo:', '') as RialoNetwork;\n}\n\n/**\n * Normalize account data (handles both string and object formats)\n * CRITICAL: Extension can return either string[] or WalletAccount[]\n */\nexport function normalizeAccounts(accounts: Array<string | WalletAccount>): WalletAccount[] {\n if (!Array.isArray(accounts)) return [];\n \n return accounts.map((acc): WalletAccount => {\n if (typeof acc === 'string') {\n return { address: acc, publicKey: acc };\n }\n return {\n address: acc.address,\n publicKey: acc.publicKey || acc.address,\n label: acc.label,\n };\n });\n}\n","/**\n * @cookill/wallet-adapter v3.1.0\n * Pure JavaScript wallet class (no React dependency)\n * \n * Supports:\n * - Standard connect/disconnect/sign operations\n * - REX (Rialo Extended Execution) confidential transactions\n * - SfS (Stake-for-Service) gasless transactions\n * - Scan-to-Connect QR-based pairing\n * \n * Usage:\n * const wallet = new SheepWallet();\n * if (!wallet.isInstalled) { ... prompt install ... }\n * const accounts = await wallet.connect();\n */\n\nimport type { \n RialoProvider, \n WalletAccount, \n RialoNetwork,\n TransactionRequest, \n TransactionResult, \n SignedMessage,\n REXCapabilities,\n REXTransactionResult,\n SfSPosition,\n SfSCreateParams,\n SfSUpdateParams,\n SfSCreditBalance,\n ScanConnectURI,\n ScanConnectSession,\n ScanConnectStatus,\n} from './types';\nimport { isInstalled, getProvider, withTimeout } from './provider';\nimport { normalizeAccounts } from './utils';\n\n// Connection timeout (20 seconds)\nconst CONNECT_TIMEOUT = 20_000;\n\n// Other operation timeout (30 seconds)\nconst OPERATION_TIMEOUT = 30_000;\n\nexport class SheepWallet {\n private _provider: RialoProvider | undefined;\n private _connected = false;\n private _accounts: WalletAccount[] = [];\n private _network: RialoNetwork = 'devnet';\n private _cleanupFns: Array<() => void> = [];\n\n constructor() {\n this._provider = getProvider();\n this._setupEvents();\n }\n\n // =========================================================================\n // Getters (all synchronous, never block)\n // =========================================================================\n\n get isInstalled(): boolean {\n return isInstalled();\n }\n\n get connected(): boolean {\n return this._connected;\n }\n\n get accounts(): WalletAccount[] {\n return [...this._accounts];\n }\n\n get activeAccount(): WalletAccount | undefined {\n return this._accounts[0];\n }\n\n get address(): string | undefined {\n return this._accounts[0]?.address;\n }\n\n get network(): RialoNetwork {\n return this._network;\n }\n\n get chainId(): string {\n return `rialo:${this._network}`;\n }\n\n // =========================================================================\n // Connection (with timeout protection)\n // =========================================================================\n\n async connect(): Promise<WalletAccount[]> {\n // Refresh provider reference\n this._provider = getProvider();\n \n if (!this._provider) {\n throw new Error('Sheep Wallet not installed. Get it at https://rialo.io/wallet');\n }\n\n try {\n const rawAccounts = await withTimeout(\n this._provider.connect(),\n CONNECT_TIMEOUT,\n 'Connection timed out. Please open Sheep Wallet extension and approve the request.'\n );\n\n this._accounts = normalizeAccounts(rawAccounts);\n this._connected = true;\n\n try {\n this._network = await withTimeout(\n this._provider.getNetwork(),\n 5_000,\n 'Network request timed out'\n );\n } catch {\n // Keep default network on failure\n }\n\n return this._accounts;\n } catch (error) {\n this._connected = false;\n this._accounts = [];\n throw error;\n }\n }\n\n async disconnect(): Promise<void> {\n try {\n if (this._provider) {\n await withTimeout(\n this._provider.disconnect(),\n 5_000,\n 'Disconnect timed out'\n );\n }\n } catch {\n // Ignore disconnect errors\n }\n \n this._connected = false;\n this._accounts = [];\n }\n\n // =========================================================================\n // Silent session check (for auto-connect, never triggers approval)\n // =========================================================================\n\n async checkSession(): Promise<WalletAccount[] | null> {\n if (!this._provider) return null;\n\n try {\n const isConn = await withTimeout(\n this._provider.isConnected(),\n 3_000,\n 'Session check timed out'\n );\n\n if (!isConn) return null;\n\n const rawAccounts = await withTimeout(\n this._provider.getAccounts(),\n 3_000,\n 'Get accounts timed out'\n );\n\n const accounts = normalizeAccounts(rawAccounts);\n if (accounts.length > 0) {\n this._accounts = accounts;\n this._connected = true;\n\n try {\n this._network = await this._provider.getNetwork();\n } catch {}\n\n return accounts;\n }\n } catch {\n // Session check failure is not an error\n }\n\n return null;\n }\n\n // =========================================================================\n // Transactions\n // =========================================================================\n\n async signMessage(message: string): Promise<SignedMessage> {\n this._ensureConnected();\n \n return withTimeout(\n this._provider!.signMessage(message),\n OPERATION_TIMEOUT,\n 'Sign message timed out. Please check Sheep Wallet.'\n );\n }\n\n async signTransaction(tx: TransactionRequest): Promise<string> {\n this._ensureConnected();\n \n const result = await withTimeout(\n this._provider!.signTransaction(tx),\n OPERATION_TIMEOUT,\n 'Sign transaction timed out. Please check Sheep Wallet.'\n );\n \n return result.signature;\n }\n\n async sendTransaction(tx: TransactionRequest): Promise<TransactionResult> {\n this._ensureConnected();\n \n return withTimeout(\n this._provider!.sendTransaction(tx),\n OPERATION_TIMEOUT,\n 'Send transaction timed out. Please check Sheep Wallet.'\n );\n }\n\n async signAndSendTransaction(tx: TransactionRequest): Promise<TransactionResult> {\n this._ensureConnected();\n \n return withTimeout(\n this._provider!.signAndSendTransaction(tx),\n OPERATION_TIMEOUT,\n 'Transaction timed out. Please check Sheep Wallet.'\n );\n }\n\n // =========================================================================\n // REX — Rialo Extended Execution (Confidential Computation)\n // =========================================================================\n\n /**\n * Check if the connected wallet/network supports REX\n */\n async getREXCapabilities(): Promise<REXCapabilities> {\n if (!this._provider?.getREXCapabilities) {\n return {\n supported: false,\n privacyModes: [],\n maxInputSize: 0,\n programs: [],\n };\n }\n\n return withTimeout(\n this._provider.getREXCapabilities(),\n 10_000,\n 'REX capabilities request timed out'\n );\n }\n\n /**\n * Submit a confidential transaction via REX\n * The transaction inputs are encrypted and executed in a TEE/MPC/FHE environment\n */\n async submitREXTransaction(tx: TransactionRequest): Promise<REXTransactionResult> {\n this._ensureConnected();\n\n if (!tx.rex?.confidential) {\n throw new Error('Transaction must have rex.confidential = true for REX execution');\n }\n\n if (this._provider?.submitREXTransaction) {\n return withTimeout(\n this._provider.submitREXTransaction(tx),\n OPERATION_TIMEOUT,\n 'REX transaction timed out. Please check Sheep Wallet.'\n );\n }\n\n // Fallback: submit as regular transaction with REX metadata\n const result = await this.signAndSendTransaction(tx);\n return {\n ...result,\n attestation: undefined,\n encryptedOutput: undefined,\n publicOutput: undefined,\n };\n }\n\n /**\n * Send a gasless transaction using Stake-for-Service credits\n * Automatically sets tx.gasless = true\n */\n async sendGaslessTransaction(tx: Omit<TransactionRequest, 'gasless'>): Promise<TransactionResult> {\n this._ensureConnected();\n \n // Check if user has SfS credits\n const credits = await this.getSfSCredits();\n if (BigInt(credits.available) <= 0n) {\n throw new Error('No SfS service credits available. Create a Stake-for-Service position first.');\n }\n\n return this.signAndSendTransaction({ ...tx, gasless: true });\n }\n\n // =========================================================================\n // SfS — Stake-for-Service (Gasless via Staking Yield)\n // =========================================================================\n\n /**\n * Get all Stake-for-Service positions for the connected account\n */\n async getSfSPositions(): Promise<SfSPosition[]> {\n this._ensureConnected();\n\n if (this._provider?.getSfSPositions) {\n return withTimeout(\n this._provider.getSfSPositions(),\n 10_000,\n 'SfS positions request timed out'\n );\n }\n\n return [];\n }\n\n /**\n * Create a new Stake-for-Service position\n * Stakes RLO and routes a fraction of yield to service credits\n */\n async createSfSPosition(params: SfSCreateParams): Promise<SfSPosition> {\n this._ensureConnected();\n\n if (params.routingFraction < 0 || params.routingFraction > 1) {\n throw new Error('Routing fraction must be between 0.0 and 1.0');\n }\n\n if (!this._provider?.createSfSPosition) {\n throw new Error('Stake-for-Service not supported by this wallet version');\n }\n\n return withTimeout(\n this._provider.createSfSPosition(params),\n OPERATION_TIMEOUT,\n 'SfS position creation timed out. Please check Sheep Wallet.'\n );\n }\n\n /**\n * Update an existing SfS position (e.g., change routing fraction)\n */\n async updateSfSPosition(params: SfSUpdateParams): Promise<SfSPosition> {\n this._ensureConnected();\n\n if (!this._provider?.updateSfSPosition) {\n throw new Error('Stake-for-Service not supported by this wallet version');\n }\n\n return withTimeout(\n this._provider.updateSfSPosition(params),\n OPERATION_TIMEOUT,\n 'SfS position update timed out'\n );\n }\n\n /**\n * Close an SfS position and unstake\n */\n async closeSfSPosition(positionId: string): Promise<{ success: boolean }> {\n this._ensureConnected();\n\n if (!this._provider?.closeSfSPosition) {\n throw new Error('Stake-for-Service not supported by this wallet version');\n }\n\n return withTimeout(\n this._provider.closeSfSPosition(positionId),\n OPERATION_TIMEOUT,\n 'SfS position close timed out'\n );\n }\n\n /**\n * Get current SfS service credit balance\n */\n async getSfSCredits(): Promise<SfSCreditBalance> {\n this._ensureConnected();\n\n if (this._provider?.getSfSCredits) {\n return withTimeout(\n this._provider.getSfSCredits(),\n 10_000,\n 'SfS credit balance request timed out'\n );\n }\n\n return {\n available: '0',\n usedThisEpoch: '0',\n totalEarned: '0',\n estimatedPerEpoch: '0',\n };\n }\n\n // =========================================================================\n // Scan-to-Connect (QR-based Cross-Device Pairing)\n // =========================================================================\n\n /**\n * Generate a scan-to-connect URI from the wallet side\n * Returns a URI that can be displayed as QR code for dApps to scan\n */\n async createScanSession(): Promise<ScanConnectURI> {\n if (!this._provider?.createScanSession) {\n throw new Error('Scan-to-Connect not supported by this wallet version');\n }\n\n return withTimeout(\n this._provider.createScanSession('wallet'),\n 10_000,\n 'Scan session creation timed out'\n );\n }\n\n /**\n * Approve a scan-to-connect session (after wallet scans dApp QR)\n */\n async approveScanSession(sessionId: string): Promise<WalletAccount[]> {\n if (!this._provider?.approveScanSession) {\n throw new Error('Scan-to-Connect not supported by this wallet version');\n }\n\n const accounts = await withTimeout(\n this._provider.approveScanSession(sessionId),\n CONNECT_TIMEOUT,\n 'Scan session approval timed out'\n );\n\n this._accounts = normalizeAccounts(accounts as Array<string | WalletAccount>);\n this._connected = true;\n\n return this._accounts;\n }\n\n /**\n * Reject a scan-to-connect session\n */\n async rejectScanSession(sessionId: string): Promise<void> {\n if (!this._provider?.rejectScanSession) {\n return;\n }\n\n await withTimeout(\n this._provider.rejectScanSession(sessionId),\n 5_000,\n 'Scan session rejection timed out'\n );\n }\n\n // =========================================================================\n // Balance & Network\n // =========================================================================\n\n async getBalance(address?: string): Promise<string> {\n if (!this._provider) {\n throw new Error('Wallet not available');\n }\n\n const result = await withTimeout(\n this._provider.getBalance(address),\n 10_000,\n 'Balance request timed out'\n );\n\n return typeof result === 'string' ? result : result.balance;\n }\n\n async switchNetwork(network: RialoNetwork): Promise<void> {\n if (!this._provider) {\n throw new Error('Wallet not available');\n }\n\n await withTimeout(\n this._provider.switchNetwork(network),\n 10_000,\n 'Switch network timed out'\n );\n\n this._network = network;\n }\n\n // =========================================================================\n // Events\n // =========================================================================\n\n on(event: string, callback: (data: unknown) => void): () => void {\n if (!this._provider) {\n return () => {};\n }\n\n const cleanup = this._provider.on(event as any, callback);\n this._cleanupFns.push(cleanup);\n return cleanup;\n }\n\n destroy(): void {\n this._cleanupFns.forEach(fn => {\n try { fn(); } catch {}\n });\n this._cleanupFns = [];\n this._connected = false;\n this._accounts = [];\n }\n\n // =========================================================================\n // Private\n // =========================================================================\n\n private _ensureConnected(): void {\n if (!this._provider) {\n throw new Error('Sheep Wallet not installed');\n }\n if (!this._connected || this._accounts.length === 0) {\n throw new Error('Wallet not connected');\n }\n }\n\n private _setupEvents(): void {\n if (!this._provider) return;\n\n const onDisconnect = () => {\n this._connected = false;\n this._accounts = [];\n };\n\n const onAccountsChanged = (data: unknown) => {\n const raw = data as Array<string | WalletAccount>;\n this._accounts = normalizeAccounts(raw);\n };\n\n const onNetworkChanged = (data: unknown) => {\n const { network } = data as { network: RialoNetwork };\n if (network) this._network = network;\n };\n\n this._cleanupFns.push(\n this._provider.on('disconnect', onDisconnect),\n this._provider.on('accountsChanged', onAccountsChanged),\n this._provider.on('networkChanged', onNetworkChanged)\n );\n }\n}\n\nexport default SheepWallet;\n"]}