{"version":3,"sources":["../../src/env.ts","../../src/bridge.ts","../../src/solana/wallet-adapter.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["import type { CherryPlatform, CherryEnvironment } from './types';\n\nexport interface DetectPlatformOptions {\n  /**\n   * When `true`, only Cherry-injected signals are accepted:\n   *   - `window.__cherry` for mobile WebView\n   *   - `cherry_embed=1` query parameter for web iframe\n   *\n   * Fallbacks (`ReactNativeWebView`, plain `window.parent !== window`) are\n   * disabled. Use this once all Cherry hosts you target have been updated to\n   * inject the new signals, to eliminate false positives (e.g. wallet\n   * in-app browsers that also run inside a WebView).\n   *\n   * Default: `false` (fallbacks enabled for backward compatibility).\n   */\n  strict?: boolean;\n}\n\n/**\n * Detect whether we're running inside Cherry messenger.\n *\n * WebView (mobile):\n *   - Primary:  `window.__cherry` — injected by Cherry before page loads\n *   - Fallback: `ReactNativeWebView` — present in any RN WebView (for older\n *               Cherry builds that don't inject `__cherry` yet)\n *               Disabled when `strict: true`.\n *\n * iframe (web):\n *   - Primary:  `cherry_embed=1` query parameter (set by Cherry host)\n *   - Fallback: plain `window.parent !== window` (for older Cherry builds\n *               that don't set the param yet)\n *               Disabled when `strict: true`.\n *\n * The fallback paths will be removed in a future major version once all\n * Cherry hosts are updated.\n */\nexport function detectPlatform(options: DetectPlatformOptions = {}): CherryPlatform {\n  const { strict = false } = options;\n\n  if (typeof window === 'undefined') return 'standalone';\n\n  // Cherry-injected primary signals (fast path, no ambiguity).\n  if ((window as unknown as { __cherry?: boolean }).__cherry) return 'webview';\n  if (new URLSearchParams(window.location.search).get('cherry_embed') === '1') return 'iframe';\n\n  if (strict) return 'standalone';\n\n  // Fallback heuristics — order matters:\n  // 1) Any nested iframe is iframe transport. This MUST run before the\n  //    ReactNativeWebView check, otherwise Phantom mobile in-app browser\n  //    (a RN WebView that injects window.ReactNativeWebView and then loads\n  //    Cherry, which loads our miniapp inside an iframe) gets misclassified\n  //    as a Cherry-mobile RN host and the SDK posts to the native bridge\n  //    instead of the parent frame.\n  if (window.parent !== window) return 'iframe';\n  // 2) Top frame with a RN WebView bridge — this is the real Cherry-mobile\n  //    case (miniapp loaded directly by the RN host, no iframe in between).\n  if ((window as unknown as { ReactNativeWebView?: unknown }).ReactNativeWebView) return 'webview';\n\n  return 'standalone';\n}\n\nexport function isInsideCherry(options: DetectPlatformOptions = {}): boolean {\n  return detectPlatform(options) !== 'standalone';\n}\n\nexport function getCherryEnvironment(options: DetectPlatformOptions = {}): CherryEnvironment {\n  const platform = detectPlatform(options);\n  return {\n    isEmbedded: platform !== 'standalone',\n    platform,\n  };\n}\n","import { detectPlatform } from './env';\nimport type {\n  BridgeMessage,\n  BridgeRequest,\n  BridgeResponse,\n  BridgeEvent,\n} from './types';\n\nconst REQUEST_TIMEOUT_MS = 120_000;\n\ninterface PendingRequest {\n  resolve: (result: unknown) => void;\n  reject: (error: Error) => void;\n  timer: ReturnType<typeof setTimeout>;\n}\n\ntype MessageHandler = (message: BridgeMessage) => void;\n\nexport class Bridge {\n  private readonly pending = new Map<string, PendingRequest>();\n  private readonly handlers: MessageHandler[] = [];\n  private readonly listener: (event: MessageEvent) => void;\n\n  /**\n   * Buffer for cherry:init — if the host sends it before any handler is\n   * registered (i.e. before cherry.init() is called), we keep it here so\n   * waitForInit() can resolve immediately instead of timing out.\n   */\n  private _bufferedInit: BridgeMessage | null = null;\n\n  constructor() {\n    this.listener = (event: MessageEvent) => {\n      let data: unknown = event.data;\n\n      // WebView sometimes delivers a serialized string\n      if (typeof data === 'string') {\n        try {\n          data = JSON.parse(data) as unknown;\n        } catch {\n          return;\n        }\n      }\n\n      if (!isObject(data) || typeof data['type'] !== 'string') return;\n      const message = data as BridgeMessage;\n\n      // Resolve pending request if this is a response\n      if (message['type'] === 'cherry:response') {\n        const response = message as unknown as BridgeResponse;\n        const pending = this.pending.get(response.id);\n        if (pending) {\n          this.pending.delete(response.id);\n          clearTimeout(pending.timer);\n          if (response.error) {\n            const err = response.error;\n            // Handle both string and { code, message } error formats\n            if (typeof err === 'string') {\n              pending.reject(new BridgeError(err, 'UNKNOWN'));\n            } else {\n              pending.reject(new BridgeError(err.message ?? 'Unknown error', err.code ?? 'UNKNOWN'));\n            }\n          } else {\n            pending.resolve(response.result);\n          }\n          return;\n        }\n      }\n\n      // Buffer cherry:init if no handlers are registered yet, so it is not lost\n      if (message['type'] === 'cherry:init' && this.handlers.length === 0) {\n        this._bufferedInit = message;\n        return;\n      }\n\n      for (const handler of this.handlers) {\n        handler(message);\n      }\n    };\n\n    window.addEventListener('message', this.listener);\n  }\n\n  /**\n   * Returns a previously buffered cherry:init message (if any) and clears the\n   * buffer. Called by waitForInit() to handle the case where the host sent\n   * cherry:init before the SDK called init().\n   */\n  consumeBufferedInit(): BridgeMessage | null {\n    const msg = this._bufferedInit;\n    this._bufferedInit = null;\n    return msg;\n  }\n\n  sendToHost(message: BridgeMessage): void {\n    const platform = detectPlatform();\n    if (platform === 'webview') {\n      const rnw = (window as unknown as { ReactNativeWebView?: { postMessage(data: string): void } })\n        .ReactNativeWebView;\n      rnw?.postMessage(JSON.stringify(message));\n      return;\n    }\n    // Forward transient user activation to the host so wallets that require\n    // a user gesture actually display the approval prompt. The options bag\n    // is the only way to do that, but several wallet in-app browsers run on\n    // customised WebViews where options-bag postMessage either throws\n    // synchronously or — worse — is silently dropped. We detect known wallet\n    // WebViews by UA and use the legacy string-targetOrigin form for them;\n    // Cherry-host renders an explicit confirmation overlay for these wallets,\n    // so activation forwarding is not required.\n    const ua = typeof navigator !== 'undefined' ? navigator.userAgent || '' : '';\n    const isWalletInApp =\n      /\\b(Phantom(Browser)?|Solflare(Wallet)?|Backpack|CoinbaseWallet|CipherBrowser|Trust(Wallet)?)\\/\\d/i.test(ua);\n    if (!isWalletInApp) {\n      try {\n        window.parent.postMessage(message, {\n          targetOrigin: '*',\n          transferUserActivation: true,\n        } as WindowPostMessageOptions);\n        return;\n      } catch {\n        // Old browsers don't support the options bag — fall through.\n      }\n    }\n    window.parent.postMessage(message, '*');\n  }\n\n  startListening(handler: MessageHandler): () => void {\n    this.handlers.push(handler);\n    return () => {\n      const idx = this.handlers.indexOf(handler);\n      if (idx !== -1) this.handlers.splice(idx, 1);\n    };\n  }\n\n  request(method: string, params?: Record<string, unknown>): Promise<unknown> {\n    return new Promise<unknown>((resolve, reject) => {\n      const id = generateId();\n      const timer = setTimeout(() => {\n        this.pending.delete(id);\n        reject(new BridgeError(`Request timed out: ${method}`, 'TIMEOUT'));\n      }, REQUEST_TIMEOUT_MS);\n\n      this.pending.set(id, { resolve, reject, timer });\n\n      const msg: BridgeRequest = {\n        type: 'cherry:request',\n        id,\n        method,\n        ...(params !== undefined ? { params } : {}),\n      };\n      this.sendToHost(msg);\n    });\n  }\n\n  destroy(): void {\n    window.removeEventListener('message', this.listener);\n    for (const [id, pending] of this.pending) {\n      clearTimeout(pending.timer);\n      pending.reject(new BridgeError('Bridge destroyed', 'DESTROYED'));\n      this.pending.delete(id);\n    }\n    this.handlers.length = 0;\n  }\n}\n\nexport class BridgeError extends Error {\n  constructor(\n    message: string,\n    public readonly code: string,\n  ) {\n    super(message);\n    this.name = 'BridgeError';\n  }\n}\n\n// Module-level singleton — shared between CherryMiniApp and CherryWalletAdapter\nlet _sharedBridge: Bridge | null = null;\n\nexport function getSharedBridge(): Bridge {\n  if (!_sharedBridge) {\n    _sharedBridge = new Bridge();\n  }\n  return _sharedBridge;\n}\n\nexport function destroySharedBridge(): void {\n  _sharedBridge?.destroy();\n  _sharedBridge = null;\n}\n\n// ---- helpers ----\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n  return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction generateId(): string {\n  if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n    return crypto.randomUUID();\n  }\n  // Fallback for older environments\n  return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`;\n}\n\nexport type { BridgeEvent };\n","import {\n  BaseWalletAdapter,\n  WalletReadyState,\n  WalletNotConnectedError,\n  WalletConnectionError,\n  WalletSignTransactionError,\n  WalletSignMessageError,\n  WalletSendTransactionError,\n  type SendTransactionOptions,\n  type WalletName,\n} from '@solana/wallet-adapter-base';\nimport { PublicKey, Transaction, VersionedTransaction, type Connection } from '@solana/web3.js';\nimport { getSharedBridge } from '../bridge';\nimport { isInsideCherry } from '../env';\n\nexport const CherryWalletAdapterName = 'Cherry' as WalletName<'Cherry'>;\n\n// Inline SVG cherry logo as a data URL (simple placeholder)\nconst CHERRY_ICON =\n  'data:image/svg+xml;base64,' +\n  btoa(\n    '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 64 64\" fill=\"none\">' +\n    '<circle cx=\"20\" cy=\"44\" r=\"12\" fill=\"#e63946\"/>' +\n    '<circle cx=\"44\" cy=\"44\" r=\"12\" fill=\"#e63946\"/>' +\n    '<path d=\"M20 32 Q32 8 44 32\" stroke=\"#2d6a4f\" stroke-width=\"3\" fill=\"none\"/>' +\n    '<line x1=\"32\" y1=\"8\" x2=\"40\" y2=\"2\" stroke=\"#2d6a4f\" stroke-width=\"2\"/>' +\n    '</svg>',\n  );\n\nexport class CherryWalletAdapter extends BaseWalletAdapter {\n  readonly name = CherryWalletAdapterName;\n  readonly url = 'https://cherry.fun';\n  readonly icon = CHERRY_ICON;\n  readonly supportedTransactionVersions = new Set(['legacy' as const, 0 as const]);\n\n  get readyState(): WalletReadyState {\n    return isInsideCherry() ? WalletReadyState.Installed : WalletReadyState.NotDetected;\n  }\n\n  get publicKey(): PublicKey | null {\n    return this._publicKey;\n  }\n\n  get connecting(): boolean {\n    return this._connecting;\n  }\n\n  private _publicKey: PublicKey | null = null;\n  private _connecting = false;\n\n  // ---- connect / disconnect ----\n\n  async connect(): Promise<void> {\n    if (this.readyState !== WalletReadyState.Installed) {\n      throw new WalletConnectionError('CherryWalletAdapter is not available outside Cherry');\n    }\n    if (this._publicKey || this._connecting) return;\n\n    this._connecting = true;\n    try {\n      const bridge = getSharedBridge();\n      const result = await bridge.request('wallet.connect');\n      const { publicKey } = result as { publicKey: string };\n      this._publicKey = new PublicKey(publicKey);\n      this.emit('connect', this._publicKey);\n    } catch (error) {\n      throw new WalletConnectionError((error as Error).message, error as Error);\n    } finally {\n      this._connecting = false;\n    }\n  }\n\n  async disconnect(): Promise<void> {\n    if (!this._publicKey) return;\n    this._publicKey = null;\n    this.emit('disconnect');\n  }\n\n  // ---- sign transaction ----\n\n  async signTransaction<T extends Transaction | VersionedTransaction>(tx: T): Promise<T> {\n    if (!this._publicKey) throw new WalletNotConnectedError();\n    try {\n      const bridge = getSharedBridge();\n      const serialized = serializeTxToBase64(tx);\n      const result = await bridge.request('wallet.signTransaction', { transaction: serialized });\n      // Host responds with { transaction: \"<base64>\" } (V2) or a raw base64 string (legacy).\n      const signedBase64 = (result as Record<string, unknown>)?.['transaction'] ?? result;\n      return deserializeTxFromBase64(signedBase64 as string, tx) as T;\n    } catch (error) {\n      throw new WalletSignTransactionError((error as Error).message, error as Error);\n    }\n  }\n\n  // ---- sign all transactions ----\n\n  async signAllTransactions<T extends Transaction | VersionedTransaction>(txs: T[]): Promise<T[]> {\n    if (!this._publicKey) throw new WalletNotConnectedError();\n    try {\n      const bridge = getSharedBridge();\n      const serialized = txs.map((tx) => serializeTxToBase64(tx));\n      const result = await bridge.request('wallet.signTransactions', { transactions: serialized });\n      const signedArray = (result as Record<string, unknown>)?.['transactions'] ?? result;\n      return (signedArray as string[]).map((base64, i) => deserializeTxFromBase64(base64, txs[i]!) as T);\n    } catch (error) {\n      throw new WalletSignTransactionError((error as Error).message, error as Error);\n    }\n  }\n\n  // ---- sign message ----\n\n  async signMessage(message: Uint8Array): Promise<Uint8Array> {\n    if (!this._publicKey) throw new WalletNotConnectedError();\n    try {\n      const bridge = getSharedBridge();\n      const base64 = uint8ArrayToBase64(message);\n      const result = await bridge.request('wallet.signMessage', { message: base64 });\n      // Host responds with { signature: \"<base64>\" } (V2) or a raw base64 string (legacy).\n      const sig = (result as Record<string, unknown>)?.['signature'] ?? result;\n      return base64ToUint8Array(sig as string);\n    } catch (error) {\n      throw new WalletSignMessageError((error as Error).message, error as Error);\n    }\n  }\n\n  // ---- send transaction ----\n\n  async sendTransaction(\n    tx: Transaction | VersionedTransaction,\n    _connection: Connection,\n    _options?: SendTransactionOptions,\n  ): Promise<string> {\n    if (!this._publicKey) throw new WalletNotConnectedError();\n    try {\n      const bridge = getSharedBridge();\n      const serialized = serializeTxToBase64(tx);\n      const result = await bridge.request('wallet.signAndSendTransaction', {\n        transaction: serialized,\n      });\n      // Host responds with { signature: \"<base58>\" } (V2) or a raw signature string (legacy).\n      const signature = (result as Record<string, unknown>)?.['signature'] ?? result;\n      return signature as string;\n    } catch (error) {\n      throw new WalletSendTransactionError((error as Error).message, error as Error);\n    }\n  }\n}\n\n// ---- transaction helpers ----\n\nfunction serializeTxToBase64(tx: Transaction | VersionedTransaction): string {\n  if (isVersionedTransaction(tx)) {\n    return uint8ArrayToBase64((tx as VersionedTransaction).serialize());\n  }\n  return uint8ArrayToBase64((tx as Transaction).serialize({ requireAllSignatures: false }));\n}\n\nfunction deserializeTxFromBase64(\n  base64: string,\n  original: Transaction | VersionedTransaction,\n): Transaction | VersionedTransaction {\n  const bytes = base64ToUint8Array(base64);\n  if (isVersionedTransaction(original)) {\n    return VersionedTransaction.deserialize(bytes);\n  }\n  return Transaction.from(bytes);\n}\n\nfunction isVersionedTransaction(tx: Transaction | VersionedTransaction): boolean {\n  const msg = (tx as unknown as Record<string, unknown>)['message'];\n  return typeof msg === 'object' && msg !== null && 'staticAccountKeys' in (msg as object);\n}\n\nfunction uint8ArrayToBase64(arr: Uint8Array): string {\n  let binary = '';\n  for (let i = 0; i < arr.length; i++) {\n    binary += String.fromCharCode(arr[i]!);\n  }\n  return btoa(binary);\n}\n\nfunction base64ToUint8Array(base64: string): Uint8Array {\n  const binary = atob(base64);\n  const bytes = new Uint8Array(binary.length);\n  for (let i = 0; i < binary.length; i++) {\n    bytes[i] = binary.charCodeAt(i);\n  }\n  return bytes;\n}\n"]}