{"version":3,"sources":["../../src/env.ts","../../src/bridge.ts","../../src/kit/signer.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 type { CherryMiniApp } from '../client';\nimport { getSharedBridge } from '../bridge';\n\n/**\n * Creates a Solana Kit TransactionSigner backed by the Cherry bridge.\n *\n * Usage:\n * ```ts\n * import { CherryMiniApp } from '@cherrydotfun/miniapp-sdk';\n * import { createCherrySigner } from '@cherrydotfun/miniapp-sdk/kit';\n *\n * const cherry = new CherryMiniApp();\n * await cherry.init();\n * const signer = createCherrySigner(cherry);\n * ```\n *\n * The returned object conforms to @solana/signers TransactionSigner interface.\n * We use structural typing — no runtime import of @solana/signers needed.\n */\nexport interface CherryTransactionSigner<TAddress extends string = string> {\n  readonly address: TAddress;\n  signTransactions(\n    transactions: ReadonlyArray<{\n      messageBytes: Uint8Array;\n      signatures: Record<string, Uint8Array | null>;\n    }>,\n  ): Promise<\n    ReadonlyArray<{\n      messageBytes: Uint8Array;\n      signatures: Record<string, Uint8Array>;\n    }>\n  >;\n  signMessages?(messages: ReadonlyArray<Uint8Array>): Promise<ReadonlyArray<Uint8Array>>;\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\n/**\n * Read `numRequiredSignatures` from a compiled Solana message.\n *\n * Wire format of the message:\n *   - v0+: [version byte (0x80|v)] [numRequiredSignatures] [...]\n *   - legacy: [numRequiredSignatures] [...]\n *\n * The high bit distinguishes: legacy messages always have\n * numRequiredSignatures < 0x80, so bit 7 unset → legacy.\n */\nfunction readNumRequiredSignatures(messageBytes: Uint8Array): number {\n  const first = messageBytes[0];\n  if (first === undefined) throw new Error('Empty messageBytes');\n  const isVersioned = (first & 0x80) !== 0;\n  const idx = isVersioned ? 1 : 0;\n  const n = messageBytes[idx];\n  if (n === undefined || n === 0) {\n    throw new Error('Cannot determine numRequiredSignatures from messageBytes');\n  }\n  return n;\n}\n\n/**\n * Encode a small integer as Solana's compact-u16 (shortvec) — 1–3 bytes,\n * 7 data bits per byte, MSB set on all but the last byte.\n */\nfunction encodeCompactU16(n: number): Uint8Array {\n  if (n < 0 || n > 0xffff) throw new Error(`compact-u16 out of range: ${n}`);\n  if (n < 0x80) return new Uint8Array([n]);\n  if (n < 0x4000) return new Uint8Array([(n & 0x7f) | 0x80, n >> 7]);\n  return new Uint8Array([(n & 0x7f) | 0x80, ((n >> 7) & 0x7f) | 0x80, n >> 14]);\n}\n\n/** Decode a compact-u16 starting at offset. Returns value and how many bytes were consumed. */\nfunction decodeCompactU16(bytes: Uint8Array, offset: number): { value: number; size: number } {\n  let value = 0;\n  let size = 0;\n  let shift = 0;\n  for (;;) {\n    const b = bytes[offset + size];\n    if (b === undefined) throw new Error('compact-u16: unexpected end of input');\n    value |= (b & 0x7f) << shift;\n    size += 1;\n    if ((b & 0x80) === 0) break;\n    shift += 7;\n    if (size > 3) throw new Error('compact-u16: varint too long');\n  }\n  return { value, size };\n}\n\n/** Minimal base58 decoder (Bitcoin alphabet, same as Solana). */\nfunction decodeBase58(s: string): Uint8Array {\n  const ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';\n  const bytes: number[] = [0];\n  for (const c of s) {\n    const val = ALPHABET.indexOf(c);\n    if (val < 0) throw new Error(`Invalid base58 character: ${c}`);\n    let carry = val;\n    for (let i = 0; i < bytes.length; i++) {\n      const x = bytes[i]! * 58 + carry;\n      bytes[i] = x & 0xff;\n      carry = x >> 8;\n    }\n    while (carry > 0) {\n      bytes.push(carry & 0xff);\n      carry >>= 8;\n    }\n  }\n  for (const c of s) {\n    if (c !== '1') break;\n    bytes.push(0);\n  }\n  return new Uint8Array(bytes.reverse());\n}\n\n/**\n * Extract the first `numSigners` static account keys (32 bytes each) from a\n * compiled Solana message. These are the accounts that must sign — by spec,\n * signer accounts can only come from the static keys section, never from\n * address lookup tables.\n */\nfunction parseSignerPubkeys(messageBytes: Uint8Array, numSigners: number): Uint8Array[] {\n  const first = messageBytes[0];\n  if (first === undefined) throw new Error('Empty messageBytes');\n  const isVersioned = (first & 0x80) !== 0;\n  // Skip: [version (v0 only, 1 byte)] [header (3 bytes)]\n  const keysLenOffset = (isVersioned ? 1 : 0) + 3;\n  const { size: lenSize } = decodeCompactU16(messageBytes, keysLenOffset);\n  const keysStart = keysLenOffset + lenSize;\n  const signers: Uint8Array[] = [];\n  for (let i = 0; i < numSigners; i++) {\n    const slice = messageBytes.slice(keysStart + i * 32, keysStart + (i + 1) * 32);\n    if (slice.length !== 32) {\n      throw new Error(`Malformed messageBytes: signer ${i} is truncated`);\n    }\n    signers.push(slice);\n  }\n  return signers;\n}\n\nfunction bytesEqual(a: Uint8Array, b: Uint8Array): boolean {\n  if (a.length !== b.length) return false;\n  for (let i = 0; i < a.length; i++) if (a[i] !== b[i]) return false;\n  return true;\n}\n\n/**\n * Create a TransactionSigner from an initialized CherryMiniApp instance.\n */\nexport function createCherrySigner(cherry: CherryMiniApp): CherryTransactionSigner {\n  if (!cherry.isReady) {\n    throw new Error('CherryMiniApp must be initialized before creating a signer. Call cherry.init() first.');\n  }\n\n  const address = cherry.user.publicKey;\n  const bridge = getSharedBridge();\n\n  return {\n    address,\n\n    async signTransactions(transactions) {\n      // Decode Cherry's own pubkey once so we can match it against the\n      // message's signer list (first numRequiredSignatures static keys).\n      const cherryPubkeyBytes = decodeBase58(address);\n      if (cherryPubkeyBytes.length !== 32) {\n        throw new Error(`Invalid Cherry public key length: ${cherryPubkeyBytes.length}`);\n      }\n\n      // Build a correctly-sized wire format for each transaction and\n      // pre-compute which slot index belongs to Cherry.\n      //\n      // Wire: [compact-u16 sigCount] [sigCount * 64 signature bytes] [messageBytes]\n      //\n      // Two critical requirements:\n      //   1. sigCount MUST equal `numRequiredSignatures` from the message header,\n      //      otherwise `VersionedTransaction.deserialize` produces a transaction\n      //      whose sig-array length doesn't match its header.\n      //   2. Pre-existing signatures from `tx.signatures` MUST be packed into\n      //      their correct slots. If we send all-zero signatures, some wallets\n      //      treat the tx as freshly-built and re-compile it (changing the\n      //      header / byte layout), which breaks Cherry's own signature since\n      //      it's computed over the re-compiled bytes but the caller only has\n      //      the ORIGINAL messageBytes to verify against.\n      const txMeta = transactions.map((tx, txIndex) => {\n        const sigCount = readNumRequiredSignatures(tx.messageBytes);\n        const signerPubkeys = parseSignerPubkeys(tx.messageBytes, sigCount);\n        const cherrySlot = signerPubkeys.findIndex((pk) => bytesEqual(pk, cherryPubkeyBytes));\n        if (cherrySlot < 0) {\n          throw new Error(\n            `Cherry wallet (${address}) is not a required signer for transaction #${txIndex}.`,\n          );\n        }\n\n        // Resolve each signer slot: for every signer pubkey, look up a\n        // pre-existing signature in tx.signatures by matching decoded\n        // base58 → raw 32-byte pubkey.\n        //\n        // IMPORTANT: Cherry's slot gets filled with **random non-zero bytes**\n        // rather than zeros. Reason: some mobile wallet adapters (MWA / wallet\n        // apps on Android) re-compile the transaction from scratch when they\n        // see a wire with all-zero signature slots, treating it as \"freshly\n        // built\". The re-compilation changes the message header (e.g.\n        // numReadonlyUnsignedAccounts), so Cherry ends up signing different\n        // bytes than what the caller passed in — producing an on-chain-invalid\n        // signature.\n        //\n        // Filling Cherry's slot with non-zero bytes makes the wire look\n        // \"partially signed\" to the wallet, which prevents re-compilation.\n        // The wallet always overwrites its own slot with its real signature,\n        // so the placeholder is harmless.\n        const signatureEntries: Array<[Uint8Array, Uint8Array]> = [];\n        for (const [addrKey, sigValue] of Object.entries(tx.signatures)) {\n          if (!sigValue) continue;\n          try {\n            signatureEntries.push([decodeBase58(addrKey), sigValue as Uint8Array]);\n          } catch {\n            // Skip malformed addresses silently — they won't match anyway.\n          }\n        }\n        const sigSlots: Uint8Array[] = signerPubkeys.map((pk, slotIdx) => {\n          if (slotIdx === cherrySlot) {\n            const placeholder = new Uint8Array(64);\n            crypto.getRandomValues(placeholder);\n            return placeholder;\n          }\n          const match = signatureEntries.find(([pubkey]) => bytesEqual(pubkey, pk));\n          return match ? match[1] : new Uint8Array(64);\n        });\n\n        const sigCountBytes = encodeCompactU16(sigCount);\n        const wireBytes = new Uint8Array(\n          sigCountBytes.length + 64 * sigCount + tx.messageBytes.length,\n        );\n        wireBytes.set(sigCountBytes, 0);\n        let offset = sigCountBytes.length;\n        for (const slot of sigSlots) {\n          if (slot.length !== 64) {\n            throw new Error(`Invalid signature length (expected 64, got ${slot.length})`);\n          }\n          wireBytes.set(slot, offset);\n          offset += 64;\n        }\n        wireBytes.set(tx.messageBytes, offset);\n        return { wireBytes, sigCount, sigStart: sigCountBytes.length, cherrySlot };\n      });\n\n      const base64Txs = txMeta.map(({ wireBytes }) => uint8ArrayToBase64(wireBytes));\n\n      // Single batch request — host presents all transactions to the wallet at once.\n      const result = await bridge.request('wallet.signTransactions', { transactions: base64Txs });\n      const signedArray = (result as Record<string, unknown>)?.['transactions'] ?? result;\n\n      // Extract Cherry's signature from each signed transaction — from the\n      // exact slot that matches Cherry's pubkey, not just \"first non-zero\".\n      return (signedArray as string[]).map((signedBase64, i) => {\n        const meta = txMeta[i]!;\n        const signedWire = base64ToUint8Array(signedBase64);\n        const slotOffset = meta.sigStart + meta.cherrySlot * 64;\n        const signature = signedWire.slice(slotOffset, slotOffset + 64);\n        if (signature.length !== 64 || signature.every((b) => b === 0)) {\n          throw new Error(\n            `Host returned transaction ${i} with no signature in Cherry's slot (index ${meta.cherrySlot})`,\n          );\n        }\n        return {\n          messageBytes: transactions[i]!.messageBytes,\n          signatures: {\n            ...transactions[i]!.signatures,\n            [address]: signature,\n          } as Record<string, Uint8Array>,\n        };\n      });\n    },\n\n    async signMessages(messages) {\n      const results = [];\n      for (const message of messages) {\n        const base64 = uint8ArrayToBase64(message);\n        const result = await bridge.request('wallet.signMessage', { message: base64 });\n        const sig = (result as Record<string, unknown>)?.['signature'] ?? result;\n        results.push(base64ToUint8Array(sig as string));\n      }\n      return results;\n    },\n  };\n}\n"]}